--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/emailuis/emailui/src/FreestyleEmailUiDownloadManagerVisualiser.cpp Wed Sep 01 12:28:57 2010 +0100
@@ -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 <freestyleemailui.mbg>
+#include <AknUtils.h>
+#include <gulicon.h>
+#include <StringLoader.h>
+#include <FreestyleEmailUi.rsg>
+// <cmail> SF
+#include <alf/alfframebrush.h>
+#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"
+// </cmail>
+#include <aknlistquerydialog.h>
+#include <CAknFileSelectionDialog.h>
+#include <CAknMemorySelectionDialog.h>
+#include <pathinfo.h>
+#include <aknnotewrappers.h>
+// <cmail> SF
+#include <alf/alfdecklayout.h>
+#include <alf/alfevent.h>
+#include <alf/alfcontrolgroup.h>
+#include <csxhelp/cmail.hlp.hrh>
+#include "mfsmailbrandmanager.h"
+#include "cfsmailclient.h"
+//</cmail>
+#include <featmgr.h>
+//</cmail>
+
+// 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 );
+
+ //<cmail> 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() );
+ //</cmail>
+
+ iModel = CFSEmailUiDownloadManagerModel::NewL( iAppUi, *this );
+ //<cmail> S60 skin support
+ //iDownloadManagerTreeListVisualizer->SetBackgroundTextureL( iAppUi.FsTextureManager()->TextureByIndex( EBackgroundTextureMailList ) );
+ //</cmail>
+ 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
+// ---------------------------------------------------------------------------
+//
+// <cmail> Toolbar
+/*void CFSEmailUiDownloadManagerVisualiser::DoActivateL(
+ const TVwsViewId& aPrevViewId,
+ TUid aCustomMessageId,
+ const TDesC8& aCustomMessage )*/
+void CFSEmailUiDownloadManagerVisualiser::ChildDoActivateL(
+ const TVwsViewId& /*aPrevViewId*/,
+ TUid /*aCustomMessageId*/,
+ const TDesC8& /*aCustomMessage*/ )
+// <cmail> 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<TMessageData>& 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 ; i<modelData.Count() ; i++ )
+ {
+ CFsTreePlainOneLineNodeData* separatorData = CFsTreePlainOneLineNodeData::NewL();
+ CleanupStack::PushL( separatorData );
+ CFsTreePlainOneLineNodeVisualizer* separatorVisualiser =
+ CFsTreePlainOneLineNodeVisualizer::NewL( *iDownloadManagerList->TreeControl() );
+ 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; j<modelData[i].mailAttachments.Count(); j++)
+ {
+ twoLineItemData = CFsTreePlainTwoLineItemData::NewL();
+ CleanupStack::PushL( twoLineItemData );
+ twoLineItemData->SetDataL( 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<CAlfVisual>& 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<TMsgDetailsActivationData> 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<TMsgViewerActivationData> 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<TMessageData>& modelData = iModel->GetModel();
+ for ( TInt i=0 ; i<modelData.Count() ; ++i )
+ {
+ const TMessageData& message = modelData[ i ];
+
+ MFsTreeItemVisualizer& messageVis = iDownloadManagerList->ItemVisualizer( message.treeId );
+ messageVis.SetFontHeight( fontHeight );
+
+ for ( TInt j=0 ; j<message.mailAttachments.Count() ; j++ )
+ {
+ const TAttachmentData& attachment = message.mailAttachments[j];
+
+ MFsTreeItemVisualizer& attachmentVis = iDownloadManagerList->ItemVisualizer( 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<TMessageData>& modelData = iModel->GetModel();
+ for ( TInt i=0 ; i<modelData.Count() ; ++i )
+ {
+ const TMessageData& message = modelData[ i ];
+
+ MFsTreeItemVisualizer& messageVis = iDownloadManagerList->ItemVisualizer( message.treeId );
+ messageVis.SetNormalStateTextColor( nodeTextColor );
+ messageVis.SetFocusedStateTextColor( focusedTextColor );
+ messageVis.SetBackgroundColor( nodeBgColor );
+
+ for ( TInt j=0 ; j<message.mailAttachments.Count() ; j++ )
+ {
+ const TAttachmentData& attachment = message.mailAttachments[j];
+
+ MFsTreeItemVisualizer& attachmentVis = iDownloadManagerList->ItemVisualizer( 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<TMessageData>& model = iModel->GetModel();
+
+ switch ( aCommandId )
+ {
+ case EFsEmailUiCmdOpen:
+ case FsEActionAttachmentOpen:
+ // <cmail> Disabled until plugins support this.
+ //case EFsEmailUiCmdClearFetchedAttachment:
+ //case FsEActionAttachmentClearFetchedContent:
+ // </cmail>
+ {
+ if ( aFocusedItem && aFocusedItem->downloadProgress == KComplete )
+ {
+ available = ETrue;
+ }
+ }
+ break;
+
+ // <cmail>
+ case FsEActionAttachmentClearFetchedContent:
+ case EFsEmailUiCmdClearFetchedAttachment:
+ available = EFalse;
+ break;
+ // </cmail>
+
+ 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<model.Count(); i++)
+ {
+ const RArray<TAttachmentData>& attachments = model[i].mailAttachments;
+ for ( TInt j=0 ; j<attachments.Count() ; ++j )
+ {
+ if ( iAppUi.DownloadInfoMediator() &&
+ iAppUi.DownloadInfoMediator()->IsDownloading( 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<model.Count(); i++)
+ {
+ const RArray<TAttachmentData>& attachments = model[i].mailAttachments;
+ for ( TInt j=0 ; j<attachments.Count() ; ++j )
+ {
+ if ( iAppUi.DownloadInfoMediator() &&
+ iAppUi.DownloadInfoMediator()->IsDownloading( 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<model.Count(); i++)
+ {
+ const RArray<TAttachmentData>& attachments = model[i].mailAttachments;
+ for ( TInt j=0 ; j<attachments.Count() ; ++j )
+ {
+ if ( IsCommandAvailableOnItem( EFsEmailUiCmdDownload, &attachments[j] ) )
+ {
+ downloadableFiles++;
+ }
+ }
+ }
+ if ( downloadableFiles > 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<CFsTreePlainTwoLineItemData&>( 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<TMessageData>& 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<CFsTreePlainTwoLineItemData&>( 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 );
+ }
+ }
+ }
+
+// <cmail> Touch
+void CFSEmailUiDownloadManagerVisualiser::TreeListEventL(
+ const TFsTreeListEvent aEvent, const TFsTreeItemId aId )
+// </cmail>
+ {
+ 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 ; i<count ; i++ )
+ {
+ TFsTreeItemId curId = iDownloadManagerList->Child(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 );
+ }
+ }
+
+