emailuis/emailui/inc/FreestyleEmailUiMailViewerVisualiser.h
changeset 0 8466d47a6819
child 8 e1b6206813b4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emailuis/emailui/inc/FreestyleEmailUiMailViewerVisualiser.h	Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,496 @@
+/*
+* 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:  FreestyleEmailUi mail viewer visualiser definition
+*
+*/
+
+ 
+#ifndef __FREESTYLEEMAILUI_MAILVIEWERVISUALISER_H__
+#define __FREESTYLEEMAILUI_MAILVIEWERVISUALISER_H__
+
+// SYSTEM INCLUDE FILES    
+#include <e32base.h>
+#include <finditemengine.h> 
+#include <AknNaviDecoratorObserver.h>
+//<cmail>
+#include "fstextviewerobserver.h"
+//#include <aknwaitnotewrapper.h>
+#include <cstack.h>
+#include <AknProgressDialog.h>
+//</cmail>
+//<cmail>
+#include "MFSMailRequestObserver.h"
+#include "mesmricalviewercallback.h"
+#include "mesmricalviewerobserver.h"
+//</cmail>
+
+// INTERNAL INCLUDE FILES
+#include "FreestyleEmailUiViewBase.h"
+#include "FreestyleEmailUiListVisualiser.h"
+#include "FreestyleEmailDownloadInformationMediator.h"
+#include "FreestyleEmailUiConstants.h"
+#include "FreestyleEmailUiControlBarCallback.h"
+#include "FreestyleEmailUiUtilities.h"
+#include "FreestyleEmailUiContactHandlerObserver.h"
+#include "FreestyleEmailUiMailViewerRichText.h"
+
+// FORWARD DECLARATIONS
+class CFSMailMessage;
+class CFreestyleEmailUiAppUi;
+class CFsTextViewer;
+class CFsTextViewerWatermark;
+class CFsSmileyDictionary;
+class CFreestyleEmailUiMailViewerControl;
+class CAiwServiceHandler;
+class CBrowserLauncher;
+class CFSEmailUiStatusIndicator;
+class CFlagSelectionGlobalNoteHandler;
+class CAknGlobalListQuery;
+class CAknGlobalNote;
+class CAknWaitDialog; //<cmail>
+class CAknNavigationDecorator;
+
+// list of different types of action menus to be shown.
+enum TActionMenuType
+	{
+	ENoActionMenuFocused = 0,
+	EFocusOnNumberWithinMessage,
+	EFocusOnHyperLinkWithinMessage,
+	EFocusOnNameInAddressField,
+	EFocusOnEMailInBodyText,
+	EFocusOnAttachmentName,
+	EFocusOnAttachmentsText
+	};
+
+	
+/**
+* CFSEmailUiMailViewerVisualiser implements message viewer view.
+*		It uses FS Generic TV component, which displays rich text with hotspots.
+*		View contains hotspot related action menu handling and many options menu
+*/
+class CFSEmailUiMailViewerVisualiser : public CFsEmailUiViewBase, 
+                                       public MFsTextViewerObserver, 
+                                       public MFSEmailDownloadInformationObserver,
+                                       public MFSMailRequestObserver,
+                                       public MFSEmailUiFolderListCallback, 
+                                       public MProgressDialogCallback, //cmail
+                                       public MFSEmailUiGenericTimerCallback,
+                                       public MFSEmailUiContactHandlerObserver,
+                                       public MESMRIcalViewerCallback,
+                                       public MESMRIcalViewerObserver,
+                                       public MAknNaviDecoratorObserver
+	{
+public: // construction and destruction
+    static CFSEmailUiMailViewerVisualiser* NewL( CAlfEnv& aEnv, CFreestyleEmailUiAppUi& aAppUi, CAlfControlGroup& aMailViewerControlGroup );    
+    static CFSEmailUiMailViewerVisualiser* NewLC( CAlfEnv& aEnv, CFreestyleEmailUiAppUi& aAppUi, CAlfControlGroup& aMailViewerControlGroup );               
+	~CFSEmailUiMailViewerVisualiser();
+	void PrepareForExit();
+
+public: // methods
+ 	CAlfControl* ViewerControl();
+ 	void SetMskL();
+	// Event handling forwarded from control
+	TBool OfferEventL( const TAlfEvent& aEvent );
+	
+	// Handle accept/decline/tentative/remove commands given for meeting request message directly from list UI.
+	void HandleMrCommandL( TInt aCommandId, TFSMailMsgId aMailboxId, TFSMailMsgId aFolderId, TFSMailMsgId aMessageId );
+    
+	void CompletePendingMrCommand();
+	void CancelPendingMrCommandL();
+  
+	// Helper funcitons to get viewed message ID and Folder id
+	TFSMailMsgId ViewedMessageFolderId();
+	TFSMailMsgId ViewedMessageId();	
+	
+	// Called from global flag selection dialog
+	void FlagselectionCompleteL( TInt aSelection );
+	
+    void HandleMailBoxEventL( TFSMailEvent aEvent, TFSMailMsgId aMailbox,
+        TAny* aParam1, TAny* aParam2, TAny* aParam3 );
+
+public: // from CFsEmailUiViewBase
+    void DynInitMenuPaneL(TInt aResourceId, CEikMenuPane* aMenuPane);
+    void HandleCommandL( TInt aCommand );
+
+    TUid Id() const;               
+
+    void HandleDynamicVariantSwitchL( CFsEmailUiViewBase::TDynamicSwitchType aType );
+    void HandleDynamicVariantSwitchOnBackgroundL( CFsEmailUiViewBase::TDynamicSwitchType aType );
+    void HandleForegroundEventL();
+
+protected: // from CFsEmailUiViewBase
+    /*void DoDoActivateL( const TVwsViewId& aPrevViewId,
+                        TUid aCustomMessageId,
+                        const TDesC8& aCustomMessage );*/
+    void ChildDoDeactivate();
+    void ActivateControlGroup( TInt aDelay = 0 );
+    void GetParentLayoutsL( RPointerArray<CAlfVisual>& aLayoutArray ) const;
+    void NavigateBackL();
+
+public: // from MFsTextViewerObserver
+    void HandleTextViewerEventL( TFsTextViewerEvent aEvent );
+    
+public : // from MFSEmailDownloadInformationObserver
+    void RequestResponseL( const TFSProgress& aEvent, const TPartData& aPart );
+
+public : // for MFSMailRequestObserver
+    void RequestResponseL( TFSProgress aEvent, TInt aRequestId );
+
+public: // from MFSEmailUiFolderListCallback
+    void FolderSelectedL( TFSMailMsgId aSelectedFolderId,
+                          TFSEmailUiCtrlBarResponse aResponse );         
+
+public: // from MAknBackgroundProcess
+    //<cmail> we are using different wait note
+    //void StepL();
+	//TBool IsProcessDone() const;
+	//void ProcessFinished();
+	//void DialogDismissedL( TInt /*aButtonId*/ ); 
+	//TInt CycleError( TInt aError );
+
+    // from MProgressDialogCallback
+    void DialogDismissedL( TInt aButtonId);
+    //</cmail>
+
+public: // from MFSEmailUiGenericTimerCallback
+    void TimerEventL( CFSEmailUiGenericTimer* aTriggeredTimer );
+
+public: // from MFSEmailUiContactHandlerObserver
+    void OperationCompleteL( TContactHandlerCmd aCmd,
+        const RPointerArray<CFSEmailUiClsItem>& aContacts );
+    void OperationErrorL( TContactHandlerCmd, TInt aError );
+
+public: // from MESMRIcalViewerCallback
+    void ProcessAsyncCommandL( TESMRIcalViewerOperationType aCommandId,	const CFSMailMessage& aMessage, MESMRIcalViewerObserver* aObserver = NULL );   
+	void ProcessSyncCommandL( TESMRIcalViewerOperationType aCommandId, const CFSMailMessage& aMessage );   
+    TBool CanProcessCommand( TESMRIcalViewerOperationType aCommandId  ) const;   
+       
+public: // from MESMRIcalViewerObserver
+    void OperationCompleted( TIcalViewerOperationResult aResult );        
+    void OperationError( TIcalViewerOperationResult aResult );     
+
+public: // from MAknNaviDecoratorObserver
+    
+    /**
+     * Called by navigationDecorator if navi arrows (left/right) have been pressed
+     * @aParam aEventID specifies a tapping of either left or right arrow
+     */
+    void HandleNaviDecoratorEventL( TInt aEventID );
+
+// <cmail> Toolbar    
+private: // from
+    
+    /**
+     * @see CFsEmailUiViewBase::ChildDoActivateL
+     */
+    void ChildDoActivateL( const TVwsViewId& aPrevViewId,
+            TUid aCustomMessageId,
+            const TDesC8& aCustomMessage );
+    
+    /**
+     *  @see CFsEmailUiViewBase::OfferToolbarEventL
+     */
+    void OfferToolbarEventL( TInt aCommand );
+
+    /**
+     * @see CFsEmailUiViewBase::ToolbarResourceId
+     */
+    TInt ToolbarResourceId() const;
+// </cmail> Toolbar 
+        
+private: // methods
+
+	// Class constructing
+	CFSEmailUiMailViewerVisualiser( CAlfEnv& aEnv, CFreestyleEmailUiAppUi& aAppUi,
+									 CAlfControlGroup& aMailViewerControlGroup );
+	void ConstructL();
+
+	// Constructing & refreshing the view
+	void AddBackgroundPicturesL();
+	void ClearMailViewer();
+	void UpdateMailViewerL();
+    void RefreshL( TBool aFirstStart = EFalse );
+    // Callback function to encapsulate actions which are deferred form RefreshL() to 
+    // make it complete faster
+    static TInt DoPostRefresh( TAny* aSelfPtr );
+    void PostRefreshL();
+	void SetActionButtonIconAndHighLight();
+	void CheckMessageStructureL();
+	void UpdateDownloadIndicatorL( TFSProgress::TFSProgressStatus aStatus = TFSProgress::EFSStatus_Waiting );
+	
+	// Update our message pointer and change observed message
+	void UpdateMessagePtrL( TFSMailMsgId aNewMailbox, TFSMailMsgId aNewFolder, TFSMailMsgId aNewMessage );
+	void UpdateMessagePtr( CFSMailMessage* aNewMessagePtr );
+	    
+    // Message stack handling. Ownership of message is transferred when succesful.
+    void PushMessageL( CFSMailMessage* aMessage, TBool aIsEmbedded );
+    CFSMailMessage* PopMessage();
+    void EraseMessageStack();
+	// Html viewer opening
+	void LaunchHtmlViewerL();
+	
+	// Changing message states
+ 	void SetMessageFollowupFlagL(); 
+ 	void ChangeMsgReadStatusL( TBool aRead, TBool aCmdFromMrui );
+	
+	// For deleting current mail
+	// Return value indicating whether message was deleted
+	TBool DeleteMailL( CFSMailMessage& aMessagePtr, TBool aReturnPreviousView, TBool aDisableNote = EFalse );
+
+	// Options menu dimm checking
+	TBool ShowActionsMenuInOptionsL() const;
+	TBool ShowDownloadManagerMenuInOptions() const;
+	TBool ShowNextMessageMenuInOptions() const;
+	TBool ShowPreviousMessageMenuInOptions() const;
+	void ShowNextMessageL();
+	void ShowPreviousMessageL();
+
+	// Action menu lauching and selection handling
+	void LaunchActionMenuL();
+	void CreateActionMenuItemsL( TActionMenuType aActionMenuType );
+	void HandleActionMenuCommandL( TActionMenuCustomItemId aSelectedActionMenuItem, TActionMenuType aActionMenuType );
+
+
+	// Action menu command handling
+	void OpenLinkInIntranetL( TBool aMenuSelection = ETrue );
+ 	void OpenHotSpotUrlInBrowserL( CFindItemEngine::SFoundItem& aHotSpot );
+ 	void CallToBodyHotSpotNumberL( CFindItemEngine::SFoundItem& aHotSpot );
+ 	void ComposeMailL();
+	void WriteEmailToHotSpotAddressL( CFindItemEngine::SFoundItem& aHotSpot );
+
+	void OpenContactDetailsL();
+
+	void LaunchRemoteLookupL( const TDesC& aHotspotText ) const;
+	void AddToBookmarksL( const CFindItemEngine::SFoundItem& aBodyHotspotData ) const;
+	
+	void CallHotSpotAddressL();
+	void CreateMessageL() const;
+
+	TBool IsCopyToClipBoardAvailableL() const;
+	void CopyCurrentHotspotToClipBoardL() const;
+	
+	// Attachment handling
+	TBool ShowOpenAttachmentOptionL();
+	TBool ShowSaveAttachmentOptionL();
+	TBool ShowDownloadOptionL();
+	TBool ShowMskDownloadOptionL();
+	TBool ShowCancelDownloadOption();
+	void OpenAttachmentL();
+	void OpenAttachmentsViewL();
+	void StartDowloadingAttachmentsL();
+	void CancelDowloadingAttachmentsL();
+	void SaveAllAttachmentsL();
+	void RemoveFetchedAttachmentL();
+
+	// Helper method for creating Part data needed when calling to download mediator
+	TPartData MailData();
+
+	// Content fecthing
+
+	// list of different types of content
+	enum TFetchedContentType
+		{
+		EMessagePlainTextBodyPart = 0,
+		EMessageHtmlBodyPart,
+		EMessageStructure
+		};
+	TBool StartFetchingBodyAfterOpeningL() const;
+	TBool MessageStructureKnown( CFSMailMessage& aMsg ) const;
+	TBool MessagePartFullyFetchedL( TFetchedContentType aFetchedContentType ) const;
+	void StartFetchingMessagePartL( CFSMailMessage& aMessagePtr, 	
+									TFetchedContentType aFetchedContentType );
+	void StartFetchingMessageStructureL( CFSMailMessage& aMsg );
+	void StartWaitedFetchingL( TFetchedContentType aFetchedContentType );
+	void StartFetchingRemaininBodyLinesIfAtBottomL();
+	void CancelFetchings();
+	
+	void SaveEmailAsContactL( const TDesC& aEmailAddress );
+	void SavePhoneNumberAsContactL( const TDesC& aPhoneNumber );
+
+	void SetMailboxNameToStatusPaneL();
+	
+	TInt ResolveBodyTextSchemaUrlTypeL( CFindItemEngine::SFoundItem aHotSpot );
+
+	void SetActionMenuIconVisbilityL();
+	
+	void SendEventToAppUiL( TFSMailEvent aEventType );
+	
+    void DoFirstStartL();
+	
+    /**
+     * Initiates the hotspot action, if currently focused header hotspot has
+	 * some direct hotspot action defined (not opening action menu). Returns
+	 * ETrue if direct action specified (and initiated) for the focused
+	 * hotspot, otherwise EFalse.
+     */
+    TBool HandleHeaderHotspotActionL( TViewerHeadingHotspotType aHotspotType );
+	
+    /**
+     * Handles updating of navigation pane content
+     * (navi arrows + priority and followup icons)
+     * 
+     * @param aForESMR Whether the navi pane update is for meeting
+     *                 request or not.
+     */
+    void UpdateNaviPaneL( TBool aForESMR = EFalse );
+    
+    /**
+     * Sets mailviewer's navipane to background
+     */
+    void HideNaviPane();
+    
+private: // Methods for moving message
+
+    // Start moving current visible message to different folder
+    // Return EFalse if moving is not a supported function 
+    TBool OpenFolderListForMessageMovingL();
+
+    // Message is moved and viewer is closed asynchronously after selecting a folder
+    // from the move to folder dialog. This is necessary because view swithching is asynchronous.
+    static TInt MoveToFolderAndExitL( TAny* aMailViewerVisualiser );
+
+private: // data for moving message to different folder action
+
+    TBool iMoveToFolderOngoing;
+    TBool iMovingMeetingRequest;
+    CAsyncCallBack* iAsyncCallback;
+    TFSMailMsgId iMoveDestinationFolder;
+
+private: // data related to fetching
+
+	TBool iFetchingMessageStructure;
+	TInt iCurrentStructureFetchRequestId;
+
+	TBool iFetchingPlainTextMessageBody;
+	TInt iCurrentPlainTextBodyFetchRequestId;
+
+	TBool iFetchingHtmlMessageBody;
+	TInt iCurrentHtmlBodyFetchRequestId;
+
+	TFetchedContentType iStartAsyncFetchType;
+
+    // Wait note stuff
+    //<cmail>
+    //CAknWaitNoteWrapper* iAsyncWaitNote;
+    CAknWaitDialog* iWaitDialog;
+    CAknWaitDialog* iWaitDialogOpening;
+    TBool iDialogNotDismissed;
+    //</cmail>
+	TBool iFetchingAlready;
+	TBool iAsyncProcessComplete;
+
+private: // data for fetching timer
+	
+	CFSEmailUiGenericTimer* iFetchingAnimationTimer;
+
+private: // other class data
+
+    // Handle to ALF environment
+	CAlfEnv& iEnv;
+
+	// Stack of open messages. Messages are owned by this stack. 
+    CStack<CFSMailMessage, ETrue>* iOpenMessages;
+    // Stack of embedded messages. Message are NOT owned by this stack. Similar to iOpenMessages
+    // but has NULL pointer in slots which correspond non-embedded messages.
+    CStack<CFSMailMessage, EFalse>* iEmbeddedMessages;
+	// Mail message pointer, changes always in do activate
+	CFSMailMessage* iMessage;
+
+	// Mail box where the iMessage object is.
+	CFSMailBox*	iMailBox;
+
+	// AlfControl for capturing right and left navigation key events
+	CFreestyleEmailUiMailViewerControl*	iControl;
+	
+    // Text viewer and control object
+    CFsTextViewer* iTextViewer;
+    
+    // Pointer to TV component control
+    CAlfControl* iTextViewerControl; // not owned
+	
+	// Rich text for the view. 
+	CFSEmailUiMailViewerRichText* iViewerRichText;
+
+	// Basic smileys for the 
+	CFsSmileyDictionary* iSmDictionary;
+
+	// For opening the intranet app
+	CAiwServiceHandler* iIBServiceHandler;
+
+	// Boolean to indicate that layout has changed while some other view was active
+	TBool iLayoutChangedWhileNotActive;
+	
+	// Temporary mail address for opening editor
+	CFSMailAddress* iNewMailTempAddress;
+	
+	// Meeting request observer stuff.
+	// Pointer to observer to inform, not owned.
+	MESMRIcalViewerObserver* iMrObserverToInform;
+	MESMRIcalViewerObserver::TIcalViewerOperationResult iOpResult;
+	TBool iMrUiActive;
+	
+	// Flag to indicate that we are moving into next or previous message
+	TBool iNextOrPevMessageSelected;
+	
+	CAlfControlGroup* iDownloadProgressControlGroup; // owned by AlfEnv
+	CFSEmailUiStatusIndicator* iDownloadProgressIndicator;
+
+	// Flag selection handler active object for global note
+	CFlagSelectionGlobalNoteHandler* iFlagSelectionHanler;	
+	
+    TBool iFirstStartCompleted;
+    TBool iShowMskDownloadOption;
+    
+    // Flag to indicate we are viewing an embedded message. Many UI options need to be hidden in that case.
+    TBool iEmbeddedMessageMode;
+    
+    //<cmail>
+    // Message pointer to a deleted mail from Mrui
+    TFSMailMsgId iDeletedMessageFromMrui;
+    //</cmail>
+	};
+
+
+////////////////////////////////////////
+// FLAG selection dialog global note handler
+/////////////////////////////////////////
+class CFlagSelectionGlobalNoteHandler : public CActive
+    {
+    public:  // Constructors and destructor
+        static CFlagSelectionGlobalNoteHandler* NewL( CFSEmailUiMailViewerVisualiser& aViewerVisualiser );
+        virtual ~CFlagSelectionGlobalNoteHandler();
+        void Cancel();       
+        void LaunchFlagListQueryDialogL();       
+            
+    private: 
+    
+        void RunL();       
+        void DoCancel();       
+        TInt RunError( TInt aError );
+        
+    private:
+        CFlagSelectionGlobalNoteHandler(  CFSEmailUiMailViewerVisualiser& aVoIPDialogObserver );
+
+        
+    private:      
+	    CFSEmailUiMailViewerVisualiser& iViewerVisualiser;
+        CAknGlobalListQuery* iGlobalFlagQuery;
+        HBufC* iPrompt;
+        TInt iSelection;
+    };
+
+
+#endif //__FREESTYLEEMAILUI_MAILVIEWERVISUALISER_H__
+
+