emailuis/emailui/src/FreestyleEmailUiMailListVisualiser.cpp
branchRCL_3
changeset 8 e1b6206813b4
parent 3 a4d6f1ea0416
child 12 f5907b1a1053
--- a/emailuis/emailui/src/FreestyleEmailUiMailListVisualiser.cpp	Tue Feb 02 00:02:40 2010 +0200
+++ b/emailuis/emailui/src/FreestyleEmailUiMailListVisualiser.cpp	Fri Feb 19 22:37:30 2010 +0200
@@ -24,9 +24,9 @@
 #include <StringLoader.h>
 #include <FreestyleEmailUi.rsg>
 #include <featmgr.h>
-#include "CFSMailClient.h"
-#include "CFSMailBox.h"
-#include "CFSMailFolder.h"
+#include "cfsmailclient.h"
+#include "cfsmailbox.h"
+#include "cfsmailfolder.h"
 #include "fscontrolbar.h"
 #include "fscontrolbuttoninterface.h"
 #include "fstreelist.h"
@@ -35,7 +35,7 @@
 #include "fstreeplainonelinenodevisualizer.h"
 #include "fstreeplaintwolineitemdata.h"
 #include "fstreeplaintwolineitemvisualizer.h"
-#include "CFSMailCommon.h"
+#include "cfsmailcommon.h"
 #include "ceuiemaillisttouchmanager.h"
 #include "FSEmailBuildFlags.h"
 #include "cfsccontactactionmenu.h"
@@ -52,9 +52,9 @@
 #include <aknnotewrappers.h>
 #include <msvapi.h>
 #include <akntitle.h>
-#include "ESMailSettingsPluginUids.hrh"
-#include "ESMailSettingsPlugin.h"
-#include "MFSMailBrandManager.h"
+#include "esmailsettingspluginuids.hrh"
+#include "esmailsettingsplugin.h"
+#include "mfsmailbrandmanager.h"
 #include <AknWaitDialog.h>
 #include <aknlayoutscalable_apps.cdl.h>
 #include <layoutmetadata.cdl.h>
@@ -78,7 +78,7 @@
 #include "FreestyleEmailUiMailListControl.h"
 #include "FreestyleEmailUiMailViewerVisualiser.h"
 #include "FreestyleEmailUiStatusIndicator.h"
-#include "FreestyleEmailCenRepHandler.h"
+#include "freestyleemailcenrephandler.h"
 #include "FreestyleEmailUiFolderListVisualiser.h"
 #include "FreestyleEmailUiShortcutBinding.h"
 #include "FreestyleEmailUiMsgDetailsVisualiser.h"
@@ -470,7 +470,8 @@
     iEnv( aEnv ),
     iListMarkItemsState( ETrue ), //Initlly list has no markings
     iMoveToFolderOngoing( EFalse ),
-    iConsumeStdKeyYes_KeyUp( EFalse ) // use to prevent Call application execution if call for contact processed
+    iConsumeStdKeyYes_KeyUp( EFalse ), // use to prevent Call application execution if call for contact processed
+    iMailOpened(EFalse)
 	{
     FUNC_LOG;
 	}
@@ -601,6 +602,7 @@
         }
     SetListAndCtrlBarFocusL();
     iAppUi.StartMonitoringL();
+    TIMESTAMP( "Locally stored messages fetched for message list" );    
     }
 
 // ---------------------------------------------------------------------------
@@ -1041,6 +1043,7 @@
     TInt idx = KErrNotFound;
     TFsTreeItemId parentId = KFsTreeRootID;
     TInt childIdx = KErrNotFound;
+    TInt moveViewPortPosition = 0;
 
     if ( !iNodesInUse )
         {
@@ -1079,6 +1082,7 @@
                 TInt nodeIdxUnderRoot = iMailList->ChildIndex( KFsTreeRootID, nextNodeId );
                 InsertNodeItemL( idx-1, nodeIdxUnderRoot, aAllowRefresh );
                 }
+            moveViewPortPosition += iAppUi.LayoutHandler()->OneLineListItemHeight(); 
             }
         else
             {
@@ -1093,7 +1097,23 @@
     CleanupStack::Pop( newItem );
 
     // Insert the tree list item
-    InsertListItemL( idx, parentId, childIdx, aAllowRefresh );
+    TPoint viewPortCenterPos = iMailTreeListVisualizer->ViewPosition();
+    TPoint viewPortTopPos = iMailTreeListVisualizer->ViewPortTopPosition();
+    TInt itemPos = iMailTreeListVisualizer->GetItemWorldPosition( idx );
+    TBool refresh = viewPortTopPos.iY != 0 && itemPos < viewPortCenterPos.iY;
+     
+    if( refresh )
+    	{
+		InsertListItemL( idx, parentId, childIdx, EFalse );
+		// viewPort update needed
+		moveViewPortPosition += iAppUi.LayoutHandler()->TwoLineListItemHeight(); // add mail item height
+		viewPortCenterPos.iY += moveViewPortPosition;
+		iMailTreeListVisualizer->ViewPositionChanged( viewPortCenterPos, EFalse, 1 );
+    	}
+    else
+    	{
+    	InsertListItemL( idx, parentId, childIdx, aAllowRefresh );
+    	}
 
     // Move focus after insertion if necessary
     if ( firstItemWasFocused )
@@ -1224,6 +1244,7 @@
                      const TDesC8& aCustomMessage)
 	{
     FUNC_LOG;
+    TIMESTAMP( "Opening message list view" );
     iShowReplyAll = EFalse;
 
 	if ( !iFirstStartCompleted )
@@ -1491,7 +1512,7 @@
 	iThisViewActive = ETrue;
 
 	// Set email indicator off.. user has checked the new emails
-	TFsEmailUiUtility::ToggleEmailIconL(EFalse);
+	TFsEmailUiUtility::ToggleEmailIconL(EFalse, activationData.iMailBoxId );
 
 	iShiftDepressed = EFalse; // clear state just in case
 
@@ -1511,6 +1532,7 @@
 	UpdateButtonTextsL();
 	FocusVisibilityChange( iAppUi.IsFocusShown() );
 	iAppUi.ShowTitlePaneConnectionStatus();
+	TIMESTAMP( "Message list view opened" );
 	}
 
 // ---------------------------------------------------------------------------
@@ -1610,7 +1632,30 @@
 
     // MAIN MENU ***************************************************************************
 	if ( aResourceId == R_FSEMAILUI_MAILLIST_MENUPANE )
-		{
+	    {
+            // Sync/cancel sync
+	    CFSMailBox* activeMailbox = iAppUi.GetActiveMailbox();
+	    TBool supportsSync = activeMailbox->HasCapability( EFSMBoxCapaSupportsSync );
+                
+            // flag to hide or show SyncButton
+            TBool hideSync = GetLatestSyncState();
+            if(activeMailbox->CurrentSyncState()==StartingSync) hideSync=EFalse;
+        
+            // hide or show options: Sync/cancel sync
+            if ( !supportsSync )
+                {
+                aMenuPane->SetItemDimmed( EFsEmailUiCmdCancelSync, ETrue );
+                aMenuPane->SetItemDimmed( EFsEmailUiCmdSync, ETrue );
+                }
+             else if ( hideSync || iMailListModelUpdater->IsUpdating() )
+                {
+                aMenuPane->SetItemDimmed( EFsEmailUiCmdSync, ETrue );
+                }
+             else
+                {
+                aMenuPane->SetItemDimmed( EFsEmailUiCmdCancelSync, ETrue );
+                }
+ 	
 		// Saves a focus visibility.
 		iLastFocus = EFalse;
 		if( iFocusedControl == EMailListComponent && IsFocusShown() )
@@ -1902,6 +1947,9 @@
 	iMailList->RemoveAllL();
 	iTreeItemArray.Reset();
 
+    // when we get refresh mail list updates should be fully enabled	
+    iMailOpened = EFalse;
+	
 	RefreshListItemsL();
 
 	if ( !iModel->Count() )
@@ -2998,10 +3046,14 @@
 // If there is a need to refresh the list.
 // ---------------------------------------------------------------------------
 //
-void CFSEmailUiMailListVisualiser::HandleForegroundEventL()
+void CFSEmailUiMailListVisualiser::HandleForegroundEventL( TBool aForeground )
 	{
     FUNC_LOG;
-	if ( iFirstStartCompleted ) // Safety
+    if( iMailFolder ) 
+        {
+        TFsEmailUiUtility::ToggleEmailIconL(EFalse, iMailFolder->GetMailBoxId() );
+        }
+    if ( aForeground && iFirstStartCompleted ) // Safety
 	    {
 	    // Update mail list settings and date formats, is done every time
 	    // the user might have changed these in settings, so the list needs to refresh
@@ -3075,6 +3127,7 @@
 void CFSEmailUiMailListVisualiser::HandleCommandL( TInt aCommand )
     {
     FUNC_LOG;
+    TIMESTAMP( "Message list command for handling" );
     CompletePendingRefresh();
 
     // custom command handling for launching plugin settings
@@ -3133,6 +3186,7 @@
         {
     	case EAknSoftkeyOpen:
             {
+            TIMESTAMP( "Open email selected from message list" );
             if( !iAppUi.IsFocusShown() )
                 {
                 iAppUi.SetFocusVisibility( ETrue );
@@ -3141,6 +3195,7 @@
             }
        	case EAknSoftkeySelect:
        	    {
+       	    TIMESTAMP( "Open email selected from message list" );    
        	    if ( iFocusedControl == EMailListComponent )
        	        {
        	        CFSEmailUiMailListModelItem* item = dynamic_cast<CFSEmailUiMailListModelItem*>(iModel->Item(HighlightedIndex()));
@@ -3211,22 +3266,26 @@
         case EEikCmdExit:
         case EAknSoftkeyExit:
         case EFsEmailUiCmdExit:
+            TIMESTAMP( "Exit selected from message list" );
             iAppUi.Exit();
             break;
        	case EFsEmailUiCmdCalActionsReplyAsMail:
 		case EFsEmailUiCmdActionsReply:
 			{
+			TIMESTAMP( "Reply to selected from message list" );
    	   	 	ReplyL( NULL ); // Function will check marked/highlighted msg
 			}
             break;
 		case EFsEmailUiCmdActionsReplyAll:
 			{
+			TIMESTAMP( "Reply to all selected from message list" );
 			ReplyAllL( NULL ); // Function will check marked/highlighted msg
 			}
             break;
        	case EFsEmailUiCmdCalActionsForwardAsMail:
 		case EFsEmailUiCmdActionsForward:
 			{
+			TIMESTAMP( "Forward selected from message list" );
            	ForwardL( NULL ); // Function will check marked/highlighted msg
 			}
             break;
@@ -3346,6 +3405,7 @@
        	case EFsEmailUiCmdActionsDeleteCalEvent:
 		case EFsEmailUiCmdActionsDelete:
 			{
+			TIMESTAMP( "Delete to selected from message list" );    
 			TInt index = HighlightedIndex();
 			CFSEmailUiMailListModelItem* item =
 				dynamic_cast<CFSEmailUiMailListModelItem*>(
@@ -3370,6 +3430,7 @@
             break;
 		case EFsEmailUiCmdCompose:
 			{
+			TIMESTAMP( "Create new message selected from message list" );    
 			CreateNewMsgL();
 			}
 			break;
@@ -3421,6 +3482,7 @@
        	case EFsEmailUiCmdOpen:
         case EFsEmailUiCmdActionsOpen:
         	{
+        	TIMESTAMP( "Open email selected from message list" );        
 	        if ( iFocusedControl == EMailListComponent )
 	            {
 	            // Opening can happen only when there's exactly one message marked or in focus
@@ -3536,18 +3598,21 @@
 			        iAppUi.SyncActiveMailBoxL();
 			        // Sync was started by the user
 			        ManualMailBoxSync(ETrue);
-                    iAppUi.ManualMailBoxSync( ETrue );
+                                iAppUi.ManualMailBoxSync( ETrue );
 			        }
 			    }
 			}
 			break;
        	case EFsEmailUiCmdCancelSync:
        		{
-			TBool supportsSync = iAppUi.GetActiveMailbox()->HasCapability( EFSMBoxCapaSupportsSync );
-			if ( supportsSync )
-				{
-	       		iAppUi.StopActiveMailBoxSyncL();
-				}
+		TBool supportsSync = iAppUi.GetActiveMailbox()->HasCapability( EFSMBoxCapaSupportsSync );
+		if ( supportsSync )
+		    {
+	            iAppUi.StopActiveMailBoxSyncL();
+	            // Sync was started by the user
+	            ManualMailBoxSync(ETrue);
+	            iAppUi.ManualMailBoxSync( ETrue );
+		    }
        		}
        		break;
         case EFsEmailUiCmdGoOffline:
@@ -3781,6 +3846,7 @@
         	break;
         } // switch ( aCommand )
     CleanupStack::PopAndDestroy( &actionTargetItems );
+    TIMESTAMP( "Message list selected operation done" );    
     }
 
 // ---------------------------------------------------------------------------
@@ -4339,6 +4405,7 @@
                                 CFSMailMessage* messagePtr = &item->MessagePtr();
                                 if ( messagePtr )
                                     {
+                                    TIMESTAMP( "Open email selected from message list" );    
                                     OpenHighlightedMailL();
                                     return EKeyWasConsumed;
                                     }
@@ -4551,6 +4618,7 @@
             CFSMailMessage* messagePtr = &item->MessagePtr();
             if ( messagePtr )
                 {
+                TIMESTAMP( "Open email selected from message list" );
                 OpenHighlightedMailL();
                 }
             }
@@ -5330,8 +5398,11 @@
                 }
             msgPtr.SaveMessageL();  // Save flag
 
-            // Switch icon to correct one
-            UpdateMsgIconAndBoldingL( aIndex );
+            if ( !iMailOpened )
+                {
+                // Switch icon to correct one if mail list is visible
+                UpdateMsgIconAndBoldingL( aIndex );
+                }
 
             if ( iCurrentSortCriteria.iField == EFSMailSortByUnread )
                 {
@@ -5616,6 +5687,17 @@
         	    }
     		}
 	    }
+	if ( aEntryIds.Count() > 0  )
+		{
+        if ( iMailListUpdater )
+            {
+            if ( iMailListUpdater->IsActive() )
+                {
+                iMailListUpdater->Stop();
+                }
+             iMailListUpdater->StartL();
+             }
+		}
 	if ( iNodesInUse )
 		{
 		RemoveUnnecessaryNodesL();
@@ -6400,6 +6482,8 @@
 	                iMailFolder->GetFolderId(), item->MessagePtr().GetMessageId(), EFSMsgDataEnvelope );
 	        if ( confirmedMsgPtr )
 	            {
+	            iMailOpened = ETrue;
+	            
 	            ChangeMskCommandL( R_FSE_QTN_MSK_EMPTY );
 	            // Pointer confirmed, store Id and delete not needed anymore
 	            TFSMailMsgId confirmedId = confirmedMsgPtr->GetMessageId();
@@ -6489,7 +6573,7 @@
     iDateChanged = ETrue;
     if ( iAppUi.IsForeground() )
         {
-        HandleForegroundEventL();
+        HandleForegroundEventL(ETrue);
         }
     }
 
@@ -6566,50 +6650,53 @@
 	// Check mail list item's type
 	CFSEmailUiMailListModelItem* item =
 		static_cast<CFSEmailUiMailListModelItem*>( iModel->Item( HighlightedIndex() ) );
-	if ( item && item->ModelItemType() == ETypeMailItem )
+	if ( item )
 		{
-		// Add mark as read / unread options
-		iStylusPopUpMenu->SetItemDimmed( EFsEmailUiCmdMarkAsUnread, !IsMarkAsUnreadAvailableL() );
-		iStylusPopUpMenu->SetItemDimmed( EFsEmailUiCmdMarkAsRead, !IsMarkAsReadAvailableL() );
-
-		// Check support for object mail iten moving
-		TBool supportsMoving = iAppUi.GetActiveMailbox()->HasCapability( EFSMBoxCapaMoveToFolder );
-		iStylusPopUpMenu->SetItemDimmed( EFsEmailUiCmdActionsMoveMessage, !supportsMoving );
-
-		// Hide / show follow up
-		TBool supportsFlag = TFsEmailUiUtility::IsFollowUpSupported( *iAppUi.GetActiveMailbox() );
-		iStylusPopUpMenu->SetItemDimmed( EFsEmailUiCmdActionsFlag, !supportsFlag );
-
-		// Hide mark if applicable
-		if ( iMailList->IsMarked( iMailList->FocusedItem() ) )
+		if ( item->ModelItemType() == ETypeMailItem )
 			{
-			iStylusPopUpMenu->SetItemDimmed( EFsEmailUiCmdMark, ETrue );
-			}
-
-		// Hide collapse / expand all
-		iStylusPopUpMenu->SetItemDimmed( EFsEmailUiCmdActionsCollapseAll, ETrue );
-		iStylusPopUpMenu->SetItemDimmed( EFsEmailUiCmdActionsExpandAll, ETrue );
-		}
-	else if ( item->ModelItemType() == ETypeSeparator )
-		{
-		// Hide mark as read / unread options
-		iStylusPopUpMenu->SetItemDimmed( EFsEmailUiCmdMarkAsUnread, ETrue );
-		iStylusPopUpMenu->SetItemDimmed( EFsEmailUiCmdMarkAsRead, ETrue );
-
-		// Hide move & follow up
-		iStylusPopUpMenu->SetItemDimmed( EFsEmailUiCmdActionsMoveMessage, ETrue );
-		iStylusPopUpMenu->SetItemDimmed( EFsEmailUiCmdActionsFlag, ETrue );
-
-		// Hide collapse / expand all when applicable
-		if ( iNodesInUse == EListControlSeparatorDisabled || !iModel->Count() )
-			{
+			// Add mark as read / unread options
+			iStylusPopUpMenu->SetItemDimmed( EFsEmailUiCmdMarkAsUnread, !IsMarkAsUnreadAvailableL() );
+			iStylusPopUpMenu->SetItemDimmed( EFsEmailUiCmdMarkAsRead, !IsMarkAsReadAvailableL() );
+	
+			// Check support for object mail iten moving
+			TBool supportsMoving = iAppUi.GetActiveMailbox()->HasCapability( EFSMBoxCapaMoveToFolder );
+			iStylusPopUpMenu->SetItemDimmed( EFsEmailUiCmdActionsMoveMessage, !supportsMoving );
+	
+			// Hide / show follow up
+			TBool supportsFlag = TFsEmailUiUtility::IsFollowUpSupported( *iAppUi.GetActiveMailbox() );
+			iStylusPopUpMenu->SetItemDimmed( EFsEmailUiCmdActionsFlag, !supportsFlag );
+	
+			// Hide mark if applicable
+			if ( iMailList->IsMarked( iMailList->FocusedItem() ) )
+				{
+				iStylusPopUpMenu->SetItemDimmed( EFsEmailUiCmdMark, ETrue );
+				}
+	
+			// Hide collapse / expand all
 			iStylusPopUpMenu->SetItemDimmed( EFsEmailUiCmdActionsCollapseAll, ETrue );
 			iStylusPopUpMenu->SetItemDimmed( EFsEmailUiCmdActionsExpandAll, ETrue );
 			}
-		else
+		else if ( item->ModelItemType() == ETypeSeparator )
 			{
-			iStylusPopUpMenu->SetItemDimmed( EFsEmailUiCmdActionsCollapseAll, AllNodesCollapsed() );
-			iStylusPopUpMenu->SetItemDimmed( EFsEmailUiCmdActionsExpandAll, AllNodesExpanded() );
+			// Hide mark as read / unread options
+			iStylusPopUpMenu->SetItemDimmed( EFsEmailUiCmdMarkAsUnread, ETrue );
+			iStylusPopUpMenu->SetItemDimmed( EFsEmailUiCmdMarkAsRead, ETrue );
+	
+			// Hide move & follow up
+			iStylusPopUpMenu->SetItemDimmed( EFsEmailUiCmdActionsMoveMessage, ETrue );
+			iStylusPopUpMenu->SetItemDimmed( EFsEmailUiCmdActionsFlag, ETrue );
+	
+			// Hide collapse / expand all when applicable
+			if ( iNodesInUse == EListControlSeparatorDisabled || !iModel->Count() )
+				{
+				iStylusPopUpMenu->SetItemDimmed( EFsEmailUiCmdActionsCollapseAll, ETrue );
+				iStylusPopUpMenu->SetItemDimmed( EFsEmailUiCmdActionsExpandAll, ETrue );
+				}
+			else
+				{
+				iStylusPopUpMenu->SetItemDimmed( EFsEmailUiCmdActionsCollapseAll, AllNodesCollapsed() );
+				iStylusPopUpMenu->SetItemDimmed( EFsEmailUiCmdActionsExpandAll, AllNodesExpanded() );
+				}
 			}
 		}
 
@@ -6851,28 +6938,31 @@
 			}
 		else if ( aEvent == TFSEventMailChanged && iMailFolder ) // Added iMailFolder null safety check
 			{
-			// Change mail item icon or read status
-			RArray<TFSMailMsgId>* entries = static_cast<RArray<TFSMailMsgId>*>( aParam1 );
-			TFSMailMsgId* parentFolderId = static_cast<TFSMailMsgId*>( aParam2 );
-			TFSMailMsgId currentFolderId = iMailFolder->GetFolderId();
-			if ( *parentFolderId == currentFolderId )
-				{
- 	 			// Refresh mailfolder to get correct actual data
-				/*
-                iMailListModelUpdater->Cancel();
-                SafeDelete(iMailFolder);
-				iMailFolder = iAppUi.GetMailClient()->GetFolderByUidL( aMailboxId, currentFolderId );
-				*/
-				for ( TInt i=0 ; i<entries->Count() ; i++ )
-					{
-					TFSMailMsgId msgId = (*entries)[i];
-					TInt idx = ItemIndexFromMessageId( msgId );
-					if ( idx != KErrNotFound )
-					    {
-					    UpdateItemAtIndexL( idx );
-					    }
-					}
-				}
+			if ( !iMailOpened ) // do not handle mail changed while viewer/editor is open. This may cause flickering
+			    {
+    			// Change mail item icon or read status
+    			RArray<TFSMailMsgId>* entries = static_cast<RArray<TFSMailMsgId>*>( aParam1 );
+    			TFSMailMsgId* parentFolderId = static_cast<TFSMailMsgId*>( aParam2 );
+    			TFSMailMsgId currentFolderId = iMailFolder->GetFolderId();
+    			if ( *parentFolderId == currentFolderId )
+    				{
+     	 			// Refresh mailfolder to get correct actual data
+    				/*
+                    iMailListModelUpdater->Cancel();
+                    SafeDelete(iMailFolder);
+    				iMailFolder = iAppUi.GetMailClient()->GetFolderByUidL( aMailboxId, currentFolderId );
+    				*/
+    				for ( TInt i=0 ; i<entries->Count() ; i++ )
+    					{
+    					TFSMailMsgId msgId = (*entries)[i];
+    					TInt idx = ItemIndexFromMessageId( msgId );
+    					if ( idx != KErrNotFound )
+    					    {
+    					    UpdateItemAtIndexL( idx );
+    					    }
+    					}
+    				}
+			    }
 			}
    		else if ( aEvent == TFSEventMailboxSyncStateChanged )
    			{
@@ -6882,14 +6972,25 @@
 	    		switch ( *newSyncState )
 	    			{
 	    			case StartingSync:
-	   					{
-	   					//If sync was started by user, show the synchronisation indicator
-	   					if ( iManualMailBoxSync )
-	   						{
-			   		     	ManualMailBoxSync(EFalse);
-	   						}
-		   				}
-						break;
+	   			    {
+	   			    //If sync was started by user, show the synchronisation indicator
+	   			    if ( iManualMailBoxSync )
+	   			        {
+			   		ManualMailBoxSync(EFalse);
+	   				}
+		   		    }
+				    break;
+						
+	    			case SyncCancelled:
+	    			    {
+	    			    //If sync was started by user, show the synchronisation indicator
+	    			    if ( iManualMailBoxSync )
+	    			        {
+	    			        ManualMailBoxSync(EFalse);
+	    			        }
+	    			    }
+	    			    break;
+						
 	    			}
     			}
 			}