diff -r 000000000000 -r 8466d47a6819 emailuis/emailui/inc/FreestyleEmailUiMailViewerVisualiser.h --- /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 +#include +#include +// +#include "fstextviewerobserver.h" +//#include +#include +#include +// +// +#include "MFSMailRequestObserver.h" +#include "mesmricalviewercallback.h" +#include "mesmricalviewerobserver.h" +// + +// 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; // +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& 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 + // 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); + // + +public: // from MFSEmailUiGenericTimerCallback + void TimerEventL( CFSEmailUiGenericTimer* aTriggeredTimer ); + +public: // from MFSEmailUiContactHandlerObserver + void OperationCompleteL( TContactHandlerCmd aCmd, + const RPointerArray& 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 ); + +// 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; +// 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 + // + //CAknWaitNoteWrapper* iAsyncWaitNote; + CAknWaitDialog* iWaitDialog; + CAknWaitDialog* iWaitDialogOpening; + TBool iDialogNotDismissed; + // + 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* 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* 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; + + // + // Message pointer to a deleted mail from Mrui + TFSMailMsgId iDeletedMessageFromMrui; + // + }; + + +//////////////////////////////////////// +// 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__ + +