diff -r 5b6f26637ad3 -r f4a778e096c2 phonebookengines/VirtualPhonebook/VPbkCntModel/src/CCustomFilteredGroupView.cpp --- /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 +#include +#include +#include + + +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( aContact ); + TContactItemId id = viewContact.Id(); + + // Then we have to load the native contact group + CContactGroup* group = static_cast + ( 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