diff -r 8466d47a6819 -r 12c456ceeff2 emailuis/emailui/src/FreestyleEmailUiFolderListVisualiser.cpp --- a/emailuis/emailui/src/FreestyleEmailUiFolderListVisualiser.cpp Thu Dec 17 08:39:21 2009 +0200 +++ b/emailuis/emailui/src/FreestyleEmailUiFolderListVisualiser.cpp Thu Jan 07 12:38:38 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). +* 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" @@ -15,7 +15,6 @@ * */ - // SYSTEM INCLUDES #include "emailtrace.h" #include @@ -32,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -75,9 +75,6 @@ #include "ESMailSettingsPlugin.h" #include "FreestyleEmailUiStatusIndicator.h" -// REMOVE WHEN DONE TESTING: -//#include "CSimpleAOTest.h" - // Defines the order of the folders in UI enum TFSEmailUiFolderListPriorities { @@ -103,11 +100,33 @@ EFolderListIconEmailAccount }; +// Defines the order of the sort list icons in the sort icon array +enum TFsEmailUiSortListIcons + { + ESortListAttachmentAscIcon = 0, + ESortListAttachmentDescIcon, + ESortListDateAscIcon, + ESortListDateDescIcon, + ESortListFollowAscIcon, + ESortListFollowDescIcon, + ESortListPriorityAscIcon, + ESortListPriorityDescIcon, + ESortListSenderAscIcon, + ESortListSenderDescIcon, + ESortListSubjectAscIcon, + ESortListSubjectDescIcon, + ESortListUnreadAscIcon, + ESortListUnreadDescIcon + }; + // List level for the root folders static const TInt KListRootLevel( 1 ); // List supports three levels, so basically root folder + two levels of subfolders static const TInt KListLastBasicLevel( KListRootLevel + 2 ); +const TInt KDefaultShadowBorderWidth( 15 ); +const TReal KShadowBorderOpacity( 0.08 ); + // Constants for drawing header text const TReal KFSHeaderTextBackgroundOpacity = 0.3f; const TAlfTimedValue KFSVisible( 1 ); @@ -149,8 +168,8 @@ // Constructor // --------------------------------------------------------------------------- // -CFSEmailUiFolderListVisualiser::CFSEmailUiFolderListVisualiser( CAlfEnv& aEnv, - CFreestyleEmailUiAppUi& aAppUi, +CFSEmailUiFolderListVisualiser::CFSEmailUiFolderListVisualiser( CAlfEnv& aEnv, + CFreestyleEmailUiAppUi& aAppUi, CAlfControlGroup& aControlGroup ) : CFsEmailUiViewBase( aControlGroup, aAppUi ), iEnv( aEnv ), @@ -162,7 +181,7 @@ { FUNC_LOG; } - + // --------------------------------------------------------------------------- // Destructor // --------------------------------------------------------------------------- @@ -176,15 +195,18 @@ delete iBackgroundBrush; iBackgroundBrush = NULL; + delete iShadowBrush; + // No need for ResetAndDestroy because list items are owned by generic list iListItemVisulizers.Close(); - + //delete iNotifierTest; - + delete iTreeList; iTreeList = NULL; - + iIconArray.Close(); + iSortIconArray.Close(); if ( iAsyncCallback ) { @@ -218,19 +240,19 @@ FUNC_LOG; iControl = CFSEmailUiFolderListControl::NewL( iEnv, *this ); iModel = new (ELeave) CFSEmailUiFolderListModel(); - + UpdateListSizeAttributes(); //LoadIconsL(); - + TRect mainPaneRect; AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect); iFaderLayout = CAlfDeckLayout::AddNewL( *iControl ); iFaderLayout->SetRect( mainPaneRect ); - + iParentLayout = CAlfAnchorLayout::AddNewL( *iControl ); iParentLayout->SetRect( iScreenRect ); iParentLayout->SetFlags( EAlfVisualFlagManualLayout ); - + iParentLayout->EnableBrushesL(); SetAnchors(); @@ -238,13 +260,13 @@ iHeaderLayout = CAlfDeckLayout::AddNewL( *iControl, iParentLayout ); iHeaderLayout->SetFlags( EAlfVisualFlagAutomaticLocaleMirroringEnabled ); - + iHeaderTextVisual = CAlfTextVisual::AddNewL( *iControl, iHeaderLayout ); iHeaderTextVisual->SetWrapping( CAlfTextVisual::ELineWrapTruncate ); iHeaderTextVisual->SetTextL( KNullDesC ); - + TRgb headerTextColor( KRgbBlack ); - AknsUtils::GetCachedColor( AknsUtils::SkinInstance(), + AknsUtils::GetCachedColor( AknsUtils::SkinInstance(), headerTextColor, KAknsIIDFsTextColors, EAknsCIFsTextColorsCG10 ); iHeaderTextVisual->SetColor( headerTextColor ); iHeaderTextVisual->SetTextStyle( iAppUi.LayoutHandler()-> @@ -261,7 +283,7 @@ iHeaderTextVisual->SetOpacity( KFSInvisible ); iHeaderLayout->SetOpacity( KFSInvisible ); - + iListLayout = CAlfDeckLayout::AddNewL( *iControl, iParentLayout ); iListLayout->SetFlags(EAlfVisualFlagLayoutUpdateNotification|EAlfVisualFlagAutomaticLocaleMirroringEnabled); @@ -272,14 +294,14 @@ iTreeVisualizer->SetFadeOutEffectTime( iAppUi.LayoutHandler()->CtrlBarListFadeEffectTime() ); iTreeVisualizer->SetItemSeparatorSize( TSize(0, 0) ); iTreeVisualizer->SetExpandCollapseAllOnLongTap( EFalse ); - + iTreeList = CFsTreeList::NewL( *iTreeVisualizer, iEnv ); - + // Compared to S60 3.2.3 in S60 5.0 Alf offers the key events in // opposite order. ControlGroup().AppendL( iControl ); - ControlGroup().AppendL( iTreeList->TreeControl() ); - + ControlGroup().AppendL( iTreeList->TreeControl() ); + iTreeList->AddObserverL(*this); iTreeList->SetLoopingType( EFsTreeListLoopingJumpToFirstLast ); @@ -296,9 +318,9 @@ iTreeVisualizer->SetSelectorPropertiesL( iAppUi.FsTextureManager()->NewListSelectorBrushL(), 1.0, CFsTreeVisualizerBase::EFsSelectorMoveSmoothly ); - + iAsyncCallback = new (ELeave) CAsyncCallBack( CActive::EPriorityStandard ); - + //iNotifierTest = CSimpleAOTest::NewL(); iFirstStartCompleted = ETrue; } @@ -312,7 +334,7 @@ { FUNC_LOG; return FolderListId; - } + } // --------------------------------------------------------------------------- // CFSEmailUiFolderListVisualiser::PrepareFolderListL @@ -335,16 +357,16 @@ // Show empty screen when offline CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current(); - + if( iModel->Count() == 0 ) { cba->SetCommandSetL( R_FREESTYLE_EMAUIL_UI_SK_OPTIONS_BACK ); } - + if( iMoveOrCopyInitiated ) { - iTreeVisualizer->SetEmptyListTextL( KNullDesC ); - iTreeVisualizer->RefreshListViewL(); + iTreeVisualizer->SetEmptyListTextL( KNullDesC ); + iTreeVisualizer->RefreshListViewL(); } } @@ -377,19 +399,19 @@ iParentLayout->SetRect(iScreenRect); CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current(); - + if( iModel->Count() > 0 ) { cba->SetCommandSetL( R_FREESTYLE_EMAUIL_UI_SK_OPTIONS_BACK__SELECT ); } - + if( iMoveOrCopyInitiated ) { - HBufC* emptyListText = StringLoader::LoadLC( + HBufC* emptyListText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_FOLDER_LIST_NO_FOLDERS_AVAILABLE ); iTreeVisualizer->SetEmptyListTextL( *emptyListText ); CleanupStack::PopAndDestroy( emptyListText ); - + iTreeVisualizer->RefreshListViewL(); } } @@ -418,7 +440,7 @@ FUNC_LOG; CFSEmailUiFolderListVisualiser* self = static_cast< CFSEmailUiFolderListVisualiser* >( aSelfPtr ); - TRAPD( err, + TRAPD( err, self->PopulateFolderListL(); if ( self->iCustomMessageId == KFolderListMoveMessage || self->iCustomMessageId == KFolderListMoveMessages || @@ -448,7 +470,7 @@ void CFSEmailUiFolderListVisualiser::HidePopupL() { FUNC_LOG; - + iParentLayout->SetRect( iCtrlButtonRect, iAppUi.LayoutHandler()->CtrlBarListFadeEffectTime() ); TAlfTimedValue bgOpacity; @@ -511,36 +533,36 @@ // CFSEmailUiFolderListVisualiser::DoShowInPopupL // --------------------------------------------------------------------------- // -/*void CFSEmailUiFolderListVisualiser::DoShowInPopupL()*/ void CFSEmailUiFolderListVisualiser::DoShowInPopupL( MFsControlButtonInterface* aButton, MFSEmailUiFolderListCallback* aFolderCallback, MFSEmailUiSortListCallback* aSortCallback ) { FUNC_LOG; - + if ( ( aFolderCallback == NULL && aSortCallback == NULL ) || aButton == NULL ) { return; } - + // In case of popup we are not moving or copying messages, // so there's no need to connect the mailbox iNoConnectNeeded = ETrue; - + iCallback = aFolderCallback; iSortListCallback = aSortCallback; const TPoint buttonPos( aButton->Pos().Target() ); const TSize buttonSize( aButton->Size().Target().AsSize() ); // TRect from where to start the transformation effect - iCtrlButtonRect.SetRect( buttonPos, buttonSize ); + TRect cbr = iAppUi.LayoutHandler()->GetControlBarRect(); + iCtrlButtonRect.SetRect( buttonPos + cbr.iTl, buttonSize ); iFullScreen = EFalse; LoadIconsL(); - + if ( !iFirstStartCompleted ) { DoFirstStartL(); @@ -561,7 +583,7 @@ PrepareFolderListL(); PopulateFolderListL(); - const TInt paddingValue( + const TInt paddingValue( iAppUi.LayoutHandler()->DropDownMenuListPadding() ); const TAlfMetric paddingMetric( paddingValue ); iParentLayout->SetPadding( paddingMetric ); @@ -576,23 +598,32 @@ iBackgroundBrush->SetFrameRectsL( outerRect, iScreenRect ); } - // Append brush if it's not yet appended. Currently this is our only - // brush so if brush count is more than zero, this brush is already - // appended. If other brush(es) are added later, this implementation - // need to be changed. - if ( iParentLayout->Brushes()->Count() == 0 ) - { - // Keep the ownership of the brush to avoid unneeded object - // deletion / reconstruction - iParentLayout->Brushes()->AppendL( iBackgroundBrush, EAlfDoesNotHaveOwnership ); - } + // Append brush if it's not yet appended. Currently this is our only + // brush so if brush count is more than zero, this brush is already + // appended. If other brush(es) are added later, this implementation + // need to be changed. + if ( iParentLayout->Brushes()->Count() == 0 ) + { + // Keep the ownership of the brush to avoid unneeded object + // deletion / reconstruction + iParentLayout->Brushes()->AppendL( iBackgroundBrush, EAlfDoesNotHaveOwnership ); + } + if( !iShadowBrush ) + { + iShadowBrush = CAlfShadowBorderBrush::NewL( + iEnv, TAlfMetric( KDefaultShadowBorderWidth ) ); + iShadowBrush->SetOpacity( KShadowBorderOpacity ); + iShadowBrush->SetLayer( EAlfBrushLayerBackground ); + iParentLayout->Brushes()->AppendL( iShadowBrush, + EAlfDoesNotHaveOwnership ); + } + SetPopupSoftkeysL(); // SetRect need to be called also here, otherwise the list layout might // be wrong in mirrored layout - //iParentLayout->SetRect( iScreenRect ); iParentLayout->SetRect( iCtrlButtonRect ); - + opacity.SetValueNow( 1 ); //opacity.SetTarget( 1, iAppUi.LayoutHandler()->CtrlBarListFadeEffectTime() ); iParentLayout->SetOpacity( opacity ); @@ -601,6 +632,8 @@ iTreeList->DisableKineticScrolling( ETrue ); iTreeList->ShowListL( ETrue ); iTreeList->SetFocusedL( ETrue ); + iFocusVisible = iAppUi.IsFocusShown(); + iTreeVisualizer->SetFocusVisibility( iFocusVisible ); iPopupListShown = ETrue; } @@ -624,13 +657,13 @@ // --------------------------------------------------------------------------- // void CFSEmailUiFolderListVisualiser::ShowSortListPopupL( - const TFSMailSortField aCurrentSortOrder, + const TFSMailSortCriteria aCurrentSortCriteria, const TFSFolderType aFolderType, MFSEmailUiSortListCallback* aCallback, MFsControlButtonInterface* aButton ) { FUNC_LOG; - iCurrentSortOrder = aCurrentSortOrder; + iCurrentSortCriteria = aCurrentSortCriteria; iCurrentFolderType = aFolderType; DoShowInPopupL( aButton, NULL, aCallback ); } @@ -647,7 +680,7 @@ iFullScreen = ETrue; LoadIconsL(); - + if ( !iFirstStartCompleted ) { DoFirstStartL(); @@ -655,7 +688,7 @@ // Set title pane text iAppUi.SetActiveMailboxNameToStatusPaneL(); - + // Different effect is used when opening folder selection list iAnimateNextActivation = ( aCustomMessageId == KFolderListSelectFolder ); @@ -736,7 +769,7 @@ iTitleCaptionVisible = EFalse; iHeaderTextVisual->SetOpacity( KFSInvisible ); } - + // Set flag for moving or copying iMoveOrCopyInitiated = (aCustomMessageId == KFolderListMoveMessage || aCustomMessageId == KFolderListMoveMessages || @@ -749,16 +782,16 @@ viewData.Copy( aCustomMessage ); iCallback = viewData().iCallback; iCurrentFolderType = viewData().iSourceFolderType; - + iTreeList->HideListL(); - + // Clear padding when shown in full screen const TAlfMetric padding( 0 ); iParentLayout->SetPadding( padding ); iListLayout->SetPadding( padding ); - + PrepareFolderListL(); - + // Remove need to be called for all brushes before Reset, otherwise the // brush resources are not completely freed from server side -> brushes // keep "hanging" there and make future drawing slower. @@ -767,19 +800,19 @@ iParentLayout->Brushes()->Remove( 0 ); } iParentLayout->Brushes()->Reset(); - + TAlfTimedValue layoutOpacity = iHeaderLayout->Opacity(); layoutOpacity.SetTarget( 1, iAppUi.LayoutHandler()->CtrlBarListFadeEffectTime()/2 ); iHeaderLayout->SetOpacity( layoutOpacity ); - + TAlfTimedValue bgImageOpacity = iListBgImageVisual->Opacity(); bgImageOpacity.SetTarget( 1, iAppUi.LayoutHandler()->CtrlBarListFadeEffectTime()/2 ); iListBgImageVisual->SetOpacity( bgImageOpacity ); - + // Reset the variables used in horizontal scrolling iPreviousListRect = iListLayout->DisplayRectTarget(); iPreviousListLevel = KListRootLevel; - + iParentLayout->SetRect( iScreenRect ); iTreeList->ShowListL(); @@ -792,7 +825,7 @@ CFSMailBox* mb = iAppUi.GetActiveMailbox(); // Just in case, shouldn't happen User::LeaveIfNull( mb ); - + TFSMailBoxStatus onlineStatus = mb->GetMailBoxStatus(); // If we are not moving or copying messages, there's no need to connect @@ -825,6 +858,7 @@ // is needed for this operation, so we need to connect first ConnectToMailboxL(); } + FocusVisibilityChange( iAppUi.IsFocusShown() ); } // --------------------------------------------------------------------------- @@ -858,7 +892,7 @@ { return R_FREESTYLE_EMAIL_UI_TOOLBAR_FOLDER_LIST; } - + // --------------------------------------------------------------------------- // Deactivate this view // --------------------------------------------------------------------------- @@ -883,15 +917,27 @@ FUNC_LOG; if ( iFirstStartCompleted ) // Safety { - for ( TInt i=0; i < iModel->Count() ; i++ ) - { - CFSEmailUiFolderListItem* modelItem = iModel->ItemByIndex( i ); - if ( modelItem && ( modelItem->iSortField == iCurrentSortOrder ) ) - { - iTreeVisualizer->SetFocusedItemL( modelItem->iListId, EFalse ); - break; - } - } + for ( TInt i = 0; i < iModel->Count(); i++ ) + { + CFSEmailUiFolderListItem* modelItem = iModel->ItemByIndex( i ); + if ( modelItem && ( modelItem->iSortField == iCurrentSortCriteria.iField ) ) + { + iTreeVisualizer->SetFocusedItemL( modelItem->iListId, EFalse ); + break; + } + } + + // Bold the focused item's text + TInt arraySize = iListItemVisulizers.Count(); + for( TInt i = 0; i < arraySize; i++ ) + { + TFsTreeItemId id = iTreeList->FocusedItem(); + if ( iListItemVisulizers[ i ] == &( iTreeList->ItemVisualizer( id ) ) ) + { + iListItemVisulizers[i]->SetTextBold( ETrue ); + break; + } + } } } @@ -913,7 +959,7 @@ if ( modelItem && ( modelItem->iFolderId == iCurrentFolderId ) ) { itemToFocus = modelItem->iListId; - break; + break; } } iTreeVisualizer->SetFocusedItemL( itemToFocus, EFalse ); @@ -939,7 +985,7 @@ { match = ETrue; iTreeVisualizer->SetFocusedItemL( modelItem->iListId ); - break; + break; } } @@ -963,17 +1009,39 @@ TBool CFSEmailUiFolderListVisualiser::OfferEventL(const TAlfEvent& aEvent) { FUNC_LOG; - TBool result( EFalse ); + TBool result( EFalse ); if ( aEvent.IsKeyEvent() && aEvent.Code() == EEventKey ) { // Swap left and right with mirrored layout - TInt scanCode = aEvent.KeyEvent().iScanCode; + TInt scanCode( aEvent.KeyEvent().iScanCode ); if ( AknLayoutUtils::LayoutMirrored() ) { - if ( scanCode == EStdKeyLeftArrow ) scanCode = EStdKeyRightArrow; - else if ( scanCode == EStdKeyRightArrow ) scanCode = EStdKeyLeftArrow; + if( scanCode == EStdKeyLeftArrow ) + { + scanCode = EStdKeyRightArrow; + } + else if( scanCode == EStdKeyRightArrow ) + { + scanCode = EStdKeyLeftArrow; + } } - + + // Handle possible focus visibility change + if( ( scanCode == EStdKeyRightArrow ) || + ( scanCode == EStdKeyLeftArrow ) || + ( scanCode == EStdKeyUpArrow ) || + ( scanCode == EStdKeyDownArrow ) || + ( scanCode == EStdKeyEnter ) || + ( scanCode == EStdKeyDeviceA ) || + ( scanCode == EStdKeyDevice3 ) ) + { + // If the focus was not active already, ignore the key press + if( !iAppUi.SetFocusVisibility( ETrue ) ) + { + return ETrue; + } + } + switch ( scanCode ) { case EStdKeyDevice3: // CENTER CLICK @@ -997,7 +1065,7 @@ { HandleSelectionL( EFSEmailUiCtrlBarResponseSwitchList ); } - } + } break; case EStdKeyRightArrow: @@ -1017,7 +1085,7 @@ default: // Check keyboard shortcuts. - TInt shortcutCommand = + TInt shortcutCommand = iAppUi.ShortcutBinding().CommandForShortcutKey( aEvent.KeyEvent(), CFSEmailUiShortcutBinding::EContextFolderList ); if ( shortcutCommand != KErrNotFound ) @@ -1027,27 +1095,43 @@ } break; } - } + } return result; } // --------------------------------------------------------------------------- // CFSEmailUiFolderListVisualiser::HandlePointerEventL // --------------------------------------------------------------------------- -// +// TBool CFSEmailUiFolderListVisualiser::HandlePointerEventL(const TAlfEvent& aEvent) { - // Handle pointer events to fadervisual. If the list is shown in popup, then - // the popup will be closed. - if ((aEvent.Visual() == iFaderVisual || aEvent.Visual() == iFaderLayout) && aEvent.PointerEvent().iType == TPointerEvent::EButton1Down && iPopupListShown) + TBool eventHandled( EFalse ); + + if( ( aEvent.Visual() == iFaderVisual || aEvent.Visual() == iFaderLayout ) && + ( aEvent.PointerEvent().iType == TPointerEvent::EButton1Down ) && + ( iPopupListShown ) ) { + iAppUi.SetFocusVisibility( EFalse ); HandleSelectionL( EFSEmailUiCtrlBarResponseCancel ); + eventHandled = ETrue; } else { - return iTreeList->TreeControl()->OfferEventL(aEvent); + // Handle pointer events to fadervisual. If the list is shown in popup, + // then the popup will be closed. + if( ( aEvent.IsPointerEvent() ) && + ( aEvent.PointerEvent().iType == TPointerEvent::EButton1Up ) ) + { + eventHandled = iTreeList->TreeControl()->OfferEventL(aEvent); + // Hide focus visibility always after pointer up event. + iAppUi.SetFocusVisibility( EFalse ); + } + else + { + eventHandled = iTreeList->TreeControl()->OfferEventL(aEvent); + } } - return ETrue; + return eventHandled; } // --------------------------------------------------------------------------- @@ -1065,20 +1149,20 @@ if ( FeatureManager::FeatureSupported( KFeatureIdFfCmailIntegration ) ) { // remove help support in pf5250 - aMenuPane->SetItemDimmed( EFsEmailUiCmdHelp, ETrue); + aMenuPane->SetItemDimmed( EFsEmailUiCmdHelp, ETrue); } - + // OFFLINE/ONLINE MENU SELECTION if( iMoveOrCopyInitiated ) { TFSMailBoxStatus onlineStatus = iAppUi.GetActiveMailbox()->GetMailBoxStatus(); - aMenuPane->SetItemDimmed( EFsEmailUiCmdGoOnline, onlineStatus == EFSMailBoxOnline ); - aMenuPane->SetItemDimmed( EFsEmailUiCmdGoOffline, onlineStatus == EFSMailBoxOffline ); + aMenuPane->SetItemDimmed( EFsEmailUiCmdGoOnline, onlineStatus == EFSMailBoxOnline ); + aMenuPane->SetItemDimmed( EFsEmailUiCmdGoOffline, onlineStatus == EFSMailBoxOffline ); } else { - aMenuPane->SetItemDimmed( EFsEmailUiCmdGoOnline, ETrue ); - aMenuPane->SetItemDimmed( EFsEmailUiCmdGoOffline, ETrue ); + aMenuPane->SetItemDimmed( EFsEmailUiCmdGoOnline, ETrue ); + aMenuPane->SetItemDimmed( EFsEmailUiCmdGoOffline, ETrue ); } // select option @@ -1087,16 +1171,16 @@ aMenuPane->SetItemDimmed( EFsEmailUiCmdActionsCollapseAll, AllNodesCollapsed() ); aMenuPane->SetItemDimmed( EFsEmailUiCmdActionsExpandAll, AllNodesExpanded() ); } - + // Add shortcut hints - iAppUi.ShortcutBinding().AppendShortcutHintsL( *aMenuPane, + iAppUi.ShortcutBinding().AppendShortcutHintsL( *aMenuPane, CFSEmailUiShortcutBinding::EContextFolderList ); } } // --------------------------------------------------------------------------- -// +// // --------------------------------------------------------------------------- // void CFSEmailUiFolderListVisualiser::HandleSelectionL( TFSEmailUiCtrlBarResponse aSelection ) @@ -1107,7 +1191,7 @@ { return; } - + TBool popupHiddenAlready(EFalse); switch( aSelection ) { @@ -1144,7 +1228,7 @@ iAppUi.FolderPopupClosed(); } - + if ( !iFullScreen && iSortListCallback ) { iSortListCallback->SortOrderChangedL( EFSMailDontCare, aSelection ); @@ -1184,7 +1268,7 @@ } // --------------------------------------------------------------------------- -// Override the default transition effect in case full screen mode is launched +// Override the default transition effect in case full screen mode is launched // from popup mode. // --------------------------------------------------------------------------- // @@ -1195,12 +1279,12 @@ { TInt rectTransitionTime = iAppUi.LayoutHandler()->CtrlBarListFadeEffectTime(); TInt opacityTransitionTime = iAppUi.LayoutHandler()->CtrlBarListFadeEffectTime() / 2; - + TAlfTimedValue opacity; opacity.SetValueNow( 0 ); opacity.SetTarget( 1, opacityTransitionTime ); iParentLayout->SetOpacity( opacity ); - + // Do animated enlargening from popup window rect to full screen rect iParentLayout->SetRect( FolderListRectInThisResolution() ); iParentLayout->SetRect( iScreenRect, rectTransitionTime ); @@ -1236,6 +1320,15 @@ { // Key presses case EAknSoftkeySelect: + { + // If focus is not visible, make it visible + // otherwise fall through ( call HandleSelectionL ) + if( !iFocusVisible ) + { + iAppUi.SetFocusVisibility( ETrue ); + break; + } + } case EAknSoftkeyOpen: case EFsEmailUiCmdOpen: case EFsEmailUiCmdSelect: @@ -1243,7 +1336,7 @@ HandleSelectionL( EFSEmailUiCtrlBarResponseSelect ); } break; - + case EAknSoftkeyBack: case EEikBidCancel: { @@ -1282,7 +1375,7 @@ case EFsEmailUiCmdActionsExpandAll: { - TFsTreeItemId prevId = iTreeList->FocusedItem(); + TFsTreeItemId prevId = iTreeList->FocusedItem(); iTreeVisualizer->ExpandAllL(); if ( prevId != KFsTreeRootID && prevId != KFsTreeNoneID ) { @@ -1297,7 +1390,7 @@ activationData.iAccount = iAppUi.GetActiveMailbox()->GetId(); activationData.iSubviewId = 1; activationData.iLaunchFolderSettings = ETrue; - + TUid pluginUid = iAppUi.GetActiveMailbox()->GetSettingsUid(); // register plugin view if not exists so that activation can be made if ( !iAppUi.View( pluginUid ) ) @@ -1305,12 +1398,12 @@ CESMailSettingsPlugin* plugin = CESMailSettingsPlugin::NewL( pluginUid ); CleanupStack::PushL( plugin ); iAppUi.AddViewL( plugin ); - CleanupStack::Pop( plugin ); + CleanupStack::Pop( plugin ); } TUid messageId = TUid::Uid( CESMailSettingsPlugin::EActivateMailSettingsSubview ); const TPckgBuf pluginMessagePkg( activationData ); iAppUi.EnterPluginSettingsViewL( pluginUid, messageId, pluginMessagePkg ); - + // Hide list to avoid it flashing when returning back iTreeList->HideListL(); } @@ -1324,7 +1417,7 @@ case EFsEmailUiCmdExit: { - iAppUi.Exit(); + iAppUi.Exit(); } break; @@ -1333,20 +1426,20 @@ GoToTopL(); } break; - + case EFsEmailUiCmdGoToBottom: { GoToBottomL(); } break; - + case EFsEmailUiCmdPageUp: { TKeyEvent simEvent = { EKeyPageUp, EStdKeyPageUp, 0, 0 }; iCoeEnv->SimulateKeyEventL( simEvent, EEventKey ); } break; - + case EFsEmailUiCmdPageDown: { TKeyEvent simEvent = { EKeyPageDown, EStdKeyPageDown, 0, 0 }; @@ -1361,15 +1454,15 @@ HandleCommandL( EFsEmailUiCmdActionsCollapseAll ); } else - { + { HandleCommandL( EFsEmailUiCmdActionsExpandAll ); } } break; - + default: break; - } + } } } @@ -1386,18 +1479,18 @@ { return ETrue; } - + if( focusedItem == iMoreFoldersItemId ) { //HidePopupL(); iFullScreen = ETrue; - TFolderListActivationData tmp; + TFolderListActivationData tmp; tmp.iCallback = iCallback; const TPckgBuf pkgOut( tmp ); iAppUi.EnterFsEmailViewL( FolderListId, KFolderListSelectFolder, pkgOut ); - + return EFalse; } @@ -1406,20 +1499,20 @@ { return EFalse; } - + if( iCallback ) { const TFSMailMsgId& selectedFolderId = modelItem->iFolderId; const TFSMailMsgId& selectedMailboxId = modelItem->iMailboxId; if( !selectedFolderId.IsNullId() ) { - if ( iCustomMessageId == KFolderListMoveMessage || + if ( iCustomMessageId == KFolderListMoveMessage || iCustomMessageId == KFolderListMoveMessages || iCustomMessageId == KFolderListCopyMessage || iCustomMessageId == KFolderListCopyMessages ) { iLatestSelectedMoveFolderId = selectedFolderId; - } + } iCallback->FolderSelectedL( selectedFolderId, EFSEmailUiCtrlBarResponseSelect ); } else if( !selectedMailboxId.IsNullId() ) @@ -1437,7 +1530,7 @@ // same callback is not reused unintentionally. iSortListCallback = NULL; } - + return ETrue; } @@ -1446,12 +1539,12 @@ // Append node to list by getting the item data from resource // --------------------------------------------------------------------------- // -void CFSEmailUiFolderListVisualiser::SetHeaderTextByResourceIdL( +void CFSEmailUiFolderListVisualiser::SetHeaderTextByResourceIdL( TInt aResourceId ) { FUNC_LOG; if ( iFirstStartCompleted ) // Safety - { + { HBufC* headingText = StringLoader::LoadLC( aResourceId ); SetHeaderTextAttributesL(); iHeaderTextVisual->SetTextL( *headingText ); @@ -1469,12 +1562,12 @@ void CFSEmailUiFolderListVisualiser::SetHeaderTextAttributesL() { iHeaderTextVisual->SetOpacity( KFSVisible ); - CAlfTextStyle* textStyle = iAppUi.LayoutHandler()->FSTextStyleFromIdL( + CAlfTextStyle* textStyle = iAppUi.LayoutHandler()->FSTextStyleFromIdL( EFSFontTypeNormalBold ); iHeaderTextVisual->SetTextStyle ( textStyle->Id() ); iHeaderTextVisual->SetColor( iAppUi.LayoutHandler()-> ListNormalStateTextSkinColor() ); - iHeaderTextVisual->SetPadding( + iHeaderTextVisual->SetPadding( iAppUi.LayoutHandler()->TitleCaptionPadding() ); if( iHeaderTextVisual->Brushes() ) @@ -1496,11 +1589,8 @@ // void CFSEmailUiFolderListVisualiser::ConnectToMailboxL() { - CFSMailBox* mb = iAppUi.GetActiveMailbox(); - TDesC* mbName = &mb->GetName(); - + CFSMailBox* mb = iAppUi.GetActiveMailbox(); iWaitingToGoOnline = ETrue; - mb->GoOnlineL(); } @@ -1512,7 +1602,6 @@ void CFSEmailUiFolderListVisualiser::DisconnectFromMailboxL() { iAppUi.GetActiveMailbox()->GoOfflineL(); - iWaitingToGoOnline = EFalse; } @@ -1533,22 +1622,22 @@ { // Append lines to the model AppendActiveMailboxFoldersL(); - + // Update toolbar button statuses. UpdateToolbarButtons(); } else - { + { //Mailboxes needed to be at the top followed by seperator - AppendMailboxesL(); - + AppendMailboxesL(); + // Append lines to the model followed by seperator AppendActiveMailboxFoldersL(); AppendSeparatorLineL(); - - // Append the folder list view selector - AppendMoreFoldersL(); - } + + // Append the folder list view selector + AppendMoreFoldersL(); + } } } @@ -1567,7 +1656,7 @@ iModel->RemoveAll(); iMoreFoldersItemId = KFsTreeNoneID; // Append lines to the model - AppendSortListItemsL(); + AppendSortListItemsL(); } } @@ -1584,7 +1673,7 @@ if( iActiveMailbox ) { AppendSubfoldersL( TFSMailMsgId(), KFsTreeRootID, ETrue ); - } + } } } @@ -1608,7 +1697,7 @@ { TDesC& nameOfFirst = aFirst.GetFolderName(); TDesC& nameOfSecond = aSecond.GetFolderName(); - + return nameOfFirst.CompareC( nameOfSecond ); } } @@ -1646,50 +1735,99 @@ void CFSEmailUiFolderListVisualiser::AppendSortListItemsL() { FUNC_LOG; - TFsTreeItemId itemId = AppendItemToListFromResourceL( R_FREESTYLE_EMAIL_UI_SORT_BY_DATE, KFsTreeRootID, NULL, EFalse ); + + // Select correct icon depending on the selected sort criteria + CAlfTexture* icon( NULL ); + icon = iCurrentSortCriteria.iField == EFSMailSortByDate ? + iCurrentSortCriteria.iOrder == EFSMailAscending ? + iSortIconArray[ ESortListDateDescIcon ] : + iSortIconArray[ ESortListDateAscIcon ] : + iSortIconArray[ ESortListDateDescIcon ]; + + TFsTreeItemId itemId = AppendItemToListFromResourceL( R_FREESTYLE_EMAIL_UI_SORT_BY_DATE, KFsTreeRootID, icon, EFalse ); iModel->AppendL( itemId, EFSMailSortByDate ); - + switch( iCurrentFolderType ) { case EFSSentFolder: case EFSDraftsFolder: case EFSOutbox: { - itemId = AppendItemToListFromResourceL( R_FREESTYLE_EMAIL_UI_SORT_BY_RECIPIENT, KFsTreeRootID, NULL, EFalse ); + icon = iCurrentSortCriteria.iField == EFSMailSortByRecipient ? + iCurrentSortCriteria.iOrder == EFSMailAscending ? + iSortIconArray[ ESortListSenderDescIcon ] : + iSortIconArray[ ESortListSenderAscIcon ] : + iSortIconArray[ ESortListSenderDescIcon ]; + itemId = AppendItemToListFromResourceL( R_FREESTYLE_EMAIL_UI_SORT_BY_RECIPIENT, KFsTreeRootID, icon, EFalse ); iModel->AppendL( itemId, EFSMailSortByRecipient ); } break; - + default: { - itemId = AppendItemToListFromResourceL( R_FREESTYLE_EMAIL_UI_SORT_BY_SENDER, KFsTreeRootID, NULL, EFalse ); + icon = iCurrentSortCriteria.iField == EFSMailSortBySender ? + iCurrentSortCriteria.iOrder == EFSMailAscending ? + iSortIconArray[ ESortListSenderDescIcon ] : + iSortIconArray[ ESortListSenderAscIcon ] : + iSortIconArray[ ESortListSenderDescIcon ]; + itemId = AppendItemToListFromResourceL( R_FREESTYLE_EMAIL_UI_SORT_BY_SENDER, KFsTreeRootID, icon, EFalse ); iModel->AppendL( itemId, EFSMailSortBySender ); } break; } - itemId = AppendItemToListFromResourceL( R_FREESTYLE_EMAIL_UI_SORT_BY_SUBJECT, KFsTreeRootID, NULL, EFalse ); + icon = iCurrentSortCriteria.iField == EFSMailSortBySubject ? + iCurrentSortCriteria.iOrder == EFSMailAscending ? + iSortIconArray[ ESortListSubjectDescIcon ] : + iSortIconArray[ ESortListSubjectAscIcon ] : + iSortIconArray[ ESortListSubjectDescIcon ]; + + itemId = AppendItemToListFromResourceL( R_FREESTYLE_EMAIL_UI_SORT_BY_SUBJECT, KFsTreeRootID, icon, EFalse ); iModel->AppendL( itemId, EFSMailSortBySubject ); if ( TFsEmailUiUtility::IsFollowUpSupported( *iAppUi.GetActiveMailbox() ) ) { - itemId = AppendItemToListFromResourceL( R_FREESTYLE_EMAIL_UI_SORT_BY_FLAG, KFsTreeRootID, NULL, EFalse ); + icon = iCurrentSortCriteria.iField == EFSMailSortByFlagStatus ? + iCurrentSortCriteria.iOrder == EFSMailAscending ? + iSortIconArray[ ESortListFollowDescIcon ] : + iSortIconArray[ ESortListFollowAscIcon ] : + iSortIconArray[ ESortListFollowDescIcon ]; + + itemId = AppendItemToListFromResourceL( R_FREESTYLE_EMAIL_UI_SORT_BY_FLAG, KFsTreeRootID, icon, EFalse ); iModel->AppendL( itemId, EFSMailSortByFlagStatus ); } - itemId = AppendItemToListFromResourceL( R_FREESTYLE_EMAIL_UI_SORT_BY_PRIORITY, KFsTreeRootID, NULL, EFalse ); + icon = iCurrentSortCriteria.iField == EFSMailSortByPriority ? + iCurrentSortCriteria.iOrder == EFSMailAscending ? + iSortIconArray[ ESortListPriorityDescIcon ] : + iSortIconArray[ ESortListPriorityAscIcon ] : + iSortIconArray[ ESortListPriorityDescIcon ]; + + itemId = AppendItemToListFromResourceL( R_FREESTYLE_EMAIL_UI_SORT_BY_PRIORITY, KFsTreeRootID, icon, EFalse ); iModel->AppendL( itemId, EFSMailSortByPriority ); if ( iCurrentFolderType != EFSSentFolder && iCurrentFolderType != EFSDraftsFolder && iCurrentFolderType != EFSOutbox ) { - itemId = AppendItemToListFromResourceL( R_FREESTYLE_EMAIL_UI_SORT_BY_UNREAD, KFsTreeRootID, NULL, EFalse ); + icon = iCurrentSortCriteria.iField == EFSMailSortByUnread ? + iCurrentSortCriteria.iOrder == EFSMailAscending ? + iSortIconArray[ ESortListUnreadDescIcon ] : + iSortIconArray[ ESortListUnreadAscIcon ] : + iSortIconArray[ ESortListUnreadDescIcon ]; + + itemId = AppendItemToListFromResourceL( R_FREESTYLE_EMAIL_UI_SORT_BY_UNREAD, KFsTreeRootID, icon, EFalse ); iModel->AppendL( itemId, EFSMailSortByUnread ); } // Allow scroll bar refresh only for the last item - itemId = AppendItemToListFromResourceL( R_FREESTYLE_EMAIL_UI_SORT_BY_ATTACHMENT, KFsTreeRootID, NULL, ETrue ); + icon = iCurrentSortCriteria.iField == EFSMailSortByAttachment ? + iCurrentSortCriteria.iOrder == EFSMailAscending ? + iSortIconArray[ ESortListAttachmentDescIcon ] : + iSortIconArray[ ESortListAttachmentAscIcon ] : + iSortIconArray[ ESortListAttachmentDescIcon ]; + + itemId = AppendItemToListFromResourceL( R_FREESTYLE_EMAIL_UI_SORT_BY_ATTACHMENT, KFsTreeRootID, icon, ETrue ); iModel->AppendL( itemId, EFSMailSortByAttachment ); } @@ -1705,7 +1843,7 @@ CleanupResetAndDestroyClosePushL( folders ); iActiveMailbox->ListFolders( aFolder, folders ); - + TLinearOrder order( CFSEmailUiFolderListVisualiser::CompareFolders ); folders.Sort( order ); @@ -1723,7 +1861,7 @@ folders.Remove(i); } } - + TBool allowItemRefresh = EFalse; while( folders.Count() > 0 ) { @@ -1796,12 +1934,12 @@ } else { - aResourceId = R_FREESTYLE_EMAIL_UI_DROPDOWN_LIST_INBOX; + aResourceId = R_FREESTYLE_EMAIL_UI_DROPDOWN_LIST_INBOX; // Get branded mailbox icon aIcon = &iAppUi.FsTextureManager()->TextureByMailboxIdL( iActiveMailbox->GetId().PluginId(), iActiveMailbox->GetId().Id(), - iListIconSize); - } + iListIconSize); + } found = ETrue; } else if( aFolderType == EFSOutbox ) @@ -1814,7 +1952,7 @@ else { aResourceId = R_FREESTYLE_EMAIL_UI_DROPDOWN_LIST_OUTBOX; - } + } found = ETrue; } else if( aFolderType == EFSDraftsFolder ) @@ -1827,7 +1965,7 @@ else { aResourceId = R_FREESTYLE_EMAIL_UI_DROPDOWN_LIST_DRAFTS; - } + } found = ETrue; } else if( aFolderType == EFSSentFolder ) @@ -1853,7 +1991,7 @@ else { aResourceId = R_FREESTYLE_EMAIL_UI_DROPDOWN_LIST_DELETED; - } + } found = ETrue; } return found; @@ -1867,7 +2005,7 @@ CFSMailFolder* aFolder ) const { FUNC_LOG; - if( iCustomMessageId == KFolderListMoveMessage || + if( iCustomMessageId == KFolderListMoveMessage || iCustomMessageId == KFolderListMoveMessages ) { // When moving or copying message(s), hide Outbox from list @@ -1926,7 +2064,7 @@ if( iFullScreen ) { // For other folders get the name from the folder object - + nodeId = AppendNodeToListL( &aFolder->GetFolderName(), aParentNode, @@ -1983,25 +2121,25 @@ CleanupResetAndDestroyClosePushL( mailboxes ); TFSMailMsgId id; iAppUi.GetMailClient()->ListMailBoxes( id, mailboxes ); - + TInt count = mailboxes.Count(); while( mailboxes.Count() > 0 ) - { + { if( !( mailboxes[0]->GetId() == iAppUi.GetActiveMailboxId() ) ) { MFSMailBrandManager& brandManager = iAppUi.GetMailClient()->GetBrandManagerL(); - + CAlfTexture* mailBoxTexture; CGulIcon* mailboxIcon( NULL ); - TRAPD( err, mailboxIcon = brandManager.GetGraphicL( EFSMailboxIcon, mailboxes[0]->GetId() ) ); + TRAPD( err, mailboxIcon = brandManager.GetGraphicL( EFSMailboxIcon, mailboxes[0]->GetId() ) ); if ( err == KErrNone && mailboxIcon ) { CleanupStack::PushL( mailboxIcon ); AknIconUtils::SetSize(mailboxIcon->Bitmap(), iListIconSize); - AknIconUtils::SetSize(mailboxIcon->Mask(), iListIconSize); - - // Create texture into TextureManager, If not already existing + AknIconUtils::SetSize(mailboxIcon->Mask(), iListIconSize); + + // Create texture into TextureManager, If not already existing iAppUi.FsTextureManager()->CreateBrandedMailboxTexture( mailboxIcon, mailboxes[0]->GetId().PluginId(), mailboxes[0]->GetId().Id(), @@ -2009,8 +2147,8 @@ // Get branded mailbox icon mailBoxTexture = &iAppUi.FsTextureManager()->TextureByMailboxIdL( mailboxes[0]->GetId().PluginId(), mailboxes[0]->GetId().Id(), - iListIconSize); - + iListIconSize); + CleanupStack::PopAndDestroy( mailboxIcon ); } else @@ -2037,9 +2175,9 @@ // to model anymore, so we need to delete it here in all cases iModel->AppendL( itemId, mailboxes[0] ); } - + } - + delete mailboxes[0]; mailboxes.Remove(0); } @@ -2047,8 +2185,8 @@ if( count > 1 ) { AppendSeparatorLineL(); - } - + } + CleanupStack::PopAndDestroy( &mailboxes ); } @@ -2064,14 +2202,14 @@ CFsSeparatorVisualizer* visualizer( NULL ); visualizer = CFsSeparatorVisualizer::NewL(*iTreeList->TreeControl()); - + // We use the default size of the separator, but we need to save it // here to have it available later when calculating the list height iListSeparatorHeight = visualizer->Size().iHeight; - + // This should never be the last item in the list, so disable the refresh iTreeList->InsertItemL( *data, *visualizer, KFsTreeRootID, KErrNotFound, EFalse); - + iModel->IncreaseSeparatorCount(); } @@ -2114,7 +2252,7 @@ FUNC_LOG; CFsTreePlainOneLineNodeData* plainItemData; CFsTreePlainOneLineNodeVisualizer* plainNodeVisualizer; - + HBufC* itemDispName = HBufC::NewLC(aItemData->Length() + KFmtUnRdCntMaxLength); itemDispName->Des().Copy(*aItemData); if( aUnreadCnt > 0 ) @@ -2122,7 +2260,7 @@ itemDispName->Des().AppendFormat(KFormatUnreadCnt, aUnreadCnt); } CreatePlainNodeLC2( itemDispName, plainItemData, plainNodeVisualizer, aIcon ); - + // We assume that node can never be the last item to be drawn, there will // always be leaf folder under it. So we can always deny scroll bar update. TFsTreeItemId nodeId = iTreeList->InsertNodeL( *plainItemData, *plainNodeVisualizer, aParentNode, KErrNotFound, EFalse); @@ -2141,7 +2279,7 @@ // Append leaf to list by getting the item data from resource // --------------------------------------------------------------------------- // -TFsTreeItemId CFSEmailUiFolderListVisualiser::AppendItemToListFromResourceL( TInt aResourceId, +TFsTreeItemId CFSEmailUiFolderListVisualiser::AppendItemToListFromResourceL( TInt aResourceId, TFsTreeItemId aParentNode, CAlfTexture* aIcon, TBool aAllowRefresh, @@ -2149,7 +2287,7 @@ { FUNC_LOG; HBufC* headingText = StringLoader::LoadLC( aResourceId ); - + TFsTreeItemId itemId = AppendItemToListL( headingText, aParentNode, aIcon, aAllowRefresh, aUnreadCnt); CleanupStack::PopAndDestroy( headingText ); @@ -2161,7 +2299,7 @@ // Append leaf to list // --------------------------------------------------------------------------- // -TFsTreeItemId CFSEmailUiFolderListVisualiser::AppendItemToListL( TDesC* aItemData, +TFsTreeItemId CFSEmailUiFolderListVisualiser::AppendItemToListL( TDesC* aItemData, TFsTreeItemId aParentNode, CAlfTexture* aIcon, TBool aAllowRefresh, @@ -2170,7 +2308,7 @@ FUNC_LOG; CFsTreePlainOneLineItemData* plainItemData; CFsTreePlainOneLineItemVisualizer* plainItemVisualizer; - + HBufC* itemDispName = HBufC::NewLC(aItemData->Length() + KFmtUnRdCntMaxLength); itemDispName->Des().Copy(*aItemData); if( aUnreadCnt > 0 ) @@ -2178,8 +2316,8 @@ itemDispName->Des().AppendFormat(KFormatUnreadCnt, aUnreadCnt); } CreatePlainItemLC2( itemDispName, plainItemData, plainItemVisualizer, aIcon ); - - + + TFsTreeItemId itemId = iTreeList->InsertItemL( *plainItemData, *plainItemVisualizer, aParentNode, KErrNotFound, aAllowRefresh); CleanupStack::Pop( 2 ); // plainItemData & plainItemVisualizer CleanupStack::PopAndDestroy( itemDispName ); @@ -2187,7 +2325,7 @@ { iListItemVisulizers.Append( plainItemVisualizer ); } - + return itemId; } @@ -2203,7 +2341,7 @@ FUNC_LOG; aItemData = CFsTreePlainOneLineItemData::NewL(); CleanupStack::PushL( aItemData ); - + aItemData->SetDataL( *aItemDataBuff ); if( aIcon ) { @@ -2220,8 +2358,9 @@ } else { - aItemVisualizer->SetLayoutHints( CFsTreeItemVisualizerBase::EPopupLayout ); + aItemVisualizer->SetLayoutHints( CFsTreeItemVisualizerBase::EPopupLayout ); } + SetItemVisualizerPropertiesL( aItemVisualizer ); } @@ -2237,17 +2376,17 @@ FUNC_LOG; aItemData = CFsTreePlainOneLineNodeData::NewL(); CleanupStack::PushL( aItemData ); - + aItemData->SetDataL( *aItemDataBuff ); if( aIcon ) { aItemData->SetIconExpanded( *aIcon ); aItemData->SetIconCollapsed( *aIcon ); } - + aNodeVisualizer = CFsTreePlainOneLineNodeVisualizer::NewL( *iTreeList->TreeControl() ); CleanupStack::PushL( aNodeVisualizer ); - + // Set folder view specific layouts to be used if ( iFullScreen ) { @@ -2255,11 +2394,11 @@ } else { - aNodeVisualizer->SetLayoutHints( CFsTreeItemVisualizerBase::EPopupLayout ); + aNodeVisualizer->SetLayoutHints( CFsTreeItemVisualizerBase::EPopupLayout ); } SetItemVisualizerPropertiesL( aNodeVisualizer ); } - + void CFSEmailUiFolderListVisualiser::SetItemVisualizerPropertiesL( MFsTreeItemVisualizer* aItemVisualizer ) { FUNC_LOG; @@ -2276,7 +2415,7 @@ aItemVisualizer->SetExtendable( EFalse ); - // Set correct skin text colors for the list items + // Set correct skin text colors for the list items TRgb focusedColor = iAppUi.LayoutHandler()->ListFocusedStateTextSkinColor(); // If list is in full screen, it has general list background, so we use // general list text color. If it's not in full screen, we use dropdown @@ -2290,10 +2429,10 @@ { normalColor = iAppUi.LayoutHandler()->DropdownMenuTextColor(); } - + aItemVisualizer->SetFocusedStateTextColor( focusedColor ); aItemVisualizer->SetNormalStateTextColor( normalColor ); - + // Set font size aItemVisualizer->SetFontHeight( iAppUi.LayoutHandler()->ListItemFontHeightInTwips( !iFullScreen ) ); // Set node bolded @@ -2323,7 +2462,7 @@ TRect popupRect( iScreenRect ); // translate to screen coorinates popupRect.Move( iEnv.PrimaryDisplay().VisibleArea().iTl ); - // check if the event happened outside of the popup + // check if the event happened outside of the popup if ( !popupRect.Contains( position ) ) { HandleSelectionL( EFSEmailUiCtrlBarResponseCancel ); @@ -2339,7 +2478,7 @@ } eventHandled = ETrue; } - } + } return eventHandled; } @@ -2457,19 +2596,22 @@ } else { + TRect cbr = iAppUi.LayoutHandler()->GetControlBarRect(); if( iCallback ) { iCtrlButtonRect = iCallback->FolderButtonRect(); + iCtrlButtonRect.Move( cbr.iTl ); iScreenRect = FolderListRectInThisResolution(); } else if ( iSortListCallback ) { iCtrlButtonRect = iSortListCallback->SortButtonRect(); - iScreenRect = SortListRectInThisResolution(); + iCtrlButtonRect.Move( cbr.iTl ); + iScreenRect = SortListRectInThisResolution(); } else { - // Do nothing. This happens if HandleDynamicVariantSwitch() is called while the popup list is not visible. + // Do nothing. This happens if HandleDynamicVariantSwitch() is called while the popup list is not visible. } } iListIconSize = iAppUi.LayoutHandler()->FolderListIconSize( !iFullScreen ); @@ -2511,8 +2653,8 @@ FUNC_LOG; iIconArray.Reset(); if ( iFullScreen ) - { - // NOTE: Must be appended same order as are in TFsEmailUiFolderListIcons! + { + // NOTE: Must be appended same order as are in TFsEmailUiFolderListIcons! iIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( EFolderListInboxTexture ) ); // EFolderListIconInbox iIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( EFolderListInboxSubfoldersTexture ) ); // EFolderListIconInboxSubfolders iIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( EFolderListOutboxTexture ) ); // EFolderListIconOutbox @@ -2525,7 +2667,7 @@ } else { - // NOTE: Must be appended same order as are in TFsEmailUiFolderListIcons! + // NOTE: Must be appended same order as are in TFsEmailUiFolderListIcons! iIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( EFolderListInboxTexturePopup ) ); // EFolderListIconInbox iIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( EFolderListInboxSubfoldersTexturePopup ) ); // EFolderListIconInboxSubfolders iIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( EFolderListOutboxTexturePopup ) ); // EFolderListIconOutbox @@ -2534,7 +2676,23 @@ iIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( EFolderListDeletedItemsTexturePopup ) ); // EFolderListIconDeleted iIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( EFolderListServerFoldersTexturePopup ) ); // EFolderListIconServerFolders iIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( EFolderListMoreFoldersTexturePopup ) ); // EFolderListIconMoreFolders - iIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( EFolderListEmailAccountTexturePopup ) ); // EFolderListIconEmailAccount + iIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( EFolderListEmailAccountTexturePopup ) ); // EFolderListIconEmailAccount + + // NOTE: Must be appended same order as are in TFsEmailUiSortListIcons! + iSortIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( ESortListAttachmentAscTexture ) ); // ESortListAttachmentAscIcon + iSortIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( ESortListAttachmentDescTexture ) ); // ESortListAttachmentDescIcon + iSortIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( ESortListDateAscTexture ) ); // ESortListDateAscIcon + iSortIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( ESortListDateDescTexture ) ); // ESortListDateDescIcon + iSortIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( ESortListFollowAscTexture ) ); // ESortListFollowAscIcon + iSortIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( ESortListFollowDescTexture ) ); // ESortListFollowDescIcon + iSortIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( ESortListPriorityAscTexture ) ); // ESortListPriorityAscIcon + iSortIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( ESortListPriorityDescTexture ) ); // ESortListPriorityDescIcon + iSortIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( ESortListSenderAscTexture ) ); // ESortListSenderAscIcon + iSortIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( ESortListSenderDescTexture ) ); // ESortListSenderDescIcon + iSortIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( ESortListSubjectAscTexture ) ); // ESortListSubjectAscIcon + iSortIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( ESortListSubjectDescTexture ) ); // ESortListSubjectDescIcon + iSortIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( ESortListUnreadAscTexture ) ); // ESortListUnreadAscIcon + iSortIconArray.AppendL( &iAppUi.FsTextureManager()->TextureByIndex( ESortListUnreadDescTexture ) ); // ESortListUnreadDescIcon } } @@ -2561,6 +2719,13 @@ // array, instead those are owned by texture manager. So // those should be resized by other means. But currently // there is no way to do it (see above comment). + + // Then resize sort list icons + TInt arraySizeSort = iSortIconArray.Count(); + for( TInt i = 0; i < arraySizeSort; i++ ) + { + iSortIconArray[i]->Size().SetSize( iListIconSize.iWidth, iListIconSize.iHeight ); + } } } @@ -2586,15 +2751,15 @@ { FUNC_LOG; const TInt popupHeight( iScreenRect.Height() ); - const TInt separatorHeight( iListSeparatorHeight * + const TInt separatorHeight( iListSeparatorHeight * iModel->SeparatorCount() ); - const TInt itemCount( iTreeList->Count() - iModel->SeparatorCount() ); - TInt visibleItemCount( ( popupHeight - separatorHeight ) / - iListItemHeight ); - visibleItemCount = Min( visibleItemCount, itemCount ); - iScreenRect.SetHeight( visibleItemCount * iListItemHeight + - separatorHeight + - iAppUi.LayoutHandler()->DropDownMenuListPadding() * 2 + + const TInt itemCount( iTreeList->Count() - iModel->SeparatorCount() ); + TInt visibleItemCount( ( popupHeight - separatorHeight ) / + iListItemHeight ); + visibleItemCount = Min( visibleItemCount, itemCount ); + iScreenRect.SetHeight( visibleItemCount * iListItemHeight + + separatorHeight + + iAppUi.LayoutHandler()->DropDownMenuListPadding() * 2 + iAppUi.LayoutHandler()->ControlBarListPadding().iY ); AdjustWidthByContent( iScreenRect ); } @@ -2605,17 +2770,19 @@ // void CFSEmailUiFolderListVisualiser::AdjustWidthByContent( TRect& aRect ) const { + const TRect oldButtonRect( iScreenRect ); const TInt buttonWidth( iCtrlButtonRect.Width() ); const TInt currentWidth( aRect.Width() ); // only do adjusting if the buttonWidth is smaller than current popup width if ( buttonWidth < currentWidth ) { + TBool landscape( Layout_Meta_Data::IsLandscapeOrientation() ); TAknLayoutRect scrollPane; scrollPane.LayoutRect( aRect, AknLayoutScalable_Apps::sp_fs_scroll_pane_cp01( 6 ) ); const TInt scrollPaneWidth( scrollPane.Rect().Width() ); - + TAknLayoutText textLayout; textLayout.LayoutText( aRect, AknLayoutScalable_Apps::list_single_dyc_row_text_pane_t1( 0 ) ); @@ -2674,6 +2841,12 @@ aRect.Move( -aRect.iTl.iX + iCtrlButtonRect.iTl.iX, 0 ); } } + + // Keep the right edge position unchanged + if( landscape ) + { + aRect.Move( oldButtonRect.iBr.iX - aRect.iBr.iX, 0 ); + } } } } @@ -2698,10 +2871,10 @@ { iListHeaderHeight = 0; } - + TSize mainPaneSize; AknLayoutUtils::LayoutMetricsSize(AknLayoutUtils::EMainPane, mainPaneSize); - + // Set anchor for background visual iParentLayout->SetAnchor(EAlfAnchorTopLeft, 0, @@ -2717,7 +2890,7 @@ EAlfAnchorMetricAbsolute, EAlfAnchorMetricAbsolute, TAlfTimedPoint(mainPaneSize.iWidth,mainPaneSize.iHeight)); - + // Set anchor for header text visual iParentLayout->SetAnchor(EAlfAnchorTopLeft, 1, @@ -2764,7 +2937,7 @@ if ( topLevelCount ) { TFsTreeItemId topId = iTreeList->Child(KFsTreeRootID, 0); - iTreeVisualizer->SetFocusedItemL( topId ); + iTreeVisualizer->SetFocusedItemL( topId ); } } @@ -2778,17 +2951,17 @@ // There may be arbitrary number of nested sub folders. Make sure we focus // the bottommost visible subfolder. TFsTreeItemId bottomId = KFsTreeRootID; - - while ( iTreeList->IsNode(bottomId) && + + while ( iTreeList->IsNode(bottomId) && iTreeList->IsExpanded(bottomId) && iTreeList->CountChildren(bottomId) ) { bottomId = iTreeList->Child( bottomId, iTreeList->CountChildren(bottomId)-1 ); } - + if ( bottomId != KFsTreeRootID ) { - iTreeVisualizer->SetFocusedItemL( bottomId ); + iTreeVisualizer->SetFocusedItemL( bottomId ); } } @@ -2813,7 +2986,7 @@ FUNC_LOG; TFsTreeItemId itemId = KFsTreeNoneID; TInt count = iTreeList->CountChildren(KFsTreeRootID); - + // If top level is collapsed, then everything is collapsed. There's no need // to crawl any deeper in the tree hierarchy. for ( TInt i=0 ; iCountChildren(aParentNodeId); - + for ( TInt i=0 ; iChild( aParentNodeId, i ); @@ -2854,7 +3027,7 @@ } } } - + return ETrue; } @@ -2875,27 +3048,27 @@ { // Get the list level TUint level = iTreeList->Level( focusedId ); - + // Little optimisation, handle all levels up to KListLastBasicLevel // as root level because horizontal scroll amount is same for all if( level <= KListLastBasicLevel ) { level = KListRootLevel; } - + // Recalculate the list rect only if level has changed or if // recalculation is forced by parameter (e.g. in case of // dynamic variant switch) if( ( level != iPreviousListLevel ) || aForceRecalculation ) { TRect listRect = iListLayout->DisplayRectTarget(); - + // Calulate list rect by taking x-coordinates from iScreenRect // and y-coordinates from list layouts target rect (to take // into account the list header) listRect.SetRect( iScreenRect.iTl.iX, listRect.iTl.iY, iScreenRect.iBr.iX, listRect.iBr.iY ); - + if( level > KListLastBasicLevel ) { // Calculate rect according to current level @@ -2903,7 +3076,7 @@ listRect.SetWidth( iScreenRect.Width() + rectChange ); listRect.Move( -rectChange, 0 ); } - + // Set the list rect only if it has changed from previous // (because list refresh causes a little twitch) if( listRect != iPreviousListRect ) @@ -2912,7 +3085,7 @@ iTreeVisualizer->RefreshListViewL(); iPreviousListRect = listRect; } - + iPreviousListLevel = level; } } @@ -2977,6 +3150,16 @@ Toolbar()->SetItemDimmed( EFsEmailUiTbCmdExpandAll, ETrue, ETrue ); break; } + case EFsFocusVisibilityChange: + { + iAppUi.SetFocusVisibility( EFalse ); + break; + } + default: + { + // No need to handle other events. + break; + } } } @@ -2989,24 +3172,26 @@ TFSMailMsgId aMailboxId, TAny* /*aParam1*/, TAny* /*aParam2*/, TAny* /*aParam3*/ ) { FUNC_LOG; - + // Handle the event - if ( iMoveOrCopyInitiated && - iFirstStartCompleted && + if ( iMoveOrCopyInitiated && + iFirstStartCompleted && aMailboxId == iAppUi.GetActiveMailboxId() && - iAppUi.CurrentActiveView() == this ) + iAppUi.CurrentActiveView() == this ) { - if ( aEvent == TFSEventMailboxOnline ) + if ( aEvent == TFSEventMailboxOnline ) { if( iWaitingToGoOnline ) { PrepareFolderListL(); PopulateFolderListL(); - + if ( iModel->Count() ) { - SetFocusToLatestMovedFolderL(); + SetFocusToLatestMovedFolderL(); } + iTreeList->SetFocusedL( ETrue ); + iWaitingToGoOnline = EFalse; } } else if ( aEvent == TFSEventMailboxOffline ) @@ -3022,6 +3207,17 @@ } // --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CFSEmailUiFolderListVisualiser::FocusVisibilityChange( TBool aVisible ) + { + FUNC_LOG; + CFsEmailUiViewBase::FocusVisibilityChange( aVisible ); + iTreeVisualizer->SetFocusVisibility( aVisible ); + } + +// --------------------------------------------------------------------------- // CbaButtonPressed // Check if aPosition is on CBA touch area // --------------------------------------------------------------------------- @@ -3029,7 +3225,7 @@ TBool CFSEmailUiFolderListVisualiser::CbaButtonPressed( TPoint aPosition ) { TBool cbaPressed( EFalse ); - + TRect leftCbaRect = TRect(); TRect rightCbaRect = TRect(); GetCbaRects( leftCbaRect, rightCbaRect ); @@ -3049,7 +3245,7 @@ // void CFSEmailUiFolderListVisualiser::GetCbaRects( TRect& aLeftCbaRect, TRect& aRightCbaRect ) { - TBool rightPaneActive( IsAreaSideRightPaneActive() ); + TBool rightPaneActive( IsAreaSideRightPaneActive() ); TBool bskLandscape( Layout_Meta_Data::IsLandscapeOrientation() && !rightPaneActive ); TRect screen; @@ -3058,9 +3254,9 @@ { TAknWindowComponentLayout rightAreaLayout( AknLayoutScalable_Avkon::area_side_right_pane( 0 ) ); - + TAknLayoutRect layoutRect; - // Read right (top in landscape) softkey layout. + // Read right (top in landscape) softkey layout. layoutRect.LayoutRect( screen, TAknWindowComponentLayout::Compose( @@ -3068,7 +3264,7 @@ AknLayoutScalable_Avkon::sctrl_sk_bottom_pane() ).LayoutLine() ); TRect bottomSKRect( layoutRect.Rect() ); - // Read left (bottom in landscape) softkey layout. + // Read left (bottom in landscape) softkey layout. layoutRect.LayoutRect( screen, TAknWindowComponentLayout::Compose( @@ -3084,10 +3280,10 @@ layoutRect.LayoutRect( topSKRect, AknLayoutScalable_Avkon::aid_touch_sctrl_top().LayoutLine() ); - aRightCbaRect = layoutRect.Rect(); + aRightCbaRect = layoutRect.Rect(); } else - { + { TAknWindowComponentLayout applicationWindow( AknLayoutScalable_Avkon::application_window( 0 ) ); TAknLayoutRect cbarect; @@ -3099,7 +3295,7 @@ AknLayoutScalable_Avkon::area_bottom_pane( bskLandscape ? 2 : 1 ), AknLayoutScalable_Avkon::control_pane() ) ).LayoutLine() ); aLeftCbaRect = cbarect.Rect(); - } + } } // --------------------------------------------------------------------------- @@ -3112,8 +3308,8 @@ // Currently the widescreen status pane layout is in use only // when pen input (touch) is enabled. TBool result = EFalse; - - if ( Layout_Meta_Data::IsLandscapeOrientation() && + + if ( Layout_Meta_Data::IsLandscapeOrientation() && Layout_Meta_Data::IsPenEnabled() ) { if ( iAvkonEnv->StatusPaneResIdForCurrentLayout(