diff -r a3a1ae9acec6 -r da5135c61bad emailuis/emailui/src/FreestyleEmailUiMailListVisualiser.cpp --- a/emailuis/emailui/src/FreestyleEmailUiMailListVisualiser.cpp Mon Mar 15 12:39:10 2010 +0200 +++ b/emailuis/emailui/src/FreestyleEmailUiMailListVisualiser.cpp Wed Mar 31 21:08:33 2010 +0300 @@ -76,7 +76,6 @@ #include "FreestyleEmailUi.hrh" #include "FreestyleEmailUiTextureManager.h" #include "FreestyleEmailUiMailListControl.h" -#include "FreestyleEmailUiMailViewerVisualiser.h" #include "FreestyleEmailUiStatusIndicator.h" #include "freestyleemailcenrephandler.h" #include "FreestyleEmailUiFolderListVisualiser.h" @@ -420,6 +419,10 @@ iTouchFeedBack = MTouchFeedback::Instance(); } +// --------------------------------------------------------------------------- +// Second phase constructor. +// --------------------------------------------------------------------------- +// // CFSEmailUiMailListVisualiser::DoFirstStartL() // Purpose of this function is to do first start things only when list is // really needed to be shown. Implemented to make app startuo faster. @@ -438,16 +441,12 @@ iScreenAnchorLayout = CAlfAnchorLayout::AddNewL( *iMailListControl ); iScreenAnchorLayout->SetFlags(EAlfVisualFlagAutomaticLocaleMirroringEnabled); - // iTouchManager = CEUiEmailListTouchManager::NewL(*this); - // // Create control bar control and append to control group and anchor layout iControlBarControl = CFsControlBar::NewL( iEnv ); iControlBarControl->AddObserverL( *this ); - // iControlBarControl->AddObserverL( *iTouchManager ); - // CreateControlBarLayoutL(); SetMailListLayoutAnchors(); @@ -469,12 +468,9 @@ iMailList->SetMarkTypeL( CFsTreeList::EFsTreeListMultiMarkable ); iMailList->SetIndentationL(0); - // Compared to S60 3.2.3 in S60 5.0 Alf offers the key events in - // opposite order. ControlGroup().AppendL( iMailListControl ); ControlGroup().AppendL( iControlBarControl ); ControlGroup().AppendL( iMailList->TreeControl() ); - // iTreeItemArray.Reset(); @@ -503,13 +499,8 @@ // Set menu, mark and background icons iMailTreeListVisualizer->SetMarkIcon( iAppUi.FsTextureManager()->TextureByIndex( EListControlMarkIcon ) ); iMailTreeListVisualizer->SetMenuIcon( iAppUi.FsTextureManager()->TextureByIndex( EListControlMenuIcon ) ); - // s60 skin support - //iMailTreeListVisualizer->SetBackgroundTextureL( iAppUi.FsTextureManager()->TextureByIndex( EBackgroundTextureMailList ) ); - // iMailList->AddObserverL( *this ); - // iMailList->AddObserverL( *iTouchManager ); - // // Initializing the default stylus long tap popup menu if( !iStylusPopUpMenu ) { @@ -549,7 +540,10 @@ iListMarkItemsState( ETrue ), //Initlly list has no markings iMoveToFolderOngoing( EFalse ), iConsumeStdKeyYes_KeyUp( EFalse ), // use to prevent Call application execution if call for contact processed - iMailOpened(EFalse) + iMailOpened( EFalse ), + iMarkingMode( EFalse ), + iMarkingModeWaitingToExit( EFalse ), + iMarkingModeTextVisual( NULL ) { FUNC_LOG; } @@ -1585,7 +1579,6 @@ iAppUi.StartMonitoringL(); } SetListAndCtrlBarFocusL(); // ShowListL() makes list focused and this may need to be reverted - UnmarkAllItemsL(); if ( aCustomMessageId == TUid::Uid(KMailSettingsReturnFromPluginSettings) ) { // Better to refresh launcher grid view because mailbox branding might be changed. @@ -1721,6 +1714,57 @@ currentFolderType = iMailFolder->GetFolderType(); } + if ( aResourceId == R_FSEMAILUI_MAILLIST_MARKING_MODE_MENUPANE ) + { + if (!CountMarkedItemsL()) + { + aMenuPane->SetItemDimmed( EFsEmailUiCmdMarkingModeDelete, ETrue ); + aMenuPane->SetItemDimmed( EFsEmailUiCmdMarkingModeUnread, ETrue ); + aMenuPane->SetItemDimmed( EFsEmailUiCmdMarkingModeRead, ETrue ); + aMenuPane->SetItemDimmed( EFsEmailUiCmdMarkingModeMove, ETrue ); + aMenuPane->SetItemDimmed( EFsEmailUiCmdMarkingModeFollowUp, ETrue ); + aMenuPane->SetItemDimmed( EFsEmailUiCmdMarkingModeMarkAll, EFalse ); + aMenuPane->SetItemDimmed( EFsEmailUiCmdMarkingModeUnmarkAll, ETrue ); + } + else + { + aMenuPane->SetItemDimmed( EFsEmailUiCmdMarkingModeDelete, EFalse ); + if ( AreAllMarkedItemsUnreadL() ) + { + aMenuPane->SetItemDimmed( EFsEmailUiCmdMarkingModeUnread, ETrue ); + } + else + { + aMenuPane->SetItemDimmed( EFsEmailUiCmdMarkingModeUnread, EFalse ); + } + if ( AreAllMarkedItemsReadL() ) + { + aMenuPane->SetItemDimmed( EFsEmailUiCmdMarkingModeRead, ETrue ); + } + else + { + aMenuPane->SetItemDimmed( EFsEmailUiCmdMarkingModeRead, EFalse ); + } + aMenuPane->SetItemDimmed( EFsEmailUiCmdMarkingModeMove, !supportsMoving ); + aMenuPane->SetItemDimmed( EFsEmailUiCmdMarkingModeFollowUp, !supportsFlag ); + if ( AreAllItemsMarked() ) + { + aMenuPane->SetItemDimmed( EFsEmailUiCmdMarkingModeMarkAll, ETrue ); + aMenuPane->SetItemDimmed( EFsEmailUiCmdMarkingModeUnmarkAll, EFalse ); + } + else if ( AreAllItemsUnmarked() ) + { + aMenuPane->SetItemDimmed( EFsEmailUiCmdMarkingModeMarkAll, EFalse ); + aMenuPane->SetItemDimmed( EFsEmailUiCmdMarkingModeUnmarkAll, ETrue ); + } + else + { + aMenuPane->SetItemDimmed( EFsEmailUiCmdMarkingModeMarkAll, EFalse ); + aMenuPane->SetItemDimmed( EFsEmailUiCmdMarkingModeUnmarkAll, EFalse ); + } + } + } + // MAIN MENU *************************************************************************** if ( aResourceId == R_FSEMAILUI_MAILLIST_MENUPANE ) { @@ -1782,18 +1826,6 @@ aMenuPane->SetItemDimmed( EFsEmailUiCmdActionsReplyAll, ETrue ); aMenuPane->SetItemDimmed( EFsEmailUiCmdActionsForward, ETrue ); aMenuPane->SetItemDimmed( EFsEmailUiCmdMailActions, ETrue); - - TInt markedCount = CountMarkedItemsL(); - // Hide mark/unmark all when not applicable - if ( markedCount == EmailsInModelL() ) // Hide mark all - { - aMenuPane->SetItemDimmed( EFsEmailUiCmdSubMenuMark, ETrue ); - } - if ( markedCount == 0 ) // Hide unmark all - { - aMenuPane->SetItemDimmed( EFsEmailUiCmdSubMenuUnmark, ETrue ); - } - } else { @@ -1825,17 +1857,14 @@ { aMenuPane->SetItemDimmed( EFsEmailUiCmdActionsReplyAll, ETrue ); } - - aMenuPane->SetItemDimmed( EFsEmailUiCmdSubMenuUnmark, ETrue); } // EMPTY LIST, MOST OPTIONS ARE HIDDEN if ( !iModel->Count() || !iMailFolder ) { aMenuPane->SetItemDimmed( EFsEmailUiCmdMailActions, ETrue ); - aMenuPane->SetItemDimmed( EFsEmailUiCmdSubMenuMark, ETrue ); - aMenuPane->SetItemDimmed( EFsEmailUiCmdSubMenuUnmark, ETrue ); aMenuPane->SetItemDimmed( EFsEmailUiCmdSearch, ETrue ); + aMenuPane->SetItemDimmed( EFsEmailUiCmdMarkingMode, ETrue ); } // FOLDER SPECIFIC COMMAND HIDING @@ -1904,35 +1933,6 @@ } // ACTIONS SUBMENU ********************************************************************* - - // MARK SUBMENU ************************************************************************ - // Mark submenu show only when focus is visible - if ( aResourceId == R_FSEMAILUI_MAILLIST_SUBMENU_MARK) - { - // Checks if a device has a keyboard or not. - if( !iLastFocus ) - { - aMenuPane->SetItemDimmed( EFsEmailUiCmdMarkMark, ETrue ); - aMenuPane->SetItemDimmed( EFsEmailUiCmdMarkMarkAll, ETrue ); - } - else - { - aMenuPane->SetItemDimmed( EFsEmailUiCmdMarkSubAll, ETrue ); - } - } - - // MARK SUBMENU ************************************************************************ - - - // UNMARK SUBMENU ************************************************************************ - // Unmark submenu show only when focus is not visible - if ( aResourceId == R_FSEMAILUI_MAILLIST_SUBMENU_UNMARK) - { - // Nothing to do yet - } - // UNMARK SUBMENU ************************************************************************ - - CleanupStack::PopAndDestroy( &targetEntries ); // Add shortcut hints @@ -1998,6 +1998,130 @@ // // --------------------------------------------------------------------------- // +TBool CFSEmailUiMailListVisualiser::AreAllItemsMarked() + { + FUNC_LOG; + + TBool ret(ETrue); + + if ( iTreeItemArray.Count() ) + { + for ( TInt i=0;iIsNode(iTreeItemArray[i].iListItemId ) && + !iMailList->IsMarked( iTreeItemArray[i].iListItemId )) + { + ret = EFalse; + break; + } + } + } + return ret; + } + +// --------------------------------------------------------------------------- +// +// +// --------------------------------------------------------------------------- +// +TBool CFSEmailUiMailListVisualiser::AreAllItemsUnmarked() + { + FUNC_LOG; + + TBool ret(ETrue); + + if ( iTreeItemArray.Count() ) + { + for ( TInt i=0;iIsNode(iTreeItemArray[i].iListItemId ) && + iMailList->IsMarked( iTreeItemArray[i].iListItemId )) + { + ret = EFalse; + break; + } + } + } + return ret; + } + +// --------------------------------------------------------------------------- +// +// +// --------------------------------------------------------------------------- +// +TBool CFSEmailUiMailListVisualiser::AreAllMarkedItemsReadL() + { + FUNC_LOG; + + TBool ret(ETrue); + + if ( iTreeItemArray.Count() ) + { + for ( TInt i=0;iIsNode(iTreeItemArray[i].iListItemId ) && + iMailList->IsMarked( iTreeItemArray[i].iListItemId )) + { + CFSEmailUiMailListModelItem* item = + static_cast( Model()->Item(i) ); + CFSMailMessage* confirmedMsgPtr(0); + confirmedMsgPtr = iAppUi.GetMailClient()->GetMessageByUidL(iAppUi.GetActiveMailboxId(), + iMailFolder->GetFolderId(), item->MessagePtr().GetMessageId(), EFSMsgDataEnvelope ); + TBool isReadMessage = confirmedMsgPtr->IsFlagSet( EFSMsgFlag_Read ); + delete confirmedMsgPtr; + if ( !isReadMessage ) + { + ret = EFalse; + break; + } + } + } + } + return ret; + } + +// --------------------------------------------------------------------------- +// +// +// --------------------------------------------------------------------------- +// +TBool CFSEmailUiMailListVisualiser::AreAllMarkedItemsUnreadL() + { + FUNC_LOG; + + TBool ret(ETrue); + + if ( iTreeItemArray.Count() ) + { + for ( TInt i=0;iIsNode(iTreeItemArray[i].iListItemId ) && + iMailList->IsMarked( iTreeItemArray[i].iListItemId )) + { + CFSEmailUiMailListModelItem* item = + static_cast( Model()->Item(i) ); + CFSMailMessage* confirmedMsgPtr(0); + confirmedMsgPtr = iAppUi.GetMailClient()->GetMessageByUidL(iAppUi.GetActiveMailboxId(), + iMailFolder->GetFolderId(), item->MessagePtr().GetMessageId(), EFSMsgDataEnvelope ); + TBool isReadMessage = confirmedMsgPtr->IsFlagSet( EFSMsgFlag_Read ); + delete confirmedMsgPtr; + if ( isReadMessage ) + { + ret = EFalse; + break; + } + } + } + } + return ret; + } + +// --------------------------------------------------------------------------- +// +// +// --------------------------------------------------------------------------- +// void CFSEmailUiMailListVisualiser::GetMarkedMessagesL( RArray& aMessageIDs ) const { FUNC_LOG; @@ -2047,6 +2171,192 @@ // // --------------------------------------------------------------------------- // +void CFSEmailUiMailListVisualiser::ExitMarkingModeL() + { + FUNC_LOG; + iMarkingMode = EFalse; + UnmarkAllItemsL(); + // Change softkeys back to normal + SetViewSoftkeysL( R_FREESTYLE_EMAUIL_UI_SK_OPTIONS_BACK ); + // Change options menu back to normal + CEikMenuBar* menu = iAppUi.CurrentActiveView()->MenuBar(); + menu->StopDisplayingMenuBar(); + menu->SetMenuTitleResourceId(R_FSEMAILUI_MAILLIST_MENUBAR); + // Change background back to normal + DisplayMarkingModeBgL( EFalse ); + // Display drop down menu buttons + iNewEmailButton->ShowButtonL(); + iFolderListButton->ShowButtonL(); + iSortButton->ShowButtonL(); + iNewEmailButton->SetDimmed( EFalse ); + iFolderListButton->SetDimmed( EFalse ); + iSortButton->SetDimmed( EFalse ); + // Hide marking mode text on the place of drop down menus + RemoveMarkingModeTitleTextL(); + } + +// --------------------------------------------------------------------------- +// +// +// --------------------------------------------------------------------------- +// +void CFSEmailUiMailListVisualiser::EnterMarkingModeL() + { + FUNC_LOG; + iMarkingMode = ETrue; + iListMarkItemsState = ETrue; // shift-scrolling does marking after one item is marked + HandleCommandL( EFsEmailUiCmdActionsExpandAll ); + // Change softkeys for marking mode + SetViewSoftkeysL( R_FREESTYLE_EMAUIL_UI_SK_OPTIONS_CANCEL ); + // Change options menu for marking mode + CEikMenuBar* menu = iAppUi.CurrentActiveView()->MenuBar(); + menu->StopDisplayingMenuBar(); + menu->SetMenuTitleResourceId(R_FSEMAILUI_MAILLIST_MENUBAR_MARKING_MODE); + // Change background to marking mode + DisplayMarkingModeBgL( ETrue ); + // Hide drop down menu buttons + if( Layout_Meta_Data::IsLandscapeOrientation() ) + { + iNewEmailButton->SetDimmed(); + iFolderListButton->SetDimmed(); + iSortButton->SetDimmed(); + } + else + { + iNewEmailButton->HideButton(); + iFolderListButton->HideButton(); + iSortButton->HideButton(); + } + // Display marking mode text on the place of drop down menus + DisplayMarkingModeTitleTextL(); + } + +// --------------------------------------------------------------------------- +// +// +// --------------------------------------------------------------------------- +// +void CFSEmailUiMailListVisualiser::RefreshMarkingModeL() + { + FUNC_LOG; + if ( iMarkingMode ) + { + // Hide drop down menu buttons + if( !Layout_Meta_Data::IsLandscapeOrientation() ) + { + iNewEmailButton->ShowButtonL(); + iNewEmailButton->HideButton(); + iFolderListButton->ShowButtonL(); + iFolderListButton->HideButton(); + iSortButton->ShowButtonL(); + iSortButton->HideButton(); + } + else + { + iNewEmailButton->ShowButtonL(); + iNewEmailButton->SetDimmed(); + iFolderListButton->ShowButtonL(); + iFolderListButton->SetDimmed(); + iSortButton->ShowButtonL(); + iSortButton->SetDimmed(); + } + + RemoveMarkingModeTitleTextL(); + DisplayMarkingModeTitleTextL(); + } + } + +// --------------------------------------------------------------------------- +// +// +// --------------------------------------------------------------------------- +// +void CFSEmailUiMailListVisualiser::DisplayMarkingModeTitleTextL() + { + FUNC_LOG; + if (!iMarkingModeTextVisual) + { + const TRect sortButtonRect( iAppUi.LayoutHandler()->GetControlBarSortButtonRect() ); + const TRect newMailButtonRect( iAppUi.LayoutHandler()->GetControlBarNewEmailButtonRect() ); + + iMarkingModeTextRect = TRect( newMailButtonRect.iTl, sortButtonRect.iBr ); + iMarkingModeTextParentLayout = CAlfDeckLayout::AddNewL( *iMailListControl ); + iMarkingModeTextParentLayout->SetFlags( EAlfVisualFlagManualLayout ); + iMarkingModeTextParentLayout->SetRect( iMarkingModeTextRect ); + + iMarkingModeTextContentLayout = CAlfAnchorLayout::AddNewL( *iMailListControl, iMarkingModeTextParentLayout ); + + iMarkingModeTextVisual = CAlfTextVisual::AddNewL( *iMailListControl, iMarkingModeTextContentLayout ); + iMarkingModeTextVisual->SetWrapping( CAlfTextVisual::ELineWrapTruncate ); + if ( AknLayoutUtils::LayoutMirrored() ) + { + iMarkingModeTextVisual->SetAlign( EAlfAlignHRight, EAlfAlignVCenter ); + } + else + { + iMarkingModeTextVisual->SetAlign( EAlfAlignHLeft, EAlfAlignVCenter ); + } + iMarkingModeTextVisual->SetStyle( EAlfTextStyleTitle ); + TRgb color = iAppUi.LayoutHandler()->ListNodeTextColor(); + iMarkingModeTextVisual->SetColor ( color ); + if( !Layout_Meta_Data::IsLandscapeOrientation() ) + { + HBufC* msg = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_MARKINGMODE ); + iMarkingModeTextVisual->SetTextL( *msg ); + CleanupStack::PopAndDestroy( msg ); + } + else + { + iMarkingModeTextVisual->SetTextL( KNullDesC ); + } + } + } + +// --------------------------------------------------------------------------- +// +// +// --------------------------------------------------------------------------- +// +void CFSEmailUiMailListVisualiser::RemoveMarkingModeTitleTextL() + { + FUNC_LOG; + if (iMarkingModeTextVisual) + { + iMarkingModeTextVisual->SetTextL( KNullDesC ); + iMarkingModeTextVisual->RemoveAndDestroyAllD(); + iMarkingModeTextVisual = NULL; + iMarkingModeTextContentLayout->RemoveAndDestroyAllD(); + iMarkingModeTextContentLayout = NULL; + iMarkingModeTextParentLayout->RemoveAndDestroyAllD(); + iMarkingModeTextParentLayout = NULL; + } + } + +// --------------------------------------------------------------------------- +// +// +// --------------------------------------------------------------------------- +// +void CFSEmailUiMailListVisualiser::DisplayMarkingModeBgL( TBool aDisplay ) + { + FUNC_LOG; + if (aDisplay) + { + CAlfBrush* brush = iAppUi.FsTextureManager()->NewMailListMarkingModeBgBrushLC(); + iMailTreeListVisualizer->SetBackgroundBrushL( brush ); + CleanupStack::Pop( brush ); + } + else + { + iMailTreeListVisualizer->ClearBackground(); + } + } + +// --------------------------------------------------------------------------- +// +// +// --------------------------------------------------------------------------- +// void CFSEmailUiMailListVisualiser::RefreshL( TFSMailMsgId* aFocusToMessage ) { FUNC_LOG; @@ -2206,6 +2516,14 @@ DoRefresh( this ); } + if (iMarkingModeWaitingToExit) + { + if ( iAppUi.CurrentActiveView()->Id() == MailListId ) + { + iMarkingModeWaitingToExit = EFalse; + TRAP_IGNORE( ExitMarkingModeL() ); + } + } } // --------------------------------------------------------------------------- @@ -2720,7 +3038,7 @@ if ( aType == ESkinChanged ) { - UpdateTheme(); + UpdateThemeL(); } else { @@ -2742,6 +3060,10 @@ iAppUi.FolderList().HandleDynamicVariantSwitchL( aType ); } } + if (iMarkingMode) + { + RefreshMarkingModeL(); + } } // --------------------------------------------------------------------------- @@ -2756,7 +3078,7 @@ CFsEmailUiViewBase::HandleDynamicVariantSwitchOnBackgroundL( aType ); if ( aType == ESkinChanged ) { - UpdateTheme(); + UpdateThemeL(); } else if ( aType == EScreenLayoutChanged ) { @@ -3129,7 +3451,7 @@ // // --------------------------------------------------------------------------- // -void CFSEmailUiMailListVisualiser::UpdateTheme(const TBool aSystemUpdate) +void CFSEmailUiMailListVisualiser::UpdateThemeL(const TBool aSystemUpdate) { iSkinChanged = aSystemUpdate; @@ -3144,6 +3466,17 @@ iSortButton->SetNormalTextColor( normalTextColor ); iSortButton->SetFocusedTextColor( focusedTextColor ); + + //TJOS-83DELP fix/workaround + //sometimes theme wasn't properly refreshed on buttons, this helps + iNewEmailButton->HideButton(); + iNewEmailButton->ShowButtonL(); + + iFolderListButton->HideButton(); + iFolderListButton->ShowButtonL(); + + iSortButton->HideButton(); + iSortButton->ShowButtonL(); } // --------------------------------------------------------------------------- @@ -3225,6 +3558,10 @@ iSkinChanged = EFalse; // Toggle handled iDateChanged = EFalse; // Toggle handled } + if (iMarkingMode) + { + RefreshMarkingModeL(); + } } } @@ -3281,7 +3618,7 @@ aCommand == EFsEmailUiCmdMarkAsUnread || aCommand == EFsEmailUiCmdActionsMove || aCommand == EFsEmailUiCmdActionsMoveMessage || - aCommand == EFsEmailUiCmdMarkUnmarkToggle || + aCommand == EFsEmailUiCmdMarkingModeFromPopUp || aCommand == EFsEmailUiCmdActionsCollapseAll || aCommand == EFsEmailUiCmdActionsExpandAll ) ) { @@ -3373,6 +3710,12 @@ NavigateBackL(); } break; + case EAknSoftkeyCancel: + if (iMarkingMode) + { + ExitMarkingModeL(); + } + break; case EEikCmdExit: case EAknSoftkeyExit: case EFsEmailUiCmdExit: @@ -3656,39 +3999,63 @@ // iAppUi.EnterFsEmailViewL( DownloadManagerViewId ); // break; // - case EFsEmailUiCmdMarkMark: - { - iListMarkItemsState = ETrue; // shift-scrolling does marking after one item is marked - iMailList->MarkItemL( iMailList->FocusedItem(), ETrue ); - } - break; - case EFsEmailUiCmdMarkMarkAll: - { - MarkAllItemsL(); - } - break; - case EFsEmailUiCmdMarkUnmark: - { - iListMarkItemsState = EFalse; // shift-scrolling does unmarking after one item is unmarked - iMailList->MarkItemL( iMailList->FocusedItem(), EFalse ); - } - break; - case EFsEmailUiCmdMarkUnmarkAll: - { - UnmarkAllItemsL(); - } - break; - - case EFsEmailUiCmdMarkSubAll: - { - MarkAllItemsL(); - } - break; - case EFsEmailUiCmdUnmarkSubAll: - { - UnmarkAllItemsL(); - } - break; + case EFsEmailUiCmdMarkingModeFromPopUp: + { + EnterMarkingModeL(); + // Mark current item first + TInt focusedItem = iMailList->FocusedItem(); + if ( focusedItem > 0 && iFocusedControl == EMailListComponent ) + { + CFSEmailUiMailListModelItem* item = dynamic_cast(iModel->Item(HighlightedIndex())); + if ( item && item->ModelItemType() == ETypeMailItem ) + { + iMailList->MarkItemL( iMailList->FocusedItem(), ETrue ); + } + else if ( item && item->ModelItemType() == ETypeSeparator ) + { + TInt index = HighlightedIndex(); + MarkItemsUnderSeparatorL( ETrue, index ); + } + } + } + break; + case EFsEmailUiCmdMarkingMode: + { + EnterMarkingModeL(); + } + break; + case EFsEmailUiCmdMarkingModeDelete: + { + DeleteMessagesL(); + } + break; + case EFsEmailUiCmdMarkingModeUnread: + { + ChangeReadStatusOfMarkedL( EFalse ); + ExitMarkingModeL(); + } + break; + case EFsEmailUiCmdMarkingModeRead: + { + ChangeReadStatusOfMarkedL( ETrue ); + ExitMarkingModeL(); + } + break; + case EFsEmailUiCmdMarkingModeFollowUp: + { + SetMessageFollowupFlagL(); + } + break; + case EFsEmailUiCmdMarkingModeMarkAll: + { + MarkAllItemsL(); + } + break; + case EFsEmailUiCmdMarkingModeUnmarkAll: + { + UnmarkAllItemsL(); + } + break; case EFsEmailUiCmdReadEmail: { iAppUi.StartReadingEmailsL(); @@ -3793,6 +4160,11 @@ } } break; + case EFsEmailUiCmdMarkingModeMove: + { + iMarkingModeWaitingToExit = ETrue; + } + // Flow through case EFsEmailUiCmdActionsMove: case EFsEmailUiCmdActionsMoveMessage: { @@ -3820,33 +4192,6 @@ ShortcutReadUnreadToggleL(); } break; - case EFsEmailUiCmdMarkUnmarkToggle: - { - TInt focusedItem = iMailList->FocusedItem(); - if ( focusedItem > 0 && iFocusedControl == EMailListComponent ) - { - CFSEmailUiMailListModelItem* item = dynamic_cast(iModel->Item(HighlightedIndex())); - if ( item && item->ModelItemType() == ETypeMailItem ) - { - if ( iMailList->IsMarked( focusedItem ) ) - { - HandleCommandL(EFsEmailUiCmdMarkUnmark); - } - else - { - HandleCommandL(EFsEmailUiCmdMarkMark); - } - } - else if ( item && item->ModelItemType() == ETypeSeparator ) - { - // Currently only mark is done since mark should activate - // marking mode for messages. Unmark can be done via message long tap menu. - TInt index = HighlightedIndex(); - MarkItemsUnderSeparatorL( ETrue, index ); - } - } - } - break; case EFsEmailUiCmdGoToSwitchFolder: { iControlBarControl->SetFocusByIdL( iFolderListButtonId ); @@ -4201,6 +4546,10 @@ } } } + if ( iMarkingMode ) + { + ExitMarkingModeL(); + } } CleanupStack::PopAndDestroy( &targetMsgIds ); } @@ -4512,32 +4861,33 @@ TInt modelCount( modelCount = iModel->Count() ); if ( modelCount ) // Safety check { - CFSEmailUiMailListModelItem* item = - dynamic_cast( iModel->Item( HighlightedIndex() ) ); - // MAIL ITEM; OPEN MAIL - if ( item && item->ModelItemType() == ETypeMailItem ) + if (iMarkingMode) + { + //Do not open mail or expand/collapse separator in marking mode + DoHandleListItemOpenL(); + } + else { - CFSMailMessage* messagePtr = &item->MessagePtr(); - if ( messagePtr ) + CFSEmailUiMailListModelItem* item = + dynamic_cast( iModel->Item( HighlightedIndex() ) ); + // MAIL ITEM; OPEN MAIL + if ( item && item->ModelItemType() == ETypeMailItem ) { - TIMESTAMP( "Open email selected from message list" ); - OpenHighlightedMailL(); + CFSMailMessage* messagePtr = &item->MessagePtr(); + if ( messagePtr ) + { + TIMESTAMP( "Open email selected from message list" ); + OpenHighlightedMailL(); + return EKeyWasConsumed; + } + } + // SEPARAOR ITEM; COLLAPSE / EXPAND NODE + else if ( item && item->ModelItemType() == ETypeSeparator ) + { + ExpandOrCollapseL(); return EKeyWasConsumed; } } - // SEPARAOR ITEM; COLLAPSE / EXPAND NODE - else if ( item && item->ModelItemType() == ETypeSeparator ) - { - if ( iMailList->IsExpanded( iMailList->FocusedItem()) ) - { - ExpandOrCollapseL(); - } - else - { - ExpandOrCollapseL(); - } - return EKeyWasConsumed; - } } } else @@ -4727,25 +5077,56 @@ { CFSEmailUiMailListModelItem* item = dynamic_cast( iModel->Item( HighlightedIndex() ) ); - // MAIL ITEM; OPEN MAIL - if ( item && item->ModelItemType() == ETypeMailItem ) - { - CFSMailMessage* messagePtr = &item->MessagePtr(); - if ( messagePtr ) - { - TIMESTAMP( "Open email selected from message list" ); - OpenHighlightedMailL(); - } - - // Give feedback to user (vibration) - iTouchFeedBack->InstantFeedback(ETouchFeedbackBasic); - } - // SEPARATOR ITEM; COLLAPSE / EXPAND NODE - else if ( item && item->ModelItemType() == ETypeSeparator ) - { - ExpandOrCollapseL(); - SetMskL(); - } + if ( iMarkingMode ) + { + // In marking mode. Mark/unmark it instead of opening it. + if ( item && item->ModelItemType() == ETypeMailItem ) + { + if (iMailList->IsMarked( iMailList->FocusedItem() )) + { + iMailList->MarkItemL( iMailList->FocusedItem(), EFalse ); + } + else + { + iMailList->MarkItemL( iMailList->FocusedItem(), ETrue ); + } + } + else if ( item && item->ModelItemType() == ETypeSeparator ) + { + TInt index = HighlightedIndex(); + if ( AreAllItemsMarkedUnderSeparatorL( index ) ) + { + MarkItemsUnderSeparatorL( EFalse, index ); + } + else + { + MarkItemsUnderSeparatorL( ETrue, index ); + } + } + } + else + { + + // MAIL ITEM; OPEN MAIL + if ( item && item->ModelItemType() == ETypeMailItem ) + { + CFSMailMessage* messagePtr = &item->MessagePtr(); + if ( messagePtr ) + { + TIMESTAMP( "Open email selected from message list" ); + OpenHighlightedMailL(); + } + + // Give feedback to user (vibration) + iTouchFeedBack->InstantFeedback(ETouchFeedbackBasic); + } + // SEPARATOR ITEM; COLLAPSE / EXPAND NODE + else if ( item && item->ModelItemType() == ETypeSeparator ) + { + ExpandOrCollapseL(); + SetMskL(); + } + } } } @@ -4805,10 +5186,41 @@ if ( 0 < iModel->Count() ) // Safety check { - RFsTreeItemIdList markedEntries; - iMailList->GetMarkedItemsL( markedEntries ); - if ( markedEntries.Count() >= 0 ) - { + if ( iMarkingMode ) + { + iMailTreeListVisualizer->SetFocusVisibility( EFalse ); + TInt currentFocusState = iMailList->IsFocused(); + iMailList->SetFocusedL( EFalse ); + iMailList->SetFocusedL( currentFocusState ); + CFSEmailUiMailListModelItem* item = + dynamic_cast( iModel->Item( HighlightedIndex() ) ); + // In marking mode. Mark/unmark it instead of open popup. + if ( item && item->ModelItemType() == ETypeMailItem ) + { + if (iMailList->IsMarked( iMailList->FocusedItem() )) + { + iMailList->MarkItemL( iMailList->FocusedItem(), EFalse ); + } + else + { + iMailList->MarkItemL( iMailList->FocusedItem(), ETrue ); + } + } + else if ( item && item->ModelItemType() == ETypeSeparator ) + { + TInt index = HighlightedIndex(); + if ( AreAllItemsMarkedUnderSeparatorL( index ) ) + { + MarkItemsUnderSeparatorL( EFalse, index ); + } + else + { + MarkItemsUnderSeparatorL( ETrue, index ); + } + } + } + else + { LaunchStylusPopupMenuL( aPoint ); } } @@ -5185,7 +5597,7 @@ // Icons and sort button text iFolderListButton->SetIconL( iAppUi.FsTextureManager()->TextureByIndex( EListControlBarMailboxDefaultIcon ) ); - iNewEmailButton->SetIconL( iAppUi.FsTextureManager()->TextureByIndex( EListTextureNewEmailDefaultIcon ) ); + iNewEmailButton->SetIconL( iAppUi.FsTextureManager()->TextureByIndex( EListTextureCreateNewMessageIcon ) ); SetSortButtonTextAndIconL(); iNewEmailButton->SetElemAlignL( @@ -5244,11 +5656,13 @@ iFolderListButton->SetTextFontL( textLayout.Font()->FontSpecInTwips() ); iSortButton->SetTextFontL( textLayout.Font()->FontSpecInTwips() ); - UpdateTheme(EFalse); - - iNewEmailButton->ShowButtonL(); - iFolderListButton->ShowButtonL(); - iSortButton->ShowButtonL(); + UpdateThemeL(EFalse); + if (!iMarkingMode) + { + iNewEmailButton->ShowButtonL(); + iFolderListButton->ShowButtonL(); + iSortButton->ShowButtonL(); + } } // --------------------------------------------------------------------------- @@ -5517,7 +5931,7 @@ msgPtr.SaveMessageL(); // Save flag // Switch icon to correct one if mail list is visible - // UpdateMsgIconAndBoldingL( aIndex ); + UpdateMsgIconAndBoldingL( aIndex ); if ( iCurrentSortCriteria.iField == EFSMailSortByUnread ) { @@ -5750,23 +6164,15 @@ if ( aItemData && aItemVis && aMsgPtr ) { CAlfTexture* itemTexture = &TFsEmailUiUtility::GetMsgIcon( aMsgPtr, *iAppUi.FsTextureManager() ); - aItemData->SetIcon( *itemTexture ); - - // Set font according the read status - if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Read ) ) - { - CAlfTextStyle* textStyle = iAppUi.LayoutHandler()->FSTextStyleFromIdL( EFSFontTypeSmall ); - aItemVis->SetTextStyleId ( textStyle->Id() ); - aItemVis->SetTextBold( EFalse ); - } - else - { - CAlfTextStyle* textStyle = iAppUi.LayoutHandler()->FSTextStyleFromIdL( EFSFontTypeSmallBold ); - aItemVis->SetTextStyleId ( textStyle->Id() ); - aItemVis->SetTextBold( ETrue ); - } - + TInt variety( Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0 ); + CAlfTextStyle& textStyle = + iAppUi.LayoutHandler()->FSTextStyleFromLayoutL( + AknLayoutScalable_Apps::list_single_dyc_row_text_pane_t1( variety ) ); + const TBool isNotRead( !aMsgPtr->IsFlagSet( EFSMsgFlag_Read ) ); + textStyle.SetBold( isNotRead ); + aItemVis->SetTextBold( isNotRead ); + aItemVis->SetTextStyleId ( textStyle.Id() ); // Set follow up flag icon if ( aMsgPtr->IsFlagSet( EFSMsgFlag_FollowUp ) ) { @@ -5793,7 +6199,9 @@ void CFSEmailUiMailListVisualiser::RemoveMsgItemsFromListIfFoundL( const RArray& aEntryIds ) { FUNC_LOG; - for ( TInt i=0 ; iRemoveL( iTreeItemArray[idx].iListItemId ); // remove from list iTreeItemArray.Remove( idx ); // remove from internal array. iModel->RemoveAndDestroy( idx ); // Remove from model + itemFound = ETrue; } } } - if ( aEntryIds.Count() > 0 ) - { - if ( iMailListUpdater ) - { - if ( iMailListUpdater->IsActive() ) - { - iMailListUpdater->Stop(); - } - iMailListUpdater->StartL(); - } - } + + if ( !itemFound ) + { + return; // no items to be removed + } + if ( iNodesInUse ) { RemoveUnnecessaryNodesL(); @@ -5932,6 +6336,7 @@ { if (ConfirmDeleteL(entries.Count(), entries[0])) { + ExitMarkingModeL(); if (entries.Count() > KMsgDeletionWaitNoteAmount) { TFsEmailUiUtility::ShowWaitNoteL(iDeletingWaitNote, @@ -6376,6 +6781,7 @@ switch ( aResponse ) { case EFSEmailUiCtrlBarResponseCancel: + iMarkingModeWaitingToExit = EFalse; SetMskL(); return; case EFSEmailUiCtrlBarResponseSelect: @@ -6416,6 +6822,7 @@ } return; case EFSEmailUiCtrlBarResponseCancel: + iMarkingModeWaitingToExit = EFalse; SetMskL(); // Touch //Set touchmanager back to active @@ -6840,12 +7247,6 @@ 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 ); @@ -7367,6 +7768,11 @@ FUNC_LOG; TBool ret = EFalse; + if ( !iMarkingMode ) + { + EnterMarkingModeL(); + } + // if ( iFocusedControl == EMailListComponent && iModel->Count() ) // @@ -7419,6 +7825,44 @@ } } } + +// Check if all items under current separator are marked +TBool CFSEmailUiMailListVisualiser::AreAllItemsMarkedUnderSeparatorL( TInt aSeparatorId ) + { + FUNC_LOG; + + TBool ret(ETrue); + + if ( iTreeItemArray.Count() ) + { + // Find all items under wanted separator. + for ( TInt i = aSeparatorId + 1; i < iTreeItemArray.Count(); i++ ) + { + CFSEmailUiMailListModelItem* item = + static_cast( iModel->Item( i ) ); + + // Mark / unmark mail items. + if ( item && + item->ModelItemType() == ETypeMailItem && + !iMailList->IsNode( iTreeItemArray[i].iListItemId ) ) + { + if ( !iMailList->IsMarked( iTreeItemArray[i].iListItemId )) + { + // Att least one unmarked item found + ret = EFalse; + break; + } + } + else + { + // Stop iteration since another iterator was reached. + break; + } + } + } + return ret; + } + // Navigation functions, used mainly from viewer TBool CFSEmailUiMailListVisualiser::IsNextMsgAvailable( TFSMailMsgId aCurrentMsgId, TFSMailMsgId& aFoundNextMsgId,