--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/VirtualPhonebook/VPbkEng/inc/CVPbkCompositeContactView.h Wed Sep 01 12:29:52 2010 +0100
@@ -0,0 +1,408 @@
+/*
+* 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: Composite contact view.
+*
+*/
+
+
+#ifndef CVPBKCOMPOSITECONTACTVIEW_H
+#define CVPBKCOMPOSITECONTACTVIEW_H
+
+// INCLUDE FILES
+#include <e32base.h>
+#include <MVPbkContactViewBase.h>
+#include <MVPbkContactViewObserver.h>
+#include <MVPbkContactViewFiltering.h>
+#include <MVPbkContactViewBaseChildAccessExtension.h>
+#include <VPbkContactView.hrh>
+#include <CVPbkAsyncOperation.h>
+#include "CVPbkEventArrayItem.h"
+
+// FORWARD DECLARATIONS
+class MVPbkContactViewSortPolicy;
+class CVPbkEventArrayItem;
+class MVPbkCompositeContactViewPolicy;
+
+
+/**
+ * Virtual Phonebook abstract composite contact view.
+ * Composite contact views can be used to compose a view from
+ * multiple sub views.
+ */
+NONSHARABLE_CLASS(CVPbkCompositeContactView) :
+ public CBase,
+ public MVPbkContactViewBase,
+ public MVPbkContactViewObserver,
+ public MVPbkContactViewObserverExtension,
+ protected MVPbkContactViewFiltering,
+ public MVPbkContactViewBaseChildAccessExtension
+ {
+ public: // Constructors and destructor
+ /**
+ * Destructor.
+ */
+ ~CVPbkCompositeContactView();
+
+ public: // Interface
+ /**
+ * Adds subview to this composite view. Ownership is transferred
+ * if leave does not occur.
+ * NOTE: This composite view must already be an observer of aSubView
+ * when calling this function.
+ *
+ * @param aSubView Subview to add to this composite view.
+ * @param aViewId ViewId of added subview
+ */
+ void AddSubViewL(
+ MVPbkContactViewBase* aSubView, TInt aViewId = KVPbkDefaultViewId);
+
+ /**
+ * ActualContactCountL returns the number of contact's in subviews.
+ * It might be that all subview events haven't
+ * arrived yet to this composite so ActualContactCountL is not always
+ * same as CompositeContactCountL
+ *
+ * @return the contact count calculated from subviews.
+ */
+ TInt ActualContactCountL() const;
+
+ /**
+ * @return The number of contacts in iContactMapping
+ */
+ inline TInt CompositeContactCountL() const;
+
+ /**
+ * If the parent of this view is also a composite view
+ * it calls this to configure this view as an internal view
+ * that has no external observers.
+ */
+ void ApplyInternalCompositePolicyL();
+
+ void SetViewId(TInt aViewId);
+
+ private: // Abstract interface for composite implementations
+ /**
+ * Builds view mapping.
+ */
+ virtual void DoBuildContactMappingL() = 0;
+
+ /**
+ * Handles contact addition to the view.
+ *
+ * @param aSubViewIndex Sub view index.
+ * @param aIndex Index of the contact in the sub view.
+ * @return Composite contact view index of the added contact.
+ */
+ virtual TInt DoHandleContactAdditionL(
+ TInt aSubViewIndex,
+ TInt aIndex ) = 0;
+
+ public: // From MVPbkContactViewBase
+ TVPbkContactViewType Type() const;
+ void ChangeSortOrderL(
+ const MVPbkFieldTypeList& aSortOrder );
+ const MVPbkFieldTypeList& SortOrder() const;
+ void RefreshL();
+ TInt ContactCountL() const;
+ const MVPbkViewContact& ContactAtL(
+ TInt aIndex ) const;
+ MVPbkContactLink* CreateLinkLC(
+ TInt aIndex ) const;
+ TInt IndexOfLinkL(
+ const MVPbkContactLink& aContactLink ) const;
+ void AddObserverL(
+ MVPbkContactViewObserver& aObserver );
+ void RemoveObserver(
+ MVPbkContactViewObserver& aObserver );
+ TBool MatchContactStore(
+ const TDesC& aContactStoreUri ) const;
+ TBool MatchContactStoreDomain(
+ const TDesC& aContactStoreDomain ) const;
+ MVPbkContactBookmark* CreateBookmarkLC(
+ TInt aIndex ) const;
+ TInt IndexOfBookmarkL(
+ const MVPbkContactBookmark& aContactBookmark ) const;
+ MVPbkContactViewFiltering* ViewFiltering();
+ TAny* ContactViewBaseExtension(TUid aExtensionUid);
+
+ private: // From MVPbkContactViewObserver
+ void ContactViewReady(
+ MVPbkContactViewBase& aView );
+ void ContactViewUnavailable(
+ MVPbkContactViewBase& aView );
+ void ContactAddedToView(
+ MVPbkContactViewBase& aView,
+ TInt aIndex,
+ const MVPbkContactLink& aContactLink );
+ void ContactRemovedFromView(
+ MVPbkContactViewBase& aView,
+ TInt aIndex,
+ const MVPbkContactLink& aContactLink );
+ void ContactViewError(
+ MVPbkContactViewBase& aView,
+ TInt aError,
+ TBool aErrorNotified);
+ TAny* ContactViewObserverExtension( TUid aExtensionUid );
+
+ private: // From MVPbkContactViewObserverExtension
+ void FilteredContactRemovedFromView(
+ MVPbkContactViewBase& aView );
+
+ private: // From MVPbkContactViewFiltering
+ /// Composite implementations must implement this
+ virtual MVPbkContactViewBase* CreateFilteredViewLC(
+ MVPbkContactViewObserver& aObserver,
+ const MDesCArray& aFindWords,
+ const MVPbkContactBookmarkCollection* aAlwaysIncludedContacts ) = 0;
+ void UpdateFilterL(
+ const MDesCArray& aFindWords,
+ const MVPbkContactBookmarkCollection* aAlwaysIncludedContacts );
+
+ private: // From MVPbkContactViewBaseChildAccessExtension
+ TInt ChildViewCount() const;
+ MVPbkContactViewBase& ChildViewAt(TInt aIndex);
+ MVPbkContactViewBase* GetChildViewById(TInt aId);
+ TInt GetViewId();
+
+ protected: // Types
+ class CSubViewData;
+
+ /**
+ * Contact mapping structure. Mapping supports 128 subviews
+ * and over 8 million contacts per sub view.
+ */
+ struct TContactMapping
+ {
+ /// Own: View index
+ TInt iViewIndex: 8;
+ /// Own: Contact index
+ TInt iContactIndex: 24;
+ };
+
+ protected: // Implementation
+ CVPbkCompositeContactView();
+ void BaseConstructL(
+ const MVPbkFieldTypeList& aSortOrder );
+ static TBool CompareMappings(
+ const TContactMapping& aLhs,
+ const TContactMapping& aRhs );
+ TBool IsCompositeReady() const;
+ /// Returns the composite's view policy.
+ MVPbkCompositeContactViewPolicy& CompositePolicy() const;
+
+ private: // Implementation
+ TInt FindSubViewIndex(MVPbkContactViewBase& aView) const;
+ TBool AllSubViewsKnown() const;
+ TBool AnySubViewReady() const;
+ void ResetContactMapping();
+ void RemoveContactMappingsFromView(MVPbkContactViewBase& aView);
+ void HandleContactViewReadyL( MVPbkContactViewBase& aView );
+ void HandleContactViewUnavailableL( MVPbkContactViewBase& aView );
+ TInt HandleContactRemoval(
+ MVPbkContactViewBase& aView,
+ TInt aIndex );
+ TInt HandleContactAddition(
+ MVPbkContactViewBase& aView,
+ TInt aIndex );
+ void DoAddObserverL(MVPbkContactViewObserver& aObserver);
+ void AddObserverError(
+ MVPbkContactViewObserver& aObserver,
+ TInt aError );
+ void SendViewReadyEvent();
+ void SendViewUnavailableEvent();
+ void SendViewErrorEvent( TInt aError, TBool aErrorNotified );
+ void UpdateSortOrderL();
+
+ protected: // Data
+ /// Own: Array of subviews
+ RPointerArray<CSubViewData> iSubViews;
+ /// Own: Array of contact mappings
+ RArray<TContactMapping> iContactMapping;
+
+ private: // Data
+ /// Ref: Async operation
+ VPbkEngUtils::CVPbkAsyncOperation iAsyncOperation;
+ /// Own: Sort order
+ MVPbkFieldTypeList* iSortOrder;
+ /// Own: Array of observers
+ RPointerArray<MVPbkContactViewObserver> iObservers;
+ /// Own: A policy for composite's internal functionality
+ MVPbkCompositeContactViewPolicy* iCompositePolicy;
+ /// Current view identifier
+ TInt iViewId;
+ };
+
+inline TInt CVPbkCompositeContactView::CompositeContactCountL() const
+ {
+ return iContactMapping.Count();
+ }
+
+/**
+ * Class to hold subview data.
+ */
+NONSHARABLE_CLASS( CVPbkCompositeContactView::CSubViewData ):
+ public CBase
+ {
+ public: // Types
+ /**
+ * View state enumeration.
+ */
+ enum TViewState
+ {
+ ENotKnown,
+ EUnavailable,
+ EReady
+ };
+
+ public: // Constructors and destructor
+ /**
+ * Constructor.
+ *
+ * @param aState View state.
+ */
+ CSubViewData(TViewState aState) : iState( aState ) {}
+
+ /**
+ * Destructor.
+ */
+ ~CSubViewData();
+
+ public: // Data
+ /// Ref: Contact view
+ MVPbkContactViewBase* iView;
+ /// Own: View state
+ TViewState iState;
+ /// Ref: Cursor pointer, used when merging
+ const MVPbkViewContact* iContactCursor;
+ /// Own: Cursor
+ TInt iCursor;
+ /// view identifier of iView member variable
+ TInt iViewId;
+ };
+
+/**
+ * Internal interface for different behavior of exterior and interior
+ * composite views.
+ */
+NONSHARABLE_CLASS(MVPbkCompositeContactViewPolicy)
+ {
+ public:
+ /**
+ * Destructor
+ */
+ virtual ~MVPbkCompositeContactViewPolicy() {}
+
+ /**
+ * Handles contact added & removed events.
+ */
+ virtual void HandleViewEventsL(
+ CVPbkEventArrayItem::TViewEventType aEvent,
+ MVPbkContactViewBase& aSubview,
+ TInt aIndex, const
+ MVPbkContactLink& aContactLink ) = 0;
+
+ /**
+ * Reset policy if it has cached data.
+ */
+ virtual void Reset() = 0;
+
+ /**
+ * Returns the contact count in composite or 0 if
+ * composite is not up to date with leaf views.
+ * @param aCompositeCount The count according to composite view.
+ * @return aCompositeCount or 0.
+ */
+ virtual TInt ContactCountL() const = 0;
+
+ /**
+ * Returns ETrue if this is an internal composite policy
+ * @return ETrue if this is an internal composite policy
+ */
+ virtual TBool InternalPolicy() const = 0;
+ };
+
+/**
+ * An implementation for exterior composite view
+ */
+NONSHARABLE_CLASS(CVPbkExternalCompositeViewPolicy) :
+ public CBase,
+ public MVPbkCompositeContactViewPolicy
+ {
+ public: // Construction and destruction
+ static CVPbkExternalCompositeViewPolicy* NewL(
+ CVPbkCompositeContactView& aCompositeView,
+ RPointerArray<MVPbkContactViewObserver>& aObservers );
+ ~CVPbkExternalCompositeViewPolicy();
+
+ private: // From MVPbkCompositeContactViewPolicy
+ void HandleViewEventsL(
+ CVPbkEventArrayItem::TViewEventType aEvent,
+ MVPbkContactViewBase& aSubview,
+ TInt aIndex, const
+ MVPbkContactLink& aContactLink );
+ void Reset();
+ TInt ContactCountL() const;
+ TBool InternalPolicy() const;
+
+ private: // Implementation
+ CVPbkExternalCompositeViewPolicy(
+ CVPbkCompositeContactView& aCompositeView,
+ RPointerArray<MVPbkContactViewObserver>& aObservers );
+
+ private: // Data
+ /// Ref: The parent of this policy
+ CVPbkCompositeContactView& iCompositeView;
+ /// Ref: Array of observers
+ RPointerArray<MVPbkContactViewObserver>& iObservers;
+ /// Own: Event array for 'Contact added or removed' events
+ RPointerArray<CVPbkEventArrayItem> iEventArray;
+ };
+
+/**
+ * An implementation for interior composite view
+ */
+NONSHARABLE_CLASS(CVPbkInternalCompositeViewPolicy) :
+ public CBase,
+ public MVPbkCompositeContactViewPolicy
+ {
+ public: // Construction and destruction
+ static CVPbkInternalCompositeViewPolicy* NewL(
+ CVPbkCompositeContactView& aCompositeView,
+ RPointerArray<MVPbkContactViewObserver>& aObservers );
+
+ private: // From MVPbkCompositeContactViewPolicy
+ void HandleViewEventsL(
+ CVPbkEventArrayItem::TViewEventType aEvent,
+ MVPbkContactViewBase& aSubview,
+ TInt aIndex, const
+ MVPbkContactLink& aContactLink );
+ void Reset();
+ TInt ContactCountL() const;
+ TBool InternalPolicy() const;
+
+ private: // Implementation
+ CVPbkInternalCompositeViewPolicy(
+ CVPbkCompositeContactView& aCompositeView,
+ RPointerArray<MVPbkContactViewObserver>& aObservers );
+
+ private: // Data
+ /// Ref: The parent of this policy
+ CVPbkCompositeContactView& iCompositeView;
+ /// Ref: Array of observers
+ RPointerArray<MVPbkContactViewObserver>& iObservers;
+ };
+
+#endif // CVPBKCOMPOSITECONTACTVIEW_H
+
+// End of File