diff -r 000000000000 -r e686773b3f54 phonebookui/Phonebook2/GroupExtension/src/CPguGroupMembersView.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook2/GroupExtension/src/CPguGroupMembersView.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,2516 @@ +/* +* Copyright (c) 2006-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 group members view. +* +*/ + + +#include "CPguGroupMembersView.h" + +// Phonebook 2 +#include "CPguAddMembersCmd.h" +#include "CPguRemoveFromGroupCmd.h" +#include "Pbk2GroupUi.hrh" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Virtual Phonebook +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// System includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +/// Unnamed namespace for local definitions +namespace { + +const TInt KFirstItem = 0; // First item index + +/** + * Returns ETrue if shift is depressed in aKeyEvent. + * + * @param aKeyEvent Key event. + * @return ETrue if shift is depressed. + */ +inline TBool ShiftDown( const TKeyEvent& aKeyEvent ) + { + return ( ( aKeyEvent.iModifiers ) & + ( EModifierShift|EModifierLeftShift|EModifierRightShift ) + ) != 0; + } + +/** + * Returns ETrue if either Shift or Control key is depressed. + * + * @param aKeyEvent Key event. + * @return ETrue if shift or control is down. + */ +inline TBool IsShiftOrControlDown( const TKeyEvent& aKeyEvent ) + { + return ( aKeyEvent.iModifiers & + ( EModifierShift | EModifierLeftShift | EModifierRightShift | + EModifierCtrl | EModifierLeftCtrl | EModifierRightCtrl ) ) != 0; + } + +/** + * Phonebook 2 group members transaction. + * Encapsulates the information that is needed + * to switch from group to group viewing. + */ +class CGroupMembersViewTransaction : public CBase + { + public: // Construction and destruction + + /** + * Creates new instance of this class. + * + * @return A new instace of this class. + */ + static CGroupMembersViewTransaction* NewLC(); + + /** + * Destructor + */ + ~CGroupMembersViewTransaction(); + + public: // Interface + + /** + * Sets group members view. + * + * @param aGroupMembersView Group members view to set. + */ + void SetGroupMembersView( + MVPbkContactViewBase* aGroupMembersView ); + + /** + * Set group's name. + * + * @param aGroupName Group name to set. + */ + void SetGroupName( + HBufC* aGroupName ); + + /** + * Sets group link. + * + * @param aGroupLink Group link to set. + */ + void SetGroupLink( + MVPbkContactLink* aGroupLink ); + + /** + * Returns group link. + * + * @return Group link. + */ + MVPbkContactLink* GroupLink() const; + + /** + * Returns group link, ownership is transferred. + * + * @return Group link. + */ + MVPbkContactLink* GetGroupLink(); + + /** + * Returns group name. + * + * @return Group name. + */ + HBufC* GetGroupName(); + + /** + * Returns group members view. + * + * @return Group members view. + */ + MVPbkContactViewBase* GroupMembersView() const; + + /** + * Returns group members view, ownership is transferred. + * + * @return Group members view. + */ + MVPbkContactViewBase* GetGroupMembersView(); + + private: // Implementation + CGroupMembersViewTransaction(); + + private: // Data + /// Own: Group members view + MVPbkContactViewBase* iGroupMembersView; + /// Own: Group name + HBufC* iGroupName; + /// Own: Group link + MVPbkContactLink* iGroupLink; + }; + +// -------------------------------------------------------------------------- +// CGroupMembersViewTransaction::CGroupMembersViewTransaction +// -------------------------------------------------------------------------- +// +CGroupMembersViewTransaction::CGroupMembersViewTransaction() + { + } + +// -------------------------------------------------------------------------- +// CGroupMembersViewTransaction::~CGroupMembersViewTransaction +// -------------------------------------------------------------------------- +// +CGroupMembersViewTransaction::~CGroupMembersViewTransaction() + { + delete iGroupMembersView; + delete iGroupName; + delete iGroupLink; + } + +// -------------------------------------------------------------------------- +// CGroupMembersViewTransaction::NewLC +// -------------------------------------------------------------------------- +// +CGroupMembersViewTransaction* CGroupMembersViewTransaction::NewLC() + { + CGroupMembersViewTransaction* self = + new ( ELeave ) CGroupMembersViewTransaction; + CleanupStack::PushL( self ); + return self; + } + +// -------------------------------------------------------------------------- +// CGroupMembersViewTransaction::SetGroupMembersView +// -------------------------------------------------------------------------- +// +void CGroupMembersViewTransaction::SetGroupMembersView + ( MVPbkContactViewBase* aGroupMembersView ) + { + delete iGroupMembersView; + iGroupMembersView = aGroupMembersView; + } + +// -------------------------------------------------------------------------- +// CGroupMembersViewTransaction::SetGroupName +// -------------------------------------------------------------------------- +// +void CGroupMembersViewTransaction::SetGroupName + ( HBufC* aGroupName ) + { + delete iGroupName; + iGroupName = aGroupName; + } + +// -------------------------------------------------------------------------- +// CGroupMembersViewTransaction::SetGroupLink +// -------------------------------------------------------------------------- +// +void CGroupMembersViewTransaction::SetGroupLink + ( MVPbkContactLink* aGroupLink ) + { + delete iGroupLink; + iGroupLink = aGroupLink; + } + +// -------------------------------------------------------------------------- +// CGroupMembersViewTransaction::GroupLink +// -------------------------------------------------------------------------- +// +MVPbkContactLink* CGroupMembersViewTransaction::GroupLink() const + { + return iGroupLink; + } + +// -------------------------------------------------------------------------- +// CGroupMembersViewTransaction::GetGroupLink +// -------------------------------------------------------------------------- +// +MVPbkContactLink* CGroupMembersViewTransaction::GetGroupLink() + { + MVPbkContactLink* groupLink = iGroupLink; + iGroupLink = NULL; + return groupLink; + } + +// -------------------------------------------------------------------------- +// CGroupMembersViewTransaction::GetGroupName +// -------------------------------------------------------------------------- +// +HBufC* CGroupMembersViewTransaction::GetGroupName() + { + HBufC* groupName = iGroupName; + iGroupName = NULL; + return groupName; + } + +// -------------------------------------------------------------------------- +// CGroupMembersViewTransaction::GroupMembersView +// -------------------------------------------------------------------------- +// +MVPbkContactViewBase* CGroupMembersViewTransaction::GroupMembersView() const + { + return iGroupMembersView; + } + +// -------------------------------------------------------------------------- +// CGroupMembersViewTransaction::GetGroupMembersView +// -------------------------------------------------------------------------- +// +MVPbkContactViewBase* CGroupMembersViewTransaction::GetGroupMembersView() + { + MVPbkContactViewBase* groupMembersView = iGroupMembersView; + iGroupMembersView = NULL; + return groupMembersView; + } + +} /// namespace + +/** + * Phonebook 2 group members view implementation base class. + */ +class CPguGroupMembersView::CGroupMembersViewImpl : + public CBase, + protected MVPbkContactViewObserver + { + public: // Interface + + /** + * Creates control. + * + * @param aClientRect Client's rect. + */ + virtual void CreateControlL( + const TRect& aClientRect ) = 0; + + /** + * Returns the control. + * + * @return Control. + */ + virtual MPbk2ContactUiControl* Control() = 0; + + /** + * Return view's state. + * + * @return View state. + */ + virtual CPbk2ViewState* ViewStateLC() const = 0; + + /** + * Handles command key + * + * @param aKeyEvent Key event. + * @param aType Command type. + * @return ETrue if command handled in function, else EFalse. + */ + virtual TBool HandleCommandKeyL( + const TKeyEvent& aKeyEvent, + TEventCode aType ) = 0; + + /** + * Returns menu filtering flags. + * + * @return The flags. + */ + virtual TInt GetViewSpecificMenuFilteringFlagsL() const = 0; + + /** + * Dynamically initialises a menu pane. + * + * @param aResourceId Resource id of the menu. + * @param aMenuPane The in-memory representation of + * the menu pane. + */ + virtual void DynInitMenuPaneL( + TInt aResourceId, + CEikMenuPane* aMenuPane ) = 0; + + /** + * Restores view's state. + * + * @param aState The state to restore. + */ + virtual void RestoreControlStateL( + CPbk2ViewState* aState ) = 0; + + /** + * Handles command, + * + * @param aCommand Id of the command to respond to. + */ + virtual void HandleCommandL( + TInt aCommand ) = 0; + + /** + * Handles a change in the position or size + * of the screen area occupied by the status pane. + */ + virtual void HandleStatusPaneSizeChange() = 0; + + + /** + * Handles listbox events in derived classes + * Note that this is not derived from MEikListBoxObserver but defined here + */ + virtual void HandleListBoxEventL( CEikListBox* aListBox, TListBoxEvent aEventType ) = 0; + + + /** + * Handles listbox events in derived classes + * Note that this is not derived from MEikListBoxObserver but defined here + */ + virtual void ShowContextMenuL() = 0; + + + + /** + * Handles pointer events. + * + * @param aPointerEvent The pointer event. + */ + virtual void HandlePointerEventL( + const TPointerEvent& aPointerEvent) = 0; + + /** + * Updates Cba buttons. + */ + virtual void UpdateCbasL() = 0; + + /** + * Handles long tap event. + * + * @param aPenEventLocation Pen location + * @param aPenEventScreenLocation Pen screen location. + */ + virtual void HandleLongTapEventL( + const TPoint& aPenEventLocation, + const TPoint& aPenEventScreenLocation ) = 0; + + public: // From MVPbkContactViewObserver + void ContactViewUnavailable( + MVPbkContactViewBase& aView ); + void ContactAddedToView( + MVPbkContactViewBase& aView, + TInt aIndex, + const MVPbkContactLink& aContactLink ); + void ContactRemovedFromView( + MVPbkContactViewBase& aView, + TInt aIndex, + const MVPbkContactLink& aContactLink ); + void ContactViewError( + MVPbkContactViewBase& aView, + TInt aError, + TBool aErrorNotified ); + + public: // Base class interface + + /** + * Destructor. + */ + virtual ~CGroupMembersViewImpl() + {} + + protected: // Implementation + CGroupMembersViewImpl() + {} + }; + + +/** + * Group members view implementation class. This class encapsulates + * the view implementation when the group members view isnt ready, so + * all the nesessary information needed to create the group members view + * isnt ready. This class iniates the all groups view loading and waits + * for its completion. Up on completion it switches to the next state. + */ +class CPguGroupMembersView::CGroupMembersAllGroupsNotReady : + public CPguGroupMembersView::CGroupMembersViewImpl + { + public: // interface + /** + * Creates a new instance of this class. + * + * @param aViewParent Parent view. + * @param aView UI extension view. + * @param aFocusedGroupLink Focused groups. + * @return A new instance of this class. + */ + static CGroupMembersAllGroupsNotReady* NewL( + MPbk2GroupMembersViewActivationCallback& aViewParent, + CPbk2UIExtensionView& aView, + const MVPbkContactLink* aFocusedGroupLink ); + + /** + * Destructor. + */ + ~CGroupMembersAllGroupsNotReady(); + + public: // From CGroupMembersViewImpl + void CreateControlL( + const TRect& aClientRect ); + MPbk2ContactUiControl* Control(); + CPbk2ViewState* ViewStateLC() const; + TBool HandleCommandKeyL( + const TKeyEvent& aKeyEvent, + TEventCode aType ); + TInt GetViewSpecificMenuFilteringFlagsL() const; + void DynInitMenuPaneL( + TInt aResourceId, + CEikMenuPane* aMenuPane ); + void RestoreControlStateL( + CPbk2ViewState* aState ); + void HandleCommandL( + TInt aCommand ); + void HandleStatusPaneSizeChange(); + + /** + * Handles listbox events. + * Note that this is not derived from MEikListBoxObserver but defined here + */ + void HandleListBoxEventL( CEikListBox* aListBox, TListBoxEvent aEventType ); + + void ShowContextMenuL(); + + void HandlePointerEventL( + const TPointerEvent& aPointerEvent ); + void UpdateCbasL(); + void HandleLongTapEventL( + const TPoint& aPenEventLocation, + const TPoint& aPenEventScreenLocation ); + + public: // From MVPbkContactViewObserver + void ContactViewReady( + MVPbkContactViewBase& aView ); + + private: // Implementation + CGroupMembersAllGroupsNotReady( + MPbk2GroupMembersViewActivationCallback& aViewParent, + CPbk2UIExtensionView& aView, + const MVPbkContactLink* aFocusedGroupLink ); + void ConstructL(); + + private: // Data + /// Ref: Parent view + MPbk2GroupMembersViewActivationCallback& iViewParent; + /// Ref: UI extension view + CPbk2UIExtensionView& iView; + /// Ref: Focused group link + const MVPbkContactLink* iFocusedGroupLink; + /// RefO observed all groups view + MVPbkContactViewBase* iAllGroupsView; + /// This view's control container type + typedef CPbk2ControlContainer< + CPbk2ContactUiControlSubstitute> CContainer; + /// Own: This view's control container + CContainer* iContainer; + /// Ref: Empty control + CPbk2ContactUiControlSubstitute* iControl; + + }; + + +/** + * Group members view implementation class. This class encapsulates + * the situation when all nesessary information to show the group + * members data is present and it can be shown to the user. The navigation + * from group to group and user commands are handled in this state. + */ +class CPguGroupMembersView::CGroupMembersAllGroupsReady : + public CPguGroupMembersView::CGroupMembersViewImpl, + private MPbk2StoreConfigurationObserver, + private MPbk2ContactNavigationLoader, + private MPbk2MenuCommandObserver, + private MPbk2ControlObserver, + private MPbk2NavigationObserver + { + public: // Construction and destruction + + /** + * Creates a new instance of this class. + * + * @param aViewParent Parent view. + * @param aView UI extension view. + * @param aContactManager Contact manager. + * @param aContactNameFormatter Name formatter + * @param aStorePropertyArray Store property array. + * @param aCommandHandler Command handler. + * @param aSortOrderManager Sort order manager. + * @param aFocusedGroupIndex Focused group index. + * @return A new instance of this class + */ + static CGroupMembersAllGroupsReady* NewL( + MPbk2GroupMembersViewActivationCallback& aViewParent, + CPbk2UIExtensionView& aView, + CVPbkContactManager& aContactManager, + MPbk2ContactNameFormatter& aContactNameFormatter, + CPbk2StorePropertyArray& aStorePropertyArray, + MPbk2CommandHandler& aCommandHandler, + CPbk2SortOrderManager& aSortOrderManager, + const TInt aFocusedGroupIndex ); + + /** + * Destructor + */ + ~CGroupMembersAllGroupsReady(); + + public: // From CGroupMembersViewImpl + void CreateControlL( + const TRect& aClientRect ); + MPbk2ContactUiControl* Control(); + CPbk2ViewState* ViewStateLC() const; + TBool HandleCommandKeyL( + const TKeyEvent& aKeyEvent, + TEventCode aType ); + TInt GetViewSpecificMenuFilteringFlagsL() const; + void DynInitMenuPaneL( + TInt aResourceId, + CEikMenuPane* aMenuPane ); + void RestoreControlStateL( + CPbk2ViewState* aState ); + void HandleCommandL( + TInt aCommand ); + void HandleStatusPaneSizeChange(); + /** + * Handles listbox events. + * Note that this is not derived from MEikListBoxObserver but defined here + */ + void HandleListBoxEventL( CEikListBox* aListBox, TListBoxEvent aEventType ); + void ShowContextMenuL(); + + void HandlePointerEventL( + const TPointerEvent& aPointerEvent ); + void UpdateCbasL(); + void HandleLongTapEventL( + const TPoint& aPenEventLocation, + const TPoint& aPenEventScreenLocation ); + + private: // From MPbk2ControlObserver + void HandleControlEventL( + MPbk2ContactUiControl& aControl, + const TPbk2ControlEvent& aEvent ); + + private: // From MPbk2StoreConfigurationObserver + void ConfigurationChanged(); + void ConfigurationChangedComplete(); + + private: // From MPbk2ContactNavigationLoader + void ChangeContactL( + const MVPbkContactLink& aContactLink ); + MVPbkContactLink* ContactLinkLC() const; + + private: // From MPbk2MenuCommandObserver + void PreCommandExecutionL( + const MPbk2Command& aCommand ); + void PostCommandExecutionL( + const MPbk2Command& aCommand ); + + private: // From MVPbkContactViewObserver + void ContactViewReady( + MVPbkContactViewBase& aView ); + + private: // From MPbk2NavigationObserver + void HandleNavigationEvent( + const TEventType& aEventType ); + + private: // Implementation + CGroupMembersAllGroupsReady( + MPbk2GroupMembersViewActivationCallback& aViewParent, + CPbk2UIExtensionView& aView, + CVPbkContactManager& aContactManager, + MPbk2ContactNameFormatter& aContactNameFormatter, + CPbk2StorePropertyArray& aStorePropertyArray, + MPbk2CommandHandler& aCommandHandler, + CPbk2SortOrderManager& aSortOrderManager ); + void ConstructL( + const TInt aFocusedGroupIndex ); + void DoCommitTransActionL( + MVPbkContactViewBase& aView ); + static void ChangeTitlePaneL( + HBufC* aTitleText ); + void UpdateListEmptyTextL( + TInt aListState ); + + private: // Data + /// Ref: Parent view + MPbk2GroupMembersViewActivationCallback& iViewParent; + /// Ref: UI extension view + CPbk2UIExtensionView& iView; + /// Ref: Contact manager + CVPbkContactManager& iContactManager; + /// Ref: Contact name formatter + MPbk2ContactNameFormatter& iContactNameFormatter; + /// Ref: Store properties + CPbk2StorePropertyArray& iStoreProperties; + /// Ref: Command handler + MPbk2CommandHandler& iCommandHandler; + /// Ref: Sort order + CPbk2SortOrderManager& iSortOrderManager; + /// This view's control container type + typedef CPbk2ControlContainer CContainer; + /// Own: This view's control container + CContainer* iContainer; + /// Ref: This view's control + MPbk2ContactUiControl* iControl; + /// Ref: Focus movement observer + MPbk2PointerEventInspector* iPointerEventInspector; + /// Own: Navigation strategy + MPbk2ContactNavigation* iNavigation; + /// Own: Group members view + MVPbkContactViewBase* iGroupMembersView; + /// Own: View transition transaction + CGroupMembersViewTransaction* iViewTransitionTransaction; + /// Own: List of stores used + RPointerArray iStoreList; + /// Own: ETrue, if any selection modifier key is depressed + TBool iSelectionModifierUsed; + /// Own: Stylus popup menu state indicator + TBool iStylusPopupMenuLaunched; + // Ref: Store management ptr + CPbk2StoreConfiguration* iStoreConf; + }; + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersViewImpl:::ContactViewUnavailable +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersViewImpl::ContactViewUnavailable + ( MVPbkContactViewBase& /*aView*/ ) + { + TRAP_IGNORE( UpdateCbasL() ); + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersViewImpl:::ContactAddedToView +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersViewImpl::ContactAddedToView + ( MVPbkContactViewBase& /*aView*/, TInt /*aIndex*/, + const MVPbkContactLink& /*aContactLink*/ ) + { + TRAP_IGNORE( UpdateCbasL() ); + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersViewImpl:::ContactRemovedFromView +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersViewImpl::ContactRemovedFromView + ( MVPbkContactViewBase& /*aView*/, TInt /*aIndex*/, + const MVPbkContactLink& /*aContactLink*/ ) + { + TRAP_IGNORE( UpdateCbasL() ); + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersViewImpl:::ContactViewError +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersViewImpl::ContactViewError + ( MVPbkContactViewBase& /*aView*/, TInt /*aError*/, + TBool /*aErrorNotified*/ ) + { + // Do nothing + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsNotReady::CGroupMembersAllGrou +// -------------------------------------------------------------------------- +// +CPguGroupMembersView::CGroupMembersAllGroupsNotReady:: + CGroupMembersAllGroupsNotReady + ( MPbk2GroupMembersViewActivationCallback& aViewParent, + CPbk2UIExtensionView& aView, + const MVPbkContactLink* aFocusedGroupLink ) : + iViewParent(aViewParent), + iView(aView), + iFocusedGroupLink(aFocusedGroupLink) + { + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsNotReady::~CGroupMembersAllGro +// -------------------------------------------------------------------------- +// +CPguGroupMembersView::CGroupMembersAllGroupsNotReady:: + ~CGroupMembersAllGroupsNotReady() + { + iAllGroupsView->RemoveObserver( *this ); + + // Remove control from stack + if (iContainer) + { + CCoeEnv::Static()->AppUi()->RemoveFromStack(iContainer); + delete iContainer; + } + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsNotReady::ConstructL +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersAllGroupsNotReady::ConstructL() + { + // The all groups view isnt ready, observe it then expand + Phonebook2::Pbk2AppUi()->ApplicationServices(). + ViewSupplier().AllGroupsViewL()->AddObserverL( *this ); + + iViewParent.SetFocusedContact( iFocusedGroupLink->CloneLC() ); + CleanupStack::Pop(); + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsNotReady::NewL +// -------------------------------------------------------------------------- +// +CPguGroupMembersView::CGroupMembersAllGroupsNotReady* + CPguGroupMembersView::CGroupMembersAllGroupsNotReady::NewL + ( MPbk2GroupMembersViewActivationCallback& aViewParent, + CPbk2UIExtensionView& aView, + const MVPbkContactLink* aFocusedGroupLink ) + { + CGroupMembersAllGroupsNotReady* self = + new ( ELeave ) CGroupMembersAllGroupsNotReady + ( aViewParent, aView, aFocusedGroupLink ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsNotReady::CreateControlL +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersAllGroupsNotReady::CreateControlL + ( const TRect& aClientRect ) + { + // Create the container and control + CContainer* container = CContainer::NewLC( &iView, &iView, iView ); + container->SetHelpContext( + TCoeHelpContext(iView.ApplicationUid(), + KPHOB_HLP_GROUP_MEMBER_LIST)); + + // create empty control + CPbk2ContactUiControlSubstitute* control = + CPbk2ContactUiControlSubstitute::NewL(); + + // Takes ownership + container->SetControl(control, aClientRect); + + control->SetContainerWindowL(*container); + HBufC* emptyText = StringLoader::LoadLC( R_QTN_PHOB_NO_ENTRIES_IN_GRP ); + control->SetTextL( *emptyText ); + CleanupStack::PopAndDestroy( emptyText ); + + CCoeEnv::Static()->AppUi()->AddToStackL(iView, container); + CleanupStack::Pop(container); + iContainer = container; + iControl = control; + + iContainer->ActivateL(); + iContainer->Control()->MakeVisible(ETrue); + + // set CBA + iView.Cba()->SetCommandSetL(R_AVKON_SOFTKEYS_BACK); + iView.Cba()->DrawDeferred(); + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsNotReady::Control +// -------------------------------------------------------------------------- +// +MPbk2ContactUiControl* CPguGroupMembersView:: + CGroupMembersAllGroupsNotReady::Control() + { + return iControl; + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsNotReady::ContactViewReady +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersAllGroupsNotReady::ContactViewReady + ( MVPbkContactViewBase& aView ) + { + // If we have a new view, lets change it + if (&aView == iAllGroupsView) + { + TInt groupIndex = KErrNotFound; + TRAPD(leaveCode, + { + groupIndex = iAllGroupsView->IndexOfLinkL(*iFocusedGroupLink); + // switch to ready state + iViewParent.TransformViewActivationStateToReadyL(groupIndex); + }); + if (leaveCode != KErrNone) + { + // notify user + CCoeEnv::Static()->HandleError(leaveCode); + } + } + else + { + // When ContactViewReady() is called, the program needs to check whether + // the namelist control in the container is visible or not. + // If visible, call DrawDeferred() to refresh the container, + // and if not, the container needs not to be refreshed to avoid flicker on the background. + if ( iContainer->Control() && iContainer->Control()->IsVisible() ) + { + iContainer->DrawDeferred(); + } + } + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsNotReady::ViewStateLC +// -------------------------------------------------------------------------- +// +CPbk2ViewState* CPguGroupMembersView:: + CGroupMembersAllGroupsNotReady::ViewStateLC() const + { + CPbk2ViewState* state = CPbk2ViewState::NewLC(); + MVPbkContactLink* parentContactLink = + iViewParent.FocusedContact()->CloneLC(); + state->SetParentContact( parentContactLink ); + CleanupStack::Pop(); // parentContactLink + return state; + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsNotReady::HandleCommandKeyL +// -------------------------------------------------------------------------- +// +TBool CPguGroupMembersView::CGroupMembersAllGroupsNotReady::HandleCommandKeyL + ( const TKeyEvent& /*aKeyEvent*/, TEventCode /*aType*/ ) + { + // No handling in this state + return EFalse; + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsNotReady::HandleStatusPaneSize +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersAllGroupsNotReady:: + HandleStatusPaneSizeChange() + { + // Resize the container to fill the client rectangle + if(iContainer) + { + iContainer->SetRect(iView.ClientRect()); + } + } + + +// ---------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsNotReady::HandleListBoxEventL +// ---------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersAllGroupsNotReady::HandleListBoxEventL(CEikListBox* /*aListBox*/ ,TListBoxEvent /*aEventType*/ ) + { + } + + + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsNotReady::HandlePointerEventL +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersAllGroupsNotReady::HandlePointerEventL + ( const TPointerEvent& /*aPointerEvent*/ ) + { + } + + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsNotReady::ShowContextMenuL +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersAllGroupsNotReady::ShowContextMenuL() + { + } + + + + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsNotReady::UpdateCbasL +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersAllGroupsNotReady::UpdateCbasL() + { + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsNotReady::HandleLongTapEventL +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersAllGroupsNotReady::HandleLongTapEventL + ( const TPoint& /*aPenEventLocation*/, + const TPoint& /*aPenEventScreenLocation*/ ) + { + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsNotReady::GetViewSpecificMenu +// -------------------------------------------------------------------------- +// +TInt CPguGroupMembersView::CGroupMembersAllGroupsNotReady:: + GetViewSpecificMenuFilteringFlagsL() const + { + return iControl->GetMenuFilteringFlagsL(); + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsNotReady::DynInitMenuPaneL +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersAllGroupsNotReady::DynInitMenuPaneL + ( TInt /*aResourceId*/, CEikMenuPane* /*aMenuPane*/ ) + { + // Do nothing + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsNotReady::RestoreControlStateL +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersAllGroupsNotReady:: + RestoreControlStateL( CPbk2ViewState* /*aState*/ ) + { + // Nothing to restore + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsNotReady::HandleCommandL +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersAllGroupsNotReady::HandleCommandL + ( TInt /*aCommand*/ ) + { + // Do nothing + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsReady::CGroupMembersAllGroups +// -------------------------------------------------------------------------- +// +CPguGroupMembersView::CGroupMembersAllGroupsReady::CGroupMembersAllGroupsReady + ( MPbk2GroupMembersViewActivationCallback& aViewParent, + CPbk2UIExtensionView& aView, + CVPbkContactManager& aContactManager, + MPbk2ContactNameFormatter& aContactNameFormatter, + CPbk2StorePropertyArray& aStorePropertyArray, + MPbk2CommandHandler& aCommandHandler, + CPbk2SortOrderManager& aSortOrderManager ) : + iViewParent(aViewParent), + iView(aView), + iContactManager(aContactManager), + iContactNameFormatter(aContactNameFormatter), + iStoreProperties(aStorePropertyArray), + iCommandHandler(aCommandHandler), + iSortOrderManager(aSortOrderManager) + { + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsReady::~CGroupMembersAllGroups +// -------------------------------------------------------------------------- +// +CPguGroupMembersView::CGroupMembersAllGroupsReady:: + ~CGroupMembersAllGroupsReady() + { + iCommandHandler.RemoveMenuCommandObserver( *this ); + + if ( iStoreConf ) + { + iStoreConf->RemoveObserver( *this ); + } + + delete iViewTransitionTransaction; + + // remove control from stack + if (iContainer) + { + iContainer->Control()->HideThumbnail(); + iContainer->Control()->MakeVisible(EFalse); + CCoeEnv::Static()->AppUi()->RemoveFromStack(iContainer); + delete iContainer; + } + + // Stop observing group members view + if (iGroupMembersView) + { + iGroupMembersView->RemoveObserver( *this ); + } + delete iGroupMembersView; + delete iNavigation; + iStoreList.Reset(); + iStoreList.Close(); + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsReady::ConstructL +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersAllGroupsReady::ConstructL + ( const TInt aFocusedGroupIndex ) + { + // Add this view to observe command events + iCommandHandler.AddMenuCommandObserver(*this); + + iStoreConf = &( Phonebook2::Pbk2AppUi()->ApplicationServices(). + StoreConfiguration() ); + iStoreConf->AddObserverL( *this ); + + // Expand the group members view from the all groups view + const MVPbkViewContact& group = + Phonebook2::Pbk2AppUi()->ApplicationServices(). + ViewSupplier().AllGroupsViewL()->ContactAtL + ( aFocusedGroupIndex ); + iGroupMembersView = group.Expandable()->ExpandLC(*this, + iSortOrderManager.SortOrder()); + CleanupStack::Pop(); // ExpandLC + + // create a store list that contains all the stores + MVPbkContactStoreList& storeList = iContactManager.ContactStoresL(); + for (TInt i = 0; i < storeList.Count(); ++i) + { + MVPbkContactStore& store = storeList.At(i); + iStoreList.Append(&store); + } + + // Create a navigation object which can navigate all the available groups + iNavigation = Pbk2NavigatorFactory::CreateContactNavigatorL + ( iView.Id(), *this, *this, iStoreList.Array(), + R_QTN_PHOB_NAVI_POS_INDICATOR_GROUP_MEMBERS_VIEW ); + + // Navigation view remains the same + iNavigation->SetScrollViewL + ( Phonebook2::Pbk2AppUi()->ApplicationServices(). + ViewSupplier().AllGroupsViewL(), EFalse ); + + // Set the group title to the title pane + HBufC* titleText = iContactNameFormatter.GetContactTitleL(group.Fields(), + MPbk2ContactNameFormatter::EPreserveLeadingSpaces ); + CleanupStack::PushL( titleText ); + ChangeTitlePaneL(titleText); + CleanupStack::Pop( titleText ); + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsReady::NewL +// -------------------------------------------------------------------------- +// +CPguGroupMembersView::CGroupMembersAllGroupsReady* + CPguGroupMembersView::CGroupMembersAllGroupsReady::NewL + ( MPbk2GroupMembersViewActivationCallback& aViewParent, + CPbk2UIExtensionView& aView, + CVPbkContactManager& aContactManager, + MPbk2ContactNameFormatter& aContactNameFormatter, + CPbk2StorePropertyArray& aStorePropertyArray, + MPbk2CommandHandler& aCommandHandler, + CPbk2SortOrderManager& aSortOrderManager, + const TInt aFocusedGroupIndex ) + { + CGroupMembersAllGroupsReady* self = + new ( ELeave ) CGroupMembersAllGroupsReady + ( aViewParent, aView, aContactManager, + aContactNameFormatter, aStorePropertyArray, aCommandHandler, + aSortOrderManager ); + CleanupStack::PushL (self ); + self->ConstructL( aFocusedGroupIndex ); + CleanupStack::Pop( self ); + return self; + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsReady::CreateControlL +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersAllGroupsReady::CreateControlL + ( const TRect& aClientRect ) + { + // Create the container and control + CContainer* container = CContainer::NewLC( &iView, &iView, iView ); + container->SetHelpContext( + TCoeHelpContext(iView.ApplicationUid(), + KPHOB_HLP_GROUP_MEMBER_LIST)); + + CPbk2NamesListControl* control = CPbk2NamesListControl::NewL( + R_PBK2_GROUPMEMBERS_CONTROL, + container, iContactManager, *iGroupMembersView, + iContactNameFormatter, iStoreProperties); + + // Takes ownership + container->SetControl(control, aClientRect); + control->SetTextL( KNullDesC ); + control->AddObserverL(*this); + + iNavigation->UpdateNaviIndicatorsL(*iViewParent.FocusedContact()); + //Set the current group link to Nameslist control + control->SetCurrentGroupLinkL(iViewParent.FocusedContact()); + + CCoeEnv::Static()->AppUi()->AddToStackL(iView, container); + CleanupStack::Pop(container); + iContainer = container; + iControl = control; + iPointerEventInspector = control; + + iContainer->ActivateL(); + iContainer->Control()->MakeVisible( ETrue ); + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsReady::Control +// -------------------------------------------------------------------------- +// +MPbk2ContactUiControl* CPguGroupMembersView::CGroupMembersAllGroupsReady:: + Control() + { + return iControl; + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsReady::HandleControlEventL +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersAllGroupsReady::HandleControlEventL + ( MPbk2ContactUiControl& /*aControl*/, + const TPbk2ControlEvent& aEvent ) + { + switch(aEvent.iEventType) + { + case TPbk2ControlEvent::EReady: + { + UpdateCbasL(); + + // Restore control state + iViewParent.RestoreStateL(); + if (iControl) + { + iControl->ShowThumbnail(); + } + break; + } + case TPbk2ControlEvent::EControlLeavesSelectionMode: // FALLTHROUGH + case TPbk2ControlEvent::EItemRemoved: // FALLTHROUGH + case TPbk2ControlEvent::EContactSelected: // FALLTHROUGH + case TPbk2ControlEvent::EContactUnselected: // FALLTHROUGH + case TPbk2ControlEvent::EContactUnselectedAll: + { + UpdateCbasL(); + break; + } + case TPbk2ControlEvent::EControlStateChanged: + { + UpdateCbasL(); + UpdateListEmptyTextL( aEvent.iInt ); + iContainer->Control()->DrawDeferred(); + break; + } + default: + { + // Do nothing + break; + } + } + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsReady::ConfigurationChanged +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersAllGroupsReady::ConfigurationChanged() + { + // Update navigations scroll view + TRAPD( error, + iNavigation->SetScrollViewL + ( Phonebook2::Pbk2AppUi()->ApplicationServices(). + ViewSupplier().AllGroupsViewL(), EFalse ) ); + if ( error != KErrNone ) + { + CCoeEnv::Static()->HandleError( error ); + } + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsReady::ConfigurationChangedCo +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersAllGroupsReady:: + ConfigurationChangedComplete() + { + // Do nothing + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsReady::ChangeContactL +// Called through MPbk2ContactNavigationCallback to change the +// group that is viewed. +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersAllGroupsReady::ChangeContactL + ( const MVPbkContactLink& aContactLink ) + { + if (iViewTransitionTransaction) + { + // remove observer from view + iViewTransitionTransaction->GroupMembersView()->RemoveObserver( *this ); + + // destroy tranaction + delete iViewTransitionTransaction; + iViewTransitionTransaction = NULL; + } + + CGroupMembersViewTransaction* transaction = + CGroupMembersViewTransaction::NewLC(); + // create a copy of the group link + MVPbkContactLink* groupLink = aContactLink.CloneLC(); + + // Get the index of the group to view from the all groups view + const TInt groupIndex = Phonebook2::Pbk2AppUi()->ApplicationServices(). + ViewSupplier().AllGroupsViewL()->IndexOfLinkL( *groupLink ); + if (groupIndex != KErrNotFound) + { + // Get the group at position from the all groups view + const MVPbkViewContact& group = Phonebook2::Pbk2AppUi()->ApplicationServices(). + ViewSupplier().AllGroupsViewL()->ContactAtL( groupIndex ); + + // retrieve group name, which is later shown on the title pane + HBufC* groupName = iContactNameFormatter.GetContactTitleL(group.Fields(), + MPbk2ContactNameFormatter::EPreserveLeadingSpaces); + CleanupStack::PushL(groupName); + + // initiate the next group members view loading + MVPbkContactViewBase* groupMembersView = group.Expandable()->ExpandLC(*this, + iSortOrderManager.SortOrder()); + + // the group members view loading has initiated, transfer ownership of these + // items to the transaction. Transaction will be committed when the view + // reaches the ready state + transaction->SetGroupMembersView(groupMembersView); + CleanupStack::Pop(); // ExpandLC + transaction->SetGroupName(groupName); + CleanupStack::Pop(groupName); + transaction->SetGroupLink(groupLink); + CleanupStack::Pop(); // CloneLC + + // now assign the transaction and wait for the view to become ready + iViewTransitionTransaction = transaction; + CleanupStack::Pop(transaction); + } + else + { + // the all groups view isnt ready, so contact change isnt possible + // cleanup + CleanupStack::PopAndDestroy(2, transaction); // groupLink, transaction + User::Leave(KErrNotReady); + } + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsReady::ViewStateLC +// -------------------------------------------------------------------------- +// +MVPbkContactLink* CPguGroupMembersView::CGroupMembersAllGroupsReady:: + ContactLinkLC() const + { + return iViewParent.FocusedContact()->CloneLC(); + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsReady::ViewStateLC +// -------------------------------------------------------------------------- +// +CPbk2ViewState* CPguGroupMembersView::CGroupMembersAllGroupsReady:: + ViewStateLC() const + { + CPbk2ViewState* state = iControl->ControlStateL(); + CleanupStack::PushL( state ); + MVPbkContactLink* parentContactLink = + iViewParent.FocusedContact()->CloneLC(); + state->SetParentContact( parentContactLink ); + CleanupStack::Pop(); // parentContactLink + return state; + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsReady::HandleCommandKeyL +// -------------------------------------------------------------------------- +// +TBool CPguGroupMembersView::CGroupMembersAllGroupsReady::HandleCommandKeyL + ( const TKeyEvent& aKeyEvent, TEventCode aType ) + { + TBool itemSpecEnabled = + Phonebook2::Pbk2AppUi()->ActiveView()->MenuBar()->ItemSpecificCommandsEnabled(); + TBool result = iNavigation->HandleCommandKeyL( aKeyEvent, aType ); + + if(!result && aType == EEventKey) + { + switch (aKeyEvent.iCode) + { + case EKeyBackspace: + { + if ( (itemSpecEnabled && (iControl->NumberOfContacts() > 0) ) + || iControl->ContactsMarked() ) + { + if ( iControl->FindTextL() == KNullDesC ) + { + HandleCommandL( EPbk2CmdRemoveFromGroup ); + result = ETrue; + } + } + break; + } + case EKeyEnter: // FALLTHROUGH + case EKeyOK: + { + if ( !ShiftDown(aKeyEvent) ) // pure OK or ENTER key + { + if ( iControl->ContactsMarked() && itemSpecEnabled ) + { + iView.LaunchPopupMenuL( + R_PHONEBOOK2_GROUPMEMBERS_CONTEXT_MENUBAR); + result = ETrue; + } + else if ( iControl->NumberOfContacts() == 0 ) + { + result = ETrue; + } + } + break; + } + + case EKeyPhoneSend: + { + // Use the EPbk2CmdCall id to identify that + // call is being launched with send key + if ( itemSpecEnabled && (iControl->NumberOfContacts() > 0) && + !iControl->ContactsMarked() ) + { + // If there is a dialog display on the top of screen, don't make call. + if ( !(CEikonEnv::Static()->EikAppUi()->IsDisplayingDialog()) ) + { + // Use the EPbk2CmdCall id to identify that + // call is being launched with send key + HandleCommandL( EPbk2CmdCall ); + } + result = ETrue; + } + break; + } + + case EKeyPoC: + { + // Use the EPbk2CmdPoC id to identify that + // call is being launched with PoC key + HandleCommandL( EPbk2CmdPoC ); + result = ETrue; + break; + } + + default: + { + break; + } + } + } + + // Update selection modifier key state + iSelectionModifierUsed = IsShiftOrControlDown( aKeyEvent ) || + ( (aType == EEventKeyDown) && (aKeyEvent.iCode == EStdKeyHash) ); + + return result; + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsReady::GetViewSpecificMenuFi +// -------------------------------------------------------------------------- +// +TInt CPguGroupMembersView::CGroupMembersAllGroupsReady:: + GetViewSpecificMenuFilteringFlagsL() const + { + return iControl->GetMenuFilteringFlagsL(); + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsReady::DynInitMenuPaneL +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersAllGroupsReady::DynInitMenuPaneL + ( TInt aResourceId, CEikMenuPane* aMenuPane ) + { + // Ask the control do control specific filtering + // (for example call HandleMarkableListDynInitMenuPane if needed) + iControl->DynInitMenuPaneL(aResourceId, aMenuPane); + + switch ( aResourceId ) + { + case R_PHONEBOOK2_OPEN_ME_MENU: + { + // Weed out commands not meant to be used with empty list + // Weed out commands not meant to be used with marked items + if ( iControl->NumberOfContacts() == 0 || + iControl->ContactsMarked() ) + { + aMenuPane->SetItemDimmed( EPbk2CmdOpenCca, ETrue ); + } + break; + } + + case R_PHONEBOOK2_GROUPMEMBERS_MENU: + { + // Weed out commands not meant to be used with empty list + if ( iControl->NumberOfContacts() == 0 ) + { + aMenuPane->SetItemDimmed( EPbk2CmdRemoveFromGroup, ETrue ); + aMenuPane->SetItemDimmed( EPbk2CmdBelongsToGroups, ETrue ); + } + + if ( iControl->ContactsMarked() ) + { + aMenuPane->SetItemDimmed( EPbk2CmdBelongsToGroups, ETrue ); + aMenuPane->SetItemDimmed( EPbk2CmdAddMembers, ETrue ); + aMenuPane->SetItemSpecific( EPbk2CmdRemoveFromGroup, EFalse ); + } + // Weed out commands not meant to be if names list is empty + if ( Phonebook2::Pbk2AppUi()->ApplicationServices(). + ViewSupplier().AllContactsViewL()->ContactCountL() == 0 ) + { + aMenuPane->SetItemDimmed( EPbk2CmdAddMembers, ETrue ); + } + break; + } + + case R_PHONEBOOK2_BCARD_SEND_MENU: + { + // Weed out commands not meant to be used with empty list + if ( iControl->NumberOfContacts() == 0 ) + { + aMenuPane->SetItemDimmed( EPbk2CmdSend, ETrue ); + } + if ( iControl->ContactsMarked() ) + { + aMenuPane->SetItemSpecific( EPbk2CmdSend, EFalse ); + } + break; + } + + case R_PHONEBOOK2_GROUPMEMBERS_CONTEXT_MENU: + { + // Weed out commands not meant to be used with empty list + if ( iControl->NumberOfContacts() == 0 ) + { + aMenuPane->SetItemDimmed( EPbk2CmdRemoveFromGroup, ETrue ); + } + + // Weed out commands not meant to be used with marked items + if ( iControl->ContactsMarked() ) + { + aMenuPane->SetItemDimmed( EPbk2CmdAddMembers, ETrue ); + } + + // Weed out commands not meant to be if names list is empty + if ( Phonebook2::Pbk2AppUi()->ApplicationServices(). + ViewSupplier().AllContactsViewL()->ContactCountL() == 0 ) + { + aMenuPane->SetItemDimmed( EPbk2CmdAddMembers, ETrue ); + } + break; + } + + default: + { + + // Phonebook 2 menu filtering happens in Commands + iCommandHandler.DynInitMenuPaneL(aResourceId, + aMenuPane, iView, *iControl ); + } + + }; + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsReady::ContactViewReady +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersAllGroupsReady::ContactViewReady + ( MVPbkContactViewBase& aView ) + { + // If we have a new view, lets change it + if ((&aView != iGroupMembersView) && + (&aView == iViewTransitionTransaction->GroupMembersView())) + { + TRAP_IGNORE(DoCommitTransActionL(aView)); + } + else + { + // When ContactViewReady() is called, the program needs to check whether + // the namelist control in the container is visible or not. + // If visible, call DrawDeferred() to refresh the container, + // and if not, the container needs not to be refreshed to avoid flicker on the background. + if ( iContainer->Control() && iContainer->Control()->IsVisible() ) + { + iContainer->DrawDeferred(); + } + } + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsReady::HandleNavigationEvent +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersAllGroupsReady::HandleNavigationEvent + ( const TEventType& aEventType ) + { + if (aEventType == MPbk2NavigationObserver::EContactDeleted) + { + // Return to the previous view + TRAPD( err, + { + CPbk2ViewState* state = ViewStateLC(); + if ( iViewParent.FocusedContact() ) + { + // change focused contact to current focused contact + state->SetFocusedContact( + iViewParent.FocusedContact()->CloneLC() ); + CleanupStack::Pop(); // currentGroup + } + Phonebook2::Pbk2AppUi()->Pbk2ViewExplorer()-> + ActivatePreviousViewL( state ); + CleanupStack::PopAndDestroy(state); + } ); // TRAPD + + if ( err != KErrNone ) + { + CCoeEnv::Static()->HandleError( err ); + } + } + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsReady::DoCommitTransActionL +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersAllGroupsReady::DoCommitTransActionL + ( MVPbkContactViewBase& aView ) + { + MVPbkContactLink* groupLink = iViewTransitionTransaction->GroupLink(); + HBufC* titleText = iViewTransitionTransaction->GetGroupName(); + CleanupStack::PushL( titleText ); + + // Update navi indicators in the navi pane + iNavigation->UpdateNaviIndicatorsL( *groupLink ); + + // Change title pane text + ChangeTitlePaneL(titleText); + CleanupStack::Pop(titleText); + + // Reset old view before changing + iContainer->Control()->Reset(); + + // Set control's active view next + iContainer->Control()->SetViewL( aView ); + + // Trash old view + if (iGroupMembersView) + { + iGroupMembersView->RemoveObserver( *this ); + delete iGroupMembersView; + iGroupMembersView = NULL; + } + + // Set correct focused index (First item) + iContainer->Control()->SetFocusedContactIndexL(KFirstItem); + + //Set the current group link to Nameslist control + iContainer->Control()->SetCurrentGroupLinkL(groupLink); + // The new base view is already being observed by this class + // (observer set in ExpandLC call in ChangeContactL method) + + // commit the transaction + MVPbkContactViewBase* groupMembersView = + iViewTransitionTransaction->GetGroupMembersView(); + groupLink = iViewTransitionTransaction->GetGroupLink(); + iGroupMembersView = groupMembersView; + iViewParent.SetFocusedContact(groupLink); + + // delete the transaction + delete iViewTransitionTransaction; + iViewTransitionTransaction = NULL; + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsReady::ChangeTitlePaneL +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersAllGroupsReady::ChangeTitlePaneL + ( HBufC* aTitleText ) + { + CEikStatusPane* statusPane = + CEikonEnv::Static()->AppUiFactory()->StatusPane(); + + if (statusPane && statusPane->PaneCapabilities( + TUid::Uid(EEikStatusPaneUidTitle)).IsPresent()) + { + CAknTitlePane* titlePane = static_cast(statusPane-> + ControlL(TUid::Uid(EEikStatusPaneUidTitle))); + titlePane->SetText(aTitleText); // Takes ownership of aTitle + } + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsReady::UpdateListEmptyTextL +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersAllGroupsReady::UpdateListEmptyTextL + ( TInt aListState ) + { + HBufC* text = NULL; + + switch ( aListState ) + { + case CPbk2NamesListControl::EStateEmpty: + { + text = StringLoader::LoadLC( R_QTN_PHOB_NO_ENTRIES_IN_GRP ); + break; + } + case CPbk2NamesListControl::EStateFiltered: + { + text = StringLoader::LoadLC( R_PBK2_FIND_NO_MATCHES ); + break; + } + default: + { + text = KNullDesC().AllocLC(); + break; + } + } + + if ( text ) + { + iControl->SetTextL( *text ); + CleanupStack::PopAndDestroy(); // text + } + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsReady::UpdateCbasL +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersAllGroupsReady::UpdateCbasL() + { + if ( iControl ) + { + if ( iControl->NumberOfContacts() > 0 + && !iControl->ContactsMarked() ) + { + // Set middle softkey as Open. + iView.Cba()->SetCommandSetL(R_PGU_SOFTKEYS_OPTIONS_BACK_OPEN); + iView.Cba()->DrawDeferred(); + } + else + { + // If names list is empty, MSK should be empty + if ( Phonebook2::Pbk2AppUi()->ApplicationServices(). + ViewSupplier().AllContactsViewL()->ContactCountL() == 0 ) + { + // Set middle softkey as Context menu. + iView.Cba()->SetCommandSetL( + R_PBK2_SOFTKEYS_OPTIONS_BACK_EMPTY); + } + else + { + // Set middle softkey as Context menu. + iView.Cba()->SetCommandSetL( + R_PBK2_SOFTKEYS_OPTIONS_BACK_CONTEXT); + } + iView.Cba()->DrawDeferred(); + // Change context menu when marked items + iView.MenuBar()->SetContextMenuTitleResourceId + ( R_PHONEBOOK2_GROUPMEMBERS_CONTEXT_MENUBAR ); + } + } + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsReady::RestoreControlStateL +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersAllGroupsReady::RestoreControlStateL + ( CPbk2ViewState* aState ) + { + if ( iControl ) + { + iControl->RestoreControlStateL(aState); + } + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsReady::HandleCommandL +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersAllGroupsReady::HandleCommandL + ( TInt aCommand ) + { + switch(aCommand) + { + case EPbk2CmdRemoveFromGroup: + { + if ( iControl && ( iControl->FocusedContactIndex() != KErrNotFound ) ) + { + CPguRemoveFromGroupCmd* cmd = + CPguRemoveFromGroupCmd::NewLC( + *iViewParent.FocusedContact(), + *iControl); + iCommandHandler.AddAndExecuteCommandL(cmd); + + CleanupStack::Pop(cmd); // command handler takes the ownership + } + break; + } + + case EPbk2CmdAddMembers: + { + CPguAddMembersCmd* cmd = + CPguAddMembersCmd::NewLC(*iViewParent.FocusedContact(), + *iControl); + iCommandHandler.AddAndExecuteCommandL(cmd); + CleanupStack::Pop(cmd); // command handler takes the ownership + break; + } + + default: + { + // Do nothing + break; + } + } + + if ( iControl && !iCommandHandler.HandleCommandL( aCommand, *iControl, + &iView ) ) + { + iControl->ProcessCommandL( aCommand ); + Phonebook2::Pbk2AppUi()->HandleCommandL( aCommand ); + } + + UpdateCbasL(); + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsReady::HandleStatusPaneSizeCh +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersAllGroupsReady:: + HandleStatusPaneSizeChange() + { + // Resize the container to fill the client rectangle + if( iContainer ) + { + iContainer->SetRect(iView.ClientRect()); + } + } + + +// ---------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsReady::HandleListBoxEventL +// ---------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersAllGroupsReady::HandleListBoxEventL(CEikListBox* /*aListBox*/,TListBoxEvent aEventType) + { + + if( AknLayoutUtils::PenEnabled() ) + { + switch ( aEventType ) + { + case EEventItemDoubleClicked: + case EEventItemSingleClicked: + { + + ShowContextMenuL(); + break; + } + case EEventItemClicked: //Happens after focus changed + break; + case EEventEnterKeyPressed: + { + if (iControl->NumberOfContacts() > 0 && + !iControl->ContactsMarked()) + { + // Select key is mapped to "Open Contact" command + HandleCommandL( EPbk2CmdOpenCca ); + } + else + { + iView.LaunchPopupMenuL( + R_PHONEBOOK2_GROUPMEMBERS_CONTEXT_MENUBAR); + } + break; + } + default: + break; + } + } + + + } + + + + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsReady::HandlePointerEventL +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersAllGroupsReady::HandlePointerEventL + ( const TPointerEvent& aPointerEvent ) + { + + + if ( AknLayoutUtils::PenEnabled() ) + { + if ( iPointerEventInspector->FocusableItemPointed() && iContainer && !(iControl->ContactsMarked())) + { + iContainer->LongTapDetectorL().PointerEventL( aPointerEvent ); + } + + + + if ( iControl->NumberOfContacts()==0) + { + if ( aPointerEvent.iType == TPointerEvent::EButton1Down ) + { + MTouchFeedback* feedback = MTouchFeedback::Instance(); + if ( feedback ) + { + feedback->InstantFeedback( ETouchFeedbackBasic ); + } + } + else if ( aPointerEvent.iType == TPointerEvent::EButton1Up ) + { + ShowContextMenuL(); + } + } + + } + + } + + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsReady::ShowContextMenuL +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersAllGroupsReady::ShowContextMenuL() + { + if ( iStylusPopupMenuLaunched ) + { + // Absorb EButton1Up event if we already launched the + // stylus popup menu + iStylusPopupMenuLaunched = EFalse; + } + else if ( !iPointerEventInspector->SearchFieldPointed() && + !iSelectionModifierUsed ) + { + if ( iControl->NumberOfContacts() > 0 && + iPointerEventInspector->FocusedItemPointed() ) + { + if ( iControl->ContactsMarked() ) + { + iView.LaunchPopupMenuL( + R_PHONEBOOK2_GROUPMEMBERS_CONTEXT_MENUBAR ); + } + else + { + // Open contact + HandleCommandL(EPbk2CmdOpenCca); + } + } + } + } + + + + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsReady::HandleLongTapEventL +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersAllGroupsReady::HandleLongTapEventL + ( const TPoint& /*aPenEventLocation*/, + const TPoint& aPenEventScreenLocation ) + { + if( iControl->ContactsMarked() ) + { + //if there are marked contacts, context menu should not open + return; + } + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsReady::PreCommandExecutionL +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersAllGroupsReady::PreCommandExecutionL + ( const MPbk2Command& /*aCommand*/ ) + { + if (iContainer && iContainer->Control()) + { + iContainer->Control()->HideThumbnail(); + } + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CGroupMembersAllGroupsReady::PostCommandExecutionL +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::CGroupMembersAllGroupsReady::PostCommandExecutionL + ( const MPbk2Command& /*aCommand*/ ) + { + if ( iContainer && iContainer->Control() ) + { + iContainer->Control()->ShowThumbnail(); + } + + UpdateCbasL(); + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::CPguGroupMembersView +// -------------------------------------------------------------------------- +// +CPguGroupMembersView::CPguGroupMembersView( CPbk2UIExtensionView& aView ) : + iView( aView ) + { + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::~CPguGroupMembersView +// -------------------------------------------------------------------------- +// +CPguGroupMembersView::~CPguGroupMembersView() + { + delete iFocusedGroup; + delete iControlState; + delete iViewImpl; + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::NewL +// -------------------------------------------------------------------------- +// +CPguGroupMembersView* CPguGroupMembersView::NewL + ( CPbk2UIExtensionView& aView ) + { + CPguGroupMembersView* self = + new(ELeave) CPguGroupMembersView( aView ); + return self; + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::HandleStatusPaneSizeChange +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::HandleStatusPaneSizeChange() + { + if ( iViewImpl ) + { + iViewImpl->HandleStatusPaneSizeChange(); + } + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::ViewStateLC +// -------------------------------------------------------------------------- +// +CPbk2ViewState* CPguGroupMembersView::ViewStateLC() const + { + CPbk2ViewState* ret = NULL; + if ( iViewImpl ) + { + ret = iViewImpl->ViewStateLC(); + } + else + { + CleanupStack::PushL( ret ); // LC function semantics + } + + return ret; + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::HandleCommandKeyL +// -------------------------------------------------------------------------- +// +TBool CPguGroupMembersView::HandleCommandKeyL( + const TKeyEvent& aKeyEvent, + TEventCode aType ) + { + // Pass the key event to the strategy + return iViewImpl->HandleCommandKeyL(aKeyEvent, aType); + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::GetViewSpecificMenuFilteringFlagsL +// -------------------------------------------------------------------------- +// +TInt CPguGroupMembersView::GetViewSpecificMenuFilteringFlagsL() const + { + return iViewImpl->GetViewSpecificMenuFilteringFlagsL(); + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::DoActivateL +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::DoActivateL + ( const TVwsViewId& aPrevViewId, TUid aCustomMessageId, + const TDesC8& aCustomMessage ) + { + UpdateViewStateL(aCustomMessageId, aCustomMessage); + + MPbk2ApplicationServices& appServices = + Phonebook2::Pbk2AppUi()->ApplicationServices(); + + // Focus setting cannot be done here as the group view might not be ready + // when using view launch + + MVPbkContactViewBase* allGroupsView = + appServices.ViewSupplier().AllGroupsViewL(); + + // get the focused group from the view parameters + const MVPbkContactLink* focusedGroupLink = iControlState->FocusedContact(); + // find the group's index from the group view + TInt groupIndex = allGroupsView->IndexOfLinkL(*focusedGroupLink); + if (groupIndex == KErrNotFound) + { + // if the parameter is correct check whether the focused group is set + groupIndex = allGroupsView->IndexOfLinkL(*iFocusedGroup); + } + else + { + delete iFocusedGroup; + iFocusedGroup = iControlState->TakeFocusedContact(); + } + + MPbk2ViewActivationTransaction* viewActivationTransaction = NULL; + if (groupIndex == KErrNotFound) + { + // if the group view isnt ready, thus the index cannot be retrieved, + // do a alternative view and refresh later, when the view is ready + viewActivationTransaction = + Phonebook2::Pbk2AppUi()->Pbk2ViewExplorer()->HandleViewActivationLC + ( iView.Id(), aPrevViewId, NULL, NULL, + Phonebook2::EUpdateNaviPane | Phonebook2::EUpdateTitlePane | + Phonebook2::EUpdateContextPane ); + + iViewImpl = CPguGroupMembersView::CGroupMembersAllGroupsNotReady::NewL + ( *this, iView, focusedGroupLink ); + } + else + { + // standard phonebook view activation + const MVPbkViewContact& contact = allGroupsView->ContactAtL(groupIndex); + HBufC* title = appServices.NameFormatter().GetContactTitleL + ( contact.Fields(), + MPbk2ContactNameFormatter::EPreserveLeadingSpaces ); + CleanupStack::PushL( title ); + + viewActivationTransaction = + Phonebook2::Pbk2AppUi()->Pbk2ViewExplorer()->HandleViewActivationLC + ( iView.Id(), aPrevViewId, title, NULL, + Phonebook2::EUpdateNaviPane | Phonebook2::EUpdateTitlePane | + Phonebook2::EUpdateContextPane ); + + + + iViewImpl = CGroupMembersAllGroupsReady::NewL + ( *this, iView, appServices.ContactManager(), + appServices.NameFormatter(), appServices.StoreProperties(), + *appServices.CommandHandlerL(), appServices.SortOrderManager(), + groupIndex ); + } + + // notifies startup monitor of view activation + if (Phonebook2::Pbk2AppUi()->Pbk2StartupMonitor()) + { + Phonebook2::Pbk2AppUi()->Pbk2StartupMonitor()-> + NotifyViewActivationL( iView.Id() ); + } + + iViewImpl->CreateControlL(iView.ClientRect()); + + CPbk2NamesListControl* nlctrl=static_cast (iViewImpl->Control()); + CCoeControl* ctrl=nlctrl->ComponentControl(0); + CEikListBox* listbox=static_cast (ctrl); + listbox->SetListBoxObserver( this ); + + iPreviousViewId = aPrevViewId; + + viewActivationTransaction->Commit(); + CleanupStack::PopAndDestroy(); // viewActivationTransaction + if (groupIndex != KErrNotFound) + { + CleanupStack::PopAndDestroy(); // title + } + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::DoDeactivate +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::DoDeactivate() + { + // Trash the old states + delete iControlState; + iControlState = NULL; + + // Store current state, safe to ignore. There's no real harm, + // if theres no stored state when activating this view again + TRAP_IGNORE( StoreStateL() ); + + delete iViewImpl; + iViewImpl = NULL; + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::HandleCommandL +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::HandleCommandL( TInt aCommand ) + { + switch ( aCommand ) + { + case EAknSoftkeyBack: // FALLTHROUGH + case EPbk2CmdOpenPreviousView: + { + ReturnToPreviousViewL(); + break; + } + default: + { + if ( iViewImpl ) + { + // route handle command to view implementation + iViewImpl->HandleCommandL(aCommand); + } + break; + } + } + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::DynInitMenuPaneL +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::DynInitMenuPaneL( + TInt aResourceId, CEikMenuPane* aMenuPane ) + { + if ( iViewImpl ) + { + // Ask the control do control specific filtering + // (for example call HandleMarkableListDynInitMenuPane if needed) + iViewImpl->DynInitMenuPaneL(aResourceId, aMenuPane); + } + } + +// ---------------------------------------------------------------------------- +// CPguGroupMembersView::HandleListBoxEventL +// ---------------------------------------------------------------------------- +// +void CPguGroupMembersView::HandleListBoxEventL(CEikListBox* aListBox,TListBoxEvent aEventType) + { + + + + if( AknLayoutUtils::PenEnabled() ) + { + switch ( aEventType ) + { + case EEventItemDoubleClicked: + case EEventItemSingleClicked: + case EEventEnterKeyPressed: + { + + if ( iViewImpl ) + { + // route the events to the view implementing the application + // view currently + iViewImpl->HandleListBoxEventL(aListBox,aEventType); + } + break; + } + case EEventItemClicked: //Happens after focus changed + break; + default: + break; + } + } + + } + + + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::HandlePointerEventL +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::HandlePointerEventL( + const TPointerEvent& aPointerEvent) + { + if ( iViewImpl ) + { + // route the pointer events to the view implementing the application + // view currently + iViewImpl->HandlePointerEventL(aPointerEvent); + } + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::HandleLongTapEventL +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::HandleLongTapEventL( + const TPoint& aPenEventLocation, + const TPoint& aPenEventScreenLocation ) + { + if ( iViewImpl ) + { + // route the long tap event to the view implementing the application + // view currently + iViewImpl->HandleLongTapEventL( + aPenEventLocation, aPenEventScreenLocation ); + } + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::TransformViewActivationStateToReady +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::TransformViewActivationStateToReadyL( + const TInt aGroupIndex) + { + if ( aGroupIndex == KErrNotFound ) + { + ReturnToPreviousViewL(); + } + else + { + // Pops the control from the control stack + delete iViewImpl; + iViewImpl = NULL; + + // Switch view control states + MPbk2ApplicationServices& appServices = + Phonebook2::Pbk2AppUi()->ApplicationServices(); + iViewImpl = CPguGroupMembersView::CGroupMembersAllGroupsReady::NewL + ( *this, iView, appServices.ContactManager(), + appServices.NameFormatter(), appServices.StoreProperties(), + *appServices.CommandHandlerL(), appServices.SortOrderManager(), + aGroupIndex ); + + // Creates and activates the control + iViewImpl->CreateControlL(iView.ClientRect()); + } + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::FocusedContact +// -------------------------------------------------------------------------- +// +MVPbkContactLink* CPguGroupMembersView::FocusedContact() const + { + return iFocusedGroup; + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::SetFocusedContact +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::SetFocusedContact(MVPbkContactLink* aGroupLink) + { + delete iFocusedGroup; + iFocusedGroup = aGroupLink; + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::StoreStateL +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::StoreStateL() + { + // retrieves the views state from the implementation + CPbk2ViewState* state = ViewStateLC(); + CleanupStack::Pop(state); + if ( state ) + { + // and stores it as member data + delete iControlState; + iControlState = state; + } + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::RestoreStateL +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::RestoreStateL() + { + iViewImpl->RestoreControlStateL(iControlState); + delete iControlState; + iControlState = NULL; + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::UpdateViewStateL +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::UpdateViewStateL( + const TUid aCustomMessageId, + const TDesC8& aCustomMessage) + { + CPbk2ViewState* viewState = NULL; + // Read the desired UI state from aCustomMessage + if (aCustomMessageId == TUid::Uid(KPbkViewStateUid)) + { + // Handle lecagy view state message + CPbk2ViewStateTransformer* transformer = + CPbk2ViewStateTransformer::NewLC + ( Phonebook2::Pbk2AppUi()->ApplicationServices(). + ContactManager() ); + viewState = transformer->TransformLegacyViewStateToPbk2ViewStateLC + ( aCustomMessage ); + CleanupStack::Pop(); // viewState + CleanupStack::PopAndDestroy(transformer); + } + else if (aCustomMessageId == CPbk2ViewState::Uid()) + { + // Read the desired UI state from aCustomMessage + viewState = CPbk2ViewState::NewL(aCustomMessage); + } + else + { + User::Leave(KErrNotSupported); + } + + if ( iControlState ) + { + // Merge parameter view state with the stored state + if ( viewState->FocusedContact() && + viewState->FocusedContact() != iControlState->FocusedContact() ) + { + iControlState->SetFocusedContact( + viewState->TakeFocusedContact() ); + iControlState->SetFocusedFieldIndex( KErrNotFound ); + iControlState->SetTopFieldIndex( KErrNotFound ); + } + if ( viewState->FocusedFieldIndex() >= 0 ) + { + iControlState->SetFocusedFieldIndex( + viewState->FocusedFieldIndex() ); + } + if ( viewState->TopFieldIndex() >= 0 ) + { + iControlState->SetTopFieldIndex( + viewState->TopFieldIndex() ); + } + if ( viewState->ParentContact() && + viewState->ParentContact() != iControlState->ParentContact() ) + { + iControlState->SetParentContact( + viewState->TakeParentContact() ); + } + + // Input state overwrites the saved state. When the view is deactivated + // and then again activated marks are not set if the input state + /// doesn't say otherwise. + iControlState->SetMarkedContacts( viewState->TakeMarkedContacts() ); + + // Delete parameter view state + delete viewState; + } + else + { + // No stored state, use the parameter supplied one + iControlState = viewState; + } + } + +// -------------------------------------------------------------------------- +// CPguGroupMembersView::ReturnToPreviousViewL +// -------------------------------------------------------------------------- +// +void CPguGroupMembersView::ReturnToPreviousViewL() const + { + CPbk2ViewState* state = ViewStateLC(); + if ( iFocusedGroup ) + { + // Change focused contact to current focused contact + state->SetFocusedContact( iFocusedGroup->CloneLC() ); + CleanupStack::Pop(); // currentGroup + } + Phonebook2::Pbk2AppUi()->Pbk2ViewExplorer()-> + ActivatePreviousViewL( state ); + CleanupStack::PopAndDestroy(state); + } + +// End of File