--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/UIControls/src/CPbk2NamesListControl.cpp Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,2149 @@
+/*
+* Copyright (c) 2005-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 names list control.
+*
+*/
+
+
+// INCLUDE FILES
+#include "CPbk2NamesListControl.h"
+
+// Phonebook 2
+#include "CPbk2NamesListStateFactory.h"
+#include "CPbk2ContactViewListBox.h"
+#include "CPbk2ThumbnailLoader.h"
+#include "cpbk2filteredviewstack.h"
+#include "MPbk2NamesListState.h"
+#include "MPbk2ControlObserver.h"
+#include "MPbk2UiControlEventSender.h"
+#include <CPbk2ControlContainer.h>
+#include <CPbk2ViewState.h>
+#include <Pbk2UIControls.hrh>
+#include <MPbk2Command.h>
+#include <MPbk2ContactUiControlExtension.h>
+#include <pbk2contactuicontroldoublelistboxextension.h>
+#include <MPbk2UIExtensionFactory.h>
+#include <CPbk2UIExtensionManager.h>
+#include "MPbk2FilteredViewStack.h"
+#include "cpbk2predictiveviewstack.h"
+#include <Pbk2Commands.hrh>
+#include <Pbk2InternalUID.h>
+#include "CPbk2PredictiveSearchFilter.h"
+#include "cpbk2contactviewdoublelistbox.h"
+
+// Virtual Phonebook
+#include <MVPbkContactViewBase.h>
+#include <MVPbkViewContact.h>
+#include <MVPbkContactLink.h>
+
+// System includes
+#include <barsread.h>
+#include <aknsfld.h>
+#include <AknPriv.hrh>
+#include <featmgr.h>
+
+// Debugging headers
+#include <Pbk2Debug.h>
+
+
+/// Unnamed namespace for local definitions
+namespace {
+
+/**
+ * Handles errors.
+ *
+ * @param aErrorCode Error code.
+ */
+void HandleError( TInt aErrorCode )
+ {
+ if ( aErrorCode != KErrNone )
+ {
+ // Display standard error message
+ CEikonEnv::Static()->HandleError( aErrorCode );
+ }
+ }
+
+#ifdef _DEBUG
+enum TPanicCode
+ {
+ EPanicLogic_ComponentControl = 1,
+ };
+
+void Panic(TPanicCode aReason)
+ {
+ _LIT(KPanicText, "CPbk2NamesListControl");
+ User::Panic(KPanicText, aReason);
+ }
+#endif // _DEBUG
+
+} /// namespace
+
+/**
+ * A helper class for sending control events.
+ */
+NONSHARABLE_CLASS( CPbk2UiControlEventSender ) : public CBase,
+ public MPbk2UiControlEventSender
+ {
+ public: // Construction and destruction
+
+ /**
+ * Creates a new instance of this class.
+ *
+ * @param aControl Control.
+ * @param aObservers Observers.
+ * @return A new instance of this class.
+ */
+ static CPbk2UiControlEventSender* NewL(
+ CPbk2NamesListControl& aControl,
+ RPointerArray<MPbk2ControlObserver>& aObservers );
+
+ /**
+ * Destructor.
+ */
+ ~CPbk2UiControlEventSender();
+
+ public: /// From MPbk2UiControlEventSender
+ TBool SendEventToObserversL(
+ const TPbk2ControlEvent& aEvent );
+ void Reset();
+
+ private: // Implementation
+ CPbk2UiControlEventSender(
+ CPbk2NamesListControl& aControl,
+ RPointerArray<MPbk2ControlObserver>& aObservers );
+ void ConstructL();
+ TBool SendEvent(
+ const TPbk2ControlEvent& aEvent );
+
+ private: // Data
+ /// Ref: Control
+ CPbk2NamesListControl& iControl;
+ /// Ref: Observers
+ RPointerArray<MPbk2ControlObserver>& iObservers;
+ /// Own: Indicates has the ready event been sent
+ TBool iReadyEventSend;
+ };
+
+/**
+ * A helper class for hiding inheritance of MPbk2FilteredViewStackObserver
+ * from CPbk2NamesListControl.
+ */
+class CPbk2FilteredViewStackObserver : public CBase,
+ public MPbk2FilteredViewStackObserver
+ {
+ public: /// Typedefs
+ typedef void( CPbk2NamesListControl::* TopViewChangedFuncPtr )
+ ( MVPbkContactViewBase& aOldView );
+ typedef void( CPbk2NamesListControl::* ViewStackErrorFuncPtr )
+ ( TInt aError );
+ typedef void( CPbk2NamesListControl::* ContactAddedToBaseViewFuncPtr )
+ ( MVPbkContactViewBase& aBaseView,
+ TInt aIndex, const MVPbkContactLink& aContactLink );
+ typedef void( CPbk2NamesListControl::* TopViewUpdatedFuncPtr )();
+ typedef void( CPbk2NamesListControl::* BaseViewChangedFuncPtr )();
+
+ public: // Construction and destruction
+
+ /**
+ * Creates a new instance of this class.
+ *
+ * @param aControl Control.
+ * @param aViewStack View stack.
+ * @param aTopViewChangedFuncPtr Top view changed function pointer.
+ * @param aTopViewUpdatedFuncPtr Top view updated function pointer.
+ * @param aBaseViewChangedFuncPtr Base view changed function pointer.
+ * @param aViewStackErrorFuncPtr View stack error function pointer.
+ * @param aContactAddedToBaseViewFuncPtr Contact added to base view function pointer.
+ * @return A new instance of this class.
+ */
+ static CPbk2FilteredViewStackObserver* NewL(
+ CPbk2NamesListControl& aControl,
+ TopViewChangedFuncPtr aTopViewChangedFuncPtr,
+ TopViewUpdatedFuncPtr aTopViewUpdatedFuncPtr,
+ BaseViewChangedFuncPtr aBaseViewChangedFuncPtr,
+ ViewStackErrorFuncPtr aViewStackErrorFuncPtr,
+ ContactAddedToBaseViewFuncPtr aContactAddedToBaseViewFuncPtr );
+
+ /**
+ * Destructor.
+ */
+ ~CPbk2FilteredViewStackObserver();
+
+ private: // From MPbk2FilteredViewStackObserver
+ void TopViewChangedL(
+ MVPbkContactViewBase& aOldView );
+ void TopViewUpdatedL();
+ void BaseViewChangedL();
+ void ViewStackError(
+ TInt aError );
+ void ContactAddedToBaseView(
+ MVPbkContactViewBase& aBaseView,
+ TInt aIndex,
+ const MVPbkContactLink& aContactLink );
+
+ private: // Implementation
+ CPbk2FilteredViewStackObserver(
+ CPbk2NamesListControl& aControl,
+ TopViewChangedFuncPtr aTopViewChangedFuncPtr,
+ TopViewUpdatedFuncPtr aTopViewUpdatedFuncPtr,
+ BaseViewChangedFuncPtr aBaseViewChangedFuncPtr,
+ ViewStackErrorFuncPtr aViewStackErrorFuncPtr,
+ ContactAddedToBaseViewFuncPtr aContactAddedToBaseViewFuncPtr );
+ void ConstructL();
+
+ private: // Data
+ /// Ref: Control
+ CPbk2NamesListControl& iControl;
+ /// Ref: Top view changed function pointer
+ TopViewChangedFuncPtr iTopViewChangedFuncPtr;
+ /// Ref: Top view updated function pointer
+ TopViewUpdatedFuncPtr iTopViewUpdatedFuncPtr;
+ /// Ref: Base view changed function pointer
+ BaseViewChangedFuncPtr iBaseViewChangedFuncPtr;
+ /// Ref: View stack error function pointer
+ ViewStackErrorFuncPtr iViewStackErrorFuncPtr;
+ /// Ref: Contact added to base view function pointer
+ ContactAddedToBaseViewFuncPtr iContactAddedToBaseViewFuncPtr;
+ };
+
+/**
+ * An observer for list box selections. Sends control events
+ * when the list box enters to or from the selection mode.
+ */
+NONSHARABLE_CLASS( CPbk2ListBoxSelectionObserver ) : public CBase,
+ private MListBoxSelectionObserver
+ {
+ public: // Interface
+
+ /**
+ * Creates a new instance of this class.
+ *
+ * @param aListBox The list box that is observed.
+ * @param aEventSender An event sender for sending control
+ * events.
+ * @return A new instance of this class.
+ */
+ static CPbk2ListBoxSelectionObserver* NewL(
+ CPbk2NamesListControl& aControl,
+ CEikListBox& aListBox,
+ MPbk2UiControlEventSender& aEventSender );
+
+ /**
+ * Destructor
+ */
+ ~CPbk2ListBoxSelectionObserver();
+
+ private: /// From MListBoxSelectionObserver
+ void SelectionModeChanged(
+ CEikListBox* aListBox,
+ TBool aSelectionModeEnabled );
+
+ private: // Implementation
+ CPbk2ListBoxSelectionObserver(
+ CPbk2NamesListControl& aControl,
+ CEikListBox& aListBox,
+ MPbk2UiControlEventSender& aEventSender );
+ void ConstructL();
+
+ private: // Data
+ /// Ref: Control
+ CPbk2NamesListControl& iControl;
+ /// Ref: List box
+ CEikListBox& iListBox;
+ /// Ref: Event sender
+ MPbk2UiControlEventSender& iEventSender;
+ };
+
+// --------------------------------------------------------------------------
+// CPbk2UiControlEventSender::CPbk2UiControlEventSender
+// --------------------------------------------------------------------------
+//
+CPbk2UiControlEventSender::CPbk2UiControlEventSender
+ ( CPbk2NamesListControl& aControl,
+ RPointerArray<MPbk2ControlObserver>& aObservers ) :
+ iControl( aControl ),
+ iObservers( aObservers )
+ {
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2UiControlEventSender::NewL
+// --------------------------------------------------------------------------
+//
+CPbk2UiControlEventSender* CPbk2UiControlEventSender::NewL(
+ CPbk2NamesListControl& aControl,
+ RPointerArray<MPbk2ControlObserver>& aObservers )
+ {
+ CPbk2UiControlEventSender* self =
+ new ( ELeave ) CPbk2UiControlEventSender( aControl, aObservers );
+ return self;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2UiControlEventSender::~CPbk2UiControlEventSender
+// --------------------------------------------------------------------------
+//
+CPbk2UiControlEventSender::~CPbk2UiControlEventSender()
+ {
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2UiControlEventSender::SendEventToObserversL
+// Sends control observer events in reverse order to disable the possibility
+// of crash if aObserver is changed during the loop.
+// --------------------------------------------------------------------------
+//
+TBool CPbk2UiControlEventSender::SendEventToObserversL(
+ const TPbk2ControlEvent& aEvent )
+ {
+ // Loop backwards in case some observer destroys itself in the
+ // event handler
+ TBool okToSendEvent( SendEvent( aEvent ) );
+ for ( TInt i = iObservers.Count() - 1; i >= 0 && okToSendEvent; --i )
+ {
+ iObservers[i]->HandleControlEventL( iControl, aEvent );
+ }
+
+ return okToSendEvent;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2UiControlEventSender::Reset
+// Resets event sender
+// --------------------------------------------------------------------------
+//
+void CPbk2UiControlEventSender::Reset()
+ {
+ iReadyEventSend = EFalse;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2UiControlEventSender::SendEvent
+// Makes sure that ready event is send only ones and reset the status
+// if control goes unavailable
+// --------------------------------------------------------------------------
+//
+TBool CPbk2UiControlEventSender::SendEvent
+ ( const TPbk2ControlEvent& aEvent )
+ {
+ TBool ret( ETrue );
+ if ( aEvent.iEventType == TPbk2ControlEvent::EUnavailable )
+ {
+ iReadyEventSend = EFalse;
+ }
+ else if ( aEvent.iEventType == TPbk2ControlEvent::EReady )
+ {
+ if ( iReadyEventSend )
+ {
+ ret = EFalse;
+ }
+ else
+ {
+ iReadyEventSend = ETrue;
+ }
+ }
+ return ret;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2FilteredViewStackObserver::CPbk2FilteredViewStackObserver
+// --------------------------------------------------------------------------
+//
+CPbk2FilteredViewStackObserver::CPbk2FilteredViewStackObserver(
+ CPbk2NamesListControl& aControl,
+ TopViewChangedFuncPtr aTopViewChangedFuncPtr,
+ TopViewUpdatedFuncPtr aTopViewUpdatedFuncPtr,
+ BaseViewChangedFuncPtr aBaseViewChangedFuncPtr,
+ ViewStackErrorFuncPtr aViewStackErrorFuncPtr,
+ ContactAddedToBaseViewFuncPtr aContactAddedToBaseViewFuncPtr ) :
+ iControl( aControl ),
+ iTopViewChangedFuncPtr( aTopViewChangedFuncPtr ),
+ iTopViewUpdatedFuncPtr( aTopViewUpdatedFuncPtr ),
+ iBaseViewChangedFuncPtr( aBaseViewChangedFuncPtr ),
+ iViewStackErrorFuncPtr( aViewStackErrorFuncPtr ),
+ iContactAddedToBaseViewFuncPtr( aContactAddedToBaseViewFuncPtr )
+ {
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2FilteredViewStackObserver::NewL
+// --------------------------------------------------------------------------
+//
+CPbk2FilteredViewStackObserver* CPbk2FilteredViewStackObserver::NewL(
+ CPbk2NamesListControl& aControl,
+ TopViewChangedFuncPtr aTopViewChangedFuncPtr,
+ TopViewUpdatedFuncPtr aTopViewUpdatedFuncPtr,
+ BaseViewChangedFuncPtr aBaseViewChangedFuncPtr,
+ ViewStackErrorFuncPtr aViewStackErrorFuncPtr,
+ ContactAddedToBaseViewFuncPtr aContactAddedToBaseViewFuncPtr )
+ {
+ CPbk2FilteredViewStackObserver* self =
+ new ( ELeave ) CPbk2FilteredViewStackObserver( aControl,
+ aTopViewChangedFuncPtr,
+ aTopViewUpdatedFuncPtr,
+ aBaseViewChangedFuncPtr,
+ aViewStackErrorFuncPtr,
+ aContactAddedToBaseViewFuncPtr );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2FilteredViewStackObserver::ConstructL
+// --------------------------------------------------------------------------
+//
+void CPbk2FilteredViewStackObserver::ConstructL()
+ {
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2FilteredViewStackObserver::~CPbk2FilteredViewStackObserver
+// --------------------------------------------------------------------------
+//
+CPbk2FilteredViewStackObserver::~CPbk2FilteredViewStackObserver()
+ {
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2FilteredViewStackObserver::TopViewChangedL
+// --------------------------------------------------------------------------
+//
+void CPbk2FilteredViewStackObserver::TopViewChangedL(
+ MVPbkContactViewBase& aOldView )
+ {
+ ( iControl.*iTopViewChangedFuncPtr )( aOldView );
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2FilteredViewStackObserver::TopViewUpdatedL
+// --------------------------------------------------------------------------
+//
+void CPbk2FilteredViewStackObserver::TopViewUpdatedL()
+ {
+ ( iControl.*iTopViewUpdatedFuncPtr )();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2FilteredViewStackObserver::BaseViewChangedL
+// --------------------------------------------------------------------------
+//
+void CPbk2FilteredViewStackObserver::BaseViewChangedL()
+ {
+ ( iControl.*iBaseViewChangedFuncPtr )();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2FilteredViewStackObserver::ViewStackError
+// --------------------------------------------------------------------------
+//
+void CPbk2FilteredViewStackObserver::ViewStackError( TInt aError )
+ {
+ ( iControl.*iViewStackErrorFuncPtr )( aError );
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2FilteredViewStackObserver::ContactAddedToBaseView
+// --------------------------------------------------------------------------
+//
+void CPbk2FilteredViewStackObserver::ContactAddedToBaseView(
+ MVPbkContactViewBase& aBaseView, TInt aIndex,
+ const MVPbkContactLink& aContactLink )
+ {
+ ( iControl.*iContactAddedToBaseViewFuncPtr )( aBaseView,
+ aIndex, aContactLink );
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2ListBoxSelectionObserver::CPbk2ListBoxSelectionObserver
+// --------------------------------------------------------------------------
+//
+CPbk2ListBoxSelectionObserver::CPbk2ListBoxSelectionObserver(
+ CPbk2NamesListControl& aControl, CEikListBox& aListBox,
+ MPbk2UiControlEventSender& aEventSender )
+ : iControl( aControl ),
+ iListBox( aListBox ),
+ iEventSender( aEventSender )
+ {
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2ListBoxSelectionObserver::ConstructL
+// --------------------------------------------------------------------------
+//
+void CPbk2ListBoxSelectionObserver::ConstructL()
+ {
+ iListBox.AddSelectionObserverL( this );
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2ListBoxSelectionObserver::NewL
+// --------------------------------------------------------------------------
+//
+CPbk2ListBoxSelectionObserver* CPbk2ListBoxSelectionObserver::NewL(
+ CPbk2NamesListControl& aControl,
+ CEikListBox& aListBox,
+ MPbk2UiControlEventSender& aEventSender )
+ {
+ CPbk2ListBoxSelectionObserver* self =
+ new( ELeave ) CPbk2ListBoxSelectionObserver( aControl, aListBox,
+ aEventSender );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2ListBoxSelectionObserver::~CPbk2ListBoxSelectionObserver
+// --------------------------------------------------------------------------
+//
+CPbk2ListBoxSelectionObserver::~CPbk2ListBoxSelectionObserver()
+ {
+ iListBox.RemoveSelectionObserver( this );
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2ListBoxSelectionObserver::SelectionModeChanged
+// --------------------------------------------------------------------------
+//
+void CPbk2ListBoxSelectionObserver::SelectionModeChanged(
+ CEikListBox* aListBox, TBool aSelectionModeEnabled )
+ {
+ if ( &iListBox == aListBox )
+ {
+ TPbk2ControlEvent event(
+ TPbk2ControlEvent::EControlEntersSelectionMode );
+ if ( !aSelectionModeEnabled )
+ {
+ event.iEventType =
+ TPbk2ControlEvent::EControlLeavesSelectionMode;
+ }
+ TRAPD( res, iEventSender.SendEventToObserversL( event ) );
+ HandleError( res );
+ if ( res != KErrNone )
+ {
+ iControl.Reset();
+ }
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::CPbk2NamesListControl
+// --------------------------------------------------------------------------
+//
+EXPORT_C CPbk2NamesListControl::CPbk2NamesListControl
+ (const CCoeControl* aContainer,
+ CVPbkContactManager& aManager,
+ MVPbkContactViewBase& aView,
+ MPbk2ContactNameFormatter& aNameFormatter,
+ CPbk2StorePropertyArray& aStoreProperties) :
+ iContactManager( aManager ),
+ iBaseView( &aView ),
+ iContainer( aContainer ),
+ iNameFormatter( aNameFormatter ),
+ iStoreProperties( aStoreProperties ),
+ iAllowPointerEvents( ETrue )
+ {
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::CPbk2NamesListControl
+// --------------------------------------------------------------------------
+//
+CPbk2NamesListControl::CPbk2NamesListControl
+ (const CCoeControl* aContainer,
+ CVPbkContactManager& aManager,
+ MVPbkContactViewBase& aView,
+ MPbk2ContactNameFormatter& aNameFormatter,
+ CPbk2StorePropertyArray& aStoreProperties,
+ CPbk2ThumbnailManager* aThumbManager) :
+ iContactManager( aManager ),
+ iBaseView( &aView ),
+ iContainer( aContainer ),
+ iNameFormatter( aNameFormatter ),
+ iStoreProperties( aStoreProperties ),
+ iThumbManager( aThumbManager ), //TODO
+ iAllowPointerEvents( ETrue )
+ {
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::~CPbk2NamesListControl
+// --------------------------------------------------------------------------
+//
+CPbk2NamesListControl::~CPbk2NamesListControl()
+ {
+ if ( iViewStack && iStackObserver )
+ {
+ iViewStack->RemoveStackObserver( *iStackObserver );
+ }
+
+ if (iCommand)
+ {
+ // inform the command that the control is deleted
+ iCommand->ResetUiControl(*this);
+ }
+ iObservers.Reset();
+ iCommandItems.ResetAndDestroy();
+ delete iListBoxSelectionObserver;
+ delete iStateFactory;
+ delete iListBox;
+ delete iFindBox;
+ delete iThumbnailLoader;
+ delete iEventSender;
+ delete iStackObserver;
+ delete iUiExtension;
+ delete iViewStack;
+ delete iSearchFilter;
+
+ if (iOwnBaseView)
+ {
+ delete iBaseView;
+ }
+ if(iFeatureManagerInitilized)
+ {
+ FeatureManager::UnInitializeLib();
+ }
+
+ // if thumbmanager, remove observer
+ if( iThumbManager )
+ {
+ iThumbManager->RemoveObserver();
+ }
+
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::NewL
+// --------------------------------------------------------------------------
+//
+EXPORT_C CPbk2NamesListControl* CPbk2NamesListControl::NewL(
+ TInt aResourceId,
+ const CCoeControl* aContainer,
+ CVPbkContactManager& aManager,
+ MVPbkContactViewBase& aView,
+ MPbk2ContactNameFormatter& aNameFormatter,
+ CPbk2StorePropertyArray& aStoreProperties )
+ {
+ CPbk2NamesListControl* self = new (ELeave) CPbk2NamesListControl(
+ aContainer, aManager, aView, aNameFormatter, aStoreProperties );
+ CleanupStack::PushL(self);
+ self->ConstructL( aResourceId);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::NewL
+// --------------------------------------------------------------------------
+//
+EXPORT_C CPbk2NamesListControl* CPbk2NamesListControl::NewL(
+ TInt aResourceId,
+ const CCoeControl* aContainer,
+ CVPbkContactManager& aManager,
+ MVPbkContactViewBase& aView,
+ MPbk2ContactNameFormatter& aNameFormatter,
+ CPbk2StorePropertyArray& aStoreProperties,
+ CPbk2ThumbnailManager* aThumbManager ) //TODO
+ {
+ CPbk2NamesListControl* self = new (ELeave) CPbk2NamesListControl(
+ aContainer, aManager, aView, aNameFormatter, aStoreProperties, aThumbManager );
+ CleanupStack::PushL(self);
+ self->ConstructL( aResourceId);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::ConstructL
+// --------------------------------------------------------------------------
+//
+inline void CPbk2NamesListControl::ConstructL(
+ TInt aResourceId)
+ {
+ if (!iContainer)
+ {
+ User::Leave(KErrGeneral);
+ }
+
+ // First set container
+ SetContainerWindowL(*iContainer);
+
+ TResourceReader resReader;
+ CCoeEnv::Static()->CreateResourceReaderLC(resReader, aResourceId);
+ ConstructFromResourceL(resReader);
+ CleanupStack::PopAndDestroy(); // resReader
+ FeatureManager::InitializeLibL();
+ iFeatureManagerInitilized = ETrue;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::ConstructFromResourceL
+// --------------------------------------------------------------------------
+//
+inline void CPbk2NamesListControl::ConstructFromResourceL
+ ( TResourceReader& aReader )
+ {
+ iSearchFilter = CPbk2PredictiveSearchFilter::NewL();
+
+ if(FeatureManager::FeatureSupported(KFeatureIdFfContactsPredictiveSearch))
+
+ {
+ iViewStack = CPbk2PredictiveViewStack::NewL( *iBaseView, *iSearchFilter,
+ iNameFormatter );
+ }
+ else
+ {
+ iViewStack = CPbk2FilteredViewStack::NewL( *iBaseView );
+ }
+
+ iViewStack->AddObserverL( *this );
+
+ iStackObserver = CPbk2FilteredViewStackObserver::NewL
+ ( *this,
+ &CPbk2NamesListControl::HandleTopViewChangedL,
+ &CPbk2NamesListControl::HandleTopViewUpdatedL,
+ &CPbk2NamesListControl::HandleBaseViewChangedL,
+ &CPbk2NamesListControl::HandleViewStackError,
+ &CPbk2NamesListControl::HandleContactAddedToBaseView );
+ iEventSender = CPbk2UiControlEventSender::NewL( *this, iObservers );
+ iViewStack->AddStackObserverL( *iStackObserver );
+
+
+ CPbk2UIExtensionManager* extManager =
+ CPbk2UIExtensionManager::InstanceL();
+ extManager->PushL();
+
+ iUiExtension = extManager->FactoryL()->CreatePbk2UiControlExtensionL
+ ( iContactManager );
+
+ CleanupStack::PopAndDestroy(); // extManager
+
+ // peek listbox type from resource
+ TInt flags = aReader.ReadInt32();
+ aReader.Rewind( sizeof( TInt32 ) );
+
+ // Create the listbox and its model
+ if( flags & KPbk2ContactViewListControlDoubleRow )
+ {
+ iDoubleListBox = CPbk2ContactViewDoubleListBox::NewL
+ ( *this, aReader, iContactManager,
+ *iViewStack, iNameFormatter, iStoreProperties,
+ iUiExtension, *iSearchFilter, *iThumbManager );
+
+ if( iThumbManager )
+ {
+ iThumbManager->SetObserver( *iDoubleListBox );
+ iViewStack->AddObserverL( *iThumbManager );
+ }
+
+ iListBox = iDoubleListBox;
+ }
+ else
+ {
+ iListBox = CPbk2ContactViewListBox::NewL
+ ( *this, aReader, iContactManager,
+ *iViewStack, iNameFormatter, iStoreProperties,
+ iUiExtension, *iSearchFilter );
+
+ //TODO at this point remove observer
+ if( iThumbManager )
+ {
+ iThumbManager->RemoveObserver();
+ }
+ iDoubleListBox = NULL;
+ }
+
+ iListBox->SetObserver( this );
+ iListBox->SetScrollEventObserver( this );
+ iListBox->SetListBoxObserver(this);
+ iUiExtension->SetContactUiControlUpdate( this );
+ // set command item updater
+ TAny* ext = iUiExtension->ContactUiControlExtensionExtension(
+ TUid::Uid( KPbk2ContactUiControlExtensionExtensionUID ) );
+ if( ext )
+ {
+ static_cast<MPbk2ContactUiControlDoubleListboxExtension*>(ext)->
+ SetCommandItemUpdater( this );
+ }
+
+ if ( iListBox->Flags() & KPbk2ContactViewListControlFindBox )
+ {
+ // Create a find box
+ if ( iSearchFilter->IsPredictiveActivated() )
+ {
+ iFindBox = CAknSearchField::NewL
+ (*this, CAknSearchField::ESearch, NULL, KSearchFieldLength);
+ }
+ else
+ {
+ iFindBox = CAknSearchField::NewL
+ (*this, CAknSearchField::EAdaptiveSearch, NULL, KSearchFieldLength);
+ }
+
+ iSearchFilter->SetAknSearchFieldL( iFindBox );
+
+ iFindBox->MakeVisible( EFalse );
+ iFindBox->SetObserver( this );
+ iFindBox->AddAdaptiveSearchTextObserverL( this );
+ }
+
+ // If list box supports selection then construct an observer that
+ // handles the event sending when the selection mode changes.
+ if ( iListBox->IsSelectionListBox() )
+ {
+ iListBoxSelectionObserver = CPbk2ListBoxSelectionObserver::NewL(
+ *this, *iListBox, *iEventSender );
+ }
+
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2NamesListControl::ConstructL find box created"));
+
+ // Instantiate the state factory
+ iStateFactory = CPbk2NamesListStateFactory::NewL( *this, *iListBox,
+ *iViewStack, iFindBox, *iThumbnailLoader, *iEventSender,
+ iNameFormatter, iCommandItems, *iSearchFilter );
+
+ // Create the initial state
+ iCurrentState = &iStateFactory->ActivateStartupStateL( iCurrentState );
+
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2NamesListControl::ConstructFromResourceL end"));
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::AddObserverL
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CPbk2NamesListControl::AddObserverL
+ ( MPbk2ControlObserver& aObserver )
+ {
+ User::LeaveIfError(iObservers.Append(&aObserver));
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::RemoveObserver
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CPbk2NamesListControl::RemoveObserver
+ ( MPbk2ControlObserver& aObserver )
+ {
+ const TInt index = iObservers.Find(&aObserver);
+ if (index >= 0)
+ {
+ iObservers.Remove(index);
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::Reset
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CPbk2NamesListControl::Reset()
+ {
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING("CPbk2NamesListControl::Reset(0x%x) - IN"),
+ this );
+
+ // Unmark all contacts and reset the toolbar so that the Call button
+ // won't be dimmed
+ TRAP_IGNORE( ProcessCommandL( EAknUnmarkAll ) );
+ // Reset find box
+ TRAP_IGNORE( ResetFindL() );
+ // Destroy all the filtered views from the stack
+ iViewStack->Reset();
+ // Refresh observer to get the view state
+ iViewStack->RemoveObserver( *this );
+ // Shouldn't leave because the observer was first removed.
+ // The control updates its state when the asynchronous Virtual Phonebook
+ // view event arrives.
+ TRAP_IGNORE( iViewStack->AddObserverL( *this ) );
+
+ const TInt firstContactIndex = 0;
+ // Best effort: try to reset the focus.
+ TRAP_IGNORE( iCurrentState->SetFocusedContactIndexL( firstContactIndex ) );
+ //scroll listbox into beginning (ignore focus that may be below promotion items)
+ iListBox->SetTopItemIndex(firstContactIndex);
+
+ // Switch to the background state. This enables the next state to avtivate fully (ActivateStateL()) once phonebook
+ // comes from the background.
+ TRAP_IGNORE( iCurrentState = &iStateFactory->ActivateHiddenStateL( iCurrentState ); );
+
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING("CPbk2NamesListControl::Reset() - OUT"));
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::SetViewL
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CPbk2NamesListControl::SetViewL( MVPbkContactViewBase& aView )
+ {
+ // Control will receive a view event asynchronously from the stack
+ iViewStack->SetNewBaseViewL( aView );
+
+ if (iOwnBaseView)
+ {
+ delete iBaseView;
+ iBaseView = NULL;
+ }
+
+ iBaseView = &aView;
+ iOwnBaseView = EFalse;
+
+ iEventSender->Reset();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::GiveViewL
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CPbk2NamesListControl::GiveViewL( MVPbkContactViewBase* aView )
+ {
+ SetViewL( *aView );
+ iOwnBaseView = ETrue;
+ }
+
+EXPORT_C void CPbk2NamesListControl::AllowPointerEvents( TBool aAllow )
+ {
+ iAllowPointerEvents = aAllow;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::SetCurrentGroupLinkL
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CPbk2NamesListControl::SetCurrentGroupLinkL( MVPbkContactLink* aGroupLinktoSet)
+ {
+ // This is used only when predictive search is enabled
+ if(FeatureManager::FeatureSupported(KFeatureIdFfContactsPredictiveSearch))
+ {
+ static_cast<CPbk2PredictiveViewStack*> (iViewStack)->SetCurrentGroupLinkL(aGroupLinktoSet);
+ }
+ return;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::View
+// --------------------------------------------------------------------------
+//
+MVPbkContactViewBase& CPbk2NamesListControl::View()
+ {
+ return *iViewStack;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::MakeVisible
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::MakeVisible(TBool aVisible)
+ {
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING(
+ "CPbk2NamesListControl::MakeVisible(0x%x,%d)"),
+ this, aVisible);
+
+ CCoeControl::MakeVisible(aVisible);
+ iCurrentState->MakeComponentsVisible(aVisible);
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::ActivateL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::ActivateL()
+ {
+ // First, call base class implementation
+ CCoeControl::ActivateL();
+ // Then do own initialization
+ iCurrentState->ActivateL();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::OfferKeyEventL
+// --------------------------------------------------------------------------
+//
+TKeyResponse CPbk2NamesListControl::OfferKeyEventL
+ ( const TKeyEvent& aKeyEvent, TEventCode aType )
+ {
+ if(FeatureManager::FeatureSupported(KFeatureIdFfContactsPredictiveSearch))
+ {
+ if( iCurrentState->NamesListState() == EStateReady ||
+ iCurrentState->NamesListState() == EStateFiltered )
+ {
+ iSearchFilter->FilterL( aKeyEvent, aType, iFindBox );
+ }
+ }
+
+ TKeyResponse result = iSearchFilter->OfferKeyEventL( aKeyEvent, aType );
+
+ if ( result == EKeyWasNotConsumed )
+ {
+ result = iCurrentState->OfferKeyEventL( aKeyEvent, aType );
+ }
+
+ // Ignore Send Key up and down events to prevent Dialer appearance
+ // on top of Phonebook application.
+ if ( result == EKeyWasNotConsumed && iListBox->NumberOfItems() != 0 )
+ {
+ if ( ( aType == EEventKeyDown || aType == EEventKeyUp )
+ && aKeyEvent.iScanCode == EStdKeyYes )
+ {
+ result = EKeyWasConsumed;
+ }
+ }
+
+ return result;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::CountComponentControls
+// --------------------------------------------------------------------------
+//
+TInt CPbk2NamesListControl::CountComponentControls() const
+ {
+ return iCurrentState->CountComponentControls();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::ComponentControl
+// --------------------------------------------------------------------------
+//
+CCoeControl* CPbk2NamesListControl::ComponentControl(TInt aIndex) const
+ {
+ // This is not forwarded to the states because these controls are
+ // always existing. It does not matter what is the state.
+ switch (aIndex)
+ {
+ case 0:
+ {
+ return iListBox;
+ }
+ case 1:
+ {
+ return iFindBox;
+ }
+ default:
+ {
+ // Illegal state
+ __ASSERT_DEBUG( EFalse, Panic( EPanicLogic_ComponentControl ) );
+ return NULL;
+ }
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::FocusChanged
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::FocusChanged( TDrawNow aDrawNow )
+ {
+ if ( iListBox )
+ {
+ iListBox->SetFocus( IsFocused(), aDrawNow );
+ }
+
+ if ( iFindBox && iFindBox->IsVisible() )
+ {
+ iFindBox->SetFocus( IsFocused(), aDrawNow );
+ if ( aDrawNow == EDrawNow && IsFocused() )
+ {
+ iFindBox->DrawDeferred();
+ }
+ }
+
+ if (iCurrentState && IsNonFocusing())
+ {
+ iCurrentState->CoeControl().SetFocus(IsFocused(), aDrawNow);
+ }
+ if ( IsFocused() )
+ {
+ ShowThumbnail();
+ }
+ else
+ {
+ HideThumbnail();
+ }
+ ReportEventL( MCoeControlObserver::EEventStateChanged );
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::SizeChanged
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::SizeChanged()
+ {
+ iCurrentState->SizeChanged();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::Draw
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::Draw(const TRect& aRect) const
+ {
+ CWindowGc& gc = SystemGc();
+ iCurrentState->Draw(aRect, gc);
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::HandleResourceChange
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::HandleResourceChange(TInt aType)
+ {
+ CCoeControl::HandleResourceChange(aType);
+ if ( iFindBox != NULL && aType == KAknMessageFocusLost )
+ {
+ iFindBox->DrawDeferred();
+ }
+
+/* This is useless...no need to show or hide thumbnail on layout/skin change...thumbnail will handle it's own resouce change event
+ if ( aType == KEikDynamicLayoutVariantSwitch ||
+ aType == KAknsMessageSkinChange )
+ {
+ if ( IsFocused() )
+ {
+ RDebug::Print( _L("### NamesList::HandleResourceChangeL - show") );
+ ShowThumbnail();
+ }
+ else
+ {
+ RDebug::Print( _L("### NamesList::HandleResourceChangeL - hide") );
+ HideThumbnail();
+ }
+ }*/
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::HandlePointerEventL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::HandlePointerEventL(
+ const TPointerEvent& aPointerEvent )
+ {
+ if( !iAllowPointerEvents )
+ {
+ return;
+ }
+ if ( AknLayoutUtils::PenEnabled() )
+ {
+ iCurrentState->HandlePointerEventL( aPointerEvent );
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::ParentControl
+// --------------------------------------------------------------------------
+//
+MPbk2ContactUiControl* CPbk2NamesListControl::ParentControl() const
+ {
+ // Name list controls has no parent
+ return NULL;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::NumberOfContacts
+// --------------------------------------------------------------------------
+//
+TInt CPbk2NamesListControl::NumberOfContacts() const
+ {
+ TInt ret( iCurrentState->NumberOfContacts() );
+ return ret;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::FocusedContactL
+// --------------------------------------------------------------------------
+//
+const MVPbkBaseContact* CPbk2NamesListControl::FocusedContactL() const
+ {
+ return iCurrentState->FocusedContactL();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::FocusedViewContactL
+// --------------------------------------------------------------------------
+//
+const MVPbkViewContact* CPbk2NamesListControl::FocusedViewContactL() const
+ {
+ return iCurrentState->FocusedViewContactL();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::FocusedStoreContact
+// --------------------------------------------------------------------------
+//
+const MVPbkStoreContact* CPbk2NamesListControl::FocusedStoreContact() const
+ {
+ return iCurrentState->FocusedStoreContact();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::SetFocusedContactL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::SetFocusedContactL
+ ( const MVPbkBaseContact& aContact )
+ {
+ iCurrentState->SetFocusedContactL(aContact);
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::SetFocusedContactL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::SetFocusedContactL(
+ const MVPbkContactBookmark& aContactBookmark )
+ {
+ iCurrentState->SetFocusedContactL( aContactBookmark );
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::SetFocusedContactL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::SetFocusedContactL(
+ const MVPbkContactLink& aContactLink )
+ {
+ iCurrentState->SetFocusedContactL( aContactLink );
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::FocusedContactIndex
+// --------------------------------------------------------------------------
+//
+TInt CPbk2NamesListControl::FocusedContactIndex() const
+ {
+ return iCurrentState->FocusedContactIndex();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::SetFocusedContactIndexL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::SetFocusedContactIndexL( TInt aIndex )
+ {
+ iCurrentState->SetFocusedContactIndexL( aIndex );
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::NumberOfContactFields
+// --------------------------------------------------------------------------
+//
+TInt CPbk2NamesListControl::NumberOfContactFields() const
+ {
+ return iCurrentState->NumberOfContactFields();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::FocusedField
+// --------------------------------------------------------------------------
+//
+const MVPbkBaseContactField* CPbk2NamesListControl::FocusedField() const
+ {
+ return iCurrentState->FocusedField();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::FocusedFieldIndex
+// --------------------------------------------------------------------------
+//
+TInt CPbk2NamesListControl::FocusedFieldIndex() const
+ {
+ return iCurrentState->FocusedFieldIndex();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::SetFocusedFieldIndex
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::SetFocusedFieldIndex( TInt /*aIndex*/ )
+ {
+ // Do nothing
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::ContactsMarked
+// --------------------------------------------------------------------------
+//
+TBool CPbk2NamesListControl::ContactsMarked() const
+ {
+ return iCurrentState->ContactsMarked();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::SelectedContactsL
+// --------------------------------------------------------------------------
+//
+MVPbkContactLinkArray*
+ CPbk2NamesListControl::SelectedContactsL() const
+ {
+ return iCurrentState->SelectedContactsL();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::SelectedContactsOrFocusedContactL
+// --------------------------------------------------------------------------
+//
+MVPbkContactLinkArray*
+ CPbk2NamesListControl::SelectedContactsOrFocusedContactL() const
+ {
+ return iCurrentState->SelectedContactsOrFocusedContactL();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::SelectedContactsIteratorL
+// --------------------------------------------------------------------------
+//
+MPbk2ContactLinkIterator*
+ CPbk2NamesListControl::SelectedContactsIteratorL() const
+ {
+ return iCurrentState->SelectedContactsIteratorL();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::SelectedContactStoresL
+// --------------------------------------------------------------------------
+//
+CArrayPtr<MVPbkContactStore>*
+ CPbk2NamesListControl::SelectedContactStoresL() const
+ {
+ // This is not a contact store control
+ return NULL;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::ClearMarks
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::ClearMarks()
+ {
+ iCurrentState->ClearMarks();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::SetSelectedContactL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::SetSelectedContactL
+ ( TInt aIndex, TBool aSelected )
+ {
+ iCurrentState->SetSelectedContactL( aIndex, aSelected );
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::SetSelectedContactL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::SetSelectedContactL(
+ const MVPbkContactBookmark& aContactBookmark,
+ TBool aSelected )
+ {
+ iCurrentState->SetSelectedContactL( aContactBookmark, aSelected );
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::SetSelectedContactL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::SetSelectedContactL(
+ const MVPbkContactLink& aContactLink,
+ TBool aSelected )
+ {
+ iCurrentState->SetSelectedContactL( aContactLink, aSelected );
+ }
+TInt CPbk2NamesListControl::CommandItemCount() const
+ {
+ MPbk2ContactUiControl2* tempCurrentState =
+ reinterpret_cast<MPbk2ContactUiControl2*>
+ (iCurrentState->ContactUiControlExtension
+ (KMPbk2ContactUiControlExtension2Uid ));
+ return tempCurrentState->CommandItemCount();
+ }
+
+const MPbk2UiControlCmdItem&
+CPbk2NamesListControl::CommandItemAt( TInt aIndex ) const
+ {
+ MPbk2ContactUiControl2* tempCurrentState =
+ reinterpret_cast<MPbk2ContactUiControl2*>
+ (iCurrentState->ContactUiControlExtension
+ (KMPbk2ContactUiControlExtension2Uid ));
+ return tempCurrentState->CommandItemAt( aIndex );
+ }
+
+const MPbk2UiControlCmdItem* CPbk2NamesListControl::FocusedCommandItem() const
+ {
+ MPbk2ContactUiControl2* tempCurrentState =
+ reinterpret_cast<MPbk2ContactUiControl2*>
+ (iCurrentState->ContactUiControlExtension
+ (KMPbk2ContactUiControlExtension2Uid ));
+ return tempCurrentState->FocusedCommandItem();
+ }
+
+void CPbk2NamesListControl::DeleteCommandItemL( TInt aIndex )
+ {
+ iCommandItems.Remove(aIndex);
+ iCurrentState->HandleCommandEventL(MPbk2NamesListState::EItemRemoved, aIndex);
+ }
+
+void CPbk2NamesListControl::AddCommandItemL(MPbk2UiControlCmdItem* aCommand, TInt aIndex)
+ {
+ // Fix ETKI-7NADZC
+ DeleteIfAlreadyAdded(aCommand);
+
+ // add aCommand to iCommandItems
+ if (aIndex > iCommandItems.Count())
+ {
+ aIndex = iCommandItems.Count();
+ }
+ iCommandItems.Insert(aCommand, aIndex);
+ iCurrentState->HandleCommandEventL(MPbk2NamesListState::EItemAdded, aIndex);
+ }
+
+void CPbk2NamesListControl::DeleteIfAlreadyAdded(const MPbk2UiControlCmdItem* aCommand)
+ {
+ for ( TInt n = 0; n < iCommandItems.Count(); ++n)
+ {
+ MPbk2UiControlCmdItem* cmd = iCommandItems[n];
+ if(cmd->CommandId() == aCommand->CommandId())
+ {
+ iCommandItems.Remove(n);
+ delete cmd;
+ break;
+ }
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::DynInitMenuPaneL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::DynInitMenuPaneL(
+ TInt aResourceId, CEikMenuPane* aMenuPane) const
+ {
+ iCurrentState->DynInitMenuPaneL(aResourceId, aMenuPane);
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::ProcessCommandL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::ProcessCommandL( TInt aCommandId ) const
+ {
+ iCurrentState->ProcessCommandL(aCommandId);
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::UpdateAfterCommandExecution
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::UpdateAfterCommandExecution()
+ {
+ if( iCommand )
+ {
+ /// Reset command pointer, command has completed
+ iCommand->ResetUiControl(*this);
+ iCommand = NULL;
+ }
+ TRAP_IGNORE( ProcessCommandL( EAknUnmarkAll); );
+ if( iSearchFilter )
+ {
+ TRAP_IGNORE( iSearchFilter->ReDrawL(ETrue); );
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::GetMenuFilteringFlagsL
+// --------------------------------------------------------------------------
+//
+TInt CPbk2NamesListControl::GetMenuFilteringFlagsL() const
+ {
+ return iCurrentState->GetMenuFilteringFlagsL();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::ControlStateL
+// --------------------------------------------------------------------------
+//
+CPbk2ViewState* CPbk2NamesListControl::ControlStateL() const
+ {
+ CPbk2ViewState* state = CPbk2ViewState::NewLC();
+ const MVPbkBaseContact* focusedContact = FocusedContactL();
+ if (focusedContact)
+ {
+ MVPbkContactLink* link = focusedContact->CreateLinkLC();
+ if (link)
+ {
+ CleanupStack::Pop(); // link
+ state->SetFocusedContact(link);
+ }
+ }
+
+ const MVPbkViewContact* topContact = iCurrentState->TopContactL();
+ if ( topContact )
+ {
+ MVPbkContactLink* link = topContact->CreateLinkLC();
+ if (link)
+ {
+ CleanupStack::Pop(); // link
+ state->SetTopContact( link );
+ }
+ }
+
+ if (ContactsMarked())
+ {
+ state->SetMarkedContacts(SelectedContactsL());
+ }
+ CleanupStack::Pop(); // state
+ return state;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::RestoreControlStateL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::RestoreControlStateL(CPbk2ViewState* aState)
+ {
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2NamesListControl::RestoreControlStateL(0x%x,0x%x)"),
+ this, aState);
+
+ if (aState)
+ {
+ iCurrentState->RestoreControlStateL(aState);
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::FindTextL
+// --------------------------------------------------------------------------
+//
+const TDesC& CPbk2NamesListControl::FindTextL()
+ {
+ return iCurrentState->FindTextL();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::ResetFindL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::ResetFindL()
+ {
+ iCurrentState->ResetFindL();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::ShowThumbnail
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::ShowThumbnail()
+ {
+ iCurrentState->ShowThumbnail();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::HideThumbnail
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::HideThumbnail()
+ {
+ iCurrentState->HideThumbnail();
+ }
+
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::SetBlank
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::SetBlank(TBool aBlank)
+ {
+ MakeVisible( !aBlank );
+
+ // The focus status of CAknSearchField* iFindBox is expected to be
+ // consistent with CPbk2NamesListControl when setting blank.
+
+ if ( iFindBox )
+ {
+ if ( iFindBox->IsVisible() )
+ {
+ iFindBox->SetFocus( IsFocused() );
+ }
+ }
+
+ iCurrentState->SetBlank( aBlank );
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::RegisterCommand
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::RegisterCommand(
+ MPbk2Command* aCommand)
+ {
+ iCommand = aCommand;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::SetTextL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::SetTextL( const TDesC& aText )
+ {
+ iCurrentState->SetTextL( aText );
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::ContactUiControlExtension
+// --------------------------------------------------------------------------
+//
+TAny* CPbk2NamesListControl::ContactUiControlExtension(TUid aExtensionUid )
+ {
+ if( aExtensionUid == KMPbk2ContactUiControlExtension2Uid )
+ {
+ return static_cast<MPbk2ContactUiControl2*>( this );
+ }
+
+ return NULL;
+
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::ContactViewReady
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::ContactViewReady
+ ( MVPbkContactViewBase& aView )
+ {
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2NamesListControl::ContactViewReady(0x%x)"), this );
+ TRAPD( error, DoHandleContactViewReadyL( aView ) );
+ HandleError( error );
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::ContactViewUnavailable
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::ContactViewUnavailable
+ ( MVPbkContactViewBase& aView )
+ {
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2NamesListControl::ContactViewUnavailable(0x%x)"), this);
+
+ if ( &aView == iViewStack )
+ {
+ TRAPD( err, iCurrentState =
+ &iStateFactory->ActivateNotReadyStateL( iCurrentState ) );
+ HandleError( err );
+ RelayoutControls();
+ TRAP( err, iEventSender->SendEventToObserversL(
+ TPbk2ControlEvent::EUnavailable ) );
+ HandleError( err );
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::ContactAddedToView
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::ContactAddedToView(
+ MVPbkContactViewBase& aView,
+ TInt aIndex,
+ const MVPbkContactLink& /*aContactLink*/)
+ {
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2NamesListControl::ContactAddedToView()"));
+
+ if (&aView == iViewStack)
+ {
+ TRAPD(err, DoHandleContactAdditionL(aIndex));
+ HandleError(err);
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::ContactRemovedFromView
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::ContactRemovedFromView(
+ MVPbkContactViewBase& aView,
+ TInt aIndex,
+ const MVPbkContactLink& /*aContactLink*/ )
+ {
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2NamesListControl::ContactRemovedFromView()"));
+
+ if (&aView == iViewStack)
+ {
+ TRAPD(err, DoHandleContactRemovalL(aIndex));
+ HandleError(err);
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::ContactViewError
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::ContactViewError(
+ MVPbkContactViewBase& /*aView*/,
+ TInt aError,
+ TBool /*aErrorNotified*/)
+ {
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2NamesListControl::ContactViewError(%d)"), aError);
+
+ // Error comes from the active view or from find view stack.
+ // Actions are same in both cases. Show error note by forwarding
+ // the error to CCoeEnv and try to reset control. Do reset asychronously
+ // because the ContactViewError can be coming from view that is
+ // destroyed when the control is reset.
+ HandleError(aError);
+ Reset();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::FocusedItemPointed
+// --------------------------------------------------------------------------
+//
+TBool CPbk2NamesListControl::FocusedItemPointed()
+ {
+ return iCurrentState->FocusedItemPointed();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::FocusableItemPointed
+// --------------------------------------------------------------------------
+//
+TBool CPbk2NamesListControl::FocusableItemPointed()
+ {
+ return iCurrentState->FocusableItemPointed();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::SearchFieldPointed
+// --------------------------------------------------------------------------
+//
+TBool CPbk2NamesListControl::SearchFieldPointed()
+ {
+ return iCurrentState->SearchFieldPointed();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::HandleControlEventL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::HandleControlEventL
+ ( CCoeControl* aControl, TCoeEvent aEventType )
+ {
+ iCurrentState->HandleControlEventL( aControl, aEventType, 0 );
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::UpdateContact
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::UpdateContact
+ ( const MVPbkContactLink& aContactLink )
+ {
+ TInt listBoxRow = KErrNotFound;
+
+ TRAPD( err, listBoxRow = iViewStack->IndexOfLinkL( aContactLink ) );
+ if ( err )
+ {
+ iEikonEnv->NotifyIdleErrorWhileRedrawing( err );
+ }
+
+ MPbk2ContactUiControl2* tempCurrentState =
+ reinterpret_cast<MPbk2ContactUiControl2*>
+ (iCurrentState->ContactUiControlExtension
+ (KMPbk2ContactUiControlExtension2Uid ));
+
+ if(tempCurrentState)
+ {
+ listBoxRow += tempCurrentState->CommandItemCount();
+ }
+ if ( listBoxRow >= 0 )
+ {
+ // If visible
+ if ( listBoxRow >= iListBox->TopItemIndex() &&
+ listBoxRow <= iListBox->BottomItemIndex() )
+ {
+ iListBox->RedrawItem( listBoxRow );
+ }
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::UpdateCommandItem
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::UpdateCommandItem( TInt aCommandId )
+ {
+ const TInt count = CommandItemCount();
+ const TInt top = iListBox->TopItemIndex();
+ const TInt bottom = iListBox->BottomItemIndex();
+
+ for( TInt i = 0; i < count; ++i )
+ {
+ if( Rng( top, i, bottom ) ) // is in visible range
+ {
+ if( CommandItemAt( i ).CommandId() == aCommandId )
+ {
+ iListBox->RedrawItem( i );
+ break; // only one command with same id
+ }
+ }
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::Redraw
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::Redraw()
+ {
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING(
+ "CPbk2NamesListControl(0x%x)::Redraw"), this );
+
+ // Do not use DrawNow because:
+ // 1) DrawNow will draw the control everytime it's called. This can
+ // cause flickering in list box focus e.g. when the application view
+ // is restoring the control state.
+ // 2) Avoid unnecessary drawing because DrawDeferred can be called many
+ // times in short interval but it will draw the control only once.
+ DrawDeferred();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::DoHandleContactViewReadyL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::DoHandleContactViewReadyL
+ ( MVPbkContactViewBase& /*aView*/ )
+ {
+ // Change state
+ SelectAndChangeReadyStateL();
+
+ //When contact view is ready, state is activated. If there are multiple stores
+ //state doesn't get event when other stores are ready. EContactViewUpdated event is
+ //sent when contact view is ready, so after state activation, state can get multiple
+ //contact view updated events.
+ iCurrentState->HandleContactViewEventL( MPbk2NamesListState::EContactViewUpdated, 0 );
+
+ // Check that there is still focus in list
+ // Focus may be lost if for example store goes unavailable
+ iListBox->CheckFocusIndex();
+ // Control is ready and visible, inform observers
+ TBool eventSent = iEventSender->SendEventToObserversL(
+ TPbk2ControlEvent::EReady );
+ // If Ready-event has been already sent, send
+ // ContactSetChanged-event instead.
+ if ( !eventSent )
+ {
+ iEventSender->SendEventToObserversL( TPbk2ControlEvent::
+ EContactSetChanged );
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::DoHandleContactAdditionL
+//
+// NOTE: See also CPbk2FilteredViewStackObserver::ContactAddedToBaseView and
+// CPbk2NamesListControl::DoContactAddedToBaseView
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::DoHandleContactAdditionL( TInt aIndex )
+ {
+ //Prevent messing with focus with always-on when Phonebook hidden in
+ //reseted state. Otherwise background-added contacts will change focus.
+ //This would cause Phonebook not to look like freshly started when opened again.
+ if(iCurrentState->NamesListState() != CPbk2NamesListControl::EStateHidden)
+ {
+ SelectAndChangeReadyStateL();
+ }
+
+ iCurrentState->HandleContactViewEventL
+ ( MPbk2NamesListState::EItemAdded, aIndex );
+
+ // At least names list view needs control event about contact addition,
+ // so it knows to update CBAs
+ iEventSender->SendEventToObserversL( TPbk2ControlEvent::EItemAdded );
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::DoHandleContactRemovalL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::DoHandleContactRemovalL( TInt aIndex )
+ {
+ iCurrentState->HandleContactViewEventL
+ ( MPbk2NamesListState::EItemRemoved, aIndex );
+ SelectAndChangeReadyStateL();
+ iEventSender->SendEventToObserversL( TPbk2ControlEvent::EItemRemoved );
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::SelectAndChangeReadyStateL
+// Changes between ready states (ready, empty, filtered).
+// Can't handle a change to unavailable state
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::SelectAndChangeReadyStateL()
+ {
+ if ( iViewStack->ContactCountL() == 0 )
+ {
+ if ( iViewStack->Level() > 0 )
+ {
+ // If view was filtered beyond matches, activate filtered state
+ iCurrentState = &iStateFactory->ActivateFilteredStateL
+ ( iCurrentState );
+ }
+ else
+ {
+ // Empty state used only if there are no contacts
+ // in the base view
+ iCurrentState = &iStateFactory->ActivateEmptyStateL
+ ( iCurrentState );
+ }
+ }
+ else
+ {
+ iCurrentState =
+ &iStateFactory->ActivateReadyStateL( iCurrentState );
+ }
+
+ // Controls have to be relayouted always. Relayouting only when
+ // state was changed is not enough, it results to drawing problems.
+ // Calling only Redraw() is not enough also.
+ RelayoutControls();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::RelayoutControls
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::RelayoutControls()
+ {
+ SizeChanged();
+ MakeVisible( IsVisible() );
+ Redraw();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::HandleTopViewChangedL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::HandleTopViewChangedL
+ ( MVPbkContactViewBase& aOldView )
+ {
+ SelectAndChangeReadyStateL();
+
+ iCurrentState->TopViewChangedL( aOldView );
+
+ // Inform observers
+ iEventSender->SendEventToObserversL(
+ TPbk2ControlEvent::EContactSetChanged );
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::HandleTopViewUpdatedL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::HandleTopViewUpdatedL()
+ {
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2NamesListControl::HandleTopViewUpdatedL(0x%x)"), this );
+
+ SelectAndChangeReadyStateL();
+
+ iCurrentState->TopViewUpdatedL();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::HandleBaseViewChangedL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::HandleBaseViewChangedL()
+ {
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2NamesListControl::HandleBaseViewChangedL(0x%x)"), this );
+
+ SelectAndChangeReadyStateL();
+
+ iCurrentState->BaseViewChangedL();
+
+ iEventSender->SendEventToObserversL(
+ TPbk2ControlEvent::EContactSetChanged );
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::HandleViewStackError
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::HandleViewStackError( TInt aError )
+ {
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2NamesListControl::HandleBaseViewChangedL(0x%x, %d)"),
+ this, aError );
+
+ HandleError( aError );
+ Reset();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::HandleContactAddedToBaseView
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::HandleContactAddedToBaseView
+ ( MVPbkContactViewBase& /*aBaseView*/,
+ TInt /*aIndex*/, const MVPbkContactLink& /*aContactLink*/ )
+ {
+ // The find box must be reset when new items are added to
+ // the list box. When find text is reset, the possible filter
+ // result (subset of contacts) of the previous find criteria must be
+ // reset too. So, we reset both the find box and the view stack.
+ TRAPD( res,
+ {
+ // This will reset back to base view
+ iCurrentState->ResetFindL();
+ });
+ HandleError( res );
+ Reset();
+
+ // Do not handle contact addition here (DoHandleContactAdditionL),
+ // ContactAddedToView to notification is sent separately
+ }
+
+// --------------------------------------------------------------------------
+//
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::HandleScrollEventL(CEikScrollBar* aScrollBar, TEikScrollEvent aEventType)
+ {
+// iDidMove= EFalse ;
+
+ switch( aEventType )
+ {
+ // drag events -> hide thumbnail
+ // AL: this isn't very efficient way of doing this...
+ // ...thumbnail loader interface should be extended to
+ // enable thumbnail window to be hidden/shown without
+ // destroying and reloading the bitmaps...
+ case EEikScrollThumbDragHoriz:
+ case EEikScrollThumbDragVert:
+ {
+ iDidMove = ETrue;
+ HideThumbnail();
+ break;
+ }
+
+ // release events
+ case EEikScrollThumbReleaseHoriz:
+ case EEikScrollThumbReleaseVert:
+ {
+ // AL: this isn't very efficient way of doing this...
+ // ...thumbnail loader interface should be extended to
+ // enable thumbnail window to be hidden/shown without
+ // destroying and reloading the bitmaps...
+ if( iDidMove )
+ {
+ iDidMove = EFalse;
+ ShowThumbnail();
+ }
+ break;
+ }
+
+ default:
+ {
+ iDidMove= EFalse ;
+
+ if( iThumbnailLoader )
+ {
+ iThumbnailLoader->Refresh();
+ }
+
+
+ }
+ }
+
+ // To avoid slow redraw of the scrollbar, make sure it gets drawn. Fixes MJAA-7ZGHRH.
+ aScrollBar->DrawNow();
+ }
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::HandleListBoxEventL
+// Deal with the Panning/Flick event from listbox
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::HandleListBoxEventL( CEikListBox* /*aListBox*/, TListBoxEvent aEventType )
+ {
+ switch( aEventType )
+ {
+ case EEventPanningStarted:
+ case EEventFlickStarted:
+ {
+ // Hide Thumbnial as the listbox is
+ // Panning/Flicking
+ HideThumbnail();
+ break;
+ }
+
+ case EEventPanningStopped:
+ case EEventFlickStopped:
+ {
+ // Show Thumbnial after the listbox
+ // Panned/Flicked
+ ShowThumbnail();
+ break;
+ }
+ case EEventItemSingleClicked:
+ case EEventItemDoubleClicked:
+ {
+ iEventSender->SendEventToObserversL(
+ TPbk2ControlEvent::EContactDoubleTapped );
+ break;
+ }
+
+ default:
+ break;
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::AdaptiveSearchTextChanged
+//
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::AdaptiveSearchTextChanged( CAknSearchField* aSearchField )
+ {
+ //send event to current state
+ //ETrue means that the event came from adaptvie search grid.
+ iCurrentState->HandleControlEventL( aSearchField, MCoeControlObserver::EEventStateChanged, ETrue );
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListControl::HandleForegroundEventL
+//
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListControl::HandleForegroundEventL(TBool aForeground)
+ {
+ if ( iSearchFilter )
+ {
+ iSearchFilter->HandleForegroundEventL( aForeground );
+ }
+ }
+
+
+// End of File