diff -r d189ee25cf9d -r 3533d4323edc emailuis/emailui/inc/FreestyleEmailUiMailListVisualiser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailuis/emailui/inc/FreestyleEmailUiMailListVisualiser.h Wed Sep 01 12:28:57 2010 +0100 @@ -0,0 +1,1027 @@ +/* +* 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 double line list visualiser definition +* +*/ + + + +#ifndef __FREESTYLEEMAILUI_MAILLISTVISUALISER_H__ +#define __FREESTYLEEMAILUI_MAILLISTVISUALISER_H__ + +// SYSTEM INCLUDES +#include +// +#include "fscontrolbarobserver.h" +#include "fstreelistobserver.h" +#include "cfsmailcommon.h" +#include "mfsmaileventobserver.h" +#include "fsccontactactionmenudefines.h" +// +#include "FSEmailBuildFlags.h" + +#include +#include + +// INTERNAL INCLUDES +#include "FreestyleEmailUiViewBase.h" +#include "FreestyleEmailUiListVisualiser.h" +#include "FreestyleEmailUiConstants.h" +#include "FreestyleEmailUiControlBarCallback.h" +#include "FreestyleEmailUiUtilities.h" +#include "FreestyleEmailUiContactHandlerObserver.h" +#include "cmailboxstateext.h" + +// FORWARD DECLARATIONS +class CAlfTextVisual; +class CAlfGridLayout; +class CFSEmailUiList; +class CAlfImageVisual; +class CAlfDeckLayout; +class CAlfAnchorLayout; +class CFSEmailUiMailListModelItem; +class CFSEmailUiMailListModel; +class CListModeChanger; +class CFreestyleEmailUiTextureManager; +class CFSMailFolder; +class CFSMailClient; +class CFSMailAddress; +class CFsTreeList; +class CFsTreeVisualizerBase; +class MFsTreeItemData; +class MFsTreeItemVisualizer; +class CFreestyleEmailUiTextureManager; +class CFreestyleEmailUiMailListControl; +class CFreestyleEmailUiAppUi; +class CFsControlBar; +class CFSMailMessage; +class CFsMailFolder; +class CFsTreePlainOneLineNodeData; +class CFsTreePlainOneLineNodeVisualizer; +class MFsControlButtonInterface; +class CPbkxContactActionMenu; +class CMailListUpdater; +class CMsgMovedNoteTimer; +class CIdle; +class CESMRIcalViewer; +class CAknWaitDialog; +class CDateChangeTimer; +class CFsTreePlainTwoLineItemData; +class CFsTreePlainTwoLineItemVisualizer; +class CEUiEmailListTouchManager; +class MFSMailIterator; +class CAknStylusPopUpMenu; +class CFSEmailUiGenericTimer; +template struct TDeleteTask; + +/** + * CMailListModelUpdater + * + * Asynchronous mail list updater. + * + */ +class CMailListModelUpdater : public CActive + { +private: + + // Updater state + enum TState + { + // Idle state. Updater is doing nothing. + EIdle, + // Initializing state. Get ready for the update. + EInitialize, + // Fetching state. Fetch the messages for the model. + EFetch, + // Finalizing state. Model update done. + EFinalize + }; + +public: + + // Updater observer + class MObserver + { + public: + /** + * Called when an error has occured. + */ + virtual void UpdateErrorL(TInt aError) = 0; + + /** + * Called when update begins. + */ + virtual void UpdateBeginL() = 0; + + /** + * Called when new messages fetched. + */ + virtual void UpdateProgressL(TFsTreeItemId& aParentId, RPointerArray& aMessages) = 0; + + /** + * Called when update is completed. + */ + virtual void UpdateCompleteL() = 0; + + /** + * Update cancelled. + * @param aForceRefresh If ETrue, model will be fully refreshed on next activation. + */ + virtual void UpdateCancelled(const TBool aForceRefresh) = 0; + }; + +public: + /** + * + */ + static CMailListModelUpdater* NewL(); + + /** + * Constructor + */ + CMailListModelUpdater(); + + /** + * Destructor + */ + ~CMailListModelUpdater(); + +public: + + /** + * Reference to sorting criteria array. + */ + RArray& Sorting(); + + /** + * Update model. + */ + void UpdateModelL(MObserver& aObserver, MFSMailIterator* aIterator, TInt aBlockSize); + + /** + * Returns ETrue if updating. + */ + TBool IsUpdating() const; + +public: // from CActive + + /** + * @see CActive::RunL + */ + void RunL(); + + /** + * @see CActive::DoCancel + */ + void DoCancel(); + /** + * @see CActive::RunError + */ + TInt RunError(TInt aError); + +private: + + /** + * Signal self with given error code and set a new state. + */ + void Signal(TState aState, TInt aError = KErrNone); + + /** + * Initialize update. + */ + void InitializeL(); + + /** + * Fetch one step. + */ + void FetchL(); + + /** + * Finalize update. + */ + void FinalizeL(); + + /** + * Reset to uninitialized state. + */ + void Reset(); +private: + void ConstructL(); + +private: + + RArray iSorting; + TFSMailMsgId iId; + TState iState; + TInt iItemsFetched; + MObserver* iObserver; + MFSMailIterator* iIterator; + TFsTreeItemId iParentId; + TInt iBlockSize; + RTimer iTimer; + }; + +struct SMailListItem + { + TFsTreeItemId iListItemId; + MFsTreeItemData* iTreeItemData; + MFsTreeItemVisualizer* iTreeItemVisualiser; + }; + +struct STimeDateFormats + { + TDateFormat iDateFormat; + TChar iDateSeparator; + TTimeFormat iTimeFormat; + TChar iTimeSeparator; + TLocalePos iAmPmPosition; + }; + +enum TMailListUiControls + { + EControlBarComponent=0, + EMailListComponent + }; + +enum TListControlType + { + EListControlTypeSingleLinePreviewOff=0, + EListControlTypeSingleLinePreviewOn, + EListControlTypeDoubleLinePreviewOff, + EListControlTypeDoubleLinePreviewOn + }; + +enum TListControlSeparatorValue + { + EListControlSeparatorDisabled=0, + EListControlSeparatorEnabled + }; + +// +class CFSEmailUiMailListVisualiser : public CFsEmailUiViewBase, + public MFsControlBarObserver, + public MFSEmailUiFolderListCallback, + public MFSEmailUiSortListCallback, + public MFsTreeListObserver, + public MFSEmailUiContactHandlerObserver, + public CMailListModelUpdater::MObserver, + public MEmailMailboxState, + public MFSEmailUiGenericTimerCallback +// + { +friend class CMailListUpdater; +private: + + // Refresh state + enum TRefreshState + { + ERefreshNone, + // Full refresh needed. Update model and redraw entire list. + EFullRefreshNeeded, + // Partial refresh needed. + EPartialRefreshNeeded, + // Focus to the beginning. + EFocusChangeNeeded + }; + + // states for sorting timer + enum TSortState + { + ESortNone, + ESortRequested, + ESortStarted, + ESortPostponed, + ESortCompleted, + ESortStartError + }; +public: + static CFSEmailUiMailListVisualiser* NewL(CAlfEnv& aEnv, CFreestyleEmailUiAppUi* aAppUi, CAlfControlGroup& aMailListControlGroup); + static CFSEmailUiMailListVisualiser* NewLC(CAlfEnv& aEnv, CFreestyleEmailUiAppUi* aAppUi, CAlfControlGroup& aMailListControlGroup); + virtual ~CFSEmailUiMailListVisualiser(); + void PrepareForExit(); + + void DynInitMenuPaneL(TInt aResourceId, CEikMenuPane* aMenuPane); + // Refresh the whole list + void RefreshL( TFSMailMsgId* aFocusToMessage = NULL ); + // From view + TUid Id() const; + // Toolbar + /*void DoActivateL(const TVwsViewId& aPrevViewId, + TUid aCustomMessageId, + const TDesC8& aCustomMessage);*/ + // Toolbar + TInt NewEmailsInModelL() const; + TInt EmailsInModelL() const; + CFSEmailUiMailListModel* Model(); + // Current active folder + TFSMailMsgId FolderId(); + // Dynamic variant switch, called by appui + void HandleDynamicVariantSwitchL( CFsEmailUiViewBase::TDynamicSwitchType aType ); + void HandleDynamicVariantSwitchOnBackgroundL( CFsEmailUiViewBase::TDynamicSwitchType aType ); + // Handle foregroundevent + void HandleForegroundEventL( TBool aForeground ); + // Sets softkeys + void SetViewSoftkeysL( TInt aResourceId ); + void SetMskL(); + // Highlighted index + TInt HighlightedIndex() const; + void SetHighlightedIndexL( TInt aWantedIndex ); + // Event handling forwarded from control + TBool OfferEventL( const TAlfEvent& aEvent ); + + // + /** + * Open highlighted mail or node. + * (Touchwork: Called from touch manager) + */ + void DoHandleListItemOpenL(); + + /** + * Open folderlist or shortlist. + * (Touchwork: Called from touch manager) + * + * @param TInt button id. (shortlist or folderlist) + */ + void DoHandleControlBarOpenL( TInt aControlBarButtonId ); + + /** + * Open action menu. + * (Touchwork: Called from touch manager) + */ + void DoHandleListItemLongTapL( const TPoint& aPoint ); + + /** + * Get control which is currently focused. + * (Touchwork: Called from touch manager) + * + * @return TInt id of control + */ + TInt GetFocusedControl() const; + + /** + * Set control bar as focused control. + * (Touchwork: Called from touch manager) + */ + void SetControlBarFocusedL(); + + /** + * Set tree list as focused control. + * (Touchwork: Called from touch manager) + */ + void SetTreeListFocusedL(); + + /** + * Helper function for disable controls to send + * any events. + * (Touchwork) + * + * @param TBool state of controls. + */ + void DisableMailList( TBool aValue ); + // + + // Command handling + void HandleCommandL(TInt aCommand); + // Read status + void ChangeReadStatusOfHighlightedL( TBool aRead ); + void ChangeReadStatusOfMarkedL( TBool aRead ); + void ChangeReadStatusOfIndexL( TBool aRead, TInt aIndex ); + // Delete messages + void DeleteMessagesL(); + // Move to drafts + void MoveMessagesToDraftsL(); + + // From base class MFSEmailUiFolderListCallback + // Handle folder list selection + void FolderSelectedL( TFSMailMsgId aSelectedFolderId, + TFSEmailUiCtrlBarResponse aResponse ); + void MailboxSelectedL( TFSMailMsgId aSelectedFolderId ); + TRect FolderButtonRect(); + + // From base class MFSEmailUiSortListCallback + void SortOrderChangedL( TFSMailSortField aSortField, + TFSEmailUiCtrlBarResponse aResponse ); + TRect SortButtonRect(); + + // Update theme colors + void UpdateThemeL(const TBool aSystemUpdate = ETrue); + + // Navigation functions, used mainly from viewer + TBool IsNextMsgAvailable( TFSMailMsgId aCurrentMsgId, TFSMailMsgId& aFoundNextMsgId, TFSMailMsgId& aFoundNextMsgFolder ) const; + TBool IsPreviousMsgAvailable( TFSMailMsgId aCurrentMsgId, TFSMailMsgId& aFoundPreviousMsgId, TFSMailMsgId& aFoundPrevMsgFolder ) const; + TInt MoveToNextMsgL( TFSMailMsgId aCurrentMsgId, TFSMailMsgId& aFoundNextMsgId ); + TInt MoveToPreviousMsgL( TFSMailMsgId aCurrentMsgId, TFSMailMsgId& aFoundPreviousMsgId ); + TInt MoveToPreviousMsgAfterDeleteL( TFSMailMsgId aFoundPreviousMsgId ); + + /** + * Sets the manual mailbox syncronisation flag if the user chose + * to synchorise mail box from the menu + */ + void ManualMailBoxSync( TBool aManualMailBoxSync ); + + // Returns ETrue if mailbox is syncronizing and EFalse if not + TBool GetLatestSyncState(); + + void GetMarkedMessagesL( RArray& aMessageIDs ) const; + CFsTreeList& GetMailList(); + // Get message ID corresponding given list ID. If the list ID is for a node, its first child message ID is returned. + TFSMailMsgId MsgIdFromListId( TFsTreeItemId aListId ) const; + + void HandleMailBoxEventL( TFSMailEvent aEvent, TFSMailMsgId aMailbox, + TAny* aParam1, TAny* aParam2, TAny* aParam3 ); + +// from base class MFsTreeListObserver + + /** Handles tree list events. */ + // Touch + void TreeListEventL( const TFsTreeListEvent aEvent, + const TFsTreeItemId aId, + const TPoint& aPoint ); + // + +// from base class MFSEmailUiContactHandlerObserver + + /** Handles completed contact handler event. */ + void OperationCompleteL( TContactHandlerCmd aCmd, + const RPointerArray& aContacts ); + void OperationErrorL( TContactHandlerCmd, TInt aError ); + + /** + * Called when CDateChangeTimer completes. This happens when either when date + * changes or when user alters the system time. Redraws the list to ensure that + * time stamp texts in emails and nodes are up-to-date. + */ + void NotifyDateChangedL(); + + // Sets aActiveMailboxId and aActiveFolderId from iMailFolder if available + TInt GetActiveFolderId(TFSMailMsgId& aActiveMailboxId, TFSMailMsgId& aActiveFolderId) const; + + // Creates CMailboxStateExtension with this class set as dataprovider + void CreateExtensionL(); + + // check from settings if manual or auto sync + TBool CheckAutoSyncSettingL(); + +public: // from MFSEmailUiGenericTimerCallback + + /** + * From MFSEmailUiGenericTimerCallback. + * Generic timer event callback. + * Handles insertion of new mails into mail list. + */ + void TimerEventL( CFSEmailUiGenericTimer* aTriggeredTimer ); + +private: // from + + /** + * @see CFsEmailUiViewBase::ChildDoActivateL + */ + void ChildDoActivateL( const TVwsViewId& aPrevViewId, + TUid aCustomMessageId, + const TDesC8& aCustomMessage ); + void ChildDoDeactivate(); + void GetParentLayoutsL( RPointerArray& aLayoutArray ) const; + TFSEmailUiTextures GetSortButtonTextureIndex(); + void FadeOut(TBool aDirectionOut); + + /** + * @see CFsEmailUiViewBase::SetStatusBarLayout + */ + void SetStatusBarLayout(); + +private: // Private functions + CFSEmailUiMailListVisualiser( CAlfEnv& aEnv, CFreestyleEmailUiAppUi* aAppUi, + CAlfControlGroup& aMailListControlGroup ); + void ConstructL(); + + // Refresh funcions + void InsertNewMessagesL( const RArray& aMessages ); + void InsertNewMessageL( CFSMailMessage* aNewMessage, const TBool aAllowRefresh ); // ownership is transferred + + void RefreshListItemsL(); + void RefreshListItemsL(TFsTreeItemId& aLatestNodeId, + const TInt aStartIndex, const TInt aEndIndex); + // Refresh the list order only + void RefreshOrderL(); + + // To start refreshing asynchronously + void RefreshDeferred( TFSMailMsgId* aFocusToMessage = NULL ); + static TInt DoRefresh( TAny* aSelfPtr ); + void CompletePendingRefresh(); + + // Create and insert one list node item according to given model item. + // Omitting the argument aChildIdx causes the new node to be appended at the end of the list. + TFsTreeItemId InsertNodeItemL( TInt aModelIndex, TInt aChildIndex = KErrNotFound, const TBool aAllowRefresh = EFalse ); + // Create and insert one list item according the given model item. The item is added under the given node. + // Omitting the argument aChildIdx causes the new item to be appended as last child of the node. + TFsTreeItemId InsertListItemL( TInt aModelIndex, TFsTreeItemId aParentNodeId, TInt aChildIdx = KErrNotFound, TBool aAllowRefresh = ETrue ); + + // from CMailListModelUpdater::MObserver + + /** + * @see CMailListModelUpdater::MObserver::UpdateErrorL + */ + void UpdateErrorL(TInt aError); + + /** + * @see CMailListModelUpdater::MObserver::UpdateBeginL + */ + void UpdateBeginL(); + + /** + * @see CMailListModelUpdater::MObserver::UpdateProgressL + */ + void UpdateProgressL(TFsTreeItemId& aParentId, RPointerArray& aMessages); + + /** + * @see CMailListModelUpdater::MObserver::UpdateCompleteL + */ + void UpdateCompleteL(); + + /** + * @see CMailListModelUpdater::MObserver::UpdateCancelled + */ + void UpdateCancelled(const TBool aForceRefresh); + + // Mail model update + void SortMailListModelAsyncL(); + TBool UpdateMailListModelAsyncL(TInt aBlockSize); + void UpdateMailListModelL(); + void CreateModelItemsL( RPointerArray& aMessages ); + void DeleteSortWaitNote(); + + // Create title divider model item for the given message. Separator text depends on active sorting mode. + CFSEmailUiMailListModelItem* CreateSeparatorModelItemLC( CFSMailMessage& aMessage ) const; + + // Checks if the given messages belong under the same title divider. This depends on the currect sorting mode. + TBool MessagesBelongUnderSameSeparatorL( const CFSMailMessage& aMessage1, const CFSMailMessage& aMessage2 ) const; + + // Rescale UI + void SetMailListLayoutAnchors(); + + // Control bar functions + void CreateControlBarLayoutL(); + void ScaleControlBarL(); + void SetSortButtonTextAndIconL(); + HBufC* GetSortButtonTextLC(); + void HandleControlBarEvent( TFsControlBarEvent aEvent, TInt aData ); + + // Followup flag + void SetMessageFollowupFlagL(); + + void CreatePlainNodeL( const TDesC* aItemDataBuff, + CFsTreePlainOneLineNodeData* &aItemData, + CFsTreePlainOneLineNodeVisualizer* &aNodeVisualizer ) const; + + // Move messages to folder + TInt MoveMsgsToFolderL( const TFSMailMsgId& aDestinationFolderId ); + + // Collapse/Expand nodes + void ExpandAllNodesL(); + void CollapseAllNodesL(); + void ExpandOrCollapseL(); + + // Mark control functions + /** + * Mark all items + */ + void MarkAllItemsL(); + + /** + * Unmark all items + */ + void UnmarkAllItemsL(); + + /** + * Exit from marking mode + * @return TInt count of marked items + */ + TInt CountMarkedItemsL(); + + /** + * Check if all items are marked + */ + TBool AreAllItemsMarked(); + + /** + * Check if all items are unmarked + */ + TBool AreAllItemsUnmarked(); + + /** + * Check if all marked items are read + */ + TBool AreAllMarkedItemsReadL(); + + /** + * Check if all marked items are unread + */ + TBool AreAllMarkedItemsUnreadL(); + + /** + * Exit from marking mode + */ + void ExitMarkingModeL(); + + /** + * Enter to marking mode + */ + void EnterMarkingModeL(); + + /** + * Refresh marking mode + */ + void RefreshMarkingModeL(); + + /** + * Display marking mode title text + */ + void DisplayMarkingModeTitleTextL(); + + /** + * Remove marking mode title text + */ + void RemoveMarkingModeTitleTextL(); + + /** + * Displays or remove marking mode background + */ + void DisplayMarkingModeBgL( TBool aDisplay ); + + /** + * Mark/unmark items under current separator. + * + * @param aMarked If ETrue mark all items else unmark. + * @param aSeparatorId Id of the separator. + */ + void MarkItemsUnderSeparatorL( TBool aMarked, TInt aSeparatorId ); + + /** + * Check if all items are marked under separator + * + * @param aSeparatorId Id of the separator. + * @return TBool ETrue if all items are marked under separator + */ + TBool AreAllItemsMarkedUnderSeparatorL( TInt aSeparatorId ); + + /** + * Restore marking status + */ + void MarkMessagesIfFoundL( const RArray& aMessageIDs ); + + // Message deletion internal functions + void DeleteFocusedMessageL(); + void DeleteMarkedMessagesL(); + void DeleteMessagesUnderNodeL( const TFsTreeItemId aNodeId ); + void ConfirmAndStartDeleteTaskL( TDeleteTask* aTask ); + TBool ConfirmDeleteL( const TInt aItemCount, const TFsTreeItemId aItemId ) const; + static TInt DoExecuteDeleteTask( TAny* aSelfPtr ); + void HandleDeleteTaskL( const RFsTreeItemIdList& aEntries ); + void HandleDeleteTaskLeavingCodeL( const RFsTreeItemIdList& aEntries ); + + // Helper functions to access model data + TFSMailMsgId MsgIdFromIndex( TInt aItemIdx ) const; + CFSMailMessage& MsgPtrFromListIdL( TFsTreeItemId aListId ); + const CFSMailMessage& MsgPtrFromListIdL( TFsTreeItemId aListId ) const; + + // Item data and visualiser helper functions + MFsTreeItemData* ItemDataFromItemId( TFsTreeItemId aItemId ); + MFsTreeItemVisualizer* ItemVisualiserFromItemId( TFsTreeItemId aItemId ); + + // Helpers to get the ordinal of a message in the iModel + TInt ItemIndexFromMessageId( const TFSMailMsgId& aMessageId ) const; + TInt NextMessageIndex( TInt aCurMsgIdx ) const; + TInt PreviousMessageIndex( TInt aCurMsgIdx ) const; + TInt ModelIndexFromListId( TFsTreeItemId aItemId ) const; + + // Open highlighted mail + void OpenHighlightedMailL(); + void OpenMailItemL( TFsTreeItemId aMailItem ); + + // Create folder name buffer, either from database or from actual folder name + HBufC* CreateFolderNameLC( const CFSMailFolder* aFolder ) const; + + // Shortcut specific toggles + void ShortcutReadUnreadToggleL(); + void ShortcutCollapseExpandAllToggleL(); + + // Utility functions to check if all nodes are expanded or collapsed + TBool AllNodesCollapsed() const; + TBool AllNodesExpanded() const; + + // Utility functions to check if mark as read/unread options should be available in menus + TBool IsMarkAsReadAvailableL() const; + TBool IsMarkAsUnreadAvailableL() const; + + // Utility function to get list of entries which will be targeted by the Actions menu commands. + // The list contains either marked entries or the focused message entry or is empty. + void GetActionsTargetEntriesL( RFsTreeItemIdList& aListItems ) const; + + // Stylus menu specific functions + void LaunchStylusPopupMenuL( const TPoint& aPoint ); + + // Compose, reply, reply all and forward + void CreateNewMsgL(); + void ReplyL( CFSMailMessage* aMsgPtr ); + void ReplyAllL( CFSMailMessage* aMsgPtr ); + void ForwardL( CFSMailMessage* aMsgPtr ); + void DoReplyForwardL( TEditorLaunchMode aMode, CFSMailMessage* aMsgPtr = NULL ); + + // Some misc housekeeping functions + void RemoveUnnecessaryNodesL(); + void UpdateMailListSettingsL(); + void UpdateMailListTimeDateSettings(); + STimeDateFormats MailListTimeDateSettings(); + + // Request to update list item data from given message pointer + void UpdateItemDataL( CFsTreePlainTwoLineItemData* aData, const CFSMailMessage* aMsgPtr ); + + // Request to update preview pane data for list id with msg ptr + void UpdatePreviewPaneTextForItemL( TFsTreeItemId aListItemId, CFSMailMessage* aMsgPtr ); + void UpdatePreviewPaneTextForItemL( CFsTreePlainTwoLineItemData* aTwoLineItemData, CFSMailMessage* aMsgPtr ); + void UpdatePreviewPaneTextIfNecessaryL( TFsTreeItemId aListItemId, TBool aUpdateItem = ETrue ); + + // Sender/Recipient text depending on the mail folder + HBufC* GetListFirstTextLineL( const CFSMailMessage* aMsgPtr ); + + // Reload message pointer from mail client and update list item contents to match it. Item is + // removed if it isn't valid anymore. + void UpdateItemAtIndexL( TInt aIndex ); + + // Check validity of highlighted msg and remove from list if needed + // EFalse indicates that mail was not valid anymore. + TBool CheckValidityOfHighlightedMsgL(); + + // Icon update for msg item + void UpdateMsgIconAndBoldingL( CFSMailMessage* aMsgPtr ); + void UpdateMsgIconAndBoldingL( TInt aListIndex, TBool aRefreshItem = ETrue ); + void UpdateMsgIconAndBoldingL( CFsTreePlainTwoLineItemData* aItemData, + CFsTreePlainTwoLineItemVisualizer* aItemVis, + CFSMailMessage* aMsgPtr ); + + // Message removing from list if found + void RemoveMsgItemsFromListIfFoundL( const RArray& aEntryIds ); + + // Branding functions + void SetBrandedMailBoxIconL(); + void SetMailboxNameToStatusPaneL(); + void SetBrandedListWatermarkL(); + + // Gives the parent node if the item has one. Returns KErrNotFound if no parent node available. + TFsTreeItemId ParentNode( TFsTreeItemId aItemId ) const; + + // Either marks or unmarks the current item depending on the current marking state + // as stored in iListMarkItemsState. Used for marking when shift is depressed while + // scrolling. Returns ETrue if the highlighted item is markable. + TBool DoScrollMarkUnmarkL(); + + //When maillist is activated this method handles the connection icon change + void ConnectionIconHandling(); + + void SetListAndCtrlBarFocusL(); + + void SetMailListItemsExtendedL(); + + void DoFirstStartL(); + + // Called when flip state is changed + void FlipStateChangedL( TBool aFlipOpen ); + + /** + * Handles the focus state changes + * @param aVisible Indicates if focus should become visible or removed + */ + void FocusVisibilityChange( TBool aVisible ); + + /** + * Update texts in command area buttons + */ + void UpdateButtonTextsL(); + + /** + * Tests whether a point is inside the control. + * + * @param aControl Control that is tested. + * @param aPoint Point in display coordinates. + * + * @return ETrue, if the point is inside one of the + * control's visuals. Otherwise EFalse. + */ + TBool HitTest( const CAlfControl& aControl, const TPoint& aPoint ) const; + + /** + * Handles arrow events in portrait mode. + * + * @param aScancode Standard scan code. + * @param aEvent Event. + * @param aShiftState Shift state. + * + * @return ETrue, if consumed, EFalse otherwise. + */ + TBool HandleArrowEventInPortraitL( const TInt aScancode, + const TAlfEvent& aEvent, const TBool aShiftState ); + /** + * Handles arrow events in landscape mode. + * + * @param aScancode Standard scan code. + * @param aEvent Event. + * @param aShiftState Shift state. + * + * @return ETrue, if consumed, EFalse otherwise. + */ + TBool HandleArrowEventInLandscapeL( const TInt aScancode, + const TAlfEvent& aEvent, const TBool aShiftState ); + +private: // data types + + +private: // Private objects + // Extension to support Ozone-plugin's check for active mailbox + CMailboxStateExtension* iExtension; + // Reference to Alf environment + CAlfEnv& iEnv; + // Mail list updater timer + // Timer delays mail update to prevent unnesessary redraw events + CMailListUpdater* iMailListUpdater; + // Msg moved note timer + CMsgMovedNoteTimer* iMsgNoteTimer; + // Screen layout uses iMailListControl + CAlfAnchorLayout* iScreenAnchorLayout; + // Control bar control and layout and store visual pointer + CFsControlBar* iControlBarControl; + CAlfVisual* iControlBarVisual; + CAlfDeckLayout* iControlBarLayout; + // Mail List control and layout + CFreestyleEmailUiMailListControl* iMailListControl; + CAlfDeckLayout* iListLayout; + CAlfImageVisual* iTitleDividerBgVisual; + CFSEmailUiMailListModel* iModel; + CFsTreeList* iMailList; + CFsTreeVisualizerBase* iMailTreeListVisualizer; + TInt iNumSlots; + CFSMailFolder* iMailFolder; + TInt iNewEmailsInModel; + RArray iTreeItemArray; + RArray iButtonsIds; + TInt iFocusedControl; + TBool iToolbarInUse; + TInt iListMode; + TInt iNodesInUse; + TInt iNewEmailButtonId; + TInt iFolderListButtonId; + TInt iSortButtonId; + TInt iImageButtonId; + MFsControlButtonInterface* iIconButton; + MFsControlButtonInterface* iNewEmailButton; + MFsControlButtonInterface* iFolderListButton; + MFsControlButtonInterface* iSortButton; + TBool iThisViewActive; + CPbkxContactActionMenu* iActionMenu; + TFSMailSortCriteria iCurrentSortCriteria; + // Set to indicate whether items should be marked or unmarked + TBool iListMarkItemsState; + // Set to indicate if Shift key is being held down in which case selection key has mark/unmark functionality + TBool iShiftDepressed; + // Set to indicate has other key events occured during hash key press (in which case hash is used as shift and not handled individually) + TBool iOtherKeyPressedWhileShiftDepressed; + // Move to folder toggle + TBool iMoveToFolderOngoing; + // Timers + CFSEmailUiGenericTimer* iMsgMoveTimer; + //ETrue if user started the sync + TBool iManualMailBoxSync; + TAknUiZoom iCurrentZoomLevel; + STimeDateFormats iDateFormats; + TRect iCurrentClientRect; + CAlfTexture* iMailBoxIconTexture; + CAlfTexture* iMailBoxWatermarkTexture; + TBool iSkinChanged; + TBool iDateChanged; + TFSMailMsgId iLatestOpenedMrId; + TBool iListOrderMayBeOutOfDate; + CAknWaitDialog* iDeletingWaitNote; + CDateChangeTimer* iDateChangeTimer; + TBool iFirstStartCompleted; + // generic use async callback object + CAsyncCallBack* iAsyncCallback; + // async callback for deferred redrawing + CAsyncCallBack* iAsyncRedrawer; + TFSMailMsgId iMsgToFocusAfterRedraw; + HBufC* iNewEmailText; + + CEUiEmailListTouchManager* iTouchManager; + CAknStylusPopUpMenu* iStylusPopUpMenu; + TBool iStylusPopUpMenuVisible; + + TBool iShowReplyAll; + // Was focus visible in the ListView. + TDeleteTask* iDeleteTask; + TBool iLastFocus; + //used to prevent Call application execution (on keyup of call button) when call to contact required + TBool iConsumeStdKeyYes_KeyUp; + CMailListModelUpdater* iMailListModelUpdater; + TBool iForceRefresh; + // true if message viewer/editor is open to disable background list updates + TBool iMailOpened; + // tactile feed back -- not owned + MTouchFeedback* iTouchFeedBack; + // Is device in marking mode + TBool iMarkingMode; + // Exit marking mode when view is back to mail list view + TBool iMarkingModeWaitingToExit; + // Marking mode title variables + CAlfTextVisual* iMarkingModeTextVisual; + CAlfLayout* iMarkingModeTextParentLayout; + CAlfAnchorLayout* iMarkingModeTextContentLayout; + TPoint iMarkingModeTextPos; + TSize iMarkingModeTextSize; + TRect iMarkingModeTextRect; + // sorting info dialog + CAknWaitDialog* iSortWaitNote; + //sorting timer + CFSEmailUiGenericTimer* iSortTimer; + TSortState iSortState; //states of the sorting timer + TInt iSortTryCount; // number of tries that it will make to retry start sorting + // timer generates events for inserting new mails into mail list + CFSEmailUiGenericTimer* iNewMailTimer; + + // array keeps IDs of new mails which should be added into mail list + RArray iNewMailIds; + + // skin text colors for the list items + TRgb iFocusedTextColor; + TRgb iNormalTextColor; + TRgb iNodeTextColor; + }; + + +// Definition of the mail updater timer. This timer is used for +// delayed drawing of the mail list to avoid viewsrv:11 panics. +class CMailListUpdater : public CTimer + { +public: + static CMailListUpdater* NewL( CFSEmailUiMailListVisualiser* aMailListVisualiser ); + ~CMailListUpdater(); + void StartL( TBool aIsSorting = EFalse ); + void Stop(); + void RunL(); + +protected: + CMailListUpdater( CFSEmailUiMailListVisualiser* aMailListVisualiser ); + +private: + CFSEmailUiMailListVisualiser* iMailListVisualiser; + TBool iIsSorting; + CAknWaitDialog* iWaitNote; + }; + +// Delayd note timer +class CMsgMovedNoteTimer : public CTimer + { +public: + static CMsgMovedNoteTimer* NewL( CFreestyleEmailUiAppUi* aAppUi, CFSEmailUiMailListVisualiser* aMailListVisualiser ); + ~CMsgMovedNoteTimer(); + void Start( TInt aMsgCount, const TFSMailMsgId aDestinationFolderId ); + void Stop(); + void RunL(); + +protected: + CMsgMovedNoteTimer( CFreestyleEmailUiAppUi* aAppUi, CFSEmailUiMailListVisualiser* aMailListVisualiser ); + +private: + CFreestyleEmailUiAppUi* iAppUi; + CFSEmailUiMailListVisualiser* iMailListVisualiser; + TFSMailMsgId iDestinationFolderId; + TInt iMsgCount; + }; + +// Date changing timer. Updates the mail list when date changes. +class CDateChangeTimer : public CTimer + { +public: + static CDateChangeTimer* NewL( CFSEmailUiMailListVisualiser& aMailListVisualiser ); + ~CDateChangeTimer(); + void Start(); + void RunL(); + TInt DayCount(); + +protected: + CDateChangeTimer( CFSEmailUiMailListVisualiser& aMailListVisualiser ); + +private: + CFSEmailUiMailListVisualiser& iMailListVisualiser; + TInt iDayCount; + }; + +#endif