phonebookengines/VirtualPhonebook/VPbkCntModel/src/CCustomFilteredGroupView.cpp
branchRCL_3
changeset 63 f4a778e096c2
child 64 c1e8ba0c2b16
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/VirtualPhonebook/VPbkCntModel/src/CCustomFilteredGroupView.cpp	Wed Sep 01 12:29:52 2010 +0100
@@ -0,0 +1,279 @@
+/*
+* Copyright (c) 2002-2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Contacts Model store custom filtered contact
+*                view implementation. Derives from MVPbkContactViewBase,
+*                performs the custom filtering.
+*
+*/
+
+
+#include "CCustomFilteredGroupView.h"
+
+// VPbkCntModel
+#include "CContactStore.h"
+#include "CContact.h"
+#include "cntitem.h"
+#include "CCustomFilteredNativeContactView.h"
+
+// VPbkEng
+#include <MVPbkFieldTypeSelector.h>
+#include <CVPbkFilteredContactView.h>
+#include <MVPbkContactLinkArray.h>
+#include <CVPbkContactViewDefinition.h>
+
+
+namespace VPbkCntModel {
+
+// --------------------------------------------------------------------------
+// CCustomFilteredGroupView::CCustomFilteredGroupView
+// --------------------------------------------------------------------------
+//
+CCustomFilteredGroupView::CCustomFilteredGroupView
+          ( CContactStore& aContactStore,
+            const MVPbkFieldTypeSelector* aFieldTypeSelector,
+            MCustomContactViewObserver& aCustomContactViewObserver ) :
+                CViewBase( aContactStore ),
+                iContactStore( aContactStore ),
+                iFieldTypeSelector( aFieldTypeSelector ),
+                iCustomContactViewObserver( aCustomContactViewObserver )
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CCustomFilteredGroupView::ConstructL
+// --------------------------------------------------------------------------
+//
+void CCustomFilteredGroupView::ConstructL(
+        const CVPbkContactViewDefinition& aViewDefinition,
+        MVPbkContactViewObserver& aViewObserver,                
+        const MVPbkFieldTypeList& aSortOrder,
+        CContactViewBase& aNativeViewBase)
+    {
+    // iView should be assign first because is used by base class during the 
+    // construction.
+    iView = &aNativeViewBase;
+    ConstructL( aViewDefinition, aViewObserver, aSortOrder );
+    // Set the customically filtered view parameters
+    iCustomFilteredContactView->SetNativeBaseView( aNativeViewBase );
+    }
+
+// --------------------------------------------------------------------------
+// CCustomFilteredGroupView::~CCustomFilteredGroupView
+// --------------------------------------------------------------------------
+//
+CCustomFilteredGroupView::~CCustomFilteredGroupView()
+    {
+    delete iCustomFilteredContactView;
+    delete iFilteredView;
+    }
+
+// --------------------------------------------------------------------------
+// CCustomFilteredGroupView::ConstructL
+// --------------------------------------------------------------------------
+//
+void CCustomFilteredGroupView::ConstructL( 
+        const CVPbkContactViewDefinition& aViewDefinition,
+        MVPbkContactViewObserver& aObserver,
+        const MVPbkFieldTypeList& aSortOrder )
+    {
+    // Base construct has to be done first
+    CViewBase::ConstructL( aViewDefinition, aSortOrder );
+
+    // Construct the custom filtered native view
+    iCustomFilteredContactView = CCustomFilteredNativeContactView::NewL
+        ( iContactStore );
+
+    // This object is the base view and contact selector
+    // for the Virtual Phonebook filtered view. The base view calls
+    // are handled by CViewBase.
+    // The selector logic is implemented here in this class.
+    iFilteredView = CVPbkFilteredContactView::NewL
+        ( *this, aObserver, *this );
+    iCustomFilteredContactView->SetCustomFilterView( *iFilteredView );
+    }
+    
+// --------------------------------------------------------------------------
+// CCustomFilteredGroupView::ContactViewBase
+// --------------------------------------------------------------------------
+//
+CContactViewBase& CCustomFilteredGroupView::ContactViewBase()
+    {
+    return *iCustomFilteredContactView;
+    }
+
+// --------------------------------------------------------------------------
+// CCustomFilteredGroupView::Type
+// --------------------------------------------------------------------------
+//
+TVPbkContactViewType CCustomFilteredGroupView::Type() const
+    {
+    return EVPbkGroupsView;
+    }
+
+// --------------------------------------------------------------------------
+// CCustomFilteredGroupView::DoInitializeViewL
+// --------------------------------------------------------------------------
+//
+void CCustomFilteredGroupView::DoInitializeViewL( 
+        const CVPbkContactViewDefinition& /*aViewDefinition*/,
+        RContactViewSortOrder& /*aViewSortOrder*/ )
+    {
+    // Required view initialization is already done
+    }
+
+// --------------------------------------------------------------------------
+// CCustomFilteredGroupView::DoTeardownView
+// --------------------------------------------------------------------------
+//
+void CCustomFilteredGroupView::DoTeardownView()
+    {
+    /// Do nothing
+    }
+
+// --------------------------------------------------------------------------
+// CCustomFilteredGroupView::DoChangeSortOrderL
+// --------------------------------------------------------------------------
+//
+TBool CCustomFilteredGroupView::DoChangeSortOrderL( 
+        const CVPbkContactViewDefinition& /*aViewDefinition*/,
+        RContactViewSortOrder& /*aSortOrder*/ )
+    {
+    // Sort order not changed.
+    return EFalse;
+    }
+
+// --------------------------------------------------------------------------
+// CCustomFilteredGroupView::IsContactIncluded
+// --------------------------------------------------------------------------
+//
+TBool CCustomFilteredGroupView::IsContactIncluded
+        ( const MVPbkBaseContact& aContact )
+    {
+    TBool ret = EFalse;
+
+    // In case of an error, ignore it.
+    // The contact will then not be included in the view
+    TRAP_IGNORE(
+        ret = IsContactIncludedL( aContact )
+        );
+
+    return ret;
+    }
+
+// --------------------------------------------------------------------------
+// CCustomFilteredGroupView::HandleContactViewEvent
+// --------------------------------------------------------------------------
+//
+void CCustomFilteredGroupView::HandleContactViewEvent
+        ( const CContactViewBase& aView,
+          const TContactViewEvent& aEvent )
+    {
+    // Notify the custom view observer first
+    iCustomContactViewObserver.HandleCustomContactViewEvent( aView, aEvent );
+    CViewBase::HandleContactViewEvent( aView, aEvent );
+    }
+
+// --------------------------------------------------------------------------
+// CCustomFilteredGroupView::IsContactFieldIncludedL
+// --------------------------------------------------------------------------
+//
+inline TBool CCustomFilteredGroupView::IsContactFieldIncludedL(
+		const CContactIdArray* aGroupMembers,
+		const TInt& aMemberCount,
+		const MVPbkFieldTypeSelector& aFieldTypeSelector )
+	{
+	TBool ret = EFalse;
+	
+	for ( TInt i=0; i < aMemberCount && !ret; ++i )
+		{
+        const TContactItemId contactId = ( *aGroupMembers )[i];
+        CContactItem* item = iContactStore.NativeDatabase().
+            ReadContactLC( contactId ) ;
+
+        // Make a VPbk store contact
+        CContact* contact = CContact::NewL( iContactStore, item );
+        CleanupStack::Pop( item ); // ownership was taken away
+        CleanupStack::PushL( contact );
+
+        MVPbkStoreContactFieldCollection& fields = contact->Fields();
+        TInt fieldCount = fields.FieldCount();
+
+        for ( TInt i = 0; i < fieldCount; ++i )
+            {
+            const MVPbkStoreContactField& field = fields.FieldAt( i );
+            const MVPbkFieldType* fieldType = field.BestMatchingFieldType();
+            if ( fieldType && 
+            		aFieldTypeSelector.IsFieldTypeIncluded( *fieldType ) )
+                {
+                ret = ETrue;
+                break;
+                }
+            }
+
+        CleanupStack::PopAndDestroy( contact );
+    	}
+	
+	return ret;
+	}
+
+// --------------------------------------------------------------------------
+// CCustomFilteredGroupView::IsContactIncludedL
+// --------------------------------------------------------------------------
+//
+inline TBool CCustomFilteredGroupView::IsContactIncludedL
+        ( const MVPbkBaseContact& aContact )
+    {
+    TBool ret = EFalse;
+
+    // First we have to get the contact id
+    const CViewContact& viewContact =
+        static_cast<const CViewContact&>( aContact );
+    TContactItemId id = viewContact.Id();
+
+    // Then we have to load the native contact group
+    CContactGroup* group = static_cast<CContactGroup*>
+        ( iContactStore.NativeDatabase().ReadContactLC( id ) );
+
+    const CContactIdArray* groupMembers = group->ItemsContained();
+    if ( groupMembers )
+        {
+        CVPbkContactViewDefinition& viewDefinition = ViewDefinition();
+        const TInt memberCount = groupMembers->Count();
+        
+    	if( memberCount > 0 )
+    		{
+    		if( iFieldTypeSelector )
+    			{
+    			ret = IsContactFieldIncludedL( groupMembers, memberCount, *iFieldTypeSelector );
+    			}
+    		else
+    			{
+    			// No group filter given, so group is included no matter what
+    			ret = ETrue;
+    			}
+    		}
+    	else if( !viewDefinition.FlagIsOn( EVPbkExcludeEmptyGroups ) )
+			{
+			ret = ETrue;
+			}
+        }
+
+    CleanupStack::PopAndDestroy( group );
+
+    return ret;
+    }
+
+} // namespace VPbkCntModel
+
+// End of File