emailuis/emailui/src/FreestyleEmailUiSendAttachmentsListControl.cpp
changeset 0 8466d47a6819
child 8 e1b6206813b4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emailuis/emailui/src/FreestyleEmailUiSendAttachmentsListControl.cpp	Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,640 @@
+/*
+* 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 control for the attachment list view
+*
+*/
+
+
+// SYSTEM INCLUDES
+#include "emailtrace.h"
+#include <pathinfo.h>
+//<cmail>
+#include "fstreelist.h" // for attachment visual list
+#include <DocumentHandler.h> // for file opening
+#include <apmstd.h> // for TDataType
+#include <gulicon.h> // icons
+#include <AknIconUtils.h> // icons
+#include <AknWaitDialog.h>
+#include <freestyleemailui.mbg>
+#include <FreestyleEmailUi.rsg>
+#include <CommonContentPolicy.h>
+#include <aknnotewrappers.h> 
+#include <StringLoader.h>
+#include "CFSMailClient.h"
+#include <CVPbkContactManager.h> // Virtual phonebook contact manager
+// <cmail> SF
+#include <alf/alfevent.h>
+// </cmail>
+
+// for action menu
+#include "cfsccontactactionservice.h"
+#include "cfsccontactactionmenu.h"
+#include "mfsccontactactionmenumodel.h"
+#include "cfsccontactactionmenuitem.h"
+#include "fsccontactactionmenuuids.hrh"
+#include "fsccontactactionmenudefines.h"
+//</cmail>
+
+// LOCAL INCLUDES
+#include "FreestyleEmailUiSendAttachmentsListControl.h"
+#include "FreestyleEmailUiSendAttachmentsListVisualiser.h"
+#include "FreestyleEmailUiSendAttachmentsListModel.h"
+#include "FreestyleEmailUiAppui.h"
+#include "FreestyleEmailUiTextureManager.h"
+#include "FreestyleEmailUiAttachmentsListModel.h"
+#include "FreestyleEmailUiUtilities.h"
+#include "FreestyleEmailUiShortcutBinding.h"
+#include "ncscomposeview.h"
+
+
+// CONSTANTS
+
+// CLASS IMPLEMENTATION
+
+// ---------------------------------------------------------------------------
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CFreestyleEmailUiSendAttachmentsListControl* CFreestyleEmailUiSendAttachmentsListControl::NewL(
+        CAlfEnv& aEnv,
+		CFSEmailUiSendAttachmentsListVisualiser* aVisualiser,
+		CFreestyleEmailUiAppUi* aAppUi )
+    {
+    FUNC_LOG;
+    CFreestyleEmailUiSendAttachmentsListControl* self = 
+    	CFreestyleEmailUiSendAttachmentsListControl::NewLC( aEnv, aVisualiser, aAppUi );
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CFreestyleEmailUiSendAttachmentsListControl* CFreestyleEmailUiSendAttachmentsListControl::NewLC(
+        CAlfEnv& aEnv,
+		CFSEmailUiSendAttachmentsListVisualiser* aVisualiser,
+		CFreestyleEmailUiAppUi* aAppUi )
+    {
+    FUNC_LOG;
+    CFreestyleEmailUiSendAttachmentsListControl* self = 
+    	new (ELeave) CFreestyleEmailUiSendAttachmentsListControl( aVisualiser, aAppUi );
+    CleanupStack::PushL(self);
+    self->ConstructL(aEnv);
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+//C++ constructor.
+// ---------------------------------------------------------------------------
+//
+CFreestyleEmailUiSendAttachmentsListControl::CFreestyleEmailUiSendAttachmentsListControl(
+		CFSEmailUiSendAttachmentsListVisualiser* aVisualiser,
+		CFreestyleEmailUiAppUi* aAppUi )
+    : CAlfControl(), 
+	iVisualiser( aVisualiser ),
+	iAppUi( aAppUi )
+    {
+    FUNC_LOG;
+    }
+
+// ---------------------------------------------------------------------------
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+void CFreestyleEmailUiSendAttachmentsListControl::ConstructL( CAlfEnv& aEnv )
+    {
+    FUNC_LOG;
+    CAlfControl::ConstructL( aEnv );
+	iService = CFscContactActionService::NewL( iAppUi->GetVPbkManagerL() );
+    iModel = CFSEmailUiSendAttachmentsListModel::NewL( iAppUi, Env(), this );
+    }
+
+// ---------------------------------------------------------------------------
+// Virtual destructor.
+// ---------------------------------------------------------------------------
+//
+CFreestyleEmailUiSendAttachmentsListControl::~CFreestyleEmailUiSendAttachmentsListControl()
+    {
+    FUNC_LOG;
+	delete iService;
+    }
+
+// <cmail>
+// ---------------------------------------------------------------------------
+// Verify file selection (e.g. DRM)
+// ---------------------------------------------------------------------------
+//
+TBool CFreestyleEmailUiSendAttachmentsListControl::VerifySelectionL( const MDesCArray* /*aSelectedFiles*/ )
+    {
+    return ETrue;
+    }
+// </cmail>
+
+void CFreestyleEmailUiSendAttachmentsListControl::DeleteModel()
+	{
+    FUNC_LOG;
+	delete iModel;
+	iModel = NULL;
+	}
+
+//<cmail> touch
+void CFreestyleEmailUiSendAttachmentsListControl::SetMskL()
+    { 
+    iVisualiser->SetMskL();
+    }
+//</cmail>
+
+// ---------------------------------------------------------------------------
+// OfferEventL
+// called by ALF
+// ---------------------------------------------------------------------------
+//
+TBool CFreestyleEmailUiSendAttachmentsListControl::OfferEventL( const TAlfEvent& aEvent )
+	{
+    FUNC_LOG;
+    TBool result( EFalse );
+    iVisualiser->SetMskL();
+    // handle key 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;
+	            }
+	        }
+
+        switch ( scanCode )
+            {
+            case EStdKeyDevice3:
+            case EStdKeyEnter:
+                {
+                iModel->HandleActionL();
+                result = ETrue;
+                break;
+                }
+	    	case EStdKeyUpArrow:
+	    		{
+	    		// do not highlight header
+	    		if ( !iModel->CanSelectPreviousItem() )
+	    			{
+	    			// Check that this works correctly!
+	    			// If previous item is header, mark the event consumed
+	    			// so that it is not forwarded to list's control.
+	    			result = ETrue;
+	    			//result = iModel->AttachmentList()->TreeControl()->OfferEventL( aEvent );
+	    			}
+	    		break;
+	    		}
+	    	case EStdKeyLeftArrow:
+	    		//hide action menu (automatic)
+	    		break;
+	    	case EStdKeyRightArrow:
+		    	{
+	    		// show action menu when we are on list item
+	    		CFSEmailUiSendAttachmentsListModelItem* item = NULL;
+	    		
+	    		item = iModel->GetSelectedItem();
+	    		
+	    		if ( item )
+	    			{
+	    			ShowActionMenuL( item );
+	    			}
+	    			
+	    		break;
+		    	}
+	    	default :
+	       	    // Check keyboard shortcuts.
+	       	    TInt shortcutCommand = 
+	       	        iAppUi->ShortcutBinding().CommandForShortcutKey( aEvent.KeyEvent(),
+	       	                                                         CFSEmailUiShortcutBinding::EContextSendAttachmentList );
+	       	    if ( shortcutCommand != KErrNotFound )
+	       	        {
+       	            HandleCommandL( shortcutCommand );
+	       	        result = ETrue;
+	       	        }
+	       	    /*
+	       	    else
+	       	        {
+    	    		result = iModel->AttachmentList()->TreeControl()->OfferEventL( aEvent );
+	       	        }
+	       	    */
+	    		break;
+	    	}
+    	}
+    else if (aEvent.IsPointerEvent())
+        {
+        result = iModel->AttachmentList()->TreeControl()->OfferEventL(aEvent);
+        }
+    
+    return result;
+	}
+
+// ---------------------------------------------------------------------------
+// HandleCommandL
+// ---------------------------------------------------------------------------
+//
+void CFreestyleEmailUiSendAttachmentsListControl::HandleCommandL( TInt aCommand )
+	{
+    FUNC_LOG;
+    switch ( aCommand )
+        {
+        case EAknSoftkeyOpen:
+        case ESendAttachmentMenuOpen:
+            OpenHighlightedFileL();
+        break;
+        case EFsEmailUiCmdGoToTop:
+            {
+  		    iModel->GoToTopL();
+            }
+	    break;
+  		case EFsEmailUiCmdGoToBottom:
+  		    {
+  		    iModel->GoToBottomL();
+  		    }
+	    break;
+  		case EFsEmailUiCmdCollapse:
+  		    {
+  		    iModel->CollapseL();
+  		    }
+  		    break;
+   		case EFsEmailUiCmdExpand:
+  		    {
+  		    iModel->ExpandL();
+  		    }
+	    break;
+        case EFsEmailUiCmdActionsCollapseExpandAllToggle:
+            {
+            iModel->CollapseExpandAllToggleL();
+            }
+        break;
+  		default:
+  		    {
+        	if ( iVisualiser ) // Offer aCommand to view
+        		{
+        		return iVisualiser->HandleCommandL( aCommand );
+        		}
+  		    }
+       	break;
+        }
+	}
+
+// ---------------------------------------------------------------------------
+// LoadModelContent
+//
+// Load model content for list
+// ---------------------------------------------------------------------------
+//
+void CFreestyleEmailUiSendAttachmentsListControl::LoadModelContentL()
+	{
+    FUNC_LOG;
+	// Check if saved mail has attachments included
+
+	}
+
+// ---------------------------------------------------------------------------
+// Model
+//
+// return pointer to current item model
+// ---------------------------------------------------------------------------
+//
+CFSEmailUiSendAttachmentsListModel* CFreestyleEmailUiSendAttachmentsListControl::Model()
+{
+    FUNC_LOG;
+	return iModel;
+}
+
+// ---------------------------------------------------------------------------
+// AppendAttachmentToListL
+//
+// Open files selection dialog and append given filename to attachment list
+// ---------------------------------------------------------------------------
+//
+TBool CFreestyleEmailUiSendAttachmentsListControl::AppendAttachmentToListL(MsgAttachmentUtils::TMsgAttachmentFetchType aType)
+	{
+    FUNC_LOG;
+	TBool ret = EFalse;
+	TFileName filePath;
+	// <cmail>
+	TBool fetchOK = EFalse;
+	
+	if (aType != MsgAttachmentUtils::EUnknown)
+	    {
+        CAiwGenericParamList* paramList = CAiwGenericParamList::NewLC();
+                    
+        CDesCArrayFlat* files = new( ELeave ) CDesC16ArrayFlat( 1 );
+        CleanupStack::PushL( files );
+        
+        // MsgAttachmentUtils messes up the display area, save it and set back after the call
+        TRect visibleArea = CAlfEnv::Static()->PrimaryDisplay().VisibleArea();
+        fetchOK = MsgAttachmentUtils::FetchFileL( aType,
+                                                        *files,
+                                                        paramList,
+                                                        EFalse, // disk space checked in VerifySelectionL or CUniEditorInsertOperation, if image scaled/compressed
+                                                        EFalse,
+                                                        this );
+        CAlfEnv::Static()->PrimaryDisplay().SetVisibleArea(visibleArea);
+        
+        if (files->MdcaCount() > 0)
+            {
+            filePath = files->MdcaPoint( 0 );
+            //when the filepath contains the Drive letter (ie. "e:\\") in lower case then RecognizeData of class RApaLsSession fails.
+            //RecognizeData is used by FS framework to detect the content type of the attachment. To fix this possible failure,
+            //we change the drive letter to upper case here.
+            TBuf<1> driveLetter;
+            driveLetter=filePath.Left(1);
+            driveLetter.CopyUC(driveLetter);
+            filePath.Replace(0,1,driveLetter);
+            }
+        CleanupStack::PopAndDestroy(2, paramList);
+	    }
+	else
+	    {
+	    fetchOK = TFsEmailUiUtility::ShowSelectFileDialogL( filePath );
+	    }
+        
+	if ( fetchOK && filePath.Length() > 0 ) // </cmail>
+		{
+        if ( !FileDrmProtectedL( filePath ) )
+			{
+			// add file as a email message part
+	    	CFSMailMessagePart* msgPart = NULL;
+	    	
+	    	CNcsComposeView* composeView = 
+	    		static_cast<CNcsComposeView*>( iAppUi->View(MailEditorId) );
+	    		
+    		TFSMailMsgId nullId;
+	    	if ( composeView->NewMessage() )
+	    		{
+	    		// use composeview NewMessage if available
+				msgPart = composeView->NewMessage()->AddNewAttachmentL( filePath, nullId );
+	    		}
+	    	else
+	    		{
+				// Open message from framework and append attachment
+				CFSMailClient* mailClient = iAppUi->GetMailClient(); // not owned
+				CFSMailMessage* msg = mailClient->GetMessageByUidL( 
+				        iVisualiser->EditorParams().iMailboxId, 
+				        iVisualiser->EditorParams().iFolderId, 
+				        iVisualiser->EditorParams().iMsgId, 
+						EFSMsgDataStructure );
+				CleanupStack::PushL( msg );
+				msgPart = msg->AddNewAttachmentL( filePath, nullId );
+				CleanupStack::PopAndDestroy( msg );
+	    		}
+			CleanupStack::PushL( msgPart );
+			msgPart->SaveL();
+			
+			// append file to list model
+			const TPtrC fileName = TParsePtrC( filePath ).NameAndExt();
+   			TFileType fileType = TFsEmailUiUtility::GetFileType( fileName, msgPart->GetContentType() );
+			AppendFileToModelL( msgPart->GetPartId(), 
+			                    fileName,
+			                    msgPart->ContentSize(), 
+			                    fileType );
+
+			// free resources
+			CleanupStack::PopAndDestroy( msgPart );
+
+		    // add new tree list item and update header content
+			CFSEmailUiSendAttachmentsListModelItem* newItem = 
+			    static_cast<CFSEmailUiSendAttachmentsListModelItem*>( iModel->Item( iModel->Count()-1 ) );
+			iModel->AppendItemToAttachmentListL( newItem );
+			iModel->UpdateHeaderItemTextL();
+			
+			ret = ETrue;
+			}
+		}
+	return ret;
+	}
+
+// ---------------------------------------------------------------------------
+// FileDrmProtectedL
+//
+// Check if file is DRM protected
+// ---------------------------------------------------------------------------
+//
+TBool CFreestyleEmailUiSendAttachmentsListControl::FileDrmProtectedL( RFile& aFile )
+	{
+    FUNC_LOG;
+	TBool isProtected( EFalse );
+	CCommonContentPolicy* ccp = CCommonContentPolicy::NewLC();	
+	isProtected = ccp->IsClosedFileL( aFile );
+	if ( isProtected )
+		{
+		TFsEmailUiUtility::ShowErrorNoteL( R_FS_EMAILUI_SENDATTACHMENTS_ITEM_DRM_PROTECTED_TXT, ETrue );
+		}
+	CleanupStack::PopAndDestroy( ccp );
+	return isProtected;
+	}
+
+// ---------------------------------------------------------------------------
+// FileDrmProtectedL
+// 
+// Check if file is DRM protected
+// ---------------------------------------------------------------------------
+//
+TBool CFreestyleEmailUiSendAttachmentsListControl::FileDrmProtectedL( const TDesC& aFilePath )
+		{
+    TBool isProtected( EFalse );
+		
+    RFile file;
+    TInt err = file.Open( CCoeEnv::Static()->FsSession(), 
+                          aFilePath, 
+                          EFileRead | EFileShareAny );
+    User::LeaveIfError( err );
+    CleanupClosePushL( file );
+    isProtected = FileDrmProtectedL( file );
+    CleanupStack::PopAndDestroy( &file );
+		
+    return isProtected;
+	}
+
+// ---------------------------------------------------------------------------
+// AppendFileToModelL
+//
+// Append given file to attachment list model
+// 
+// ---------------------------------------------------------------------------
+//
+void CFreestyleEmailUiSendAttachmentsListControl::AppendFileToModelL( 
+		const TFSMailMsgId aPartId, 
+        const TDesC& aFileName,
+		TInt aSize,
+        TFileType aFileType /*= EUnidentifiedType*/,
+        TBool aReadOnly /*= EFalse*/,
+        TBool aRemoteFile /*= EFalse*/ )
+	{
+    FUNC_LOG;
+	// add item to model
+	CFSEmailUiSendAttachmentsListModelItem* newItem = 
+		CFSEmailUiSendAttachmentsListModelItem::NewL( 
+		        aFileName, 
+				aSize,
+				aFileType,
+				aRemoteFile,
+				aReadOnly );
+	newItem->SetMailMsgPartId( aPartId );
+	
+	iModel->AppendL( newItem );
+	}
+
+// ---------------------------------------------------------------------------
+// RemoveAttachmentFromListL
+//
+// removes item by given index
+// 	or
+// removes currently higlighted item from attachment list and model
+// ---------------------------------------------------------------------------
+//
+void CFreestyleEmailUiSendAttachmentsListControl::RemoveAttachmentFromListL( 
+		const TInt aIndex )
+	{
+    FUNC_LOG;
+	TInt index = ( aIndex < 0 ? iModel->HighlightedIndex() : aIndex );
+
+	if ( index >= 0 )
+	    {
+	    CFSEmailUiSendAttachmentsListModelItem* item =
+            static_cast<CFSEmailUiSendAttachmentsListModelItem*>( iModel->Item( index ) );
+
+        if ( !item->IsReadOnly() )
+		    {
+            iModel->RemoveItemByIndexL( index );
+	        iModel->UpdateHeaderItemTextL();
+	        }
+    	}
+	}
+
+// ---------------------------------------------------------------------------
+// RemoveAllAttachmentsL
+//
+// removes all items from attachment list and model
+// ---------------------------------------------------------------------------
+//
+void CFreestyleEmailUiSendAttachmentsListControl::RemoveAllAttachmentsL()
+	{
+    FUNC_LOG;
+    TFsEmailUiUtility::ShowWaitNoteL( iWaitNote, R_FSE_WAIT_REMOVING_TEXT, EFalse );
+	iModel->RemoveAllAttachmentsL();
+	iWaitNote->ProcessFinishedL();
+	}
+
+// ---------------------------------------------------------------------------
+// OpenHighlightedFile
+//
+// Opens highklighted list item with its corresponding handler
+// ---------------------------------------------------------------------------
+//
+void CFreestyleEmailUiSendAttachmentsListControl::OpenHighlightedFileL()
+	{
+    FUNC_LOG;
+	TInt index = iModel->HighlightedIndex();
+	if ( index >= 0 )
+	    {
+	    CFSEmailUiSendAttachmentsListModelItem* item =
+            static_cast<CFSEmailUiSendAttachmentsListModelItem*>( iModel->Item( index ) );
+
+        if ( !item->IsRemote() )
+            {
+            // Open message using the IDs
+            TEditorLaunchParams editorParams = iVisualiser->EditorParams();
+            TPartData attachmentPart( editorParams.iMailboxId, 
+                editorParams.iFolderId, 
+                editorParams.iMsgId,
+                item->MailMsgPartId() );
+            TFsEmailUiUtility::OpenAttachmentL( attachmentPart );
+            }
+    	}
+	}
+
+// ---------------------------------------------------------------------------
+// ShowActionMenu
+//
+// Displays action menu and handles selection
+// ---------------------------------------------------------------------------
+//
+void CFreestyleEmailUiSendAttachmentsListControl::ShowActionMenuL( CFSEmailUiSendAttachmentsListModelItem* aItem )
+	{
+    FUNC_LOG;
+	// Remove old items from action menu
+	CFSEmailUiActionMenu::RemoveAllL();
+
+	// Construct item list
+	RFsEActionMenuIdList itemList;
+	CleanupClosePushL( itemList );
+
+	if ( !aItem->IsRemote() )
+	    {
+	    itemList.AppendL( FsEActionAttachmentOpen );
+	    }
+
+	itemList.AppendL( FsEActionAttachmentAdd );
+	
+	if ( !aItem->IsReadOnly() )
+	    {
+	    itemList.AppendL( FsEActionAttachmentRemove );
+	    }
+	
+	if ( iModel->Count() > 1 && !iModel->HasReadOnlyAttachments() )
+	    {
+	    itemList.AppendL( FsEActionAttachmentRemoveAll );         
+	    }
+
+
+	//<cmail> touch        
+    // Execute action list
+    TActionMenuCustomItemId itemId = CFSEmailUiActionMenu::ExecuteL( itemList, EFscCustom, 0, this );
+    //</cmail>
+	CleanupStack::PopAndDestroy( &itemList );
+
+	// Handle action menu selection
+	switch ( itemId )
+	    {
+	    case FsEActionAttachmentOpen:
+	        HandleCommandL( ESendAttachmentMenuOpen );
+	        break;
+	    case FsEActionAttachmentRemove:
+            HandleCommandL( ESendAttachmentMenuRemoveAttachment );
+	        break;
+	    case FsEActionAttachmentRemoveAll:
+            HandleCommandL( ESendAttachmentMenuRemoveAllAttachments );
+	        break;
+	    case FsEActionAttachmentAdd:
+	        HandleCommandL( ESendAttachmentMenuAddAttachment );
+	        break;
+	    default:
+	        break;
+	    }
+	}
+
+// <cmail>
+TPoint CFreestyleEmailUiSendAttachmentsListControl::ActionMenuPosition()
+    {
+    TAlfRealRect focusRect;
+    TFsTreeItemId listItemId = iModel->GetVisualizer()->FocusedItem();    
+    iModel->GetVisualizer()->GetItemDisplayRectTarget(listItemId, focusRect);
+    return focusRect.iTl;
+    }
+// </cmail>
+