--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/emailuis/emailui/src/FreestyleEmailUiLauncherGridVisualiser.cpp Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,2542 @@
+/*
+* Copyright (c) 2007-2009 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: FreestyleEmailUi main grid implementation
+*
+*/
+
+
+// SYSTEM INCLUDE FILES
+#include "emailtrace.h"
+#include <coemain.h>
+#include <StringLoader.h>
+#include <AknUtils.h>
+#include <AknsUtils.h>
+#include <AknsSkinInstance.h>
+#include <apgcli.h> // RApaLsSession
+#include <e32math.h>
+#include <FreestyleEmailUi.rsg>
+#include <touchlogicalfeedback.h>
+// <cmail> SF path changes
+#include <alf/alfutil.h>
+#include <alf/alfenv.h>
+#include <alf/alfevent.h>
+#include <alf/alftextvisual.h>
+//</cmail>
+#include <aknnotewrappers.h>
+#include <freestyleemailui.mbg>
+#include <gulicon.h>
+//<cmail>
+#include "CFSMailMessage.h"
+#include <alf/alfframebrush.h>
+#include "CFSMailBox.h"
+#include "CFSMailClient.h"
+//</cmail>
+#include <hlplch.h>
+#include <akntitle.h>
+#include <centralrepository.h>
+//<cmail>
+#include <alf/alfanchorlayout.h>
+#include <alf/alfbrusharray.h>
+#include <alf/alfstatic.h>
+#include <alf/alfgencomponent.h>
+#include <alf/alfconstants.h>
+#include "fsalfscrollbarlayout.h"
+#include <csxhelp/cmail.hlp.hrh>
+//</cmail>
+#include <featmgr.h>
+//</cmail>
+
+#include <aknmessagequerydialog.h>
+// <cmail> Use layout data instead of hard-coded values
+#include <aknlayoutscalable_avkon.cdl.h>
+#include <aknlayoutscalable_apps.cdl.h>
+#include <layoutmetadata.cdl.h>
+// </cmail>
+
+// INTERNAL INCLUDE FILES
+#include "FSEmailBuildFlags.h"
+#include "FreestyleEmailUiConstants.h"
+#include "FreestyleEmailUiLiterals.h"
+#include "FreestyleEmailUiLauncherGrid.h"
+#include "FreestyleEmailUiLauncherGridVisualiser.h"
+#include "FreestyleEmailUi.hrh"
+#include "FreestyleEmailUiLayoutHandler.h"
+#include "FreestyleEmailUiTextureManager.h"
+#include "FreestyleEmailUiMailListVisualiser.h"
+#include "FreestyleEmailUiShortcutBinding.h"
+#include "FSDelayedLoader.h"
+
+// Utility clean up function
+void CleanupEComArray( TAny* aArray );
+
+// CONSTANT VALUES
+const TReal KDefaultCaptionOpacity = 1.0;
+const TInt KDefaultSelection = 0;
+const TInt KSelectTransitionTimeMs = 300;
+const TInt KIconScalingTransitionTimeMs = 350;
+const TInt KStartupAnimationTime = 0;
+const TReal KScaleSelected = 1.0;
+const TReal KScaleNotSelected = 0.77;
+// <cmail> Use layout data instead of hard-coded values
+// </cmail>
+
+
+CFSEmailUiLauncherGridVisualiser* CFSEmailUiLauncherGridVisualiser::NewL(CAlfEnv& aEnv,
+ CFSEmailUiLauncherGrid* aControl,
+ CFreestyleEmailUiAppUi* aAppUi,
+ CAlfControlGroup& aControlGroup,
+ TInt aColumns, TInt aRows)
+ {
+ FUNC_LOG;
+ CFSEmailUiLauncherGridVisualiser* self = CFSEmailUiLauncherGridVisualiser::NewLC(aEnv, aControl, aAppUi, aControlGroup, aRows, aColumns);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CFSEmailUiLauncherGridVisualiser* CFSEmailUiLauncherGridVisualiser::NewLC(CAlfEnv& aEnv,
+ CFSEmailUiLauncherGrid* aControl,
+ CFreestyleEmailUiAppUi* aAppUi,
+ CAlfControlGroup& aControlGroup,
+ TInt aColumns, TInt aRows)
+ {
+ FUNC_LOG;
+ CFSEmailUiLauncherGridVisualiser* self = new (ELeave) CFSEmailUiLauncherGridVisualiser(aEnv, aControl, aAppUi, aControlGroup);
+ CleanupStack::PushL(self);
+ self->ConstructL(aColumns, aRows);
+ return self;
+ }
+
+CFSEmailUiLauncherGridVisualiser::CFSEmailUiLauncherGridVisualiser(CAlfEnv& aEnv,
+ CFSEmailUiLauncherGrid* aControl,
+ CFreestyleEmailUiAppUi* aAppUi,
+ CAlfControlGroup& aControlGroup)
+ : CFsEmailUiViewBase(aControlGroup, *aAppUi),
+ iEnv( aEnv ),
+ iVisibleRows( 0 ),
+ iVisibleColumns( 0 ),
+ iRowCount( 0 ),
+ iFirstVisibleRow( 0 ),
+ iRowHeight( 0 ),
+ iColumnWidth( 0 ),
+ iSelector( 0 ),
+ iStartupAnimation( 0 ),
+ iStartupEffectStyle( 0 ),
+ iWizardWaitnoteShown( EFalse )
+ {
+ FUNC_LOG;
+ iItemIdInButtonDownEvent.iItemId = KErrNotFound;
+ iItemIdInButtonDownEvent.iLaunchSelection = EFalse;
+ iControl = aControl;
+ }
+
+void CFSEmailUiLauncherGridVisualiser::ConstructL( TInt aColumns, TInt aRows )
+ {
+ FUNC_LOG;
+ BaseConstructL( R_FSEMAILUI_MAINUI_VIEW );
+ iVisibleRows = aRows;
+ iVisibleColumns = aColumns;
+ iConstructionCompleted = EFalse;
+ iDoubleClickLock = EFalse;
+ iUiOperationLaunched = EFalse;
+
+ iMailboxDeleter = CFSEmailUiMailboxDeleter::NewL( *iAppUi.GetMailClient(), *this );
+ }
+
+// CFSEmailUiLauncherGridVisualiser::DoFirstStartL()
+// Purpose of this function is to do first start only when grid is
+// really needed to be shown. Implemented to make app startuo faster.
+void CFSEmailUiLauncherGridVisualiser::DoFirstStartL()
+ {
+ FUNC_LOG;
+ iPluginIdIconIdPairs.Reset();
+
+// <cmail> Use layout data instead of hard-coded values
+ TRect mainPaneRect;
+ AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect);
+
+ TAknLayoutRect scrollBarRect;
+ scrollBarRect.LayoutRect(mainPaneRect, AknLayoutScalable_Avkon::aid_size_touch_scroll_bar());
+ TRect gridRect = mainPaneRect;
+ gridRect.iBr.iX -= scrollBarRect.Rect().Width();
+
+ TInt var = Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0;
+ iVisibleRows = AknLayoutScalable_Apps::cell_cmail_l_pane_ParamLimits(var).LastRow() + 1;
+ iVisibleColumns = AknLayoutScalable_Apps::cell_cmail_l_pane_ParamLimits(var).LastColumn() + 1;
+// </cmail>
+
+ iStartupAnimation = ETrue;
+ iCurrentLevel.iSelected = KDefaultSelection;
+ CAlfTextureManager& manager = iEnv.TextureManager();
+
+ iParentLayout = CAlfDeckLayout::AddNewL(*iControl);
+ iParentLayout->SetFlags(EAlfVisualFlagLayoutUpdateNotification);
+
+ // Widget layout divides the screen between grid and scroll bar
+ iWidgetLayout = CAlfAnchorLayout::AddNewL( *iControl, iParentLayout );
+ //<cmail>
+ TSize displaySize = mainPaneRect.Size(); //iControl->DisplayArea().Size();
+ //</cmail>
+ iWidgetLayout->SetSize( displaySize );
+
+ // Constructed here, updated later, #0 item in iWidgetLayout
+ ConstructScrollbarL( iWidgetLayout );
+
+ // Grid layout is constructed here, #1 item in iWidgetLayout
+ iCurrentLevel.iGridLayout = CAlfGridLayout::AddNewL( *iControl, iVisibleColumns, iVisibleRows, iWidgetLayout );
+ iCurrentLevel.iGridLayout->EnableScrollingL( ETrue );
+ iCurrentLevel.iGridLayout->SetFlags( EAlfVisualFlagAutomaticLocaleMirroringEnabled );
+
+ // Selector is added to iGridLayout
+ iSelector = iControl->AppendLayoutL( EAlfLayoutTypeLayout, iCurrentLevel.iGridLayout );
+ iSelector->SetFlags( EAlfVisualFlagManualLayout );
+
+ iRingMovementXFunc = CAlfTableMappingFunction::NewL(iEnv);
+ iRingMovementYFunc = CAlfTableMappingFunction::NewL(iEnv);
+
+ TAlfTimedPoint selectorPos = iSelector->Pos();
+ selectorPos.iX.SetMappingFunctionIdentifier( iRingMovementXFunc->MappingFunctionIdentifier() );
+ selectorPos.iY.SetMappingFunctionIdentifier( iRingMovementYFunc->MappingFunctionIdentifier() );
+ iSelector->SetPos( selectorPos );
+
+ UpdateFocusVisibility();
+ iSelectorImageVisual = CAlfImageVisual::AddNewL( *iControl, iSelector );
+ iSelectorImageVisual->SetScaleMode( CAlfImageVisual::EScaleFit );
+// <cmail> Use layout data instead of hard-coded values
+ iSelectorImageVisual->SetSize( iAppUi.LayoutHandler()->SelectorVisualSizeInThisResolution() );
+ TAknLayoutRect itemRect;
+ itemRect.LayoutRect(gridRect, AknLayoutScalable_Apps::cell_cmail_l_pane(var,0,0));
+ iSelectorImageVisual->SetSize( itemRect.Rect().Size() );
+// </cmail>
+
+ iSelectorImageVisual->EnableBrushesL();
+ CAlfFrameBrush* brush = iAppUi.FsTextureManager()->GridSelectorBrushL();
+ iSelectorImageVisual->Brushes()->AppendL( brush, EAlfDoesNotHaveOwnership );
+ iStartupEffectStyle = EFalse;
+
+ iAiwSHandler = CAiwServiceHandler::NewL();
+ iAiwSHandler->AttachL( R_AIW_INTEREST_LAUNCH_SETUP_WIZARD );
+
+ // Initial visual layout update is done when the view gets activated.
+ iRefreshNeeded = ETrue;
+
+ // First start toggle
+ iConstructionCompleted = ETrue;
+ }
+
+// ---------------------------------------------------------------------------
+// HandleButtonReleaseEventL is called when Launcher grid visualiser
+// gets pointer event that indicates that button is released.
+// function should decide if focus should still be drawn or not.
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiLauncherGridVisualiser::HandleButtonReleaseEvent()
+ {
+ iItemIdInButtonDownEvent.iItemId = KErrNotFound;
+ iItemIdInButtonDownEvent.iLaunchSelection = EFalse;
+
+ UpdateFocusVisibility();
+
+ if( !IsFocusShown() )
+ {
+ // No items are focused anymore. Shrink the icon.
+ ResizeItemIcon( ETrue );
+ }
+ else
+ {
+ // Reset selected icon size back to normal
+ ResizeItemIcon( EFalse );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Reduces icon size of seleceted item
+// Called when grag event is made.
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiLauncherGridVisualiser::ResizeItemIcon( TBool aReduce )
+ {
+ TInt selectedItem( iCurrentLevel.iSelected );
+ if( selectedItem >= 0 )
+ {
+ TReal transition( KScaleNotSelected );
+ if( !aReduce )
+ {
+ transition = KScaleSelected;
+ }
+ TAlfTimedValue scaleValue;
+ scaleValue.SetTarget( transition, KIconScalingTransitionTimeMs * 2 );
+ iCurrentLevel.iItemVisualData[selectedItem].iImage->SetScale( scaleValue );
+ HandleRowMovement( EDirectionTouch, selectedItem );
+ }
+ }
+
+CFSEmailUiLauncherGridVisualiser::~CFSEmailUiLauncherGridVisualiser()
+ {
+ FUNC_LOG;
+ iPluginIdIconIdPairs.Reset();
+ iIconArray.Close();
+ iMailboxRequestIds.Close();
+ iLauncherItems.ResetAndDestroy();
+ iLauncherItemUids.Close();
+ iCurrentLevel.iItemVisualData.Close();
+ iCurrentLevel.iItems.Close();
+ DetachSelectorMappingFunctions();
+ delete iRingMovementXFunc;
+ delete iRingMovementYFunc;
+ delete iModel;
+ delete iAiwSHandler;
+ // <cmail>
+ delete iScrollbar;
+ // </cmail>
+ delete iMailboxDeleter;
+ }
+
+void CFSEmailUiLauncherGridVisualiser::CreateModelL()
+ {
+ FUNC_LOG;
+
+ RArray<TBool> itemInModel;
+ CleanupClosePushL( itemInModel );
+ iIconArray.Reset();
+
+ iPluginTextureId = EGridPluginIconFirst;
+ iPluginIdIconIdPairs.Reset();
+
+ delete iModel;
+ iModel = NULL;
+ iModel = new (ELeave) CFSEmailUiLauncherGridModel();
+ iModel->ConstructL();
+ CAlfTexture* iconTexture = 0;
+
+ // Get item ordering from resources
+ TResourceReader reader;
+ iEikonEnv->CreateResourceReaderLC( reader, R_FSEMAILUI_LAUNCHER_GRID );
+
+ UpdateLauncherItemListL();
+ MFSMailBrandManager& brandManager = iAppUi.GetMailClient()->GetBrandManagerL();
+
+ for ( TInt i = 0; i < iLauncherItems.Count(); i++ )
+ {
+ itemInModel.Append( EFalse );
+ }
+
+ TInt count = reader.ReadInt16();
+
+// <cmail> Use layout data instead of hard-coded values
+ TRect mainPaneRect;
+ AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect);
+
+ TAknLayoutRect scrollBarRect;
+ scrollBarRect.LayoutRect(mainPaneRect, AknLayoutScalable_Avkon::aid_size_touch_scroll_bar());
+ TRect gridRect = mainPaneRect;
+ gridRect.iBr.iX -= scrollBarRect.Rect().Width();
+
+ TInt var = Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0;
+ TAknLayoutRect itemRect;
+ itemRect.LayoutRect(gridRect, AknLayoutScalable_Apps::cell_cmail_l_pane(var,0,0));
+
+ TAknLayoutRect gridIconLRect;
+ gridIconLRect.LayoutRect(itemRect.Rect(), AknLayoutScalable_Apps::cell_cmail_l_pane_g1(var));
+ TSize iconSize = gridIconLRect.Rect().Size();
+// </cmail>
+
+ for ( TInt itemIndex = 0; itemIndex < count; itemIndex++ )
+ {
+ TInt itemId = reader.ReadInt16();
+ switch ( itemId )
+ {
+ case EDefaultMailboxItem:
+ {
+
+ RPointerArray<CFSMailBox> mailBoxes;
+ CleanupResetAndDestroyClosePushL( mailBoxes );
+ TFSMailMsgId id;
+ TInt err = iAppUi.GetMailClient()->ListMailBoxes(
+ id,
+ mailBoxes );
+
+ if ( mailBoxes.Count() > 0 )
+ {
+ // Try to get branded graphic
+ CGulIcon* mbIcon(0);
+ TRAPD( err, mbIcon = brandManager.GetGraphicL( EFSMailboxIcon, mailBoxes[0]->GetId() ) );
+ if ( err == KErrNone && mbIcon )
+ {
+ CleanupStack::PushL( mbIcon );
+ AknIconUtils::SetSize(mbIcon->Bitmap(), iconSize);
+ AknIconUtils::SetSize(mbIcon->Mask(), iconSize);
+
+ // Create texture into TextureManager, If not already existing
+ // Note: size(0,0) means original icon size
+ iAppUi.FsTextureManager()->CreateBrandedMailboxTexture( mbIcon,
+ mailBoxes[0]->GetId().PluginId(),
+ mailBoxes[0]->GetId().Id(),
+ TSize(0,0));
+ // Get branded mailbox icon
+ iconTexture = &iAppUi.FsTextureManager()->TextureByMailboxIdL( mailBoxes[0]->GetId().PluginId(),
+ mailBoxes[0]->GetId().Id(),
+ TSize(0,0));
+
+ CleanupStack::PopAndDestroy( mbIcon );
+ }
+ else
+ {
+ iconTexture = &iAppUi.FsTextureManager()->TextureByIndex( EGridInboxTexture );
+ }
+
+ iIconArray.AppendL( iconTexture );
+
+ // Branded mailbox name is nowadays set in new mailbox event
+ // handling, so we don't need to use brand manager here anymore.
+ iModel->AddL(
+ EShortcut,
+ EDefaultMailboxItem,
+ mailBoxes[0]->GetName(),
+ *iconTexture,
+ mailBoxes[0]->GetId(),
+ mailBoxes[0]->GetStandardFolderId( EFSInbox ) );
+
+ iAppUi.SubscribeMailboxL( mailBoxes[0]->GetId() );
+ }
+
+ CleanupStack::PopAndDestroy( &mailBoxes );
+ }
+ break;
+ case EOtherMailboxItems:
+ {
+ RPointerArray<CFSMailBox> mailBoxes;
+ CleanupResetAndDestroyClosePushL( mailBoxes );
+ TFSMailMsgId id;
+ TInt err = iAppUi.GetMailClient()->ListMailBoxes(
+ id,
+ mailBoxes );
+
+ for ( TInt i = 1; i < mailBoxes.Count(); i++ )
+ {
+ // Try to get branded graphic
+ CGulIcon* mbIcon(0);
+ TRAPD( err, mbIcon = brandManager.GetGraphicL( EFSMailboxIcon, mailBoxes[i]->GetId() ) );
+ if ( err == KErrNone && mbIcon )
+ {
+ CleanupStack::PushL( mbIcon );
+ AknIconUtils::SetSize(mbIcon->Bitmap(), iconSize);
+ AknIconUtils::SetSize(mbIcon->Mask(), iconSize);
+
+ // Create texture into TextureManager, If not already existing
+ iAppUi.FsTextureManager()->CreateBrandedMailboxTexture( mbIcon,
+ mailBoxes[i]->GetId().PluginId(),
+ mailBoxes[i]->GetId().Id(),
+ TSize(0,0));
+ // Get branded mailbox icon
+ iconTexture = &iAppUi.FsTextureManager()->TextureByMailboxIdL( mailBoxes[i]->GetId().PluginId(),
+ mailBoxes[i]->GetId().Id(),
+ TSize(0,0));
+ CleanupStack::PopAndDestroy( mbIcon );
+ }
+ else
+ {
+ iconTexture = &iAppUi.FsTextureManager()->TextureByIndex( EGridInboxTexture );
+ }
+ iIconArray.AppendL( iconTexture );
+ // Branded mailbox name is nowadays set in new mailbox event
+ // handling, so we don't need to use brand manager here anymore.
+ iModel->AddL(
+ EShortcut,
+ EDefaultMailboxItem,
+ mailBoxes[i]->GetName(),
+ *iconTexture,
+ mailBoxes[i]->GetId(),
+ mailBoxes[i]->GetStandardFolderId( EFSInbox ) );
+
+ iAppUi.SubscribeMailboxL( mailBoxes[i]->GetId() );
+ }
+
+ CleanupStack::PopAndDestroy( &mailBoxes );
+ }
+ break;
+ case EDirectoryItem:
+ {
+ RPointerArray<CFSMailBox> mailBoxes;
+ CleanupResetAndDestroyClosePushL( mailBoxes );
+ TFSMailMsgId id;
+ TInt err = iAppUi.GetMailClient()->ListMailBoxes(
+ id,
+ mailBoxes );
+
+ for ( TInt i = 0; i < mailBoxes.Count(); i++ )
+ {
+ if ( TFsEmailUiUtility::IsRemoteLookupSupported( *mailBoxes[i] ) )
+ {
+ HBufC* text = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_GRIDITEM_DIRECTORY );
+ iconTexture = &iAppUi.FsTextureManager()->TextureByIndex( EGridDirectoryTexture );
+ iModel->AddL(EShortcut, EDirectoryItem, *text, *iconTexture );
+ CleanupStack::PopAndDestroy( text );
+ iIconArray.AppendL( iconTexture );
+ break;
+ }
+ }
+
+ CleanupStack::PopAndDestroy( &mailBoxes );
+ }
+ break;
+ case ESettingsItem:
+ {
+ HBufC* text = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_GRIDITEM_SETTINGS );
+ iconTexture = &iAppUi.FsTextureManager()->TextureByIndex( EGridSettingsTexture );
+ iModel->AddL(EShortcut, ESettingsItem, *text, *iconTexture );
+ CleanupStack::PopAndDestroy( text );
+ iIconArray.AppendL( iconTexture );
+ }
+ break;
+ case EAddNewMailboxItem:
+ {
+ HBufC* text = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_GRIDITEM_ADD_NEW_MAILBOX );
+ iconTexture = &iAppUi.FsTextureManager()->TextureByIndex( EGridAddNewBoxTexture );
+ iModel->AddL(EShortcut, EAddNewMailboxItem, *text, *iconTexture );
+ CleanupStack::PopAndDestroy( text );
+ iIconArray.AppendL( iconTexture );
+ }
+ break;
+ case EHelpItem:
+ {
+ // remove help support in pf5250
+ if (! FeatureManager::FeatureSupported( KFeatureIdFfCmailIntegration ) )
+ {
+ HBufC* text = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_GRIDITEM_HELP );
+ iconTexture = &iAppUi.FsTextureManager()->TextureByIndex( EGridHelpTexture );
+ iModel->AddL(EShortcut, EHelpItem, *text, *iconTexture );
+ CleanupStack::PopAndDestroy( text );
+ iIconArray.AppendL( iconTexture );
+ }
+ }
+ break;
+ case EIntellisyncFileSyncItem:
+ case EIntellisyncTravelInfoItem:
+ case EIntellisyncBackupItem:
+ case EIntellisyncRestoreItem:
+ case EIntellisyncUpgradeItem:
+ case EIntellisyncRemoteControlItem:
+ {
+ for ( TInt i = 0; i < iLauncherItems.Count(); i++ )
+ {
+ if ( iLauncherItems[i]->Id() == itemId )
+ {
+ itemInModel[i] = ETrue;
+ AddItemToModelL( iLauncherItems[i], i );
+ break;
+ }
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ CleanupStack::PopAndDestroy(); // reader internal state
+
+ // Rest of the launcher items
+ for ( TInt i = 0; i < iLauncherItems.Count(); i++ )
+ {
+ if ( ! itemInModel[i] )
+ {
+ AddItemToModelL( iLauncherItems[i], i );
+ }
+ }
+
+ CleanupStack::PopAndDestroy( &itemInModel );
+ }
+
+void CFSEmailUiLauncherGridVisualiser::CreateCaptionForApplicationL(TUid aUid,
+ TDes& aCaption,
+ TBool aShortCaption)
+ {
+ FUNC_LOG;
+ RApaLsSession ls;
+ User::LeaveIfError( ls.Connect() );
+ TApaAppInfo appInfo;
+ TInt ret = ls.GetAppInfo( appInfo, aUid );
+ if ( ret == KErrNone )
+ {
+ if ( !aShortCaption )
+ {
+ aCaption = appInfo.iCaption;
+ }
+ else
+ {
+ aCaption = appInfo.iShortCaption;
+ }
+ }
+ ls.Close();
+ }
+
+
+TUid CFSEmailUiLauncherGridVisualiser::Id() const
+ {
+ FUNC_LOG;
+ return AppGridId;
+ }
+
+// <cmail> Toolbar
+/*
+void CFSEmailUiLauncherGridVisualiser::DoActivateL(const TVwsViewId& aPrevViewId,
+ TUid aCustomMessageId,
+ const TDesC8& aCustomMessage)*/
+void CFSEmailUiLauncherGridVisualiser::ChildDoActivateL(const TVwsViewId& aPrevViewId,
+ TUid /*aCustomMessageId*/,
+ const TDesC8& /*aCustomMessage*/)
+ {
+ FUNC_LOG;
+ if ( !iConstructionCompleted )
+ {
+ DoFirstStartL();
+ }
+
+ // For initial mailbox query
+ TBool startedFromOds = EFalse;
+ // NULL wizard started parameter every time when activated again.
+ iDoubleClickLock = EFalse;
+
+ if ( aPrevViewId.iAppUid.iUid == 0 &&
+ iAppUi.CurrentActiveView() != this )
+ {
+ // Started from wizard do not show query
+ startedFromOds = ETrue;
+ // This view activation has not come through according normal view
+ // activation procedure, so we should ignore this by activating
+ // the currently active view again. This has been made to
+ // avoid problems when ODS setup is completed.
+ if ( iAppUi.CurrentActiveView()->Id() == MailListId )
+ {
+ TMailListActivationData tmp;
+ tmp.iReturnAfterWizard = ETrue;
+ const TPckgBuf<TMailListActivationData> pkgOut( tmp );
+ iAppUi.EnterFsEmailViewL( MailListId, KStartListReturnToPreviousFolder, pkgOut );
+ }
+ else if ( iAppUi.CurrentActiveView()->Id() == MailViewerId )
+ {
+ TMsgViewerActivationData tmp;
+ const TPckgBuf<TMsgViewerActivationData> pkgOut( tmp );
+ iAppUi.EnterFsEmailViewL( MailViewerId, KStartViewerReturnToPreviousMsg, pkgOut);
+ }
+ else
+ {
+ iAppUi.EnterFsEmailViewL( iAppUi.CurrentActiveView()->Id() );
+ }
+
+ return;
+ }
+
+ if ( iRefreshNeeded )
+ {
+ CreateModelL();
+ RescaleIconsL();
+ VisualLayoutUpdatedL();
+ }
+ else
+ {
+ // scroll bar needs to be updated manually anyway
+ UpdateScrollBarRangeL();
+ }
+
+ SetDefaultStatusPaneTextL();
+
+ // Mailbox query is called here but shown only once in appui if needed
+ // doNotshowQuery is ETrue when started from wizard
+ if ( !iFirstStartComplete )
+ {
+ iFirstStartComplete = ETrue;
+ iAppUi.GridStarted( startedFromOds );
+ iAppUi.ShowMailboxQueryL();
+ }
+ // <cmail>
+ else
+ {
+ // Ensure that FSMailServer is running, but don't do it on first
+ // activation, as it's done anyway in AppUi's ConstructL
+ TFsEmailUiUtility::EnsureFsMailServerIsRunning( iEikonEnv->WsSession() );
+ }
+
+ if( iRowCount > iVisibleRows )
+ {
+ iScrollbar->MakeVisible(ETrue);
+ }
+ else
+ {
+ iScrollbar->MakeVisible(EFalse);
+ }
+
+ iAppUi.HideTitlePaneConnectionStatus();
+
+ // Erase the navigation history when main grid activated. This is the default view
+ // of the application and back navigation is never possible from here. The view stack
+ // might be in inconsistent state because of some unexpected error in view switching.
+ // Erasing the history helps recovering from such situations.
+ iAppUi.EraseViewHistory();
+
+ UpdateFocusVisibility();
+ }
+// </cmail> Toolbar
+
+void CFSEmailUiLauncherGridVisualiser::ChildDoDeactivate()
+ {
+ FUNC_LOG;
+ iScrollbar->MakeVisible(EFalse);
+ // </cmail>
+ }
+
+
+void CFSEmailUiLauncherGridVisualiser::DynInitMenuPaneL(TInt aResourceId, CEikMenuPane* aMenuPane)
+ {
+ FUNC_LOG;
+
+ if ( aResourceId == R_FSEMAILUI_MAINUIGRID_MENUPANE )
+ {
+ if ( FeatureManager::FeatureSupported( KFeatureIdFfCmailIntegration ) )
+ {
+ // remove help support in pf5250
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdHelp, ETrue);
+ }
+
+ TFSLauncherGridMailboxStatus mbStatus = CheckMailboxStatusL();
+
+ // Checks if a device has a keyboard or not.
+ if( !iKeyboardFlipOpen )
+ {
+ if( mbStatus.iMailboxCount <= 0 )
+ {
+ // If no mailboxes configured, dim all mailbox related items.
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdDeleteMailbox, ETrue );
+ }
+
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdOpen, ETrue );
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdSync, ETrue );
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdSyncAll, ETrue );
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdCancelSync, ETrue );
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdGoOffline, ETrue );
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdGoOfflineAll, ETrue );
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdGoOnline, ETrue );
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdGoOnlineAll, ETrue );
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdAbout, ETrue );
+ }
+ else
+ {
+ // <cmail>
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdAbout, ETrue );
+ // </cmail>
+
+ if( mbStatus.iMailboxCount <= 0 )
+ {
+ // If no mailboxes configured, dimm all mailbox related items
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdDeleteMailbox, ETrue );
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdCancelSync, ETrue);
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdSync, ETrue );
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdSyncAll, ETrue );
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdGoOnline, ETrue );
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdGoOnlineAll, ETrue );
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdGoOffline, ETrue );
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdGoOfflineAll, ETrue );
+ }
+ else
+ {
+ // Handle items related to sync cancelling
+ if( mbStatus.iMailboxesSyncing == 0 )
+ {
+ // All mailboxes are already not syncing
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdCancelSync, ETrue );
+ }
+
+ // Handle items related to sync starting
+ if( mbStatus.iMailboxesSyncing == mbStatus.iMailboxCount )
+ {
+ // All mailboxes are already syncing
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdSync, ETrue );
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdSyncAll, ETrue );
+ }
+ else if( mbStatus.iMailboxCount == 1 )
+ {
+ // Only one mailbox configured, dimm "Synchronise all"
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdSyncAll, ETrue );
+ }
+ else
+ {
+ // Several mailboxes configured, dimm "Synchronise"
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdSync, ETrue );
+ }
+
+ // Handle items related to online
+ if( mbStatus.iMailboxesOnline == mbStatus.iMailboxCount )
+ {
+ // All mailboxes are already online
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdGoOnline, ETrue );
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdGoOnlineAll, ETrue );
+ }
+ else if( mbStatus.iMailboxCount == 1 )
+ {
+ // Only one mailbox configured, dimm "Connect all"
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdGoOnlineAll, ETrue );
+ }
+ else
+ {
+ // Several mailboxes configured, dimm "Connect"
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdGoOnline, ETrue );
+ }
+
+ // Handle pop accounts that can't sync
+ RPointerArray<CFSMailBox> mailBoxes;
+ CleanupResetAndDestroyClosePushL( mailBoxes );
+ TFSMailMsgId id;
+ bool onlyPop = true;
+ TInt err = iAppUi.GetMailClient()->ListMailBoxes(
+ id,
+ mailBoxes );
+
+ for ( TInt i = 0; i < mailBoxes.Count(); i++ )
+ {
+ if (mailBoxes[i]->HasCapability( EFSMBoxCapaSupportsSync ))
+ {
+ onlyPop = false;
+ }
+ }
+
+ if (onlyPop)
+ {
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdSync, ETrue );
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdSyncAll, ETrue );
+ }
+
+ CleanupStack::PopAndDestroy( &mailBoxes );
+
+ // Handle items related to offline
+ if( mbStatus.iMailboxesOffline == mbStatus.iMailboxCount )
+ {
+ // All mailboxes are already offline
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdGoOffline, ETrue );
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdGoOfflineAll, ETrue );
+ }
+ else if( mbStatus.iMailboxCount == 1 )
+ {
+ // Only one mailbox configured, dimm "Disconnect all"
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdGoOfflineAll, ETrue );
+ }
+ else
+ {
+ // Several mailboxes configured, dimm "Disconnect"
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdGoOffline, ETrue );
+ }
+ }
+
+ // Add shortcut hints
+ iAppUi.ShortcutBinding().AppendShortcutHintsL( *aMenuPane,
+ CFSEmailUiShortcutBinding::EContextMainGrid );
+ }
+ }
+ }
+
+void CFSEmailUiLauncherGridVisualiser::HandleCommandL(TInt aCommand)
+ {
+ FUNC_LOG;
+ switch ( aCommand )
+ {
+ case EAknSoftkeyOpen:
+ {
+ if (!iAppUi.IsTimerFocusShown())
+ {
+ int wasActive = iAppUi.StartFocusRemovalTimer();
+
+ if (!wasActive)
+ {
+ UpdateFocusVisibility();
+ ResizeItemIcon( EFalse );
+ }
+
+ break;
+ }
+ }
+ case EFsEmailUiCmdOpen:
+ {
+ SelectL();
+ }
+ break;
+// <cmail> Hiding is disabled in Cmail
+// case EFsEmailUiCmdHide:
+// {
+// TApaTaskList taskList( iEikonEnv->WsSession() );
+// TApaTask task = taskList.FindApp( KFSEmailUiUid );
+// if ( task.Exists() )
+// {
+// task.SendToBackground(); // Send self to background
+// }
+// }
+// break;
+// </cmail>
+ case EFsEmailUiCmdDeleteMailbox:
+ {
+ iMailboxDeleter->DeleteMailboxL();
+ break;
+ }
+ case EFsEmailUiCmdSync:
+ case EFsEmailUiCmdSyncAll:
+ {
+ if (aCommand == EFsEmailUiCmdSyncAll)
+ {
+ iAppUi.ManualMailBoxSyncAll(ETrue);
+ }
+ else
+ {
+ iAppUi.ManualMailBoxSync(ETrue);
+ }
+ RPointerArray<CFSMailBox> mailBoxes;
+ CleanupResetAndDestroyClosePushL( mailBoxes );
+ TFSMailMsgId id;
+ TInt err = iAppUi.GetMailClient()->ListMailBoxes(
+ id,
+ mailBoxes );
+
+ for ( TInt i = 0; i < mailBoxes.Count(); i++ )
+ {
+ iAppUi.SubscribeMailboxL( mailBoxes[i]->GetId() );
+ // <cmail>
+ mailBoxes[i]->GetMailBoxStatus();
+ // </cmail>
+ mailBoxes[i]->RefreshNowL( iAppUi );
+ }
+
+ CleanupStack::PopAndDestroy( &mailBoxes );
+ }
+ break;
+ case EFsEmailUiCmdCancelSync:
+ {
+ RPointerArray<CFSMailBox> mailBoxes;
+ CleanupResetAndDestroyClosePushL( mailBoxes );
+ TFSMailMsgId id;
+ TInt err = iAppUi.GetMailClient()->ListMailBoxes(
+ id,
+ mailBoxes );
+
+ for ( TInt i = 0; i < mailBoxes.Count(); i++ )
+ {
+ iAppUi.SubscribeMailboxL( mailBoxes[i]->GetId() );
+ mailBoxes[i]->CancelSyncL();
+ }
+
+ CleanupStack::PopAndDestroy( &mailBoxes );
+ }
+ break;
+
+ case EFsEmailUiCmdGoOffline:
+ case EFsEmailUiCmdGoOfflineAll:
+ {
+ if (aCommand == EFsEmailUiCmdGoOfflineAll)
+ {
+ iAppUi.ManualMailBoxDisconnectAll(ETrue);
+ }
+ RPointerArray<CFSMailBox> mailBoxes;
+ CleanupResetAndDestroyClosePushL( mailBoxes );
+ TFSMailMsgId id;
+ TInt err = iAppUi.GetMailClient()->ListMailBoxes(
+ id,
+ mailBoxes );
+
+ for ( TInt i = 0; i < mailBoxes.Count(); i++ )
+ {
+ iAppUi.SubscribeMailboxL( mailBoxes[i]->GetId() );
+ mailBoxes[i]->GoOfflineL();
+ }
+
+ CleanupStack::PopAndDestroy( &mailBoxes );
+ }
+ break;
+ case EFsEmailUiCmdGoOnline:
+ case EFsEmailUiCmdGoOnlineAll:
+ {
+ if (aCommand == EFsEmailUiCmdGoOnlineAll)
+ {
+ iAppUi.ManualMailBoxConnectAll(ETrue);
+ }
+ RPointerArray<CFSMailBox> mailBoxes;
+ CleanupResetAndDestroyClosePushL( mailBoxes );
+ TFSMailMsgId id;
+ TInt err = iAppUi.GetMailClient()->ListMailBoxes(
+ id,
+ mailBoxes );
+
+ for ( TInt i = 0; i < mailBoxes.Count(); i++ )
+ {
+ iAppUi.SubscribeMailboxL( mailBoxes[i]->GetId() );
+ mailBoxes[i]->GoOnlineL();
+ }
+
+ CleanupStack::PopAndDestroy( &mailBoxes );
+ }
+ break;
+ case EFsEmailUiCmdAbout:
+ {
+ DisplayProductInfoL();
+ }
+ break;
+ case EFsEmailUiCmdHelp:
+ {
+ TFsEmailUiUtility::LaunchHelpL( KFSE_HLP_LAUNCHER_GRID );
+ }
+ break;
+ // <cmail>
+ case EFsEmailUiCmdHide:
+ // </cmail>
+ case EEikCmdExit:
+ case EAknSoftkeyExit:
+ case EFsEmailUiCmdExit:
+ {
+ iAppUi.Exit();
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+TBool CFSEmailUiLauncherGridVisualiser::OfferEventL(const TAlfEvent& aEvent)
+ {
+ FUNC_LOG;
+ if ( aEvent.IsKeyEvent() && aEvent.Code() == EEventKey )
+ {
+ // If wait note is being shown while a mailbox is being created,
+ // then do not react to key presses.
+ if ( iWizardWaitnoteShown )
+ {
+ return ETrue; // key consumed
+ }
+
+ // Swap right and left controls in mirrored layout
+ TInt scanCode = aEvent.KeyEvent().iScanCode;
+ if ( AknLayoutUtils::LayoutMirrored() )
+ {
+ if (scanCode == EStdKeyRightArrow) scanCode = EStdKeyLeftArrow;
+ else if (scanCode == EStdKeyLeftArrow ) scanCode = EStdKeyRightArrow;
+ }
+
+ if ((scanCode == EStdKeyRightArrow)
+ || (scanCode == EStdKeyLeftArrow)
+ || (scanCode == EStdKeyUpArrow)
+ || (scanCode == EStdKeyDownArrow)
+ || (scanCode == EStdKeyEnter)
+ || (scanCode == EStdKeyDeviceA)
+ || (scanCode ==EStdKeyDevice3))
+ {
+ TBool wasActive = iAppUi.StartFocusRemovalTimer();
+ if (!wasActive)
+ {
+ // focus is now activated. ignore key press.
+ UpdateFocusVisibility();
+ ResizeItemIcon( EFalse );
+ return ETrue;
+ }
+ }
+
+ switch(scanCode)
+ {
+ case EStdKeyRightArrow:
+ MoveSelection(EDirectionRight);
+ return ETrue;
+ case EStdKeyLeftArrow:
+ MoveSelection(EDirectionLeft);
+ return ETrue;
+ case EStdKeyUpArrow:
+ MoveSelection(EDirectionUp);
+ return ETrue;
+ case EStdKeyDownArrow:
+ MoveSelection(EDirectionDown);
+ return ETrue;
+ case EStdKeyEnter:
+ case EStdKeyDeviceA:
+ case EStdKeyDevice3:
+ HandleButtonReleaseEvent();
+ SelectL();
+ return ETrue;
+ default:
+ // Check keyboard shortcuts.
+ TInt shortcutCommand =
+ iAppUi.ShortcutBinding().CommandForShortcutKey( aEvent.KeyEvent(),
+ CFSEmailUiShortcutBinding::EContextMainGrid );
+ if ( shortcutCommand != KErrNotFound )
+ {
+ HandleCommandL( shortcutCommand );
+ return ETrue;
+ }
+ return EFalse;
+ }
+ }
+ return EFalse; // was not consumed
+ }
+
+// <cmail>
+// ---------------------------------------------------------------------------
+// CFSEmailUiLauncherGridVisualiser::HandlePointerEventL
+//
+// ---------------------------------------------------------------------------
+//
+TBool CFSEmailUiLauncherGridVisualiser::HandlePointerEventL(const TAlfEvent& aEvent)
+ {
+ FUNC_LOG;
+ TBool result( EFalse );
+ TInt currentlyFocused( iCurrentLevel.iSelected );
+ TPointerEvent::TType type = aEvent.PointerEvent().iType;
+ TInt id = FindPointedItem( aEvent );
+ if( KErrNotFound != id )
+ {
+ switch( type )
+ {
+ case TPointerEvent::EButton1Down:
+ {
+ iItemIdInButtonDownEvent.iItemId = id;
+ iItemIdInButtonDownEvent.iLaunchSelection = ETrue;
+ UpdateFocusVisibility();
+
+ SetFocusedItemL( id );
+ break;
+ }
+ case TPointerEvent::EButton1Up:
+ {
+ // If key was released on item that had focus
+ // trigger selection.
+ if( iItemIdInButtonDownEvent.iItemId == id &&
+ iItemIdInButtonDownEvent.iLaunchSelection )
+ {
+ // keyboard focus is now hidden
+ iAppUi.CancelFocusRemovalTimer();
+
+ HandleButtonReleaseEvent();
+
+ // LAUNCH OPENING. This may leave if user cancels the operation
+ SelectL();
+ }
+ else
+ {
+ HandleButtonReleaseEvent();
+ break;
+ }
+ }
+ case TPointerEvent::EDrag:
+ {
+ // if pointer is moved on to other item, decrease focused
+ // item's icon.
+ if( ( currentlyFocused != id ) &&
+ ( iItemIdInButtonDownEvent.iItemId != KErrNotFound ) )
+ {
+ iItemIdInButtonDownEvent.iLaunchSelection = EFalse;
+ ResizeItemIcon( ETrue );
+ }
+ // if pointer is moved on item that has focus, increase item's
+ // icon.
+ else if( id == iItemIdInButtonDownEvent.iItemId )
+ {
+ iItemIdInButtonDownEvent.iLaunchSelection = ETrue;
+ ResizeItemIcon( EFalse );
+ }
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ result = ETrue;
+ }
+ // if event do not concern any of items.
+ else if( iItemIdInButtonDownEvent.iItemId != KErrNotFound )
+ {
+ iItemIdInButtonDownEvent.iLaunchSelection = EFalse;
+ ResizeItemIcon( ETrue );
+ switch( type )
+ {
+ case TPointerEvent::EButton1Down:
+ {
+ // ask if focus is on (flip open)
+ // iItemIdInButtonDownEvent.iItemId = currentlyFocused
+ break;
+ }
+ case TPointerEvent::EButton1Up:
+ {
+ iItemIdInButtonDownEvent.iItemId = KErrNotFound;
+ HandleButtonReleaseEvent();
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ }
+ return result;
+ }
+
+// ---------------------------------------------------------------------------
+// CFSEmailUiLauncherGridVisualiser::FindPointedItem
+//
+// ---------------------------------------------------------------------------
+//
+TInt CFSEmailUiLauncherGridVisualiser::FindPointedItem( const TAlfEvent& aEvent )
+ {
+ FUNC_LOG;
+ TInt result = KErrNotFound;
+
+ TInt count = iCurrentLevel.iItemVisualData.Count();
+ const TPoint pos = aEvent.PointerEvent().iParentPosition;
+
+ for(TInt a = 0; count > a; a++)
+ {
+ const TRect rect(iCurrentLevel.iItemVisualData[a].iBase->DisplayRect());
+ if(rect.Contains( pos ))
+ {
+ result = a;
+ break;
+ }
+ }
+ return result;
+ }
+
+// ---------------------------------------------------------------------------
+// CFSEmailUiLauncherGridVisualiser::SetFocusedItemL
+//
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiLauncherGridVisualiser::SetFocusedItemL( TInt aId )
+ {
+ FUNC_LOG;
+ TInt oldSelection = iCurrentLevel.iSelected;
+
+ HandleRowMovement( EDirectionTouch, aId );
+
+ FocusItem( EFalse, oldSelection );
+// iCurrentLevel.iSelected = aId;
+ FocusItem( ETrue, iCurrentLevel.iSelected );
+ MoveSelectorToCurrentItem( EDirectionTouch );
+ }
+
+void CFSEmailUiLauncherGridVisualiser::MoveSelection( TDirection aDir )
+ {
+ FUNC_LOG;
+ // NULL double click flag just be sure that the UI does not
+ // go into state that wizard cannot be started.
+ iDoubleClickLock = EFalse;
+ // Store old selection
+ TInt oldSelection = iCurrentLevel.iSelected;
+ TInt itemCount = iCurrentLevel.iItemVisualData.Count();
+
+ HandleRowMovement( aDir, iCurrentLevel.iSelected );
+
+ // Set the correct icon focuses (i.e. enlarged)
+ if ( aDir != EDirectionNone && oldSelection >= 0 && oldSelection < itemCount )
+ {
+ FocusItem( EFalse, oldSelection );
+ }
+ FocusItem( ETrue, iCurrentLevel.iSelected );
+
+ // Move the selector over the newly focused icon
+ MoveSelectorToCurrentItem( aDir );
+ }
+
+
+void CFSEmailUiLauncherGridVisualiser::HandleRowMovement( TDirection aDir, TInt aSelected )
+ {
+ FUNC_LOG;
+ // NULL double click flag just be sure that the UI does not
+ // go into state that wizard cannot be started.
+ iDoubleClickLock = EFalse;
+ // Store old selection
+ TInt oldSelection = iCurrentLevel.iSelected;
+ TInt itemCount = iCurrentLevel.iItemVisualData.Count();
+ TInt oldX = 0;
+ TInt oldY = 0;
+ if (itemCount <= 1)
+ {
+ iCurrentLevel.iSelected = 0;
+ }
+ else
+ {
+ oldX = oldSelection % iVisibleColumns;
+ oldY = (oldSelection-oldX) / iVisibleColumns;
+
+ switch( aDir )
+ {
+ case EDirectionRight:
+ iCurrentLevel.iSelected++;
+ if ( iCurrentLevel.iSelected >= itemCount )
+ {
+ iCurrentLevel.iSelected = 0;
+ }
+ break;
+
+ case EDirectionLeft:
+ iCurrentLevel.iSelected--;
+ if ( iCurrentLevel.iSelected < 0 )
+ {
+ iCurrentLevel.iSelected = itemCount-1;
+ }
+ break;
+
+ case EDirectionUp:
+ iCurrentLevel.iSelected -= iVisibleColumns; // one row up
+ if ( iCurrentLevel.iSelected < 0 )
+ {
+ iCurrentLevel.iSelected += (iRowCount*iVisibleColumns);
+ if ( iCurrentLevel.iSelected >= itemCount )
+ {
+ // Wrapping is about to move the cursor on empty spot.
+ // To be consistent with S60 app grid, move selection to the last item.
+ iCurrentLevel.iSelected = itemCount-1;
+ }
+ }
+ break;
+
+ case EDirectionDown:
+ iCurrentLevel.iSelected += iVisibleColumns; // one row down
+ if ( iCurrentLevel.iSelected >= itemCount )
+ {
+ if ( oldY < iRowCount-1 )
+ {
+ iCurrentLevel.iSelected = itemCount-1;
+ }
+ else
+ {
+ iCurrentLevel.iSelected %= (iRowCount*iVisibleColumns);
+ }
+ }
+ break;
+
+ case EDirectionReset:
+ iCurrentLevel.iSelected = KDefaultSelection;
+ break;
+
+ case EDirectionNone:
+ break;
+
+ case EDirectionTouch:
+ iCurrentLevel.iSelected = aSelected;
+ break;
+
+ }
+
+ if ( iCurrentLevel.iSelected < 0 )
+ {
+ iCurrentLevel.iSelected = 0;
+ }
+ if ( iCurrentLevel.iSelected >= itemCount )
+ {
+ iCurrentLevel.iSelected = itemCount - 1;
+ }
+ }
+
+ TInt x = iCurrentLevel.iSelected % iVisibleColumns;
+ TInt y = (iCurrentLevel.iSelected-x) / iVisibleColumns;
+
+ ScrollToRow( y );
+
+ }
+// </cmail>
+
+void CFSEmailUiLauncherGridVisualiser::MoveSelectorToCurrentItem( TDirection aDir )
+ {
+ FUNC_LOG;
+ TAlfRealPoint curPos = iSelector->Pos().ValueNow(); // this is the wrapped value of the current position
+ iSelector->SetPos( curPos, 0 ); // wrap position now
+
+ // Calculate where are we heading
+ // <cmail> Platform layout change
+ CAlfVisual* selectedBase = iCurrentLevel.iItemVisualData[iCurrentLevel.iSelected].iBase;
+ TPoint displayPos = selectedBase->LocalToDisplay( selectedBase->Pos().Target() );
+ // </cmail>
+ TPoint targetPos = iSelector->DisplayToLocal( displayPos );
+
+ // Check if we need to wrap the selector over the edge of the screen
+ TPoint ringWrapOffset( 0, 0 );
+ const TInt KGridWrapWidth = (iVisibleColumns+2)*iColumnWidth;
+ const TInt KGridWrapHeight = (iRowCount+2)*iRowHeight;
+
+ if ( aDir == EDirectionRight && ( targetPos.iX <= curPos.iX || iCurrentLevel.iSelected == 0 ) )
+ {
+ ringWrapOffset.iX = KGridWrapWidth;
+ }
+ else if ( aDir == EDirectionLeft && ( targetPos.iX >= curPos.iX || iCurrentLevel.iSelected == iCurrentLevel.iItems.Count()-1 ) )
+ {
+ ringWrapOffset.iX = -KGridWrapWidth;
+ }
+ else if ( aDir == EDirectionUp && targetPos.iY > curPos.iY )
+ {
+ ringWrapOffset.iY = -KGridWrapHeight;
+ }
+ else if ( aDir == EDirectionDown && targetPos.iY < curPos.iY )
+ {
+ ringWrapOffset.iY = KGridWrapHeight;
+ }
+ targetPos += ringWrapOffset;
+
+ // Animate the movement to the new position
+ TInt animTime = KSelectTransitionTimeMs;
+ // <cmail>
+ if ( aDir == EDirectionReset || aDir == EDirectionNone || aDir == EDirectionTouch )
+ // </cmail>
+ {
+ animTime = KStartupAnimationTime;
+ }
+ iSelector->SetPos( targetPos, animTime );
+ }
+
+void CFSEmailUiLauncherGridVisualiser::FocusItem( TBool aHasFocus, TInt aItem )
+ {
+ FUNC_LOG;
+ if ( iCurrentLevel.iItemVisualData.Count() <= aItem ||
+ aItem < 0 )
+ {
+ // Invalid item index
+ return;
+ }
+
+ if( aHasFocus && ( IsFocusShown() || iItemIdInButtonDownEvent.iItemId >= 0 ) )
+ {
+ TAlfTimedValue scaleValue;
+ scaleValue.SetTarget( KScaleSelected, KIconScalingTransitionTimeMs );
+ iCurrentLevel.iItemVisualData[aItem].iImage->SetScale( scaleValue );
+ }
+ else
+ {
+ TAlfTimedValue scaleValue;
+ scaleValue.SetTarget( KScaleNotSelected, KIconScalingTransitionTimeMs * 2 );
+ iCurrentLevel.iItemVisualData[aItem].iImage->SetScale( scaleValue );
+ }
+ }
+
+
+void CFSEmailUiLauncherGridVisualiser::ScrollToRow( TInt aRow )
+ {
+ FUNC_LOG;
+ const TInt KScrollTransitionTimeMs = KSelectTransitionTimeMs;
+ TReal offset( 0.0 );
+
+ if ( aRow >= iRowCount || aRow < 0 )
+ {
+ // Invalid row
+ return;
+ }
+
+// <cmail> Fix scrolling so that it works properly with 2 visible rows (landscape layout data)
+ if ( iFirstVisibleRow + iVisibleRows - 1 < aRow )
+ {
+ // Scroll downwards
+// if ( aRow == iRowCount - 1 )
+// {
+ iFirstVisibleRow = aRow - iVisibleRows + 1 ;
+ // }
+// else
+// {
+// iFirstVisibleRow = aRow - iVisibleRows + 2;
+// }
+ }
+ else if ( iFirstVisibleRow > aRow )
+ {
+ // Scroll upwards
+ if ( aRow == 0 )
+ {
+ iFirstVisibleRow = 0;
+ }
+ else
+ {
+ iFirstVisibleRow = aRow;
+ }
+ }
+
+
+ offset = iFirstVisibleRow * iRowHeight;
+
+ TAlfTimedPoint alfScrollOffset;
+ alfScrollOffset.iY.SetTarget( offset , KScrollTransitionTimeMs );
+ iCurrentLevel.iGridLayout->SetScrollOffset(alfScrollOffset);
+// <cmail>
+ iScrollbarModel.SetFocusPosition(iFirstVisibleRow);
+ TRAP_IGNORE( iScrollbar->SetModelL(&iScrollbarModel) );
+ iScrollbar->DrawNow();
+// </cmail>
+ }
+
+void CFSEmailUiLauncherGridVisualiser::RefreshLauncherViewL()
+ {
+ FUNC_LOG;
+ if ( iConstructionCompleted )
+ {
+ iDoubleClickLock = EFalse;
+ TInt count = iCurrentLevel.iItemVisualData.Count();
+
+ CreateModelL();
+ PopulateL( iCurrentLevel );
+ SetRingWrapLimits();
+ if ( count != iCurrentLevel.iItemVisualData.Count() )
+ {
+ MoveSelection( EDirectionReset );
+ }
+ else
+ {
+ FocusItem( ETrue, iCurrentLevel.iSelected );
+ }
+ UpdateScrollBarRangeL();
+ }
+ }
+
+TBool CFSEmailUiLauncherGridVisualiser::UiOperationLaunched()
+ {
+ FUNC_LOG;
+ return iUiOperationLaunched;
+ }
+
+void CFSEmailUiLauncherGridVisualiser::PopulateL( TLevel& aLevel )
+ {
+ FUNC_LOG;
+ if ( iConstructionCompleted )
+ {
+ for( TInt i = 0; i < aLevel.iItemVisualData.Count(); i++ )
+ {
+ aLevel.iItemVisualData[i].iBase->RemoveAndDestroyAllD();
+ }
+ aLevel.iItemVisualData.Reset();
+ aLevel.iItems.Reset();
+
+// <cmail> Use layout data instead of hard-coded values
+ TRect mainPaneRect;
+ AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect);
+
+ TAknLayoutRect scrollBarRect;
+ scrollBarRect.LayoutRect(mainPaneRect, AknLayoutScalable_Avkon::aid_size_touch_scroll_bar());
+ TRect gridRect = mainPaneRect;
+ gridRect.iBr.iX -= scrollBarRect.Rect().Width();
+
+ TInt var = Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0;
+
+ TAknLayoutRect itemRect;
+ itemRect.LayoutRect(gridRect, AknLayoutScalable_Apps::cell_cmail_l_pane(var, 0, 0));
+
+ TRect itemrc = itemRect.Rect();
+ itemrc.SetRect(TPoint(0,0), itemRect.Rect().Size());
+
+ TAknLayoutRect gridIconRect;
+ gridIconRect.LayoutRect(itemrc, AknLayoutScalable_Apps::cell_cmail_l_pane_g1(var));
+
+ TAknLayoutText gridText;
+ gridText.LayoutText(itemrc, AknLayoutScalable_Apps::cell_cmail_l_pane_t1(var));
+// </cmail>
+
+ if( aLevel.iParent >= 0 )
+ {
+ iModel->FindChildren( aLevel.iParent, aLevel.iItems );
+
+ for( TInt i = 0; i < aLevel.iItems.Count(); i++ )
+ {
+ TItemVisualData newItem;
+
+ newItem.iBase = CAlfAnchorLayout::AddNewL( *iControl, aLevel.iGridLayout );
+ newItem.iBase->SetTactileFeedbackL( ETouchEventStylusDown, ETouchFeedbackBasic );
+
+// <cmail> Use layout data instead of hard-coded values
+ // Set anchors for text
+ newItem.iBase->SetAnchor(
+ EAlfAnchorTopLeft,
+ 0,
+ EAlfAnchorOriginLeft,
+ EAlfAnchorOriginTop,
+ EAlfAnchorMetricAbsolute,
+ EAlfAnchorMetricAbsolute,
+ TAlfTimedPoint( gridText.TextRect().iTl.iX, gridText.TextRect().iTl.iY ) );// 0, gridIconSize+KTopMargin ) );
+ newItem.iBase->SetAnchor(
+ EAlfAnchorBottomRight,
+ 0,
+ EAlfAnchorOriginLeft,
+ EAlfAnchorOriginTop,
+ EAlfAnchorMetricAbsolute,
+ EAlfAnchorMetricAbsolute,
+ TAlfTimedPoint( gridText.TextRect().iBr.iX, gridText.TextRect().iBr.iY ) );//0, iRowHeight ) );
+
+ // Set anchors for image
+ newItem.iBase->SetAnchor(
+ EAlfAnchorTopLeft,
+ 1,
+ EAlfAnchorOriginLeft,
+ EAlfAnchorOriginTop,
+ EAlfAnchorMetricAbsolute,
+ EAlfAnchorMetricAbsolute,
+ TAlfTimedPoint( gridIconRect.Rect().iTl.iX, gridIconRect.Rect().iTl.iY ) ); //-gridIconSize/2, KTopMargin ) );
+ newItem.iBase->SetAnchor(
+ EAlfAnchorBottomRight,
+ 1,
+ EAlfAnchorOriginLeft,
+ EAlfAnchorOriginTop,
+ EAlfAnchorMetricAbsolute,
+ EAlfAnchorMetricAbsolute,
+ TAlfTimedPoint( gridIconRect.Rect().iBr.iX, gridIconRect.Rect().iBr.iY ) ); //gridIconSize/2, gridIconSize+KTopMargin ) );
+// </cmail>
+
+ newItem.iText = CAlfTextVisual::AddNewL( *iControl, newItem.iBase );
+ newItem.iText->EnableShadow( EFalse );
+// <cmail> Use layout data instead of hard-coded values
+ TRgb itemColor (KRgbGray);
+ // text #9 application grid unfocused application title texts #215
+ if( AknsUtils::GetCachedColor( AknsUtils::SkinInstance(),
+ itemColor, KAknsIIDQsnTextColors,
+ EAknsCIQsnTextColorsCG9 ) != KErrNone )
+ {
+ itemColor = gridText.Color();//iAppUi.LayoutHandler()->ListNormalStateTextSkinColor();
+ }
+ newItem.iText->SetColor(itemColor);
+// </cmail>
+
+ newItem.iText->SetTextL( *aLevel.iItems[i].iCaption );
+
+ TAlfTimedValue opacity;
+ opacity.SetValueNow ( KDefaultCaptionOpacity );
+ newItem.iText->SetOpacity( opacity );
+
+ newItem.iText->SetTextStyle( iAppUi.LayoutHandler()->FSTextStyleFromLayoutL(AknLayoutScalable_Apps::cell_cmail_l_pane_t1(var)).Id() );//FSTextStyleFromIdL( EFSFontTypeSmall )->Id() );
+ newItem.iText->SetWrapping( CAlfTextVisual::ELineWrapTruncate );
+ newItem.iText->SetAlign( EAlfAlignHCenter, EAlfAlignVTop );
+
+ newItem.iImage = CAlfImageVisual::AddNewL( *iControl, newItem.iBase );
+ newItem.iImage->SetScaleMode( CAlfImageVisual::EScaleFit );
+ newItem.iImage->SetImage( TAlfImage( *aLevel.iItems[i].iIconTexture ) );
+ newItem.iImage->SetFlag( EAlfVisualFlagManualSize );
+
+// <cmail> Use layout data instead of hard-coded values
+ newItem.iImage->SetSize( gridIconRect.Rect().Size() );
+ newItem.iImage->SetScale( KScaleNotSelected );
+// </cmail>
+
+ User::LeaveIfError( aLevel.iItemVisualData.Append( newItem ) );
+ }
+ }
+
+// <cmail> Use layout data instead of hard-coded values
+ // Set columns and rows
+ //iVisibleColumns = iAppUi.LayoutHandler()->GridColumnsInThisResolution();
+ //iVisibleRows = iAppUi.LayoutHandler()->GridRowsInThisResolution();
+ iVisibleRows = AknLayoutScalable_Apps::cell_cmail_l_pane_ParamLimits(var).LastRow() + 1;
+ iVisibleColumns = AknLayoutScalable_Apps::cell_cmail_l_pane_ParamLimits(var).LastColumn() + 1;
+// </cmail>
+ iRowCount = ( iCurrentLevel.iItemVisualData.Count() + iVisibleColumns - 1 ) / iVisibleColumns;
+
+ aLevel.iGridLayout->MoveToFront();
+ }
+ }
+
+void CFSEmailUiLauncherGridVisualiser::SelectL()
+ {
+ FUNC_LOG;
+ if ( !iAppUi.ViewSwitchingOngoing() )
+ {
+ iItemIdInButtonDownEvent.iItemId = KErrNotFound;
+ UpdateFocusVisibility();
+
+ CFSEmailLauncherItem* launcherItem =
+ iCurrentLevel.iItems[iCurrentLevel.iSelected].iLauncherItem;
+ if ( launcherItem )
+ {
+ launcherItem->ExecuteActionL();
+ }
+ else
+ {
+ iUiOperationLaunched = ETrue;
+ switch ( iCurrentLevel.iItems[iCurrentLevel.iSelected].iId )
+ {
+ case EDefaultMailboxItem:
+ case EOtherMailboxItems:
+ {
+ TMailListActivationData tmp;
+ tmp.iFolderId = iCurrentLevel.iItems[iCurrentLevel.iSelected].iMailBoxInboxId;
+ tmp.iMailBoxId = iCurrentLevel.iItems[iCurrentLevel.iSelected].iMailBoxId;
+ const TPckgBuf<TMailListActivationData> pkgOut( tmp );
+ iAppUi.ShowTitlePaneConnectionStatus();
+ iAppUi.EnterFsEmailViewL( MailListId, KStartListWithFolderId, pkgOut );
+ }
+ break;
+ case EDirectoryItem:
+ {
+ // TO prevent accidental double clicks of the directory item,
+ // prevents multiple RCL windows to be seen
+ if ( !iDoubleClickLock )
+ {
+ // Lock to make sure that wizard is not started twice in a row
+ iDoubleClickLock = ETrue;
+ RPointerArray<CFSMailBox> mailBoxes;
+ CleanupResetAndDestroyClosePushL( mailBoxes );
+ TFSMailMsgId id;
+ TInt err = iAppUi.GetMailClient()->ListMailBoxes(
+ id,
+ mailBoxes );
+
+ // Remove mailboxes that doesn't support RCL
+ for ( TInt i = mailBoxes.Count()-1; i >= 0 ; i-- )
+ {
+ if ( !TFsEmailUiUtility::IsRemoteLookupSupported( *mailBoxes[i] ) )
+ {
+ delete mailBoxes[i];
+ mailBoxes.Remove( i );
+ }
+ }
+
+ CFSMailBox* mailBox = NULL;
+ if( mailBoxes.Count() == 1 )
+ {
+ // Only one mailbox with RCL support so we use that
+ mailBox = mailBoxes[0];
+ }
+ else if( mailBoxes.Count() > 1 )
+ {
+ // Several mailboxes that support RCL so we need to
+ // ask the user which one to use
+ mailBox = ShowMailboxSelectionQueryL( mailBoxes );
+ }
+
+ if ( mailBox )
+ {
+ CFsDelayedLoader::InstanceL()->GetContactHandlerL()->LaunchRemoteLookupL( *mailBox );
+ }
+ iDoubleClickLock = EFalse;
+ CleanupStack::PopAndDestroy( &mailBoxes );
+ }
+ }
+ break;
+ case ESettingsItem:
+ {
+ TInt tmp = 0;
+ const TPckgBuf<TInt> pkgBuf( tmp );
+ iAppUi.EnterFsEmailViewL(
+ SettingsViewId,
+ TUid::Uid(KMailSettingsOpenMainList),
+ pkgBuf );
+ }
+ break;
+ case EAddNewMailboxItem:
+ {
+ // To prevent accidental double clicks of the wizard item
+ // wizard would crash without this
+ if ( !iDoubleClickLock )
+ {
+ iDoubleClickLock = ETrue;
+ LaunchWizardL();
+ }
+ }
+ break;
+ case EHelpItem:
+ {
+ // To prevent accidental double clicks of the help item
+ // Help app might crash without this
+ if ( !iDoubleClickLock )
+ {
+ iDoubleClickLock = ETrue;
+ TFsEmailUiUtility::LaunchHelpL( KFSE_HLP_LAUNCHER_GRID );
+ }
+ }
+ break;
+ default:
+ return;
+ }
+ }
+ }
+ }
+
+
+void CFSEmailUiLauncherGridVisualiser::HandleForegroundEventL()
+ {
+ FUNC_LOG;
+
+ UpdateFocusVisibility();
+
+ // Toggle safety lock always when receiving foreground back.
+ if ( iFirstStartComplete && iDoubleClickLock )
+ {
+ iDoubleClickLock = EFalse;
+ }
+ }
+
+void CFSEmailUiLauncherGridVisualiser::GetParentLayoutsL(
+ RPointerArray<CAlfVisual>& aLayoutArray ) const
+ {
+ aLayoutArray.AppendL( iParentLayout );
+ }
+
+// -----------------------------------------------------------------------------
+// CFSEmailUiLauncherGridVisualiser::ShowMailboxSelectionQueryL
+// -----------------------------------------------------------------------------
+CFSMailBox* CFSEmailUiLauncherGridVisualiser::ShowMailboxSelectionQueryL(
+ const RPointerArray<CFSMailBox>& aMailBoxes )
+ {
+ FUNC_LOG;
+ CDesCArrayFlat* array = new (ELeave) CDesCArrayFlat( 2 );
+ CleanupStack::PushL( array );
+
+ for( TInt i = 0; i < aMailBoxes.Count(); i++ )
+ {
+ array->AppendL( aMailBoxes[i]->GetName() );
+ }
+
+ TInt selectedOption;
+ CAknListQueryDialog* dlg = new ( ELeave ) CAknListQueryDialog( &selectedOption );
+ dlg->PrepareLC( R_FSEMAILUI_LAUNCHER_GRID_MAILBOX_SELECTION_DIALOG );
+
+ dlg->SetItemTextArray( array );
+ dlg->SetOwnershipType( ELbmDoesNotOwnItemArray );
+
+ CFSMailBox* mailbox = NULL;
+ if( dlg->RunLD() )
+ {
+ // safety check.
+ if( selectedOption >= 0 &&
+ selectedOption < aMailBoxes.Count() )
+ {
+ mailbox = aMailBoxes[selectedOption];
+ }
+ }
+
+ CleanupStack::PopAndDestroy( array );
+ return mailbox;
+ }
+
+void CFSEmailUiLauncherGridVisualiser::LaunchWizardL()
+ {
+ FUNC_LOG;
+ // Start wizard.
+
+ // Make sure that FSMailServer is running, so that the mailbox is added
+ // also to MCE. It should be enough to do it here, because it takes some
+ // time from wizard startup until the actual mailbox is created, so the
+ // serve has some time to get itself up and running before that.
+ TFsEmailUiUtility::EnsureFsMailServerIsRunning( iEikonEnv->WsSession() );
+ //we are calling DoFirstStarL() method because in case User goes to GeneralSettings->Email
+ //iAiwSHandler isnt constructed and in that case EmailUi panics
+ if ( !iConstructionCompleted )
+ {
+ DoFirstStartL();
+ }
+
+ iAiwSHandler->ExecuteServiceCmdL( KAiwCmdSettingWizardFsEmail.iUid,
+ iAiwSHandler->InParamListL(),
+ iAiwSHandler->OutParamListL() );
+ }
+
+void CFSEmailUiLauncherGridVisualiser::GoToInboxL( TFSMailMsgId& aMailboxId, TFSMailMsgId& aMailboxInboxId )
+ {
+ FUNC_LOG;
+ TMailListActivationData tmp;
+
+ tmp.iMailBoxId = aMailboxId;
+ tmp.iFolderId = aMailboxInboxId;
+
+ const TPckgBuf<TMailListActivationData> pkgOut( tmp );
+
+ iAppUi.EnterFsEmailViewL( MailListId, KStartListWithFolderId, pkgOut );
+ }
+
+void CFSEmailUiLauncherGridVisualiser::RescaleIconsL()
+ {
+ FUNC_LOG;
+ if ( iConstructionCompleted )
+ {
+ // <cmail> Use layout data instead of hard-coded values
+ TRect mainPaneRect;
+ AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect);
+ TInt var = Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0;
+
+ TAknLayoutRect scrollBarRect;
+ scrollBarRect.LayoutRect(mainPaneRect, AknLayoutScalable_Avkon::aid_size_touch_scroll_bar());
+ TRect gridRect = mainPaneRect;
+ gridRect.iBr.iX -= scrollBarRect.Rect().Width();
+
+ TAknLayoutRect itemRect;
+ itemRect.LayoutRect(gridRect, AknLayoutScalable_Apps::cell_cmail_l_pane(var, 0, 0));
+
+ TAknLayoutRect gridIconRect;
+ gridIconRect.LayoutRect(itemRect.Rect(), AknLayoutScalable_Apps::cell_cmail_l_pane_g1(var));
+
+ //TInt gridIconSize = iAppUi.LayoutHandler()->GridIconSize();
+ TSize iconSize = gridIconRect.Rect().Size();
+ //iconSize.SetSize( gridIconSize, gridIconSize );
+ // </cmail>
+
+ // Scale bitmaps
+ for( TInt i = 0 ; i < iIconArray.Count() ; i++ )
+ {
+ iIconArray[i]->Size().SetSize( iconSize.iWidth, iconSize.iHeight );
+ }
+ // Scale visuals
+ for ( TInt item = 0; item < iCurrentLevel.iItemVisualData.Count() ; item++ )
+ {
+ iCurrentLevel.iItemVisualData[item].iImage->SetSize( iconSize );
+ }
+ }
+ }
+
+void CFSEmailUiLauncherGridVisualiser::AddItemToModelL( CFSEmailLauncherItem* aItem, TInt aPluginArrayIndex )
+ {
+ FUNC_LOG;
+ if ( iConstructionCompleted && aItem->IsVisible() )
+ {
+ HBufC* launcherItemText = aItem->Caption( EFalse ).AllocLC();
+ CAknIcon* launcherItemIcon = aItem->Icon();
+
+ if ( launcherItemIcon )
+ {
+// <cmail> Use layout data instead of hard-coded values
+ TRect mainPaneRect;
+ AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect);
+
+ TAknLayoutRect scrollBarRect;
+ scrollBarRect.LayoutRect(mainPaneRect, AknLayoutScalable_Avkon::aid_size_touch_scroll_bar());
+ TRect gridRect = mainPaneRect;
+ gridRect.iBr.iX -= scrollBarRect.Rect().Width();
+
+ TInt var = Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0;
+
+ TAknLayoutRect itemRect;
+ itemRect.LayoutRect(gridRect, AknLayoutScalable_Apps::cell_cmail_l_pane(var, 0, 0));
+
+ TAknLayoutRect gridIconRect;
+ gridIconRect.LayoutRect(itemRect.Rect(), AknLayoutScalable_Apps::cell_cmail_l_pane_g1(var));
+
+ TSize iconSize = gridIconRect.Rect().Size();
+// </cmail>
+
+ const CFbsBitmap* bitmap = launcherItemIcon->Bitmap();
+ const CFbsBitmap* mask = launcherItemIcon->Mask();
+
+ // First add plugin id and icon id pair to array, needed in provide bitmap
+ TPluginIdIconIdPair idPair;
+ idPair.iPluginArrayIndex = aPluginArrayIndex;
+ idPair.iIconId = iPluginTextureId;
+ iPluginIdIconIdPairs.Append( idPair );
+
+ // Create texture, goes to provide bitmap
+ CAlfTexture* texture = &CAlfStatic::Env().TextureManager().CreateTextureL( iPluginTextureId, this, EAlfTextureFlagDefault );
+ // Update texture id
+ iPluginTextureId++; // Id is updated dynamically
+ // Set initiel size
+// <cmail> Use layout data instead of hard-coded values
+ //TSize iconSize(iAppUi.LayoutHandler()->GridIconSize(), iAppUi.LayoutHandler()->GridIconSize() );
+// <cmail>
+ texture->Size().SetSize( iconSize.iHeight, iconSize.iWidth );
+ iModel->AddL(
+ EShortcut,
+ aItem->Id(),
+ *launcherItemText,
+ *texture,
+ 0,
+ aItem );
+ iIconArray.AppendL( texture );
+ }
+ else
+ {
+ CAlfTexture* texture = &iAppUi.FsTextureManager()->TextureByIndex( EGridInboxTexture );
+
+ iModel->AddL(
+ EShortcut,
+ aItem->Id(),
+ *launcherItemText,
+ *texture,
+ 0,
+ aItem );
+ iIconArray.AppendL( texture );
+ }
+
+ CleanupStack::PopAndDestroy( launcherItemText );
+ }
+ }
+
+void CFSEmailUiLauncherGridVisualiser::VisualLayoutUpdatedL()
+ {
+ FUNC_LOG;
+ if ( iConstructionCompleted )
+ {
+ iCurrentLevel.iParent = 0;
+
+ // <cmail> Use layout data instead of hard-coded values
+ TRect mainPaneRect;
+ AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect);
+ TInt var = Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0;
+
+ TAknLayoutRect scrollBarRect;
+ // <cmail>
+// scrollBarRect.LayoutRect(mainPaneRect, AknLayoutScalable_Avkon::aid_size_touch_scroll_bar());
+ scrollBarRect.LayoutRect(mainPaneRect, AknLayoutScalable_Apps::scroll_pane_cp03());
+ // </cmail>
+ TRect gridRect = mainPaneRect;
+ gridRect.iBr.iX -= scrollBarRect.Rect().Width();
+
+ TAknLayoutRect cellRect;
+ cellRect.LayoutRect(gridRect, AknLayoutScalable_Apps::aid_size_cell_cmail_l(var, 0, 0));
+
+ TAknLayoutRect itemRect;
+ itemRect.LayoutRect(gridRect, AknLayoutScalable_Apps::cell_cmail_l_pane(var, 0, 0));
+
+ TAknLayoutRect gridIconRect;
+ gridIconRect.LayoutRect(itemRect.Rect(), AknLayoutScalable_Apps::cell_cmail_l_pane_g1(var));
+
+ TAknLayoutRect selectorRect;
+ selectorRect.LayoutRect(itemRect.Rect(), AknLayoutScalable_Apps::grid_highlight_pane_cp018(var));
+
+ CFSEmailUiLayoutHandler* layoutHandler = iAppUi.LayoutHandler();
+ iSelectorImageVisual->SetSize( selectorRect.Rect().Size() ); // layoutHandler->SelectorVisualSizeInThisResolution() );
+
+ TSize displaySize = mainPaneRect.Size();//iControl->DisplayArea().Size();
+
+ TInt columns = iVisibleColumns = AknLayoutScalable_Apps::cell_cmail_l_pane_ParamLimits(var).LastColumn() + 1; //layoutHandler->GridColumnsInThisResolution();
+ TInt rows = iVisibleRows = AknLayoutScalable_Apps::cell_cmail_l_pane_ParamLimits(var).LastRow() + 1; //layoutHandler->GridRowsInThisResolution();
+
+ // </cmail>
+
+ iCurrentLevel.iGridLayout->SetSize( gridRect.Size() );
+ iCurrentLevel.iGridLayout->SetColumnsL( columns );
+ iCurrentLevel.iGridLayout->SetRowsL( rows );
+
+ PopulateL( iCurrentLevel );
+ UpdateScrollBarRangeL();
+
+ TInt scrollbarWidth = scrollBarRect.Rect().Width();
+ // <cmail>
+ if( iRowCount > iVisibleRows )
+ {
+ iScrollbar->MakeVisible(ETrue);
+ }
+ else
+ {
+ iScrollbar->MakeVisible(EFalse);
+ }
+ // </cmail>
+
+ TInt scrollbarTopLeftX = displaySize.iWidth - scrollbarWidth;
+ TInt scrollbarTopLeftY = 0;
+ TInt scrollbarBottomRightX = displaySize.iWidth;
+ TInt scrollbarBottomRightY = displaySize.iHeight;
+ TInt gridTopLeftX = 0;
+ TInt gridTopLeftY = 0;
+ TInt gridBottomRightX = displaySize.iWidth - scrollbarWidth;
+ TInt gridBottomRightY = displaySize.iHeight;
+
+ if ( AknLayoutUtils::LayoutMirrored() )
+ {
+ // Mirrored layout
+ scrollbarTopLeftX = 0;
+ scrollbarTopLeftY = 0;
+ scrollbarBottomRightX = scrollbarWidth;
+ scrollbarBottomRightY = displaySize.iHeight;
+ gridTopLeftX = scrollbarWidth;
+ gridTopLeftY = 0;
+ gridBottomRightX = displaySize.iWidth;
+ gridBottomRightY = displaySize.iHeight;
+ }
+
+ // Set anchors for the scroll bar
+ iWidgetLayout->SetAnchor(
+ EAlfAnchorTopLeft,
+ 0,
+ EAlfAnchorOriginLeft,
+ EAlfAnchorOriginTop,
+ EAlfAnchorMetricAbsolute,
+ EAlfAnchorMetricAbsolute,
+ TAlfTimedPoint( scrollbarTopLeftX, scrollbarTopLeftY ) );
+ iWidgetLayout->SetAnchor(
+ EAlfAnchorBottomRight,
+ 0,
+ EAlfAnchorOriginLeft,
+ EAlfAnchorOriginTop,
+ EAlfAnchorMetricAbsolute,
+ EAlfAnchorMetricAbsolute,
+ TAlfTimedPoint( scrollbarBottomRightX, scrollbarBottomRightY ) );
+
+ // Set anchors for the grid
+ iWidgetLayout->SetAnchor(
+ EAlfAnchorTopLeft,
+ 1,
+ EAlfAnchorOriginLeft,
+ EAlfAnchorOriginTop,
+ EAlfAnchorMetricAbsolute,
+ EAlfAnchorMetricAbsolute,
+ TAlfTimedPoint( gridTopLeftX, gridTopLeftY ) );
+ iWidgetLayout->SetAnchor(
+ EAlfAnchorBottomRight,
+ 1,
+ EAlfAnchorOriginLeft,
+ EAlfAnchorOriginTop,
+ EAlfAnchorMetricAbsolute,
+ EAlfAnchorMetricAbsolute,
+ TAlfTimedPoint( gridBottomRightX, gridBottomRightY ) );
+
+ iParentLayout->UpdateChildrenLayout();
+
+ TSize gridSize = iCurrentLevel.iGridLayout->Size().IntTarget().AsSize();
+ iColumnWidth = gridSize.iWidth / iVisibleColumns;
+ iRowHeight = gridSize.iHeight / iVisibleRows;
+
+ // Selector ring wrap limits can be calculated when row and column sizes are known.
+ SetRingWrapLimits();
+ MoveSelection( EDirectionNone );
+
+ // <cmail>
+ TRect scrollbarRect;
+ scrollbarRect.SetRect(scrollbarTopLeftX, scrollbarTopLeftY, scrollbarBottomRightX, scrollbarBottomRightY);
+ scrollbarRect.Move(mainPaneRect.iTl);
+ iScrollbar->SetRect(scrollbarRect);
+ // </cmail>
+ iRefreshNeeded = EFalse;
+ }
+ }
+
+void CFSEmailUiLauncherGridVisualiser::SetRingWrapLimits()
+ {
+ FUNC_LOG;
+ if ( iConstructionCompleted )
+ {
+ iRingMovementXFuncMappingDataProvider.SetStart(-iColumnWidth);
+ iRingMovementXFuncMappingDataProvider.SetEnd((iVisibleColumns+1)*iColumnWidth);
+ iRingMovementYFuncMappingDataProvider.SetStart(-iRowHeight);
+ iRingMovementYFuncMappingDataProvider.SetEnd((iRowCount+1)*iRowHeight);
+
+ iRingMovementXFunc->SetMappingTableValues( -(iVisibleColumns+2)*iColumnWidth, (iVisibleColumns*2+2)*iColumnWidth, &iRingMovementXFuncMappingDataProvider );
+ iRingMovementYFunc->SetMappingTableValues( -(iRowCount+2)*iRowHeight, (iRowCount*2+2)*iRowHeight, &iRingMovementYFuncMappingDataProvider );
+ }
+ }
+
+void CFSEmailUiLauncherGridVisualiser::DisplayProductInfoL()
+ {
+ FUNC_LOG;
+ //Load the texts from resource
+ HBufC* text_1 = StringLoader::LoadLC( R_DISCLAIMER_PART_1 );
+ HBufC* text_2 = StringLoader::LoadLC( R_DISCLAIMER_PART_2 );
+ HBufC* text_3 = StringLoader::LoadLC( R_DISCLAIMER_PART_3 );
+ HBufC* text_4 = StringLoader::LoadLC( R_DISCLAIMER_PART_4 );
+ HBufC* text_5 = StringLoader::LoadLC( R_DISCLAIMER_PART_5 );
+ HBufC* text_6 = StringLoader::LoadLC( R_DISCLAIMER_PART_6 );
+ HBufC* text_7 = StringLoader::LoadLC( R_DISCLAIMER_PART_7 );
+ HBufC* text_8 = StringLoader::LoadLC( R_DISCLAIMER_PART_8 );
+ HBufC* text_9 = StringLoader::LoadLC( R_DISCLAIMER_PART_9 );
+ HBufC* text_10 = StringLoader::LoadLC( R_DISCLAIMER_PART_10 );
+ HBufC* text_11 = StringLoader::LoadLC( R_DISCLAIMER_PART_11 );
+
+ //Create a buffer for dialog content
+ HBufC* text = HBufC::NewLC( text_1->Length() + text_2->Length() + text_3->Length() +
+ text_4->Length() + text_5->Length() + text_6->Length() +
+ text_7->Length() + text_8->Length() + text_9->Length() +
+ text_10->Length() + text_11->Length() );
+ //Copy the disclaimer text parts to dialog content
+ text->Des() += *text_1;
+ text->Des() += *text_2;
+ text->Des() += *text_3;
+ text->Des() += *text_4;
+ text->Des() += *text_5;
+ text->Des() += *text_6;
+ text->Des() += *text_7;
+ text->Des() += *text_8;
+ text->Des() += *text_9;
+ text->Des() += *text_10;
+ text->Des() += *text_11;
+
+ CAknMessageQueryDialog* dlg = CAknMessageQueryDialog::NewL( *text );
+ CleanupStack::PopAndDestroy( text );
+ CleanupStack::PopAndDestroy( text_11 );
+ CleanupStack::PopAndDestroy( text_10 );
+ CleanupStack::PopAndDestroy( text_9 );
+ CleanupStack::PopAndDestroy( text_8 );
+ CleanupStack::PopAndDestroy( text_7 );
+ CleanupStack::PopAndDestroy( text_6 );
+ CleanupStack::PopAndDestroy( text_5 );
+ CleanupStack::PopAndDestroy( text_4 );
+ CleanupStack::PopAndDestroy( text_3 );
+ CleanupStack::PopAndDestroy( text_2 );
+ CleanupStack::PopAndDestroy( text_1 );
+ dlg->PrepareLC( R_DISCLAIMER_MESSAGE );
+
+ //Create heading for the dialog, load and create the heading text
+ CAknPopupHeadingPane* headingPane = dlg->Heading();
+ HBufC* appName = StringLoader::LoadLC(R_FSEMAIL_APP_NAME );
+ HBufC* version = StringLoader::LoadLC( R_DISCLAIMER_FSEMAIL_VERSION );
+ HBufC* title = HBufC::NewLC(version->Length() + appName->Length() + 1);
+ title->Des() += *appName;
+ title->Des() += KSpace;
+ title->Des() += *version;
+ headingPane->SetTextL( *title );
+ CleanupStack::PopAndDestroy( title );
+ CleanupStack::PopAndDestroy( version );
+ CleanupStack::PopAndDestroy( appName );
+ dlg->ButtonGroupContainer().SetCommandSetL( R_AVKON_SOFTKEYS_OK_EMPTY );
+ //show dialog
+ TInt ret = dlg->RunLD();
+ }
+
+void CFSEmailUiLauncherGridVisualiser::HandleDynamicVariantSwitchL( CFsEmailUiViewBase::TDynamicSwitchType aType )
+ {
+ FUNC_LOG;
+
+ CFsEmailUiViewBase::HandleDynamicVariantSwitchL( aType );
+
+ if ( iConstructionCompleted )
+ {
+ iItemIdInButtonDownEvent.iItemId = KErrNotFound;
+
+ // <cmail> Use layout data instead of hard-coded values
+ TRect mainPaneRect;
+ AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect);
+ TInt var = Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0;
+
+ TAknLayoutRect scrollBarRect;
+ scrollBarRect.LayoutRect(mainPaneRect, AknLayoutScalable_Avkon::aid_size_touch_scroll_bar());
+ TRect gridRect = mainPaneRect;
+ gridRect.iBr.iX -= scrollBarRect.Rect().Width();
+
+ TAknLayoutRect cellRect;
+ cellRect.LayoutRect(gridRect, AknLayoutScalable_Apps::aid_size_cell_cmail_l(var, 0, 0));
+
+ TSize displaySize = cellRect.Rect().Size();
+ // </cmail>
+ iParentLayout->SetSize( displaySize );
+ RescaleIconsL();
+ VisualLayoutUpdatedL();
+
+ UpdateFocusVisibility();
+ }
+ }
+
+void CFSEmailUiLauncherGridVisualiser::HandleDynamicVariantSwitchOnBackgroundL( CFsEmailUiViewBase::TDynamicSwitchType aType )
+ {
+ FUNC_LOG;
+ iRefreshNeeded = ETrue;
+
+ CFsEmailUiViewBase::HandleDynamicVariantSwitchOnBackgroundL( aType );
+ }
+
+void CFSEmailUiLauncherGridVisualiser::HandleContentChangeL()
+ {
+ FUNC_LOG;
+ if ( iConstructionCompleted )
+ {
+ CreateModelL();
+ if ( iAppUi.CurrentActiveView() == this )
+ {
+ VisualLayoutUpdatedL();
+ }
+ else
+ {
+ iRefreshNeeded = ETrue;
+ }
+ }
+ }
+// <cmail>
+void CFSEmailUiLauncherGridVisualiser::ConstructScrollbarL( CAlfLayout* aParent )
+ {
+ FUNC_LOG;
+ CAlfLayout::AddNewL(*iControl, aParent);
+ iScrollbar = new (ELeave) CAknDoubleSpanScrollBar(0);
+ iScrollbar->ConstructL(ETrue, this, 0, CEikScrollBar::EVertical, 1000);
+ TRect mainPaneRect;
+ AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect);
+ TRect scrollbarRect = aParent->DisplayRectTarget();
+ scrollbarRect.Move(mainPaneRect.iTl);
+ iScrollbar->SetRect(scrollbarRect);
+
+ iScrollbar->MakeVisible(EFalse);
+ iScrollbar->SetModelL(&iScrollbarModel);
+ }
+
+void CFSEmailUiLauncherGridVisualiser::UpdateScrollBarRangeL()
+ {
+ FUNC_LOG;
+
+ iScrollbarModel.SetScrollSpan(iRowCount);
+ iScrollbarModel.SetWindowSize(iVisibleRows);
+ iScrollbarModel.SetFocusPosition(iFirstVisibleRow);
+ iScrollbar->SetModelL(&iScrollbarModel);
+ iScrollbar->DrawNow();
+ }
+
+void CFSEmailUiLauncherGridVisualiser::HandleScrollEventL(CEikScrollBar* aScrollBar, TEikScrollEvent aEventType)
+ {
+ FUNC_LOG;
+ const TInt KScrollTransitionTimeMs = KSelectTransitionTimeMs;
+ if (aScrollBar == iScrollbar)
+ {
+
+ switch( aEventType )
+ {
+ case EEikScrollHome :
+ //Jump to beginning
+ break;
+ case EEikScrollEnd :
+ //Jump to end
+ break;
+ default:
+ iFirstVisibleRow = aScrollBar->ThumbPosition();
+ TReal offset = iFirstVisibleRow * iRowHeight;
+ TAlfTimedPoint alfScrollOffset;
+ alfScrollOffset.iY.SetTarget( offset , KScrollTransitionTimeMs );
+ iCurrentLevel.iGridLayout->SetScrollOffset(alfScrollOffset);
+ break;
+ }
+ }
+ }
+// </cmail>
+void CFSEmailUiLauncherGridVisualiser::UpdateLauncherItemListL()
+ {
+ FUNC_LOG;
+
+ // Read info about all implementations into infoArray
+ RImplInfoPtrArray infoArray;
+ CleanupResetAndDestroyClosePushL( infoArray );
+ CFSEmailLauncherItem::ListAllImplementationsL( infoArray );
+
+ RArray<TBool> itemsFoundArray;
+ CleanupClosePushL( itemsFoundArray );
+
+ itemsFoundArray.ReserveL( iLauncherItemUids.Count() );
+ for ( TInt i = 0; i < iLauncherItemUids.Count(); i++ )
+ {
+ itemsFoundArray.Append( EFalse );
+ }
+
+ // Iterate through all launcher item implementations in info array
+ TInt const infoCount = infoArray.Count();
+ for ( TInt infoIndex = 0; infoIndex < infoCount; infoIndex++ )
+ {
+ TUid implementationUid = infoArray[infoIndex]->ImplementationUid();
+
+ // Check whether item can be found from current laucher items
+ TBool itemFound = EFalse;
+ for ( TInt itemIndex = 0; itemIndex < iLauncherItemUids.Count(); itemIndex++ )
+ {
+ if ( iLauncherItemUids[itemIndex] == implementationUid )
+ {
+ itemsFoundArray[itemIndex] = ETrue;
+ itemFound = ETrue;
+ break;
+ }
+ }
+
+ if ( !itemFound )
+ {
+ // Add new item to the end of the laucher item array
+ CFSEmailLauncherItem* launcherItem = NULL;
+ TRAPD( error, launcherItem = CFSEmailLauncherItem::NewL( implementationUid, this ) );
+ if ( error == KErrNone )
+ {
+ iLauncherItems.Append( launcherItem );
+ iLauncherItemUids.Append( implementationUid );
+ }
+ }
+ }
+
+ // Remove all launcher items not found from the info array
+ for ( TInt i = itemsFoundArray.Count() - 1 ; i >= 0; --i )
+ {
+ if ( !itemsFoundArray[i] )
+ {
+ delete iLauncherItems[i];
+ iLauncherItems.Remove( i );
+ iLauncherItemUids.Remove( i );
+ }
+ }
+
+ // Clean up
+ CleanupStack::Pop( &itemsFoundArray );
+ itemsFoundArray.Close();
+ CleanupStack::PopAndDestroy( &infoArray );
+ }
+
+/**
+ * Sets application title when leaving this view
+ */
+void CFSEmailUiLauncherGridVisualiser::SetDefaultStatusPaneTextL()
+ {
+ FUNC_LOG;
+ iAppUi.ResetTitlePaneTextL();
+ }
+
+void CFSEmailUiLauncherGridVisualiser::SetWizardWaitnoteShown( TBool aWaitnoteShown )
+ {
+ FUNC_LOG;
+ iWizardWaitnoteShown = aWaitnoteShown;
+ }
+
+/**
+ * Check status of all configured mailboxes
+ */
+TFSLauncherGridMailboxStatus CFSEmailUiLauncherGridVisualiser::CheckMailboxStatusL()
+ {
+ FUNC_LOG;
+ RPointerArray<CFSMailBox> mailBoxes;
+ CleanupResetAndDestroyClosePushL( mailBoxes );
+ TFSMailMsgId id;
+ TInt err = iAppUi.GetMailClient()->ListMailBoxes(
+ id,
+ mailBoxes );
+
+ TFSLauncherGridMailboxStatus returnStatus;
+ returnStatus.iMailboxCount = mailBoxes.Count();
+ // Reset counters
+ returnStatus.iMailboxesOnline = returnStatus.iMailboxesOffline = returnStatus.iMailboxesSyncing = 0;
+
+ for ( TInt i = 0; i < mailBoxes.Count(); i++ )
+ {
+ // First check online/offline status
+ TFSMailBoxStatus onOffStatus = mailBoxes[i]->GetMailBoxStatus();
+ if( onOffStatus == EFSMailBoxOffline )
+ {
+ returnStatus.iMailboxesOffline++;
+ }
+ else if( onOffStatus == EFSMailBoxOnline )
+ {
+ returnStatus.iMailboxesOnline++;
+ }
+
+ // Then check sync state
+ TSSMailSyncState latestSyncstate = mailBoxes[i]->CurrentSyncState();
+ if( latestSyncstate == InboxSyncing ||
+ latestSyncstate == StartingSync ||
+ latestSyncstate == EmailSyncing )
+ {
+ returnStatus.iMailboxesSyncing++;
+ }
+ }
+
+ CleanupStack::PopAndDestroy( &mailBoxes );
+ return returnStatus;
+ }
+
+// Bitmap provider for grid ecom plugins icons
+void CFSEmailUiLauncherGridVisualiser::ProvideBitmapL(TInt aId, CFbsBitmap*& aBitmap, CFbsBitmap*& aMaskBitmap)
+ {
+ FUNC_LOG;
+// <cmail> Use layout data instead of hard-coded values
+ TRect mainPaneRect;
+ AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect);
+ TInt var = Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0;
+
+ TAknLayoutRect scrollBarRect;
+ scrollBarRect.LayoutRect(mainPaneRect, AknLayoutScalable_Avkon::aid_size_touch_scroll_bar());
+ TRect gridRect = mainPaneRect;
+ gridRect.iBr.iX -= scrollBarRect.Rect().Width();
+
+ TAknLayoutRect itemRect;
+ itemRect.LayoutRect(gridRect, AknLayoutScalable_Apps::cell_cmail_l_pane(var, 0, 0));
+
+ TAknLayoutRect gridIconRect;
+ gridIconRect.LayoutRect(itemRect.Rect(), AknLayoutScalable_Apps::cell_cmail_l_pane_g1(var));
+// </cmail>
+
+ CAknIcon* launcherItemIcon(0);
+ for ( TInt i=0; i<iPluginIdIconIdPairs.Count(); i++ )
+ {
+ if ( aId == iPluginIdIconIdPairs[i].iIconId )
+ {
+ launcherItemIcon = iLauncherItems[iPluginIdIconIdPairs[i].iPluginArrayIndex]->Icon();
+ }
+ }
+
+ if ( launcherItemIcon )
+ {
+// <cmail> Use layout data instead of hard-coded values
+ // Set bitmap size
+ //TSize iconSize(iAppUi.LayoutHandler()->GridIconSize(), iAppUi.LayoutHandler()->GridIconSize() );
+
+ TSize iconSize = gridIconRect.Rect().Size();
+// </cmail>
+ if( launcherItemIcon->Bitmap() )
+ {
+ AknIconUtils::DisableCompression( launcherItemIcon->Bitmap() );
+ AknIconUtils::SetSize( launcherItemIcon->Bitmap(), iconSize, EAspectRatioPreserved );
+ }
+ if( launcherItemIcon->Mask() )
+ {
+ AknIconUtils::DisableCompression( launcherItemIcon->Mask());
+ AknIconUtils::SetSize( launcherItemIcon->Mask(), iconSize, EAspectRatioPreserved );
+ }
+ // Create duplicate sof original for alf
+ CFbsBitmap* bitmap = new (ELeave) CFbsBitmap;
+ bitmap->Duplicate( launcherItemIcon->Bitmap()->Handle() );
+ CFbsBitmap* mask = new (ELeave) CFbsBitmap;
+ mask->Duplicate( launcherItemIcon->Mask()->Handle() );
+
+ aBitmap = bitmap;
+ aMaskBitmap = mask;
+ }
+ else
+ {
+ User::Leave(KErrNotFound); // Leave as icon is not found, should not go here
+ }
+ }
+
+void CFSEmailUiLauncherGridVisualiser::SetRefreshNeeded()
+ {
+ FUNC_LOG;
+ iRefreshNeeded = ETrue;
+ iDoubleClickLock = EFalse;
+ }
+
+TReal32 CFSEmailUiLauncherGridVisualiser::TRingMovementFuncMappingDataProvider::MapValue(TReal32 aValue, TInt /*aMode*/) const
+ {
+ FUNC_LOG;
+ AlfUtil::WrapValue(aValue, iStart, iEnd);
+ return aValue;
+ }
+
+void CFSEmailUiLauncherGridVisualiser::DetachSelectorMappingFunctions()
+ {
+ FUNC_LOG;
+ if ( iSelector )
+ {
+ TAlfTimedPoint selectorPos;
+ selectorPos.iX.SetMappingFunctionIdentifier( 0 );
+ selectorPos.iY.SetMappingFunctionIdentifier( 0 );
+ iSelector->SetPos( selectorPos );
+ }
+ }
+
+void CFSEmailUiLauncherGridVisualiser::UpdateFocusVisibility()
+ {
+ if( iSelector )
+ {
+ TAlfTimedValue selectorOpacity;
+ if( IsFocusShown() || iItemIdInButtonDownEvent.iItemId >= 0 )
+ {
+ selectorOpacity.SetValueNow( 1 );
+ }
+ else
+ {
+ selectorOpacity.SetValueNow( 0 );
+ }
+ iSelector->SetOpacity( selectorOpacity );
+ }
+ }
+
+void CFSEmailUiLauncherGridVisualiser::FlipStateChangedL( TBool aKeyboardFlipOpen )
+ {
+ CFsEmailUiViewBase::FlipStateChangedL( aKeyboardFlipOpen );
+ UpdateFocusVisibility();
+ }
+
+void CFSEmailUiLauncherGridVisualiser::MailboxDeletionComplete()
+ {
+ TRAP_IGNORE( HandleContentChangeL() );
+ }
+
+void CFSEmailUiLauncherGridVisualiser::HandleTimerFocusStateChange( TBool aShow )
+ {
+ CFsEmailUiViewBase::HandleTimerFocusStateChange( aShow );
+ if (!aShow)
+ {
+ UpdateFocusVisibility();
+ ResizeItemIcon( ETrue );
+ }
+ }
+// End of file