emailuis/emailui/inc/FreestyleEmailUiMailListVisualiser.h
branchRCL_3
changeset 64 3533d4323edc
child 70 968773a0b6ef
--- /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 <eikmobs.h>
+//<cmail>
+#include "fscontrolbarobserver.h"
+#include "fstreelistobserver.h"
+#include "cfsmailcommon.h"
+#include "mfsmaileventobserver.h"
+#include "fsccontactactionmenudefines.h"
+//</cmail>
+#include "FSEmailBuildFlags.h"
+
+#include <touchfeedback.h>
+#include <touchlogicalfeedback.h>
+
+// 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 <class T> 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<CFSMailMessage>& 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<TFSMailSortCriteria>& 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<TFSMailSortCriteria> 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
+	};
+
+// <cmail>
+class CFSEmailUiMailListVisualiser : public CFsEmailUiViewBase,
+									 public MFsControlBarObserver,
+									 public MFSEmailUiFolderListCallback,
+									 public MFSEmailUiSortListCallback,
+									 public MFsTreeListObserver,
+									 public MFSEmailUiContactHandlerObserver,
+									 public CMailListModelUpdater::MObserver,
+                                     public MEmailMailboxState,
+                                     public MFSEmailUiGenericTimerCallback
+// </cmail>
+	{
+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;
+	// <cmail> Toolbar
+	/*void DoActivateL(const TVwsViewId& aPrevViewId,
+	                 TUid aCustomMessageId,
+	                 const TDesC8& aCustomMessage);*/
+    // </cmail> 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 );
+
+    // <cmail>
+	/**
+	 * 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 );
+	// </cmail>
+
+	// 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<TFSMailMsgId>& 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. */
+    // <cmail> Touch
+    void TreeListEventL( const TFsTreeListEvent aEvent,
+                         const TFsTreeItemId aId,
+                         const TPoint& aPoint );
+    // </cmail>
+
+// from base class MFSEmailUiContactHandlerObserver
+
+    /** Handles completed contact handler event. */
+    void OperationCompleteL( TContactHandlerCmd aCmd,
+        const RPointerArray<CFSEmailUiClsItem>& 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<CAlfVisual>& 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<TFSMailMsgId>& 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<CFSMailMessage>& 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<CFSMailMessage>& 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<TFSMailMsgId>& aMessageIDs );
+
+	// Message deletion internal functions
+	void DeleteFocusedMessageL();
+	void DeleteMarkedMessagesL();
+    void DeleteMessagesUnderNodeL( const TFsTreeItemId aNodeId );
+    void ConfirmAndStartDeleteTaskL( TDeleteTask<CFSEmailUiMailListVisualiser>* 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<TFSMailMsgId>& 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  <code>ETrue</code>, if the point is inside one of the
+     *          control's visuals. Otherwise <code>EFalse</code>.
+     */
+    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 <code>ETrue</code>, if consumed, <code>EFalse</code> 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 <code>ETrue</code>, if consumed, <code>EFalse</code> 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<SMailListItem> iTreeItemArray;
+    RArray<TInt> 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<CFSEmailUiMailListVisualiser>* 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<TFSMailMsgId> 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