--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/menufw/menufwui/matrixmenu/src/mmappui.cpp Wed Sep 01 12:32:46 2010 +0100
@@ -0,0 +1,3075 @@
+/*
+* Copyright (c) 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: Application UI class
+* Version : %version: MM_176.1.28.1.83 % << Don't touch! Updated by Synergy at check-out.
+* Version : %version: MM_176.1.28.1.83 % << Don't touch! Updated by Synergy at check-out.
+*
+*/
+
+#include <e32base.h>
+#include <e32cmn.h>
+#include <avkon.hrh>
+#include <avkon.rsg>
+#include <akntitle.h>
+#include <eikmenub.h>
+#include <akntoolbar.h>
+#include <aknbutton.h>
+#include <e32hashtab.h>
+#include <layoutmetadata.cdl.h>
+#include <gulicon.h>
+#include <fbs.h>
+#include <eikcmbut.h>
+#include <hlplch.h>
+#include <aknlists.h>
+#include <StringLoader.h>
+#include <activeidle2domainpskeys.h>
+#include <UikonInternalPSKeys.h>
+#include <e32property.h>
+#include <AknTaskList.h>
+#include <AknSgcc.h> // for transition effects
+#include <featmgr.h>
+#include <matrixmenu.rsg>
+#include <akntabgrp.h>
+#include <apgcli.h>
+#include <AknDef.hrh>
+#include <AknDlgShut.h>
+#include <mmenuinternalPSkeys.h>
+#include <aknstyluspopupmenu.h> //stylus popup for long tap event
+#include <apgwgnam.h>
+
+#include "mmgui.hrh"
+#include "mmguiconstants.h"
+#include "mmappui.h"
+#include "menudebug.h"
+#include "hnengine.h"
+#include "hnglobals.h"
+#include "hnsuitemodelcontainer.h"
+#include "hnmenuitemmodel.h"
+#include "hntoolbarmodel.h"
+#include "hnbuttonmodel.h"
+#include "hnitemmodel.h"
+#include "hnconvutils.h"
+#include "hnsuitemodel.h"
+#include "hnmdbasekey.h"
+#include "hnmdkeyfactory.h"
+#include "mmwidgetcontainer.h"
+#include "mmtemplatelibrary.h"
+#include "mmextensionmanager.h"
+#include "hnitemsorder.h"
+
+#include "mmnomemory.h"
+#include "mmappkeyhandler.h"
+
+enum TMenuTransEffectContext
+ {
+ EMenuOpenFolderEffect = 1001,
+ EMenuCloseFolderEffect = 1002
+ };
+
+#define AI_UID3_AIFW_COMMON 0x102750F0
+
+// ============================ MEMBER FUNCTIONS =============================
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::ConstructL()
+ {
+ DEBUG(("_Mm_:CMmAppUi::ConstructL IN"));
+ MMPERF(("Test Logger speed..."));
+ MMPERF(("Test Logger speed - DONE"));
+ MMPERF(("GO!"));
+
+ //set matrix to be system app
+ iEikonEnv->SetSystem( ETrue );
+
+ TInt appUiFlags = AknLayoutUtils::PenEnabled() ?
+ EAknEnableSkin | EAknSingleClickCompatible :
+ EAknEnableSkin | EAknEnableMSK;
+ BaseConstructL( appUiFlags );
+ //hide Menu from TS at startup
+ HideApplicationFromFSW( ETrue );
+ isHiddenFromFS = ETrue;
+ FeatureManager::InitializeLibL();
+ iIsKastorEffectStarted = EFalse;
+ StartLayoutSwitchFullScreen( AknTransEffect::EApplicationStart );
+
+ RefreshUiPanesL( ETrue );
+ Cba()->MakeVisible( EFalse );
+ StatusPane()->SwitchLayoutL( R_AVKON_STATUS_PANE_LAYOUT_USUAL );
+
+ iDummyTemplateLib = CMmTemplateLibrary::NewL();
+ iDummyContainer = CMmWidgetContainer::NewGridContainerL( ClientRect(),
+ this, iDummyTemplateLib );
+ iDummyContainer->SetEmptyTextL( KNullDesC );
+ iDummyContainer->MakeVisible( EFalse );
+ AddToStackL( iDummyContainer, ECoeStackPriorityDefault,
+ ECoeStackFlagRefusesFocus | ECoeStackFlagRefusesAllKeys );
+
+ iHNInterface = CHnEngine::NewL( *this );
+ iTemplateLibrary = CMmTemplateLibrary::NewL();
+ InitializeL();
+
+ iMmExtManager = CMMExtensionManager::NewL( *this );
+
+ iScreenOn = ETrue;
+ iSkinChangeNeeded = EFalse;
+ iSkinChangeInProgress = EFalse;
+ iHasFocus = ETrue;
+
+ iSkinSrvSession.Connect(this);
+ iAppkeyHandler = CMmAppkeyHandler::NewL();
+
+ RProperty::Define( KMMenuPSCat, KMMenuLastViewKey, RProperty::EText );
+
+ MMPERF(("CMmAppUi::ConstructL - HN ready"));
+ DEBUG(("_Mm_:CMmAppUi::ConstructL OUT"));
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TBool CMmAppUi::IsRootdisplayedL()
+ {
+ TBool ret( EFalse );
+ if( iHNInterface && iHNInterface->GetSuiteModelsCountL() == KModelCountForRoot )
+ {
+ ret = ETrue;
+ }
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CMmAppUi::CMmAppUi()
+ {
+ // No implementation required
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CMmAppUi::~CMmAppUi()
+ {
+ DEBUG(("_Mm_:CMmAppUi::~CMmAppUi IN"));
+
+ delete iOutOfMemoryHandler;
+ if (iCurrentSuiteModel)
+ {
+ iCurrentSuiteModel->UnregisterSuiteObserver( this );
+ }
+ delete iToolbar;
+ iCascadeMenuMap.Close();
+ RemoveFromStack( iCurrentContainer );
+ RemoveFromStack( iDummyContainer );
+ iDummyContainer->MakeVisible( EFalse );
+ delete iDummyContainer;
+ ResetContainerMap();
+ iGarbage.ResetAndDestroy();
+ delete iHNInterface;
+ FeatureManager::UnInitializeLib();
+ delete iMmExtManager;
+ delete iTemplateLibrary;
+ delete iDummyTemplateLib;
+ delete iAppkeyHandler;
+ delete iPopupMenu;
+ iSkinSrvSession.Close();
+
+ MMPERF(("Matrix closed"));
+ DEBUG(("_Mm_:CMmAppUi::~CMmAppUi OUT"));
+
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::HandleResourceChangeL( TInt aType )
+ {
+ CAknAppUi::HandleResourceChangeL( aType );
+
+ //we're interested in layout change events
+ //only if container is available
+ if ( aType == KEikDynamicLayoutVariantSwitch &&
+ iCurrentContainer && iCurrentSuiteModel )
+ {
+ MMPERF(("Layout change START"));
+ // Do not call StartLayoutSwitchFullScreen(),
+ // layout switch effect is started automatically
+ iIsKastorEffectStarted = ETrue;
+ TInt lastItemIndex = iCurrentContainer->NumberOfItems() - 1;
+
+ if ( lastItemIndex >= 0 && iCurrentContainer->ItemIsFullyVisible( lastItemIndex )
+ && !iCurrentContainer->IsHighlightVisible() )
+ {
+ iCurrentContainer->SetManualHighlightL( lastItemIndex, EFalse );
+ }
+ else if( !iCurrentContainer->IsHighlightVisible()
+ && iCurrentContainer->Widget()->TopItemIndex() > -1)
+ {
+ iCurrentContainer->SetManualHighlightL(
+ iCurrentContainer->Widget()->TopItemIndex(), EFalse );
+ }
+
+ iCurrentContainer->SetRect( ClientRect() );
+ iDummyContainer->SetRect( ClientRect() );
+
+ THashMapIter< TInt, CMmWidgetContainer* > iterator( iContainerMap );
+ while( iterator.NextKey() )
+ {
+ CMmWidgetContainer* container = *iterator.CurrentValue();
+ if ( container != iCurrentContainer )
+ {
+ container->SetRect( ClientRect() );
+ container->HandleResourceChange( aType );
+ }
+ }
+ ShowSuiteL();
+ EndFullScreen();
+ MMPERF(("Layout change END"));
+ }
+
+ if ( aType == KEikMessageFadeAllWindows && iCurrentContainer )
+ {
+ iCurrentContainer->SetIsFaded( ETrue );
+ }
+ else if ( aType == KEikMessageUnfadeWindows && iCurrentContainer )
+ {
+ iCurrentContainer->SetIsFaded( EFalse );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TBool CMmAppUi::ProcessCommandParametersL( TApaCommand aCommand,
+ TFileName& aDocumentName,
+ const TDesC8& aTail )
+ {
+ DEBUG(("_Mm_:CMmAppUi::ProcessCommandParametersL IN"));
+ DEBUG8(("\t_Mm_:tail: %S", &aTail));
+
+ if ( aTail.Length() )
+ {
+ DEBUG(("\t_Mm_:call HandleMessageL"));
+ HandleMessageL( aTail );
+ }
+
+ TBool result = CEikAppUi::ProcessCommandParametersL( aCommand,
+ aDocumentName,
+ aTail );
+
+ MMPERF(("Matrix started and ready!"));
+ DEBUG(("_Mm_:CMmAppUi::ProcessCommandParametersL OUT"));
+ return result;
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::ProcessCommandL(TInt aCommand)
+ {
+ TBool ignoreCommand = EFalse;
+
+ // ignore options click in edit mode and intermediate states for non-touch
+ if ( aCommand == EAknSoftkeyOptions && iEditModeStatus != ENoEditMode &&
+ !AknLayoutUtils::PenEnabled() )
+ {
+ ignoreCommand = ETrue;
+ }
+
+ // ignore keyselect for non-touch while in edit mode or stopping edit mode
+ if ( aCommand == KKeyIdSelect && !AknLayoutUtils::PenEnabled() &&
+ ( iEditModeStatus == ETransitionFromEditMode || IsEditMode() ) )
+ {
+ ignoreCommand = ETrue;
+ }
+
+ if ( !ignoreCommand )
+ {
+ CAknAppUi::ProcessCommandL( aCommand );
+ }
+
+ if ( iCurrentContainer )
+ {
+ iCurrentContainer->EndLongTapL();
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::ProcessMessageL( TUid /*aUid*/, const TDesC8& aParams )
+ {
+ DEBUG(("_Mm_:CMmAppUi::ProcessMessageL IN"));
+ DEBUG8(("\t_Mm_:params: %S", &aParams));
+ MMPERF(("APA Message Recieved"));
+
+ // fix for the CR 417-35490
+ // Handle empty message sends by AVKON after app key press or switch
+ // to Menu via task swapper.
+ if( !aParams.Compare( KNullDesC8 ) )
+ {
+ if ( !iAppkeyHandler->IsActive() )
+ {
+ //make dummy container visible when returning
+ //to menu by AppKey
+ if( iDummyContainer && iCurrentContainer )
+ {
+ iDummyContainer->MakeVisible( ETrue );
+ RefreshUiPanesL( ETrue );
+ iCurrentContainer->MakeVisible( EFalse );
+ iDummyContainer->DrawNow();
+ }
+ CleanupForExitL( EExitKeyApplication );
+ User::LeaveIfError( iCoeEnv->WsSession().SetWindowGroupOrdinalPosition(
+ CEikonEnv::Static()->RootWin().Identifier(), 0 ) );
+ iAppkeyHandler->StartL();
+ }
+ }
+
+ // first refresh model, show afterwords
+ if ( aParams.Length() )
+ {
+ DEBUG(("\t_Mm_:call HandleMessageL"));
+ HandleMessageL( aParams );
+ }
+
+ MMPERF(("APA Message Processed"));
+ DEBUG(("_Mm_:CMmAppUi::ProcessMessageL OUT"));
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+MCoeMessageObserver::TMessageResponse CMmAppUi::HandleMessageL(
+ TUint32 aClientHandleOfTargetWindowGroup,
+ TUid aMessageUid,
+ const TDesC8& aMessageParameters )
+ {
+ if ( aMessageUid.iUid == KUidApaMessageSwitchOpenFileValue )
+ {
+ ProcessMessageL( aMessageUid, aMessageParameters );
+ return EMessageHandled;
+ }
+ else
+ {
+ return CAknAppUi::HandleMessageL(
+ aClientHandleOfTargetWindowGroup,
+ aMessageUid,
+ aMessageParameters );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::HandleCommandL( TInt aCommand )
+ {
+ DEBUG(("_Mm_:CMmAppUi::HandleCommandL IN"));
+ DEBUG(("\t_Mm_:aCommand: %d",aCommand));
+
+ // in case something has gone wrong
+ ClearTransitionFromEditModeFlag();
+
+ switch( aCommand )
+ {
+ case EEikCmdExit:
+ {
+ DEBUG(("\t_Mm_:EEikCmdExit"));
+ // Simply exit
+ Exit();
+ }
+ break;
+
+ case EMmOptionsExit:
+ {
+ MMPERF(("Options->Exit pressed"));
+ DEBUG(("\t_Mm_:EMmOptionsExit"));
+
+ //Check if it is a folder suite.If Yes really exit.
+ //Otherwise behave like LSK.
+ if( iCurrentSuiteModel &&
+ iCurrentSuiteModel->SuiteName().Compare( KFolderSuite) )
+ {
+ if( iCurrentSuiteModel->ExitMode() == EExitModeHide )
+ {
+ // hide and reset menu
+ TApaTaskList taskList( iCoeEnv->WsSession() );
+ TApaTask me = taskList.FindApp( KUidMatrixMenuApp );
+ me.SendToBackground();
+ CleanupForExitL( EExitKeyApplication );
+ }
+ else
+ {
+ StartLayoutSwitchFullScreen( EMenuCloseFolderEffect );
+ HandleBackCommandL();
+ }
+ }
+ else
+ {
+ ExitMatrix( EExitReally );
+ }
+ }
+ break;
+
+ case EAknSoftkeyExit:
+ {
+ MMPERF(("SoftkeyExit pressed"));
+ DEBUG(("\t_Mm_:EAknSoftkeyExit"));
+ ExitMatrix( EExitToPhone );
+ }
+ break;
+
+ case EAknSoftkeyBack:
+ {
+ StartLayoutSwitchFullScreen( EMenuCloseFolderEffect );
+
+ if( iCurrentSuiteModel && iCurrentSuiteModel->ExitMode() == EExitModeHide )
+ {
+ // hide and reset menu
+ TApaTaskList taskList( iCoeEnv->WsSession() );
+ TApaTask me = taskList.FindApp( KUidMatrixMenuApp );
+ me.SendToBackground();
+ if ( iCurrentContainer )
+ {
+ iCurrentContainer->MakeVisible( EFalse );
+ }
+ iDummyContainer->MakeVisible( ETrue );
+ RefreshCbaL();
+ iDummyContainer->DrawNow();
+ CleanupForExitL( EExitKeyApplication );
+ }
+ else if( iCurrentSuiteModel )
+ {
+ HandleBackCommandL();
+ }
+ }
+ break;
+
+ case EAknSoftkeyOk:
+ case EAknSoftkeyDone:
+ {
+ ASSERT( IsEditMode() );
+ SetEditModeL( EFalse );
+ }
+ break;
+ default:
+ {
+ ForwardEventToHNL( aCommand );
+ }
+ break;
+ }
+ DEBUG(("_Mm_:CMmAppUi::HandleCommandL OUT"));
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::HandleBackCommandL()
+ {
+ DEBUG(("_Mm_:CMmAppUi::HandleBackCommandL IN"));
+ MMPERF(("CMmAppUi::HandleBackCommandL - START"));
+ DEBUG16(("\t_Mm_:current genre: %S",&iCurrentSuiteModel->SuiteName()));
+
+ iDummyContainer->MakeVisible( ETrue );
+ RefreshUiPanesL( ETrue );
+ iCurrentContainer->MakeVisible( EFalse );
+ iDummyContainer->DrawNow();
+
+ iHNInterface->HandleBackEventL( iCurrentSuiteModel->SuiteName() );
+
+ MMPERF(("CMmAppUi::HandleBackCommandL - DONE"));
+ DEBUG(("_Mm_:CMmAppUi::HandleBackCommandL OUT"));
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CMmWidgetContainer* CMmAppUi::GetAppropriateContainerToLoadL()
+ {
+ CMmWidgetContainer* retContainer = NULL;
+ if ( iCurrentSuiteModel )
+ {
+ TInt currentSuiteId = iCurrentSuiteModel->GetItemsOrder()->GetSuiteId();
+
+ CMmWidgetContainer** ret = iContainerMap.Find( currentSuiteId );
+ retContainer = (ret) ? *ret : NULL;
+
+ if ( ret && (*ret)->WidgetType() != iCurrentSuiteModel->WidgetType() )
+ {
+ iMakeHightlightedItemFullyVisible = ETrue;
+ iGarbage.AppendL( *ret );
+ iContainerMap.Remove(
+ iCurrentSuiteModel->GetItemsOrder()->GetSuiteId() );
+ retContainer = NULL;
+ }
+ }
+ return retContainer;
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::ShowSuiteL()
+ {
+ DEBUG(("_Mm_:CMmAppUi::ShowSuiteL IN"));
+// DEBUG16(("\t_Mm_:current genre: %S", &iCurrentSuiteModel->SuiteName()));
+
+ if ( iCurrentSuiteModel )
+ {
+ CMmWidgetContainer* containerToLoad = GetAppropriateContainerToLoadL();
+ TBool makeHandlePresentationChange( ETrue );
+
+ if (!containerToLoad)
+ {
+ makeHandlePresentationChange = CreateNewContainerL(
+ iCurrentSuiteModel, containerToLoad );
+ }
+
+ if( makeHandlePresentationChange )
+ {
+ HandlePresentationChangeL( containerToLoad );
+ }
+ }
+
+ DEBUG(("_Mm_:CMmAppUi::ShowSuiteL OUT"));
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TBool CMmAppUi::CreateNewContainerL(
+ CHnSuiteModel* aSuiteModel, CMmWidgetContainer*& aContainerToLoad )
+ {
+ TRect rect = ClientRect();
+ switch( aSuiteModel->WidgetType() )
+ {
+ case ECoverFlowWidget :
+ case EGridWidget :
+ aContainerToLoad = CMmWidgetContainer::NewGridContainerL(
+ rect, this, iTemplateLibrary );
+ break;
+ case EListWidget :
+ aContainerToLoad = CMmWidgetContainer::NewListBoxContainerL(
+ rect, this, iTemplateLibrary );
+ break;
+ case EUnspecified:
+ default:
+ return EFalse;
+ }
+ aContainerToLoad->SetLongTapObserver(this);
+ aContainerToLoad->HandleItemAdditionL();
+ iContainerMap.InsertL(
+ aSuiteModel->GetItemsOrder()->GetSuiteId(),
+ aContainerToLoad );
+ return ETrue;
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::ForwardEventToHNL( TInt aEvent, TInt aItemId,
+ CLiwGenericParamList* aEventParams )
+ {
+ DEBUG(("\t_Mm_:event ID: %d for item ID %d", aEvent, aItemId));
+
+ TInt id = iCurrentSuiteModel->IdByIndex( aItemId );
+ if ( id >= 0 )
+ {
+ MMPERF(("Handling event %d for item %d - START",aEvent,aItemId));
+
+ if( aEvent == KKeyIdSelect )
+ {
+ MMPERF(("This is a 'select' event"));
+
+ TInt modelId = iCurrentSuiteModel->IdByIndex( aItemId );
+ CHnItemModel* itemModel =
+ iCurrentSuiteModel->GetItemModel( modelId );
+ TInt effect = GetKastorEffectL( itemModel );
+ TRect rect = GetKastorRectL( itemModel, aItemId );
+ TUid appUid = itemModel->GetItemType() == EItemTypeApplication ?
+ itemModel->GetItemUid() : KUidMatrixMenuApp;
+
+ if (iScreenOn && IsForeground() && effect
+ != AknTransEffect::ENone)
+ {
+ DEBUG(("_MM_:CMmAppUi::ForwardEventToHNL Foreground"));
+ GfxTransEffect::BeginFullScreen(
+ effect, rect,
+ AknTransEffect::EParameterType,
+ AknTransEffect::GfxTransParam( appUid , KUidMatrixMenuApp ) );
+ }
+ }
+
+ iHNInterface->TriggerHnEventL( aEvent, id, aEventParams );
+ MMPERF(("Handling event - END"));
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TInt CMmAppUi::GetKastorEffectL( CHnItemModel* aItemModel )
+ {
+ TInt effect( AknTransEffect::ENone );
+ if ((IsEditMode() || iEditModeStatus == ETransitionFromEditMode)
+ && !AknLayoutUtils::PenEnabled())
+ {
+ return effect;
+ }
+ switch( aItemModel->GetItemType() )
+ {
+ case EItemTypeApplication:
+ {
+ if( !IsEditMode() && !aItemModel->IsDrmExpired() )
+ {
+ if( aItemModel->IsRunning() )
+ {
+ effect = AknTransEffect::EApplicationStartSwitchRect;
+ }
+ else
+ {
+ effect = AknTransEffect::EApplicationStartRect;
+ }
+ }
+ break;
+ }
+ case EItemTypeSuite:
+ {
+ if( !IsEditMode() )
+ {
+ effect = EMenuOpenFolderEffect;
+ iIsKastorEffectStarted = ETrue;
+ }
+ break;
+ }
+ case EItemTypeParentFolder:
+ {
+ effect = EMenuCloseFolderEffect;
+ iIsKastorEffectStarted = ETrue;
+ break;
+ }
+ case EItemTypeFolder:
+ {
+ if (!(IsEditMode() && aItemModel->IsDeleteLocked()))
+ {
+ effect = EMenuOpenFolderEffect;
+ iIsKastorEffectStarted = ETrue;
+ }
+ break;
+ }
+ case EItemTypeUnknown:
+ default:
+ {
+ effect = AknTransEffect::ENone;
+ break;
+ }
+ }
+ return effect;
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TRect CMmAppUi::GetKastorRectL( CHnItemModel* aItemModel, TInt aItemId )
+ {
+ TRect rect = TRect();
+ if( aItemModel->GetItemType() == EItemTypeApplication )
+ {
+ rect = iCurrentContainer->GetItemRectL( aItemId );
+ RRegion region; CleanupClosePushL( region );
+ StatusPane()->GetShapeL( region, true, true );
+ TInt statusPaneHeight = region.BoundingRect().Height();
+ rect.iBr.iY += statusPaneHeight;
+ rect.iTl.iY += statusPaneHeight;
+ CleanupStack::PopAndDestroy( ®ion );
+ }
+ return rect;
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::ForwardEventToHNL( TInt aEvent )
+ {
+ DEBUG(("_Mm_:CMmAppUi::ForwardEventToHNL IN"));
+ DEBUG(("\t_Mm_:event ID: %d", aEvent));
+
+ if ( iCurrentContainer )
+ {
+ TBool idByContainer = iCurrentContainer->IsHighlightVisible() &&
+ iCurrentContainer->GetSuiteModelL()->GetItemModelsCount() > 1;
+ TInt current = idByContainer ?
+ iCurrentContainer->GetHighlight():
+ iCurrentContainer->GetSuiteModelL()->GetSuiteHighlight();
+ ForwardEventToHNL( aEvent, current );
+ }
+
+ DEBUG(("_Mm_:CMmAppUi::ForwardEventToHNL OUT"));
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::NotifyUiRefreshL( const THnUiRefreshType aRefreshType )
+ {
+ DEBUG(("_Mm_:CMmAppUi::NotifyUiRefreshL IN"));
+ DEBUG(("\t_Mm_:refresh type: %d", aRefreshType));
+
+ switch (aRefreshType)
+ {
+ case ERefreshSuite:
+ TRAPD( err, ShowSuiteL() );
+ if ( KErrNoMemory == err )
+ {
+ HandleOutOfMemoryL();
+ User::Leave( KErrNoMemory );
+ }
+ break;
+ case ERefreshToolbar:
+ RefreshToolbarL();
+ break;
+ case EStartEditMode:
+ SetEditModeL( ETrue );
+ break;
+ case EStopEditMode:
+ SetEditModeL( EFalse );
+ break;
+ case EForegroundGain:
+ {
+ DEBUG(("_MM_:CMmAppUi::NotifyUiRefreshL Foreground"));
+ TApaTaskList taskList( iCoeEnv->WsSession() );
+ TApaTask me = taskList.FindApp( KUidMatrixMenuApp );
+ me.BringToForeground();
+ }
+ break;
+ case EBackgroundGain:
+ {
+ DEBUG(("_MM_:CMmAppUi::NotifyUiRefreshL Foreground"));
+ TApaTaskList taskList( iCoeEnv->WsSession() );
+ TApaTask me = taskList.FindApp( KUidMatrixMenuApp );
+ me.SendToBackground();
+ }
+ break;
+ case ELightOn:
+ {
+ DEBUG(("_Mm_:CMmAppUi::NotifyUiRefreshL - ELightOn"));
+ iScreenOn = ETrue;
+ if ( iCurrentContainer )
+ {
+ iCurrentContainer->HandleForegroundGainedL();
+ }
+ }
+ break;
+ case ELightOff:
+ {
+ DEBUG(("_Mm_:CMmAppUi::NotifyUiRefreshL - ELightOff"));
+ iScreenOn = EFalse;
+ if (iCurrentContainer)
+ {
+ iCurrentContainer->HandleBackgroundGainedL();
+ if (IsEditMode() && iCurrentContainer->IsDraggable())
+ {
+ iCurrentContainer->CancelDragL(EFalse);
+ }
+ }
+ }
+ break;
+ case ERemoveLiwObjects:
+ {
+ THashMapIter< TInt, CMmWidgetContainer* > iterator( iContainerMap );
+ while( iterator.NextKey() )
+ {
+ CMmWidgetContainer** container = iterator.CurrentValue();
+ (*container)->RemoveLiwObjects();
+ }
+ }
+ break;
+ default:
+ ASSERT( false );
+ }
+ DEBUG(("_Mm_:CMmAppUi::NotifyUiRefreshL OUT"));
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::RefreshToolbarL()
+ {
+ DEBUG(("_Mm_:CMmAppUi::RefreshToolbarL IN"));
+ HandleToolbarVisibilityL();
+ UpdateToolbarL();
+ DEBUG(("_Mm_:CMmAppUi::RefreshToolbarL OUT"));
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::RefreshUiPanesL( TBool aReset )
+ {
+ // refresh status pane
+ CAknTitlePane* titlePane =
+ static_cast<CAknTitlePane*>(
+ StatusPane()->ControlL(
+ TUid::Uid( EEikStatusPaneUidTitle ) ) );
+
+ if( aReset )
+ {
+ titlePane->SetTextL( KNullDesC );
+ }
+ else
+ {
+ if ( IsEditMode() && iCurrentSuiteModel )
+ {
+ HBufC* title = NULL;
+ if ( IsRootdisplayedL() )
+ {
+ title = StringLoader::LoadLC( R_ORG_ROOT_EDITING_TITLE );
+ }
+ else
+ {
+ title = StringLoader::LoadLC(
+ R_ORG_FOLDER_EDITING_TITLE,
+ iCurrentSuiteModel->Title() );
+ }
+ ASSERT( title );
+ titlePane->SetTextL( title->Des() );
+ CleanupStack::PopAndDestroy( title );
+ }
+ else if ( iCurrentSuiteModel && iCurrentContainer )
+ {
+ // refresh status pane
+ titlePane->SetTextL( iCurrentSuiteModel->Title() );
+
+ // inform AVKON about current suite to allow proper handling
+ // of AppKey and FSW
+ RProperty::Set( KMMenuPSCat, KMMenuLastViewKey, iCurrentSuiteModel->SuiteName() );
+ }
+ else
+ {
+ titlePane->SetTextL( KNullDesC );
+ }
+ }
+
+ RefreshCbaL();
+ SetMiddleSoftKeyL();
+
+ StatusPane()->DrawNow();
+ Cba()->DrawNow();
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::RefreshCbaL()
+ {
+ if ( ( iDummyContainer && iDummyContainer->IsVisible() ) ||
+ !iCurrentSuiteModel )
+ {
+ // R_MENU_SOFTKEYS_EMPTY__EMPTY looks much better than
+ // R_AVKON_SOFTKEYS_EMPTY
+ Cba()->SetCommandSetL( R_MENU_SOFTKEYS_EMPTY__EMPTY );
+ }
+ else
+ {
+ if ( IsEditMode() )
+ {
+ Cba()->SetCommandSetL( AknLayoutUtils::PenEnabled() ?
+ R_AVKON_SOFTKEYS_OPTIONS_DONE :
+ R_AVKON_SOFTKEYS_OK_EMPTY__OK );
+ }
+ else if ( IsRootdisplayedL() )
+ {
+ Cba()->SetCommandSetL( AknLayoutUtils::PenEnabled() ?
+ R_AVKON_SOFTKEYS_OPTIONS_EXIT :
+ R_AVKON_SOFTKEYS_OPTIONS_EXIT__SELECT );
+ }
+ else if ( iCurrentSuiteModel &&
+ iCurrentSuiteModel->SuiteName().Compare(KParamFolderSuite) )
+ {
+ Cba()->SetCommandSetL( AknLayoutUtils::PenEnabled() ?
+ R_MENU_SOFTKEYS_OPTIONS_BEXIT :
+ R_MENU_SOFTKEYS_OPTIONS_BEXIT__SELECT );
+ }
+ else
+ {
+ Cba()->SetCommandSetL( AknLayoutUtils::PenEnabled() ?
+ R_AVKON_SOFTKEYS_OPTIONS_BACK :
+ R_AVKON_SOFTKEYS_OPTIONS_BACK__SELECT );
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TKeyResponse CMmAppUi::HandleKeyPressedL( const TKeyEvent &aKeyEvent,
+ TEventCode aType )
+ {
+ TKeyResponse resp = EKeyWasNotConsumed;
+
+ // handling enter key - touch & non touch
+ if ( ( aKeyEvent.iScanCode == EStdKeyEnter ||
+ aKeyEvent.iScanCode == EStdKeyNkpEnter ||
+ aKeyEvent.iScanCode == EStdKeyDevice3 ) && aType == EEventKeyDown )
+ {
+ if ( iCurrentContainer->IsHighlightVisible() )
+ {
+ DEBUG(("_Mm_:CMmAppUi::HandleKeyPressedL - enter"));
+ ForwardEventToHNL( KKeyIdSelect );
+ resp = EKeyWasConsumed;
+ }
+ }
+
+ //handling enter key - non touch / edit mode
+ if ( ( aKeyEvent.iScanCode == EStdKeyEnter ||
+ aKeyEvent.iScanCode == EStdKeyDevice3 ) &&
+ aType == EEventKeyDown &&
+ IsEditMode() && !Layout_Meta_Data::IsPenEnabled() )
+ {
+ DEBUG(("_Mm_:CMmAppUi::HandleKeyPressedL - enter in edit mode"));
+ HandleCommandL( EAknSoftkeyOk );
+ resp = EKeyWasConsumed;
+ }
+
+ // handle the key exactly as container does (the same conditions)
+ if ( ( aKeyEvent.iRepeats > 0 && aType == EEventKey ) ||
+ ( aKeyEvent.iRepeats == 0 && aType == EEventKeyUp ) )
+ {
+ TBool navigationEvent =
+ aKeyEvent.iScanCode == EStdKeyRightArrow ||
+ aKeyEvent.iScanCode == EStdKeyLeftArrow ||
+ aKeyEvent.iScanCode == EStdKeyUpArrow ||
+ aKeyEvent.iScanCode == EStdKeyDownArrow;
+
+ if ( navigationEvent )
+ {
+ DEBUG(("_Mm_:CMmAppUi::HandleKeyPressedL - navi event: %d",
+ aKeyEvent.iScanCode));
+ MMPERF(("Rocker navigation - START"));
+ UpdateToolbarL();
+ SetMiddleSoftKeyL();
+ resp = EKeyWasConsumed;
+ MMPERF(("Rocker navigation - END"));
+ }
+ else if ( aKeyEvent.iScanCode == EStdKeyBackspace )
+ {
+ // handle clear key event
+ DEBUG(("_Mm_:CMmAppUi::HandleKeyPressedL - clear key"));
+ ForwardEventToHNL( KKeyIdClear );
+ resp = EKeyWasConsumed;
+ }
+ }
+
+ if( aType == EEventUser )
+ {
+ if ( aKeyEvent.iScanCode == EStdKeyNull &&
+ iCurrentContainer->IsHighlightVisible() )
+ {
+ DEBUG(("_Mm_:CMmAppUi::HandleKeyPressedL - User press -> forward key:select to HN"));
+ UpdateToolbarL();
+ SetMiddleSoftKeyL();
+ ForwardEventToHNL( KKeyIdSelect );
+ resp = EKeyWasConsumed;
+ }
+ }
+
+ return resp;
+ }
+
+// -----------------------------------------------------------------------------
+//
+//
+// -----------------------------------------------------------------------------
+//
+void CMmAppUi::HandleDragStartL( TInt aModelItemIndex )
+ {
+ MMPERF(("CMmAppUi::HandleDragStartL - START"));
+
+ if ( IsEditMode() )
+ {
+
+ TInt modelId = iCurrentSuiteModel->IdByIndex( aModelItemIndex );
+ if (modelId != KErrNotFound)
+ {
+ CHnItemModel *itModel = iCurrentSuiteModel->GetItemModel( modelId );
+ if (itModel->GetItemType() == EItemTypeParentFolder)
+ {
+ iCurrentContainer->CancelDragL( EFalse );
+ }
+ else
+ {
+ iItemDragged = aModelItemIndex;
+ iIdDragged = iCurrentSuiteModel->IdByIndex( aModelItemIndex );
+ }
+ }
+ }
+ MMPERF(("CMmAppUi::HandleDragStartL - STOP"));
+ }
+
+// -----------------------------------------------------------------------------
+//
+//
+// -----------------------------------------------------------------------------
+//
+void CMmAppUi::HandleDragOverL( TInt /* aModelItemIndex */ )
+ {
+ MMPERF(("CMmAppUi::HandleDragOverL - START"));
+
+ MMPERF(("CMmAppUi::HandleDragOverL - STOP"));
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmAppUi::HandleDraggedIndexUpdatedL( TInt aModelItemIndex )
+ {
+ MMPERF(("CMmAppUi::HandleDraggedIndexUpdatedL - START"));
+ iItemDragged = aModelItemIndex;
+ MMPERF(("CMmAppUi::HandleDraggedIndexUpdatedL - STOP"));
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmAppUi::HandleDragStopL( TInt aModelItemIndex )
+ {
+ MMPERF(("CMmAppUi::HandleDragStopL - START"));
+ if( IsEditMode() )
+ {
+ TInt itemId = iCurrentSuiteModel->IdByIndex( aModelItemIndex );
+ TMcsItemType typeCurr =
+ iCurrentSuiteModel->GetItemType( aModelItemIndex );
+ TBool isOverFolder = ( AknLayoutUtils::PenEnabled() &&
+ ( typeCurr == EItemTypeParentFolder || typeCurr == EItemTypeFolder ) );
+ TBool isDeleteLocked = (itemId != KErrNotFound)
+ ? iCurrentSuiteModel->GetItemModel( itemId )->IsDeleteLocked()
+ : EFalse;
+
+ TBuf8<KMaxLength> beforeCustomId;
+ beforeCustomId.Num( KErrNotFound );
+ if( aModelItemIndex + 1 < iCurrentContainer->NumberOfItems() )
+ {
+ beforeCustomId.Num( iCurrentSuiteModel->GetItemModel(
+ iCurrentSuiteModel->IdByIndex( aModelItemIndex + 1 ) )->CustomId() );
+ }
+
+ TBuf8<KMaxLength> draggedCustomId;
+ draggedCustomId.Num( KErrNotFound );
+ CHnItemModel* draggedModel = iCurrentSuiteModel->GetItemModel( iIdDragged );
+ if( draggedModel )
+ {
+ draggedCustomId.Num( iCurrentSuiteModel->GetItemModel( iIdDragged )->CustomId() );
+ }
+
+ CLiwGenericParamList* eventParameters = CLiwGenericParamList::NewL();
+ CleanupStack::PushL( eventParameters );
+ CHnMdBaseKey* tempKeys = HnMdKeyFactory::CreateL(
+ HnEvent::KEventArgNamespace8(), KKeyTypeMap(), KNullDesC8() );
+ CleanupStack::PushL( tempKeys );
+
+ CHnMdBaseKey* baseKey = HnMdKeyFactory::CreateL(
+ HnEvent::KEventArgNamespace8(), KKeyTypeMap(), KNullDesC8() );
+ CleanupStack::PushL( baseKey );
+ baseKey->AddSubKeyL( HnMdKeyFactory::CreateL( HnEvent::KDroppedBefore8(),
+ KKeyTypeInteger(), beforeCustomId ) );
+ baseKey->AddSubKeyL( HnMdKeyFactory::CreateL( HnEvent::KDragged8(),
+ KKeyTypeInteger(), draggedCustomId ) );
+ CleanupStack::Pop( baseKey );
+ tempKeys->AddSubKeyL( baseKey );
+
+ tempKeys->ToGenericParamListL( *eventParameters );
+ CleanupStack::PopAndDestroy( tempKeys );
+
+ TBool allowMoveInto = iCurrentContainer->AllowMove();
+
+ if( iIdDragged != itemId && isOverFolder && !isDeleteLocked
+ && allowMoveInto )
+ {
+ iCurrentSuiteModel->RemoveItemL( iIdDragged );
+ if( iItemDragged < aModelItemIndex )
+ {
+ // indices of all items after iItemDragged have been
+ // decreased when the dragged item got removed from the
+ // current suite; prevent highlighted item change
+ iCurrentSuiteModel->SetSuiteHighlightL( aModelItemIndex - 1 );
+ iCurrentContainer->SetManualHighlightL(
+ iCurrentContainer->GetHighlight() - 1, EFalse );
+ }
+
+ iCurrentContainer->HandleItemRemovalL();
+ iCurrentContainer->CancelDragL( EFalse );
+
+ iHNInterface->TriggerHnEventL( KKeyIdMoveInto, itemId, eventParameters );
+ iMakeHightlightedItemFullyVisible = ETrue;
+ }
+ else if( iIdDragged == itemId )
+ {
+ iCurrentContainer->CancelDragL( ETrue );
+ iCurrentContainer->SetTriggerMoveItemL( itemId, eventParameters );
+ // fix for: edit->move, then LSK->Up->LSK->LSK FAST... (short options show up)
+ if( !AknLayoutUtils::PenEnabled() )
+ {
+ CLiwGenericParamList* paramList = CLiwGenericParamList::NewLC();
+ TLiwGenericParam command(KHnRequest, TLiwVariant( KEvaluateMdModel));
+ paramList->AppendL( command );
+ HandleRequestL( *paramList );
+ CleanupStack::PopAndDestroy( paramList );
+ }
+ }
+ else
+ {
+ iCurrentContainer->CancelDragL( ETrue );
+ if( !AknLayoutUtils::PenEnabled() )
+ {
+ CLiwGenericParamList* paramList = CLiwGenericParamList::NewLC();
+ TLiwGenericParam command(KHnRequest, TLiwVariant( KEvaluateMdModel));
+ paramList->AppendL( command );
+ HandleRequestL( *paramList );
+ CleanupStack::PopAndDestroy( paramList );
+ }
+ }
+
+ CleanupStack::PopAndDestroy( eventParameters );
+ }
+ MMPERF(("CMmAppUi::HandleDragStopL - STOP"));
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::HandleEventDraggingActionedL()
+ {
+ SetMiddleSoftKeyL();
+ UpdateToolbarL();
+ iKeyClickLocked = ETrue;
+ }
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::HandleListBoxEventL( CEikListBox* /*aListBox*/,
+ MEikListBoxObserver::TListBoxEvent aEventType )
+ {
+ DEBUG(("_Mm_:CMmAppUi::HandleListBoxEventL IN"));
+ DEBUG(("\t_Mm_: aEventType = %d", (TInt) aEventType ) );
+
+ TInt currentHighlight = iCurrentContainer->GetHighlight();
+
+ DEBUG(("\t_Mm_: CurrentHighlight = %d", currentHighlight ) );
+
+ if ( aEventType == MEikListBoxObserver::EEventItemDraggingActioned )
+ {
+ DEBUG8(("\t_Mm_:CMmAppUi::HandleListBoxEventL EEventItemDraggingActioned"));
+ HandleEventDraggingActionedL();
+ }
+ else if ( aEventType == MEikListBoxObserver::EEventPenDownOnItem )
+ {
+ DEBUG(("\t_Mm_:CMmAppUi::HandleListBoxEventL EEventItemClicked"));
+ HandleHighlightItemPenDownL( iCurrentContainer->GetHighlight() );
+ }
+ else if ( aEventType == MEikListBoxObserver::EEventItemDoubleClicked )
+ {
+ DEBUG(("\t_Mm_:CMmAppUi::HandleListBoxEventL EEventItemDoubleClicked"));
+ HandleHighlightItemDoubleClickedL( iCurrentContainer->GetHighlight() );
+ }
+ else if ( aEventType == MEikListBoxObserver::EEventItemSingleClicked )
+ {
+ DEBUG(("\t_Mm_:CMmAppUi::HandleListBoxEventL EEventItemSingleClicked"));
+ HandleHighlightItemSingleClickedL( iCurrentContainer->Widget()->CurrentItemIndex() );
+ }
+ else if ( aEventType == MEikListBoxObserver::EEventPanningStarted )
+ {
+ iKeyClickLocked = ETrue;
+ }
+
+ DEBUG(("_Mm_:CMmAppUi::HandleListBoxEventL OUT"));
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::HandleLongTapEventL( const TPoint& aPenEventLocation )
+ {
+ TBool popupMenuDisplayed(EFalse);
+ if (iPopupMenu)
+ {
+ delete iPopupMenu;
+ iPopupMenu = NULL;
+ }
+ iPopupMenu = CAknStylusPopUpMenu::NewL(this,aPenEventLocation);
+
+ if ( AknLayoutUtils::LayoutMirrored() )
+ {
+ iPopupMenu->SetPosition( aPenEventLocation,
+ CAknStylusPopUpMenu::EPositionTypeRightBottom );
+ }
+ else
+ {
+ iPopupMenu->SetPosition( aPenEventLocation,
+ CAknStylusPopUpMenu::EPositionTypeLeftBottom );
+ }
+
+ if( iCurrentSuiteModel == iHNInterface->GetLastSuiteModelL()
+ && iCurrentContainer->IsHighlightVisible()
+ && iCurrentContainer->GetSuiteModelL()->GetItemModelsCount() > 1 )
+ {
+ MMPERF(("CMmAppUi::DynInitMenuPaneL - START"));
+ //fill the main menu structure, look for cascade menus
+ //reset the helper hash map
+ iCascadeMenuMap.Close();
+
+ MHnMenuItemModelIterator* menuIterator =
+ iCurrentSuiteModel->GetMenuStructureL(
+ iCurrentSuiteModel->IdByIndex(
+ iCurrentContainer->GetHighlight() ) );
+
+ // check if there is a menu structure available
+ // for the specified item
+ if ( menuIterator )
+ {
+ //create item sorting helper objects
+ RArray<TInt> positionArray;
+ CleanupClosePushL( positionArray );
+ RHashMap<TInt, CEikMenuPaneItem::SData> menuItemMap;
+ CleanupClosePushL( menuItemMap );
+
+ while ( menuIterator->HasNextSpecific() )
+ {
+ CHnMenuItemModel* childItem = menuIterator->GetNextSpecific();
+ CEikMenuPaneItem::SData childData;
+ childData.iCommandId = childItem->Command();
+ childData.iText = childItem->NameL().
+ Left( CEikMenuPaneItem::SData::ENominalTextLength );
+ childData.iFlags = 0;
+ childData.iCascadeId = 0;
+
+ positionArray.AppendL( childItem->Position() );
+ menuItemMap.InsertL( childItem->Position(), childData );
+ }
+
+ positionArray.Sort();
+
+ //add items in correct order
+ for ( TInt i = 0; i < positionArray.Count(); ++i )
+ {
+ iPopupMenu->AddMenuItemL(
+ menuItemMap.FindL( positionArray[i] ).iText,
+ menuItemMap.FindL( positionArray[i] ).iCommandId );
+ }
+
+ if (positionArray.Count()>0)
+ {
+ iPopupMenu->ShowMenu();
+ popupMenuDisplayed = ETrue;
+ }
+ CleanupStack::PopAndDestroy( &menuItemMap );
+ CleanupStack::PopAndDestroy( &positionArray );
+ }
+ MMPERF(("CMmAppUi::DynInitMenuPaneL - STOP"));
+ }
+
+ if ( !popupMenuDisplayed && iCurrentContainer )
+ {
+ iCurrentContainer->EndLongTapL( ETrue );
+ HandleHighlightItemSingleClickedL(
+ iCurrentContainer->Widget()->CurrentItemIndex() );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::HandleHighlightItemDoubleClickedL( TInt aIndex )
+ {
+ if ( iKeyClickLocked )
+ return;
+
+ if ( iCurrentSuiteModel->WidgetType() == EListWidget
+ && iCurrentContainer->GetPreviousHighlight() == aIndex )
+ {
+ ForwardEventToHNL( KKeyIdSelect, aIndex );
+ }
+ else if ( iCurrentSuiteModel->WidgetType() == EGridWidget
+ && IsEditMode() && iCurrentContainer->GetPreviousHighlight() == aIndex
+ && !iCurrentContainer->IsDraggable())
+ {
+ ForwardEventToHNL( KKeyIdSelect, aIndex );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::HandleHighlightItemPenDownL( TInt /* aIndex */ )
+ {
+ DEBUG(("CMmAppUi::HandleHighlightItemPenDownL - IN"));
+ UpdateToolbarL();
+ SetMiddleSoftKeyL();
+ iKeyClickLocked = EFalse;
+ DEBUG(("CMmAppUi::HandleHighlightItemPenDownL - OUT"));
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::HandleHighlightItemSingleClickedL( TInt aIndex )
+ {
+ if ( !iKeyClickLocked && !IsFaded() )
+ {
+ ForwardEventToHNL( KKeyIdSelect, aIndex );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::ResetContainerMap()
+ {
+ THashMapIter< TInt, CMmWidgetContainer* > iterator( iContainerMap );
+ while( iterator.NextKey() )
+ {
+ CMmWidgetContainer** container = iterator.CurrentValue();
+ delete *container;
+ iterator.RemoveCurrent();
+ }
+ iContainerMap.Close();
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::ResetContainerMapToRootL()
+ {
+ TInt err( KErrNone );
+ CHnSuiteModel* currentSuite = iHNInterface->GetLastSuiteModelL();
+
+ // there is a loaded suite configuration
+ if( currentSuite )
+ {
+ TInt id( currentSuite->GetItemsOrder()->GetSuiteId() );
+ TRAP( err, iCurrentContainer = iContainerMap.FindL( id ) );
+
+ // configuration loaded but there is no container
+ if( err != KErrNone )
+ {
+ HandleSuiteModelInitializedL( currentSuite );
+ }
+ else if( iContainerMap.Count() > 0 )
+ {
+ THashMapIter< TInt, CMmWidgetContainer* > iterator( iContainerMap );
+ while( iterator.NextKey() )
+ {
+ CMmWidgetContainer** container = iterator.CurrentValue();
+ if( iCurrentContainer != *container )
+ {
+ RemoveFromStack( *container );
+ iGarbage.AppendL( *container );
+ iterator.RemoveCurrent();
+ }
+ }
+ }
+ }
+ else
+ {
+ ResetContainerMap();
+ InitializeL();
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::HandleMessageL( const TDesC8& aMessage )
+ {
+ if( iMmExtManager )
+ {
+ iMmExtManager->ExecuteActionL(TUid::Null(), KCommandDeleteDialog, NULL );
+ }
+ if ( IsEditMode() )
+ {
+ SetEditModeL( EFalse );
+ }
+ if ( aMessage.Find( KRootWithPref ) != KErrNotFound )
+ {
+ RemoveFromStack( iCurrentContainer );
+ iDummyContainer->MakeVisible( ETrue );
+ RefreshCbaL();
+ iGarbage.ResetAndDestroy();
+ ResetContainerMap();
+ iCurrentSuiteModel = NULL;
+ iCurrentContainer = NULL;
+ }
+
+ TRAPD( err, iHNInterface->LoadSuitesFromUriL( aMessage ) );
+
+ if ( err && iCurrentContainer && ( aMessage.Find( KSetFocusWithPref ) == KErrNotFound ) )
+ {
+ HandleSuiteEventL( ESuiteModelInitialized, iHNInterface->GetLastSuiteModelL() );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::DynInitMenuPaneL( TInt aResourceId,
+ CEikMenuPane* aMenuPane )
+ {
+ aMenuPane->EnableMarqueeL( ETrue );
+ if( iCurrentSuiteModel == iHNInterface->GetLastSuiteModelL() )
+ {
+ switch ( aResourceId )
+ {
+ case R_MAIN_MENU_PANE:
+ {
+ MMPERF(("CMmAppUi::DynInitMenuPaneL - START"));
+ //fill the main menu structure, look for cascade menus
+ //reset the helper hash map
+ iCascadeMenuMap.Close();
+
+ MHnMenuItemModelIterator* menuIterator = NULL;
+ TBool ignoreItemSpecific( EFalse );
+ if ( iCurrentSuiteModel )
+ {
+ TInt itemId( KErrNotFound );
+ TBool suiteModelHasItems = iCurrentContainer->GetSuiteModelL()->GetItemModelsCount() > 1;
+ TBool highlightVisible = iCurrentContainer->IsHighlightVisible();
+ if ( !highlightVisible && suiteModelHasItems )
+ {
+// if there is no highlight, but there are items, show menuitems for logically
+// current suite highlight fetched from suite model.
+ TInt suiteHighlight = iCurrentSuiteModel->GetSuiteHighlight();
+ ASSERT( suiteHighlight != KErrNotFound );
+ itemId = iCurrentSuiteModel->IdByIndex( suiteHighlight );
+ ignoreItemSpecific = ETrue;
+ }
+ else
+ {
+ TBool idByContainer = highlightVisible && suiteModelHasItems;
+ itemId = idByContainer
+ ? iCurrentSuiteModel->IdByIndex( iCurrentContainer->GetHighlight() )
+ : iCurrentSuiteModel->IdByIndex( KErrNotFound );
+ }
+ menuIterator = iCurrentSuiteModel->GetMenuStructureL( itemId );
+ }
+
+ // check if there is a menu structure available
+ // for the specified item
+ if ( menuIterator )
+ {
+ //create item sorting helper objects
+ RArray<TInt> positionArray;
+ CleanupClosePushL( positionArray );
+ RHashMap<TInt, CEikMenuPaneItem::SData> menuItemMap;
+ CleanupClosePushL( menuItemMap );
+
+ //get original (rss defined) items positions
+ for ( TInt i = 0; i < aMenuPane->NumberOfItemsInPane(); ++i )
+ {
+ //multiply to make space for suite defined entries
+ //first item has 100th conceptual position
+ positionArray.AppendL( ( i + 1 ) * KMenuPosMultiplier );
+ //store items, position as the key
+ menuItemMap.InsertL( ( i + 1 ) * KMenuPosMultiplier,
+ aMenuPane->
+ ItemData( aMenuPane->MenuItemCommandId( i ) ) );
+ }
+
+
+ //get custom menu items and their positions
+ while ( menuIterator->HasNext() )
+ {
+ CHnMenuItemModel* menuItem = menuIterator->GetNext();
+ if ( (menuItem->MenuItemType() == CHnMenuItemModel::EItemApplication) || !ignoreItemSpecific )
+ {
+ CEikMenuPaneItem::SData menuData;
+ menuData.iCommandId = menuItem->Command();
+ menuData.iText = menuItem->NameL().
+ Left( CEikMenuPaneItem::SData::ENominalTextLength );
+ menuData.iFlags = 0;
+
+ //check for children
+ MHnMenuItemModelIterator* childIterator =
+ menuItem->GetMenuStructure();
+ if ( childIterator->HasNext() )
+ {
+ //this is a cascade item
+ //one menu item can contain only one cascade menu
+ //check if there are available cascade menu containers
+ TInt freeResource = GetNextCascadeMenuResourceId();
+ if ( freeResource != KErrNotFound )
+ {
+ //error checking
+ if( !iCascadeMenuMap.Insert( freeResource,
+ childIterator ) )
+ {
+ //add item only if there is an
+ //available resource
+ menuData.iCascadeId = freeResource;
+ }
+ }
+ }
+ else
+ {
+ //normal entry
+ menuData.iCascadeId = 0;
+ }
+ positionArray.AppendL( menuItem->Position() );
+ menuItemMap.InsertL( menuItem->Position(), menuData );
+ }
+ }
+
+ aMenuPane->Reset();
+ positionArray.Sort();
+
+ //add items in correct order
+ for ( TInt i = 0; i < positionArray.Count(); ++i )
+ {
+ aMenuPane->
+ AddMenuItemL(
+ ( menuItemMap.FindL( positionArray[i] ) ) );
+ }
+
+ CleanupStack::PopAndDestroy( &menuItemMap );
+ CleanupStack::PopAndDestroy( &positionArray );
+ }
+ MMPERF(("CMmAppUi::DynInitMenuPaneL - STOP"));
+ }
+ break;
+
+ case R_CASCADE_MENU_PANE_1:
+ case R_CASCADE_MENU_PANE_2:
+ case R_CASCADE_MENU_PANE_3:
+ {
+ //realod cascade menu map
+ ReloadCascadeMenuMapL();
+ //fill the cascade menu panes
+ MHnMenuItemModelIterator* childIteratorPtr =
+ iCascadeMenuMap.FindL( aResourceId );
+
+ // check if child iterator available
+ if ( childIteratorPtr )
+ {
+ childIteratorPtr->Reset();
+
+ //create item sorting helper objects
+ RArray<TInt> positionArray;
+ CleanupClosePushL( positionArray );
+ RHashMap<TInt, CEikMenuPaneItem::SData> menuItemMap;
+ CleanupClosePushL( menuItemMap );
+
+ while ( childIteratorPtr->HasNext() )
+ {
+ CHnMenuItemModel* childItem = childIteratorPtr->GetNext();
+
+ CEikMenuPaneItem::SData childData;
+ childData.iCommandId = childItem->Command();
+ childData.iText = childItem->NameL().
+ Left( CEikMenuPaneItem::SData::ENominalTextLength );
+ childData.iFlags = 0;
+ childData.iCascadeId = 0;
+
+ positionArray.AppendL( childItem->Position() );
+ menuItemMap.InsertL( childItem->Position(), childData );
+ }
+
+ positionArray.Sort();
+ //add items in correct order
+ for ( TInt i = 0; i < positionArray.Count(); ++i )
+ {
+ aMenuPane->AddMenuItemL(
+ ( menuItemMap.FindL( positionArray[i] ) ) );
+ }
+
+ CleanupStack::PopAndDestroy( &menuItemMap );
+ CleanupStack::PopAndDestroy( &positionArray );
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+ else if( aResourceId == R_MAIN_MENU_PANE )
+ {
+ aMenuPane->SetItemDimmed( EMmOptionsExit, ETrue );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::ReloadCascadeMenuMapL()
+ {
+ iCascadeMenuMap.Close();
+ MHnMenuItemModelIterator* menuIterator = NULL;
+ if ( iCurrentSuiteModel )
+ {
+ TBool idByContainer = iCurrentContainer->IsHighlightVisible() &&
+ iCurrentContainer->GetSuiteModelL()->GetItemModelsCount() > 1;
+ TInt itemId = idByContainer ?
+ iCurrentSuiteModel->IdByIndex( iCurrentContainer->GetHighlight() ) :
+ iCurrentSuiteModel->IdByIndex( KErrNotFound );
+ menuIterator = iCurrentSuiteModel->GetMenuStructureL( itemId );
+ }
+
+ if ( menuIterator )
+ {
+ while ( menuIterator->HasNext() )
+ {
+ CHnMenuItemModel* menuItem = menuIterator->GetNext();
+
+ MHnMenuItemModelIterator* childIterator =
+ menuItem->GetMenuStructure();
+ if ( childIterator->HasNext() )
+ {
+ TInt freeResource = GetNextCascadeMenuResourceId();
+ if ( freeResource != KErrNotFound )
+ {
+ iCascadeMenuMap.Insert( freeResource, childIterator );
+ }
+ }
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TInt CMmAppUi::GetNextCascadeMenuResourceId()
+ {
+ //if needed add additional placeholders in matrixmenu.rss
+ //next add additional cases in this method and the
+ //CMmAppUi::DynInitMenuPaneL
+
+ TInt freeResource( KErrNotFound );
+ switch ( iCascadeMenuMap.Count() )
+ {
+ case 0:
+ {
+ freeResource = R_CASCADE_MENU_PANE_1;
+ }
+ break;
+ case 1:
+ {
+ freeResource = R_CASCADE_MENU_PANE_2;
+ }
+ break;
+ case 2:
+ {
+ freeResource = R_CASCADE_MENU_PANE_3;
+ }
+ break;
+ default:
+ break;
+ }
+ return freeResource;
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::HandleWidgetChangeRefreshL(
+ CMmWidgetContainer* aWidgetContainer )
+ {
+ DEBUG(("_Mm_:CMmAppUi::HandleWidgetChangeRefreshL IN"));
+
+ CMmWidgetContainer* previousContainer = iCurrentContainer;
+ if (previousContainer)
+ {
+ previousContainer->SetObserver(NULL);
+ RemoveFromStack(previousContainer);
+ }
+
+ iCurrentContainer = aWidgetContainer;
+ iCurrentContainer->Widget()->View()->SetDisableRedraw(ETrue);
+ if( isHiddenFromFS )
+ {
+ iCurrentContainer->MakeVisible( EFalse );
+ }
+ else
+ {
+ iDummyContainer->MakeVisible( ETrue );
+ }
+
+ RefreshCbaL();
+ iCurrentContainer->SetEditModeL( IsEditMode() );
+ iCurrentContainer->SetSuiteModelL( iCurrentSuiteModel );
+ iCurrentContainer->HandleResourceChange( KAknsMessageSkinChange );
+ iCurrentContainer->HandleResourceChange( KUidValueCoeColorSchemeChangeEvent );
+ iCurrentContainer->SetEmptyTextL( iCurrentSuiteModel->EmptyText() );
+ iCurrentContainer->SetHasFocusL( iHasFocus );
+ iCurrentContainer->SetIsFaded( IsFaded() );
+ iCurrentContainer->SetObserver( this );
+
+ if ( previousContainer && previousContainer->WidgetType() != iCurrentContainer->WidgetType()
+ && previousContainer->GetSuiteModelL() == iCurrentContainer->GetSuiteModelL() )
+ {
+ iCurrentSuiteModel->SetSuiteHighlightL( KErrNotFound );
+ }
+
+ AddToStackL( iCurrentContainer );
+ if ( previousContainer )
+ {
+ previousContainer->MakeVisible( EFalse );
+ }
+
+ DEBUG(("_Mm_:CMmAppUi::HandleWidgetChangeRefreshL OUT"));
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::HandleNoWidgetChangeRefreshL()
+ {
+ if ( iCurrentSuiteModel )
+ {
+ iCurrentContainer->Widget()->View()->SetDisableRedraw(ETrue);
+ iCurrentContainer->SetEditModeL( IsEditMode() );
+ iCurrentContainer->SetSuiteModelL( iCurrentSuiteModel );
+ iCurrentContainer->SetEmptyTextL( iCurrentSuiteModel->EmptyText() );
+ iCurrentContainer->SetHasFocusL( iHasFocus );
+ iCurrentContainer->SetIsFaded( IsFaded() );
+ iCurrentContainer->SetObserver(this);
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TBool CMmAppUi::IsEditMode()
+ {
+ return (iEditModeStatus == EEditMode
+ || iEditModeStatus == ETransitionToEditMode);
+ }
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::HandlePresentationChangeL(
+ CMmWidgetContainer* aWidgetContainer )
+ {
+ DEBUG(("_Mm_:CMmAppUi::HandlePresentationChangeL IN"));
+
+ if ( iToolbar && iToolbar->IsShown() )
+ {
+ iToolbar->SetToolbarVisibility( EFalse );
+ }
+
+ TBool scrollView( EFalse );
+ if( iCurrentContainer != aWidgetContainer )
+ {
+ // During open new folder cancel longTap.
+ if( iCurrentContainer && iCurrentContainer->IsEditMode() )
+ iCurrentContainer->EnableLongTapAnimation( EFalse );
+
+ // We want a highlight to be visible while switching between
+ // grid and list views but no highlight should be visible
+ // after opening a folder.
+ TBool highlightVisibleBefore =
+ iCurrentContainer &&
+ aWidgetContainer &&
+ iCurrentContainer->IsHighlightVisible() &&
+ iCurrentContainer->WidgetType() != aWidgetContainer->WidgetType();
+
+ HandleWidgetChangeRefreshL( aWidgetContainer );
+
+ if ( highlightVisibleBefore )
+ {
+ iCurrentContainer->SetHighlightVisibilityL( ETrue );
+ }
+ scrollView = ETrue;
+ }
+ else
+ {
+ HandleNoWidgetChangeRefreshL();
+ }
+
+ if( iCurrentContainer )
+ {
+ iCurrentContainer->SetRect(ClientRect());
+ iDummyContainer->SetRect(ClientRect());
+ if( IsForeground() || IsFaded() )
+ {
+ // should be called before MakeVisible (and after SetRect or SetupLayout,
+ // so that default highlight is displayed correctly when zoomed)
+ ApplyHighlightFromModelL();
+
+ // There is defferences in code because behaviour in non-touch edit mode
+ // and non-touch edit mode is different.
+ if (!AknLayoutUtils::PenEnabled())
+ {
+ // While starting non-touch edit mode we have to scroll view in case when
+ // higlighted item is placed on top/bottow row of view and there
+ // are more rows over/under one to show all needed indicator arrows.
+ // DrawNow() method caused jumping both scrollbar and view to old positions.
+ iCurrentContainer->MakeVisible(ETrue);
+ iCurrentContainer->Widget()->View()->SetDisableRedraw(EFalse);
+ iCurrentContainer->SetEditModeL(IsEditMode());
+ iDummyContainer->MakeVisible(EFalse);
+ }
+ else
+ {
+ // For touch normal mode we have to redraw container in case
+ // we back "parent folder" which was edited in edit mode.
+ // Thanks to DrawNow() method we avoid drawing items's backdrop icons
+ // and switching between edit mode's and normal mode's views
+ iCurrentContainer->SetEditModeL(IsEditMode());
+ iCurrentContainer->MakeVisible(ETrue);
+
+ // cache widget position so that we can restore it after DrawNow(), which
+ // changes it for no apparent reason when using list view.
+ iCurrentContainer->CacheWidgetPosition();
+
+ // draw container before effects gets snapshot
+ iCurrentContainer->DrawNow();
+ iCurrentContainer->Widget()->View()->SetDisableRedraw(EFalse);
+ iDummyContainer->MakeVisible(EFalse);
+
+ // restore the correct widget position
+ iCurrentContainer->RestoreWidgetPosition();
+ // force scroll view to highlighted item in case we've been backing back
+ // and change presentation mode (to list view) had been done.
+ if( scrollView && iCurrentContainer->WidgetType() == EListWidget
+ && iCurrentSuiteModel->GetSuiteHighlight() > KErrNotFound
+ && !iCurrentContainer->ItemIsFullyVisible(
+ iCurrentSuiteModel->GetSuiteHighlight() ))
+ {
+ iCurrentContainer->ScrollToItemL(
+ iCurrentSuiteModel->GetSuiteHighlight() );
+ }
+ }
+
+ // refresh changed items only
+ iCurrentContainer->DrawView();
+ RefreshUiPanesL();
+ RefreshToolbarL();
+ }
+ else
+ {
+ iCurrentContainer->SetupWidgetLayoutL();
+ iCurrentContainer->Widget()->View()->SetDisableRedraw( EFalse );
+ ApplyHighlightFromModelL();
+ }
+ }
+
+ MMPERF(("CMmAppUi::HandlePresentationChangeL - model swapped"));
+ DEBUG(("_Mm_:CMmAppUi::HandlePresentationChangeL OUT"));
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::OfferToolbarEventL( TInt aCommand )
+ {
+ TInt itemId = iCurrentSuiteModel->IdByIndex( iCurrentContainer->GetHighlight() );
+ CHnItemModel* itemModel = iCurrentSuiteModel->GetItemModel( itemId );
+ ASSERT( itemModel );
+ const CHnToolbarModel* toolbarModel = itemModel->GetToolbarModel();
+ ASSERT( toolbarModel );
+ const CHnButtonModel* buttonModel = toolbarModel->GetButton( aCommand );
+ ASSERT( buttonModel );
+
+ ForwardEventToHNL( buttonModel->GetEventId() );
+ }
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TInt CMmAppUi::ExecuteExtensionActionL( const TUid aUid , const TDesC& aCommand,
+ CLiwGenericParamList* aEventParamList )
+ {
+ iCurrentContainer->SetExDialogOpened( ETrue );
+ return iMmExtManager->ExecuteActionL( aUid, aCommand, aEventParamList);
+ }
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::HandleToolbarVisibilityL()
+ {
+ TBool suiteModelHasToolbar =
+ iCurrentSuiteModel && iCurrentSuiteModel->HasToolbar();
+
+ if ( suiteModelHasToolbar )
+ {
+ if ( iToolbar )
+ {
+ // could have gotten hidden during view change
+ iToolbar->SetToolbarVisibility( ETrue );
+ }
+ else
+ {
+ iToolbar = CAknToolbar::NewL( R_GLOBAL_TOOLBAR );
+ iToolbar->SetToolbarObserver( this );
+ iToolbar->SetToolbarVisibility( ETrue );
+
+ // substract the toolbar from display's visible area
+ TRect remainingArea( ClientRect() );
+ if ( !Layout_Meta_Data::IsLandscapeOrientation() )
+ remainingArea.Resize( 0, -iToolbar->Size().iHeight );
+ iCurrentContainer->SetRect( remainingArea );
+ }
+ }
+ else if ( !suiteModelHasToolbar && iToolbar )
+ {
+ iToolbar->SetToolbarVisibility( EFalse );
+ delete iToolbar;
+ iToolbar = NULL;
+ iCurrentContainer->SetRect( ClientRect() );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::UpdateToolbarL()
+ {
+ // drop toolbar handling if there should be none
+ if ( iToolbar && iCurrentSuiteModel->HasToolbar() )
+ {
+ iToolbar->RemoveItem( EMmToolbarControl1 );
+ iToolbar->RemoveItem( EMmToolbarControl2 );
+ iToolbar->RemoveItem( EMmToolbarControl3 );
+
+ TInt itemId = iCurrentSuiteModel->IdByIndex( iCurrentContainer->Widget()->CurrentItemIndex() );
+ CHnItemModel* itemModel = iCurrentSuiteModel->GetItemModel( itemId );
+ if ( !itemModel )
+ {
+ return;
+ }
+ const CHnToolbarModel* toolbarModel = itemModel->GetToolbarModel();
+
+ CAknButton* button( NULL );
+ for ( TInt i = 0; i < KNumOfButtonsInToolbar; ++i )
+ {
+ const CHnButtonModel* buttonModel = toolbarModel->GetButton( i );
+ // get button icon and help text from model
+ if ( buttonModel )
+ {
+ CGulIcon* originalIcon = buttonModel->GetIcon();
+ CGulIcon* iconCopy( NULL );
+ if ( originalIcon && originalIcon->Bitmap() )
+ {
+ // create a copy of the icon if exists,
+ // CAknButton takes ownership of the icon but we
+ // want to reuse it,
+ // also duplicate bitmaps for proper scaling
+ CFbsBitmap* bitmap = new (ELeave) CFbsBitmap;
+ CleanupStack::PushL( bitmap );
+ bitmap->Duplicate( originalIcon->Bitmap()->Handle() );
+
+ CFbsBitmap* mask( NULL );
+ if ( originalIcon->Mask() )
+ {
+ mask = new (ELeave) CFbsBitmap;
+ CleanupStack::PushL( mask );
+ mask->Duplicate( originalIcon->Mask()->Handle() );
+ }
+
+ iconCopy = CGulIcon::NewL( bitmap, mask );
+ if ( mask )
+ {
+ CleanupStack::Pop( mask );
+ }
+ CleanupStack::Pop( bitmap );
+ CleanupStack::PushL( iconCopy );
+ }
+ button = CAknButton::NewL( iconCopy,
+ NULL,
+ NULL,
+ NULL,
+ KNullDesC,
+ buttonModel->GetButtonText(),
+ 0,
+ 0 );
+ if ( iconCopy )
+ {
+ CleanupStack::Pop( iconCopy );
+ }
+ CleanupStack::PushL( button );
+ button->SetDimmed( buttonModel->GetDimmed() );
+ }
+ else
+ {
+ button = CAknButton::NewLC();
+ }
+ iToolbar->AddItemL( button,
+ EAknCtButton,
+ EMmToolbarControl1 + i,
+ 0 );
+ CleanupStack::Pop( button );
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::SetEditModeL( TBool aIsEditMode )
+ {
+ MMPERF(("CMmAppUi::SetEditModeL %d - START",aIsEditMode));
+ if ( IsEditMode() != aIsEditMode && iCurrentSuiteModel )
+ {
+
+ // stops moving items. This must be called when leaving non-touch edit mode to save
+ // the current visible order of the items. In non-touch it is called only once when completing editing
+
+ iHNInterface->SetEditModeL(aIsEditMode);
+ iCurrentContainer->StopMovingL();
+
+ if ( aIsEditMode )
+ {
+ iEditModeStatus = ETransitionToEditMode;
+ }
+ else
+ {
+ if ( iEditModeStatus == ETransitionToEditMode )
+ {
+ iEditModeStatus = EFastTransitionFromEditMode;
+ }
+ else
+ {
+ iEditModeStatus = ETransitionFromEditMode;
+ }
+ }
+
+ HandleHighlightOffsetL( aIsEditMode ? EOffsetNext : EOffsetPrevious );
+ iCurrentSuiteModel->SetSuiteHighlightL(
+ AdjustEditModeHighlightL( iCurrentSuiteModel->GetSuiteHighlight() ) );
+
+ // update the container at the end when highlight is proper,
+ // this will ensure correct focus/unfocus action handling
+ iCurrentContainer->CacheWidgetPosition();
+ iCurrentContainer->SetEditModeL( IsEditMode() );
+
+ if ( iCurrentContainer->IsHighlightVisible() )
+ {
+ iMakeHightlightedItemFullyVisible = ETrue;
+ }
+
+ RefreshUiPanesL();
+
+ //disable redraw so that no redrawing events coming from window server cause redrawing until
+ //everything is ready to draw. Then iCurrentContainer->DrawNow in HandlePresentationChangeL is called
+ if (IsEditMode())
+ {
+ iCurrentContainer->Widget()->View()->SetDisableRedraw(ETrue);
+ }
+ }
+
+ MMPERF(("CMmAppUi::SetEditModeL - STOP"));
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::HandleWsEventL( const TWsEvent& aEvent,
+ CCoeControl* aDestination )
+ {
+ DEBUG(("_Mm_:CMmAppUi::HandleWsEventL %d - IN", aEvent.Type()));
+
+ if ( aEvent.Type() == KAknUidValueEndKeyCloseEvent )
+ {
+ // return when the red key was pressed
+ MMPERF(("End key pressed"));
+ DEBUG(("_Mm_:CMmAppUi::HandleWsEventL - End key"));
+ ExitMatrix( EExitToIdle );
+ return;
+ }
+
+ TEventCode type = static_cast< TEventCode >( aEvent.Type() );
+
+ if ( ( type == EEventFocusLost || type == KAknFullOrPartialForegroundLost )
+ && iCurrentContainer )
+ {
+ iCurrentContainer->CacheWidgetPosition();
+ }
+
+ // base's HandleWsEventL needs to be called before foreground handling,
+ // otherwise the screen saver will be turned off
+ CAknAppUi::HandleWsEventL( aEvent, aDestination );
+
+ // refreshes toolbar when pen down event was invoked
+ if ( type == EEventPointer )
+ {
+ if ( iCurrentSuiteModel )
+ {
+ RefreshToolbarL();
+ }
+ }
+ else if ( type == EEventFocusGained )
+ {
+ HandleFocusGainedL();
+ }
+ else if ( type == EEventFocusLost )
+ {
+ HandleFocusLostL();
+ }
+ else if ( type == KAknFullOrPartialForegroundGained )
+ {
+ HandleFullOrPartialForegroundGainedL();
+ }
+ else if( type == KAknFullOrPartialForegroundLost )
+ {
+ HandleFullOrPartialForegroundLostL();
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TErrorHandlerResponse CMmAppUi::HandleError(TInt aError,
+ const SExtendedError& /*aExtErr*/,
+ TDes& /*aErrorText*/,
+ TDes& /*aContextText*/ )
+ {
+ if( aError == KErrNoMemory )
+ {
+ TRAP_IGNORE( ResetToInitialStateL( ) );
+ }
+ return EErrorNotHandled;
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::HandleSuiteEventL (
+ THnCustomSuiteEvent aCustomSuiteEvent, CHnSuiteModel* aModel )
+ {
+
+ DEBUG(("_Mm_:CMmAppUi::HandleSuiteEventL %d - IN",aCustomSuiteEvent));
+ switch ( aCustomSuiteEvent )
+ {
+ case ESuitePushedToStack:
+ {
+ aModel->RegisterSuiteObserverL( this, EPriorityMuchLess );
+ }
+ break;
+ case ESuitePoppedFromStack:
+ {
+
+ }
+ break;
+ case ESuiteModelInitialized:
+ {
+ HandleSuiteModelInitializedL( aModel );
+ }
+ break;
+ default:
+ break;
+ }
+
+ if ( iCurrentSuiteModel == aModel )
+ {
+ //We are interested in the following event
+ //only if they come from the current suite.
+ TBool redraw = (iScreenOn && IsForeground()) ? ETrue : EFalse;
+ switch (aCustomSuiteEvent)
+ {
+ case ESuiteModelDestroyed:
+ {
+ iCurrentContainer->PrepareForGarbage();
+ iGarbage.AppendL(iCurrentContainer);
+ iContainerMap.Remove(
+ iCurrentSuiteModel->GetItemsOrder()->GetSuiteId());
+ RemoveFromStack(iCurrentContainer);
+ iDummyContainer->MakeVisible( ETrue );
+ iCurrentContainer->SetObserver(NULL);
+ iCurrentSuiteModel = NULL;
+ iCurrentContainer = NULL;
+ }
+ break;
+ case ESuiteItemsAdded:
+ {
+ //we need consistent view/state before item is added
+ //so draggind should be cancelled
+ if( IsEditMode() && iCurrentContainer->IsDraggable() )
+ {
+ iCurrentContainer->CancelDragL( EFalse );
+ iCurrentContainer->DrawNow();
+ }
+ HandleNumberOfItemsChangedL( EItemsAdded );
+ }
+ break;
+ case ESuiteItemsRemoved:
+ {
+ //we need consistent view/state before item is removed
+ //so draggind should be cancelled
+ if( IsEditMode() && iCurrentContainer->IsDraggable() )
+ {
+ iCurrentContainer->CancelDragL( EFalse );
+ iCurrentContainer->DrawNow();
+ }
+ HandleNumberOfItemsChangedL( EItemsRemoved );
+ }
+ break;
+ case ESuiteItemsUpdated:
+ {
+ ClearTransitionFromEditModeFlag();
+ iCurrentContainer->DrawView();
+ }
+ break;
+ case ESuiteHighlightChanged:
+ {
+ iCurrentContainer->SetManualHighlightL(
+ iCurrentSuiteModel->GetSuiteHighlight(), redraw );
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ DEBUG(("_Mm_:CMmAppUi::HandleSuiteEventL OUT"));
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::ClearTransitionFromEditModeFlag()
+ {
+ if ( iEditModeStatus == ETransitionFromEditMode ||
+ iEditModeStatus == EFastTransitionFromEditMode )
+ {
+ iEditModeStatus = ENoEditMode;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TInt CMmAppUi::AdjustEditModeHighlightL( TInt aOriginalHighlight )
+ {
+ if ( AknLayoutUtils::PenEnabled() )
+ {
+ if ( !iCurrentContainer->IsHighlightVisible()
+ && iEditModeStatus == ETransitionToEditMode )
+ {
+ aOriginalHighlight = KErrNotFound ;
+ }
+ }
+ return aOriginalHighlight;
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::HandleOutOfMemoryL()
+ {
+ if( !iOutOfMemoryHandler )
+ {
+ iOutOfMemoryHandler = CMmNoMemory::NewL();
+ }
+ iOutOfMemoryHandler->Start();
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::ResetToInitialStateL()
+ {
+ iDummyContainer->MakeVisible( ETrue );
+ iDummyContainer->DrawNow();
+ RefreshCbaL();
+
+ if (iCurrentSuiteModel)
+ {
+ iCurrentSuiteModel->UnregisterSuiteObserver( this );
+ }
+ RemoveFromStack( iCurrentContainer );
+ ResetContainerMap();
+ iGarbage.ResetAndDestroy();
+ delete iHNInterface;
+ iHNInterface = NULL;
+ delete iMmExtManager;
+ iMmExtManager = NULL;
+ delete iTemplateLibrary;
+ iTemplateLibrary = NULL;
+
+ iCurrentSuiteModel = NULL;
+ iCurrentContainer = NULL;
+ iContainerMap.Close();
+ iEditModeStatus = ENoEditMode;
+
+ GfxTransEffect::AbortFullScreen();
+ iIsKastorEffectStarted = EFalse;
+
+ RefreshUiPanesL();
+ Cba()->MakeVisible( EFalse );
+ StatusPane()->SwitchLayoutL( R_AVKON_STATUS_PANE_LAYOUT_USUAL );
+
+ iHNInterface = CHnEngine::NewL( *this );
+ iTemplateLibrary = CMmTemplateLibrary::NewL();
+ InitializeL();
+
+ iMmExtManager = CMMExtensionManager::NewL( *this );
+
+ iScreenOn = ETrue;
+ iSkinChangeNeeded = EFalse;
+ iSkinChangeInProgress = EFalse;
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::HandleSuiteModelInitializedL( CHnSuiteModel* aModel )
+ {
+
+ StatusPane()->MakeVisible( ETrue );
+ Cba()->MakeVisible( ETrue );
+ if ( aModel == iHNInterface->GetLastSuiteModelL() )
+ {
+ TBool showOpenFolderEffect(iCurrentSuiteModel
+ && (iCurrentSuiteModel->CustomId() != aModel->CustomId()
+ || iCurrentSuiteModel->WidgetType()
+ != aModel->WidgetType()));
+ if( showOpenFolderEffect )
+ {
+ StartLayoutSwitchFullScreen( EMenuOpenFolderEffect );
+ }
+
+ iCurrentSuiteModel = aModel;
+ ShowSuiteL();
+ iGarbage.ResetAndDestroy();
+
+ if ( iEditModeStatus == ETransitionToEditMode )
+ {
+ iEditModeStatus = EEditMode;
+ }
+ else if ( iEditModeStatus == ETransitionFromEditMode )
+ {
+ iEditModeStatus = ENoEditMode;
+ }
+
+ HideMenuPaneIfVisibleL();
+ EndFullScreen();
+ }
+ else
+ {
+ if( iHNInterface->SuiteModelLoadedL(
+ aModel->GetItemsOrder()->GetSuiteId() ) )
+ {
+ CMmWidgetContainer* containerToLoad = NULL;
+ TBool created( CreateNewContainerL( aModel, containerToLoad ) );
+ if( created )
+ {
+ containerToLoad->Widget()->View()->SetDisableRedraw( ETrue );
+ containerToLoad->SetEditModeL( IsEditMode() );
+ containerToLoad->SetSuiteModelL( aModel );
+ containerToLoad->SetEmptyTextL( aModel->EmptyText() );
+ containerToLoad->SetObserver( this );
+ containerToLoad->SetRect( ClientRect() );
+ containerToLoad->MakeVisible( EFalse );
+ }
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::HideMenuPaneIfVisibleL()
+ {
+ if ( iEikonEnv->AppUiFactory()->MenuBar()->IsDisplayed() )
+ {
+ iEikonEnv->AppUiFactory()->MenuBar()->StopDisplayingMenuBar();
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::ExitMatrix( TExitType aExitType )
+ {
+ DEBUG(("_Mm_:CMmAppUi::ExitMatrix - IN"));
+ DEBUG(("\t_Mm_:Exit type: %d",aExitType));
+
+ if ( aExitType == EExitReally )
+ {
+ // Calling PrepareHomescreenForMatrixExitL instead of ShowHomescreenL
+ // allows for avoiding a bug that would occur if appkey was pressed
+ // immediately after exiting the menu via Options->Exit.
+ // The bug would be that on pressing the appkey homescreen would be
+ // displayed and then the menu would appear again on the screen for
+ // a fraction of second causing an ugly and confusing flicker effect.
+ TRAP_IGNORE( PrepareHomescreenForMatrixExitL() );
+ //ShowHomescreenL( aExitType );
+ //if we got exit cmd from OS, let's really exit.
+ Exit();
+ }
+ else
+ {
+ GfxTransEffect::AbortFullScreen();
+ iIsKastorEffectStarted = EFalse;
+ StartLayoutSwitchFullScreen( AknTransEffect::EApplicationExit );
+
+ TRAP_IGNORE( ShowHomescreenL( aExitType ) );
+ TRAP_IGNORE( CleanupForExitL( EExitKeyRed ) );
+ }
+
+ DEBUG(("_Mm_:CMmAppUi::ExitMatrix - OUT"));
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::CleanupForExitL( TExitKeyType aExitKey )
+ {
+ DEBUG(("_Mm_:CMmAppUi::CleanupForExitL - IN"));
+
+ // closing all dialogs opened in ui extensions before exit
+ iMmExtManager->ExecuteActionL( TUid::Null(), KCommandDeleteDialog, NULL );
+ if( IsDisplayingDialog() )
+ {
+ AknDialogShutter::ShutDialogsL( *iEikonEnv );
+ }
+
+ if ( IsEditMode() && iCurrentContainer )
+ {
+ DEBUG(("\t_Mm_:Edit Mode turned off"));
+ iCurrentContainer->CancelDragL( EFalse );
+ SetEditModeL( EFalse );
+ }
+
+ // reset model - revert to root if current view is not a suite view
+ CHnSuiteModel* model = iHNInterface->GetLastSuiteModelL();
+ if ( model && aExitKey == EExitKeyApplication )
+ {
+ TBool topSuiteIsBeingEvaluated =
+ !model->GetItemsOrder()->IsSuiteReadyToShow();
+ TBool topSuiteChanged = ResetToRootL();
+ model = NULL; // ResetToRootL might have deleted the model
+ TBool presentationChangeExpected = topSuiteChanged || topSuiteIsBeingEvaluated;
+
+ TBool mustDrawImmediately =
+ !presentationChangeExpected || !iDummyContainer->IsVisible();
+
+ if ( iCurrentContainer && mustDrawImmediately )
+ {
+ DEBUG(("\t_Mm_:Top item index reset"));
+ iCurrentContainer->ResetWidgetPosition();
+ iCurrentContainer->Widget()->UpdateScrollBarsL();
+ iCurrentContainer->MakeVisible( ETrue );
+ iCurrentContainer->DrawNow();
+ }
+ }
+
+ DEBUG(("_Mm_:CMmAppUi::CleanupForExitL - OUT"));
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::ShowHomescreenL( TExitType aExitType )
+ {
+ TInt appToShowUid(0);
+ TInt idleid(0);
+ switch( aExitType )
+ {
+ case EExitToIdle:
+ {
+ User::LeaveIfError( RProperty::Get( KPSUidAiInformation,
+ KActiveIdleUid, appToShowUid ) );
+ OpenAppL( TUid::Uid( appToShowUid ) );
+ }
+ break;
+ case EExitToPhone:
+ {
+ if( !RProperty::Get( KPSUidUikon, KUikVideoCallTopApp, idleid ) )
+ {
+ // Possible error code not relevant, as we have valid id anyway
+ if( idleid == KVideoCallAppUid )
+ {
+ CreateActivateViewEventL( TVwsViewId(
+ TUid::Uid( idleid ), TUid::Uid( idleid ) ),
+ KNullUid, KNullDesC8() );
+ break;
+ }
+ }
+ CAknTaskList* taskList = CAknTaskList::NewL(
+ iCoeEnv->WsSession() );
+ TApaTask task = taskList->FindRootApp( TUid::Uid( KPhoneAppUid ) );
+ delete taskList;
+ if( task.Exists() )
+ {
+ CApaWindowGroupName* windowName = CApaWindowGroupName::NewLC(
+ iCoeEnv->WsSession(), task.WgId() );
+ TBool hidden = windowName->Hidden();
+ CleanupStack::PopAndDestroy( windowName );
+ if( !hidden )
+ {
+ OpenAppL( TUid::Uid( KPhoneAppUid ) );
+ break;
+ }
+ }
+ ShowHomescreenL( EExitToIdle );
+ }
+ break;
+ default:
+ ShowHomescreenL( EExitToPhone );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::PrepareHomescreenForMatrixExitL()
+ {
+ TBool succeeded( EFalse );
+
+ CAknTaskList* taskList = CAknTaskList::NewL( iCoeEnv->WsSession() );
+ TApaTask task = taskList->FindRootApp( TUid::Uid( KPhoneAppUid ) );
+ delete taskList;
+
+ if( task.Exists() )
+ {
+ CApaWindowGroupName* windowName = CApaWindowGroupName::NewLC(
+ iCoeEnv->WsSession(), task.WgId() );
+ if( !windowName->Hidden() )
+ {
+ succeeded = !iCoeEnv->WsSession().SetWindowGroupOrdinalPosition(
+ task.WgId(), 1 );
+ }
+ CleanupStack::PopAndDestroy( windowName );
+ }
+
+ if( !succeeded )
+ {
+ ShowHomescreenL( EExitReally );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::OpenAppL( const TUid aUid )
+ {
+ DEBUG(("_Mm_:CMmAppUi::OpenAppL - IN"));
+ DEBUG(("\t_Mm_:aUid: 0x%x",aUid.iUid));
+
+ // Get the correct application data
+ CAknTaskList* taskList = CAknTaskList::NewL( iCoeEnv->WsSession() );
+ TApaTask task = taskList->FindRootApp( aUid );
+ delete taskList;
+
+ if ( task.Exists() )
+ {
+ CAknSgcClient::MoveApp( task.WgId(), ESgcMoveAppToForeground );
+ }
+ else
+ {
+ // Task doesn't exist, launch a new instance of an application
+ TApaAppInfo appInfo;
+ TApaAppCapabilityBuf capabilityBuf;
+ RApaLsSession lsSession;
+ User::LeaveIfError( lsSession.Connect() );
+ CleanupClosePushL( lsSession );
+ User::LeaveIfError( lsSession.GetAppInfo( appInfo, aUid ) );
+ User::LeaveIfError(
+ lsSession.GetAppCapability( capabilityBuf, aUid ) );
+
+ TApaAppCapability& caps = capabilityBuf();
+ TFileName appName = appInfo.iFullName;
+ CApaCommandLine* cmdLine = CApaCommandLine::NewLC();
+ cmdLine->SetExecutableNameL( appName );
+
+ if ( caps.iLaunchInBackground )
+ {
+ cmdLine->SetCommandL( EApaCommandBackground );
+ }
+ else
+ {
+ cmdLine->SetCommandL( EApaCommandRun );
+ }
+
+ User::LeaveIfError( lsSession.StartApp( *cmdLine ) );
+
+ CleanupStack::PopAndDestroy( cmdLine );
+ CleanupStack::PopAndDestroy( &lsSession );
+ }
+
+ DEBUG(("_Mm_:CMmAppUi::OpenAppL - OUT"));
+ }
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::InitializeL()
+ {
+ DEBUG(("_MM_:CMmAppUi::InitializeL IN"));
+ CLiwGenericParamList* paramList = CLiwGenericParamList::NewLC();
+ CLiwDefaultMap* map = CLiwDefaultMap::NewLC();
+
+ HBufC* suiteName = StringLoader::LoadLC( R_MENU_TITLE );
+
+ paramList->AppendL( TLiwGenericParam( KParamSuiteName8,
+ TLiwVariant( KParamFolderSuite ) ) );
+ map->InsertL( KParamSuiteName8, TLiwVariant( suiteName ) );
+ map->InsertL( KParamFolderId8, TLiwVariant( KParamFolderId ) );
+ map->InsertL( KParamRemoveLocked8, TLiwVariant( KParamFalse ) );
+ map->InsertL( KParentFolderId8, TLiwVariant( KParamFolderId ) );
+ map->InsertL( KTmpParentFolderId8, TLiwVariant( KParamFolderId ) );
+ paramList->AppendL( TLiwGenericParam( KParams8, TLiwVariant( map ) ) );
+
+ iHNInterface->InitializeL( *paramList );
+
+ CleanupStack::PopAndDestroy( suiteName );
+ CleanupStack::PopAndDestroy( map );
+ CleanupStack::PopAndDestroy( paramList );
+ DEBUG(("_MM_:CMmAppUi::InitializeL OUT"));
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::SetMiddleSoftKeyL()
+ {
+ DEBUG(("_Mm_:CMmAppUi::SetMiddleSoftKeyL - IN"));
+ if ( iCurrentSuiteModel && !AknLayoutUtils::PenEnabled() && !IsEditMode() )
+ {
+ DEBUG(("\t_Mm_:suite highlight: %d",
+ iCurrentSuiteModel->GetSuiteHighlight()));
+
+ TBool idByContainer = iCurrentContainer->IsHighlightVisible() &&
+ iCurrentContainer->GetSuiteModelL()->GetItemModelsCount() > 1;
+ TInt itemId = idByContainer ?
+ iCurrentSuiteModel->IdByIndex( iCurrentContainer->GetHighlight() ) :
+ iCurrentSuiteModel->IdByIndex( KErrNotFound );
+ CHnItemModel* itemModel = iCurrentSuiteModel->GetItemModel( itemId );
+
+ CHnButtonModel* mskModel = NULL;
+
+ if ( itemModel )
+ {
+ mskModel = itemModel->GetMiddleSoftKey();
+ }
+
+ if ( mskModel )
+ {
+ TInt event = (mskModel->GetEventId() == KErrNotFound) ?
+ KKeyIdSelect : mskModel->GetEventId();
+ Cba()->SetCommandL( CEikButtonGroupContainer::EMiddleSoftkeyPosition,
+ event, mskModel->GetButtonText());
+ }
+ else
+ {
+ // reset to default
+ RefreshCbaL();
+ }
+ }
+ DEBUG(("_Mm_:CMmAppUi::SetMiddleSoftKeyL - OUT"));
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::StartLayoutSwitchFullScreen( TInt aKastorEffect )
+ {
+ if( ( !iIsKastorEffectStarted && iScreenOn && IsForeground() ) ||
+ aKastorEffect == AknTransEffect::EApplicationStart ||
+ aKastorEffect == AknTransEffect::EApplicationExit )
+ {
+ DEBUG(("_MM_:CMmAppUi::StartLayoutSwitchFullScreen Foreground"));
+ TUid uidNext( KUidMatrixMenuApp );
+ TUid uidPrev( KUidMatrixMenuApp );
+
+ if( aKastorEffect == AknTransEffect::EApplicationExit )
+ {
+ uidPrev = TUid::Null();
+ }
+ else if( aKastorEffect == AknTransEffect::EApplicationStart )
+ {
+ uidPrev = uidPrev.Uid( AI_UID3_AIFW_COMMON );
+ }
+
+ AknTransEffect::TParamBuffer params = AknTransEffect::GfxTransParam(
+ uidNext, uidPrev, AknTransEffect::TParameter::EFlagNone );
+
+ GfxTransEffect::BeginFullScreen( aKastorEffect, TRect(),
+ AknTransEffect::EParameterType, params );
+
+ iIsKastorEffectStarted = ETrue;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::EndFullScreen()
+ {
+ if( iIsKastorEffectStarted && iScreenOn )
+ {
+ DEBUG(("_MM_:CMmAppUi::EndFullScreen Foreground"));
+ GfxTransEffect::EndFullScreen();
+ iIsKastorEffectStarted = EFalse;
+ }
+ }
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::HandleRequestL( const CLiwGenericParamList& aParam,
+ CLiwGenericParamList* aOutput )
+ {
+ iHNInterface->HandleRequestL( aParam, aOutput );
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TBool CMmAppUi::ResetToRootL()
+ {
+ TBool resetConsumed( EFalse );
+ if( iHNInterface && iCurrentSuiteModel &&
+ !IsRootdisplayedL() )
+ {
+ RemoveFromStack( iCurrentContainer );
+ iDummyContainer->MakeVisible( ETrue );
+ iHNInterface->HandleBackEventL(
+ iCurrentSuiteModel->SuiteName(),
+ iHNInterface->GetSuiteModelsCountL() - 1 );
+ ResetContainerMapToRootL();
+ if( iCurrentContainer )
+ {
+ iCurrentContainer->ResetWidgetPosition();
+ AddToStackL( iCurrentContainer );
+ }
+ RefreshUiPanesL( ETrue );
+ resetConsumed = ETrue;
+ }
+ return resetConsumed;
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::SkinContentChanged()
+ {
+ iSkinChangeNeeded = ETrue;
+ iSkinChangeInProgress = ETrue;
+ }
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::SkinConfigurationChanged(
+ const TAknsSkinStatusConfigurationChangeReason aReason)
+ {
+ DEBUG(("_Mm_:CMmAppUi::SkinConfigurationChanged IN - aReason:%d iSkinChangeNeeded:%d iSkinChangeInProgress:%d", aReason, iSkinChangeNeeded, iSkinChangeInProgress));
+ switch (aReason)
+ {
+ case EAknsSkinStatusConfigurationMerged:// = 1,
+ {
+ iSkinChangeNeeded = ETrue;
+ iSkinChangeInProgress = ETrue;
+ }
+ break;
+ case EAknsSkinStatusConfigurationDeployed:// = 2,
+ {
+ iSkinChangeInProgress = EFalse;
+ if (IsForeground())
+ {
+ TRAPD( err, RefreshIconsL());
+ if (!err)
+ {
+ iSkinChangeNeeded = ETrue;
+ }
+ }
+ }
+ break;
+ default:
+ {
+
+ }
+ }
+ DEBUG(("_Mm_:CMmAppUi::SkinConfigurationChanged OUT - aReason:%d iSkinChangeNeeded:%d iSkinChangeInProgress:%d", aReason, iSkinChangeNeeded, iSkinChangeInProgress));
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::SkinPackageChanged(const TAknsSkinStatusPackageChangeReason /*aReason*/)
+ {
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::HandleTriggerMoveItemL( const TInt aRecipientId,
+ CLiwGenericParamList* aEventParameters)
+ {
+ iHNInterface->TriggerHnEventL( KKeyIdMove, aRecipientId, aEventParameters);
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::RefreshIconsL()
+ {
+ iSkinChangeNeeded = EFalse;
+ CLiwGenericParamList* paramList = CLiwGenericParamList::NewLC();
+ TLiwGenericParam command(KHnRequest, TLiwVariant( KRefreshIcons));
+ paramList->AppendL(command);
+ HandleRequestL(*paramList);
+ CleanupStack::PopAndDestroy(paramList);
+ if( iCurrentContainer )
+ {
+ iCurrentContainer->HandleResourceChange( KAknsMessageSkinChange );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::HandleHighlightOffsetL( TInt aOffset )
+ {
+ if( AknLayoutUtils::PenEnabled() )
+ {
+ iHNInterface->TriggerHnEventL( KKeyIdMoveHighlight, aOffset, NULL );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::HandleNumberOfItemsChangedL( TItemsChangeType aChange )
+ {
+ iCurrentContainer->NumberOfItemsChangedL( aChange );
+ TBool scrollConsumed( EFalse );
+ scrollConsumed =
+ iCurrentContainer->ScrollToItemL( iCurrentSuiteModel->GetSuiteHighlight() );
+ if ( !scrollConsumed || !AknLayoutUtils::PenEnabled() )
+ {
+ iCurrentContainer->DrawNow();
+ }
+ RefreshUiPanesL();
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::ApplyHighlightFromModelL()
+ {
+ if ( iCurrentSuiteModel && iCurrentContainer )
+ {
+ TInt highlightedItemIndex = iCurrentSuiteModel->GetSuiteHighlight();
+ iCurrentContainer->RestoreWidgetPosition();
+
+ iCurrentContainer->SetManualHighlightL(
+ highlightedItemIndex, EFalse );
+ if ( iMakeHightlightedItemFullyVisible &&
+ !iCurrentContainer->ItemIsFullyVisible( highlightedItemIndex ) )
+ {
+ iCurrentContainer->ScrollToItemL( highlightedItemIndex );
+ }
+ iCurrentContainer->CacheWidgetPosition();
+ iMakeHightlightedItemFullyVisible = EFalse;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::HandleFocusGainedL()
+ {
+ DEBUG(("_Mm_:CMmAppUi::HandleWsEventL "
+ "- EEventFocusGained"));
+
+ iHasFocus = ETrue;
+
+ // Tricky: lack of iCurrentSuiteModel indicates that suite evaluation is in
+ // progress - do not call HandlePresentationChangeL if evalution has not
+ // finished.
+ if ( iCurrentContainer && !iCurrentContainer->IsVisible() &&
+ iCurrentSuiteModel )
+ {
+ HandlePresentationChangeL( iCurrentContainer );
+ }
+
+ if ( iCurrentSuiteModel && iCurrentContainer )
+ {
+ iDummyContainer->MakeVisible( EFalse );
+ iCurrentContainer->MakeVisible( ETrue );
+ iCurrentContainer->DrawNow();
+ }
+ if( IsForeground() )
+ {
+ RefreshUiPanesL();
+ }
+ if ( iCurrentContainer )
+ {
+ iCurrentContainer->SetHasFocusL( ETrue );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::HandleFocusLostL()
+ {
+ DEBUG(("_Mm_:CMmAppUi::HandleWsEventL "
+ "- EEventFocusLost"));
+
+ iHasFocus = EFalse;
+
+ if( iCurrentContainer )
+ {
+ //This is needed in case some popup is displayed
+ //while touching item in grid. Highlight
+ //should be reset to normal then.
+ if( AknLayoutUtils::PenEnabled() )
+ {
+ if( iCurrentContainer->WidgetType() == EGridWidget && !IsEditMode() )
+ {
+ iCurrentContainer->Widget()->View()->ItemDrawer()->
+ SetFlags( CListItemDrawer::EDisableHighlight );
+ }
+ iCurrentContainer->Widget()->View()->
+ ItemDrawer()->ClearFlags( CListItemDrawer::EPressedDownState );
+ iCurrentContainer->Widget()->View()->DrawItem(
+ iCurrentContainer->Widget()->CurrentItemIndex() ) ;
+ }
+ if( IsEditMode() && iCurrentContainer->IsDraggable() )
+ {
+ HandleDragStopL( iCurrentContainer->GetHighlight() );
+ iCurrentContainer->DrawNow();
+ }
+ iCurrentContainer->SetHasFocusL( EFalse );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::HandleFullOrPartialForegroundGainedL()
+ {
+ DEBUG(("_Mm_:CMmAppUi::HandleWsEventL "
+ "- KAknFullOrPartialForegroundGained"));
+ //show Menu in TS when launched for the first time
+ if( isHiddenFromFS )
+ {
+ HideApplicationFromFSW( EFalse );
+ isHiddenFromFS = EFalse;
+ }
+
+ if (iCurrentContainer && iCurrentSuiteModel )
+ {
+ iCurrentContainer->HandleForegroundGainedL();
+ iDummyContainer->MakeVisible( EFalse );
+ iCurrentContainer->MakeVisible( ETrue );
+ RefreshUiPanesL();
+ }
+ if (iSkinChangeNeeded && !iSkinChangeInProgress)
+ {
+ MAknsSkinInstance* skinInstance = AknsUtils::SkinInstance();
+ if (skinInstance && !skinInstance->IsUpdateInProgress())
+ {
+ RefreshIconsL();
+
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMmAppUi::HandleFullOrPartialForegroundLostL()
+ {
+ DEBUG(("_Mm_:CMmAppUi::HandleWsEventL "
+ "- KAknFullOrPartialForegroundLost"));
+ if ( iCurrentContainer )
+ {
+ iCurrentContainer->HandleBackgroundGainedL();
+ if ( IsRootdisplayedL() )
+ {
+ iCurrentContainer->RestoreWidgetPosition();
+ iCurrentContainer->CacheWidgetPosition();
+ }
+ }
+ }
+
+// End of File