phonebookengines/VirtualPhonebook/VPbkCntModel/src/CFilteredGroupView.cpp
branchRCL_3
changeset 63 f4a778e096c2
child 64 c1e8ba0c2b16
child 68 9da50d567e3c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/VirtualPhonebook/VPbkCntModel/src/CFilteredGroupView.cpp	Wed Sep 01 12:29:52 2010 +0100
@@ -0,0 +1,341 @@
+/*
+* 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 filtered contact view implementation.
+*
+*/
+
+
+// INCLUDES
+#include "CFilteredGroupView.h"
+
+// VPbkCntModel
+#include "CContactStore.h"
+#include "CFieldFactory.h"
+#include "CCustomFilteredGroupView.h"
+#include <VPbkCntModelRes.rsg>
+#include "VPbkCntModelRemoteViewPreferences.h"
+#include "NamedRemoteViewViewDefinitionStoreUtility.h"
+
+
+// VPbkEng
+#include <CVPbkFieldTypeSelector.h>
+#include <VPbkDataCaging.hrh>
+#include <CVPbkFieldType.h>
+#include <CVPbkFieldTypeList.h>
+#include <CVPbkContactViewDefinition.h>
+#include <TVPbkFieldVersitProperty.h>
+#include <VPbkSendEventUtility.h>
+#include <CVPbkSortOrder.h>
+
+// VPbkEngUtils
+#include <RLocalizedResourceFile.h>
+
+// System includes
+#include <cntview.h>
+#include <barsread.h>
+
+// Debugging headers
+#include <VPbkDebug.h>
+
+namespace VPbkCntModel {
+
+// --------------------------------------------------------------------------
+// CFilteredGroupView::CFilteredGroupView
+// --------------------------------------------------------------------------
+//
+inline CFilteredGroupView::CFilteredGroupView
+        ( CContactStore& aParentStore ) :
+            CViewBase( aParentStore )
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CFilteredGroupView::~CFilteredGroupView
+// --------------------------------------------------------------------------
+//
+CFilteredGroupView::~CFilteredGroupView()
+    {
+    // Customically filtered view has to be destructed first
+    delete iCustomFilteredView;
+    delete iFilter;
+
+    // Set iView to NULL, so that CViewBase does not close it
+    iView = NULL;
+
+    if ( iBaseView )
+        {
+        iBaseView->Close( *iNativeObserver );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CFilteredGroupView::NewLC
+// --------------------------------------------------------------------------
+//
+CFilteredGroupView* CFilteredGroupView::NewLC(
+        const CVPbkContactViewDefinition& aViewDefinition,
+        MVPbkContactViewObserver& aObserver,
+        CContactStore& aParentStore,
+        const MVPbkFieldTypeList& aSortOrder,
+        RFs& aFs )
+    {
+    CFilteredGroupView* self =
+        new ( ELeave ) CFilteredGroupView( aParentStore );
+    CleanupStack::PushL( self );
+    self->ConstructL( aViewDefinition, aObserver, aSortOrder, aFs );
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CFilteredGroupView::ConstructL
+// --------------------------------------------------------------------------
+//
+void CFilteredGroupView::ConstructL(
+        const CVPbkContactViewDefinition& aViewDefinition,
+        MVPbkContactViewObserver& aObserver,
+        const MVPbkFieldTypeList& aSortOrder,
+        RFs& /*aFs*/ )
+    {
+    const CFieldFactory& fieldFactory = Store().FieldFactory();
+
+    // Construct the native filter
+    if ( aViewDefinition.FieldTypeFilter() )
+        {
+        // Copy construct the filter
+        iFilter = CVPbkFieldTypeSelector::NewL( 
+                *aViewDefinition.FieldTypeFilter() );
+        }
+
+    CViewBase::ConstructL( aViewDefinition, aObserver, aSortOrder );
+    }
+
+// --------------------------------------------------------------------------
+// CFilteredGroupView::Type
+// --------------------------------------------------------------------------
+//
+TVPbkContactViewType CFilteredGroupView::Type() const
+    {
+    return EVPbkGroupsView;
+    }
+
+// --------------------------------------------------------------------------
+// CFilteredGroupView::DoInitializeViewL
+// --------------------------------------------------------------------------
+//
+void CFilteredGroupView::DoInitializeViewL(
+        const CVPbkContactViewDefinition& aViewDefinition,
+        RContactViewSortOrder& aViewSortOrder )
+    {
+    // Stop observing the base view, the custom view
+    // will observe it and report back
+    // Construction of the iCustomFilteredView should be done in two 
+    // phases. Due to that there is dependencies between views in this 
+    // and iCustomFilteredView class.
+    CCustomFilteredGroupView* customFilteredView = 
+        new (ELeave) CCustomFilteredGroupView( Store(), iFilter, 
+            *this );
+    
+    if ( iCustomFilteredView )
+        {
+        delete iCustomFilteredView;
+        iCustomFilteredView = NULL;
+        }
+    iCustomFilteredView = customFilteredView;
+    customFilteredView = NULL;
+    
+    ConstructBaseViewsL( aViewDefinition, *iCustomFilteredView, 
+            aViewSortOrder );
+            
+    iCustomFilteredView->ConstructL
+        ( aViewDefinition, *this, *iSortOrder, *iView );
+
+    iView = &iCustomFilteredView->ContactViewBase();
+    }
+
+// --------------------------------------------------------------------------
+// CFilteredGroupView::DoTeardownView
+// --------------------------------------------------------------------------
+//
+void CFilteredGroupView::DoTeardownView()
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CFilteredGroupView::DoChangeSortOrderL
+// --------------------------------------------------------------------------
+//
+TBool CFilteredGroupView::DoChangeSortOrderL( 
+        const CVPbkContactViewDefinition& aViewDefinition,
+		RContactViewSortOrder& aSortOrder )
+    {
+    TBool canBeChanged = ETrue;
+    if ( iRemoteView )
+        {
+        if ( RemoteViewName( aViewDefinition ).Compare( 
+                KVPbkAllGroupsViewName ) == 0 )
+            {
+            // Set Contacts Model default view setting only if client
+            // is using KVPbkAllGroupsViewName shared view
+            NamedRemoteViewViewDefinitionStoreUtility::
+                SetNamedRemoteViewViewDefinitionL(
+                    KVPbkAllContactsViewName, aSortOrder, 
+                    KVPbkDefaultContactViewPrefs);
+            }
+        iRemoteView->ChangeSortOrderL( aSortOrder );
+        }
+    else
+        {
+        // CContactLocalView doesn't support ChangeSortOrderL
+        canBeChanged = EFalse;
+        }
+        
+    return canBeChanged;
+    }
+
+// --------------------------------------------------------------------------
+// CFilteredGroupView::ContactViewReady
+// --------------------------------------------------------------------------
+//
+void CFilteredGroupView::ContactViewReady(
+        MVPbkContactViewBase& aView )
+    {
+    VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING
+        ("CFilteredGroupView::ContactViewReady(0x%x)"), &aView);
+
+    VPbkEng::SendViewEventToObservers( *this, iFilteringObservers,
+        &MFilteredViewSupportObserver::ContactViewReadyForFiltering,
+        &MVPbkContactViewObserver::ContactViewError );
+    VPbkEng::SendViewEventToObservers( *this, iObservers,
+        &MVPbkContactViewObserver::ContactViewReady,
+        &MVPbkContactViewObserver::ContactViewError );
+    VPbkEng::SendViewEventToObservers( *this, iFilteringObservers,
+        &MVPbkContactViewObserver::ContactViewReady,
+        &MVPbkContactViewObserver::ContactViewError );
+    }
+
+// --------------------------------------------------------------------------
+// CFilteredGroupView::ContactViewUnavailable
+// --------------------------------------------------------------------------
+//
+void CFilteredGroupView::ContactViewUnavailable(
+        MVPbkContactViewBase& aView )
+    {
+    VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING
+        ("CFilteredGroupView::ContactViewUnavailable(0x%x)"), &aView);
+
+    VPbkEng::SendViewEventToObservers( *this, iFilteringObservers,
+        &MFilteredViewSupportObserver::ContactViewUnavailableForFiltering,
+        &MVPbkContactViewObserver::ContactViewError );
+    VPbkEng::SendViewEventToObservers( *this, iObservers,
+        &MVPbkContactViewObserver::ContactViewUnavailable,
+        &MVPbkContactViewObserver::ContactViewError );
+    VPbkEng::SendViewEventToObservers( *this, iFilteringObservers,
+        &MVPbkContactViewObserver::ContactViewUnavailable,
+        &MVPbkContactViewObserver::ContactViewError );
+    }
+
+// --------------------------------------------------------------------------
+// CFilteredGroupView::ContactAddedToView
+// --------------------------------------------------------------------------
+//
+void CFilteredGroupView::ContactAddedToView(
+        MVPbkContactViewBase& aView,
+        TInt aIndex, const MVPbkContactLink& aContactLink )
+    {
+    VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING
+        ("CFilteredGroupView::ContactAddedToView(0x%x)"), &aView);
+
+    VPbkEng::SendViewEventToObservers( *this, aIndex, aContactLink, 
+        iObservers,
+        &MVPbkContactViewObserver::ContactAddedToView,
+        &MVPbkContactViewObserver::ContactViewError );
+    VPbkEng::SendViewEventToObservers( *this, aIndex, aContactLink, 
+        iFilteringObservers,
+        &MVPbkContactViewObserver::ContactAddedToView,
+        &MVPbkContactViewObserver::ContactViewError );
+    }
+
+// --------------------------------------------------------------------------
+// CFilteredGroupView::ContactRemovedFromView
+// --------------------------------------------------------------------------
+//
+void CFilteredGroupView::ContactRemovedFromView(
+        MVPbkContactViewBase& aView,
+        TInt aIndex, const MVPbkContactLink& aContactLink )
+    {
+    VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING
+        ("CFilteredGroupView::ContactRemovedFromView(0x%x)"), &aView);
+
+    VPbkEng::SendViewEventToObservers( *this, aIndex, aContactLink, 
+        iObservers,
+        &MVPbkContactViewObserver::ContactRemovedFromView,
+        &MVPbkContactViewObserver::ContactViewError );
+    VPbkEng::SendViewEventToObservers( *this, aIndex, aContactLink, 
+        iFilteringObservers,
+        &MVPbkContactViewObserver::ContactRemovedFromView,
+        &MVPbkContactViewObserver::ContactViewError );
+    }
+
+// --------------------------------------------------------------------------
+// CFilteredGroupView::ContactViewError
+// --------------------------------------------------------------------------
+//
+void CFilteredGroupView::ContactViewError(
+        MVPbkContactViewBase& aView,
+        TInt aError, TBool aErrorNotified )
+    {
+    VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING
+        ("CFilteredGroupView::ContactViewError(0x%x)"), &aView);
+
+    VPbkEng::SendEventToObservers( *this, aError, aErrorNotified, iObservers,
+        &MVPbkContactViewObserver::ContactViewError );
+    VPbkEng::SendEventToObservers( *this, aError, aErrorNotified, 
+        iFilteringObservers, &MVPbkContactViewObserver::ContactViewError );
+    }
+
+// --------------------------------------------------------------------------
+// CFilteredGroupView::ConstructBaseViewsL
+// --------------------------------------------------------------------------
+//
+void CFilteredGroupView::ConstructBaseViewsL
+        ( const CVPbkContactViewDefinition& aViewDefinition,
+          MContactViewObserver& aObserver,
+          RContactViewSortOrder& aViewSortOrder )
+    {
+    iNativeObserver = &aObserver;
+
+    // Construct the all contacts view first
+    if ( RemoteViewDefinition( aViewDefinition ) )
+        {
+        iRemoteView = CContactNamedRemoteView::NewL( 
+                *iNativeObserver, RemoteViewName( aViewDefinition ), 
+                Store().NativeDatabase(), aViewSortOrder, 
+                KVPbkDefaultGroupsViewPrefs );
+                
+        iBaseView = iRemoteView;
+        }
+    else
+        {
+        iBaseView = CContactLocalView::NewL( *iNativeObserver, 
+                Store().NativeDatabase(), aViewSortOrder, 
+                KVPbkDefaultGroupsViewPrefs );
+        }
+   
+    // Set base class view pointer
+    iView = iBaseView;
+    }
+
+} // namespace VPbkCntModel
+
+// End of File