--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/Presentation/src/CPbk2ContactViewBuilder.cpp Wed Sep 01 12:29:52 2010 +0100
@@ -0,0 +1,338 @@
+/*
+* 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:
+* Phonebook 2 contact view builder.
+*
+*/
+
+
+#include "CPbk2ContactViewBuilder.h"
+
+// Phonebook 2
+#include "Pbk2PresentationUtils.h"
+#include "CPbk2StoreConfiguration.h"
+#include "CPbk2StoreProperty.h"
+#include "CPbk2StorePropertyArray.h"
+#include "CPbk2StoreViewDefinition.h"
+#include <RPbk2LocalizedResourceFile.h>
+#include <Pbk2Presentation.rsg>
+#include <Pbk2DataCaging.hrh>
+
+ #include <CVPbkFieldTypeSelector.h>
+ #include <VPbkContactViewFilterBuilder.h>
+
+// Virtual Phonebook
+#include <CVPbkContactStoreUriArray.h>
+#include <CVPbkContactViewDefinition.h>
+#include <CVPbkContactManager.h>
+#include <MVPbkContactViewBase.h>
+#include <MVPbkContactSelector.h>
+#include <VPbkContactView.hrh>
+
+// System includes
+#include <coemain.h>
+#include <barsread.h>
+
+// --------------------------------------------------------------------------
+// CPbk2ContactViewBuilder::CPbk2ContactViewBuilder
+// --------------------------------------------------------------------------
+//
+CPbk2ContactViewBuilder::CPbk2ContactViewBuilder(
+ CVPbkContactManager& aContactManager,
+ CPbk2StorePropertyArray& aStoreProperties ) :
+ iContactManager( aContactManager ),
+ iStoreProperties( aStoreProperties )
+ {
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactViewBuilder::~CPbk2ContactViewBuilder
+// --------------------------------------------------------------------------
+//
+CPbk2ContactViewBuilder::~CPbk2ContactViewBuilder()
+ {
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactViewBuilder::NewLC
+// --------------------------------------------------------------------------
+//
+EXPORT_C CPbk2ContactViewBuilder* CPbk2ContactViewBuilder::NewLC(
+ CVPbkContactManager& aContactManager,
+ CPbk2StorePropertyArray& aStoreProperties )
+ {
+ CPbk2ContactViewBuilder* self = new ( ELeave ) CPbk2ContactViewBuilder(
+ aContactManager, aStoreProperties );
+ CleanupStack::PushL( self );
+ return self;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactViewBuilder::CreateContactViewForStoresLC
+// --------------------------------------------------------------------------
+//
+EXPORT_C MVPbkContactViewBase*
+ CPbk2ContactViewBuilder::CreateContactViewForStoresLC(
+ const CVPbkContactStoreUriArray& aUriArray,
+ MVPbkContactViewObserver& aObserver,
+ const MVPbkFieldTypeList& aSortOrder,
+ CVPbkFieldTypeSelector* aFilter,
+ TUint32 aFlags ) const
+ {
+ return CreateViewForStoresLC
+ ( EPbk2MainNamesList, aUriArray, aObserver, aSortOrder, aFilter, aFlags );
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactViewBuilder::CreateContactViewForStoresLC
+// --------------------------------------------------------------------------
+//
+EXPORT_C MVPbkContactViewBase*
+ CPbk2ContactViewBuilder::CreateContactViewForStoresLC(
+ const CVPbkContactStoreUriArray& aUriArray,
+ MVPbkContactViewObserver& aObserver,
+ const MVPbkFieldTypeList& aSortOrder,
+ CVPbkFieldTypeSelector* aFilter,
+ TUint32 aFlags,
+ MVPbkContactSelector* aContactSelector) const
+ {
+ return CreateViewForStoresLC
+ ( EPbk2MainNamesList, aUriArray, aObserver, aSortOrder, aFilter, aFlags, EFalse, aContactSelector );
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactViewBuilder::CreateTopNonTopContactViewForStoresLC
+//
+// Similar as CreateContactViewForStoresLC but TopContacts are filtered out
+// --------------------------------------------------------------------------
+//
+EXPORT_C MVPbkContactViewBase*
+ CPbk2ContactViewBuilder::CreateTopNonTopContactViewForStoresLC(
+ const CVPbkContactStoreUriArray& aUriArray,
+ MVPbkContactViewObserver& aObserver,
+ const MVPbkFieldTypeList& aSortOrder,
+ CVPbkFieldTypeSelector* aFilter,
+ TUint32 aFlags,
+ MVPbkContactSelector& aContactSelector ) const
+ {
+ iContactSelector = &aContactSelector;
+
+ return CreateViewForStoresLC(
+ EPbk2MainTopContactsList, // This param has no effect if aTopContacts=ETrue
+ aUriArray,
+ aObserver,
+ aSortOrder,
+ aFilter,
+ aFlags,
+ ETrue ); // aTopContacts = ETrue
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactViewBuilder::CreateGroupViewForStoresLC
+// --------------------------------------------------------------------------
+//
+EXPORT_C MVPbkContactViewBase*
+ CPbk2ContactViewBuilder::CreateGroupViewForStoresLC(
+ const CVPbkContactStoreUriArray& aUriArray,
+ MVPbkContactViewObserver& aObserver,
+ const MVPbkFieldTypeList& aSortOrder,
+ CVPbkFieldTypeSelector* aFilter,
+ TUint32 aFlags ) const
+ {
+ return CreateViewForStoresLC
+ ( EPbk2MainGroupsList, aUriArray, aObserver, aSortOrder, aFilter, aFlags );
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactViewBuilder::BuildMainViewStructureLC
+// --------------------------------------------------------------------------
+//
+CVPbkContactViewDefinition*
+ CPbk2ContactViewBuilder::BuildMainViewStructureLC(
+ CVPbkFieldTypeSelector* aFilter,
+ TUint32 aFlags ) const
+ {
+ RPbk2LocalizedResourceFile resFile( *CCoeEnv::Static() );
+ resFile.OpenLC( KPbk2RomFileDrive,
+ KDC_RESOURCE_FILES_DIR,
+ Pbk2PresentationUtils::PresentationResourceFile() );
+
+ TResourceReader reader;
+ CCoeEnv::Static()->CreateResourceReaderLC
+ ( reader, R_PHONEBOOK2_MAIN_CONTACT_VIEW_STRUCTURE );
+
+ CVPbkContactViewDefinition* viewDef =
+ CVPbkContactViewDefinition::NewL( reader );
+ CleanupStack::PopAndDestroy(2); // reader, resFile
+ CleanupStack::PushL( viewDef );
+
+ if( aFlags & EVPbkExcludeEmptyGroups )
+ {
+ viewDef->SetFlag ( EVPbkExcludeEmptyGroups, ETrue );
+ }
+
+ viewDef->SetFieldTypeFilterL( aFilter );
+ return viewDef;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactViewBuilder::CreateViewForStoresLC
+// Creates a sub-view for all matching view types, from the listed stores.
+// --------------------------------------------------------------------------
+//
+/**
+ * Creates a sub-view for all matching view types from the listed stores.
+ * @param aViewType The view type that should match.
+ * @param aUriArray The Stores from which to look for views.
+ * @param aObserver An observer
+ * @param aSortOrder
+ * @param aFilter An object that is able to discard contacts based on
+ * field collection.
+ * @param aTopContacts Whether or not to construct a top/non-top-contact style
+ * of list, or a normal legacy list with no top contacts.
+ * @return The actual new view.
+ */
+MVPbkContactViewBase* CPbk2ContactViewBuilder::CreateViewForStoresLC(
+ TPbk2ContactViewType aViewType,
+ const CVPbkContactStoreUriArray& aUriArray,
+ MVPbkContactViewObserver& aObserver,
+ const MVPbkFieldTypeList& aSortOrder,
+ CVPbkFieldTypeSelector* aFilter,
+ TUint32 aFlags,
+ TBool aTopContacts,
+ MVPbkContactSelector* aContactSelector) const
+ {
+ // Main view is a composite view that contains several sub composite
+ // views. The subviews are identified by TPbk2ContactViewLocation.
+ CVPbkContactViewDefinition* viewDef = BuildMainViewStructureLC( aFilter, aFlags );
+
+ const TInt count = aUriArray.Count();
+ for ( TInt i = 0; i < count; ++i )
+ {
+ // Get store property for each URI
+ const CPbk2StoreProperty* storeProperty =
+ iStoreProperties.FindProperty( aUriArray[i] );
+ if ( storeProperty )
+ {
+ // Loop all view definitions of the store and
+ // add the view definitions to the correct sub view of
+ // the main structure.
+ TArray<const CPbk2StoreViewDefinition*> viewDefs =
+ storeProperty->Views();
+ const TInt viewDefCount = viewDefs.Count();
+ for ( TInt j = 0; j < viewDefCount; ++j )
+ {
+ const CPbk2StoreViewDefinition* pb2ViewDef = viewDefs[j];
+ // Check that UI type of the view is the given type.
+ // Meaning that does the view belong to all-contacts-view
+ // or all-groups-view.
+
+ TBool includeThisView = pb2ViewDef->ViewType() == aViewType;
+ if ( aTopContacts )
+ {
+ includeThisView = IncludeThisViewInTopContactMode( pb2ViewDef->ViewType() );
+ }
+ if ( includeThisView )
+ {
+ // Get the correct sub view of the main view structure.
+ CVPbkContactViewDefinition& subView = viewDef->SubViewAt(
+ TInt( pb2ViewDef->ViewLocation() ) );
+ // Add store's view to composite.
+ CVPbkContactViewDefinition* newSubView =
+ CVPbkContactViewDefinition::NewL(
+ pb2ViewDef->ViewDefinition() );
+ CleanupStack::PushL( newSubView );
+ if ( aTopContacts )
+ {
+ SetTopRelatedFilteringL(
+ *newSubView, pb2ViewDef->ViewType(), aFilter );
+ }
+ else
+ {
+ newSubView->SetFieldTypeFilterL( aFilter );
+ }
+ if( aFlags & EVPbkExcludeEmptyGroups )
+ {
+ newSubView->SetFlag ( EVPbkExcludeEmptyGroups, ETrue );
+ }
+
+ if( aFlags & EVPbkExcludeEmptyGroups )
+ {
+ newSubView->SetFlag ( EVPbkExcludeEmptyGroups, ETrue );
+ }
+ if( !(newSubView->ContactSelector()) )
+ {
+ newSubView->SetContactSelector( aContactSelector );
+ }
+
+ subView.AddSubViewL( newSubView );
+ CleanupStack::Pop();
+ }
+ }
+ }
+ }
+
+ MVPbkContactViewBase* result = iContactManager.CreateContactViewLC
+ ( aObserver, *viewDef, aSortOrder );
+ CleanupStack::Pop(); // result
+
+ CleanupStack::PopAndDestroy(); // viewDef
+ CleanupDeletePushL( result );
+ return result;
+ }
+
+
+TBool CPbk2ContactViewBuilder::IncludeThisViewInTopContactMode(
+ TPbk2ContactViewType aViewType )
+ {
+ return aViewType == EPbk2MainTopContactsList || aViewType == EPbk2MainNamesList;
+ }
+
+void CPbk2ContactViewBuilder::SetTopRelatedFilteringL(
+ CVPbkContactViewDefinition& aNewSubViewDef,
+ TPbk2ContactViewType aViewType,
+ CVPbkFieldTypeSelector* aFilter ) const
+ {
+ if ( aViewType == EPbk2MainTopContactsList )
+ {
+ //Override original filter with top contact filter.
+ CVPbkFieldTypeSelector* filter = CVPbkFieldTypeSelector::NewL(
+ iContactManager.FieldTypes());
+ CleanupStack::PushL(filter);
+
+ //Set the filter to retrieve Top contact items (VPbkContactView.hrh)
+ VPbkContactViewFilterBuilder::BuildContactViewFilterL( *filter,
+ TVPbkContactViewFilter(EVPbkContactViewFilterTopContact), iContactManager );
+ aNewSubViewDef.SetFieldTypeFilterL( filter );
+ CleanupStack::PopAndDestroy(); //filter
+ }
+ else if ( aViewType == EPbk2MainNamesList )
+ {
+ //Use original filter, if any
+ aNewSubViewDef.SetFieldTypeFilterL( aFilter );
+ if ( iContactSelector )
+ {
+ // Add the contact selector
+ // (usually the Non-Top Contacts selector)
+ aNewSubViewDef.SetContactSelector( iContactSelector ); // ownership not transferred
+ }
+ }
+ else
+ {
+ //Use original filter, if any
+ aNewSubViewDef.SetFieldTypeFilterL( aFilter );
+ }
+ }
+
+// End of File