phonebookui/Phonebook2/Presentation/src/CPbk2ContactViewBuilder.cpp
branchRCL_3
changeset 63 f4a778e096c2
child 64 c1e8ba0c2b16
child 68 9da50d567e3c
--- /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