phonebookui/Phonebook2/GroupExtension/src/CPguGroupView.cpp
branchRCL_3
changeset 63 f4a778e096c2
child 64 c1e8ba0c2b16
child 68 9da50d567e3c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/GroupExtension/src/CPguGroupView.cpp	Wed Sep 01 12:29:52 2010 +0100
@@ -0,0 +1,904 @@
+/*
+* 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 Group UI extension group view.
+*
+*/
+
+
+#include "CPguGroupView.h"
+
+// Phonebook 2
+#include "Pbk2GroupUi.hrh"
+#include <CPbk2UIExtensionView.h>
+#include <CPbk2AppUiBase.h>
+#include <CPbk2NamesListControl.h>
+#include <CPbk2ViewState.h>
+#include <CPbk2ControlContainer.h>
+#include <MPbk2ViewActivationTransaction.h>
+#include <MPbk2ViewExplorer.h>
+#include <CPbk2StoreConfiguration.h>
+#include <Pbk2GroupUIRes.rsg>
+#include <Pbk2CommonUi.rsg>
+#include <Pbk2Commands.rsg>
+#include <Pbk2UIControls.rsg>
+#include <csxhelp/phob.hlp.hrh>
+#include <MPbk2CommandHandler.h>
+#include <Pbk2UID.h>
+#include <MPbk2AppUi.h>
+#include <CPbk2ViewStateTransformer.h>
+#include <MPbk2StartupMonitor.h>
+#include <CPbk2StorePropertyArray.h>
+#include <CPbk2StoreProperty.h>
+#include <MPbk2ApplicationServices.h>
+#include <MPbk2ContactViewSupplier.h>
+#include <CPbk2ApplicationServices.h>
+#include <MPbk2StoreValidityInformer.h>
+#include <Pbk2MenuFilteringFlags.hrh>
+
+// Virtual Phonebook
+#include <MVPbkContactStoreList.h>
+#include <CVPbkContactStoreUriArray.h>
+#include <MVPbkContactStore.h>
+#include <CVPbkContactManager.h>
+#include <TVPbkContactStoreUriPtr.h>
+#include <MVPbkContactStoreProperties.h>
+#include <VPbkContactStoreUris.h>
+#include <MVPbkContactViewBase.h>
+#include <MVPbkViewContact.h>
+
+// System includes
+#include <eikmenup.h>
+#include <eikbtgpc.h>
+#include <avkon.rsg>
+#include <featmgr.h>
+#include <StringLoader.h>
+#include <AiwCommon.hrh>
+#include <eikmenub.h>
+#include <AknUtils.h>
+#include <eiklbx.h>
+#include <eiklbo.h>
+#include <coecntrl.h>
+#include <touchfeedback.h>
+
+/// Unnamed namespace for local definitions
+namespace {
+
+_LIT( KNewline, "\n" );
+
+/**
+ * Returns ETrue if shift is depressed in given key event.
+ *
+ * @param aKeyEvent     Key event
+ * @return  ETrue if shift is depressed.
+ */
+inline TBool ShiftDown( const TKeyEvent& aKeyEvent )
+    {
+    return ( aKeyEvent.iModifiers &
+           ( EModifierShift|EModifierLeftShift|EModifierRightShift ) ) != 0;
+    }
+
+} /// namespace
+
+// --------------------------------------------------------------------------
+// CPguGroupView::CPguGroupView
+// --------------------------------------------------------------------------
+//
+CPguGroupView::CPguGroupView( CPbk2UIExtensionView& aView ) :
+            iView( aView )
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CPguGroupView::~CPguGroupView
+// --------------------------------------------------------------------------
+//
+CPguGroupView::~CPguGroupView()
+    {
+    if ( iStoreConfiguration )
+        {
+        iStoreConfiguration->RemoveObserver( *this );
+        }
+
+    delete iControlState;
+    delete iParamState;
+
+    if ( iContainer )
+        {
+        CCoeEnv::Static()->AppUi()->RemoveFromStack( iContainer );
+        delete iContainer;
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPguGroupView::NewL
+// --------------------------------------------------------------------------
+//
+CPguGroupView* CPguGroupView::NewL( CPbk2UIExtensionView& aView )
+    {
+    CPguGroupView* self = new ( ELeave ) CPguGroupView( aView );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CPguGroupView::ConstructL
+// --------------------------------------------------------------------------
+//
+inline void CPguGroupView::ConstructL()
+    {
+    iStoreConfiguration = &Phonebook2::Pbk2AppUi()->ApplicationServices().
+        StoreConfiguration();
+
+    iStoreConfiguration->AddObserverL( *this );
+
+    iCommandHandler = Phonebook2::Pbk2AppUi()->ApplicationServices().
+        CommandHandlerL();
+
+    // Attach AIW providers
+    iCommandHandler->RegisterAiwInterestL
+        ( KAiwCmdPoC, R_PHONEBOOK2_GROUPVIEWS_POC_MENU,
+          R_PHONEBOOK2_POCUI_AIW_INTEREST, ETrue );
+    }
+
+// --------------------------------------------------------------------------
+// CPguGroupView::HandleStatusPaneSizeChange
+// --------------------------------------------------------------------------
+//
+void CPguGroupView::HandleStatusPaneSizeChange()
+    {
+    // Resize the container to fill the client rectangle
+    if ( iContainer )
+        {
+        iContainer->SetRect( iView.ClientRect() );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPguGroupView::ViewStateLC
+// --------------------------------------------------------------------------
+//
+CPbk2ViewState* CPguGroupView::ViewStateLC() const
+    {
+    CPbk2ViewState* state = iControl->ControlStateL();
+    CleanupStack::PushL( state );
+    return state;
+    }
+
+// --------------------------------------------------------------------------
+// CPguGroupView::HandleCommandKeyL
+// --------------------------------------------------------------------------
+//
+TBool CPguGroupView::HandleCommandKeyL
+        ( const TKeyEvent& aKeyEvent, TEventCode aType )
+    {
+    TBool result = EFalse;
+    TBool itemSpecEnabled = 
+        Phonebook2::Pbk2AppUi()->ActiveView()->MenuBar()->ItemSpecificCommandsEnabled();
+    if ( itemSpecEnabled && (EStdKeyHash == aKeyEvent.iScanCode) )
+        {
+        //make sure Hash key won't be passed to default keyHandler
+        return ETrue;
+        }
+    if ( aType == EEventKey )
+        {
+        switch ( aKeyEvent.iCode )
+            {
+            case EKeyBackspace:
+                {
+                if ( itemSpecEnabled && ( iControl->NumberOfContacts() > 0 ) &&
+                     ( iControl->FindTextL() == KNullDesC ) )
+                    {
+                    HandleCommandL( EPbk2CmdRemoveGroup );
+                    result = ETrue;
+                    }
+				break;
+				}
+            case EKeyEnter: // FALLTHROUGH
+            case EKeyOK:
+                {
+                if ( !ShiftDown( aKeyEvent )  // pure OK or ENTER key
+                    && iControl->NumberOfContacts() == 0 )
+					{
+                    result = ETrue;
+                    }
+                break;
+                }
+            default:
+                {
+                break;
+                }
+            }
+        }
+    return result;
+    }
+
+
+
+// ----------------------------------------------------------------------------
+// CPguGroupView::HandleListBoxEventL
+// ----------------------------------------------------------------------------
+//
+void CPguGroupView::HandleListBoxEventL(CEikListBox* /*aListBox*/,TListBoxEvent aEventType)
+    {
+
+
+    if( AknLayoutUtils::PenEnabled() )  
+        {
+        switch ( aEventType )
+            {
+            case EEventItemSingleClicked:
+                {
+                ShowContextMenuL();
+                break;
+                }
+            case EEventItemClicked: //Happens after focus changed
+            break;
+            case EEventEnterKeyPressed:
+                {
+                // Select key is mapped to "Open Group" command
+                HandleCommandL( EPbk2CmdOpenGroup );
+                break;
+                }    
+            default:
+               break;
+            }
+        }
+    
+    
+     
+    }
+
+
+// --------------------------------------------------------------------------
+// CPguGroupView::HandlePointerEventL
+// --------------------------------------------------------------------------
+//
+void CPguGroupView::HandlePointerEventL( const TPointerEvent& aPointerEvent )
+    {
+    if ( AknLayoutUtils::PenEnabled() )
+        {
+        if ( iPointerEventInspector->FocusableItemPointed() && iContainer )
+            {
+            iContainer->LongTapDetectorL().PointerEventL( aPointerEvent );
+            }
+        if ( iControl->NumberOfContacts()==0) 
+            {
+            if ( aPointerEvent.iType == TPointerEvent::EButton1Down )
+                {
+                MTouchFeedback* feedback = MTouchFeedback::Instance();
+                if ( feedback )
+                    {
+                    feedback->InstantFeedback( ETouchFeedbackNone );
+                    }
+                }
+            else if ( aPointerEvent.iType == TPointerEvent::EButton1Up )		
+                {
+                ShowContextMenuL();
+                }
+            }
+
+        }
+    }
+
+
+
+
+
+
+// --------------------------------------------------------------------------
+// CPguGroupView::ShowContextMenuL
+// --------------------------------------------------------------------------
+//
+void CPguGroupView::ShowContextMenuL()
+    {
+
+    if ( iStylusPopupMenuLaunched )
+        {
+        // Absorb EButton1Up event if we already launched the stylus
+        // popup menu
+        iStylusPopupMenuLaunched = EFalse;
+        }
+    else if ( !iPointerEventInspector->SearchFieldPointed() )
+        {
+        if ( iControl->NumberOfContacts() > 0 )
+            {
+            if ( iPointerEventInspector->FocusedItemPointed() )
+                {
+                // Open group
+                HandleCommandL(EPbk2CmdOpenGroup);
+                }
+            }
+        }
+    }
+    
+    
+
+// --------------------------------------------------------------------------
+// CPguGroupView::GetViewSpecificMenuFilteringFlagsL
+// --------------------------------------------------------------------------
+//
+TInt CPguGroupView::GetViewSpecificMenuFilteringFlagsL() const
+    {
+    TInt flags( 0 );
+    flags |= CurrentStoreSupportsGroupsL();
+    if ( iControl )
+        {
+        flags |= iControl->GetMenuFilteringFlagsL();
+        const MVPbkViewContact* contact = iControl->FocusedViewContactL();
+        if( contact && contact->Expandable() )
+            {
+            flags |= KPbk2FocusedItemIsExpandable;
+            }
+        }
+    return flags;
+    }
+
+// --------------------------------------------------------------------------
+// CPguGroupView::DoActivateL
+// --------------------------------------------------------------------------
+//
+void CPguGroupView::DoActivateL
+        ( const TVwsViewId& aPrevViewId, TUid aCustomMessageId,
+          const TDesC8& aCustomMessage )
+    {
+    // Add this view to observe menu command events
+    iCommandHandler->AddMenuCommandObserver(*this);
+
+    HBufC* title = StringLoader::LoadLC( R_QTN_PHOB_TITLE );
+
+    MPbk2ViewActivationTransaction* viewActivationTransaction =
+        Phonebook2::Pbk2AppUi()->Pbk2ViewExplorer()->HandleViewActivationLC
+            ( iView.Id(), aPrevViewId, title, NULL,
+              Phonebook2::EUpdateNaviPane | Phonebook2::EUpdateTitlePane |
+              Phonebook2::EUpdateContextPane );
+
+    // Check activation parameters
+    delete iParamState;
+    iParamState = NULL;
+    if ( aCustomMessageId == CPbk2ViewState::Uid() )
+        {
+        iParamState = CPbk2ViewState::NewL( aCustomMessage );
+        }
+    else if (aCustomMessageId == TUid::Uid(KPbkViewStateUid))
+        {
+        // Handle legacy view state
+        CPbk2ViewStateTransformer* transformer = CPbk2ViewStateTransformer::NewLC
+            ( Phonebook2::Pbk2AppUi()->ApplicationServices().ContactManager() );
+        iParamState = transformer->
+            TransformLegacyViewStateToPbk2ViewStateLC( aCustomMessage );
+        CleanupStack::Pop();
+        CleanupStack::PopAndDestroy( transformer );
+        }
+
+    // Notifies startup monitor of view activation
+    if (Phonebook2::Pbk2AppUi()->Pbk2StartupMonitor())
+        {
+        Phonebook2::Pbk2AppUi()->Pbk2StartupMonitor()->
+            NotifyViewActivationL( iView.Id(),
+            *Phonebook2::Pbk2AppUi()->ApplicationServices().
+                ViewSupplier().AllGroupsViewL() );
+        }
+
+    CreateControlsL();
+    iContainer->ActivateL();
+    
+  
+    CCoeControl* ctrl=iControl->ComponentControl(0);
+    CEikListBox* listbox=static_cast <CEikListBox*> (ctrl);
+    listbox->SetListBoxObserver( this ); 
+    
+
+    viewActivationTransaction->Commit();
+    CleanupStack::PopAndDestroy( 2 ); //title, viewActivationTransaction
+
+    // Should be here because in NOT READY case view does not become ready
+    // and cbas are not updated without this.
+    UpdateCbasL();
+    }
+
+// --------------------------------------------------------------------------
+// CPguGroupView::DoDeactivate
+// --------------------------------------------------------------------------
+//
+void CPguGroupView::DoDeactivate()
+    {
+    iCommandHandler->RemoveMenuCommandObserver( *this );
+    // Trash the old states
+    delete iParamState;
+    iParamState = NULL;
+    delete iControlState;
+    iControlState = NULL;
+
+    if ( iContainer )
+        {
+        CCoeEnv::Static()->AppUi()->RemoveFromStack( iContainer );
+        // 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 iContainer;
+        iContainer = NULL;
+        iControl = NULL;
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPguGroupView::HandleCommandL
+// --------------------------------------------------------------------------
+//
+void CPguGroupView::HandleCommandL( TInt aCommand )
+    {
+    // this will leave if control is NULL due to e.g. bad view switch
+    CheckUiControlL();
+    switch( aCommand )
+    	{
+        case EAknCmdExit:
+        case EAknSoftkeyExit:
+        case EPbk2CmdExit:
+        case EAknCmdHideInBackground:
+            {
+            // AppUi will send the application to background.
+            // Because the control is not destroyed it must be reset so that
+            // when the view comes foreground again it will look like a fresh
+            // and brand new control.
+            iControl->Reset();
+       	    break;
+            }
+    	default:
+    	    break;
+        }
+    // No command handling in this class, forward to Commands
+    if ( !iCommandHandler->HandleCommandL( aCommand, *iControl, &iView ) )
+        {
+        iControl->ProcessCommandL( aCommand );
+        Phonebook2::Pbk2AppUi()->HandleCommandL( aCommand );
+        UpdateCbasL();
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPguGroupView::DynInitMenuPaneL
+// --------------------------------------------------------------------------
+//
+void CPguGroupView::DynInitMenuPaneL(
+        TInt aResourceId,
+        CEikMenuPane* aMenuPane )
+    {
+
+    // this will leave if control is NULL due to e.g. bad view switch
+    CheckUiControlL();
+    
+    
+    if ( iControl )
+        {
+        // Ask the control do control specific filtering
+        // (for example call HandleMarkableListDynInitMenuPane if needed)
+        iControl->DynInitMenuPaneL( aResourceId, aMenuPane );
+        }
+
+    switch ( aResourceId )
+        {
+        case R_PHONEBOOK2_GROUPSLIST_MENU:
+            {
+            if ( !CurrentStoreSupportsGroupsL() )
+                {
+                aMenuPane->SetItemDimmed( EPbk2CmdCreateNewGroup, ETrue );
+                }
+            // Weed out commands not meant to be used with empty list
+            if ( iControl->NumberOfContacts() == 0 )
+                {
+                aMenuPane->SetItemDimmed( EPbk2CmdOpenGroup, ETrue );
+                aMenuPane->SetItemDimmed( EPbk2CmdWriteGroup, ETrue );
+                aMenuPane->SetItemDimmed( EPbk2CmdRemoveGroup, ETrue );
+                aMenuPane->SetItemDimmed( EPbk2CmdRenameGroup, ETrue );
+                aMenuPane->SetItemDimmed( EPbk2CmdSetToneToGroup, ETrue );
+                }
+            break;
+            }
+
+        case R_PHONEBOOK2_GROUPLIST_CONTEXT_MENU:
+            {
+            if( !CurrentStoreSupportsGroupsL() )
+                {
+                aMenuPane->SetItemDimmed( EPbk2CmdCreateNewGroup, ETrue );
+                }
+            break;
+            }
+        case R_PHONEBOOK2_INFO_MENU:
+            {
+            // If there are no available stores, "memory details" should not be shown in Options menu
+            if( !CurrentStoreIsAvailableL() )
+                {
+                aMenuPane->SetItemDimmed( EPbk2CmdPhonebook2Info, ETrue ); 
+                }
+            break;
+            }
+        default:
+            {
+            // Phonebook 2 menu filtering happens in Commands
+            iCommandHandler->DynInitMenuPaneL(
+                    aResourceId, aMenuPane, iView, *iControl );
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPguGroupView::HandleLongTapEventL
+// --------------------------------------------------------------------------
+//
+void CPguGroupView::HandleLongTapEventL(
+        const TPoint& /*aPenEventLocation*/,
+        const TPoint& aPenEventScreenLocation )
+    {
+	if( iControl->ContactsMarked() )
+		{
+		//if there are marked contacts, context menu should not open
+		return;
+		}
+    }
+
+// --------------------------------------------------------------------------
+// CPguGroupView::HandleControlEventL
+// --------------------------------------------------------------------------
+//
+void CPguGroupView::HandleControlEventL
+        ( MPbk2ContactUiControl& /*aControl*/,
+          const TPbk2ControlEvent& aEvent )
+    {
+    switch ( aEvent.iEventType )
+        {
+        case TPbk2ControlEvent::EReady:
+            {
+            UpdateCbasL();
+
+            // Restore control state
+            RestoreStateL();
+            break;
+            }
+        case TPbk2ControlEvent::EItemAdded:
+        case TPbk2ControlEvent::EItemRemoved:
+        case TPbk2ControlEvent::EContactSetChanged:
+            {
+            UpdateCbasL();
+            break;
+            }
+        case TPbk2ControlEvent::EControlStateChanged:
+            {
+            UpdateCbasL();
+            iListControlState = aEvent.iInt;
+            UpdateListEmptyTextL();
+            iContainer->Control()->DrawDeferred();
+            break;
+            }
+        default:
+            {
+            // Do nothing
+            break;
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPguGroupView::ConfigurationChanged
+// --------------------------------------------------------------------------
+//
+void CPguGroupView::ConfigurationChanged()
+    {
+    if ( iContainer )
+        {
+        iContainer->Control()->Reset();
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPguGroupView::ConfigurationChangedComplete
+// --------------------------------------------------------------------------
+//
+void CPguGroupView::ConfigurationChangedComplete()
+    {
+    if ( iContainer )
+        {
+        TRAPD( error, HandleConfigurationChangeL() );
+        if ( error != KErrNone )
+            {
+            CCoeEnv::Static()->HandleError( error );
+            iContainer->Control()->Reset();
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPguGroupView::PreCommandExecutionL
+// --------------------------------------------------------------------------
+//
+void CPguGroupView::PreCommandExecutionL
+        ( const MPbk2Command& /*aCommand*/ )
+    {
+    // Do nothing
+    }
+
+// --------------------------------------------------------------------------
+// CPguGroupMembersView::PostCommandExecutionL
+// --------------------------------------------------------------------------
+//
+void CPguGroupView::PostCommandExecutionL
+        ( const MPbk2Command& /*aCommand*/ )
+    {
+    UpdateCbasL();
+    }
+
+// --------------------------------------------------------------------------
+// CPguGroupView::CurrentStoreSupportsGroupsL
+// --------------------------------------------------------------------------
+//
+TBool CPguGroupView::CurrentStoreSupportsGroupsL() const
+    {
+    TBool ret = EFalse;
+    MVPbkContactStoreList& stores =
+        Phonebook2::Pbk2AppUi()->ApplicationServices().
+            ContactManager().ContactStoresL();
+    CVPbkContactStoreUriArray* uris =
+        iStoreConfiguration->CurrentConfigurationL();
+    CleanupStack::PushL( uris );
+
+    const TInt count = uris->Count();
+    for ( TInt i = count - 1; i >= 0; --i )
+        {
+        MVPbkContactStore* store = stores.Find( ( *uris )[i] );
+        if ( store )
+            {
+            // If we found atleast one store having groups we
+            // return the flag.
+            if ( store->StoreProperties().SupportsContactGroups() )
+                {
+                ret = ETrue;
+                break;
+                }
+            }
+        }
+
+    CleanupStack::PopAndDestroy( uris );
+    return ret;
+    }
+
+// --------------------------------------------------------------------------
+// CPguGroupView::CurrentStoreIsAvailable
+// --------------------------------------------------------------------------
+//
+TBool CPguGroupView::CurrentStoreIsAvailableL() const
+    {
+    TBool ret = ETrue;
+    CPbk2ApplicationServices* appServices = CPbk2ApplicationServices::InstanceLC();
+
+    // Returns the stores that are currently available and open(selected by user in Settings).
+    CVPbkContactStoreUriArray* aValidStores = appServices->StoreValidityInformer().CurrentlyValidStoresL();
+    CleanupStack::PushL( aValidStores );
+    if( 0 == aValidStores->Count() )
+        {
+        ret = EFalse;
+        }
+     CleanupStack::PopAndDestroy(); // aValidStores
+     CleanupStack::PopAndDestroy(); // appServices
+     return ret;
+    }
+
+// --------------------------------------------------------------------------
+// CPguGroupView::CreateControlsL
+// --------------------------------------------------------------------------
+//
+ void CPguGroupView::CreateControlsL()
+    {
+    if ( !iContainer )
+        {
+        // Create the container and control
+        CContainer* container = CContainer::NewLC( &iView, &iView, iView );
+
+        container->SetHelpContext( TCoeHelpContext
+            ( iView.ApplicationUid(), KPHOB_HLP_GROUP_LIST ) );
+
+        MPbk2ApplicationServices& appServices =
+            Phonebook2::Pbk2AppUi()->ApplicationServices();
+
+        CPbk2NamesListControl* control = CPbk2NamesListControl::NewL
+            ( R_PBK2_GROUPS_LIST_CONTROL, container,
+              appServices.ContactManager(),
+              *appServices.ViewSupplier().AllGroupsViewL(),
+              appServices.NameFormatter(),
+              appServices.StoreProperties() );
+        CleanupStack::PushL( control );
+
+        control->AddObserverL( *this );
+        // takes ownership
+        container->SetControl( control, iView.ClientRect() );
+        CleanupStack::Pop( control );
+
+        CCoeEnv::Static()->AppUi()->AddToStackL( iView, container );
+        CleanupStack::Pop( container );
+        iContainer = container;
+        iControl = control;
+        iPointerEventInspector = control;
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPguGroupView::StoreStateL
+// --------------------------------------------------------------------------
+//
+void CPguGroupView::StoreStateL()
+    {
+    CPbk2ViewState* state = ViewStateLC();
+    CleanupStack::Pop(state);
+    if ( state )
+        {
+        delete iControlState;
+        iControlState = state;
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPguGroupView::RestoreStateL
+// --------------------------------------------------------------------------
+//
+void CPguGroupView::RestoreStateL()
+    {
+    iControl->RestoreControlStateL( iControlState );
+    iControl->RestoreControlStateL( iParamState);
+    delete iControlState;
+    iControlState = NULL;
+    }
+
+// --------------------------------------------------------------------------
+// CPguGroupView::UpdateCbasL
+// --------------------------------------------------------------------------
+//
+void CPguGroupView::UpdateCbasL()
+    {
+    if ( iControl )
+        {
+        if ( iControl->NumberOfContacts() > 0 )
+            {
+            // Set middle softkey as Open.
+            iView.Cba()->SetCommandSetL( R_PGU_SOFTKEYS_OPTIONS_EXIT_OPEN );
+            iView.Cba()->DrawDeferred();
+            }
+        else
+            {
+            // Set middle softkey as Context menu.
+            iView.Cba()->SetCommandSetL(
+                R_PBK2_SOFTKEYS_OPTIONS_EXIT_CONTEXT );
+            iView.Cba()->DrawDeferred();
+            // Change context menu when nameslist is empty
+            iView.MenuBar()->SetContextMenuTitleResourceId
+                ( R_PHONEBOOK2_GROUPLIST_CONTEXT_MENUBAR );
+            }
+        }
+    }
+
+
+// --------------------------------------------------------------------------
+// CPguGroupView::UpdateListEmptyTextL
+// --------------------------------------------------------------------------
+//
+void CPguGroupView::UpdateListEmptyTextL()
+    {
+    HBufC* text = NULL;
+    switch ( iListControlState )
+        {
+        case CPbk2NamesListControl::EStateEmpty:
+        case CPbk2NamesListControl::EStateNotReady:
+            {
+            text = StringLoader::LoadLC( R_QTN_PHOB_NO_GROUPS );
+
+            CVPbkContactStoreUriArray* uris =
+                iStoreConfiguration->CurrentConfigurationL();
+            CleanupStack::PushL( uris );
+
+            HBufC* helpText = NULL;
+            TInt numberOfStores = uris->Count();
+            if ( CurrentStoreSupportsGroupsL() )
+                {
+                // At least one memory in use which supports groups
+                helpText = StringLoader::LoadLC( R_QTN_PHOB_NO_GROUPS_LONGER );
+                }
+            else if ( numberOfStores > 1 )
+                {
+                // More than one memories in use, but none of them support groups
+                helpText = StringLoader::LoadLC( R_QTN_PHOB_NO_GROUPS_STORES );
+                }
+            else if ( numberOfStores == 1 )
+                {
+                // The only used memory does not support groups
+                const CPbk2StoreProperty* props =
+                    Phonebook2::Pbk2AppUi()->ApplicationServices().
+                        StoreProperties().FindProperty( (*uris)[0] );
+                if ( props )
+                    {
+                    helpText = StringLoader::LoadLC(
+                        R_QTN_PHOB_NO_GROUPS_STORE, props->StoreName() );
+                    }
+                }
+
+            if ( !helpText )
+                {
+                CleanupStack::PopAndDestroy(); // uris
+                }
+            else
+                {
+                TInt newLength = text->Length()
+                               + KNewline().Length()
+                               + helpText->Length();
+
+                text = text->ReAllocL( newLength );
+                // note: no leaves beyond this point, otherwise
+                text->Des().Append( KNewline );
+                text->Des().Append( *helpText );
+
+                CleanupStack::PopAndDestroy( 2 ); // helpText, uris
+                // update the reallocated 'text' pointer in cleanup stack
+                CleanupStack::Pop(); // text
+                CleanupStack::PushL( text );
+                }
+            break;
+            }
+        default:
+            {
+            text = KNullDesC().AllocLC();
+            break;
+            }
+        }
+    if ( text )
+        {
+        iControl->SetTextL( *text );
+        CleanupStack::PopAndDestroy(); // text
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPguGroupView::HandleConfigurationChangeL
+// --------------------------------------------------------------------------
+//
+void CPguGroupView::HandleConfigurationChangeL()
+    {
+    // Force empty list text update after configuration change
+    UpdateListEmptyTextL();
+
+    UpdateCbasL();
+    if ( iContainer && iContainer->Control() )
+        {
+        iContainer->Control()->SetViewL
+            ( *Phonebook2::Pbk2AppUi()->ApplicationServices().
+                ViewSupplier().AllGroupsViewL() );
+        iContainer->Control()->DrawNow();
+        }
+    }
+
+
+// --------------------------------------------------------------------------
+// CPguGroupView::UiControlL
+// --------------------------------------------------------------------------
+//
+void CPguGroupView::CheckUiControlL()
+    {
+    
+    // check if we have invalid control 
+    if (iControl==NULL) 
+        {
+        // leave with bad handle error since iControl is missing
+        User::Leave(KErrBadHandle);
+        }
+    }
+
+
+// End of File