diff -r 000000000000 -r 8466d47a6819 emailuis/emailui/src/FreestyleEmailUiAttachmentsListVisualiser.cpp --- /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 +#include +#include +#include +#include +#include +// SF +#include +#include "fscontrolbar.h" +#include "fscontrolbuttoninterface.h" +#include "fstreelist.h" +#include "fstreevisualizerbase.h" +#include "fstreeplainonelineitemdata.h" +#include "fstreeplainonelineitemvisualizer.h" +#include "fstreeplaintwolineitemdata.h" +#include "fstreeplaintwolineitemvisualizer.h" +#include "fstreeplainonelinenodedata.h" +#include "fstreeplainonelinenodevisualizer.h" +// +#include +#include +#include +// SF +#include +#include +#include +#include +#include +// +#include +// + +// Use layout data instead of hard-coded values +#include +#include +// + +// 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 ); + + // 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() ); + // + + // create model + iModel = CFSEmailUiAttachmentsListModel::NewL( iAppUi, *this ); + + // S60 skin support + //iAttachmentsTreeListVisualizer->SetBackgroundTextureL( iAppUi.FsTextureManager()->TextureByIndex( EBackgroundTextureMailList ) ); + // + 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 ); + } + // removed as not used anywhere. + + // + delete iAttachmentsList; + } + + +TUid CFSEmailUiAttachmentsListVisualiser::Id() const + { + FUNC_LOG; + return AttachmentMngrViewId; + } + + +// Toolbar +/*void CFSEmailUiAttachmentsListVisualiser::DoActivateL(const TVwsViewId& aPrevViewId, + TUid aCustomMessageId, + const TDesC8& aCustomMessage)*/ +void CFSEmailUiAttachmentsListVisualiser::ChildDoActivateL(const TVwsViewId& /*aPrevViewId*/, + TUid /*aCustomMessageId*/, + const TDesC8& aCustomMessage) +// 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 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); + } + +// Toolbar +// --------------------------------------------------------------------------- +// OfferToolbarEventL +// --------------------------------------------------------------------------- +// +void CFSEmailUiAttachmentsListVisualiser::OfferToolbarEventL( TInt /*aCommand*/ ) + { + + } + +// --------------------------------------------------------------------------- +// ToolbarResourceId +// --------------------------------------------------------------------------- +// +TInt CFSEmailUiAttachmentsListVisualiser::ToolbarResourceId() const + { + return R_FREESTYLE_EMAIL_UI_TOOLBAR_ATTACHMENT_LIST; + } + +// + +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& 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( + 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& 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 ); + // 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() ); + // 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& model = iModel->GetModel(); + for ( TInt i=0; iItemVisualizer( 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& 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 ); + // Removed attachments row from attachemnts view. New UI + // requirement. Some other lines of code also removed from this function + // because of the modification. + + // + // 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)); + + // 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(); + + // + + // + + // + + // + + // Platform layout changes + + // 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 + // Platform layout changes + //separatorVisualiser->SetFontHeight( iAppUi.LayoutHandler()->ListItemFontHeightInTwips() ); + separatorVisualiser->SetFontHeight( textStyle.TextSizeInTwips() ); + // Platform layout changes + // Set font bolding + separatorVisualiser->SetTextBold( ETrue ); + separatorData->SetIconExpanded( iAppUi.FsTextureManager()->TextureByIndex( EListTextureNodeExpanded ) ); + separatorData->SetIconCollapsed( iAppUi.FsTextureManager()->TextureByIndex( EListTextureNodeCollapsed ) ); + + // Platform layout changes + // textStyle = iAppUi.LayoutHandler()->FSTextStyleFromIdL( EFSFontTypeSmall ); + separatorVisualiser->SetTextStyleId( textStyle.Id() ); + // Platform layout changes + + // Set correct skin text colors for the list items + separatorVisualiser->SetFocusedStateTextColor( focusedColor ); + separatorVisualiser->SetNormalStateTextColor( normalNodeColor ); + // + //separatorVisualiser->SetBackgroundColor( iAppUi.LayoutHandler()->ListNodeBackgroundColor() ); + // + // 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 + // Platform layout changes + //separatorVisualiser->SetFontHeight( iAppUi.LayoutHandler()->ListItemFontHeightInTwips() ); + separatorVisualiser->SetFontHeight( textStyle.TextSizeInTwips() ); + // Platform layout changes + // 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->SetBackgroundBrush( titleDividerBgBrush ); + + separatorData->SetIconExpanded( iAppUi.FsTextureManager()->TextureByIndex( EListTextureNodeExpanded ) ); + separatorData->SetIconCollapsed( iAppUi.FsTextureManager()->TextureByIndex( EListTextureNodeCollapsed ) ); + // Platform layout changes + // textStyle = iAppUi.LayoutHandler()->FSTextStyleFromIdL( EFSFontTypeSmall ); + separatorVisualiser->SetTextStyleId ( textStyle.Id() ); + // 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 ); + } + } + +// 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(); + } + +// + + +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 + // touch + // Execute action list and handle the menu command + TActionMenuCustomItemId itemId = CFSEmailUiActionMenu::ExecuteL( itemList, EFscCustom, 0, this ); + // + + 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& 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; + + // 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; + // + 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; iIsDownloading( 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; iIsDownloading( 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 ; iChild(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; + // UI updates: title text is "Attachments" instead of the mail + // subject text. + + // + 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* removedEntries = static_cast< RArray* >(aParam1); + for ( TInt i=0 ; i < removedEntries->Count() ; i++ ) + { + if ( partData.iMessageId == (*removedEntries)[i] ) + { + TMailListActivationData tmp; + tmp.iMailBoxId = iAppUi.GetActiveMailboxId(); + const TPckgBuf pkgOut( tmp ); + iAppUi.EnterFsEmailViewL( MailListId, KStartListReturnToPreviousFolder, pkgOut ); + break; + } + } + } + } + +// +// --------------------------------------------------------------------------- +// ActionMenuPosition +// --------------------------------------------------------------------------- +// +TPoint CFSEmailUiAttachmentsListVisualiser::ActionMenuPosition() + { + TAlfRealRect focusRect; + TFsTreeItemId listItemId = iAttachmentsList->FocusedItem(); + iAttachmentsList->GetItemDisplayRectTarget(listItemId, focusRect); + return focusRect.iTl; + } +// +