messagingappbase/mce/inc/MceMessageListView.h
changeset 0 72b543305e3a
child 53 696bfeff199e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/mce/inc/MceMessageListView.h	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,691 @@
+/*
+* Copyright (c) 2002 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:  
+*     This view is created when user opens folder.
+*
+*/
+
+
+
+#ifndef MCEMESSAGELISTVIEW_H
+#define MCEMESSAGELISTVIEW_H
+
+//  INCLUDES
+//#include "MceBaseListView.h"
+#include <aknview.h>
+#include <msvapi.h>
+#include <AiwServiceHandler.h>
+#include <coemain.h>
+
+#include "MceMessageListContainer.h" 
+
+#include "mcetemplate.h"
+#include "MceFolderItem.h"
+#include "MceListboxTypeObserver.h"
+
+#include <bldvariant.hrh>
+
+#include <AiwServiceHandler.h>
+
+// CONSTANTS
+
+#define TDRVIEWID TVwsViewId( \
+    TUid::Uid( KMceApplicationUidValue ), \
+    TUid::Uid( KMceDeliveryReportViewIdValue ) )
+
+enum TMessageFolderMessageStatus
+    {
+    MessageFolderAllRead,
+    MessageFolderAllUnread,
+    MessageFolderReadUnread
+    };
+
+enum TMessageFolderDeleteMessageStatus
+    {
+    MessageFolderAllDelete,
+    MessageFolderAllUnDelete,
+    MessageFolderDeleteUnDelete
+    };
+
+enum TMceTemplatesDialogStatus
+    {
+    MceTemplatesDialogClose,
+    MceTemplatesDialogOpen
+    };
+// DATA TYPES
+typedef CArrayFixFlat<TMceFolderItem> CMceFolderItemArray;
+
+// FORWARD DECLARATIONS
+class CMsvSession;
+class CMceBitmapResolver;
+class CMceMainViewListView;
+class CAknLocalScreenClearer;
+class CMceSessionHolder;
+class CMceUi;
+class CMceMessageListContainer;
+class CMceMessageListContainerBase;
+class CEnvironmentChangeNotifier;
+
+class CMceListboxTypeObserver;
+
+// CLASS DECLARATION
+
+/**
+*  This view is created when user opens folder.
+*/
+class CMceMessageListView :
+    public CAknView,
+    public MEikListBoxObserver,
+    public MMsvSessionObserver,    
+    public MMceListboxTypeObserver
+    {
+    public:  // Constructors and destructor
+
+        /**
+        * Two-phased constructor.
+        */
+        static CMceMessageListView* NewL(
+            CMsvSessionPtr aSession,
+            TMsvId aFolderId,
+            CMceSessionHolder& aSessionHolder,
+            CMceBitmapResolver& aBitmapResolver,
+            CMceMainViewListView& aMainView );
+
+        /**
+        * Destructor.
+        */
+        virtual ~CMceMessageListView();
+
+    public: // New functions
+    
+    
+        /**
+        * Sets folder to be watched
+        * @param aFolderId: folder id
+        */
+        void SetFolderL( TMsvId aFolderId );
+
+        /**
+        * Returns listbox type of the current folder.
+        * @return Folder listbox type
+        */
+        TInt GetFolderListBoxType();
+
+
+        /**
+        * Returns pointer to list container.
+        * @return Pointer to list container
+        */
+        CMceMessageListContainerBase* ListContainer() const;
+
+        /**
+        * Should be called by mce after message server startup.
+        * This adds view to session observer list and creates needed CMsvEntries.
+        */
+        virtual void HandleMsgServerStartupL();
+        
+        /**
+        * Checks if there are unread messages in the given folder
+        */
+        TBool HasUnreadMessagesL();
+
+        /**
+         * Cancels remote mailbox timer.
+         */
+        void CancelMailboxTimer() const;
+
+        /**
+         * Checks if folder aName already exists
+         * @param aName folder name to be searched.
+         * @param aId id of the folder. Should be set when renaming.
+         * @return ETrue if name used.
+         */
+        TBool IsFolderNameUsedL(const TDesC& aName, TMsvId aId = KErrNotFound) const;
+
+        /**
+         * Changes currently opened folder and redraws the list.
+         * @param aNewFolderId: id of the folder name to be opened
+         */
+        void ChangeFolderAndRefreshListboxL( TMsvId aNewFolderId );
+
+        /**
+        * Finds and selects message entry
+        * @param aMatchString: the matched string
+        */
+        void FindAndSelectEntryL( const TDesC& aMatchString ) const;
+
+        /**
+        * Checks, if SyncMl folder
+        * Returns ETrue, if SyncMl folder              
+        */
+        TBool IsSyncMl() const;
+
+        /**
+        * Checks, if SyncMl Outbox or Inbox folder
+        * Returns ETrue, if SyncMl Outbox or Inbox folder
+        * @param aFolder: id of the folder        
+        */
+        TBool SyncMlOutboxInbox( TMsvId aFolder ) const;
+
+        /**
+        * Checks, if MMS notification can be opened using selection key         
+        */
+        TBool CheckMMSNotificationOpenL( ) const;
+
+        /**
+        * Opens remote mailbox settings              
+        */
+        void OpenMailboxSettingsL();
+
+        /**
+        * Is IMAP folder open        
+        */
+        TBool IsImapFolderOpenL( ) const;
+
+        /**
+        * From CAknView: Sets the new size of Rect
+        */
+        void HandleStatusPaneSizeChange();
+
+        inline void UpdateViewL();
+
+    public: // Functions from base classes
+
+        /**
+        * From CAknView
+        */
+        TUid Id() const;
+
+        /**
+        * From CAknView
+        */
+        void DoActivateL(
+            const TVwsViewId& aPrevViewId,
+            TUid aCustomMessageId,
+            const TDesC8& aCustomMessage );
+
+        /**
+        * From CAknView
+        */
+        void DoDeactivate();
+
+        /**
+        * From CAknView
+        */
+        void DynInitMenuPaneL(
+            TInt aResourceId,
+            CEikMenuPane* aMenuPane );
+
+        /**
+        * From MEikCommandObserver
+        */
+        void HandleCommandL( TInt aCommand );
+
+        /**
+        * From MMsvSessionObserver
+        */
+        virtual void HandleSessionEventL(
+            TMsvSessionEvent aEvent,
+            TAny* aArg1,
+            TAny* aArg2,
+            TAny* aArg3 );
+
+        /**
+        * From MEikCommandObserver
+        */
+        virtual void ProcessCommandL(TInt aCommand);
+        
+        /**
+        * From CAknView ?member_description
+        */
+        void HandleClientRectChange();        
+
+        /**
+        * Sets the label for the middle soft key in the folder view
+        * @since S60 3.1
+        */
+        void SetMSKButtonL();
+        
+        /**
+        * Checks if current folder is emailmailbox for the middle soft key.
+        * @since S60 3.1
+        * @return Etrue if mailbox
+        */
+        TBool IsMSKMailBox();  
+        
+        /**
+        * Checks if current folder is syncMLmailbox for the middle soft key.
+        * @since S60 3.2
+        * @return Etrue if syncMLmailbox
+        */
+        TBool IsMSKSyncMlMailBox();
+        
+        /**
+        * Store current item id for mailbox focus
+        * @since S60 3.0
+        */
+        void SetCurrentItemId();
+
+        /**
+        * Should be called by container when selection button is pressed so that
+        * exit command is not showed in context sensitive menu. iHideExitCommand set
+        * EFalse at the end of DynInitMenuPaneL function.
+        * @param aHideExitCommand: ETrue if exit not shown next time option menu displayed
+        */
+        void SetHideExitCommand( TBool aHideExitCommand );
+        
+        /**
+        * Check if the item is Unread
+        * @para aId: the item id
+        * @return ETrue if the item is unread, return EFalse if the item is read
+        * @since Taco
+        */
+       TBool IsItemUnread( TMsvId aId ); 
+
+        /**
+        * Handle call by sendkey in email list 
+        * @para aEntryId: current entry id
+        * @Since S60 5.0
+        */
+        void HandleSendkeyInMailboxL( TMsvId aEntryId );
+
+        /**
+        * Call-back function for CEnvironmentChangeNotifier class.
+        * @param object of CMceMessageListView.
+        */        
+        static TInt EnvironmentChanged( TAny* aObj );
+        
+        /**
+        * From MMceListboxTypeObserver
+        */
+        virtual void ListboxTypeChangedL();
+		
+		/**
+        * For setting the ContextCommandFlag when clicked to get the context menu
+        */
+        void SetContextCommandFlag(TBool aContextCommandFlag);
+
+    protected:  // Functions from base classes
+
+        /**
+        * From MEikListBoxObserver
+        */
+        void HandleListBoxEventL(
+            CEikListBox* aListBox,
+            TListBoxEvent aEventType );
+
+    private:
+
+        /**
+        * Constructor is private.
+        */
+        CMceMessageListView(
+            CMsvSessionPtr aSession,
+            TMsvId aFolderId,
+            CMceSessionHolder& aSessionHolder,
+            CMceBitmapResolver& aBitmapResolver,
+            CMceMainViewListView& aMainView );
+
+        /**
+        * Symbian OS constructor
+        */
+        void ConstructL();
+
+        /**
+        * Handles different 'open's: Open folder or open message
+        */
+        void HandleOpenL();
+
+        /**
+        * Called when user pressed Back and main view should be opened
+        */
+        void HandleCloseL();
+
+        /**
+        * Changes currently opened folder.
+        * @param aOpenParent: ETrue if "CD .." wanted.
+        */
+        void ChangeFolderL( TBool aOpenParent = EFalse );
+
+        /**
+        * User wants to open message and this call's Ui's EditMtmEntry function.
+        */
+        void EditEntryL();
+
+        /**
+        * Called by DynInitMenuPaneL to delete unneccessary menu items.
+        * @param aMenuPane menu pane
+        */
+        void FetchMenuL( CEikMenuPane* aMenuPane ) const;
+
+        /**
+        * Called by DynInitMenuPaneL to delete unneccessary menu items.
+        * @param aMenuPane menu pane
+        */
+        void FolderMenuL( CEikMenuPane* aMenuPane );
+
+        /**
+        * Called by FolderMenuL to delete unneccessary menu items.
+        * @param aMenuPane menu pane
+        */
+        void FolderMenuNoItemsL( CEikMenuPane* aMenuPane ) const;
+        /**
+        * Called by FolderMenuL to delete unneccessary menu items.
+        * @param aMenuPane menu pane
+        */
+        void FolderMenuOneItemL( 
+            CEikMenuPane* aMenuPane, 
+            TBool aRemoteMailboxOpened,
+            TBool aThirdPartEmail  );
+        /**
+        * Called by FolderMenuL to delete unneccessary menu items.
+        * @param aMenuPane menu pane
+        */
+        void FolderMenuManyItemsL(
+            CEikMenuPane* aMenuPane, 
+            TBool aRemoteMailboxOpened,
+            TBool aThirdPartEmail,
+            TBool aSetRead = EFalse );
+
+        /**
+        * Called by FolderMenuL to delete unneccessary menu items.
+        * @param aMenuPane menu pane, SyncML folder
+        */
+		void FolderMenuSyncMLMain( CEikMenuPane *aMenuPane );
+
+        /**
+        * Called by FolderMenuL to delete unneccessary menu items.
+        * @param aMenuPane menu pane, SyncML folder
+        */
+		void FolderMenuSyncMLFolderL( CEikMenuPane *aMenuPane );
+
+        /**
+        * Called by DynInitMenuPaneL to delete unneccessary menu items.
+        * @param aMenuPane menu pane
+        */
+        void EditMenuL( CEikMenuPane* aMenuPane ) const;
+
+        /**
+        * Called by DynInitMenuPaneL to delete unneccessary menu items.
+        * @param aMenuPane menu pane
+        */
+        void OrganizeMenuL( CEikMenuPane* aMenuPane );
+
+        /**
+        * Returns ETrue if folder is opened by this view and
+        * back does not return to main view.
+        * If EFalse returned then this view needs to be closed
+        * and main view is activated.
+        */
+        TBool FolderOpenedL();
+
+        /**
+        * Returns folder count in currently opened folder
+        */
+        TInt SubfolderCount() const;
+
+        /**
+         * Checks how many unread messages folder has. If only one then asks
+         * MceUi to open it. If more than one, select first unread. If none select first
+         * item of the folder
+         * @return ETrue if there is one message in inbox/mailbox folder and trying to open it,
+         * EFalse when just opening inbox/mailbox folder
+         * @param aId: message id
+         */
+        TBool FindUnreadMessageAndOpenItL( const TMsvId aId );
+
+        /**
+         * Finds folder called 'Inbox' from current (IMAP4 remote mailbox) folder and opens it.
+         * Do not confuse with local service inbox!
+         */
+        void FindInboxAndOpenItL();
+
+        /**
+        * Sets empty text of the list box.
+        * Empty text is different in Remote mailboxes than other folders.
+        */
+        void SetEmptyTextL() const;
+
+        /**
+        * Function for the CIdle class to be called, calls LaunchMceViewer.
+        * @param aSelf: pointer to CMceMessageListView object.
+        * @return see LaunchMceViewer.
+        */
+        static TInt LaunchViewer( TAny* aSelf );
+
+        /**
+        * Tries to launch viewer (by calling Mce's EditMtmEntryL)
+        * for the unread message if there is only one unread
+        * message in the folder. Otherwise does not do nothing
+        * @return KErrNone if launch ok
+        */
+        TInt LaunchMceViewer( );
+
+        /**
+        * Checks if selected entry can be opened and dims 'send via' menu if it can
+        * @param aEntryId: currently selected entry
+        * @param aMenuPane: menupane
+        */
+        void HandleSendViaMenuItemL( TMsvId aEntryId, CEikMenuPane* aMenuPane ) const;
+
+        /**
+        * Called by HandleSessionEventL if entries created or changed.
+        * @param aParentId: id of the parent
+        * @param aSelection: pointer to selection of messages changed.
+        */
+        void MessageViewHandleEntriesCreatedOrChangedL(
+            TMsvId aParentId,
+            CMsvEntrySelection* aSelection );
+
+        /**
+        * Handles EMceCmdSortByDate,EMceCmdSortBySubject and EMceCmdSortBySender
+        * @param aCommand: id of the command
+        */
+        void HandleSortCommandL( const TInt aCommand );
+
+        /**
+        * Open SyncMl Inbox folder               
+        */
+        void SyncMlFindInboxAndOpenItL();   
+        
+        /**
+        *
+        */
+        TInt GetSetRead( const CMsvEntrySelection& aEntries );
+        
+        /**
+        * Checks are the selected messages deleted or undeleted
+        * @since 3.2
+        * @return Index of the selected message deletetion status
+        * otherwise KErrNotFound
+        */
+        TInt GetDeleteFlagStatusL( const CMsvEntrySelection* aEntries );
+        
+        /**
+        * Checks if there is only one unread message in current folder
+        * and starts viewer for it
+        * @since 3.2
+        * @param aMsgMtmUid: filled with Message MTM Uid
+        * @return Index of the message if only one unread, 
+        * otherwise KErrNotFound
+        */
+        TInt LaunchViewerWhenOneUnreadL( TInt &aMsgMtmUid );
+        
+        /**
+        * registers MceMessageListContainer to Msk observer
+        * @param aObserver: True if set MskObserver and False to remove it.
+        * @since 3.2
+        */
+        void SetMskObserver( TBool aObserver );
+
+
+		/**
+		* Input parameter list for AIW plugin
+		*/
+		CAiwGenericParamList* AiwSyncParamListLC(TInt aId, const TDesC& aText);
+
+        /**
+        *
+        */
+        void HandleEntriesCreatedChangedL( const CMsvEntrySelection* aSelection );
+
+        /**
+        *
+        */
+        void HandleEntriesDeletedL( );
+
+        /**
+        *
+        */
+        void HandleEntriesMovedL( TMsvId aSourceFolderId, TMsvId aTargetFolderId );
+        
+        
+        /**
+        * Creates either one row or two row listbox and sets it to iMsgListContainer
+        */
+        void CreateListboxL();
+
+        /**
+        * Find all read messages and mark 
+        * 
+        * @since Taco
+        */
+        void FindAllReadMsgAndMarkL();
+        
+        /**
+        * Check if there is any selected item visible in current view 
+        * @ msgIndexArray: the array of the index of selected item
+        * @since S60 5.0
+        */
+        TBool AnySelectedItemsVisible( CArrayFixFlat<TInt>* msgIndexArray );
+
+        /**
+        * Check if it is in Inbox, Documents and user's own foldermark, 
+        * if it is, enable mark read msg option from menu
+        * @currentEntry: current entry
+        * @currentfolderId: current Folder Id
+        * @aMenuPane: Menu pane to show the mark all read command
+        * @since S60 5.0
+        */
+        void EnableMarkAllReadMsgInInboxAndDocument( 
+            TMsvEntry currentEntry, 
+            TMsvId currentFolderId, 
+            CEikMenuPane* aMenuPane );
+            
+            
+        /**
+        * Set correct menu items for expand/collapse options
+        * @param aMenuPane: 
+        * @since S60 5.0
+        */    
+        void HandleContainerOptionsMenuL( CEikMenuPane* aMenuPane );  
+        
+        /**
+        *
+        */
+        void HandleContainerOptionsCommandL( TInt aCommand );
+        
+        /**
+        * called from EnvironmentChanged.
+        */
+        TInt HandleEnvironmentChanged();
+         
+        /*
+        * Check and Set Forward command for the selected item
+        * Forward is currently only available in Sent Item folder
+        * Since 5.0
+        */
+        void SetForwardMenuL( CEikMenuPane* aMenuPane, TMsvEntry& aEntry );            
+         
+        /*
+        * Dim Read/Unread command from options menu, prepare for further settings
+        * Since 5.0 
+        */
+        void DimReadUnreadOptionsMenu( CEikMenuPane *aMenuPane );
+        
+        /*
+        * Set Read/Unread command for options menu, when multiple msg/emails are selected
+        * Since 5.0
+        */
+        void SetReadUnreadOptionsMenu( CEikMenuPane *aMenuPane, TBool aIsEmail, TBool aSetRead );
+public:
+        /**
+        * Set the iReadUnread variable if Mark as read/unread appears twice
+        * if it is, enable mark read msg option from menu
+        * @aValue: The value to be set to iReadUnread variable
+        * Since 3.2
+        */
+        void SetMarkReadUnread( TBool aValue );
+            
+    private:    // Data
+
+        CMceUi*                 iMceUi;
+        CMceMessageListContainerBase*  iMsgListContainer;
+        
+        TInt                    iCurrentListboxId;
+        CMsvSessionPtr          iSession;
+        TMsvId                  iFolderId;
+        CMceSessionHolder&      iSessionHolder;
+        CMceBitmapResolver&     iBitmapResolver;
+        TBool                   iMceViewActivated;
+        TBool                   iMsvSessionReady;
+        CAiwServiceHandler*		iAiwServiceHandler;
+        TMceFlags               iListViewFlags;
+        TMsvId 					iCurrentItemId;
+
+        TInt    iSelectedIndex; // index of the cursor when deactivated
+   
+        HBufC*  iInboxName;
+        HBufC*  iRemoteMailboxEmptyText;
+        HBufC*  iEmptyText;
+        CMceMainViewListView& iMainViewListView;
+        TBool   iHideExitCommand;
+        TBool   iFetchMenuSelectionKeyPressed;
+        CPeriodic*  iMessageViewerLauncher;        
+        CAknLocalScreenClearer* iLocalScreenClearer;
+        TInt    iLaunchViewerCounter;
+        CMceFolderItemArray* iFolderItemArray;
+        TBool   iConnectionNote;
+
+        TInt    iSortOrder;
+        TBool   iOrdering;        
+        TBool   iRunningEditFunction;
+        TBool   iIsUnread;
+        
+        TInt                     iCurrentListType;
+        CMceListboxTypeObserver* iListboxMailTypeObserver;
+        CMceListboxTypeObserver* iListboxInboxTypeObserver;
+        
+        CEnvironmentChangeNotifier* iDateTimeNotifier;
+        //Variable that get set when Mark as read/unread appears twice
+		TBool 						iReadUnread; 
+		//Variable for context command
+		TBool                       iContextCommand;
+    };
+
+inline void CMceMessageListView::UpdateViewL()
+	{
+	if ( iMsgListContainer )
+	    {
+        iMsgListContainer->SetAnchorItemIdL(
+            CMceMessageListContainerBase::EMessageListOperationCompleted );
+        iMsgListContainer->RefreshListbox();
+	    }
+	}
+
+
+
+#endif
+
+// End of file