diff -r 000000000000 -r 8466d47a6819 emailuis/emailui/src/FreestyleEmailUiDownloadManagerVisualiser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailuis/emailui/src/FreestyleEmailUiDownloadManagerVisualiser.cpp Thu Dec 17 08:39:21 2009 +0200 @@ -0,0 +1,1370 @@ +/* +* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Implements visualiser for the download manager view +* +*/ + + + +// SYSTEM INCLUDES +#include "emailtrace.h" +#include +#include +#include +#include +#include +// SF +#include +#include "fscontrolbar.h" +#include "fscontrolbuttoninterface.h" +#include "fstreelist.h" +#include "fstreevisualizerbase.h" +#include "fstreeplainonelineitemdata.h" +#include "fstreeplainonelineitemvisualizer.h" +#include "fstreeplainonelinenodedata.h" +#include "fstreeplainonelinenodevisualizer.h" +#include "fstreeplaintwolineitemdata.h" +#include "fstreeplaintwolineitemvisualizer.h" +// +#include +#include +#include +#include +#include +// SF +#include +#include +#include +#include +#include "mfsmailbrandmanager.h" +#include "cfsmailclient.h" +// +#include +// + +// INTERNAL INCLUDES +#include "FreestyleEmailUiAttachmentsListVisualiser.h" +#include "FreestyleEmailUiLayoutHandler.h" +#include "FreestyleEmailUiDownloadManagerModel.h" +#include "FreestyleEmailUiDownloadManagerVisualiser.h" +#include "FreestyleEmailUiDownloadManagerControl.h" +#include "FreestyleEmailUiMsgDetailsVisualiser.h" +#include "FreestyleEmailUiFileSystemInfo.h" +#include "FreestyleEmailUiScrollbarClet.h" +#include "FreestyleEmailUiAppUi.h" +#include "FreestyleEmailUi.hrh" +#include "FreestyleEmailUiTextureManager.h" +#include "FreestyleEmailUiUtilities.h" +#include "FreestyleEmailUiLiterals.h" +#include "FreestyleEmailUiShortcutBinding.h" + + +CFSEmailUiDownloadManagerVisualiser* CFSEmailUiDownloadManagerVisualiser::NewL( + CAlfEnv& aEnv, CFreestyleEmailUiAppUi* aAppUi, CAlfControlGroup& aControlGroup ) + { + FUNC_LOG; + CFSEmailUiDownloadManagerVisualiser* self = + CFSEmailUiDownloadManagerVisualiser::NewLC( aEnv, aAppUi, aControlGroup ); + CleanupStack::Pop( self ); + return self; + } + +CFSEmailUiDownloadManagerVisualiser* CFSEmailUiDownloadManagerVisualiser::NewLC( + CAlfEnv& aEnv, CFreestyleEmailUiAppUi* aAppUi, CAlfControlGroup& aControlGroup ) + { + FUNC_LOG; + CFSEmailUiDownloadManagerVisualiser* self = + new (ELeave) CFSEmailUiDownloadManagerVisualiser( aEnv, aAppUi, aControlGroup ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +void CFSEmailUiDownloadManagerVisualiser::ConstructL() + { + FUNC_LOG; + + BaseConstructL( R_FSEMAILUI_DOWNLOADMANAGER_VIEW ); + + // Create list screen (list) control + iScreenControl = CFreestyleEmailUiDownloadManagerControl::NewL( iEnv, this ); + + // Create attachments list layout and set it to fill the main pane + TRect screenRect; + AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, screenRect ); + iListLayout = CAlfDeckLayout::AddNewL( *iScreenControl ); + screenRect.Move(0,0); + iListLayout->SetRect( screenRect ); + + // Create attachments list tree list component + iDownloadManagerTreeListVisualizer = CFsTreeVisualizerBase::NewL(iScreenControl, *iListLayout); + iDownloadManagerTreeListVisualizer->SetItemExpansionDelay( iAppUi.LayoutHandler()->ListItemExpansionDelay() ); + + iDownloadManagerList = CFsTreeList::NewL(*iDownloadManagerTreeListVisualizer, iEnv); + iDownloadManagerList->SetScrollbarVisibilityL( EFsScrollbarAuto ); + iDownloadManagerList->SetMarkTypeL( CFsTreeList::EFsTreeListMultiMarkable ); + iDownloadManagerList->SetIndentationL( 0 ); + + // Compared to S60 3.2.3 in S60 5.0 Alf offers the key events in + // opposite order. + ControlGroup().AppendL( iScreenControl ); + ControlGroup().AppendL( iDownloadManagerList->TreeControl() ); + // + + iModel = CFSEmailUiDownloadManagerModel::NewL( iAppUi, *this ); + // S60 skin support + //iDownloadManagerTreeListVisualizer->SetBackgroundTextureL( iAppUi.FsTextureManager()->TextureByIndex( EBackgroundTextureMailList ) ); + // + iDownloadManagerTreeListVisualizer->SetMenuIcon( iAppUi.FsTextureManager()->TextureByIndex( EListControlMenuIcon ) ); + iDownloadManagerTreeListVisualizer->SetItemsAlwaysExtendedL( ETrue ); + iDownloadManagerList->AddObserverL( *this ); + + iAppUi.LayoutHandler()->SetListMarqueeBehaviour( iDownloadManagerList ); + + // Set page up and page down keys + iDownloadManagerTreeListVisualizer->AddCustomPageUpKey( EStdKeyPageUp ); + iDownloadManagerTreeListVisualizer->AddCustomPageDownKey( EStdKeyPageDown ); + + CAlfBrush* selectorBrush = iAppUi.FsTextureManager()->ListSelectorBrushL(); + iDownloadManagerTreeListVisualizer->SetSelectorPropertiesL( selectorBrush, 1.0, CFsTreeVisualizerBase::EFsSelectorMoveSmoothly ); + + } + + +CFSEmailUiDownloadManagerVisualiser::CFSEmailUiDownloadManagerVisualiser( + CAlfEnv& aEnv, CFreestyleEmailUiAppUi* aAppUi, CAlfControlGroup& aControlGroup ) + : CFsEmailUiViewBase( aControlGroup, *aAppUi ), iEnv( aEnv ) + { + FUNC_LOG; + } + +CFSEmailUiDownloadManagerVisualiser::~CFSEmailUiDownloadManagerVisualiser() + { + FUNC_LOG; + delete iModel; + if ( iDownloadManagerList ) + { + iDownloadManagerList->RemoveObserver( *this ); + } + delete iDownloadManagerList; + } + + +TInt CFSEmailUiDownloadManagerVisualiser::HighlightedIndex() + { + FUNC_LOG; + return 0; + } + +TUid CFSEmailUiDownloadManagerVisualiser::Id() const + { + FUNC_LOG; + return DownloadManagerViewId; + } + +// --------------------------------------------------------------------------- +// CFSEmailUiDownloadManagerVisualiser::ChildDoActivateL +// --------------------------------------------------------------------------- +// +// Toolbar +/*void CFSEmailUiDownloadManagerVisualiser::DoActivateL( + const TVwsViewId& aPrevViewId, + TUid aCustomMessageId, + const TDesC8& aCustomMessage )*/ +void CFSEmailUiDownloadManagerVisualiser::ChildDoActivateL( + const TVwsViewId& /*aPrevViewId*/, + TUid /*aCustomMessageId*/, + const TDesC8& /*aCustomMessage*/ ) +// Toolbar + { + FUNC_LOG; + RefreshL(); + iDownloadManagerList->ShowListL(); + + SetMailboxNameToStatusPaneL(); + } + +void CFSEmailUiDownloadManagerVisualiser::SetMailboxNameToStatusPaneL() + { + FUNC_LOG; + iAppUi.SetActiveMailboxNameToStatusPaneL(); + } + +// --------------------------------------------------------------------------- +// CFSEmailUiDownloadManagerVisualiser::ChildDoDeactivate +// --------------------------------------------------------------------------- +// +void CFSEmailUiDownloadManagerVisualiser::ChildDoDeactivate() + { + FUNC_LOG; + if ( !iAppUi.AppUiExitOngoing() ) + { + iDownloadManagerTreeListVisualizer->NotifyControlVisibilityChange( EFalse ); + } + } + +CFSEmailUiDownloadManagerModel* CFSEmailUiDownloadManagerVisualiser::Model() + { + FUNC_LOG; + return iModel; + } + +void CFSEmailUiDownloadManagerVisualiser::DynInitMenuPaneL(TInt aResourceId, CEikMenuPane* aMenuPane) + { + FUNC_LOG; + TAttachmentData* selectedItem = iModel->GetItem( iDownloadManagerList->FocusedItem() ); + + if ( aResourceId == R_FSEMAILUI_ATTACHMENTS_SUBMENU_ACTIONS ) + { + aMenuPane->SetItemDimmed( EFsEmailUiCmdOpen, + !IsCommandAvailableOnItem(EFsEmailUiCmdOpen, selectedItem) ); + + aMenuPane->SetItemDimmed( EFsEmailUiCmdDownload, + !IsCommandAvailableOnItem(EFsEmailUiCmdDownload, selectedItem) ); + + aMenuPane->SetItemDimmed( EFsEmailUiCmdCancelDownload, + !IsCommandAvailableOnItem(EFsEmailUiCmdCancelDownload, selectedItem) ); + + aMenuPane->SetItemDimmed( EFsEmailUiCmdSave, + !IsCommandAvailableOnItem(EFsEmailUiCmdSave, selectedItem) ); + + aMenuPane->SetItemDimmed( EFsEmailUiCmdDownloadAll, + !IsCommandAvailableOnItem(EFsEmailUiCmdDownloadAll, selectedItem) ); + + aMenuPane->SetItemDimmed( EFsEmailUiCmdCancelAllDownloads, + !IsCommandAvailableOnItem(EFsEmailUiCmdCancelAllDownloads, selectedItem) ); + + aMenuPane->SetItemDimmed( EFsEmailUiCmdSaveAll, + !IsCommandAvailableOnItem(EFsEmailUiCmdSaveAll, selectedItem) ); + + aMenuPane->SetItemDimmed( EFsEmailUiCmdClearFetchedAttachment, + !IsCommandAvailableOnItem(EFsEmailUiCmdClearFetchedAttachment, selectedItem) ); + + aMenuPane->SetItemDimmed( EFsEmailUiCmdRemoveAttachment, + !IsCommandAvailableOnItem(EFsEmailUiCmdRemoveAttachment, selectedItem) ); + } + else if ( aResourceId == R_FSEMAILUI_DOWNLOADMANAGER_MENUPANE ) + { + if ( FeatureManager::FeatureSupported( KFeatureIdFfCmailIntegration ) ) + { + // remove help support in pf5250 + aMenuPane->SetItemDimmed( EFsEmailUiCmdHelp, ETrue); + } + + aMenuPane->SetItemDimmed( EFsEmailUiCmdMailActions, + !IsCommandAvailableOnItem(EFsEmailUiCmdMailActions, selectedItem) ); + + // Hide message related commands if no message in focus. + // This may happen when all attachments have been removed from open DM view. + TPartData messageData; + TRAPD( err, messageData = iModel->GetMessageL( iDownloadManagerList->FocusedItem() ) ); + if ( err ) + { + aMenuPane->SetItemDimmed( EFSEmailUICmdViewMessage, ETrue ); + aMenuPane->SetItemDimmed( EFsEmailUiCmdMsgDetails, ETrue ); + } + } + + // Add shortcut hints + iAppUi.ShortcutBinding().AppendShortcutHintsL( *aMenuPane, + CFSEmailUiShortcutBinding::EContextDownloadManager ); + } + + +// --------------------------------------------------------------------------- +// HandleMailBoxEventL +// Mailbox event handler, responds to events sent by the plugin. +// --------------------------------------------------------------------------- +// +void CFSEmailUiDownloadManagerVisualiser::HandleMailBoxEventL( TFSMailEvent aEvent, + TFSMailMsgId /*aMailbox*/, TAny* /*aParam1*/, TAny* /*aParam2*/, TAny* /*aParam3*/ ) + { + FUNC_LOG; + // Safety, refresh only if this view is active, has model and mail deleted event has been received. + if ( aEvent == TFSEventMailDeleted && iModel ) + { + // Remove deleted items from list. Refresh list if this view is active + // and some item was removed. + if ( iModel->ClearInvalidItemsL() && + iAppUi.CurrentActiveView() == this ) + { + RefreshL(); + SetMskL(); + } + } + } + + +void CFSEmailUiDownloadManagerVisualiser::RefreshL() + { + FUNC_LOG; + TRect screenRect; + AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EScreen, screenRect ); + iListLayout->SetRect( screenRect ); + + iDownloadManagerList->RemoveAllL(); + + CFsTreePlainTwoLineItemData* twoLineItemData = CFsTreePlainTwoLineItemData::NewL(); + CleanupStack::PushL( twoLineItemData ); + CFsTreePlainTwoLineItemVisualizer* twoLineItemVisualizer = + CFsTreePlainTwoLineItemVisualizer::NewL( *iDownloadManagerList->TreeControl() ); + CleanupStack::PushL( twoLineItemVisualizer ); + // Set font height + twoLineItemVisualizer->SetFontHeight( iAppUi.LayoutHandler()->ListItemFontHeightInTwips() ); + // Set font bolding + twoLineItemVisualizer->SetTextBold( ETrue ); + // Set manual layout and make item non-focusable + twoLineItemVisualizer->SetFlags( twoLineItemVisualizer->Flags() & ~KFsTreeListItemFocusable ); + + // Set correct skin text colors for the list items + TRgb focusedColor = iAppUi.LayoutHandler()->ListFocusedStateTextSkinColor(); + TRgb normalItemColor = iAppUi.LayoutHandler()->ListNormalStateTextSkinColor(); + TRgb normalNodeColor = iAppUi.LayoutHandler()->ListNodeTextColor(); + TRgb headerBgColor = iAppUi.LayoutHandler()->ListHeaderBackgroundColor(); + + twoLineItemVisualizer->SetFocusedStateTextColor( focusedColor ); + twoLineItemVisualizer->SetNormalStateTextColor( normalItemColor ); + twoLineItemVisualizer->SetBackgroundColor( headerBgColor ); + + const RArray& modelData = iModel->GetModel(); + HBufC* resourceString = StringLoader::LoadLC( R_FSE_VIEWER_ATTACHMENTS_HEADER_DOWNLOAD_MANAGER ); + twoLineItemData->SetDataL( *resourceString ); + CleanupStack::PopAndDestroy( resourceString ); + + resourceString = StringLoader::LoadLC( R_FSE_VIEWER_ATTACHMENTS_HEADER_TOTAL, iModel->AttachmentCount() ); + twoLineItemData->SetSecondaryDataL( *resourceString ); + CleanupStack::PopAndDestroy( resourceString ); + twoLineItemData->SetIcon ( iAppUi.FsTextureManager()->TextureByIndex( EAttachmentIcon ) ); + CleanupStack::Pop( twoLineItemVisualizer ); + CleanupStack::Pop( twoLineItemData ); + iHeaderItemId = iDownloadManagerList->InsertItemL( *twoLineItemData, *twoLineItemVisualizer, KFsTreeRootID ); + + TFsTreeItemId parentNode; + for ( TInt i=0 ; iTreeControl() ); + CleanupStack::PushL( separatorVisualiser ); + separatorData->SetDataL( *modelData[i].mailSubject ); + // Set font height + separatorVisualiser->SetFontHeight( iAppUi.LayoutHandler()->ListItemFontHeightInTwips() ); + // Set font bolding + separatorVisualiser->SetTextBold( ETrue ); + // Set correct skin text colors for the list items + separatorVisualiser->SetFocusedStateTextColor( focusedColor ); + separatorVisualiser->SetNormalStateTextColor( normalNodeColor ); + separatorVisualiser->SetBackgroundColor( iAppUi.LayoutHandler()->ListNodeBackgroundColor() ); + + separatorVisualiser->SetExtendable( EFalse ); + separatorData->SetIconExpanded( iAppUi.FsTextureManager()->TextureByIndex( EListTextureNodeExpanded ) ); + separatorData->SetIconCollapsed( iAppUi.FsTextureManager()->TextureByIndex( EListTextureNodeCollapsed ) ); + CleanupStack::Pop( separatorVisualiser ); + CleanupStack::Pop( separatorData ); + parentNode = iDownloadManagerList->InsertNodeL(*separatorData, *separatorVisualiser, KFsTreeRootID); + iModel->SetNodeIdL( i, parentNode ); + for (TInt j=0; jSetDataL( modelData[i].mailAttachments[j].fileName ); + + HBufC* secondLine = CreateSecondLineTextLC( modelData[i].mailAttachments[j] ); + twoLineItemData->SetSecondaryDataL( *secondLine ); + CleanupStack::PopAndDestroy( secondLine ); + + CAlfTexture& itemTexture = TFsEmailUiUtility::GetAttachmentIcon( modelData[i].mailAttachments[j].fileType, + *iAppUi.FsTextureManager() ); + twoLineItemData->SetIcon( itemTexture ); + + + twoLineItemVisualizer = CFsTreePlainTwoLineItemVisualizer::NewL( *iDownloadManagerList->TreeControl()); + CleanupStack::PushL( twoLineItemVisualizer ); + twoLineItemVisualizer->SetExtendable(ETrue); + twoLineItemVisualizer->SetFlags( twoLineItemVisualizer->Flags() | KFsTreeListItemHasMenu ); + + CAlfTextStyle* textStyle = iAppUi.LayoutHandler()->FSTextStyleFromIdL( EFSFontTypeSmall ); + twoLineItemVisualizer->SetTextStyleId( textStyle->Id() ); + + // Set font height + twoLineItemVisualizer->SetFontHeight( iAppUi.LayoutHandler()->ListItemFontHeightInTwips() ); + // Set font bolding + twoLineItemVisualizer->SetTextBold( EFalse ); + // Set correct skin text colors for the list items + twoLineItemVisualizer->SetFocusedStateTextColor( focusedColor ); + twoLineItemVisualizer->SetNormalStateTextColor( normalItemColor ); + + + TFsTreeItemId treeItemId = iDownloadManagerList->InsertItemL( *twoLineItemData, *twoLineItemVisualizer, parentNode); + CleanupStack::Pop( twoLineItemVisualizer ); + CleanupStack::Pop( twoLineItemData ); + + iModel->SetItemIdL( i, j, treeItemId ); + } + } + } + + +void CFSEmailUiDownloadManagerVisualiser::HandleDynamicVariantSwitchL( CFsEmailUiViewBase::TDynamicSwitchType aType ) + { + FUNC_LOG; + iDownloadManagerList->HideListL(); + if ( aType == CFsEmailUiViewBase::ESkinChanged ) + { + ResetColorsL(); + iDownloadManagerList->ShowListL(); + } + else if ( aType == CFsEmailUiViewBase::EScreenLayoutChanged ) + { + ReScaleUiL(); + iDownloadManagerList->ShowListL(); + } + } + +void CFSEmailUiDownloadManagerVisualiser::HandleDynamicVariantSwitchOnBackgroundL( CFsEmailUiViewBase::TDynamicSwitchType aType ) + { + FUNC_LOG; + if ( aType == CFsEmailUiViewBase::ESkinChanged ) + { + ResetColorsL(); + } + } + +void CFSEmailUiDownloadManagerVisualiser::GetParentLayoutsL( RPointerArray& aLayoutArray ) const + { + aLayoutArray.AppendL( iListLayout ); + } + +void CFSEmailUiDownloadManagerVisualiser::HandleCommandL( TInt aCommand ) + { + FUNC_LOG; + TFsTreeItemId focusedId = iDownloadManagerList->FocusedItem(); + + switch(aCommand) + { + case EFsEmailUiCmdEmpty: // used when focused item is being downloaded + case EAknSoftkeyOpen: + case EFsEmailUiCmdOpen: + { + TryToOpenItemL( focusedId ); + } + break; + case EFsEmailUiCmdDownload: + { + iModel->StartDownloadL(focusedId); + } + break; + case EFsEmailUiCmdDownloadAll: + { + iModel->DownloadAllAttachmentsL(); + } + break; + case EFsEmailUiCmdCancelDownload: + { + TInt reallyCancel = + TFsEmailUiUtility::ShowConfirmationQueryL( R_FSE_VIEWER_CANCEL_DOWNLOAD_QUERY ); + if ( reallyCancel ) + { + iModel->CancelDownloadL( focusedId ); + } + } + break; + case EFsEmailUiCmdCancelAllDownloads: + { + TInt reallyCancel = + TFsEmailUiUtility::ShowConfirmationQueryL( R_FSE_VIEWER_CANCEL_DOWNLOADS_QUERY ); + if ( reallyCancel ) + { + iModel->CancelAllDownloadsL(); + } + } + break; + case EFsEmailUiCmdSave: + { + TFileName fileName; + TInt savedCount( 0 ); + if ( TFsEmailUiUtility::ShowSaveFolderDialogL( fileName ) ) + { + iModel->SaveAttachmentL( focusedId, fileName, savedCount ); + } + if ( savedCount ) + { + TFsEmailUiUtility::ShowFilesSavedToFolderNoteL( savedCount ); + } + } + break; + case EFsEmailUiCmdSaveAll: + { + TFileName fileName; + if ( TFsEmailUiUtility::ShowSaveFolderDialogL( fileName ) ) + { + iModel->SaveAllAttachmentsL( fileName ); + } + } + break; + case EFsEmailUiCmdClearFetchedAttachment: + case EFsEmailUiCmdRemoveAttachment: + case EFsEmailUiCmdActionsDelete: // from shortcut key + { + RemoveAttachmentL( focusedId ); + } + break; + case EFsEmailUiCmdMsgDetails: + { + TPartData messageData = iModel->GetMessageL( focusedId ); + + TMsgDetailsActivationData msgDetailsData; + msgDetailsData.iMailBoxId = messageData.iMailBoxId; + msgDetailsData.iFolderId = messageData.iFolderId; + msgDetailsData.iMessageId = messageData.iMessageId; + + const TPckgBuf pkgOut( msgDetailsData ); + iAppUi.EnterFsEmailViewL( MsgDetailsViewId, KStartMsgDetailsToBeginning, pkgOut ); + } + break; + case EFSEmailUICmdViewMessage: + { + TPartData messageData = iModel->GetMessageL( focusedId ); + + TMsgViewerActivationData msgViewerData; + msgViewerData.iMailBoxId = messageData.iMailBoxId; + msgViewerData.iFolderId = messageData.iFolderId; + msgViewerData.iMessageId = messageData.iMessageId; + msgViewerData.iDetails = EFSMsgDataStructure; + const TPckgBuf pkgOut( msgViewerData ); + iAppUi.EnterFsEmailViewL( MailViewerId, KStartViewerWithMsgId, pkgOut ); + } + break; + case EFsEmailUiCmdExit: + { + iAppUi.Exit(); + } + break; + case EAknSoftkeyBack: + { + if ( !iAppUi.ViewSwitchingOngoing() ) + { + iAppUi.ReturnToPreviousViewL(); + } + } + break; + + case EFsEmailUiCmdCollapse: + { + iDownloadManagerList->CollapseNodeL( focusedId ); + ChangeMskCommandL( R_FSE_QTN_MSK_EXPAND ); + } + break; + + case EFsEmailUiCmdExpand: + { + iDownloadManagerList->ExpandNodeL( focusedId ); + ChangeMskCommandL( R_FSE_QTN_MSK_COLLAPSE ); + } + break; + case EFsEmailUiCmdActionsCollapseExpandAllToggle: + { + ShortcutCollapseExpandAllToggleL(); + } + break; + case EFsEmailUiCmdGoToTop: + { + 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 }; + iCoeEnv->SimulateKeyEventL( simEvent, EEventKey ); + } + break; + case EFsEmailUiCmdHelp: + { + TFsEmailUiUtility::LaunchHelpL( KFSE_HLP_LAUNCHER_GRID ); + } + break; + default: + break; + } + } + +void CFSEmailUiDownloadManagerVisualiser::SetMskL() + { + FUNC_LOG; + TFsTreeItemId curId = iDownloadManagerList->FocusedItem(); + if ( curId ) + { + if( iDownloadManagerList->IsNode( curId ) ) + { + if (iDownloadManagerList->IsExpanded( curId ) ) + { + ChangeMskCommandL( R_FSE_QTN_MSK_COLLAPSE ); + } + else + { + ChangeMskCommandL( R_FSE_QTN_MSK_EXPAND ); + } + } + else // non-node item + { + TAttachmentData* selectedItem = iModel->GetItem( iDownloadManagerList->FocusedItem()); + if ( selectedItem && IsCommandAvailableOnItem( EFsEmailUiCmdDownload, selectedItem ) ) + { + ChangeMskCommandL( R_FSE_QTN_MSK_DOWNLOAD ); + } + else if ( selectedItem && IsCommandAvailableOnItem( EFsEmailUiCmdOpen, selectedItem ) ) + { + ChangeMskCommandL( R_FSE_QTN_MSK_OPEN ); + } + else + { + ChangeMskCommandL( R_FSE_QTN_MSK_EMPTY ); + } + } + } + else + { + ChangeMskCommandL( R_FSE_QTN_MSK_EMPTY ); + } + } + +TBool CFSEmailUiDownloadManagerVisualiser::OfferEventL(const TAlfEvent& aEvent) + { + FUNC_LOG; + TBool result( EFalse ); + SetMskL(); + if ( aEvent.IsKeyEvent() && aEvent.Code() == EEventKey ) + { + TInt scanCode = aEvent.KeyEvent().iScanCode; + // Swap right and left controls in mirrored layout + if ( AknLayoutUtils::LayoutMirrored() ) + { + if (scanCode == EStdKeyRightArrow) scanCode = EStdKeyLeftArrow; + else if (scanCode == EStdKeyLeftArrow ) scanCode = EStdKeyRightArrow; + } + + if ( scanCode == EStdKeyRightArrow ) + { + LaunchActionMenuL(); + result = ETrue; + } + else + { + // Check keyboard shortcuts. + TInt shortcutCommand = + iAppUi.ShortcutBinding().CommandForShortcutKey( aEvent.KeyEvent(), + CFSEmailUiShortcutBinding::EContextDownloadManager ); + if ( shortcutCommand != KErrNotFound ) + { + HandleCommandL( shortcutCommand ); + result = ETrue; + } + } + } + + /* + if (!result) + { + result = iDownloadManagerList->TreeControl()->OfferEventL(aEvent); + } + */ + return result; + } + +void CFSEmailUiDownloadManagerVisualiser::ReScaleUiL() + { + FUNC_LOG; + TInt fontHeight = iAppUi.LayoutHandler()->ListItemFontHeightInTwips(); + + // Header item + TFsTreeItemId headerId = iDownloadManagerList->Child( KFsTreeRootID, 0 ); + MFsTreeItemVisualizer& headerVis = iDownloadManagerList->ItemVisualizer( headerId ); + headerVis.SetFontHeight( fontHeight ); + + // Mail nodes and attachment items + const RArray& modelData = iModel->GetModel(); + for ( TInt i=0 ; iItemVisualizer( message.treeId ); + messageVis.SetFontHeight( fontHeight ); + + for ( TInt j=0 ; jItemVisualizer( attachment.treeId ); + attachmentVis.SetFontHeight( fontHeight ); + } + } + } + +void CFSEmailUiDownloadManagerVisualiser::ResetColorsL() + { + FUNC_LOG; + TRgb normalTextColor = iAppUi.LayoutHandler()->ListNormalStateTextSkinColor(); + TRgb focusedTextColor = iAppUi.LayoutHandler()->ListFocusedStateTextSkinColor(); + TRgb nodeTextColor = iAppUi.LayoutHandler()->ListNodeTextColor(); + TRgb nodeBgColor = iAppUi.LayoutHandler()->ListNodeBackgroundColor(); + TRgb headerBgColor = iAppUi.LayoutHandler()->ListHeaderBackgroundColor(); + + // Header item + TFsTreeItemId headerId = iDownloadManagerList->Child( KFsTreeRootID, 0 ); + MFsTreeItemVisualizer& headerVis = iDownloadManagerList->ItemVisualizer( headerId ); + headerVis.SetNormalStateTextColor( normalTextColor ); + headerVis.SetFocusedStateTextColor( focusedTextColor ); + headerVis.SetBackgroundColor( headerBgColor ); + + // Mail nodes and attachment items + const RArray& modelData = iModel->GetModel(); + for ( TInt i=0 ; iItemVisualizer( message.treeId ); + messageVis.SetNormalStateTextColor( nodeTextColor ); + messageVis.SetFocusedStateTextColor( focusedTextColor ); + messageVis.SetBackgroundColor( nodeBgColor ); + + for ( TInt j=0 ; jItemVisualizer( attachment.treeId ); + attachmentVis.SetNormalStateTextColor( normalTextColor ); + attachmentVis.SetFocusedStateTextColor( focusedTextColor ); + } + } + } + +CAlfControl* CFSEmailUiDownloadManagerVisualiser::ViewerControl() + { + FUNC_LOG; + return iScreenControl; + } + +TBool CFSEmailUiDownloadManagerVisualiser::IsCommandAvailableOnItem( TInt aCommandId, + const TAttachmentData* aFocusedItem ) const + { + FUNC_LOG; + TBool available = EFalse; + + const RArray& model = iModel->GetModel(); + + switch ( aCommandId ) + { + case EFsEmailUiCmdOpen: + case FsEActionAttachmentOpen: + // Disabled until plugins support this. + //case EFsEmailUiCmdClearFetchedAttachment: + //case FsEActionAttachmentClearFetchedContent: + // + { + if ( aFocusedItem && aFocusedItem->downloadProgress == KComplete ) + { + available = ETrue; + } + } + break; + + // + case FsEActionAttachmentClearFetchedContent: + case EFsEmailUiCmdClearFetchedAttachment: + available = EFalse; + break; + // + + case EFsEmailUiCmdDownload: + case FsEActionAttachmentDownload: + case EFsEmailUiCmdRemoveAttachment: + case FsEActionAttachmentRemoveUnfetchedAttachment: + { + if ( iAppUi.DownloadInfoMediator() && aFocusedItem && aFocusedItem->downloadProgress == KNone && + !iAppUi.DownloadInfoMediator()->IsDownloading( aFocusedItem->partData.iMessagePartId ) ) + { + available = ETrue; + } + } + break; + + case EFsEmailUiCmdCancelDownload: + case FsEActionAttachmentCancelDownload: + { + if ( iAppUi.DownloadInfoMediator() && aFocusedItem && + iAppUi.DownloadInfoMediator()->IsDownloading( aFocusedItem->partData.iMessagePartId ) ) + { + available = ETrue; + } + } + break; + + case EFsEmailUiCmdSave: + case FsEActionAttachmentSave: + { + if ( iAppUi.DownloadInfoMediator() && aFocusedItem && + !iAppUi.DownloadInfoMediator()->IsDownloading( aFocusedItem->partData.iMessagePartId ) ) + { + available = ETrue; + } + } + break; + + case EFsEmailUiCmdSaveAll: + case FsEActionAttachmentSaveAll: + { + // Save all is available if there is more than one attachment + // and none of them are currently being downloaded + if ( iModel->AttachmentCount() > 1 ) + { + available = ETrue; + for ( TInt i=0; i& attachments = model[i].mailAttachments; + for ( TInt j=0 ; jIsDownloading( attachments[j].partData.iMessagePartId ) ) + { + available = EFalse; + break; + } + } + } + } + } + break; + + case EFsEmailUiCmdCancelAllDownloads: + case FsEActionAttachmentCancelAllDownloads: + { + // Cancel all is available if there is more than one ongoing download + TInt downloads = 0; + for ( TInt i=0; i& attachments = model[i].mailAttachments; + for ( TInt j=0 ; jIsDownloading( attachments[j].partData.iMessagePartId ) ) + { + downloads++; + } + } + } + if ( downloads > 1 ) + { + available = ETrue; + } + } + break; + + case EFsEmailUiCmdDownloadAll: + case FsEActionAttachmentDownloadAll: + { + // Download all is available there is more than one attachments for which + // "Download" command is available. + TInt downloadableFiles = 0; + for ( TInt i=0; i& attachments = model[i].mailAttachments; + for ( TInt j=0 ; j 1 ) + { + available = ETrue; + } + } + break; + + case EFsEmailUiCmdMailActions: + { + // Actions menu is available if any sub item is available + available = + IsCommandAvailableOnItem( EFsEmailUiCmdOpen, aFocusedItem ) || + IsCommandAvailableOnItem( EFsEmailUiCmdDownload, aFocusedItem ) || + IsCommandAvailableOnItem( EFsEmailUiCmdCancelDownload, aFocusedItem ) || + IsCommandAvailableOnItem( EFsEmailUiCmdSave, aFocusedItem ) || + IsCommandAvailableOnItem( EFsEmailUiCmdDownloadAll, aFocusedItem ) || + IsCommandAvailableOnItem( EFsEmailUiCmdCancelAllDownloads, aFocusedItem ) || + IsCommandAvailableOnItem( EFsEmailUiCmdSaveAll, aFocusedItem ) || + IsCommandAvailableOnItem( EFsEmailUiCmdClearFetchedAttachment, aFocusedItem ); + } + break; + + default: + // All commands not separately specified are always available + available = ETrue; + break; + } + + return available; + } + +HBufC* CFSEmailUiDownloadManagerVisualiser::CreateSecondLineTextLC( const TAttachmentData& aAttachment ) const + { + FUNC_LOG; + // File extension + TPtrC extString = TParsePtrC( aAttachment.fileName ).Ext(); + // It seems to vary if preceeding dot is included in the file extension. Remove it if present. + if ( extString.Length() && extString[0] == '.' ) + { + extString.Set( extString.Mid(1) ); + } + + // File size + HBufC* sizeString = iModel->CreateSizeDescLC( aAttachment.fileSize ); + + // Download progress + HBufC* progressString = NULL; + if ( iAppUi.DownloadInfoMediator() && iAppUi.DownloadInfoMediator()->IsDownloading( aAttachment.partData.iMessagePartId ) ) + { + progressString = StringLoader::LoadLC( R_FSE_VIEWER_ATTACHMENTS_LIST_DOWNLOADING, aAttachment.downloadProgress ); + } + else if ( aAttachment.downloadProgress == KComplete ) + { + progressString = StringLoader::LoadLC( R_FSE_VIEWER_ATTACHMENTS_LIST_DOWNLOADED_100 ); + } + else + { + progressString = StringLoader::LoadLC( R_FSE_VIEWER_ATTACHMENTS_LIST_DOWNLOADING_CANCELLED ); + } + + // Combine the accumulated data to one buffer + HBufC* result = HBufC::NewL( extString.Length() + + KSpace().Length() + + sizeString->Length() + + KSpace().Length() + + progressString->Length() ); + TPtr resultPtr = result->Des(); + resultPtr.Append( extString ); + resultPtr.Append( KSpace ); + resultPtr.Append( *sizeString ); + resultPtr.Append( KSpace ); + resultPtr.Append( *progressString ); + + CleanupStack::PopAndDestroy( progressString ); + CleanupStack::PopAndDestroy( sizeString ); + + CleanupStack::PushL( result ); + return result; + } + +// --------------------------------------------------------------------------- +// Attempt to open the focused item. Start downloading if the item is not +// downloaded or show note if it's currently being downloaded. +// --------------------------------------------------------------------------- +// +void CFSEmailUiDownloadManagerVisualiser::TryToOpenItemL( TFsTreeItemId aId ) + { + FUNC_LOG; + TAttachmentData* attachment = NULL; + + TRAPD( err, attachment = &iModel->GetItemL( aId ) ); + + if( !err ) + { + if ( attachment ) + { + if ( iModel->IsDownloading( *attachment ) ) + { + TFsEmailUiUtility::ShowInfoNoteL( R_FSE_VIEWER_NOTE_ATTACHMENT_DOWNLOADING_PROGRESS ); + } + else if ( attachment->downloadProgress != KComplete ) + { + TInt restartDownload = + TFsEmailUiUtility::ShowConfirmationQueryL( R_FSE_VIEWER_NOTE_ATTACHMENT_RESTART_DOWNLOADING ); + if ( restartDownload ) + { + HandleCommandL( EFsEmailUiCmdDownload ); + } + } + else + { + TFsEmailUiUtility::OpenAttachmentL( attachment->partData ); + } + } + } + } + +// --------------------------------------------------------------------------- +// Show confirmation note and remove contents of given attachment item +// if user accepts. Does nothing if given ID doesn't match an attachment item. +// --------------------------------------------------------------------------- +// +void CFSEmailUiDownloadManagerVisualiser::RemoveAttachmentL( TFsTreeItemId aId ) + { + FUNC_LOG; + TAttachmentData* item = iModel->GetItem( aId ); + + // show confirmation note only when removing fully fetched attachment + TInt reallyClear = EFalse; + if ( IsCommandAvailableOnItem( EFsEmailUiCmdClearFetchedAttachment, item ) ) + { + reallyClear = TFsEmailUiUtility::ShowConfirmationQueryL( R_FSE_VIEWER_CLEAR_FETCHED_QUERY ); + } + else if ( IsCommandAvailableOnItem( EFsEmailUiCmdRemoveAttachment, item ) ) + { + reallyClear = ETrue; + } + + if ( reallyClear ) + { + iModel->RemoveContentL( aId ); + // Remove item from DM only if contents were actually + // removed succesfully + if ( !iModel->IsCompletelyDownloadedL( *item ) ) + { + // remove model item, message item is also removed automatically if it becomes empty + iModel->RemoveItem( aId ); + + // remove list item + TFsTreeItemId parentId = iDownloadManagerList->Parent( aId ); + iDownloadManagerList->RemoveL( aId ); + // remove also the message node if it became empty + if ( iDownloadManagerList->IsEmpty(parentId) ) + { + iDownloadManagerList->RemoveL( parentId ); + } + + // focused item has changed => change MSK function + SetMskL(); + + // update title item + HBufC* attCountText = StringLoader::LoadLC( R_FSE_VIEWER_ATTACHMENTS_HEADER_TOTAL, iModel->AttachmentCount() ); + CFsTreePlainTwoLineItemData& headerData = + static_cast( iDownloadManagerList->ItemData(iHeaderItemId) ); + headerData.SetSecondaryDataL( *attCountText ); + CleanupStack::PopAndDestroy( attCountText ); + iDownloadManagerTreeListVisualizer->UpdateItemL( iHeaderItemId ); + } + } + } + +void CFSEmailUiDownloadManagerVisualiser::DownloadStatusChangedL( TInt aIndex ) + { + FUNC_LOG; + if ( iAppUi.CurrentActiveView() == this && + aIndex < iModel->GetModel().Count() && + !iAppUi.AppUiExitOngoing() ) + { + TRect screenRect; + AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EScreen, screenRect ); + + TRgb focusedColor = iAppUi.LayoutHandler()->ListFocusedStateTextSkinColor(); + TRgb normalItemColor = iAppUi.LayoutHandler()->ListNormalStateTextSkinColor(); + TRgb normalNodeColor = iAppUi.LayoutHandler()->ListNodeTextColor(); + + const RArray& modelData = iModel->GetModel(); + const TMessageData& message = modelData[ aIndex ]; + + // Insert the message node if it's not yet present + if ( message.treeId == KFsTreeNoneID ) + { + CFsTreePlainOneLineNodeData* separatorData = CFsTreePlainOneLineNodeData::NewL(); + CleanupStack::PushL( separatorData ); + CFsTreePlainOneLineNodeVisualizer* separatorVisualiser = + CFsTreePlainOneLineNodeVisualizer::NewL(*iDownloadManagerList->TreeControl()); + CleanupStack::PushL( separatorVisualiser ); + separatorData->SetDataL( *message.mailSubject ); + separatorVisualiser->SetExtendable(EFalse); + separatorVisualiser->SetFontHeight( iAppUi.LayoutHandler()->ListItemFontHeightInTwips() ); + separatorVisualiser->SetTextBold( ETrue ); + separatorVisualiser->SetFocusedStateTextColor( focusedColor ); + separatorVisualiser->SetNormalStateTextColor( normalNodeColor ); + separatorVisualiser->SetBackgroundColor( iAppUi.LayoutHandler()->ListNodeBackgroundColor() ); + + separatorData->SetIconExpanded( iAppUi.FsTextureManager()->TextureByIndex( EListTextureNodeExpanded ) ); + separatorData->SetIconCollapsed( iAppUi.FsTextureManager()->TextureByIndex( EListTextureNodeCollapsed ) ); + CleanupStack::Pop( separatorVisualiser ); + CleanupStack::Pop( separatorData ); + TFsTreeItemId parentNode = + iDownloadManagerList->InsertNodeL( *separatorData, *separatorVisualiser, KFsTreeRootID, aIndex ); + iModel->SetNodeIdL( aIndex, parentNode ); + } + + // Insert or update the attachment items + for ( TInt j = 0 ; j < message.mailAttachments.Count() ; j++ ) + { + HBufC* secondLine = CreateSecondLineTextLC( message.mailAttachments[j] ); + + //is the item already drawn + TFsTreeItemId itemId = message.mailAttachments[j].treeId; + if ( itemId != KFsTreeNoneID ) + { + // Item is already present. Update the existing item but only if the second line data + // is actually changed. + CFsTreePlainTwoLineItemData& itemData = + static_cast( iDownloadManagerList->ItemData( itemId ) ); + + if ( itemData.SecondaryData() != *secondLine ) + { + itemData.SetSecondaryDataL( *secondLine ); + iDownloadManagerTreeListVisualizer->UpdateItemL( itemId ); + + // Update the MSK label if the updated item happens to be the focused item + if ( itemId == iDownloadManagerList->FocusedItem() ) + { + SetMskL(); + } + } + } + else + { + //create and draw new item + CFsTreePlainTwoLineItemData* twoLineItemData = CFsTreePlainTwoLineItemData::NewL(); + CleanupStack::PushL( twoLineItemData ); + + twoLineItemData->SetDataL( message.mailAttachments[j].fileName ); + twoLineItemData->SetSecondaryDataL( *secondLine ); + + CAlfTexture& itemTexture = TFsEmailUiUtility::GetAttachmentIcon( message.mailAttachments[j].fileType, + *iAppUi.FsTextureManager() ); + twoLineItemData->SetIcon( itemTexture ); + + CFsTreePlainTwoLineItemVisualizer* twoLineItemVisualizer = + CFsTreePlainTwoLineItemVisualizer::NewL( *iDownloadManagerList->TreeControl() ); + CleanupStack::PushL( twoLineItemVisualizer ); + twoLineItemVisualizer->SetFlags( twoLineItemVisualizer->Flags() | KFsTreeListItemHasMenu ); + twoLineItemVisualizer->SetExtendable( ETrue ); + CAlfTextStyle* textStyle = iAppUi.LayoutHandler()->FSTextStyleFromIdL( EFSFontTypeSmall ); + twoLineItemVisualizer->SetTextStyleId( textStyle->Id() ); + // Set font height + twoLineItemVisualizer->SetFontHeight( iAppUi.LayoutHandler()->ListItemFontHeightInTwips() ); + // Set font bolding + twoLineItemVisualizer->SetTextBold( EFalse ); + // Set correct skin text colors for the list items + twoLineItemVisualizer->SetFocusedStateTextColor( focusedColor ); + twoLineItemVisualizer->SetNormalStateTextColor( normalItemColor ); + TFsTreeItemId treeItemId = + iDownloadManagerList->InsertItemL( *twoLineItemData, *twoLineItemVisualizer, message.treeId, j ); + CleanupStack::Pop( twoLineItemVisualizer ); // ownership transferred to TreeList + CleanupStack::Pop( twoLineItemData ); // ownership transferred to TreeList + iModel->SetItemIdL( aIndex, j, treeItemId ); + } + + CleanupStack::PopAndDestroy( secondLine ); + } + } + } + +// Touch +void CFSEmailUiDownloadManagerVisualiser::TreeListEventL( + const TFsTreeListEvent aEvent, const TFsTreeItemId aId ) +// + { + FUNC_LOG; + if ( aEvent == EFsTreeItemSelected ) + { + TRAPD( err, TryToOpenItemL( aId ) ); + if ( err != KErrNone ) + { + } + } + } + +void CFSEmailUiDownloadManagerVisualiser::LaunchActionMenuL() + { + FUNC_LOG; + + TAttachmentData* selectedItem = NULL; + + TRAPD( err, selectedItem = &iModel->GetItemL( iDownloadManagerList->FocusedItem() ) ); + + if ( !err ) + { + // Remove old items from action menu + CFSEmailUiActionMenu::RemoveAllL(); + + // Construct item list + RFsEActionMenuIdList itemList; + CleanupClosePushL( itemList ); + + if ( IsCommandAvailableOnItem( FsEActionAttachmentOpen, selectedItem ) ) + { + itemList.AppendL( FsEActionAttachmentOpen ); + } + + if ( IsCommandAvailableOnItem( FsEActionAttachmentDownload, selectedItem ) ) + { + itemList.AppendL( FsEActionAttachmentDownload ); + } + + if ( IsCommandAvailableOnItem( FsEActionAttachmentDownloadAll, selectedItem ) ) + { + itemList.AppendL( FsEActionAttachmentDownloadAll ); + } + + if ( IsCommandAvailableOnItem( FsEActionAttachmentCancelDownload, selectedItem ) ) + { + itemList.AppendL( FsEActionAttachmentCancelDownload ); + } + + if ( IsCommandAvailableOnItem( FsEActionAttachmentCancelAllDownloads, selectedItem ) ) + { + itemList.AppendL( FsEActionAttachmentCancelAllDownloads ); + } + + if ( IsCommandAvailableOnItem( FsEActionAttachmentSave, selectedItem ) ) + { + itemList.AppendL( FsEActionAttachmentSave ); + } + + if ( IsCommandAvailableOnItem( FsEActionAttachmentSaveAll, selectedItem ) ) + { + itemList.AppendL( FsEActionAttachmentSaveAll ); + } + + if ( IsCommandAvailableOnItem( FsEActionAttachmentClearFetchedContent, selectedItem ) ) + { + itemList.AppendL( FsEActionAttachmentClearFetchedContent ); + } + + if ( IsCommandAvailableOnItem( FsEActionAttachmentRemoveUnfetchedAttachment, selectedItem ) ) + { + itemList.AppendL( FsEActionAttachmentRemoveUnfetchedAttachment ); + } + + // Execute action list and handle the menu command + TActionMenuCustomItemId itemId = CFSEmailUiActionMenu::ExecuteL( itemList ); + + CleanupStack::PopAndDestroy( &itemList ); + + switch( itemId ) + { + case FsEActionAttachmentOpen: + HandleCommandL( EFsEmailUiCmdOpen ); + break; + case FsEActionAttachmentDownload: + HandleCommandL( EFsEmailUiCmdDownload ); + break; + case FsEActionAttachmentCancelDownload: + HandleCommandL( EFsEmailUiCmdCancelDownload ); + break; + case FsEActionAttachmentSave: + HandleCommandL( EFsEmailUiCmdSave ); + break; + case FsEActionAttachmentDownloadAll: + HandleCommandL( EFsEmailUiCmdDownloadAll ); + break; + case FsEActionAttachmentCancelAllDownloads: + HandleCommandL( EFsEmailUiCmdCancelAllDownloads ); + break; + case FsEActionAttachmentSaveAll: + HandleCommandL( EFsEmailUiCmdSaveAll ); + break; + case FsEActionAttachmentClearFetchedContent: + HandleCommandL( EFsEmailUiCmdClearFetchedAttachment ); + break; + case FsEActionAttachmentRemoveUnfetchedAttachment: + HandleCommandL( EFsEmailUiCmdRemoveAttachment ); + break; + default: + break; + } + } + } + +// --------------------------------------------------------------------------- +// If there is one or more expanded nodes, collapses all nodes. +// Otherwise expands all nodes. +// --------------------------------------------------------------------------- +// +void CFSEmailUiDownloadManagerVisualiser::ShortcutCollapseExpandAllToggleL() + { + FUNC_LOG; + TBool collapseAllNodes( EFalse ); + TInt count = iDownloadManagerList->CountChildren( KFsTreeRootID ); + for ( TInt i=0 ; iChild(KFsTreeRootID, i); + if ( iDownloadManagerList->IsNode( curId ) && + iDownloadManagerList->IsExpanded( curId ) ) + { + collapseAllNodes = ETrue; + break; + } + } + + if ( collapseAllNodes ) + { + iDownloadManagerTreeListVisualizer->CollapseAllL(); + } + else + { + TFsTreeItemId prevId = iDownloadManagerList->FocusedItem(); // the focus may fall out of the screen unless manually reset + iDownloadManagerTreeListVisualizer->ExpandAllL(); + iDownloadManagerTreeListVisualizer->SetFocusedItemL( prevId ); + } + } + +// --------------------------------------------------------------------------- +// Moves the focus to the topmost item +// --------------------------------------------------------------------------- +// +void CFSEmailUiDownloadManagerVisualiser::GoToTopL() + { + FUNC_LOG; + TInt topLevelCount = iDownloadManagerList->CountChildren( KFsTreeRootID ); + if ( topLevelCount > 1 ) + { + // the item #0 is the non-focusable header item + TFsTreeItemId topId = iDownloadManagerList->Child(KFsTreeRootID, 1); + iDownloadManagerTreeListVisualizer->SetFocusedItemL( topId ); + } + } + +// --------------------------------------------------------------------------- +// Moves the focus to the bottommost item +// --------------------------------------------------------------------------- +// +void CFSEmailUiDownloadManagerVisualiser::GoToBottomL() + { + FUNC_LOG; + TInt topLevelCount = iDownloadManagerList->CountChildren( KFsTreeRootID ); + if ( topLevelCount ) + { + TFsTreeItemId bottomId = iDownloadManagerList->Child(KFsTreeRootID, topLevelCount-1); + if ( iDownloadManagerList->IsNode(bottomId) ) + { + TInt childCount = iDownloadManagerList->CountChildren(bottomId); + if ( childCount && iDownloadManagerList->IsExpanded(bottomId) ) + { + // Focus the last child of the bottom node if the node is expanded. + bottomId = iDownloadManagerList->Child( bottomId, childCount-1 ); + } + } + iDownloadManagerTreeListVisualizer->SetFocusedItemL( bottomId ); + } + } + +