--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/emailuis/emailui/src/FreestyleEmailUiAttachmentsListVisualiser.cpp Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,1590 @@
+/*
+* 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 attachment list view
+*
+*/
+
+
+
+// SYSTEM INCLUDES
+#include "emailtrace.h"
+#include "CFSMailBox.h"
+#include <e32base.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 "fstreeplaintwolineitemdata.h"
+#include "fstreeplaintwolineitemvisualizer.h"
+#include "fstreeplainonelinenodedata.h"
+#include "fstreeplainonelinenodevisualizer.h"
+//</cmail>
+#include <aknlistquerydialog.h>
+#include <StringLoader.h>
+#include <aknnotewrappers.h>
+// <cmail> SF
+#include <alf/alfanchorlayout.h>
+#include <alf/alfdecklayout.h>
+#include <alf/alfcontrolgroup.h>
+#include <alf/alfevent.h>
+#include <csxhelp/cmail.hlp.hrh>
+// </cmail>
+#include <featmgr.h>
+//</cmail>
+
+// <cmail> Use layout data instead of hard-coded values
+#include <aknlayoutscalable_apps.cdl.h>
+#include <layoutmetadata.cdl.h>
+// </cmail>
+
+// INTERNAL INCLUDES
+#include "FreestyleEmailUiAttachmentsListVisualiser.h"
+#include "FreestyleEmailUiLayoutHandler.h"
+#include "FreestyleEmailUiAttachmentsListModel.h"
+#include "FreestyleEmailUiAttachmentsListControl.h"
+#include "FreestyleEmailUiFileSystemInfo.h"
+#include "FreestyleEmailUiScrollbarClet.h"
+#include "FreestyleEmailUiAppui.h"
+#include "FreestyleEmailUi.hrh"
+#include "FreestyleEmailUiTextureManager.h"
+#include "FreestyleEmailUiShortcutBinding.h"
+#include "FreestyleEmailUiStatusIndicator.h"
+#include "FreestyleEmailUiUtilities.h"
+#include "FreestyleEmailUiLiterals.h"
+
+// POP3 has a specific UI for the attachment list: there is no download-option
+// available. This value should be the UID of the POP3 ECOM plugin.
+const TUint KFsPop3PluginId = 0x2000e53e;
+
+
+// ---------------------------------------------------------------------------
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CFSEmailUiAttachmentsListVisualiser* CFSEmailUiAttachmentsListVisualiser::NewL(
+ CAlfEnv& aEnv, CFreestyleEmailUiAppUi* aAppUi, CAlfControlGroup& aControlGroup )
+ {
+ FUNC_LOG;
+ CFSEmailUiAttachmentsListVisualiser* self =
+ CFSEmailUiAttachmentsListVisualiser::NewLC( aEnv, aAppUi, aControlGroup );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+CFSEmailUiAttachmentsListVisualiser* CFSEmailUiAttachmentsListVisualiser::NewLC(
+ CAlfEnv& aEnv, CFreestyleEmailUiAppUi* aAppUi, CAlfControlGroup& aControlGroup )
+ {
+ FUNC_LOG;
+ __ASSERT_DEBUG( aAppUi, User::Invariant() );
+ CFSEmailUiAttachmentsListVisualiser* self =
+ new (ELeave) CFSEmailUiAttachmentsListVisualiser( aEnv, *aAppUi, aControlGroup );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// Second phase constructor.
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiAttachmentsListVisualiser::ConstructL()
+ {
+ FUNC_LOG;
+ BaseConstructL( R_FSEMAILUI_ATTACHMENTS_VIEW );
+ iFirstStartCompleted = EFalse;
+ }
+
+// ---------------------------------------------------------------------------
+// CFSEmailUiAttachmentsListVisualiser::UpdateSize
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiAttachmentsListVisualiser::UpdateSize()
+ {
+ FUNC_LOG;
+ TRect screenRect;
+ AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, screenRect );
+ screenRect.Move(-screenRect.iTl.iX, -screenRect.iTl.iY);
+ iAnchorLayout->SetRect( screenRect );
+ // Set anchors so that list leaves space for control bar
+ iAnchorLayout->SetAnchor(EAlfAnchorTopLeft, 0,
+ EAlfAnchorOriginLeft, EAlfAnchorOriginTop,
+ EAlfAnchorMetricAbsolute, EAlfAnchorMetricAbsolute,
+ TAlfTimedPoint(0, 0 ));
+ iAnchorLayout->SetAnchor(EAlfAnchorBottomRight, 0,
+ EAlfAnchorOriginLeft, EAlfAnchorOriginTop,
+ EAlfAnchorMetricAbsolute, EAlfAnchorMetricAbsolute,
+ TAlfTimedPoint(screenRect.iBr.iX, screenRect.iBr.iY ));
+ iAnchorLayout->UpdateChildrenLayout();
+ }
+
+// ---------------------------------------------------------------------------
+// CFSEmailUiAttachmentsListVisualiser::DoFirstStartL
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiAttachmentsListVisualiser::DoFirstStartL()
+ {
+ FUNC_LOG;
+ // Create list screen (list) control and screen anchor layout
+ iScreenControl = CFreestyleEmailUiAttachmentsListControl::NewL( iEnv, this );
+
+ // Anchor layout
+ iAnchorLayout = CAlfAnchorLayout::AddNewL( *iScreenControl );
+
+ // Create attachments list layout and set it to fill the main pane
+ iListLayout = CAlfDeckLayout::AddNewL( *iScreenControl, iAnchorLayout );
+
+ UpdateSize();
+
+ // Create attachments list tree list component
+ iAttachmentsTreeListVisualizer = CFsTreeVisualizerBase::NewL(iScreenControl, *iListLayout);
+ iAttachmentsTreeListVisualizer->SetItemExpansionDelay( iAppUi.LayoutHandler()->ListItemExpansionDelay() );
+
+ iAttachmentsList = CFsTreeList::NewL(*iAttachmentsTreeListVisualizer, iEnv);
+ iAttachmentsList->SetScrollbarVisibilityL( EFsScrollbarAuto );
+ iAttachmentsList->SetMarkTypeL( CFsTreeList::EFsTreeListMultiMarkable );
+ iAttachmentsList->SetIndentationL( 0 );
+ iAttachmentsList->AddObserverL( *this );
+
+ iAppUi.LayoutHandler()->SetListMarqueeBehaviour( iAttachmentsList );
+
+ //<cmail> Compared to S60 3.2.3 in S60 5.0 Alf offers the key events in
+ // opposite order.
+ ControlGroup().AppendL( iScreenControl );
+ ControlGroup().AppendL( iAttachmentsList->TreeControl() );
+ //</cmail>
+
+ // create model
+ iModel = CFSEmailUiAttachmentsListModel::NewL( iAppUi, *this );
+
+ //<cmail> S60 skin support
+ //iAttachmentsTreeListVisualizer->SetBackgroundTextureL( iAppUi.FsTextureManager()->TextureByIndex( EBackgroundTextureMailList ) );
+ //</cmail>
+ iAttachmentsTreeListVisualizer->SetMenuIcon( iAppUi.FsTextureManager()->TextureByIndex( EListControlMenuIcon ) );
+ iAttachmentsTreeListVisualizer->SetItemsAlwaysExtendedL( ETrue );
+
+ // Set page up and page down keys
+ iAttachmentsTreeListVisualizer->AddCustomPageUpKey( EStdKeyPageUp );
+ iAttachmentsTreeListVisualizer->AddCustomPageDownKey( EStdKeyPageDown );
+
+ CAlfBrush* selectorBrush = iAppUi.FsTextureManager()->ListSelectorBrushL();
+ iAttachmentsTreeListVisualizer->SetSelectorPropertiesL( selectorBrush, 1.0, CFsTreeVisualizerBase::EFsSelectorMoveSmoothly );
+
+ iFirstStartCompleted = ETrue;
+ }
+
+// ---------------------------------------------------------------------------
+// C++ constructor.
+// ---------------------------------------------------------------------------
+//
+CFSEmailUiAttachmentsListVisualiser::CFSEmailUiAttachmentsListVisualiser(
+ CAlfEnv& aEnv, CFreestyleEmailUiAppUi& aAppUi, CAlfControlGroup& aControlGroup )
+ : CFsEmailUiViewBase( aControlGroup, aAppUi ),
+ iEnv( aEnv )
+ {
+ FUNC_LOG;
+ }
+
+// ---------------------------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+CFSEmailUiAttachmentsListVisualiser::~CFSEmailUiAttachmentsListVisualiser()
+ {
+ FUNC_LOG;
+ delete iModel;
+ if ( iAttachmentsList )
+ {
+ iAttachmentsList->RemoveObserver( *this );
+ }
+ //<cmail> removed as not used anywhere.
+
+ //</cmail>
+ delete iAttachmentsList;
+ }
+
+
+TUid CFSEmailUiAttachmentsListVisualiser::Id() const
+ {
+ FUNC_LOG;
+ return AttachmentMngrViewId;
+ }
+
+
+// <cmail> Toolbar
+/*void CFSEmailUiAttachmentsListVisualiser::DoActivateL(const TVwsViewId& aPrevViewId,
+ TUid aCustomMessageId,
+ const TDesC8& aCustomMessage)*/
+void CFSEmailUiAttachmentsListVisualiser::ChildDoActivateL(const TVwsViewId& /*aPrevViewId*/,
+ TUid /*aCustomMessageId*/,
+ const TDesC8& aCustomMessage)
+// </cmail> Toolbar
+ {
+ FUNC_LOG;
+
+ if ( !iFirstStartCompleted )
+ {
+ DoFirstStartL();
+ }
+
+ iAttachmentsList->HideListL();
+
+ // Refresh the view with the given part data.
+ // If no part data is passed, the view is refreshed with data
+ // from previously viewed message.
+ TAttachmentListActivationData activationData;
+ if ( aCustomMessage.Length() )
+ {
+ TPckgC<TAttachmentListActivationData> pkgPtr( activationData );
+ pkgPtr.Set( aCustomMessage );
+ activationData = pkgPtr();
+ iEmbeddedMsgMode = activationData.iEmbeddedMsgMode;
+ }
+ TPartData part( activationData.iMailBoxId, activationData.iFolderId, activationData.iMessageId );
+ RefreshL( part );
+
+ iAttachmentsList->ShowListL();
+
+ SetupTitlePaneTextL();
+
+ iAttachmentsList->SetFocusedL(ETrue);
+ }
+
+// <cmail> Toolbar
+// ---------------------------------------------------------------------------
+// OfferToolbarEventL
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiAttachmentsListVisualiser::OfferToolbarEventL( TInt /*aCommand*/ )
+ {
+
+ }
+
+// ---------------------------------------------------------------------------
+// ToolbarResourceId
+// ---------------------------------------------------------------------------
+//
+TInt CFSEmailUiAttachmentsListVisualiser::ToolbarResourceId() const
+ {
+ return R_FREESTYLE_EMAIL_UI_TOOLBAR_ATTACHMENT_LIST;
+ }
+
+// </cmail>
+
+void CFSEmailUiAttachmentsListVisualiser::ChildDoDeactivate()
+ {
+ FUNC_LOG;
+ if ( !iAppUi.AppUiExitOngoing() )
+ {
+ TRAP_IGNORE(iAttachmentsList->SetFocusedL(EFalse));
+
+ iAttachmentsTreeListVisualizer->NotifyControlVisibilityChange( EFalse );
+ }
+ }
+
+CFSEmailUiAttachmentsListModel* CFSEmailUiAttachmentsListVisualiser::Model()
+ {
+ FUNC_LOG;
+ return iModel;
+ }
+
+void CFSEmailUiAttachmentsListVisualiser::DynInitMenuPaneL(TInt aResourceId, CEikMenuPane* aMenuPane)
+ {
+ FUNC_LOG;
+
+ TAttachmentData* selectedItem = iModel->GetItem( iAttachmentsList->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, ETrue ); // available only in Download Manager
+ }
+ else if ( aResourceId == R_FSEMAILUI_ATTACHMENTS_MENUPANE )
+ {
+ if ( FeatureManager::FeatureSupported( KFeatureIdFfCmailIntegration ) )
+ {
+ // remove help support in pf5250
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdHelp, ETrue);
+ }
+
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdMailActions,
+ !IsCommandAvailableOnItem(EFsEmailUiCmdMailActions, selectedItem) );
+ }
+
+ // Add shortcut hints
+ iAppUi.ShortcutBinding().AppendShortcutHintsL( *aMenuPane,
+ CFSEmailUiShortcutBinding::EContextAttachmentList );
+ }
+
+void CFSEmailUiAttachmentsListVisualiser::DownloadStatusChangedL( TInt aIndex )
+ {
+ FUNC_LOG;
+ if ( iFirstStartCompleted ) //Safety
+ {
+ const RArray<TAttachmentData>& model = iModel->GetModel();
+
+ TBool refreshNeeded = ( aIndex == KErrNotFound );
+
+ if ( iAppUi.CurrentActiveView() == this &&
+ ( aIndex < model.Count() || refreshNeeded ) &&
+ !iAppUi.AppUiExitOngoing() )
+ {
+ if ( refreshNeeded )
+ {
+ // We end up here when the model has been changed during the
+ // download operation. This happens with POP redownload as POP
+ // creates new entries (message parts) after the operation.
+ RefreshL( TPartData() );
+
+ GoToTopL();
+ }
+ else
+ {
+ const TAttachmentData& attachment = model[aIndex];
+
+ CFsTreePlainTwoLineItemData& itemData =
+ static_cast<CFsTreePlainTwoLineItemData&>(
+ iAttachmentsList->ItemData( attachment.treeId ) );
+
+ itemData.SetDataL( attachment.fileName );
+
+ HBufC* secondLine = CreateSecondLineTextLC( attachment );
+
+ // Move the attachment under the "Downloaded" node if the
+ // download was just completed
+ if ( attachment.downloadProgress == KComplete &&
+ iAttachmentsList->Parent( attachment.treeId ) ==
+ iNotDownloadedNode )
+ {
+ itemData.SetSecondaryDataL( *secondLine );
+ MoveItemToNodeL( attachment.treeId, iDownloadedNode );
+ }
+ // Otherwise, just order the list item to be updated in its place
+ // but only if data has actually changed
+ else if ( itemData.SecondaryData() != *secondLine )
+ {
+ itemData.SetSecondaryDataL( *secondLine );
+ iAttachmentsTreeListVisualizer->UpdateItemL( attachment.treeId );
+ }
+ else
+ {
+ // no updating is actually needed => do nothing
+ }
+ CleanupStack::PopAndDestroy( secondLine );
+
+ // Update the MSK label as the correct function for the
+ // focused item may have changed.
+ SetMskL();
+ }
+ }
+ }
+ }
+
+void CFSEmailUiAttachmentsListVisualiser::RefreshL( TPartData aPart )
+ {
+ FUNC_LOG;
+ if ( iFirstStartCompleted ) //Safety
+ {
+ // Update model. Use previous message if no new message has been provided.
+ if ( aPart.iMessageId.IsNullId() )
+ {
+ aPart = iModel->GetMessageL( KFsTreeNoneID );
+ }
+ iModel->UpdateListL( aPart );
+
+ UpdateSize();
+
+ CFsTreePlainTwoLineItemData* twoLineItemData;
+ CFsTreePlainTwoLineItemVisualizer* twoLineItemVisualizer;
+
+ iAttachmentsList->RemoveAllL();
+ CreateHeadersAndSeparatorsL();
+ const RArray<TAttachmentData>& model = iModel->GetModel();
+
+ TInt modelCount = model.Count();
+ for ( TInt i = 0; i < modelCount; i++ )
+ {
+ const TAttachmentData& attachment = model[i];
+
+ twoLineItemData = CFsTreePlainTwoLineItemData::NewL();
+ CleanupStack::PushL( twoLineItemData );
+ twoLineItemData->SetDataL( attachment.fileName );
+
+ HBufC* secondLine = CreateSecondLineTextLC( attachment );
+ twoLineItemData->SetSecondaryDataL( *secondLine );
+ CleanupStack::PopAndDestroy( secondLine );
+
+ CAlfTexture& itemTexture = TFsEmailUiUtility::GetAttachmentIcon(
+ attachment.fileType, *iAppUi.FsTextureManager() );
+ twoLineItemData->SetIcon( itemTexture );
+
+ twoLineItemVisualizer = CFsTreePlainTwoLineItemVisualizer::NewL(
+ *iAttachmentsList->TreeControl() );
+ CleanupStack::PushL( twoLineItemVisualizer );
+ twoLineItemVisualizer->SetFlags( twoLineItemVisualizer->Flags()
+ | KFsTreeListItemHasMenu );
+ twoLineItemVisualizer->SetExtendable( ETrue );
+ // <cmail> Platform layout changes
+ /*
+ CAlfTextStyle* textStyle =
+ iAppUi.LayoutHandler()->FSTextStyleFromIdL( EFSFontTypeSmall );
+ */
+ TInt variety( Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0 );
+ CAlfTextStyle& textStyle =
+ iAppUi.LayoutHandler()->FSTextStyleFromLayoutL(
+ AknLayoutScalable_Apps::list_single_dyc_row_text_pane_t1(variety));
+ twoLineItemVisualizer->SetTextStyleId( textStyle.Id() );
+ // Set font height
+ /*
+ twoLineItemVisualizer->SetFontHeight(
+ iAppUi.LayoutHandler()->ListItemFontHeightInTwips() );
+ */
+ twoLineItemVisualizer->SetFontHeight( textStyle.TextSizeInTwips() );
+ // </cmail> Platform layout changes
+
+ // Set font bolding
+ twoLineItemVisualizer->SetTextBold( EFalse );
+ // Set correct skin text colors for the list items
+ TRgb focusedColor =
+ iAppUi.LayoutHandler()->ListFocusedStateTextSkinColor();
+ TRgb normalColor =
+ iAppUi.LayoutHandler()->ListNormalStateTextSkinColor();
+ twoLineItemVisualizer->SetFocusedStateTextColor( focusedColor );
+ twoLineItemVisualizer->SetNormalStateTextColor( normalColor );
+
+ TFsTreeItemId treeItemId;
+ CleanupStack::Pop( twoLineItemVisualizer );
+ CleanupStack::Pop( twoLineItemData );
+ if ( attachment.downloadProgress == KComplete )
+ {
+ treeItemId = iAttachmentsList->InsertItemL(
+ *twoLineItemData,
+ *twoLineItemVisualizer,
+ iDownloadedNode );
+ }
+ else
+ {
+ treeItemId = iAttachmentsList->InsertItemL(
+ *twoLineItemData,
+ *twoLineItemVisualizer,
+ iNotDownloadedNode );
+ }
+ iModel->SetNodeIdL( i, treeItemId );
+ }
+
+ if ( iAttachmentsList->IsEmpty( iDownloadedNode ) )
+ {
+ iAttachmentsTreeListVisualizer->HideItemL( iDownloadedNode );
+ }
+ if ( iAttachmentsList->IsEmpty( iNotDownloadedNode ) )
+ {
+ iAttachmentsTreeListVisualizer->HideItemL( iNotDownloadedNode );
+ }
+ }
+ }
+
+void CFSEmailUiAttachmentsListVisualiser::ReScaleUiL()
+ {
+ FUNC_LOG;
+ UpdateSize();
+ }
+
+void CFSEmailUiAttachmentsListVisualiser::ResetColorsL()
+ {
+ FUNC_LOG;
+ if ( iFirstStartCompleted )
+ {
+ TRgb normalTextColor = iAppUi.LayoutHandler()->ListNormalStateTextSkinColor();
+ TRgb focusedTextColor = iAppUi.LayoutHandler()->ListFocusedStateTextSkinColor();
+ TRgb nodeTextColor = iAppUi.LayoutHandler()->ListNodeTextColor();
+
+ // Header item
+ TFsTreeItemId headerId = iAttachmentsList->Child( KFsTreeRootID, 0 );
+ MFsTreeItemVisualizer& headerVis = iAttachmentsList->ItemVisualizer( headerId );
+ headerVis.SetNormalStateTextColor( normalTextColor );
+ headerVis.SetFocusedStateTextColor( focusedTextColor );
+
+ // Dividers
+ iDownloadedVisualiser->SetNormalStateTextColor( nodeTextColor );
+ iDownloadedVisualiser->SetFocusedStateTextColor( focusedTextColor );
+
+ iNotDownloadedVisualiser->SetNormalStateTextColor( nodeTextColor );
+ iNotDownloadedVisualiser->SetFocusedStateTextColor( focusedTextColor );
+
+ // Attachment items
+ const RArray<TAttachmentData>& model = iModel->GetModel();
+ for ( TInt i=0; i<model.Count(); i++ )
+ {
+ MFsTreeItemVisualizer& attachmentVis = iAttachmentsList->ItemVisualizer( model[i].treeId );
+ attachmentVis.SetNormalStateTextColor( normalTextColor );
+ attachmentVis.SetFocusedStateTextColor( focusedTextColor );
+ }
+ }
+ }
+
+void CFSEmailUiAttachmentsListVisualiser::HandleDynamicVariantSwitchL( CFsEmailUiViewBase::TDynamicSwitchType aType )
+ {
+ FUNC_LOG;
+ if ( iFirstStartCompleted )
+ {
+ iAttachmentsList->HideListL();
+ if ( aType == CFsEmailUiViewBase::EScreenLayoutChanged )
+ {
+ ReScaleUiL();
+ iAttachmentsList->ShowListL();
+ }
+ else if ( aType == CFsEmailUiViewBase::ESkinChanged )
+ {
+ ResetColorsL();
+ iAttachmentsList->ShowListL();
+ }
+ }
+ }
+
+void CFSEmailUiAttachmentsListVisualiser::HandleDynamicVariantSwitchOnBackgroundL( CFsEmailUiViewBase::TDynamicSwitchType aType )
+ {
+ FUNC_LOG;
+ if ( iFirstStartCompleted && aType == CFsEmailUiViewBase::ESkinChanged )
+ {
+ ResetColorsL();
+ }
+ }
+
+void CFSEmailUiAttachmentsListVisualiser::GetParentLayoutsL( RPointerArray<CAlfVisual>& aLayoutArray ) const
+ {
+ FUNC_LOG;
+ aLayoutArray.AppendL( iListLayout );
+ }
+
+void CFSEmailUiAttachmentsListVisualiser::HandleCommandL( TInt aCommand )
+ {
+ FUNC_LOG;
+
+ TFsTreeItemId focusedId = iAttachmentsList->FocusedItem();
+
+ switch(aCommand)
+ {
+ case EFsEmailUiCmdEmpty: // this is used when focused item is being downloaded
+ case EFsEmailUiCmdOpen:
+ case EAknSoftkeyOpen:
+ {
+ TryToOpenItemL( focusedId );
+ }
+ break;
+ case EFsEmailUiCmdDownload:
+ {
+ iModel->StartDownloadL( focusedId );
+ }
+ 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;
+ if ( TFsEmailUiUtility::ShowSaveFolderDialogL( fileName ) )
+ {
+ TInt savedCount( 0 );
+ iModel->SaveAttachmentL( focusedId, fileName, savedCount );
+ if ( savedCount )
+ {
+ TFsEmailUiUtility::ShowFilesSavedToFolderNoteL( savedCount );
+ }
+ }
+ }
+ break;
+ case EFsEmailUiCmdSaveAll:
+ {
+ TFileName fileName;
+ if ( TFsEmailUiUtility::ShowSaveFolderDialogL( fileName ) )
+ {
+ iModel->SaveAllAttachmentsL( fileName );
+ }
+ }
+ break;
+ case EFsEmailUiCmdDownloadAll:
+ {
+ iModel->DownloadAllAttachmentsL();
+ }
+ break;
+ case EFsEmailUiCmdClearFetchedAttachment:
+ case EFsEmailUiCmdActionsDelete: // from shortcut key
+ {
+ RemoveAttachmentContentL( focusedId );
+ }
+ break;
+ case EFsEmailUiCmdExit:
+ {
+ iAppUi.Exit();
+ }
+ break;
+ case EAknSoftkeyBack:
+ {
+ if ( !iAppUi.ViewSwitchingOngoing() )
+ {
+ iAppUi.ReturnToPreviousViewL();
+ }
+ }
+ break;
+ case EFsEmailUiCmdCollapse:
+ {
+ iAttachmentsList->CollapseNodeL( focusedId );
+ ChangeMskCommandL( R_FSE_QTN_MSK_EXPAND );
+ }
+ break;
+
+ case EFsEmailUiCmdExpand:
+ {
+ iAttachmentsList->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 CFSEmailUiAttachmentsListVisualiser::SetViewSoftkeysL( TInt aResourceId )
+ {
+ FUNC_LOG;
+ Cba()->SetCommandSetL( aResourceId );
+ Cba()->DrawDeferred();
+ }
+
+void CFSEmailUiAttachmentsListVisualiser::SetMskL()
+ {
+ FUNC_LOG;
+ TFsTreeItemId curId = iAttachmentsList->FocusedItem();
+
+ // We end up here when the model has been changed during the
+ // download operation. This happens with POP redownload as POP
+ // creates new entries.
+ if ( iAttachmentsList->IsNode( curId ) )
+ {
+ if ( iAttachmentsList->IsExpanded( curId ) )
+ {
+ ChangeMskCommandL( R_FSE_QTN_MSK_COLLAPSE );
+ }
+ else
+ {
+ ChangeMskCommandL( R_FSE_QTN_MSK_EXPAND );
+ }
+ }
+ else
+ {
+ TAttachmentData* selectedItem =
+ iModel->GetItem( iAttachmentsList->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 );
+ }
+ }
+ }
+TBool CFSEmailUiAttachmentsListVisualiser::OfferEventL(const TAlfEvent& aEvent)
+ {
+ FUNC_LOG;
+ TBool result( EFalse );
+ SetMskL();
+ // Handle only key events, no key down or key up events.
+ 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::EContextAttachmentList );
+ if ( shortcutCommand != KErrNotFound )
+ {
+ HandleCommandL( shortcutCommand );
+ result = ETrue;
+ }
+ }
+ }
+ else if (aEvent.IsPointerEvent())
+ {
+ result = iAttachmentsList->TreeControl()->OfferEventL(aEvent);
+ }
+ return result;
+ }
+
+CAlfControl* CFSEmailUiAttachmentsListVisualiser::ViewerControl()
+ {
+ FUNC_LOG;
+ return iScreenControl;
+ }
+
+void CFSEmailUiAttachmentsListVisualiser::CreateHeadersAndSeparatorsL()
+ {
+ FUNC_LOG;
+ TRect screenRect;
+ AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EScreen, screenRect );
+ // <cmail> Removed attachments row from attachemnts view. New UI
+ // requirement. Some other lines of code also removed from this function
+ // because of the modification.
+
+ //</cmail>
+ //<cmail> Platform layout changes
+ TInt variety( Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0 );
+ CAlfTextStyle& textStyle =
+ iAppUi.LayoutHandler()->FSTextStyleFromLayoutL(
+ AknLayoutScalable_Apps::list_single_dyc_row_text_pane_t1(variety));
+
+ // </cmail> Platform layout changes
+
+ // Set correct skin text colors for the list items
+ TRgb focusedColor = iAppUi.LayoutHandler()->ListFocusedStateTextSkinColor();
+ TRgb normalColor = iAppUi.LayoutHandler()->ListNormalStateTextSkinColor();
+ TRgb normalNodeColor = iAppUi.LayoutHandler()->ListNodeTextColor();
+
+ // <cmail>
+
+ // </cmail>
+
+ // <cmail>
+
+ // </cmail>
+
+ // <cmail> Platform layout changes
+
+ // </cmail> Platform layout changes
+
+
+ CFsTreePlainOneLineNodeData* separatorData = CFsTreePlainOneLineNodeData::NewL();
+ CleanupStack::PushL( separatorData );
+ CFsTreePlainOneLineNodeVisualizer* separatorVisualiser = CFsTreePlainOneLineNodeVisualizer::NewL(*iAttachmentsList->TreeControl());
+ CleanupStack::PushL( separatorVisualiser );
+
+ HBufC* resourceString = StringLoader::LoadLC( R_FSE_VIEWER_ATTACHMENTS_LIST_DOWNLOADED );
+ separatorData->SetDataL( *resourceString );
+ CleanupStack::PopAndDestroy( resourceString );
+ separatorVisualiser->SetSize(TSize(screenRect.Width(), iAppUi.LayoutHandler()->OneLineListNodeHeight()));
+ separatorVisualiser->SetExtendable(EFalse);
+ // Set font height
+ // <cmail> Platform layout changes
+ //separatorVisualiser->SetFontHeight( iAppUi.LayoutHandler()->ListItemFontHeightInTwips() );
+ separatorVisualiser->SetFontHeight( textStyle.TextSizeInTwips() );
+ // </cmail> Platform layout changes
+ // Set font bolding
+ separatorVisualiser->SetTextBold( ETrue );
+ separatorData->SetIconExpanded( iAppUi.FsTextureManager()->TextureByIndex( EListTextureNodeExpanded ) );
+ separatorData->SetIconCollapsed( iAppUi.FsTextureManager()->TextureByIndex( EListTextureNodeCollapsed ) );
+
+ // <cmail> Platform layout changes
+ // textStyle = iAppUi.LayoutHandler()->FSTextStyleFromIdL( EFSFontTypeSmall );
+ separatorVisualiser->SetTextStyleId( textStyle.Id() );
+ // </cmail> Platform layout changes
+
+ // Set correct skin text colors for the list items
+ separatorVisualiser->SetFocusedStateTextColor( focusedColor );
+ separatorVisualiser->SetNormalStateTextColor( normalNodeColor );
+ // <cmail>
+ //separatorVisualiser->SetBackgroundColor( iAppUi.LayoutHandler()->ListNodeBackgroundColor() );
+ // </cmail>
+ // Gradient background for headings
+ CAlfBrush *titleDividerBgBrush = iAppUi.FsTextureManager()->TitleDividerBgBrushL();
+ separatorVisualiser->SetBackgroundBrush( titleDividerBgBrush );
+
+ iDownloadedVisualiser = separatorVisualiser;
+ CleanupStack::Pop( separatorVisualiser );
+ CleanupStack::Pop( separatorData );
+ iDownloadedNode = iAttachmentsList->InsertNodeL(*separatorData, *separatorVisualiser, KFsTreeRootID);
+
+ separatorData = CFsTreePlainOneLineNodeData::NewL();
+ CleanupStack::PushL( separatorData );
+
+ separatorVisualiser = CFsTreePlainOneLineNodeVisualizer::NewL(*iAttachmentsList->TreeControl());
+ CleanupStack::PushL( separatorVisualiser );
+ resourceString = StringLoader::LoadLC( R_FSE_VIEWER_ATTACHMENTS_LIST_NOT_YET_DOWNLOADED );
+ separatorData->SetDataL( *resourceString );
+ CleanupStack::PopAndDestroy( resourceString );
+ separatorVisualiser->SetSize(TSize(screenRect.Width(), iAppUi.LayoutHandler()->OneLineListNodeHeight()));
+ separatorVisualiser->SetExtendable(EFalse);
+ // Set font height
+ // <cmail> Platform layout changes
+ //separatorVisualiser->SetFontHeight( iAppUi.LayoutHandler()->ListItemFontHeightInTwips() );
+ separatorVisualiser->SetFontHeight( textStyle.TextSizeInTwips() );
+ // </cmail> Platform layout changes
+ // Set font bolding
+ separatorVisualiser->SetTextBold( ETrue );
+
+ // Set correct skin text colors for the list items
+ separatorVisualiser->SetFocusedStateTextColor( focusedColor );
+ separatorVisualiser->SetNormalStateTextColor( normalNodeColor );
+ // <cmail>
+ //separatorVisualiser->SetBackgroundColor( iAppUi.LayoutHandler()->ListNodeBackgroundColor() );
+ // </cmail>
+ separatorVisualiser->SetBackgroundBrush( titleDividerBgBrush );
+
+ separatorData->SetIconExpanded( iAppUi.FsTextureManager()->TextureByIndex( EListTextureNodeExpanded ) );
+ separatorData->SetIconCollapsed( iAppUi.FsTextureManager()->TextureByIndex( EListTextureNodeCollapsed ) );
+ // <cmail> Platform layout changes
+ // textStyle = iAppUi.LayoutHandler()->FSTextStyleFromIdL( EFSFontTypeSmall );
+ separatorVisualiser->SetTextStyleId ( textStyle.Id() );
+ // </cmail> Platform layout changes
+ iNotDownloadedNode = iAttachmentsList->InsertNodeL(*separatorData, *separatorVisualiser, KFsTreeRootID);
+ CleanupStack::Pop( separatorVisualiser );
+ CleanupStack::Pop( separatorData );
+ iNotDownloadedVisualiser = separatorVisualiser;
+
+ }
+
+void CFSEmailUiAttachmentsListVisualiser::MoveItemToNodeL( TFsTreeItemId aItemId, TFsTreeItemId aTargetNodeId )
+ {
+ FUNC_LOG;
+ TFsTreeItemId origParentNode = iAttachmentsList->Parent( aItemId );
+
+ // Make the target node visible
+ if ( iAttachmentsList->ItemVisualizer(aTargetNodeId).IsHidden() )
+ {
+ iAttachmentsTreeListVisualizer->UnhideItemL( aTargetNodeId );
+ }
+
+ // Expand the target node if it was collapsed. Otherwise the result would
+ // be a node which has some hidden and some visible children.
+ if ( !iAttachmentsList->IsExpanded(aTargetNodeId) )
+ {
+ iAttachmentsList->ExpandNodeL(aTargetNodeId);
+ }
+
+ iAttachmentsList->MoveItemL( aItemId, aTargetNodeId );
+
+ // Hide the previous parent of the moved item if it became empty
+ if ( iAttachmentsList->IsEmpty(origParentNode) )
+ {
+ iAttachmentsTreeListVisualizer->HideItemL( origParentNode );
+ }
+ }
+
+// <cmail> Touch
+void CFSEmailUiAttachmentsListVisualiser::TreeListEventL( const TFsTreeListEvent aEvent,
+ const TFsTreeItemId aId )
+ {
+ FUNC_LOG;
+
+ switch(aEvent)
+ {
+ case MFsTreeListObserver::EFsTreeItemSelected: //from original code
+ TryToOpenItemL( aId );
+ break;
+ case MFsTreeListObserver::EFsTreeListItemTouchAction:
+ DoHandleActionL();
+ break;
+ case MFsTreeListObserver::EFsTreeListItemTouchLongTap:
+ LaunchActionMenuL();
+ break;
+ case MFsTreeListObserver::EFsTreeListItemTouchFocused:
+ SetMskL();
+ break;
+ default:
+ //Just ignore rest of events
+ break;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CFSEmailUiAttachmentsListVisualiser::DoHandleActionL
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiAttachmentsListVisualiser::DoHandleActionL( )
+ {
+ FUNC_LOG;
+
+ TFsTreeItemId id = iAttachmentsList->FocusedItem();
+
+ //Expand / Collapse
+ if ( iAttachmentsList->IsNode(id) )
+ {
+ if( !iAttachmentsList->IsExpanded( id ) )
+ {
+ iAttachmentsList->ExpandNodeL(id);
+ }
+ else
+ {
+ iAttachmentsList->CollapseNodeL(id);
+ }
+ }
+ else //Open
+ {
+ TryToOpenItemL( id );
+ }
+
+ SetMskL();
+ }
+
+//</cmail>
+
+
+void CFSEmailUiAttachmentsListVisualiser::LaunchActionMenuL()
+ {
+ FUNC_LOG;
+
+ TAttachmentData* selectedItem = NULL;
+
+ TRAPD( err, selectedItem = &iModel->GetItemL( iAttachmentsList->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 );
+ }
+
+ // Execute action list and handle the menu command
+ //<cmail> touch
+ // Execute action list and handle the menu command
+ TActionMenuCustomItemId itemId = CFSEmailUiActionMenu::ExecuteL( itemList, EFscCustom, 0, this );
+ //</cmail>
+
+ 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;
+ default:
+ break;
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Tells if the given command is available when the focus is on the given item
+// ---------------------------------------------------------------------------
+//
+TBool CFSEmailUiAttachmentsListVisualiser::IsCommandAvailableOnItem( TInt aCommandId,
+ const TAttachmentData* aFocusedItem /*= NULL*/ ) const
+ {
+ FUNC_LOG;
+ TBool available = EFalse;
+
+ const RArray<TAttachmentData>& model = iModel->GetModel();
+
+ switch ( aCommandId )
+ {
+ case EFsEmailUiCmdOpen:
+ case FsEActionAttachmentOpen:
+ {
+ if ( aFocusedItem && aFocusedItem->downloadProgress == KComplete )
+ {
+ available = ETrue;
+ }
+ }
+ break;
+
+ case EFsEmailUiCmdDownload:
+ case FsEActionAttachmentDownload:
+ {
+ if (aFocusedItem)
+ {
+ TPartData partData = aFocusedItem->partData;
+
+ TUint pluginId = partData.iMailBoxId.PluginId().iUid;
+
+ TBool isPop3 = ( pluginId == KFsPop3PluginId );
+
+ if ( aFocusedItem->downloadProgress == KNone &&
+ !iModel->IsDownloading( *aFocusedItem ) &&
+ !isPop3 )
+ {
+ available = ETrue;
+ }
+ }
+ }
+ break;
+
+ case EFsEmailUiCmdCancelDownload:
+ case FsEActionAttachmentCancelDownload:
+ {
+ if ( aFocusedItem && iModel->IsDownloading( *aFocusedItem ) )
+ {
+ available = ETrue;
+ }
+ }
+ break;
+
+ // <cmail> Disabled until there is support in plugins.
+ case FsEActionAttachmentClearFetchedContent:
+ case EFsEmailUiCmdClearFetchedAttachment:
+ if ( !iEmbeddedMsgMode && aFocusedItem && !iModel->IsDownloading( *aFocusedItem ) )
+ {
+ available = aFocusedItem->downloadProgress > KNone;
+ }
+ else
+ {
+ available = EFalse;
+ }
+ break;
+ // </cmail>
+ case EFsEmailUiCmdSave:
+ case FsEActionAttachmentSave:
+ {
+ // see if mailbox allows saving of embedded messages
+ CFSMailBox* mailbox = iAppUi.GetActiveMailbox();
+
+ TBool canSaveMessages( mailbox && mailbox->HasCapability(
+ EFSMboxCapaSupportsSavingOfEmbeddedMessages ) );
+
+ // saving message type attachments of embedded messages is blocked
+ // due to limitations of the Activesync plugin
+ if ( aFocusedItem && !iModel->IsDownloading( *aFocusedItem ) &&
+ (!iModel->IsMessage(*aFocusedItem) || !iEmbeddedMsgMode && canSaveMessages) )
+ {
+ 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 ( model.Count() > 1 )
+ {
+ available = ETrue;
+ for ( TInt i=0; i<model.Count(); i++)
+ {
+ if ( iModel->IsDownloading( model[i] ) )
+ {
+ available = EFalse;
+ break;
+ }
+ }
+ }
+ // In embedded message mode, save all needs to be blocked if there
+ // are any message type attachments. This is due to limitations of Activesync plugin.
+ if ( available && iEmbeddedMsgMode && iModel->IsThereAnyMessageAttachments() )
+ {
+ available = EFalse;
+ }
+ }
+ 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++)
+ {
+ if ( iModel->IsDownloading( model[i] ) )
+ {
+ 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.
+ // For POP only "Download All" is available due to protocols's
+ // restrictions.
+ TInt downloadableFiles = 0;
+
+ TBool popChecked = EFalse;
+
+ TBool isPop3 = EFalse;
+
+ TInt count = model.Count();
+
+ for ( TInt i = 0; i < count; i++ )
+ {
+ const TAttachmentData& item = model[i];
+
+ if ( item.downloadProgress == KNone &&
+ !iModel->IsDownloading( item ) )
+ {
+ downloadableFiles++;
+ }
+
+ if ( !popChecked )
+ {
+ TPartData partData = item.partData;
+
+ TUint pluginId = partData.iMailBoxId.PluginId().iUid;
+
+ isPop3 = ( pluginId == KFsPop3PluginId );
+
+ popChecked = ETrue;
+ }
+ }
+
+ if ( downloadableFiles > 1 ||
+ ( downloadableFiles > 0 && isPop3 ) )
+ {
+ 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;
+ }
+
+// ---------------------------------------------------------------------------
+// Creates the text shown on the second line of the attachment item
+// ---------------------------------------------------------------------------
+//
+HBufC* CFSEmailUiAttachmentsListVisualiser::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 = CFSEmailUiAttachmentsListModel::CreateSizeDescLC( aAttachment.fileSize );
+
+ // Download progress
+ HBufC* progressString = NULL;
+ if ( iModel->IsDownloading( aAttachment ) )
+ {
+ progressString = StringLoader::LoadLC( R_FSE_VIEWER_ATTACHMENTS_LIST_DOWNLOADING, aAttachment.downloadProgress );
+ }
+ else
+ {
+ progressString = KNullDesC().AllocLC();
+ }
+
+ // 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 given item. Start downloading if the item is not
+// downloaded or show note if it's currently being downloaded.
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiAttachmentsListVisualiser::TryToOpenItemL( TFsTreeItemId aId )
+ {
+ FUNC_LOG;
+ TAttachmentData* attachment = iModel->GetItem( aId );
+
+ if ( attachment )
+ {
+ if ( iModel->IsDownloading( *attachment ) )
+ {
+ TFsEmailUiUtility::ShowInfoNoteL( R_FSE_VIEWER_NOTE_ATTACHMENT_DOWNLOADING_PROGRESS );
+ }
+ else if ( attachment->downloadProgress != KComplete )
+ {
+ iModel->StartDownloadL( aId );
+ }
+ 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 CFSEmailUiAttachmentsListVisualiser::RemoveAttachmentContentL( TFsTreeItemId aId )
+ {
+ FUNC_LOG;
+ TAttachmentData* item = iModel->GetItem( aId );
+
+ if ( IsCommandAvailableOnItem( EFsEmailUiCmdClearFetchedAttachment, item ) )
+ {
+ TInt reallyClear =
+ TFsEmailUiUtility::ShowConfirmationQueryL( R_FSE_VIEWER_CLEAR_FETCHED_QUERY );
+ if ( reallyClear )
+ {
+ iModel->RemoveContentL( aId );
+ // Move item back to not-yet-downloaded node only if contents were actually
+ // removed succesfully
+ if ( !iModel->IsCompletelyDownloadedL( *item ) )
+ {
+ MoveItemToNodeL( aId, iNotDownloadedNode );
+ }
+ }
+ // focused item or proper MSK action for it may have changed
+ SetMskL();
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// If there is one or more expanded nodes, collapses all nodes.
+// Otherwise expands all nodes.
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiAttachmentsListVisualiser::ShortcutCollapseExpandAllToggleL()
+ {
+ FUNC_LOG;
+ TBool collapseAllNodes( EFalse );
+ TInt count = iAttachmentsList->CountChildren( KFsTreeRootID );
+ for ( TInt i=0 ; i<count ; i++ )
+ {
+ TFsTreeItemId curId = iAttachmentsList->Child(KFsTreeRootID, i);
+ if ( iAttachmentsList->IsNode( curId ) &&
+ iAttachmentsList->IsExpanded( curId ) )
+ {
+ collapseAllNodes = ETrue;
+ break;
+ }
+ }
+
+ if ( collapseAllNodes )
+ {
+ iAttachmentsTreeListVisualizer->CollapseAllL();
+ }
+ else
+ {
+ TFsTreeItemId prevId = iAttachmentsList->FocusedItem(); // the focus may fall out of the screen unless manually reset
+ iAttachmentsTreeListVisualizer->ExpandAllL();
+ iAttachmentsTreeListVisualizer->SetFocusedItemL( prevId );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Moves the focus to the topmost item
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiAttachmentsListVisualiser::GoToTopL()
+ {
+ FUNC_LOG;
+ TInt topLevelCount = iAttachmentsList->CountChildren( KFsTreeRootID );
+ if ( topLevelCount > 1)
+ {
+ // the item #0 is the non-focusable header item
+ TInt indexToFocus = 1;
+ TFsTreeItemId topId = iAttachmentsList->Child(KFsTreeRootID, indexToFocus);
+
+ // If the top item is invisible, move down until we find a visible item
+ while ( iAttachmentsList->ItemVisualizer(topId).IsHidden() &&
+ indexToFocus < iAttachmentsList->CountChildren(KFsTreeRootID)-1 )
+ {
+ indexToFocus++;
+ topId = iAttachmentsList->Child(KFsTreeRootID, indexToFocus);
+ }
+
+ iAttachmentsTreeListVisualizer->SetFocusedItemL( topId );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Moves the focus to the bottommost item
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiAttachmentsListVisualiser::GoToBottomL()
+ {
+ FUNC_LOG;
+ TInt topLevelCount = iAttachmentsList->CountChildren( KFsTreeRootID );
+ if ( topLevelCount )
+ {
+ TInt lastIndex = topLevelCount-1;
+ TFsTreeItemId bottomId = iAttachmentsList->Child(KFsTreeRootID, lastIndex);
+ // If the bottom item is invisible, move up until we find a visible item
+ while ( iAttachmentsList->ItemVisualizer(bottomId).IsHidden() &&
+ lastIndex > 0 )
+ {
+ lastIndex--;
+ bottomId = iAttachmentsList->Child(KFsTreeRootID, lastIndex);
+ }
+
+ // If the last item on top level is an expanded node, navigate to its last child
+ if ( iAttachmentsList->IsNode(bottomId) )
+ {
+ TInt childCount = iAttachmentsList->CountChildren(bottomId);
+ if ( childCount && iAttachmentsList->IsExpanded(bottomId) )
+ {
+ bottomId = iAttachmentsList->Child( bottomId, childCount-1 );
+ }
+ }
+
+ iAttachmentsTreeListVisualizer->SetFocusedItemL( bottomId );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Sets up the title pane to show the mail title
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiAttachmentsListVisualiser::SetupTitlePaneTextL()
+ {
+ FUNC_LOG;
+ // <cmail> UI updates: title text is "Attachments" instead of the mail
+ // subject text.
+
+ // </cmail>
+ HBufC* titleText = StringLoader::LoadLC( R_FSE_VIEWER_ATTACHMENTS_VIEW_TITLE );
+ iAppUi.SetTitlePaneTextL( *titleText );
+ CleanupStack::PopAndDestroy( titleText );
+ }
+
+// ---------------------------------------------------------------------------
+// HandleMailBoxEventL
+// Mailbox event handler, responds to events sent by the plugin.
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiAttachmentsListVisualiser::HandleMailBoxEventL( TFSMailEvent aEvent,
+ TFSMailMsgId aMailbox, TAny* aParam1, TAny* /*aParam2*/, TAny* /*aParam3*/ )
+ {
+ FUNC_LOG;
+ TFsTreeItemId nullId(0);
+ TPartData partData = iModel->GetMessageL( nullId );
+
+ if ( iFirstStartCompleted && aMailbox == partData.iMailBoxId &&
+ aEvent == TFSEventMailDeleted && aParam1 && iModel ) // Safety, in list events that only concern active mailbox are handled
+ {
+ RArray<TFSMailMsgId>* removedEntries = static_cast< RArray<TFSMailMsgId>* >(aParam1);
+ for ( TInt i=0 ; i < removedEntries->Count() ; i++ )
+ {
+ if ( partData.iMessageId == (*removedEntries)[i] )
+ {
+ TMailListActivationData tmp;
+ tmp.iMailBoxId = iAppUi.GetActiveMailboxId();
+ const TPckgBuf<TMailListActivationData> pkgOut( tmp );
+ iAppUi.EnterFsEmailViewL( MailListId, KStartListReturnToPreviousFolder, pkgOut );
+ break;
+ }
+ }
+ }
+ }
+
+// <cmail>
+// ---------------------------------------------------------------------------
+// ActionMenuPosition
+// ---------------------------------------------------------------------------
+//
+TPoint CFSEmailUiAttachmentsListVisualiser::ActionMenuPosition()
+ {
+ TAlfRealRect focusRect;
+ TFsTreeItemId listItemId = iAttachmentsList->FocusedItem();
+ iAttachmentsList->GetItemDisplayRectTarget(listItemId, focusRect);
+ return focusRect.iTl;
+ }
+// </cmail>
+