--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/UIControls/src/CPbk2NamesListFilteredState.cpp Wed Sep 01 12:29:52 2010 +0100
@@ -0,0 +1,1249 @@
+/*
+* 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 filtered state.
+*
+*/
+
+
+// INCLUDE FILES
+#include "CPbk2NamesListFilteredState.h"
+
+// Phonebook 2
+#include "CPbk2ContactViewListBox.h"
+#include "MPbk2FilteredViewStack.h"
+#include "MPbk2UiControlEventSender.h"
+#include "CPbk2NamesListControl.h"
+#include "CPbk2FindStringSplitter.h"
+#include <MPbk2ControlObserver.h>
+#include <Pbk2MenuFilteringFlags.hrh>
+#include <MPbk2Command.h>
+#include "CPbk2AdaptiveSearchGridFiller.h"
+#include "CPbk2PredictiveSearchFilter.h"
+#include "TPbk2FindTextUtil.h"
+#include "PmuCommands.hrh" // For accessing EPmuCmdCascadingBackup
+#include "Pbk2USimUI.hrh" // For accessing EPsu2CmdCascadingSimMemory
+#include <Pbk2Commands.hrh>
+
+// System includes
+#include <eikmenup.h>
+#include <barsread.h> // TResourceReader
+#include <aknsfld.h> // CAknSearchField
+
+// Debugging headers
+#include <Pbk2Debug.h>
+
+/// Unnamed namespace for local definitions
+namespace {
+
+const TInt KNumberOfContacts = 0;
+const TInt KNumberOfControls = 2; // listbox and findbox
+
+#ifdef _DEBUG
+enum TPanicCode
+ {
+ EPanicLogic_FindTextL = 1,
+ EPanicLogic_ComponentControl,
+ EPreCond_UpdateFindResultL
+ };
+
+void Panic(TPanicCode aReason)
+ {
+ _LIT(KPanicText, "CPbk2NamesListFilteredState");
+ User::Panic(KPanicText, aReason);
+ }
+
+#endif // _DEBUG
+
+} /// namespace
+
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::CPbk2NamesListFilteredState
+// --------------------------------------------------------------------------
+//
+inline CPbk2NamesListFilteredState::CPbk2NamesListFilteredState(
+ const CCoeControl* aParent,
+ CPbk2ContactViewListBox& aListBox,
+ MPbk2FilteredViewStack& aViewStack,
+ CAknSearchField* aFindBox,
+ MPbk2UiControlEventSender& aEventSender,
+ MPbk2ContactNameFormatter& aNameFormatter,
+ CPbk2PredictiveSearchFilter& aSearchFilter,
+ RPointerArray<MPbk2UiControlCmdItem>& aCommandItems ) :
+ iParent(*aParent),
+ iListBox(aListBox),
+ iViewStack(aViewStack),
+ iFindBox(aFindBox),
+ iEventSender( aEventSender ),
+ iNameFormatter( aNameFormatter ),
+ iSearchFilter( aSearchFilter ),
+ iCommandItems( aCommandItems )
+ {
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::~CPbk2NamesListFilteredState
+// --------------------------------------------------------------------------
+//
+CPbk2NamesListFilteredState::~CPbk2NamesListFilteredState()
+ {
+ if (iCommand)
+ {
+ // inform the command that the control is deleted
+ iCommand->ResetUiControl(*this);
+ }
+ delete iFindTextBuf;
+ delete iStringArray;
+ delete iStringSplitter;
+ delete iAdaptiveSearchGridFiller;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::NewL
+// --------------------------------------------------------------------------
+//
+CPbk2NamesListFilteredState* CPbk2NamesListFilteredState::NewLC
+ ( const CCoeControl* aParent, CPbk2ContactViewListBox& aListBox,
+ MPbk2FilteredViewStack& aViewStack, CAknSearchField* aFindBox,
+ MPbk2UiControlEventSender& aEventSender,
+ MPbk2ContactNameFormatter& aNameFormatter,
+ CPbk2PredictiveSearchFilter& aSearchFilter,
+ RPointerArray<MPbk2UiControlCmdItem>& aCommandItems )
+ {
+ CPbk2NamesListFilteredState* self =
+ new ( ELeave ) CPbk2NamesListFilteredState
+ ( aParent, aListBox, aViewStack, aFindBox, aEventSender, aNameFormatter, aSearchFilter, aCommandItems );
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ return self;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::ConstructL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::ConstructL()
+ {
+ iStringSplitter = CPbk2FindStringSplitter::NewL( iNameFormatter );
+ if( iFindBox )
+ {
+ iAdaptiveSearchGridFiller = CPbk2AdaptiveSearchGridFiller::NewL( *iFindBox, iNameFormatter );
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::UnsubscribeCmdItemsVisibility
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::UnsubscribeCmdItemsVisibility() const
+ {
+ for ( TInt i = 0; i < iCommandItems.Count(); ++i )
+ {
+ iCommandItems[i]->SetVisibilityObserver( NULL );
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::SubscribeCmdItemsVisibility
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::SubscribeCmdItemsVisibility()
+ {
+ for ( TInt i = 0; i < iCommandItems.Count(); ++i )
+ {
+ iCommandItems[i]->SetVisibilityObserver( this );
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::ActivateStateL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::ActivateStateL()
+ {
+ AllowCommandsToShowThemselves( ETrue );
+ UpdateAdaptiveSearchGridL();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::DeactivateState
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::DeactivateState()
+ {
+ AllowCommandsToShowThemselves( EFalse );
+
+ // Stop creating adaptive search grid.
+ if (iAdaptiveSearchGridFiller)
+ {
+ if (iAdaptiveSearchGridFiller->IsActive())
+ {
+ iAdaptiveSearchGridFiller->StopFilling();
+ }
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::CountComponentControls
+// --------------------------------------------------------------------------
+//
+TInt CPbk2NamesListFilteredState::CountComponentControls() const
+ {
+ TInt numberOfControls( KNumberOfControls );
+ if ( !iFindBox )
+ {
+ --numberOfControls;
+ }
+ return numberOfControls;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::ComponentControl
+// --------------------------------------------------------------------------
+//
+CCoeControl* CPbk2NamesListFilteredState::ComponentControl( TInt aIndex ) const
+ {
+ switch ( aIndex )
+ {
+ case 0:
+ {
+ return &iListBox;
+ }
+ case 1:
+ {
+ return iFindBox;
+ }
+ default:
+ {
+ // Illegal state
+ __ASSERT_DEBUG(EFalse, Panic(EPanicLogic_ComponentControl));
+ return NULL;
+ }
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::SizeChanged
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::SizeChanged()
+ {
+ const TRect rect(iParent.Rect());
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2NamesListFilteredState::SizeChanged(0x%x), rect=(%d,%d,%d,%d)"),
+ this, rect.iTl.iX, rect.iTl.iY, rect.iBr.iX, rect.iBr.iY);
+
+ if ( iFindBox )
+ {
+ AknLayoutUtils::LayoutControl(&iListBox, rect,
+ AKN_LAYOUT_WINDOW_list_gen_pane(1));
+
+ AknLayoutUtils::LayoutControl( iFindBox, rect,
+ AKN_LAYOUT_WINDOW_find_pane);
+
+ if (iFindBox->IsVisible() && iListBox.IsVisible())
+ {
+ iFindBox->SetLinePos(EABColumn);
+ }
+ }
+ else
+ {
+ AknLayoutUtils::LayoutControl(&iListBox, rect,
+ AKN_LAYOUT_WINDOW_list_gen_pane(0));
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::MakeComponentsVisible
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::MakeComponentsVisible(TBool aVisible)
+ {
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+ ("CPbk2NamesListFilteredState::MakeComponentsVisible(0x%x,%d)"),
+ this, aVisible);
+
+ iListBox.MakeVisible(aVisible);
+ if ( iFindBox )
+ {
+ if ( (iFindBox->IsVisible()&&!aVisible) ||
+ (!iFindBox->IsVisible()&&aVisible) )
+ {
+ iFindBox->MakeVisible(aVisible);
+ }
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::ActivateL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::ActivateL()
+ {
+ if ( iFindBox )
+ {
+ CEikEdwin& findEditor = iFindBox->Editor();
+ findEditor.SetCursorPosL(findEditor.TextLength(), EFalse);
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::Draw
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::Draw
+ (const TRect& aRect, CWindowGc& /*aGc*/) const
+ {
+ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING(
+ "CPbk2NamesListFilteredState::Draw(0x%x, TRect(%d,%d,%d,%d))"),
+ this, aRect.iTl.iX, aRect.iTl.iY, aRect.iBr.iX, aRect.iBr.iY);
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::OfferKeyEventL
+// --------------------------------------------------------------------------
+//
+TKeyResponse CPbk2NamesListFilteredState::OfferKeyEventL
+ ( const TKeyEvent& aKeyEvent, TEventCode aType )
+ {
+ TKeyResponse result( EKeyWasNotConsumed );
+ if ( iFindBox )
+ {
+ //If the FindBox is locked then dont offer the event to the findbox
+ if (!iSearchFilter.IsLocked())
+ {
+ // Offer the key event first to findbox
+ result = iFindBox->OfferKeyEventL( aKeyEvent, aType );
+ }
+ else
+ {
+ //If FindPane is locked, then forward only the backspace key.
+ if ( aKeyEvent.iCode == EKeyBackspace )
+ {
+ // Offer the key event first to findbox
+ result = iFindBox->OfferKeyEventL( aKeyEvent, aType );
+ }
+ }
+ }
+
+ // And then offer the event to listbox if necessary
+ if (result == EKeyWasNotConsumed)
+ {
+ result = iListBox.OfferKeyEventL(aKeyEvent, aType);
+ }
+
+ return result;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::HandlePointerEventL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::HandlePointerEventL
+ ( const TPointerEvent& aPointerEvent )
+ {
+ iSearchFieldPointed = EFalse;
+ if ( iFindBox )
+ {
+ if ( iFindBox->Rect().Contains( aPointerEvent.iPosition ) )
+ {
+ iFindBox->HandlePointerEventL( aPointerEvent );
+ iSearchFieldPointed = ETrue;
+ }
+ }
+
+ TInt previousItemIndex = iListBox.CurrentItemIndex();
+ iListBox.HandlePointerEventL( aPointerEvent );
+
+ // Handle focus change when dragging
+ if ( previousItemIndex != iListBox.CurrentItemIndex() &&
+ aPointerEvent.iType == TPointerEvent::EDrag )
+ {
+ HandleFocusChangeL();
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::NamesListState
+// --------------------------------------------------------------------------
+//
+TInt CPbk2NamesListFilteredState::NamesListState() const
+ {
+ return CPbk2NamesListControl::EStateFiltered;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::HandleContactViewEventL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::HandleContactViewEventL
+ ( TInt aEvent, TInt aIndex )
+ {
+ // need to calculate list index from contact
+ // view index
+ TInt listIndex = CommandItemCount() + aIndex;
+ HandleListboxEventL(aEvent, listIndex, EFalse );
+ /// iListBox.HandleEventL( aEvent, aIndex );
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::HandleCommandEventL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::HandleCommandEventL
+ (TInt aEvent, TInt /* aCommandIndex */)
+ {
+ HandleListboxEventL(aEvent, 0, ETrue );
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::HandleListboxEventL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::HandleListboxEventL
+ (TInt aEvent, TInt aListboxIndex
+ , TBool /*aMantainFocus*/)
+ {
+ iListBox.HandleEventL( aEvent, aListboxIndex );
+ iParent.DrawDeferred();
+ HandleFocusChangeL();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::CoeControl
+// --------------------------------------------------------------------------
+//
+CCoeControl& CPbk2NamesListFilteredState::CoeControl()
+ {
+ return const_cast<CCoeControl&>(iParent);
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::HandleControlEventL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::HandleControlEventL(
+ CCoeControl* aControl,
+ MCoeControlObserver::TCoeEvent aEventType, TInt /*aParam*/ )
+ {
+ if ( aEventType == MCoeControlObserver::EEventStateChanged )
+ {
+ if ( aControl == iFindBox )
+ {
+ UpdateFindResultL();
+ }
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::TopContactL
+// --------------------------------------------------------------------------
+//
+const MVPbkViewContact* CPbk2NamesListFilteredState::TopContactL()
+ {
+ return NULL;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::ParentControl
+// --------------------------------------------------------------------------
+//
+MPbk2ContactUiControl* CPbk2NamesListFilteredState::ParentControl() const
+ {
+ // Names list control does not have a parent control
+ return NULL;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::NumberOfContacts
+// --------------------------------------------------------------------------
+//
+TInt CPbk2NamesListFilteredState::NumberOfContacts() const
+ {
+ // The listbox can also have command items.
+ TInt result = iListBox.NumberOfItems() - CommandItemCount();
+ if ( result < 0 )
+ {
+ result = KNumberOfContacts; // No contacts
+ }
+ return result;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::FocusedContactL
+// --------------------------------------------------------------------------
+//
+const MVPbkBaseContact* CPbk2NamesListFilteredState::FocusedContactL() const
+ {
+ return NULL;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::FocusedViewContactL
+// --------------------------------------------------------------------------
+//
+const MVPbkViewContact*
+ CPbk2NamesListFilteredState::FocusedViewContactL() const
+ {
+ return NULL;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::FocusedStoreContact
+// --------------------------------------------------------------------------
+//
+const MVPbkStoreContact*
+ CPbk2NamesListFilteredState::FocusedStoreContact() const
+ {
+ return NULL;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::SetFocusedContactL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::SetFocusedContactL
+ ( const MVPbkBaseContact& /*aContact*/ )
+ {
+ // Do nothing
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::SetFocusedContactL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::SetFocusedContactL
+ ( const MVPbkContactBookmark& /*aContactBookmark*/ )
+ {
+ // Do nothing
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::SetFocusedContactL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::SetFocusedContactL
+ ( const MVPbkContactLink& /*aContactLink*/ )
+ {
+ // Do nothing
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::FocusedContactIndex
+// --------------------------------------------------------------------------
+//
+TInt CPbk2NamesListFilteredState::FocusedContactIndex() const
+ {
+ // The result is a view index. There is an offset between listbox indexes
+ // and view indexes.
+
+ TInt viewIndex = KErrNotFound;
+ const TInt currentListboxIndex = iListBox.CurrentItemIndex();
+ const TInt commandCount = CommandItemCount();
+ // Is the focus on a contact or on a command item? Check:
+ if ( currentListboxIndex >= commandCount )
+ {
+ // Yes, the focus is on a contact.
+ // Need to map from listbox indexes to view indexes.
+ viewIndex = currentListboxIndex - commandCount;
+ }
+ return viewIndex;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::SetFocusedContactIndex
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::SetFocusedContactIndexL( TInt /*aIndex*/ )
+ {
+ // Do nothing
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::NumberOfContactFields
+// --------------------------------------------------------------------------
+//
+TInt CPbk2NamesListFilteredState::NumberOfContactFields() const
+ {
+ return KErrNotSupported;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::FocusedField
+// --------------------------------------------------------------------------
+//
+const MVPbkBaseContactField*
+ CPbk2NamesListFilteredState::FocusedField() const
+ {
+ return NULL;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::FocusedFieldIndex
+// --------------------------------------------------------------------------
+//
+TInt CPbk2NamesListFilteredState::FocusedFieldIndex() const
+ {
+ return KErrNotFound;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::SetFocusedFieldIndex
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::SetFocusedFieldIndex( TInt /*aIndex*/ )
+ {
+ // Do nothing
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::ContactsMarked
+// --------------------------------------------------------------------------
+//
+TBool CPbk2NamesListFilteredState::ContactsMarked() const
+ {
+ return EFalse;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::SelectedContactsL
+// --------------------------------------------------------------------------
+//
+MVPbkContactLinkArray* CPbk2NamesListFilteredState::SelectedContactsL() const
+ {
+ return NULL;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::SelectedContactsOrFocusedContactL
+// --------------------------------------------------------------------------
+//
+MVPbkContactLinkArray* CPbk2NamesListFilteredState::
+ SelectedContactsOrFocusedContactL() const
+ {
+ return NULL;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::SelectedContactsIteratorL
+// --------------------------------------------------------------------------
+//
+MPbk2ContactLinkIterator*
+ CPbk2NamesListFilteredState::SelectedContactsIteratorL() const
+ {
+ return NULL;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::SelectedContactStoresL
+// --------------------------------------------------------------------------
+//
+CArrayPtr<MVPbkContactStore>*
+ CPbk2NamesListFilteredState::SelectedContactStoresL() const
+ {
+ // This is not a state of the contact store control
+ return NULL;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::ClearMarks
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::ClearMarks()
+ {
+ // Do nothing
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::SetSelectedContactL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::SetSelectedContactL(
+ TInt /*aIndex*/, TBool /*aSelected*/)
+ {
+ // Do nothing
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::SetSelectedContactL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::SetSelectedContactL(
+ const MVPbkContactBookmark& /*aContactBookmark*/,
+ TBool /*aSelected*/ )
+ {
+ // Do nothing
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::SetSelectedContactL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::SetSelectedContactL(
+ const MVPbkContactLink& /*aContactLink*/,
+ TBool /*aSelected*/ )
+ {
+ // Do nothing
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::CommandItemCount
+// --------------------------------------------------------------------------
+//
+TInt CPbk2NamesListFilteredState::CommandItemCount() const
+ {
+ // Some of the commands might be disabled. Don't count those.
+ TInt enabledCommandCount = 0;
+ for ( TInt n = 0; n < iCommandItems.Count(); ++n )
+ {
+ if ( iCommandItems[ n ]->IsEnabled() )
+ {
+ enabledCommandCount++;
+ }
+ }
+ return enabledCommandCount;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::CommandItemAt
+// --------------------------------------------------------------------------
+//
+const MPbk2UiControlCmdItem&
+ CPbk2NamesListFilteredState::CommandItemAt( TInt aIndex ) const
+ {
+ // Some of the commands might be disabled. Skip those.
+ TInt enabledCount = 0;
+ TInt indexOfResult = KErrNotFound;
+ for ( TInt n = 0; n < iCommandItems.Count()&& indexOfResult == KErrNotFound; ++n )
+
+ {
+ if ( iCommandItems[ n ]->IsEnabled() )
+ {
+ enabledCount++;
+ if ( enabledCount-1 == aIndex )
+ {
+ indexOfResult = n;
+ }
+ }
+ }
+ return *iCommandItems[ indexOfResult ];
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::FocusedCommandItem
+// --------------------------------------------------------------------------
+//
+const MPbk2UiControlCmdItem*
+ CPbk2NamesListFilteredState::FocusedCommandItem() const
+ {
+ const MPbk2UiControlCmdItem* cmdItem = NULL;
+ // Is the focus on a command item:
+ TInt focusListIndex = iListBox.CurrentItemIndex();
+ const TInt commandItemCount = CommandItemCount();
+ if ( focusListIndex != KErrNotFound && focusListIndex < commandItemCount )
+ {
+ // Yes it's a command item.
+ cmdItem = &CommandItemAt(focusListIndex);
+ }
+ return cmdItem;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::DeleteCommandItemL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::DeleteCommandItemL( TInt /*aIndex*/ )
+ {
+ // ownership & management of iCommandItems is wasted in names list
+ // control. Do nothing here
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::AddCommandItemL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::AddCommandItemL(MPbk2UiControlCmdItem* /*aCommand*/, TInt /*aIndex*/)
+ {
+ // ownership & management of iCommandItems is wasted in names list
+ // control. Do nothing here
+ }
+
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::DynInitMenuPaneL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::DynInitMenuPaneL(
+ TInt aResourceId, CEikMenuPane* aMenuPane) const
+ {
+ AknSelectionService::HandleMarkableListDynInitMenuPane
+ (aResourceId, aMenuPane, &iListBox);
+
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::ProcessCommandL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::ProcessCommandL
+ ( TInt /*aCommandId*/ ) const
+ {
+ // Do nothing
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::UpdateAfterCommandExecution
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::UpdateAfterCommandExecution()
+ {
+ if( iCommand )
+ {
+ // reset command pointer, since command has finished
+ iCommand->ResetUiControl( *this );
+ iCommand = NULL;
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::GetMenuFilteringFlagsL
+// --------------------------------------------------------------------------
+//
+TInt CPbk2NamesListFilteredState::GetMenuFilteringFlagsL() const
+ {
+ // Filtered state is used when the search string does not match
+ // to any of the contacts.
+ return KPbk2ListContainsNoMarkedItems;
+ }
+
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::ControlStateL
+// --------------------------------------------------------------------------
+//
+CPbk2ViewState* CPbk2NamesListFilteredState::ControlStateL() const
+ {
+ // State objects do not handle control state changes
+ return NULL;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::RestoreControlStateL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::RestoreControlStateL
+ ( CPbk2ViewState* /*aState*/ )
+ {
+ // State objects do not handle control state changes
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::FindTextL
+// --------------------------------------------------------------------------
+//
+const TDesC& CPbk2NamesListFilteredState::FindTextL()
+ {
+ if ( iFindBox )
+ {
+ TPbk2FindTextUtil::EnsureFindTextBufSizeL(
+ *iFindBox,
+ &iFindTextBuf );
+ TPtr bufPtr = iFindTextBuf->Des();
+ iFindBox->GetSearchText(bufPtr);
+ return *iFindTextBuf;
+ }
+
+ return KNullDesC;
+ }
+
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::ResetFindL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::ResetFindL()
+ {
+ if ( iFindBox && iFindBox->TextLength() > 0 )
+ {
+ iSearchFilter.ResetL();
+ iFindBox->ResetL();
+ iFindBox->DrawDeferred();
+ iViewStack.Reset();
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::HideThumbnail
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::HideThumbnail()
+ {
+ // Do nothing
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::ShowThumbnail
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::ShowThumbnail()
+ {
+ // Do nothing
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::SetBlank
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::SetBlank( TBool aBlank )
+ {
+ if (!aBlank)
+ {
+ // Redraw
+ iParent.DrawDeferred();
+ TRAPD( error, iListBox.UpdateScrollBarsL() );
+ if ( error != KErrNone )
+ {
+ CCoeEnv::Static()->HandleError( error );
+ }
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::RegisterCommand
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::RegisterCommand(
+ MPbk2Command* aCommand)
+ {
+ iCommand = aCommand;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::SetTextL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::SetTextL( const TDesC& aText )
+ {
+ iListBox.View()->SetListEmptyTextL( aText );
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::ContactUiControlExtension
+// --------------------------------------------------------------------------
+//
+TAny* CPbk2NamesListFilteredState::ContactUiControlExtension(TUid aExtensionUid )
+ {
+ if( aExtensionUid == KMPbk2ContactUiControlExtension2Uid )
+ {
+ return static_cast<MPbk2ContactUiControl2*>( this );
+ }
+
+ return NULL;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::UpdateFindResultL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::UpdateFindResultL()
+ {
+ TBuf <KSearchFieldLength> findPaneTxt( FindTextL() );
+
+ //First Forward the Find Pane text to the Search Filter before sending
+ //the info to the viewstack
+ if ( iSearchFilter.StartFindPaneInlineEditL( findPaneTxt ) )
+ {
+ // If the control is in empty filtered state then the view stack must
+ // contain at least one filtered view. Otherwise either the control
+ // state is wrong or the stack state is not up to date.
+ __ASSERT_DEBUG( iViewStack.Level() > 0,
+ Panic( EPreCond_UpdateFindResultL ) );
+
+ // Extract the find text into array
+ MDesCArray* temp = iStringSplitter->SplitTextIntoArrayL( findPaneTxt );
+ delete iStringArray;
+ iStringArray = temp;
+
+ iViewStack.UpdateFilterL( *iStringArray, NULL, EFalse );
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::FocusedItemPointed
+// --------------------------------------------------------------------------
+//
+TBool CPbk2NamesListFilteredState::FocusedItemPointed()
+ {
+ return iListBox.FocusedItemPointed();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::FocusableItemPointed
+// --------------------------------------------------------------------------
+//
+TBool CPbk2NamesListFilteredState::FocusableItemPointed()
+ {
+ return iListBox.FocusableItemPointed();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::SearchFieldPointed
+// --------------------------------------------------------------------------
+//
+TBool CPbk2NamesListFilteredState::SearchFieldPointed()
+ {
+ return iSearchFieldPointed;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::TopViewChangedL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::TopViewChangedL(
+ MVPbkContactViewBase& /*aOldView*/ )
+ {
+ if ( iSearchFilter.IsPredictiveActivated() )
+ {
+ iSearchFilter.CommitFindPaneTextL( iViewStack, iNameFormatter );
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::TopViewUpdatedL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::TopViewUpdatedL()
+ {
+ // Do nothing
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::BaseViewChangedL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::BaseViewChangedL()
+ {
+ // Do nothing
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::ViewStackError
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::ViewStackError( TInt /*aError*/ )
+ {
+ // Do nothing
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::ContactAddedToBaseView
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::ContactAddedToBaseView(
+ MVPbkContactViewBase& /*aBaseView*/,
+ TInt /*aIndex*/,
+ const MVPbkContactLink& /*aContactLink*/ )
+ {
+ // Do nothing
+ }
+
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::HandleFocusChangeL
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::HandleFocusChangeL()
+ {
+ iEventSender.SendEventToObserversL(
+ TPbk2ControlEvent::TPbk2ControlEvent::EControlFocusChanged );
+ }
+
+
+void CPbk2NamesListFilteredState::UpdateAdaptiveSearchGridL()
+ {
+ if( ( !iAdaptiveSearchGridFiller ) || ( !iFindBox ) )
+ {
+ return;
+ }
+
+ CAknSearchField::TSearchFieldStyle searchStyle = iFindBox->SearchFieldStyle();
+ if ( searchStyle != CAknSearchField::EAdaptiveSearch )
+ {
+ delete iAdaptiveSearchGridFiller;
+ iAdaptiveSearchGridFiller = NULL;
+ return;
+ }
+
+ iAdaptiveSearchGridFiller->StartFillingL( iViewStack.BaseView(), FindTextL(), ETrue );
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::IsContactAtListboxIndex
+// Tells whether the listbox line contains a contact or not.
+// Does not check that the aListboxIndex is within range of listbox.
+// --------------------------------------------------------------------------
+//
+TBool CPbk2NamesListFilteredState::IsContactAtListboxIndex( TInt aListboxIndex ) const
+ {
+ // There can be command items at the top of the list.
+ // The command items are not contacts.
+ const TInt enabledCommandCount = CommandItemCount();
+ return aListboxIndex >= enabledCommandCount;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::AllowCommandsToShowThemselves
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::AllowCommandsToShowThemselves( TBool aVisible )
+ {
+ if ( aVisible )
+ {
+ // ownership not transferred
+ iListBox.SetListCommands( &iCommandItems );
+ SubscribeCmdItemsVisibility();
+ UpdateCommandEnabled( EPbk2CmdRcl, ETrue );
+ UpdateCommandEnabled( EPbk2CmdAddFavourites, EFalse );
+ UpdateCommandEnabled( EPbk2CmdOpenMyCard, EFalse );
+ }
+ else
+ {
+ UnsubscribeCmdItemsVisibility();
+ iListBox.SetListCommands( NULL );
+ }
+ }
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::CmdItemVisibilityChanged
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::CmdItemVisibilityChanged( TInt aCmdItemId, TBool aVisible )
+ {
+ TInt cmdItemIndex = FindCommand(aCmdItemId);
+ TInt cmdListBoxIndex = EnabledCommandCount();
+ if( aVisible )
+ {
+ cmdListBoxIndex--;
+ }
+ // Update the HiddenSelection property of the command items.
+ TListItemProperties prop( iListBox.ItemDrawer()->Properties(cmdListBoxIndex) );
+ prop.SetHiddenSelection(aVisible);
+ TRAP_IGNORE(
+ iListBox.ItemDrawer()->SetPropertiesL(cmdListBoxIndex, prop);
+
+ HandleCommandEventL(
+ (aVisible ? EItemAdded : EItemRemoved),
+ cmdItemIndex);
+ );
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::UpdateCommandEnabled
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::UpdateCommandEnabled( TInt aCommandId, TBool aEnabled )
+ {
+ for ( TInt i = 0; i < iCommandItems.Count(); i++ )
+ {
+ if ( iCommandItems[i]->CommandId() == aCommandId )
+ {
+ iCommandItems[i]->SetEnabled( aEnabled );
+ break;
+ }
+ }
+ }
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::IsCommandEnabled
+// --------------------------------------------------------------------------
+//
+TBool CPbk2NamesListFilteredState::IsCommandEnabled(TInt aCommandId) const
+ {
+ TBool res = EFalse;
+ for ( TInt i = 0; i < iCommandItems.Count(); i++ )
+ {
+ if ( iCommandItems[i]->CommandId() == aCommandId )
+ {
+ res = iCommandItems[i]->IsEnabled();
+ break;
+ }
+ }
+ return res;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::FindCommand
+// Search for a command in iCommandItems and returns its index
+// --------------------------------------------------------------------------
+//
+TInt CPbk2NamesListFilteredState::FindCommand(TInt aCommandId) const
+ {
+ TInt result = KErrNotFound;
+ for ( TInt i = 0; i < iCommandItems.Count(); ++i )
+ {
+ if ( iCommandItems[i]->CommandId() == aCommandId )
+ {
+ result = i;
+ break;
+ }
+
+ }
+ return result;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::CalculateListboxIndex
+// --------------------------------------------------------------------------
+//
+TInt CPbk2NamesListFilteredState::CalculateListboxIndex(TInt aCommandIndex) const
+ {
+ TInt num(KErrNotFound);
+ for ( TInt i = 0; i < aCommandIndex; ++i )
+ {
+ if(iCommandItems[i]->IsEnabled())
+ {
+ ++num;
+ }
+ }
+ return num;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::UnmarkCommands
+// --------------------------------------------------------------------------
+//
+void CPbk2NamesListFilteredState::UnmarkCommands() const
+ {
+ for ( TInt i = 0; i < CommandItemCount(); i++ )
+ {
+ iListBox.View()->DeselectItem( i );
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2NamesListFilteredState::EnabledCommandCount
+// --------------------------------------------------------------------------
+//
+TInt CPbk2NamesListFilteredState::EnabledCommandCount() const
+ {
+ TInt result = 0;
+ for ( TInt i = 0; i < iCommandItems.Count(); ++i )
+ {
+ if(iCommandItems[i]->IsEnabled())
+ {
+ result++;
+ }
+ }
+ return result;
+ }
+
+// End of File