emailuis/emailui/src/FreestyleEmailUiAttachmentsListVisualiser.cpp
changeset 0 8466d47a6819
child 2 5253a20d2a1e
--- /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>
+