diff -r d189ee25cf9d -r 3533d4323edc emailuis/emailui/src/FreestyleEmailUiSendAttachmentsListModel.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/emailuis/emailui/src/FreestyleEmailUiSendAttachmentsListModel.cpp Wed Sep 01 12:28:57 2010 +0100
@@ -0,0 +1,1258 @@
+/*
+* 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 model for the attachment list view
+*
+*/
+
+// SYSTEM INCLUDES
+//
+#include "emailtrace.h"
+#include "fstreelist.h"
+#include
+#include
+#include
+#include "cfsmailclient.h"
+// SF
+#include
+//
+#include "fstreelist.h"
+#include "fstreevisualizerbase.h"
+#include "fstreeplainonelineitemdata.h"
+#include "fstreeplainonelineitemvisualizer.h"
+#include "fstreeplainonelinenodedata.h"
+#include "fstreeplainonelinenodevisualizer.h"
+#include "fstreeplaintwolineitemdata.h"
+#include "fstreeplaintwolineitemvisualizer.h"
+//
+
+// Use layout data instead of hard-coded values
+#include
+#include
+//
+
+
+// INTERNAL INCLUDES
+#include "FreestyleEmailUiAppui.h"
+#include "FreestyleEmailUi.hrh"
+#include "FreestyleEmailUiLayoutHandler.h"
+#include "FreestyleEmailUiTextureManager.h"
+#include "FreestyleEmailUiSendAttachmentsListModel.h"
+#include "FreestyleEmailUiSendAttachmentsListControl.h"
+#include "FreestyleEmailUiSendAttachmentsListVisualiser.h"
+#include "FreestyleEmailUiShortcutBinding.h"
+#include "FreestyleEmailUiUtilities.h"
+#include "ncscomposeview.h"
+#include "ncsconstants.h"
+
+// ---------------------------------------------------------------------------
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CFSEmailUiSendAttachmentsListModelItem* CFSEmailUiSendAttachmentsListModelItem::NewL(
+ const TDesC& aFileName,
+ TInt aFileSize,
+ TFileType aFileType,
+ TBool aRemote,
+ TBool aReadOnly )
+ {
+ FUNC_LOG;
+ CFSEmailUiSendAttachmentsListModelItem* self =
+ CFSEmailUiSendAttachmentsListModelItem::NewLC(
+ aFileName,
+ aFileSize,
+ aFileType,
+ aRemote,
+ aReadOnly );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CFSEmailUiSendAttachmentsListModelItem* CFSEmailUiSendAttachmentsListModelItem::NewLC(
+ const TDesC& aFileName,
+ TInt aFileSize,
+ TFileType aFileType,
+ TBool aRemote,
+ TBool aReadOnly )
+ {
+ FUNC_LOG;
+ CFSEmailUiSendAttachmentsListModelItem* self =
+ new (ELeave) CFSEmailUiSendAttachmentsListModelItem(
+ aFileName,
+ aFileSize,
+ aFileType,
+ aRemote,
+ aReadOnly );
+ CleanupStack::PushL( self );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// c++ constructor.
+// ---------------------------------------------------------------------------
+//
+CFSEmailUiSendAttachmentsListModelItem::CFSEmailUiSendAttachmentsListModelItem(
+ const TDesC& aFileName,
+ TInt aFileSize,
+ TFileType aFileType,
+ TBool aRemote,
+ TBool aReadOnly )
+ :iFileName( aFileName ),
+ iFileSize( aFileSize ),
+ iRemote( aRemote ),
+ iReadOnly( aReadOnly ),
+ iFileType( aFileType )
+ {
+ FUNC_LOG;
+ }
+
+// ---------------------------------------------------------------------------
+// c++ destructor.
+// ---------------------------------------------------------------------------
+//
+CFSEmailUiSendAttachmentsListModelItem::~CFSEmailUiSendAttachmentsListModelItem()
+ {
+ FUNC_LOG;
+ }
+
+// ---------------------------------------------------------------------------
+// FileName
+// ---------------------------------------------------------------------------
+//
+const TDesC& CFSEmailUiSendAttachmentsListModelItem::FileName() const
+ {
+ FUNC_LOG;
+ return iFileName;
+ }
+
+// ---------------------------------------------------------------------------
+// FileExtension
+// ---------------------------------------------------------------------------
+//
+TPtrC CFSEmailUiSendAttachmentsListModelItem::FileExtension() const
+ {
+ FUNC_LOG;
+ return TParsePtrC( iFileName ).Ext();
+ }
+
+
+// ---------------------------------------------------------------------------
+// MailMsgPartId
+// ---------------------------------------------------------------------------
+//
+TFSMailMsgId CFSEmailUiSendAttachmentsListModelItem::MailMsgPartId() const
+ {
+ FUNC_LOG;
+ return iMailMsgPartId;
+ }
+
+// ---------------------------------------------------------------------------
+// MailMsgPartId
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiSendAttachmentsListModelItem::SetMailMsgPartId(
+ const TFSMailMsgId aPartId )
+ {
+ FUNC_LOG;
+ iMailMsgPartId = aPartId;
+ }
+
+// ---------------------------------------------------------------------------
+// GetFileSize
+// ---------------------------------------------------------------------------
+//
+TInt CFSEmailUiSendAttachmentsListModelItem::FileSize() const
+ {
+ FUNC_LOG;
+ return iFileSize;
+ }
+
+// ---------------------------------------------------------------------------
+// GetFileSize
+// ---------------------------------------------------------------------------
+//
+TInt CFSEmailUiSendAttachmentsListModelItem::ItemId() const
+ {
+ FUNC_LOG;
+ return iItemId;
+ }
+
+// ---------------------------------------------------------------------------
+// SetItemId
+// Sets Id to item for identification
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiSendAttachmentsListModelItem::SetItemId( TFsTreeItemId aItemId )
+ {
+ FUNC_LOG;
+ iItemId = aItemId;
+ }
+
+// ---------------------------------------------------------------------------
+// IsRemote
+//
+// ---------------------------------------------------------------------------
+//
+TBool CFSEmailUiSendAttachmentsListModelItem::IsRemote()
+ {
+ FUNC_LOG;
+ return iRemote;
+ }
+
+// ---------------------------------------------------------------------------
+// IsReadOnly
+//
+// ---------------------------------------------------------------------------
+//
+TBool CFSEmailUiSendAttachmentsListModelItem::IsReadOnly()
+ {
+ FUNC_LOG;
+ // As a temporary solution, all remote attachments are made non-removable.
+ // Intellisync protocol should support removing also remote attachments
+ // but this doesn't seem to work currently in the Intellisync plugin.
+ return iReadOnly || iRemote;
+ }
+
+// ---------------------------------------------------------------------------
+// FileType
+//
+// ---------------------------------------------------------------------------
+//
+TFileType CFSEmailUiSendAttachmentsListModelItem::FileType()
+ {
+ FUNC_LOG;
+ return iFileType;
+ }
+
+// ---------------------------------------------------------------------------
+// SetRemote
+//
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiSendAttachmentsListModelItem::SetRemote( TBool aIsRemote )
+ {
+ FUNC_LOG;
+ iRemote = aIsRemote;
+ }
+
+
+//MODEL CLASS CONSTRUCTION
+
+// ---------------------------------------------------------------------------
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CFSEmailUiSendAttachmentsListModel* CFSEmailUiSendAttachmentsListModel::NewL(
+ CFreestyleEmailUiAppUi* aAppUi,
+ CAlfEnv& aEnv,
+ CFreestyleEmailUiSendAttachmentsListControl* aControl )
+ {
+ FUNC_LOG;
+ CFSEmailUiSendAttachmentsListModel* self =
+ CFSEmailUiSendAttachmentsListModel::NewLC(
+ aAppUi,
+ aEnv,
+ aControl );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CFSEmailUiSendAttachmentsListModel* CFSEmailUiSendAttachmentsListModel::NewLC(
+ CFreestyleEmailUiAppUi* aAppUi,
+ CAlfEnv& aEnv,
+ CFreestyleEmailUiSendAttachmentsListControl* aControl )
+ {
+ FUNC_LOG;
+ CFSEmailUiSendAttachmentsListModel* self =
+ new (ELeave) CFSEmailUiSendAttachmentsListModel( aAppUi );
+ CleanupStack::PushL( self );
+ self->ConstructL( aEnv, aControl );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiSendAttachmentsListModel::ConstructL(
+ CAlfEnv& aEnv,
+ CFreestyleEmailUiSendAttachmentsListControl* aControl )
+ {
+ FUNC_LOG;
+ iEnv = &aEnv;
+ iControl = aControl;
+ iAttachmentsList = NULL;
+ InitAttachmentListL();
+ }
+
+// ---------------------------------------------------------------------------
+// c++ constructor.
+// ---------------------------------------------------------------------------
+//
+CFSEmailUiSendAttachmentsListModel::CFSEmailUiSendAttachmentsListModel(
+ CFreestyleEmailUiAppUi* aAppUi )
+ : iAppUi( aAppUi )
+ {
+ FUNC_LOG;
+ }
+
+// ---------------------------------------------------------------------------
+// c++ destructor.
+// ---------------------------------------------------------------------------
+//
+CFSEmailUiSendAttachmentsListModel::~CFSEmailUiSendAttachmentsListModel()
+ {
+ FUNC_LOG;
+ while ( Count() > 0 )
+ {
+ RemoveAndDestroy( 0 );
+ }
+ // Close list resource.
+ iItems.Close();
+ delete iAttachmentsList;
+ }
+
+// ---------------------------------------------------------------------------
+// AppendL
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiSendAttachmentsListModel::AppendL( MFSListModelItem* aItem )
+ {
+ FUNC_LOG;
+ TInt err;
+ CFSEmailUiSendAttachmentsListModelItem* item =
+ static_cast( aItem );
+
+ err = iItems.Append( item );
+ User::LeaveIfError( err );
+ }
+
+// ---------------------------------------------------------------------------
+// InsertL
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiSendAttachmentsListModel::InsertL( MFSListModelItem* aItem, TInt aIndex)
+ {
+ FUNC_LOG;
+ TInt err;
+ CFSEmailUiSendAttachmentsListModelItem* item =
+ static_cast( aItem );
+
+ err = iItems.Insert( item, aIndex );
+ User::LeaveIfError( err );
+ }
+
+// ---------------------------------------------------------------------------
+// RemoveAndDestroy
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiSendAttachmentsListModel::RemoveAndDestroy( TInt aIndex )
+ {
+ FUNC_LOG;
+ delete Item( aIndex );
+ iItems.Remove( aIndex );
+ }
+
+// ---------------------------------------------------------------------------
+// Item
+// Retuns valid item in model by index
+// ---------------------------------------------------------------------------
+//
+MFSListModelItem* CFSEmailUiSendAttachmentsListModel::Item( TInt aIndex )
+ {
+ FUNC_LOG;
+ TInt numInList = iItems.Count();
+ if ( aIndex < 0 || aIndex >= numInList )
+ {
+ return NULL;
+ }
+
+ return iItems[aIndex];
+ }
+
+// ---------------------------------------------------------------------------
+// Count
+// ---------------------------------------------------------------------------
+//
+TInt CFSEmailUiSendAttachmentsListModel::Count() const
+ {
+ FUNC_LOG;
+ return iItems.Count();
+ }
+
+// ---------------------------------------------------------------------------
+// AppUi
+// return appui pointer
+// ---------------------------------------------------------------------------
+//
+CFreestyleEmailUiAppUi* CFSEmailUiSendAttachmentsListModel::AppUi()
+ {
+ FUNC_LOG;
+ return iAppUi;
+ }
+
+// ---------------------------------------------------------------------------
+// ReFreshList
+// Refresh attachment list eg. after item removal
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiSendAttachmentsListModel::ReFreshListL()
+ {
+ FUNC_LOG;
+ // empty the list
+ if ( !iAttachmentsList )
+ {
+ // Coverity error fix. iAttachmentsList was used also later without null checks
+ return;
+ }
+
+ iAttachmentsList->RemoveAllL();
+ iAttachmentsList->SetFocusedL(ETrue);
+ iAttachmentsList->HideListL();
+ TRect screenRect;
+ AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, screenRect );
+ iListLayout->SetSize( screenRect.Size() );
+ iListLayout->UpdateChildrenLayout();
+
+ // header and dividers
+ CreateListSkeletonL();
+ // list model items
+ CreateListItemsL();
+
+ if ( iAttachmentsList->IsEmpty(iLocalNode) &&
+ !iAttachmentsList->ItemVisualizer(iLocalNode).IsHidden() )
+ {
+ iAttachmentsTreeListVisualizer->HideItemL( iLocalNode );
+ }
+ if ( iAttachmentsList->IsEmpty(iRemoteNode) &&
+ !iAttachmentsList->ItemVisualizer(iRemoteNode).IsHidden() )
+ {
+ iAttachmentsTreeListVisualizer->HideItemL( iRemoteNode );
+ }
+
+ iAttachmentsList->ShowListL();
+
+ // Set the focus on the topmost visible focusable item
+ GoToTopL();
+ }
+
+
+// ---------------------------------------------------------------------------
+// ReScaleUiL
+//
+//
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiSendAttachmentsListModel::ReScaleUiL()
+ {
+ FUNC_LOG;
+
+ // No rescaling to do if the list is empty
+ if ( iAttachmentsList->IsEmpty(iLocalNode) && iAttachmentsList->IsEmpty(iRemoteNode) )
+ return;
+
+ iAttachmentsList->HideListL();
+
+ // Reset font heights
+ // ------------------
+ TInt fontHeight = iAppUi->LayoutHandler()->ListItemFontHeightInTwips();
+
+ // Header item not used - UI update.
+ //
+
+ // Dividers
+ iLocalNodeVisualiser->SetFontHeight( fontHeight );
+ iRemoteNodeVisualiser->SetFontHeight( fontHeight );
+
+ // Attachment items
+ for ( TInt i=0; iItemVisualizer( iItems[i]->ItemId() );
+ attachmentVis.SetFontHeight( fontHeight );
+ }
+
+ iAttachmentsList->ShowListL();
+ }
+
+// ---------------------------------------------------------------------------
+// CreateListSkeletonL
+//
+//
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiSendAttachmentsListModel::CreateListSkeletonL()
+ {
+ FUNC_LOG;
+// Removed listbox header lines because of modified UI specification.
+
+//
+
+ CreateListSeparatorL(
+ R_FSE_EDITOR_LOCAL_ATTACHMENTS,
+ KFsTreeRootID,
+ iLocalNodeVisualiser,
+ iLocalNode );
+
+ CreateListSeparatorL(
+ R_FSE_EDITOR_REMOTE_ATTACHMENTS,
+ KFsTreeRootID,
+ iRemoteNodeVisualiser,
+ iRemoteNode );
+
+ iAttachmentsList->SetItemsAlwaysExtendedL(ETrue);
+
+ }
+
+// ---------------------------------------------------------------------------
+// CreateListItemsL
+//
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiSendAttachmentsListModel::CreateListItemsL()
+ {
+ FUNC_LOG;
+ CFSEmailUiSendAttachmentsListModelItem* item;
+ TInt count = Count();
+
+ for ( TInt i=0; i < count; ++i )
+ {
+ item = static_cast( Item( i ) );
+ // append item content to Freestyle tree list
+ AppendItemToAttachmentListL( item );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CreateListSeparatorL
+//
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiSendAttachmentsListModel::CreateListSeparatorL(
+ TInt aResourceId,
+ TFsTreeItemId aParentNodeId,
+ CFsTreePlainOneLineNodeVisualizer*& aVisualizer,
+ TFsTreeItemId& aSeparatorNodeId )
+ {
+ FUNC_LOG;
+ // get screen rectangle
+ TRect screenRect;
+ AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EScreen, screenRect );
+
+ // create data and visualizer objects
+ CFsTreePlainOneLineNodeData* separatorData = CFsTreePlainOneLineNodeData::NewL();
+ CleanupStack::PushL( separatorData );
+ CFsTreePlainOneLineNodeVisualizer* separatorVisualiser = CFsTreePlainOneLineNodeVisualizer::NewL(*iAttachmentsList->TreeControl());
+ CleanupStack::PushL( separatorVisualiser );
+
+ // load resource string and set to separator object
+ HBufC* resourceString = StringLoader::LoadLC( aResourceId );
+ separatorData->SetDataL( *resourceString );
+ CleanupStack::PopAndDestroy( resourceString );
+
+ // set properties of visualizer
+ separatorVisualiser->SetSize( TSize( screenRect.Width(), iAppUi->LayoutHandler()->OneLineListNodeHeight() ) );
+ separatorVisualiser->SetExtendable( EFalse );
+
+ //
+ //separatorVisualiser->SetFontHeight( iAppUi->LayoutHandler()->ListItemFontHeightInTwips() );
+ //
+ separatorVisualiser->SetTextBold( ETrue );
+ separatorData->SetIconExpanded( iAppUi->FsTextureManager()->TextureByIndex( EListTextureNodeExpanded ) );
+ separatorData->SetIconCollapsed( iAppUi->FsTextureManager()->TextureByIndex( EListTextureNodeCollapsed ) );
+
+ TRgb nodeTextColor = iAppUi->LayoutHandler()->ListNodeTextColor();
+ TRgb focusedTextColor = iAppUi->LayoutHandler()->ListFocusedStateTextSkinColor();
+ //
+ //TRgb nodeBgColor = iAppUi->LayoutHandler()->ListNodeBackgroundColor();
+ //
+ separatorVisualiser->SetNormalStateTextColor( nodeTextColor );
+ separatorVisualiser->SetFocusedStateTextColor( focusedTextColor );
+ //
+ //separatorVisualiser->SetBackgroundColor( nodeBgColor );
+ //
+
+ aVisualizer = separatorVisualiser;
+ CleanupStack::Pop( separatorVisualiser );
+ CleanupStack::Pop( separatorData );
+ aSeparatorNodeId = iAttachmentsList->InsertNodeL( *separatorData, *separatorVisualiser, aParentNodeId );
+ }
+
+// ---------------------------------------------------------------------------
+// UpdateHeaderItemTextL
+// Update the attachment count and total size information shown in header
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiSendAttachmentsListModel::UpdateHeaderItemTextL()
+ {
+ FUNC_LOG;
+ // Currently send attachment list headers doesn't contain any data that
+ // need to be updated
+ }
+
+// ---------------------------------------------------------------------------
+// AppendItemToAttachmentList
+// Appends item to graphical list from model list
+// ---------------------------------------------------------------------------
+//
+TFsTreeItemId CFSEmailUiSendAttachmentsListModel::AppendItemToAttachmentListL(
+ CFSEmailUiSendAttachmentsListModelItem* aItem )
+ {
+ FUNC_LOG;
+ TFsTreeItemId itemId;
+ CFsTreePlainTwoLineItemData* twoLineItemData;
+ CFsTreePlainTwoLineItemVisualizer* twoLineItemVisualizer;
+
+ twoLineItemData = CFsTreePlainTwoLineItemData::NewL();
+ twoLineItemVisualizer = CFsTreePlainTwoLineItemVisualizer::NewL( *iAttachmentsList->TreeControl() );
+
+ // load localization strings for file size
+ HBufC* sizeDesc = TFsEmailUiUtility::CreateSizeDescLC( aItem->FileSize() );
+ HBufC* decoratedSize = StringLoader::LoadLC( R_FS_EMAILUI_SENDATTACHMENTS_ITEMSIZE_TXT,
+ *sizeDesc );
+
+ // construct item 2nd row text
+ HBufC* row2Buffer = HBufC::NewLC( aItem->FileExtension().Length() + KSpace().Length() + decoratedSize->Length() );
+ TPtr row2Des = row2Buffer->Des();
+ row2Des.Copy( aItem->FileExtension() );
+ row2Des.Append( KSpace );
+ row2Des.Append( *decoratedSize );
+
+ // set data to item
+ twoLineItemData->SetDataL( aItem->FileName() );
+ twoLineItemData->SetSecondaryDataL( *row2Buffer );
+
+ // free resources
+ CleanupStack::PopAndDestroy( row2Buffer );
+ CleanupStack::PopAndDestroy( decoratedSize );
+ CleanupStack::PopAndDestroy( sizeDesc );
+
+ // set icon
+ CAlfTexture& itemTexture = TFsEmailUiUtility::GetAttachmentIcon(
+ aItem->FileType(),
+ *iAppUi->FsTextureManager() );
+ twoLineItemData->SetIcon( itemTexture );
+
+ // set item size and properties
+ TRect screenRect;
+ AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EScreen, screenRect );
+
+ twoLineItemVisualizer->SetSize( TSize(screenRect.Width(), iAppUi->LayoutHandler()->OneLineListItemHeight()) );
+ twoLineItemVisualizer->SetExtendedSize( TSize(screenRect.Width(), 2 * iAppUi->LayoutHandler()->OneLineListItemHeight()) );
+ twoLineItemVisualizer->SetFlags( twoLineItemVisualizer->Flags()|KFsTreeListItemHasMenu );
+
+ twoLineItemVisualizer->SetExtendable( ETrue );
+ twoLineItemVisualizer->SetFocusable( ETrue );
+
+ twoLineItemVisualizer->SetTextBold( EFalse );
+
+ TRgb normalTextColor = iAppUi->LayoutHandler()->ListNormalStateTextSkinColor();
+ if ( aItem->IsReadOnly() )
+ {
+ normalTextColor = iAppUi->LayoutHandler()->ComposerDimmedTextColor();
+ }
+ TRgb focusedTextColor = iAppUi->LayoutHandler()->ListFocusedStateTextSkinColor();
+ twoLineItemVisualizer->SetNormalStateTextColor( normalTextColor );
+ twoLineItemVisualizer->SetFocusedStateTextColor( focusedTextColor );
+
+ // Ensure the parent node of the item to be added is visible and expanded.
+ TFsTreeItemId parentNodeId = aItem->IsRemote() ? iRemoteNode : iLocalNode;
+ if ( iAttachmentsList->ItemVisualizer(parentNodeId).IsHidden() )
+ {
+ // Unhiding a node is a relatively heavy-weight operation. Thus,
+ // we need to ensure it's not called in vain.
+ iAttachmentsTreeListVisualizer->UnhideItemL( parentNodeId );
+ }
+ iAttachmentsList->ExpandNodeL( parentNodeId );
+
+ // insert item and catch id returned
+ itemId = iAttachmentsList->InsertItemL(
+ *twoLineItemData,
+ *twoLineItemVisualizer,
+ parentNodeId );
+
+ // set list item id to model item
+ aItem->SetItemId( itemId );
+ return itemId;
+ }
+
+// ---------------------------------------------------------------------------
+// RemoveItemByIndexL
+// Removes item by given index from list
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiSendAttachmentsListModel::RemoveItemByIndexL( const TInt aIndex )
+ {
+ FUNC_LOG;
+ if ( aIndex >= 0 && aIndex < Count() )
+ {
+ CFSEmailUiSendAttachmentsListModelItem* item =
+ static_cast( Item(aIndex) );
+ TFsTreeItemId deletedItemId = item->ItemId();
+
+ // remove attachment from mail message
+ CNcsComposeView* composeView =
+ static_cast( iAppUi->View( MailEditorId ) );
+
+ if ( composeView->NewMessage() )
+ {
+ // compose view is open, so remove attachment there
+ composeView->NewMessage()->RemoveChildPartL(
+ item->MailMsgPartId() );
+ if ( iItems.Count() == 1 )
+ {
+ composeView->NewMessage()->ResetFlag( EFSMsgFlag_Attachments );
+ }
+ }
+ else
+ {
+ CFSEmailUiSendAttachmentsListVisualiser* parentView =
+ static_cast(
+ iAppUi->View( SendAttachmentMngrViewId ) );
+
+ // Open message from framework and delete attachment
+ CFSMailClient* mailClient = iAppUi->GetMailClient(); // not owned
+ CFSMailMessage* msg = mailClient->GetMessageByUidL(
+ parentView->EditorParams().iMailboxId,
+ parentView->EditorParams().iFolderId,
+ parentView->EditorParams().iMsgId,
+ EFSMsgDataStructure );
+ CleanupStack::PushL( msg );
+ msg->RemoveChildPartL( item->MailMsgPartId() );
+ msg->ResetFlag( EFSMsgFlag_Attachments );
+ msg->SaveMessageL();
+ CleanupStack::PopAndDestroy( msg );
+ }
+
+ // Remove attachment item from model
+ RemoveAndDestroy( aIndex );
+
+ // Remove attachment item from tree list if present
+ if ( deletedItemId != KFsTreeNoneID )
+ {
+ iAttachmentsList->RemoveL( deletedItemId );
+
+ // Hide parent node of the removed item if it just became empty
+ if ( iAttachmentsList->IsEmpty(iLocalNode) &&
+ !iAttachmentsList->ItemVisualizer(iLocalNode).IsHidden() )
+ {
+ iAttachmentsTreeListVisualizer->HideItemL( iLocalNode );
+ }
+ if ( iAttachmentsList->IsEmpty(iRemoteNode) &&
+ !iAttachmentsList->ItemVisualizer(iRemoteNode).IsHidden() )
+ {
+ iAttachmentsTreeListVisualizer->HideItemL( iRemoteNode );
+ }
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// RemoveAllAttachmentsL
+// Removes all attachment items from the model, list, and message
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiSendAttachmentsListModel::RemoveAllAttachmentsL()
+ {
+ FUNC_LOG;
+ CNcsComposeView* composeView =
+ static_cast( iAppUi->View(MailEditorId) );
+ CFSMailMessage* msg = composeView->NewMessage();
+
+ if ( !msg )
+ {
+ // Open message from framework
+ CFSEmailUiSendAttachmentsListVisualiser* attListView =
+ static_cast(
+ iAppUi->View( SendAttachmentMngrViewId ) );
+ CFSMailClient* mailClient = iAppUi->GetMailClient(); // not owned
+ msg = mailClient->GetMessageByUidL(
+ attListView->EditorParams().iMailboxId,
+ attListView->EditorParams().iFolderId,
+ attListView->EditorParams().iMsgId,
+ EFSMsgDataStructure );
+ CleanupStack::PushL( msg );
+ }
+
+ // remove attachments from mail message
+ for ( TInt i = Count()-1 ; i >= 0 ; --i )
+ {
+ CFSEmailUiSendAttachmentsListModelItem* item =
+ static_cast( Item(i) );
+
+ TRAPD( err, msg->RemoveChildPartL( item->MailMsgPartId() ) );
+ // Remove attachment item from model if message part was succesfully removed
+ if ( !err )
+ {
+ RemoveAndDestroy( i );
+ }
+ }
+ msg->ResetFlag( EFSMsgFlag_Attachments );
+ msg->SaveMessageL();
+
+ // Delete msg if we own it
+ if ( !composeView->NewMessage() )
+ {
+ CleanupStack::PopAndDestroy( msg );
+ }
+
+ // Update the tree list to match the model.
+ ReFreshListL();
+ }
+
+// ---------------------------------------------------------------------------
+// HighlightedIndex
+// Returns currenlty higlighted index from list
+// ---------------------------------------------------------------------------
+//
+TInt CFSEmailUiSendAttachmentsListModel::HighlightedIndex()
+ {
+ FUNC_LOG;
+ TInt ret( KErrNotFound );
+
+ TFsTreeItemId focusedId = iAttachmentsList->FocusedItem();
+ // Map id to the index in model
+
+ for ( TInt i=0; i < iItems.Count(); ++i )
+ {
+ if ( focusedId == iItems[i]->ItemId() )
+ {
+ ret = i;
+ break;
+ }
+ }
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// AttachmentList
+// Returns pointer to attachment list
+// ---------------------------------------------------------------------------
+//
+CFsTreeList* CFSEmailUiSendAttachmentsListModel::AttachmentList()
+ {
+ FUNC_LOG;
+ return iAttachmentsList;
+ }
+
+// ---------------------------------------------------------------------------
+// TotalAttachmentSize
+//
+// Retuns sum of all attachments sizes in kB from the model
+// ---------------------------------------------------------------------------
+//
+TInt CFSEmailUiSendAttachmentsListModel::TotalAttachmentSize()
+ {
+ FUNC_LOG;
+ CFSEmailUiSendAttachmentsListModelItem* fileItem;
+ TInt totalSize = 0;
+ TInt count = Count();
+
+ for ( TInt i=0; i < count; ++i )
+ {
+ fileItem = static_cast( Item( i ) );
+ totalSize += fileItem->FileSize();
+ }
+ return totalSize;
+ }
+
+// ---------------------------------------------------------------------------
+// InitAttachmentListL
+//
+// Creates new instance of attachment tree list
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiSendAttachmentsListModel::InitAttachmentListL()
+ {
+ FUNC_LOG;
+
+ if ( iAttachmentsList == NULL )
+ {
+
+ /*TRect screenRect;
+ AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EScreen, screenRect );
+ iListLayout = CAlfDeckLayout::AddNewL( *iControl );
+ iListLayout->SetSize( TSize( screenRect.Width(), screenRect.Height()) );*/
+
+ TRect screenRect;
+ AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, screenRect );
+ iListLayout = CAlfDeckLayout::AddNewL( *iControl );
+ iListLayout->SetSize( screenRect.Size() );
+
+ // Create attachments list tree list component
+ iAttachmentsTreeListVisualizer = CFsTreeVisualizerBase::NewL(
+ iControl,
+ *iListLayout );
+ iAttachmentsTreeListVisualizer->SetItemExpansionDelay( KListItemExpansionDelay );
+ // S60 skin support
+ //iAttachmentsTreeListVisualizer->SetBackgroundTextureL(
+ // iAppUi->FsTextureManager()->TextureByIndex( EBackgroundTextureMailList ) );
+ //
+ iAttachmentsTreeListVisualizer->SetMenuIcon(
+ iAppUi->FsTextureManager()->TextureByIndex( EListControlMenuIcon ) );
+ // Set page up and page down keys
+ iAttachmentsTreeListVisualizer->AddCustomPageUpKey( EStdKeyPageUp );
+ iAttachmentsTreeListVisualizer->AddCustomPageDownKey( EStdKeyPageDown );
+
+ // create list
+ iAttachmentsList = CFsTreeList::NewL( *iAttachmentsTreeListVisualizer, *iEnv );
+ iAttachmentsList->SetScrollbarVisibilityL( EFsScrollbarAuto );
+ iAttachmentsList->SetMarkTypeL( CFsTreeList::EFsTreeListMultiMarkable );
+ iAttachmentsList->SetLoopingType( EFsTreeListLoopingDisabled );
+ iAttachmentsList->SetIndentationL( 0 );
+ iAttachmentsList->AddObserverL( *this );
+ iAppUi->LayoutHandler()->SetListMarqueeBehaviour( iAttachmentsList );
+
+ CreateListSkeletonL();
+ }
+
+ }
+
+// touch
+
+// ---------------------------------------------------------------------------
+// TreeListEventL
+//
+// ---------------------------------------------------------------------------
+//
+
+void CFSEmailUiSendAttachmentsListModel::TreeListEventL(
+ const TFsTreeListEvent aEvent,
+ const TFsTreeItemId /*aId*/,
+ const TPoint& /*aPoint*/ )
+ {
+ FUNC_LOG;
+
+ CFSEmailUiSendAttachmentsListModelItem* item = 0;
+
+ switch(aEvent)
+ {
+ case MFsTreeListObserver::EFsTreeListItemTouchAction:
+ DoHandleActionL();
+ break;
+ case MFsTreeListObserver::EFsTreeListItemTouchLongTap:
+ item = GetSelectedItem();
+ if(NULL != item)
+ iControl->ShowActionMenuL( item );
+ break;
+ case MFsTreeListObserver::EFsTreeListItemTouchFocused:
+ iControl->SetMskL();
+ break;
+ default:
+ //Just ignore rest of events
+ break;
+ }
+
+ }
+
+// ---------------------------------------------------------------------------
+// Handles action for focused item.
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiSendAttachmentsListModel::HandleActionL()
+ {
+ FUNC_LOG;
+ DoHandleActionL();
+ }
+
+// ---------------------------------------------------------------------------
+// CFSEmailUiSendAttachmentsListModel::DoHandleActionL
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiSendAttachmentsListModel::DoHandleActionL( )
+ {
+ FUNC_LOG;
+
+ TFsTreeItemId id = iAttachmentsList->FocusedItem();
+
+ //Expand / Collapse
+ if ( iAttachmentsList->IsNode(id) )
+ {
+ if ( iAttachmentsList->IsExpanded(id) )
+ {
+ CollapseL();
+ }
+ else
+ {
+ ExpandL();
+ }
+ }
+ else //Open
+ {
+ iControl->OpenHighlightedFileL();
+ }
+
+ iControl->SetMskL();
+ }
+
+//
+
+
+
+
+// ---------------------------------------------------------------------------
+// HasRemoteAttachments
+// ---------------------------------------------------------------------------
+//
+TBool CFSEmailUiSendAttachmentsListModel::HasRemoteAttachments()
+ {
+ FUNC_LOG;
+ // remote files have no file path within local system
+ for ( TInt i=0; iIsRemote() )
+ {
+ return ETrue;
+ }
+ }
+ return EFalse;
+ }
+
+// ---------------------------------------------------------------------------
+// HasReadOnlyAttachments
+// ---------------------------------------------------------------------------
+//
+TBool CFSEmailUiSendAttachmentsListModel::HasReadOnlyAttachments()
+ {
+ FUNC_LOG;
+ // remote files have no file path within local system
+ for ( TInt i=0; iIsReadOnly() )
+ {
+ return ETrue;
+ }
+ }
+ return EFalse;
+ }
+
+// ---------------------------------------------------------------------------
+// GetSelectedItem
+// ---------------------------------------------------------------------------
+//
+CFSEmailUiSendAttachmentsListModelItem* CFSEmailUiSendAttachmentsListModel::GetSelectedItem()
+ {
+ FUNC_LOG;
+ TFsTreeItemId nodeId = iAttachmentsList->FocusedItem();
+ //
+ if ( nodeId == iLocalNode ||
+ nodeId == iRemoteNode ||
+ nodeId == KFsTreeNoneID )
+ //
+ {
+ return NULL;
+ }
+ else
+ {
+ return GetItemByNodeId( nodeId );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// GetItemByNodeId
+// ---------------------------------------------------------------------------
+//
+CFSEmailUiSendAttachmentsListModelItem* CFSEmailUiSendAttachmentsListModel::GetItemByNodeId( TFsTreeItemId aNodeId )
+ {
+ FUNC_LOG;
+ for ( TInt i=0; iItemId() == aNodeId )
+ {
+ return iItems[i];
+ }
+ }
+ return NULL;
+ }
+
+TBool CFSEmailUiSendAttachmentsListModel::CanSelectPreviousItem()
+ {
+ FUNC_LOG;
+ return iAttachmentsList->FocusedItem() != iLocalNode;
+ }
+
+// ---------------------------------------------------------------------------
+// Moves the focus to the topmost item
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiSendAttachmentsListModel::GoToTopL()
+ {
+ FUNC_LOG;
+ // Focus first visible focusable item.
+ TFsTreeItemId topId = KErrNotFound;
+
+ const TInt count = iAttachmentsList->CountChildren( KFsTreeRootID );
+ for ( TInt index = 0; index < count && topId == KErrNotFound; ++index )
+ {
+ TFsTreeItemId id =iAttachmentsList->Child( KFsTreeRootID, index );
+ if ( !iAttachmentsList->ItemVisualizer( id ).IsHidden() )
+ {
+ topId = id;
+ }
+ }
+
+ if ( topId != KErrNotFound )
+ {
+ iAttachmentsTreeListVisualizer->SetFocusedItemL( topId );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Moves the focus to the bottommost item
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiSendAttachmentsListModel::GoToBottomL()
+ {
+ FUNC_LOG;
+ if ( Count() )
+ {
+ TInt topLevelCount = iAttachmentsList->CountChildren( KFsTreeRootID );
+ if ( topLevelCount )
+ {
+ // Get last visible top level item
+ TFsTreeItemId bottomId = KErrNotFound;
+ TInt index = topLevelCount - 1;
+ do
+ {
+ bottomId = iAttachmentsList->Child( KFsTreeRootID, index );
+ index--;
+ }
+ while ( iAttachmentsList->ItemVisualizer(bottomId).IsHidden() &&
+ index >= 0 );
+
+ if ( iAttachmentsList->IsNode(bottomId) )
+ {
+ TInt childCount = iAttachmentsList->CountChildren(bottomId);
+ if ( childCount && iAttachmentsList->IsExpanded(bottomId) )
+ {
+ // Focus the last child of the bottom node if the node is expanded.
+ bottomId = iAttachmentsList->Child( bottomId, childCount-1 );
+ }
+ }
+ iAttachmentsTreeListVisualizer->SetFocusedItemL( bottomId );
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Collapse nodes
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiSendAttachmentsListModel::CollapseL()
+ {
+ FUNC_LOG;
+ TFsTreeItemId focId1 = iAttachmentsList->FocusedItem();
+ iAttachmentsList->CollapseNodeL(focId1);
+ }
+// ---------------------------------------------------------------------------
+// Expands nodes
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiSendAttachmentsListModel::ExpandL()
+ {
+ FUNC_LOG;
+ TFsTreeItemId focId = iAttachmentsList->FocusedItem();
+ iAttachmentsList->ExpandNodeL( focId );
+ }
+// ---------------------------------------------------------------------------
+// Collapses or expands all nodes
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiSendAttachmentsListModel::CollapseExpandAllToggleL()
+ {
+ 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 );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiSendAttachmentsListModel::Clear()
+ {
+ FUNC_LOG;
+ // Remove all children of nodes on the list
+ if ( iAttachmentsList )
+ {
+ TRAP_IGNORE( iAttachmentsList->RemoveChildrenL( iRemoteNode ) );
+ TRAP_IGNORE( iAttachmentsList->RemoveChildrenL( iLocalNode ) );
+ }
+ //
+ iItems.ResetAndDestroy();
+ }
+
+//
+// ---------------------------------------------------------------------------
+// CFSEmailUiSendAttachmentsListModel::GetVisualizer
+// ---------------------------------------------------------------------------
+//
+CFsTreeVisualizerBase* CFSEmailUiSendAttachmentsListModel::GetVisualizer()
+ {
+ FUNC_LOG;
+ return iAttachmentsTreeListVisualizer;
+ }
+//
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CAlfLayout* CFSEmailUiSendAttachmentsListModel::GetParentLayout() const
+ {
+ return iListLayout;
+ }
+
+
+// ---------------------------------------------------------------------------
+// Sets up the title pane
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiSendAttachmentsListModel::SetupTitlePaneTextL()
+ {
+ FUNC_LOG;
+ HBufC* titleText = StringLoader::LoadLC( R_FSE_VIEWER_ATTACHMENTS_VIEW_TITLE );
+ AppUi()->SetTitlePaneTextL( *titleText );
+ CleanupStack::PopAndDestroy( titleText );
+ }
+
+//
+