--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/emailuis/emailui/src/FreestyleEmailUiSearchListVisualiser.cpp Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,2688 @@
+/*
+* Copyright (c) 2009 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 file implements class CFSEmailUiSearchListVisualiser.
+*
+*/
+
+
+
+// SYSTEM INCLUDES
+#include "emailtrace.h"
+#include <freestyleemailui.mbg>
+#include <AknUtils.h>
+#include <gulicon.h>
+#include <StringLoader.h>
+#include <FreestyleEmailUi.rsg>
+
+//<cmail>
+#include "CFSMailMessage.h"
+#include "CFSMailClient.h"
+#include "CFSMailFolder.h"
+#include "CFSMailBox.h"
+#include <alf/alfframebrush.h>
+#include <alf/alftextvisual.h>
+#include "fstreelist.h"
+#include "fstreevisualizerbase.h"
+#include "fstreeplaintwolineitemdata.h"
+#include "fstreeplaintwolineitemvisualizer.h"
+#include "fstreeplainonelinenodedata.h"
+#include "fstreeplainonelinenodevisualizer.h"
+
+//</cmail>
+#include <AknQueryDialog.h>
+//<cmail>
+#include "CFSMailCommon.h"
+#include <alf/alfanchorlayout.h>
+#include <alf/alfdecklayout.h>
+#include <alf/alfcontrolgroup.h>
+#include <alf/alfevent.h>
+#include <alf/alfbrusharray.h>
+// </cmail>
+#include <alf/alfenv.h>
+#include <alf/alfcommand.h>
+#include <aknnotewrappers.h>
+// <cmail>
+#include <aknlayoutscalable_apps.cdl.h>
+// </cmail>
+#include <featmgr.h>
+//</cmail>
+
+//<cmail>
+#include "cfsccontactactionmenu.h"
+#include "mfsccontactactionmenumodel.h"
+#include "fscontrolbar.h"
+#include "fscontrolbuttoninterface.h"
+#include "fscontrolbuttonvisualiser.h"
+#include <csxhelp/cmail.hlp.hrh>
+// </cmail>
+
+// Meeting request headers
+#include <MeetingRequestUids.hrh>
+//<cmail>
+#include "cesmricalviewer.h"
+//</cmail>
+
+// INTERNAL INCLUDES
+#include "FreestyleEmailUiLayoutHandler.h"
+#include "FreestyleEmailUiMailListModel.h"
+#include "FreestyleEmailUiMailListVisualiser.h"
+#include "FreestyleEmailUiSearchListVisualiser.h"
+#include "FreestyleEmailUiSearchListControl.h"
+#include "FreestyleEmailUiFileSystemInfo.h"
+#include "FreestyleEmailUiAppui.h"
+#include "FreestyleEmailUi.hrh"
+#include "FreestyleEmailUiTextureManager.h"
+#include "FreestyleEmailUiMailViewerVisualiser.h"
+#include "FreestyleEmailUiUtilities.h"
+#include "FreestyleEmailUiLiterals.h"
+#include "FreestyleEmailUiShortcutBinding.h"
+#include "FreestyleEmailUiMsgDetailsVisualiser.h"
+#include "FreestyleEmailCenRepHandler.h"
+#include "FreestyleEmailUiHtmlViewerView.h"
+#include "FSEmail.pan"
+
+// CONST VALUES
+static const TInt KMaxLengthOfSearchString = 255;
+//<cmail> s60 platform layouts
+//static const TInt KSearchIconWidth = 30;
+const TReal KFSHeaderTextBackgroundOpacity = 0.3f;
+//</cmail>
+static const TInt KItemExpansionDelay = 400;
+static const TInt KListScrollingDelay = 200;
+static const TInt KMaxPreviewPaneLength = 60;
+
+
+
+CFSEmailUiSearchListVisualiser* CFSEmailUiSearchListVisualiser::NewL(CAlfEnv& aEnv,
+ CFreestyleEmailUiAppUi* aAppUi,
+ CAlfControlGroup& aSearchListControlGroup )
+ {
+ FUNC_LOG;
+ CFSEmailUiSearchListVisualiser* self = CFSEmailUiSearchListVisualiser::NewLC(aEnv, aAppUi, aSearchListControlGroup );
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CFSEmailUiSearchListVisualiser* CFSEmailUiSearchListVisualiser::NewLC(CAlfEnv& aEnv,
+ CFreestyleEmailUiAppUi* aAppUi,
+ CAlfControlGroup& aSearchListControlGroup)
+{
+ FUNC_LOG;
+ CFSEmailUiSearchListVisualiser* self = new (ELeave) CFSEmailUiSearchListVisualiser(aAppUi, aEnv, aSearchListControlGroup);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ return self;
+}
+
+void CFSEmailUiSearchListVisualiser::ConstructL()
+ {
+ FUNC_LOG;
+ BaseConstructL( R_FSEMAILUI_MAIL_SEARCH_VIEW );
+
+ // Set list as initial focused control
+ iThisViewActive = EFalse;
+ iFirstStartCompleted = EFalse;
+ }
+
+// CFSEmailUiSearchListVisualiser::DoFirstStartL()
+// Purpose of this function is to do first start only when search list is
+// really needed to be shown. Implemented to make app startuo faster.
+void CFSEmailUiSearchListVisualiser::DoFirstStartL()
+ {
+ FUNC_LOG;
+ TRect screenRect;
+ AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EScreen, screenRect );
+
+ // Create control and anchor layout
+ iSearchListControl = CFreestyleEmailUiSearchListControl::NewL( *iEnv, this );
+ iScreenAnchorLayout = CAlfAnchorLayout::AddNewL( *iSearchListControl );
+ iScreenAnchorLayout->SetFlags(EAlfVisualFlagAutomaticLocaleMirroringEnabled);
+ SetSearchListLayoutAnchors();
+
+ // Create top bar layout
+ iSearchTopBarLayout = CAlfDeckLayout::AddNewL( *iSearchListControl, iScreenAnchorLayout );
+ iBarBgVisual = CAlfImageVisual::AddNewL( *iSearchListControl, iSearchTopBarLayout );
+ /*<cmail> paltform layout changes to cmail
+ TAlfTimedValue barBgTextureOpacity;
+ barBgTextureOpacity.SetValueNow( 1 );
+ iBarBgVisual->SetOpacity( barBgTextureOpacity );
+ CAlfTexture* barBgTexture = &iAppUi.FsTextureManager()->TextureByIndex( EMailListBarBgIcon );
+ barBgTexture->Size().SetSize( screenRect.Width(), iAppUi.LayoutHandler()->ControlBarHeight() );
+ iBarBgVisual->SetImage( TAlfImage( *barBgTexture ) );
+ */ //</cmail>
+
+ /*<cmail> magnifier image is not in cmail
+ // Add bar image component
+ iBarFindImage = CAlfImageVisual::AddNewL( *iSearchListControl, iScreenAnchorLayout );
+ TAlfTimedValue barFindImageOpacity;
+ barFindImageOpacity.SetValueNow( 1 );
+ iBarFindImage->SetOpacity( barFindImageOpacity );
+ CAlfTexture* barFindTexture = &iAppUi.FsTextureManager()->TextureByIndex( ESearchLookingGlassIcon );
+ barFindTexture->Size().SetSize( 15, 15 );
+ iBarFindImage->SetImage( TAlfImage( *barFindTexture ) );
+ */ //</cmail>
+
+ // <cmail>
+ // Add bar text component
+ iBarTextVisual = CAlfTextVisual::AddNewL( *iSearchListControl, iScreenAnchorLayout );
+ iBarTextVisual->EnableShadow(EFalse);
+ iBarTextVisual->SetWrapping( CAlfTextVisual::ELineWrapTruncate );
+ // </cmail>
+
+ /*<cmail> no initial text or opacity required in cmail
+ HBufC* initialSearchText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_FIND_DLG_SEARCH );
+ iBarTextVisual->SetTextL( *initialSearchText );
+ CleanupStack::PopAndDestroy( initialSearchText );
+ TAlfTimedValue barTextVisualOpacity;
+ barTextVisualOpacity.SetValueNow( 1 );
+ iBarTextVisual->SetOpacity( barTextVisualOpacity );
+
+ CAlfTextStyle* textStyle = iAppUi.LayoutHandler()->FSTextStyleFromIdL( EFSFontTypeSmallBold );
+ iBarTextVisual->SetTextStyle ( textStyle->Id() );*/ //</cmail>
+ if ( !AknLayoutUtils::LayoutMirrored() )
+ {
+ iBarTextVisual->SetAlign(EAlfAlignHLeft, EAlfAlignVCenter);
+ }
+ else
+ {
+ iBarTextVisual->SetAlign(EAlfAlignHRight, EAlfAlignVCenter);
+ }
+
+ // Create model
+ iModel = CFSEmailUiMailListModel::NewL( &iAppUi, ETrue );
+
+ // Create list and append to control group and anchor layout
+ iSearchListLayout = CAlfDeckLayout::AddNewL( *iSearchListControl, iScreenAnchorLayout );
+ iSearchListLayout->SetSize( TSize( screenRect.Width(), screenRect.Height()-
+ iAppUi.LayoutHandler()->ControlBarHeight() ) );
+ iSearchTreeListVisualizer = CFsTreeVisualizerBase::NewL(iSearchListControl, *iSearchListLayout);
+ iSearchList = CFsTreeList::NewL(*iSearchTreeListVisualizer, *iEnv );
+ iSearchList->SetScrollbarVisibilityL( EFsScrollbarHideAlways );
+
+ // Set mark type and icon
+ iSearchList->SetMarkTypeL( CFsTreeList::EFsTreeListMultiMarkable );
+ iSearchTreeListVisualizer->SetMarkIcon( iAppUi.FsTextureManager()->TextureByIndex( EListControlMarkIcon ) );
+ iSearchTreeListVisualizer->SetMenuIcon( iAppUi.FsTextureManager()->TextureByIndex( EListControlMenuIcon ) );
+ iSearchTreeListVisualizer->SetFlipState( iKeyboardFlipOpen );
+ iSearchTreeListVisualizer->SetFocusVisibility( iFocusVisible );
+ iSearchList->SetIndentationL(0);
+
+ //<cmail> events are now offered to controls in different order
+ ControlGroup().AppendL( iSearchListControl );
+ ControlGroup().AppendL( iSearchList->TreeControl() );
+ //</cmail>
+ //<cmail> touch
+ iSearchList->AddObserverL(*this);
+ //</cmail>
+ iSearchOngoing = EFalse;
+
+ // Set mail list background
+ //<cmail> S60 skin support
+ //iSearchTreeListVisualizer->SetBackgroundTextureL( iAppUi.FsTextureManager()->TextureByIndex( EBackgroundTextureMailList ) );
+ //</cmail>
+
+ iSearchTreeListVisualizer->SetItemExpansionDelay( KItemExpansionDelay );
+ iSearchList->SetScrollTime( KListScrollingDelay, 0.5 );
+
+ // Set empty text
+ HBufC* emptyText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_EMPTY_MSG_LIST_TEXT );
+ iSearchTreeListVisualizer->SetEmptyListTextL( *emptyText );
+ CleanupStack::PopAndDestroy( emptyText );
+ TRgb normalColor = iAppUi.LayoutHandler()->ListNormalStateTextSkinColor();
+ iSearchTreeListVisualizer->RootNodeVisualizer()->SetNormalStateTextColor( normalColor );
+
+ // Create startup timer
+ iStartupCallbackTimer = CFSEmailUiGenericTimer::NewL( this );
+
+ // Set page up and page down keys
+ iSearchTreeListVisualizer->AddCustomPageUpKey( EStdKeyPageUp );
+ iSearchTreeListVisualizer->AddCustomPageDownKey( EStdKeyPageDown );
+
+ CAlfBrush* selectorBrush = iAppUi.FsTextureManager()->ListSelectorBrushL();
+ iSearchTreeListVisualizer->SetSelectorPropertiesL( selectorBrush, 1.0, CFsTreeVisualizerBase::EFsSelectorMoveSmoothly );
+
+ iAppUi.LayoutHandler()->SetListMarqueeBehaviour( iSearchList );
+
+ iFirstStartCompleted = ETrue;
+ }
+
+void CFSEmailUiSearchListVisualiser::TimerEventL( CFSEmailUiGenericTimer* /*aTriggeredTimer*/ )
+ {
+ FUNC_LOG;
+ LaunchSearchDialogL();
+ }
+
+CFSEmailUiSearchListVisualiser::CFSEmailUiSearchListVisualiser( CFreestyleEmailUiAppUi* aAppUi,
+ CAlfEnv& aEnv,
+ CAlfControlGroup& aSearchListControlGroup )
+ :CFsEmailUiViewBase( aSearchListControlGroup, *aAppUi ),
+ iEnv( &aEnv ),
+ iLatestSearchText(0),
+ iListAddedToControlGroup(EFalse), //<cmail>
+ iPreparedForExit(EFalse) //<cmail>
+ {
+ FUNC_LOG;
+ }
+
+CFSEmailUiSearchListVisualiser::~CFSEmailUiSearchListVisualiser()
+ {
+ FUNC_LOG;
+ if ( iStartupCallbackTimer )
+ {
+ iStartupCallbackTimer->Cancel();
+ delete iStartupCallbackTimer;
+ }
+ iSearchStrings.ResetAndDestroy();
+ iSearchListItemArray.Reset();
+ delete iModel;
+ delete iLatestSearchText;
+ delete iSearchList;
+
+ }
+
+void CFSEmailUiSearchListVisualiser::PrepareForExit()
+ {
+ FUNC_LOG;
+ //<cmail> Not needed anymore as controls aren't removed from control group
+ /*if(!iListAddedToControlGroup)
+ {
+ if(iSearchList && iSearchList->TreeControl())
+ TRAP_IGNORE(ControlGroup().AppendL( iSearchList->TreeControl() ));
+ if(iSearchListControl)
+ TRAP_IGNORE(ControlGroup().AppendL( iSearchListControl ));
+ iListAddedToControlGroup = ETrue;
+ }*/
+ //<cmail>
+ if ( iSearchOngoing )
+ {
+ TRAP_IGNORE( StopSearchL() );
+ }
+ delete iMailBox;
+ iMailBox = NULL;
+ iPreparedForExit = ETrue;
+ }
+
+TInt CFSEmailUiSearchListVisualiser::HighlightedIndex() const
+ {
+ FUNC_LOG;
+ TFsTreeItemId focusedId = static_cast<TFsTreeItemId>( iSearchList->FocusedItem() );
+ // Map id to the index in model
+ TInt ret( KErrNotFound );
+ for ( TInt i=0; i<iSearchListItemArray.Count();i++ )
+ {
+ if ( focusedId == iSearchListItemArray[i].iSearchListItemId)
+ {
+ ret = i;
+ break;
+ }
+ }
+ return ret;
+ }
+
+
+TUid CFSEmailUiSearchListVisualiser::Id() const
+ {
+ FUNC_LOG;
+ return SearchListViewId;
+ }
+
+// <cmail> Toolbar
+/*void CFSEmailUiSearchListVisualiser::DoActivateL(const TVwsViewId& aPrevViewId,
+ TUid aCustomMessageId,
+ const TDesC8& aCustomMessage)*/
+void CFSEmailUiSearchListVisualiser::ChildDoActivateL(const TVwsViewId& aPrevViewId,
+ TUid aCustomMessageId,
+ const TDesC8& aCustomMessage)
+// </cmail> Toolbar
+ {
+ FUNC_LOG;
+ if ( !iFirstStartCompleted )
+ {
+ DoFirstStartL();
+ }
+
+ // <cmail>
+ //iSearchList->SetScrollbarVisibilityL( EFsScrollbarHideAlways );
+ if ( aCustomMessageId != KStartListReturnToPreviousFolder )
+ {
+ iBarTextVisual->SetTextL(KNullDesC);
+ }
+
+ if ( &aCustomMessage && aCustomMessageId == KStartNewSearch )
+ {
+ // If new search, clear old search list
+ iSearchCount=0;
+ iMsgDataCouldBeChanged = EFalse;
+ // <cmail> fixed CS high cat. finding
+ ResetResultListL();
+ }
+ // </cmail>
+
+ // Store previous view ID
+ iPreviousViewUid = aPrevViewId.iViewUid;
+ TSearchListActivationData subView;
+ TPckgBuf<TSearchListActivationData> viewData( subView );
+ viewData.Copy( aCustomMessage );
+ subView = viewData();
+
+ // Update settings and set list mode according to settings
+ UpdateMailListSettingsL();
+
+ if ( iMailBox )
+ {
+ delete iMailBox;
+ iMailBox = NULL;
+ }
+ iMailBox = iAppUi.GetMailClient()->GetMailBoxByUidL( subView.iMailBoxId );
+ // If mailbox data is not, try to get default MCE account
+ if ( !iMailBox )
+ {
+ CMsvSession* msvSession = iAppUi.GetMsvSession();
+ CFSMailClient* client = iAppUi.GetMailClient();
+ iMailBox = TFsEmailUiUtility::GetMceDefaultMailboxL( *client, *msvSession );
+ }
+
+ if ( iMailBox )
+ {
+ iThisViewActive = ETrue;
+ //<cmail> visible/unvisible is not controlled by opacity in cmail
+ //TAlfTimedValue opacity;
+ //opacity.SetValueNow( 1 );
+ //iScreenAnchorLayout->SetOpacity( opacity );
+ //</cmail>
+ iSearchList->ShowListL();
+ iSearchList->SetFocusedL(ETrue);
+ // Set empty text color
+ TRgb normalColor = iAppUi.LayoutHandler()->ListNormalStateTextSkinColor();
+ iSearchTreeListVisualizer->RootNodeVisualizer()->SetNormalStateTextColor( normalColor );
+
+ // Launch search dialog automatically when activated
+ if ( &aCustomMessage && aCustomMessageId == KStartNewSearch )
+ {
+ // <cmail> list reseting moved into the begining of the function
+ // requeset async launching of the search dialog because DoActivateL must
+ // not be blocked
+ iStartupCallbackTimer->Cancel(); // just in case
+ iStartupCallbackTimer->Start( iAppUi.LayoutHandler()->ViewSlideEffectTime() );
+ }
+ else if ( iModel && iModel->Count() )
+ {
+ // Need to make sure that return to this view works even if following function leaves.
+ TRAP_IGNORE( CheckAndUpdateFocusedMessageL() );
+ }
+ }
+ CAknEnv::Static()->GetCurrentGlobalUiZoom( iCurrentZoomLevel );
+ // Set msk always empty when view is activated.
+ SetMskL();
+ // <cmail>
+ ReScaleUiL(); // In case that Landscape/Portrait has changed.
+ // </cmail>
+
+ // <cmail> Touch
+ iSearchList->SetFocusedL(ETrue);
+ // </cmail>
+ }
+
+void CFSEmailUiSearchListVisualiser::ChildDoDeactivate()
+ {
+ FUNC_LOG;
+ if(iListAddedToControlGroup && (!iPreparedForExit))
+ {
+ iListAddedToControlGroup = EFalse;
+ }
+ iThisViewActive = EFalse;
+
+ if ( !iAppUi.AppUiExitOngoing() )
+ {
+ if ( iSearchList->IsFocused() )
+ {
+ TRAP_IGNORE(iSearchList->SetFocusedL(EFalse));
+ }
+ iSearchTreeListVisualizer->NotifyControlVisibilityChange( EFalse );
+ }
+ }
+
+CFSEmailUiMailListModel* CFSEmailUiSearchListVisualiser::Model()
+ {
+ FUNC_LOG;
+ return iModel;
+ }
+
+void CFSEmailUiSearchListVisualiser::DynInitMenuPaneL(TInt aResourceId, CEikMenuPane* aMenuPane )
+ {
+ FUNC_LOG;
+ if ( iSearchList->Count() && iModel )
+ {
+ if ( aResourceId == R_FSEMAILUI_SEARCHLIST_MENUPANE )
+ {
+ if ( FeatureManager::FeatureSupported( KFeatureIdFfCmailIntegration ) )
+ {
+ // remove help support in pf5250
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdHelp, ETrue);
+ }
+
+ CFSEmailUiMailListModelItem* item = dynamic_cast<CFSEmailUiMailListModelItem*>(iModel->Item(HighlightedIndex()));
+ if ( item && item->ModelItemType() == ETypeMailItem &&
+ item->MessagePtr().IsFlagSet( EFSMsgFlag_CalendarMsg ) )
+ {
+ // Highlighted mail is calendar msg
+ aMenuPane->SetItemDimmed(EFsEmailUiCmdMailActions, ETrue);
+ aMenuPane->SetItemDimmed(EFsEmailUiCmdCalActions, EFalse);
+ }
+ else
+ {
+ // Highlighted mail is mail msg
+ aMenuPane->SetItemDimmed(EFsEmailUiCmdMailActions, EFalse);
+ aMenuPane->SetItemDimmed(EFsEmailUiCmdCalActions, ETrue);
+ }
+ aMenuPane->SetItemDimmed(EFsEmailUiCmdOpen, EFalse);
+ }
+ }
+ else
+ {
+ if ( aResourceId == R_FSEMAILUI_SEARCHLIST_MENUPANE )
+ {
+
+ if (FeatureManager::FeatureSupported( KFeatureIdFfCmailIntegration ))
+ {
+ // remove help support in pf5250
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdHelp, ETrue);
+ }
+
+ aMenuPane->SetItemDimmed(EFsEmailUiCmdMore, ETrue);
+ aMenuPane->SetItemDimmed(EFsEmailUiCmdMailActions, ETrue);
+ aMenuPane->SetItemDimmed(EFsEmailUiCmdCalActions, ETrue);
+ aMenuPane->SetItemDimmed(EFsEmailUiCmdOpen, ETrue);
+ aMenuPane->SetItemDimmed(EFsEmailUiCmdReadEmail, ETrue);
+ }
+ }
+
+ if ( aResourceId == R_FSEMAILUI_SEARCHLIST_SUBMENU_ACTIONS ||
+ aResourceId == R_FSEMAILUI_SEARCHLIST_SUBMENU_CALEVENT_ACTIONS)
+ {
+ if ( iSearchList->Count() )
+ {
+ CFSEmailUiMailListModelItem* item = dynamic_cast<CFSEmailUiMailListModelItem*>(iModel->Item(HighlightedIndex()));
+ if ( item && item->ModelItemType() == ETypeMailItem )
+ {
+ CFSMailMessage* messagePtr = &item->MessagePtr();
+ if ( messagePtr && messagePtr->IsFlagSet( EFSMsgFlag_Read ) )
+ {
+ aMenuPane->SetItemDimmed(EFsEmailUiCmdMarkAsRead, ETrue);
+ }
+ else
+ {
+ aMenuPane->SetItemDimmed(EFsEmailUiCmdMarkAsUnread, ETrue);
+ }
+ }
+ }
+ }
+
+ if ( aResourceId == R_FSEMAILUI_SEARCHLIST_SUBMENU_CALEVENT_ACTIONS)
+ {
+ if ( iSearchList->Count() )
+ {
+ CFSEmailUiMailListModelItem* item = dynamic_cast<CFSEmailUiMailListModelItem*>(iModel->Item(HighlightedIndex()));
+ if ( item && item->ModelItemType() == ETypeMailItem )
+ {
+ CFSMailMessage* messagePtr = &item->MessagePtr();
+ if ( messagePtr && messagePtr->IsFlagSet( EFSMsgFlag_CalendarMsg ) )
+ {
+ TESMRMeetingRequestMethod mrMethod( EESMRMeetingRequestMethodUnknown );
+ if ( iAppUi.MrViewerInstanceL() )
+ {
+ // Search must be stopped, otherwise resolve will lead to crash
+ if ( iSearchOngoing )
+ {
+ StopSearchL();
+ }
+ mrMethod = iAppUi.MrViewerInstanceL()->ResolveMeetingRequestMethodL( item->MessagePtr() );
+ }
+ switch ( mrMethod )
+ {
+ case EESMRMeetingRequestMethodRequest:
+ {
+ aMenuPane->SetItemDimmed(EFsEmailUiCmdCalRemoveFromCalendar, ETrue);
+ }
+ break;
+ case EESMRMeetingRequestMethodCancellation:
+ {
+ aMenuPane->SetItemDimmed(EFsEmailUiCmdCalActionsAccept, ETrue);
+ aMenuPane->SetItemDimmed(EFsEmailUiCmdCalActionsTentative, ETrue);
+ aMenuPane->SetItemDimmed(EFsEmailUiCmdCalActionsDecline, ETrue);
+
+ TBool supportsRemove = iAppUi.GetActiveMailbox()->HasCapability( EFSMBoxCapaRemoveFromCalendar );
+ if( !supportsRemove )
+ {
+ aMenuPane->SetItemDimmed(EFsEmailUiCmdCalRemoveFromCalendar, ETrue);
+ }
+ }
+ break;
+ default:
+ case EESMRMeetingRequestMethodUnknown:
+ case EESMRMeetingRequestMethodResponse:
+ {
+ aMenuPane->SetItemDimmed(EFsEmailUiCmdCalRemoveFromCalendar, ETrue);
+ aMenuPane->SetItemDimmed(EFsEmailUiCmdCalActionsAccept, ETrue);
+ aMenuPane->SetItemDimmed(EFsEmailUiCmdCalActionsTentative, ETrue);
+ aMenuPane->SetItemDimmed(EFsEmailUiCmdCalActionsDecline, ETrue);
+ }
+ break;
+ }
+ }
+ }
+
+ }
+ }
+
+
+ if ( aResourceId == R_FSEMAILUI_SEARCHLIST_SUBMENU_MORE )
+ {
+// <cmail> Prevent Download Manager opening with attachments
+// if ( iAppUi.DownloadInfoMediator() && !iAppUi.DownloadInfoMediator()->IsAnyAttachmentDownloads() )
+// {
+// aMenuPane->SetItemDimmed(EFsEmailUiCmdDownloadManager, ETrue);
+// }
+// </cmail>
+ }
+
+ if (aResourceId == R_FSEMAILUI_SEARCHLIST_SUBMENU_ACTIONS)
+ {
+ CFSEmailUiMailListModelItem* item = dynamic_cast<CFSEmailUiMailListModelItem*>(iModel->Item(HighlightedIndex()));
+ CFSMailMessage* messagePtr = &item->MessagePtr();
+ TInt menuIndex( 0 );
+
+ //Get # of recipients
+ TInt numRecipients(0);
+ if ( messagePtr )
+ {
+ numRecipients =TFsEmailUiUtility::CountRecepients( messagePtr );
+ if ( numRecipients == 1 )
+ {
+ //check if the malbox ownmailaddress is same as the recipients email address. If not, then assume that the
+ //email is a distribution list and we need to inc num of Recipients so that "Reply ALL" option appears in UI.
+ if ( messagePtr->GetToRecipients().Count() )
+ {
+ if ( iAppUi.GetActiveMailbox()->OwnMailAddress().GetEmailAddress().Compare(messagePtr->GetToRecipients()[0]->GetEmailAddress()) )
+ {
+ numRecipients++;
+ }
+ }
+ if ( messagePtr->GetCCRecipients().Count() )
+ {
+ if ( iAppUi.GetActiveMailbox()->OwnMailAddress().GetEmailAddress().Compare(messagePtr->GetCCRecipients()[0]->GetEmailAddress()) )
+ {
+ numRecipients++;
+ }
+ }
+ if ( messagePtr->GetBCCRecipients().Count() )
+ {
+ if ( iAppUi.GetActiveMailbox()->OwnMailAddress().GetEmailAddress().Compare(messagePtr->GetBCCRecipients()[0]->GetEmailAddress()) )
+ {
+ numRecipients++;
+ }
+ }
+ }
+
+ }
+ if ( numRecipients > 1 )
+ {
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdActionsReplyAll, EFalse );
+ }
+ else if ( aMenuPane->MenuItemExists( EFsEmailUiCmdActionsReplyAll, menuIndex ) )
+ {
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdActionsReplyAll, ETrue );
+ }
+ }
+
+ if ( !iSearchOngoing && aResourceId == R_FSEMAILUI_SEARCHLIST_MENUPANE )
+ {
+ if (FeatureManager::FeatureSupported( KFeatureIdFfCmailIntegration ))
+ {
+ // remove help support in pf5250
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdHelp, ETrue);
+ }
+
+ aMenuPane->SetItemDimmed(EFsEmailUiCmdStopSearch, ETrue);
+ if ( iSearchCount == 0 )
+ {
+ aMenuPane->SetItemDimmed(EFsEmailUiCmdNewSearch, ETrue);
+ }
+ else
+ {
+ aMenuPane->SetItemDimmed(EFsEmailUiCmdSearch, ETrue);
+ }
+ }
+
+ if ( iSearchOngoing && aResourceId == R_FSEMAILUI_SEARCHLIST_MENUPANE )
+ {
+ if (FeatureManager::FeatureSupported( KFeatureIdFfCmailIntegration ))
+ {
+ // remove help support in pf5250
+ aMenuPane->SetItemDimmed( EFsEmailUiCmdHelp, ETrue);
+ }
+
+ aMenuPane->SetItemDimmed(EFsEmailUiCmdSearch, ETrue);
+ aMenuPane->SetItemDimmed(EFsEmailUiCmdNewSearch, ETrue);
+ }
+
+ iAppUi.ShortcutBinding().AppendShortcutHintsL( *aMenuPane, CFSEmailUiShortcutBinding::EContextSearchResults );
+ }
+
+void CFSEmailUiSearchListVisualiser::RefreshL()
+ {
+ FUNC_LOG;
+ if ( iFirstStartCompleted ) //Safety
+ {
+ if ( iModel && iModel->Count() )
+ {
+ // Check if zoom level has been switched and refresh items if so
+ TAknUiZoom prevZoomLevel = iCurrentZoomLevel;
+ CAknEnv::Static()->GetCurrentGlobalUiZoom( iCurrentZoomLevel );
+ if ( prevZoomLevel != iCurrentZoomLevel )
+ {
+ for ( TInt i=0; i<iModel->Count(); i++ )
+ {
+ // Set font height
+ iSearchListItemArray[i].iTreeItemVisualiser->
+ SetFontHeight( iAppUi.LayoutHandler()->ListItemFontHeightInTwips() );
+ iSearchTreeListVisualizer->UpdateItemL( iSearchListItemArray[i].iSearchListItemId );
+ }
+ }
+ }
+ }
+ }
+
+
+void CFSEmailUiSearchListVisualiser::CreatePlainNodeL( const TDesC& aItemDataBuff,
+ CFsTreePlainOneLineNodeData* &aItemData,
+ CFsTreePlainOneLineNodeVisualizer* &aNodeVisualizer ) const
+ {
+ FUNC_LOG;
+ aItemData = CFsTreePlainOneLineNodeData::NewL();
+ aItemData->SetDataL( aItemDataBuff );
+ aItemData->SetIconExpanded( iAppUi.FsTextureManager()->TextureByIndex(EListTextureNodeExpanded) );
+ aItemData->SetIconCollapsed( iAppUi.FsTextureManager()->TextureByIndex(EListTextureNodeCollapsed) );
+ aNodeVisualizer = CFsTreePlainOneLineNodeVisualizer::NewL( *iSearchList->TreeControl() );
+ TRect screenRect;
+ AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EScreen, screenRect );
+ TInt nodeHeight = iAppUi.LayoutHandler()->OneLineListNodeHeight();
+ aNodeVisualizer->SetSize( TSize(screenRect.Width(), nodeHeight) );
+ aNodeVisualizer->SetExtendable(EFalse);
+ // Set correct skin text colors for the list items
+ TRgb focusedColor = iAppUi.LayoutHandler()->ListFocusedStateTextSkinColor();
+ TRgb normalColor = iAppUi.LayoutHandler()->ListNormalStateTextSkinColor();
+ aNodeVisualizer->SetFocusedStateTextColor( focusedColor );
+ aNodeVisualizer->SetNormalStateTextColor( normalColor );
+ }
+
+
+void CFSEmailUiSearchListVisualiser::HandleDynamicVariantSwitchL( CFsEmailUiViewBase::TDynamicSwitchType aType )
+ {
+ FUNC_LOG;
+ CFsEmailUiViewBase::HandleDynamicVariantSwitchL( aType );
+ if ( iFirstStartCompleted ) // Safety
+ {
+ if ( iSearchTreeListVisualizer )
+ {
+ TRgb normalColor = iAppUi.LayoutHandler()->ListNormalStateTextSkinColor();
+ iSearchTreeListVisualizer->RootNodeVisualizer()->SetNormalStateTextColor( normalColor );
+ }
+ ReScaleUiL();
+ }
+ }
+
+void CFSEmailUiSearchListVisualiser::GetParentLayoutsL( RPointerArray<CAlfVisual>& aLayoutArray ) const
+ {
+ aLayoutArray.Append( iScreenAnchorLayout );
+ }
+
+// -----------------------------------------------------------------------------
+// CFSEmailUiMailListVisualiser::FlipStateChangedL
+// Called when keyboard flip state is changed
+// -----------------------------------------------------------------------------
+//
+void CFSEmailUiSearchListVisualiser::FlipStateChangedL( TBool aKeyboardFlipOpen )
+ {
+ CFsEmailUiViewBase::FlipStateChangedL( aKeyboardFlipOpen );
+ iSearchTreeListVisualizer->SetFlipState( iKeyboardFlipOpen );
+ }
+
+// -----------------------------------------------------------------------------
+// CFSEmailUiSearchListVisualiser::HandleTimerFocusStateChange
+// -----------------------------------------------------------------------------
+//
+void CFSEmailUiSearchListVisualiser::HandleTimerFocusStateChange( TBool aShow )
+ {
+ CFsEmailUiViewBase::HandleTimerFocusStateChange( aShow );
+ iSearchTreeListVisualizer->SetFocusVisibility( aShow );
+ }
+
+// ---------------------------------------------------------------------------
+// CFSEmailUiSearchListVisualiser::SetStatusBarLayout()
+// Sets status bar layout
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiSearchListVisualiser::SetStatusBarLayout()
+ {
+ if ( StatusPane()->CurrentLayoutResId() != R_AVKON_STATUS_PANE_LAYOUT_USUAL_FLAT )
+ {
+ TRAP_IGNORE(
+ StatusPane()->SwitchLayoutL( R_AVKON_STATUS_PANE_LAYOUT_USUAL_FLAT ));
+ }
+ }
+
+void CFSEmailUiSearchListVisualiser::HandleCommandL( TInt aCommand )
+ {
+ FUNC_LOG;
+ switch ( aCommand )
+ {
+ case EAknSoftkeySelect:
+ {
+ TInt modelCount(0);
+ if ( iModel )
+ {
+ modelCount = iModel->Count();
+ }
+ if ( modelCount ) // Safety check
+ {
+ CFSEmailUiMailListModelItem* item = dynamic_cast<CFSEmailUiMailListModelItem*>(iModel->Item(HighlightedIndex()));
+ if ( item && item->ModelItemType() == ETypeMailItem )
+ {
+ CFSMailMessage* messagePtr = &item->MessagePtr();
+ if ( messagePtr )
+ {
+ OpenHighlightedMailL();
+ }
+ }
+ }
+ }
+ break;
+ case EAknSoftkeyBack:
+ {
+ if ( !iAppUi.ViewSwitchingOngoing())
+ {
+ if ( iSearchOngoing )
+ {
+ StopSearchL();
+ }
+ //<cmail> useless code removed
+ //HBufC* searchText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_FIND_DLG_SEARCH );
+ //iBarTextVisual->SetTextL( *searchText );
+ //CleanupStack::PopAndDestroy( searchText );
+ //</cmail>
+ TVwsViewId viewId = TVwsViewId( KFSEmailUiUid, MailListId );
+ TMailListActivationData tmp;
+ if ( iMsgDataCouldBeChanged )
+ {
+ tmp.iRequestRefresh = ETrue;
+ iMsgDataCouldBeChanged = EFalse; // List starts a new search
+ }
+ const TPckgBuf<TMailListActivationData> pkgOut( tmp );
+ iAppUi.ReturnToPreviousViewL( pkgOut );
+ }
+ }
+ break;
+ case EEikCmdExit:
+ case EAknSoftkeyExit:
+ case EFsEmailUiCmdExit:
+ iAppUi.Exit();
+ break;
+ case EFsEmailUiCmdCalActionsReplyAsMail:
+ case EFsEmailUiCmdActionsReply:
+ {
+ if ( iSearchList->Count() )
+ {
+ iMsgDataCouldBeChanged = ETrue;
+ ReplyL( NULL ); // Function will check marked/highlighted msg
+ }
+ }
+ break;
+ case EFsEmailUiCmdActionsReplyAll:
+ {
+ if ( iSearchList->Count() )
+ {
+ iMsgDataCouldBeChanged = ETrue;
+ ReplyAllL( NULL ); // Function will check marked/highlighted msg
+ }
+ }
+ break;
+ case EFsEmailUiCmdCalActionsForwardAsMail:
+ case EFsEmailUiCmdActionsForward:
+ {
+ if ( iSearchList->Count() )
+ {
+ iMsgDataCouldBeChanged = ETrue;
+ ForwardL( NULL ); // Function will check marked/highlighted msg
+ }
+ }
+ break;
+ case EFsEmailUiCmdGoToTop:
+ {
+ if ( iSearchListItemArray.Count() )
+ {
+ TInt bottomItemId = iSearchListItemArray[0].iSearchListItemId;
+ iSearchTreeListVisualizer->SetFocusedItemL( bottomItemId );
+ }
+ }
+ break;
+ case EFsEmailUiCmdGoToBottom:
+ {
+ if ( iSearchListItemArray.Count() )
+ {
+ TInt bottomItemId = iSearchListItemArray[ iSearchListItemArray.Count()-1 ].iSearchListItemId;
+ iSearchTreeListVisualizer->SetFocusedItemL( bottomItemId );
+ }
+ }
+ break;
+ case EFsEmailUiCmdPageUp:
+ {
+ TKeyEvent simEvent = { EKeyPageUp, EStdKeyPageUp, 0, 0 };
+ iCoeEnv->SimulateKeyEventL( simEvent, EEventKey );
+ }
+ break;
+ case EFsEmailUiCmdPageDown:
+ {
+ TKeyEvent simEvent = { EKeyPageDown, EStdKeyPageDown, 0, 0 };
+ iCoeEnv->SimulateKeyEventL( simEvent, EEventKey );
+ }
+ break;
+
+ case EFsEmailUiCmdActionsDeleteCalEvent:
+ case EFsEmailUiCmdActionsDelete:
+ {
+ if ( iSearchList->Count() )
+ {
+ DeleteFocusedMessageL();
+ }
+ }
+ break;
+ case EAknSoftkeyOpen:
+ case EFsEmailUiCmdOpen:
+ {
+ if ( iSearchList->Count() )
+ {
+ OpenHighlightedMailL();
+ }
+ }
+ break;
+ case EFsEmailUiCmdNewSearch:
+ case EFsEmailUiCmdSearch:
+ {
+ LaunchSearchDialogL();
+ }
+ break;
+ case EFsEmailUiCmdStopSearch:
+ {
+ StopSearchL();
+ }
+ break;
+ case EFsEmailUiCmdMessageDetails:
+ {
+ if ( iSearchList->Count() )
+ {
+ CFSEmailUiMailListModelItem* item =
+ static_cast<CFSEmailUiMailListModelItem*>( Model()->Item( HighlightedIndex() ) );
+ CFSMailMessage& msg = item->MessagePtr();
+
+ TMsgDetailsActivationData msgDetailsData;
+ msgDetailsData.iMailBoxId = msg.GetMailBoxId();
+ msgDetailsData.iFolderId = msg.GetFolderId();
+ msgDetailsData.iMessageId = msg.GetMessageId();
+
+ const TPckgBuf<TMsgDetailsActivationData> pkgOut( msgDetailsData );
+ iAppUi.EnterFsEmailViewL( MsgDetailsViewId, KStartMsgDetailsToBeginning, pkgOut);
+ }
+ }
+ break;
+ case EFsEmailUiCmdHelp:
+ {
+ TFsEmailUiUtility::LaunchHelpL( KFSE_HLP_LAUNCHER_GRID );
+ }
+ break;
+ case EFsEmailUiCmdActionsCallSender:
+ {
+ if ( iSearchList->Count() )
+ {
+ CallToSenderL();
+ }
+ }
+ break;
+ case EFsEmailUiCmdActionsAddContact:
+ {
+ if ( iSearchList->Count() )
+ {
+ CFSEmailUiMailListModelItem* item = dynamic_cast<CFSEmailUiMailListModelItem*>(iModel->Item(HighlightedIndex()));
+ if ( item && item->ModelItemType() == ETypeMailItem )
+ {
+ CFSMailAddress* fromAddress = item->MessagePtr().GetSender();
+ TDesC* emailAddress(0);
+ if ( fromAddress )
+ {
+ emailAddress = &fromAddress->GetEmailAddress();
+ }
+ if ( emailAddress && emailAddress->Length() )
+ {
+ TAddToContactsType aType;
+ //Query to "update existing" or "Create new" --> EFALSE = user choosed "cancel"
+ if ( CFsDelayedLoader::InstanceL()->GetContactHandlerL()->AddtoContactsQueryL( aType ) )
+ {
+ CFsDelayedLoader::InstanceL()->GetContactHandlerL()->AddToContactL(
+ *emailAddress, EContactUpdateEmail, aType, this );
+ }
+ }
+ }
+ }
+ }
+ break;
+ case EFsEmailUiCmdMarkAsReadUnreadToggle:
+ {
+ if ( iSearchList->Count() )
+ {
+ CFSEmailUiMailListModelItem* item =
+ static_cast<CFSEmailUiMailListModelItem*>( iModel->Item( HighlightedIndex() ));
+ if ( item && item->ModelItemType() == ETypeMailItem )
+ {
+ if ( item->MessagePtr().IsFlagSet(EFSMsgFlag_Read) )
+ {
+ HandleCommandL( EFsEmailUiCmdMarkAsUnread );
+ }
+ else
+ {
+ HandleCommandL( EFsEmailUiCmdMarkAsRead );
+ }
+ }
+ }
+ }
+ break;
+ case EFsEmailUiCmdMarkAsUnread:
+ {
+ ChangeReadStatusOfHighlightedL( EFalse );
+ }
+ break;
+ case EFsEmailUiCmdMarkAsRead:
+ {
+ ChangeReadStatusOfHighlightedL( ETrue );
+ }
+ break;
+ case EFsEmailUiCmdCalActionsAccept:
+ case EFsEmailUiCmdCalActionsTentative:
+ case EFsEmailUiCmdCalActionsDecline:
+ case EFsEmailUiCmdCalRemoveFromCalendar:
+ {
+ CFSEmailUiMailListModelItem* item = dynamic_cast<CFSEmailUiMailListModelItem*>(iModel->Item(HighlightedIndex()));
+ if ( item && item->ModelItemType() == ETypeMailItem &&
+ item->MessagePtr().IsFlagSet( EFSMsgFlag_CalendarMsg ) )
+ {
+ ChangeReadStatusOfHighlightedL( ETrue );
+ iAppUi.MailViewer().HandleMrCommandL( aCommand,
+ iAppUi.GetActiveMailbox()->GetId(),
+ item->MessagePtr().GetFolderId(),
+ item->MessagePtr().GetMessageId() );
+ }
+ }
+ break;
+// <cmail> Prevent Download Manager opening with attachments
+// case EFsEmailUiCmdDownloadManager:
+// {
+// if (iSearchOngoing)
+// {
+// StopSearchL();
+// }
+// iAppUi.EnterFsEmailViewL( DownloadManagerViewId );
+// }
+// break;
+// </cmail>
+ case EFsEmailUiCmdReadEmail:
+ {
+ iAppUi.StartReadingEmailsL();
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+
+TInt CFSEmailUiSearchListVisualiser::LaunchSearchDialogL()
+ {
+ FUNC_LOG;
+ if ( !iLatestSearchText )
+ {
+ iLatestSearchText = HBufC::NewL( KMaxLengthOfSearchString );
+ }
+ TPtr16 textData = iLatestSearchText->Des();
+ CAknQueryDialog* dlg = CAknQueryDialog::NewL( textData );
+ HBufC* searchPrompt = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_FIND_DLG_LABEL );
+ dlg->SetPromptL(*searchPrompt);
+ CleanupStack::PopAndDestroy( searchPrompt );
+ TInt ret = dlg->ExecuteLD( R_FSEMAILUI_FIND_MAIL_DIALOG );
+ if ( ret )
+ {
+ // Stop any ongoing search before starting a new one
+ if ( iSearchOngoing )
+ {
+ StopSearchL();
+ }
+ //<cmail> make list and header visible by showing control group
+ else if( !iListAddedToControlGroup )
+ {
+ //ControlGroup().AppendL( iSearchListControl );
+ //ControlGroup().AppendL( iSearchList->TreeControl() );
+ iListAddedToControlGroup = ETrue;
+ }
+ iSearchList->SetScrollbarVisibilityL( EFsScrollbarAuto );
+ //</cmail>
+ // Set searching text
+ HBufC* searchText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_FIND_DLG_SEARCHING );
+ HBufC* finalText = HBufC::NewLC( searchText->Length() + iLatestSearchText->Length() + KSpace().Length() );
+ finalText->Des().Append( *searchText );
+ finalText->Des().Append( KSpace );
+ finalText->Des().Append( *iLatestSearchText );
+ iBarTextVisual->SetTextL( *finalText );
+ CleanupStack::PopAndDestroy( finalText );
+ CleanupStack::PopAndDestroy( searchText );
+ StartSearchL();
+ }
+ return ret;
+ }
+
+
+void CFSEmailUiSearchListVisualiser::UpdateMailListSettingsL()
+ {
+ FUNC_LOG;
+ if ( iAppUi.GetCRHandler() )
+ {
+ iNodesInUse = iAppUi.GetCRHandler()->TitleDividers();
+ TInt lineValue = iAppUi.GetCRHandler()->MessageListLayout();
+ TInt bodyPreviewValue = iAppUi.GetCRHandler()->BodyPreview();
+ if ( lineValue == 1 ) // 1-line layouts
+ {
+ if ( bodyPreviewValue == 0 )
+ {
+ iListMode = EListControlTypeSingleLinePreviewOff;
+ }
+ else
+ {
+ iListMode = EListControlTypeSingleLinePreviewOn;
+ }
+ }
+ else //
+ {
+ if ( bodyPreviewValue == 0 )
+ {
+ iListMode = EListControlTypeDoubleLinePreviewOff;
+ }
+ else
+ {
+ iListMode = EListControlTypeDoubleLinePreviewOn;
+ }
+ }
+ }
+ else
+ {
+ iNodesInUse = EListControlSeparatorDisabled;
+ iListMode = EListControlTypeDoubleLinePreviewOff;
+ }
+ }
+
+
+TBool CFSEmailUiSearchListVisualiser::OfferEventL(const TAlfEvent& aEvent)
+ {
+ FUNC_LOG;
+ TBool result(EFalse);
+
+ if ( aEvent.IsKeyEvent() && aEvent.Code() == EEventKey )
+ {
+ TInt scanCode = aEvent.KeyEvent().iScanCode;
+ // Swap right and left controls in mirrored layout
+ if ( AknLayoutUtils::LayoutMirrored() )
+ {
+ if ( scanCode == EStdKeyRightArrow ) scanCode = EStdKeyLeftArrow;
+ else if ( scanCode == EStdKeyLeftArrow ) scanCode = EStdKeyRightArrow;
+ }
+
+ switch ( scanCode )
+ {
+ case EStdKeyDevice3: // CENTER CLICK
+ case EStdKeyEnter: // ENTER EITHER SELECTS ITEM IN TOOLBAR OR OPENS MAIL
+ case EStdKeyNkpEnter:
+ {
+ if ( iSearchList->Count() )
+ {
+ OpenHighlightedMailL();
+ }
+ result = ETrue;
+ }
+ break;
+ case EStdKeyYes:
+ {
+ if ( iSearchList->Count() )
+ {
+ CallToSenderL();
+ }
+ }
+ break;
+ case EStdKeyRightArrow:
+ {
+ if ( iSearchList->Count() )
+ {
+ LaunchActionMenuL();
+ }
+ result = ETrue;
+ }
+ break;
+ default:
+ {
+ // check keyboard shortcuts:
+ TInt command =
+ iAppUi.ShortcutBinding().CommandForShortcutKey( aEvent.KeyEvent(),
+ CFSEmailUiShortcutBinding::EContextSearchResults );
+ if ( command >= 0 )
+ {
+ HandleCommandL( command );
+ result = ETrue;
+ }
+ }
+ break;
+ }
+ }
+ else if (aEvent.IsPointerEvent())
+ {
+ iSearchList->TreeControl()->OfferEventL(aEvent);
+ }
+
+ return result;
+ }
+
+
+
+void CFSEmailUiSearchListVisualiser::ReScaleUiL()
+ {
+ FUNC_LOG;
+ if ( iFirstStartCompleted ) //Safety
+ {
+ SetSearchListLayoutAnchors();
+ iScreenAnchorLayout->UpdateChildrenLayout();
+ iSearchListLayout->UpdateChildrenLayout();
+ // Set bar text color from skin
+ if ( iBarTextVisual )
+ {
+ //<cmail>
+ SetHeaderAttributesL();
+ /*TRgb barTextColor( KRgbBlack );
+ AknsUtils::GetCachedColor( AknsUtils::SkinInstance(),
+ barTextColor, KAknsIIDFsTextColors, EAknsCIFsTextColorsCG10 );
+ iBarTextVisual->SetColor( barTextColor );*/
+ //</cmail>
+ }
+ RefreshL();
+ //iSearchTreeListVisualizer->HideList();
+ iSearchTreeListVisualizer->ShowListL();
+ }
+ }
+
+void CFSEmailUiSearchListVisualiser::SetSearchListLayoutAnchors()
+ {
+ FUNC_LOG;
+ // Set anchors so that list leaves space for control bar
+
+ // The anchor layout mirrors itself automatically when necessary.
+ // There's no need to mirror anything manually here.
+
+ // BAR BACGROUND IMAGE
+ //<cmail> platform layout changes
+ TRect contBarRect = iAppUi.LayoutHandler()->GetControlBarRect();
+ TPoint& tl( contBarRect.iTl );
+ iScreenAnchorLayout->SetAnchor(EAlfAnchorTopLeft, 0,
+ EAlfAnchorOriginLeft, EAlfAnchorOriginTop,
+ EAlfAnchorMetricAbsolute, EAlfAnchorMetricAbsolute,
+ TAlfTimedPoint( tl.iX, tl.iY ));
+ TPoint& br( contBarRect.iBr );
+ iScreenAnchorLayout->SetAnchor(EAlfAnchorBottomRight, 0,
+ EAlfAnchorOriginLeft, EAlfAnchorOriginTop,
+ EAlfAnchorMetricAbsolute, EAlfAnchorMetricAbsolute,
+ TAlfTimedPoint( br.iX, br.iY ));
+ //</cmail>
+
+ // LOOKING GLASS IMAGE
+ //<cmail> search magnifier icon removed from cmail
+ /*TRect searchIconRect( iAppUi.LayoutHandler()->GetControlBarMailboxIconRect() );
+ const TPoint& tl( searchIconRect.iTl );
+ iScreenAnchorLayout->SetAnchor(EAlfAnchorTopLeft, 1,
+ EAlfAnchorOriginLeft, EAlfAnchorOriginTop,
+ EAlfAnchorMetricRelativeToSize, EAlfAnchorMetricRelativeToSize,
+ TAlfTimedPoint(0, 0 ));
+ iScreenAnchorLayout->SetAnchor(EAlfAnchorBottomRight, 1,
+ EAlfAnchorOriginLeft, EAlfAnchorOriginTop,
+ EAlfAnchorMetricAbsolute, EAlfAnchorMetricAbsolute,
+ TAlfTimedPoint(KSearchIconWidth, iAppUi.LayoutHandler()->ControlBarHeight()));*/
+
+ // TEXT
+ //<cmail> platform layout changes
+ TRect textRect = iAppUi.LayoutHandler()->GetSearchListHeaderTextLayout().TextRect();
+ tl = textRect.iTl;
+ iScreenAnchorLayout->SetAnchor(EAlfAnchorTopLeft, 1,
+ EAlfAnchorOriginLeft, EAlfAnchorOriginTop,
+ EAlfAnchorMetricAbsolute, EAlfAnchorMetricAbsolute,
+ TAlfTimedPoint( tl.iX, tl.iY ));
+ br = textRect.iBr;
+ iScreenAnchorLayout->SetAnchor(EAlfAnchorBottomRight, 1,
+ EAlfAnchorOriginLeft, EAlfAnchorOriginTop,
+ EAlfAnchorMetricAbsolute, EAlfAnchorMetricAbsolute,
+ TAlfTimedPoint( br.iX, br.iY ));
+ //</cmail>
+
+ //<cmail> platform layout changes
+ TRect listRect = iAppUi.LayoutHandler()->GetListRect();
+ iScreenAnchorLayout->SetAnchor(EAlfAnchorTopLeft, 2,
+ EAlfAnchorOriginLeft, EAlfAnchorOriginTop,
+ EAlfAnchorMetricAbsolute, EAlfAnchorMetricAbsolute,
+ TAlfTimedPoint(listRect.iTl.iX, listRect.iTl.iY));
+ iScreenAnchorLayout->SetAnchor(EAlfAnchorBottomRight, 2,
+ EAlfAnchorOriginLeft, EAlfAnchorOriginTop,
+ EAlfAnchorMetricAbsolute, EAlfAnchorMetricAbsolute,
+ TAlfTimedPoint(listRect.iBr.iX, listRect.iBr.iY));
+ //</cmail>
+ }
+
+
+TFSMailMsgId CFSEmailUiSearchListVisualiser::MsgIdFromIndex( TInt aItemIdx ) const
+ {
+ FUNC_LOG;
+ TFSMailMsgId msgId; // constructs null ID
+ if ( 0 <= aItemIdx && aItemIdx < iModel->Count() )
+ {
+ CFSEmailUiMailListModelItem* item =
+ static_cast<CFSEmailUiMailListModelItem*>(iModel->Item(aItemIdx));
+ if ( item->ModelItemType() == ETypeMailItem )
+ {
+ msgId = item->MessagePtr().GetMessageId();
+ }
+ }
+
+ return msgId;
+ }
+
+TFSMailMsgId CFSEmailUiSearchListVisualiser::MsgIdFromListId( TFsTreeItemId aListId ) const
+ {
+ FUNC_LOG;
+ TFSMailMsgId msgId;
+ for ( TInt i=0; i<iModel->Count();i++)
+ {
+ CFSEmailUiMailListModelItem* item =
+ static_cast<CFSEmailUiMailListModelItem*>(iModel->Item(i));
+ if ( item->ModelItemType() == ETypeMailItem &&
+ aListId == item->CorrespondingListId() )
+ {
+ msgId = item->MessagePtr().GetMessageId();
+ break;
+ }
+ }
+ return msgId;
+ }
+
+CFSMailMessage& CFSEmailUiSearchListVisualiser::MsgPtrFromListId( TFsTreeItemId aListId )
+ {
+ FUNC_LOG;
+ CFSMailMessage* msgPtr(NULL);
+ for ( TInt i=0; i<iModel->Count();i++)
+ {
+ CFSEmailUiMailListModelItem* item =
+ static_cast<CFSEmailUiMailListModelItem*>(iModel->Item(i));
+ if ( aListId == item->CorrespondingListId() )
+ {
+ msgPtr = &item->MessagePtr();
+ }
+ }
+ return *msgPtr;
+ }
+
+ // Item data and visualiser helper functions
+MFsTreeItemData* CFSEmailUiSearchListVisualiser::ItemDataFromItemId( TFsTreeItemId aItemId )
+ {
+ FUNC_LOG;
+ TInt i(0);
+ MFsTreeItemData* itemData(NULL);
+ for ( ; i<iSearchListItemArray.Count(); i++ )
+ {
+ if ( aItemId == iSearchListItemArray[i].iSearchListItemId )
+ {
+ itemData = iSearchListItemArray[i].iTreeItemData;
+ }
+ }
+ return itemData;
+ }
+
+MFsTreeItemVisualizer* CFSEmailUiSearchListVisualiser::ItemVisualiserFromItemId( TFsTreeItemId aItemId )
+ {
+ FUNC_LOG;
+ TInt i(0);
+ MFsTreeItemVisualizer* itemVis(NULL);
+ for ( ; i<iSearchListItemArray.Count(); i++ )
+ {
+ if ( aItemId == iSearchListItemArray[i].iSearchListItemId )
+ {
+ itemVis = iSearchListItemArray[i].iTreeItemVisualiser;
+ }
+ }
+ return itemVis;
+ }
+
+// Helpers to get the ordinal of a message in the iModel
+TInt CFSEmailUiSearchListVisualiser::ItemIndexFromMessageId( const TFSMailMsgId& aMessageId ) const
+ {
+ FUNC_LOG;
+ TInt idx = KErrNotFound;
+
+ for ( TInt i=0; i<iModel->Count() ; i++ )
+ {
+ CFSEmailUiMailListModelItem* item =
+ static_cast<CFSEmailUiMailListModelItem*>(iModel->Item(i));
+ if ( item->ModelItemType() == ETypeMailItem &&
+ aMessageId == item->MessagePtr().GetMessageId() )
+ {
+ idx = i;
+ break;
+ }
+ }
+
+ return idx;
+ }
+
+TInt CFSEmailUiSearchListVisualiser::NextMessageIndex( TInt aCurMsgIdx ) const
+ {
+ FUNC_LOG;
+ TInt idx = KErrNotFound;
+
+ for ( TInt i=aCurMsgIdx+1 ; i<iModel->Count() ; i++ )
+ {
+ CFSEmailUiMailListModelItem* item =
+ static_cast<CFSEmailUiMailListModelItem*>(iModel->Item(i));
+ if ( item && item->ModelItemType() == ETypeMailItem )
+ {
+ idx = i;
+ break;
+ }
+ }
+
+ return idx;
+ }
+
+TInt CFSEmailUiSearchListVisualiser::PreviousMessageIndex( TInt aCurMsgIdx ) const
+ {
+ FUNC_LOG;
+ TInt idx = KErrNotFound;
+
+ if ( aCurMsgIdx < iModel->Count() )
+ {
+ for ( TInt i=aCurMsgIdx-1 ; i>=0 ; i-- )
+ {
+ CFSEmailUiMailListModelItem* item =
+ static_cast<CFSEmailUiMailListModelItem*>(iModel->Item(i));
+ if ( item && item->ModelItemType() == ETypeMailItem )
+ {
+ idx = i;
+ break;
+ }
+ }
+ }
+
+ return idx;
+ }
+
+
+void CFSEmailUiSearchListVisualiser::OpenHighlightedMailL()
+ {
+ FUNC_LOG;
+ if (iSearchOngoing)
+ {
+ StopSearchL();
+ }
+
+ CFSEmailUiMailListModelItem* item =
+ static_cast<CFSEmailUiMailListModelItem*>( iModel->Item( HighlightedIndex() ) );
+ if ( item->ModelItemType() == ETypeMailItem )
+ {
+ // First make sure that the highlighted message really exists in the store
+ // Get confirmed msg ptr
+ CFSMailMessage* confirmedMsgPtr(0);
+ TRAPD( err, confirmedMsgPtr = iAppUi.GetMailClient()->GetMessageByUidL(iAppUi.GetActiveMailboxId(),
+ item->MessagePtr().GetFolderId(), item->MessagePtr().GetMessageId(), EFSMsgDataEnvelope ) );
+ if ( confirmedMsgPtr && err == KErrNone )
+ {
+ CFSMailFolder* highlightedMsgFolder =
+ iAppUi.GetMailClient()->GetFolderByUidL( iAppUi.GetActiveMailboxId(), confirmedMsgPtr->GetFolderId() );
+ CleanupStack::PushL( highlightedMsgFolder );
+ TInt msgFolderType = highlightedMsgFolder->GetFolderType();
+ TFSMailMsgId highlightedMsgFolderId = highlightedMsgFolder->GetFolderId();
+ CleanupStack::PopAndDestroy( highlightedMsgFolder );
+ // Pointer confirmed, store Id and delete not needed anymore
+ TFSMailMsgId confirmedId = confirmedMsgPtr->GetMessageId();
+ delete confirmedMsgPtr;
+
+ // Open to editor from drafts
+ if ( msgFolderType == EFSDraftsFolder )
+ {
+ TEditorLaunchParams params;
+ params.iMailboxId = iAppUi.GetActiveMailboxId();
+ params.iActivatedExternally = EFalse;
+ params.iMsgId = confirmedId;
+ params.iFolderId = highlightedMsgFolderId;
+ iAppUi.LaunchEditorL( KEditorCmdOpen, params );
+ }
+ else if ( msgFolderType == EFSOutbox )
+ {
+ TFsEmailUiUtility::ShowErrorNoteL( R_FREESTYLE_EMAIL_UI_OPEN_FROM_OUTBOX_NOTE, ETrue );
+ }
+ else
+ {
+ THtmlViewerActivationData tmp;
+ tmp.iMailBoxId = iAppUi.GetActiveMailbox()->GetId();
+ tmp.iMessageId = confirmedId;
+ tmp.iFolderId = highlightedMsgFolderId;
+
+ const TPckgBuf<THtmlViewerActivationData> pkgOut( tmp );
+ ChangeReadStatusOfHighlightedL( ETrue );
+ iAppUi.EnterFsEmailViewL( HtmlViewerId, KStartViewerWithMsgId, pkgOut );
+ }
+ }
+ else if ( err == KErrNotFound )
+ {
+ TRAP_IGNORE( CheckAndUpdateFocusedMessageL() );
+ }
+ }
+ }
+
+
+
+void CFSEmailUiSearchListVisualiser::ReplyL( CFSMailMessage* aMsgPtr )
+ {
+ FUNC_LOG;
+ DoReplyForwardL( KEditorCmdReply, aMsgPtr );
+ }
+
+void CFSEmailUiSearchListVisualiser::ReplyAllL( CFSMailMessage* aMsgPtr )
+ {
+ FUNC_LOG;
+ DoReplyForwardL( KEditorCmdReplyAll, aMsgPtr );
+ }
+
+void CFSEmailUiSearchListVisualiser::ForwardL( CFSMailMessage* aMsgPtr )
+ {
+ FUNC_LOG;
+ DoReplyForwardL( KEditorCmdForward, aMsgPtr );
+ }
+
+void CFSEmailUiSearchListVisualiser::DoReplyForwardL( TEditorLaunchMode aMode, CFSMailMessage* aMsgPtr )
+ {
+ FUNC_LOG;
+ // Stop search when reply/forward has been selected
+ if ( iSearchOngoing )
+ {
+ StopSearchL();
+ }
+
+ if ( iModel->Count() )
+ {
+ CFSMailMessage* messagePointer = aMsgPtr;
+ if ( !messagePointer )
+ {
+ RFsTreeItemIdList markedEntries;
+ iSearchList->GetMarkedItemsL( markedEntries );
+ TInt markedCount = markedEntries.Count();
+ if ( markedCount == 0 )
+ {
+ CFSEmailUiMailListModelItem* item = NULL;
+ item = dynamic_cast<CFSEmailUiMailListModelItem*>(iModel->Item(HighlightedIndex()));
+ if (item)
+ {
+ messagePointer = &item->MessagePtr();
+ }
+ }
+ else if ( markedCount == 1)
+ {
+ messagePointer = &MsgPtrFromListId( markedEntries[0] );
+ }
+ }
+ if ( messagePointer )
+ {
+ // No reply/Forward for calendar messages, at least not in 1.0
+ if ( !messagePointer->IsFlagSet( EFSMsgFlag_CalendarMsg ) )
+ {
+ TEditorLaunchParams params;
+ params.iMailboxId = iAppUi.GetActiveMailboxId();
+ params.iActivatedExternally = EFalse;
+ params.iMsgId = messagePointer->GetMessageId();
+ iAppUi.LaunchEditorL( aMode, params );
+ }
+ }
+ }
+ }
+
+void CFSEmailUiSearchListVisualiser::StartSearchL()
+ {
+ FUNC_LOG;
+ iSearchCount++;
+
+ // Reset previous results before starting new search
+ // <cmail> fixed CS high cat. finding
+ ResetResultListL();
+ TLex lex( *iLatestSearchText );
+ while ( !lex.Eos() )
+ {
+ HBufC* token = lex.NextToken().AllocLC();
+
+ iSearchStrings.AppendL( token );
+
+ CleanupStack::Pop( token );
+ }
+
+ TFSMailSortCriteria sortCriteria;
+ sortCriteria.iField = EFSMailSortByDate;
+ sortCriteria.iOrder = EFSMailDescending;
+ iSearchOngoing = ETrue;
+ // Model and list is set to be empty, set also MSK to empty
+ SetMskL();
+ // Initialisr TextSearcher
+
+ // Start search.
+ iMailBox->SearchL( iSearchStrings, sortCriteria, *this );
+ }
+
+void CFSEmailUiSearchListVisualiser::StopSearchL()
+ {
+ FUNC_LOG;
+ iSearchOngoing = EFalse;
+ if ( iMailBox )
+ {
+ iMailBox->CancelSearch();
+ }
+ HBufC* searchText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_FIND_DLG_SEARCH_RESULTS );
+ HBufC* finalText = HBufC::NewLC( searchText->Length() + iLatestSearchText->Length() + 4 );
+ finalText->Des().Append( *searchText );
+ finalText->Des().Append( KSpace );
+ finalText->Des().Append( *iLatestSearchText );
+ iBarTextVisual->SetTextL( *finalText );
+ CleanupStack::PopAndDestroy( finalText );
+ CleanupStack::PopAndDestroy( searchText );
+ }
+
+void CFSEmailUiSearchListVisualiser::ResetResultListL()
+ {
+ // <cmail> fixed CS high cat. finding
+ FUNC_LOG;
+ iModel->Reset();
+ iSearchList->RemoveAllL();
+ iSearchListItemArray.Reset();
+ iSearchStrings.ResetAndDestroy();
+ }
+
+void CFSEmailUiSearchListVisualiser::MatchFoundL( CFSMailMessage* aMatchMessage )
+ {
+ FUNC_LOG;
+
+ if ( !iSearchList->IsFocused() )
+ {
+ iSearchList->SetFocusedL( ETrue );
+ }
+
+ // Delete receved owned object and add confirmed msg pointer to model insteaed
+ // This is done because it seems that matched message objects seems to be different
+ // in some protocols than original messages
+ CleanupStack::PushL( aMatchMessage );
+ CFSMailMessage* confirmedMsgPtr = iAppUi.GetMailClient()->GetMessageByUidL( iAppUi.GetActiveMailboxId(),
+ aMatchMessage->GetFolderId(), aMatchMessage->GetMessageId(), EFSMsgDataEnvelope );
+ CleanupStack::PopAndDestroy( aMatchMessage );
+
+ if ( confirmedMsgPtr ) // Append item into model and list if msg pointer was confirmed
+ {
+ // Append to model
+ CFSEmailUiMailListModelItem* newItem = CFSEmailUiMailListModelItem::NewL( confirmedMsgPtr, ETypeMailItem);
+ iModel->AppendL(newItem);
+
+ // Append to list
+ TRect screenRect;
+ AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EScreen, screenRect );
+
+ CFSMailAddress* fromAddress = confirmedMsgPtr->GetSender();
+ TDesC* diplayName(0);
+ if ( fromAddress )
+ {
+ diplayName = &fromAddress->GetDisplayName();
+ }
+
+ // Set first line of data
+ HBufC* dispName(0);
+ if ( fromAddress && diplayName && diplayName->Length() != 0 )
+ {
+ dispName = HBufC::NewLC( diplayName->Length() );
+ dispName->Des().Append( *diplayName );
+ }
+ else if ( fromAddress && fromAddress->GetEmailAddress().Length() != 0 )
+ {
+ dispName = HBufC::NewLC( fromAddress->GetEmailAddress().Length() );
+ dispName->Des().Append( fromAddress->GetEmailAddress() );
+ }
+ else
+ {
+ dispName = HBufC::NewLC( 0 );
+ dispName->Des().Append( KNullDesC );
+ }
+
+ // Drop out unwanted characters from display name such as <> and ""
+ // And set display name data
+ if ( dispName )
+ {
+ TFsEmailUiUtility::StripDisplayName( *dispName );
+ }
+ // Create item data and
+ CFsTreePlainTwoLineItemData* itemData = CFsTreePlainTwoLineItemData::NewL();
+
+ itemData->SetDataL( *dispName );
+ CleanupStack::PopAndDestroy( dispName );
+
+ // Set time text data
+ HBufC* timeText = TFsEmailUiUtility::ListMsgTimeTextFromMsgLC( confirmedMsgPtr, EFalse );
+ itemData->SetDateTimeDataL ( *timeText );
+ CleanupStack::PopAndDestroy();
+
+ // Set second line of data
+
+ HBufC* subjectText = TFsEmailUiUtility::CreateSubjectTextLC( confirmedMsgPtr );
+
+
+ itemData->SetSecondaryDataL( *subjectText);
+
+
+
+
+ CleanupStack::PopAndDestroy( subjectText );
+
+
+ // Set message icon
+ CAlfTexture* itemTexture = &TFsEmailUiUtility::GetMsgIcon( confirmedMsgPtr, *iAppUi.FsTextureManager() );
+ itemData->SetIcon ( *itemTexture );
+ CFsTreePlainTwoLineItemVisualizer* itemVisualizer = CFsTreePlainTwoLineItemVisualizer::NewL(*iSearchList->TreeControl());
+
+
+ itemVisualizer->SetExtendable( ETrue );
+ TInt itemHeight = iAppUi.LayoutHandler()->OneLineListItemHeight();
+
+ itemVisualizer->SetSize(TSize(screenRect.Width(), itemHeight));
+ itemVisualizer->SetExtendedSize(TSize(screenRect.Width(), 2*itemHeight));
+
+ // Set menu icon
+ itemVisualizer->SetFlags( itemVisualizer->Flags() | KFsTreeListItemHasMenu );
+
+ // Set font height
+ itemVisualizer->SetFontHeight( iAppUi.LayoutHandler()->ListItemFontHeightInTwips() );
+
+ // Set font bolding
+ if ( confirmedMsgPtr->IsFlagSet( EFSMsgFlag_Read ) )
+ {
+ itemVisualizer->SetTextBold( EFalse );
+ }
+ else
+ {
+ itemVisualizer->SetTextBold( ETrue );
+ }
+
+ // Set correct skin text colors for the list items
+ TRgb focusedColor = iAppUi.LayoutHandler()->ListFocusedStateTextSkinColor();
+ TRgb normalColor = iAppUi.LayoutHandler()->ListNormalStateTextSkinColor();
+ itemVisualizer->SetFocusedStateTextColor( focusedColor );
+ itemVisualizer->SetNormalStateTextColor( normalColor );
+
+ switch ( iListMode )
+ {
+ case EListControlTypeDoubleLinePreviewOn:
+ case EListControlTypeSingleLinePreviewOn:
+ itemVisualizer->SetPreviewPaneOn( ETrue );
+ itemVisualizer->SetPreviewPaneEnabledSize( TSize(screenRect.Width(), 3*itemHeight) );
+ // fall through
+ case EListControlTypeDoubleLinePreviewOff:
+ case EListControlTypeSingleLinePreviewOff:
+ itemVisualizer->SetExtendable(ETrue);
+ itemVisualizer->SetExtendedSize(TSize(screenRect.Width(), 2*itemHeight));
+ break;
+ default:
+ break;
+ }
+
+ // Update initial preview pane text for items if needed
+ if ( iListMode == EListControlTypeSingleLinePreviewOn ||
+ iListMode == EListControlTypeDoubleLinePreviewOn )
+ {
+ UpdatePreviewPaneTextForItemL( itemData, confirmedMsgPtr );
+ }
+
+ // Set follow up flag icon
+ if ( TFsEmailUiUtility::IsFollowUpSupported( *iAppUi.GetActiveMailbox() ) )
+ {
+ if ( confirmedMsgPtr->IsFlagSet( EFSMsgFlag_FollowUp ) )
+ {
+ itemData->SetFlagIcon( iAppUi.FsTextureManager()->TextureByIndex( EFollowUpFlagList ) );
+ itemVisualizer->SetFlagIconVisible( ETrue );
+ }
+ else if ( confirmedMsgPtr->IsFlagSet( EFSMsgFlag_FollowUpComplete ) )
+ {
+ itemData->SetFlagIcon( iAppUi.FsTextureManager()->TextureByIndex( EFollowUpFlagCompleteList ) );
+ itemVisualizer->SetFlagIconVisible( ETrue );
+ }
+ else
+ {
+ itemVisualizer->SetFlagIconVisible( EFalse );
+ }
+ }
+ else
+ {
+ itemVisualizer->SetFlagIconVisible( EFalse );
+ }
+
+ TFsTreeItemId itemId = iSearchList->InsertItemL( *itemData, *itemVisualizer, KFsTreeRootID );
+ if (iSearchList->FocusedItem() == KFsTreeNoneID)
+ {
+ iSearchList->SetFocusedItemL(itemId);
+ }
+
+ SSearchListItem searchListItem;
+ searchListItem.iSearchListItemId = itemId;
+ searchListItem.iTreeItemData = itemData;
+ searchListItem.iTreeItemVisualiser = itemVisualizer;
+ iSearchListItemArray.AppendL( searchListItem );
+ newItem->AddCorrespondingListId( itemId );
+
+ if ( iSearchList->Count() == 1 ) // Call only once, temp fix because of error in generic
+ {
+ if ( iListMode == EListControlTypeDoubleLinePreviewOn ||
+ iListMode == EListControlTypeDoubleLinePreviewOff )
+ {
+ iSearchTreeListVisualizer->SetItemsAlwaysExtendedL( ETrue );
+ }
+ else
+ {
+ // Set the extendedability and extended size
+ iSearchTreeListVisualizer->SetItemsAlwaysExtendedL( EFalse );
+ }
+
+ // Set msk to "Open when first is found".
+ SetMskL();
+ }
+ }
+
+ }
+
+// ---------------------------------------------------------------------------
+// HandleMailBoxEventL
+// Function removes objects from the list that are deleted.
+// Also updates icon and read status if synced so from the server
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiSearchListVisualiser::HandleMailBoxEventL( TFSMailEvent aEvent,
+ TFSMailMsgId aMailbox, TAny* aParam1, TAny* aParam2, TAny* /*aParam3*/ )
+ {
+ FUNC_LOG;
+ if ( iFirstStartCompleted ) // Safety
+ {
+ CFSMailBox* activeMailbox = iAppUi.GetActiveMailbox();
+ if ( activeMailbox && aMailbox.Id() == activeMailbox->GetId().Id() ) // Safety, in list events that only concern active mailbox are handled
+ {
+ if ( iModel && iModel->Count() && aEvent == TFSEventMailDeleted )
+ {
+ RArray<TFSMailMsgId>* removedEntries = static_cast<RArray<TFSMailMsgId>*>(aParam1);
+ if ( removedEntries && removedEntries->Count() )
+ {
+ RemoveMsgItemsFromListIfFoundL( *removedEntries );
+ }
+ }
+ else if ( iModel && iModel->Count() && aEvent == TFSEventMailChanged )
+ {
+ // Get array of changed entries
+ RArray<TFSMailMsgId>* entries = static_cast<RArray<TFSMailMsgId>*>(aParam1);
+ // Get ID of the folder that this cahnge concerns.
+ TFSMailMsgId* parentFolderId = static_cast<TFSMailMsgId*>( aParam2 );
+ for ( TInt i=0 ; i < entries->Count() ; i++)
+ {
+ TFSMailMsgId entryId = (*entries)[i];
+ CFSMailMessage* confirmedMsgPtr(0);
+ TRAPD( err, confirmedMsgPtr = iAppUi.GetMailClient()->GetMessageByUidL( iAppUi.GetActiveMailboxId(),
+ *parentFolderId, entryId, EFSMsgDataEnvelope ) );
+ if ( confirmedMsgPtr && err == KErrNone )
+ {
+ CleanupStack::PushL( confirmedMsgPtr );
+ UpdateMsgIconAndBoldingL( confirmedMsgPtr );
+ CleanupStack::PopAndDestroy( confirmedMsgPtr );
+ }
+ }
+ }
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// RemoveMsgItemsFromListIfFoundL
+// Message removing from list if found. Does not panic or return found status.
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiSearchListVisualiser::RemoveMsgItemsFromListIfFoundL( const RArray<TFSMailMsgId>& aEntryIds )
+ {
+ FUNC_LOG;
+ if ( iModel && iModel->Count() )
+ {
+ for ( TInt i=0 ; i<aEntryIds.Count() ; ++i )
+ {
+ const TFSMailMsgId& entryId = aEntryIds[i];
+ if ( !entryId.IsNullId() )
+ {
+ TInt idx = ItemIndexFromMessageId( entryId );
+ if ( idx >= 0 )
+ {
+ iSearchList->RemoveL( iSearchListItemArray[idx].iSearchListItemId ); // remove from list
+ iSearchListItemArray.Remove( idx ); // remove from internal array.
+ iModel->RemoveAndDestroy( idx ); // Remove from model
+ }
+ }
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// UpdatePreviewPaneTextForItemL
+// Updates preview pane text for item
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiSearchListVisualiser::UpdatePreviewPaneTextForItemL(CFsTreePlainTwoLineItemData* aItemData, CFSMailMessage* aMsgPtr )
+ {
+ FUNC_LOG;
+ // Preview pane data update
+ if ( aMsgPtr && ( iListMode == EListControlTypeSingleLinePreviewOn ||
+ iListMode == EListControlTypeDoubleLinePreviewOn ) )
+ {
+ CFSMailMessagePart* textPart = aMsgPtr->PlainTextBodyPartL();
+ CleanupStack::PushL( textPart );
+ if ( textPart && ( textPart->FetchLoadState() == EFSPartial ||
+ textPart->FetchLoadState() == EFSFull ) )
+ {
+ TInt previewSize = Min( KMaxPreviewPaneLength, textPart->FetchedContentSize() );
+ HBufC* plainTextData16 = HBufC::NewLC( previewSize );
+ TPtr textPtr = plainTextData16->Des();
+
+ textPart->GetContentToBufferL( textPtr, 0 ); // Zero is start offset
+ // Crop out line feed, paragraph break, and tabulator
+ TFsEmailUiUtility::FilterListItemTextL( textPtr );
+ aItemData->SetPreviewPaneDataL( *plainTextData16 );
+
+ CleanupStack::PopAndDestroy( plainTextData16 );
+ }
+
+ // Else display message size in preview pane
+ else
+ {
+ TUint contentSize = aMsgPtr->ContentSize();
+ HBufC* sizeDesc = TFsEmailUiUtility::CreateSizeDescLC( contentSize );
+ HBufC* msgSizeText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_PREV_PANE_MSG_SIZE, *sizeDesc );
+ aItemData->SetPreviewPaneDataL( *msgSizeText );
+ CleanupStack::PopAndDestroy( msgSizeText );
+ CleanupStack::PopAndDestroy( sizeDesc );
+ }
+ CleanupStack::PopAndDestroy( textPart );
+ }
+ }
+
+void CFSEmailUiSearchListVisualiser::SearchCompletedL()
+ {
+ FUNC_LOG;
+ iSearchOngoing = EFalse;
+ HBufC* searchText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_FIND_DLG_SEARCH_RESULTS );
+ HBufC* finalText = HBufC::NewLC( searchText->Length() + iLatestSearchText->Length() + 4 );
+ finalText->Des().Append( *searchText );
+ finalText->Des().Append( KSpace );
+ finalText->Des().Append( *iLatestSearchText );
+ iBarTextVisual->SetTextL( *finalText );
+ CleanupStack::PopAndDestroy( finalText );
+ CleanupStack::PopAndDestroy( searchText );
+ }
+
+
+void CFSEmailUiSearchListVisualiser::ChangeReadStatusOfHighlightedL( TInt aRead )
+ {
+ FUNC_LOG;
+ if ( iSearchList->Count() )
+ {
+ CFSEmailUiMailListModelItem* selectedItem =
+ static_cast<CFSEmailUiMailListModelItem*>( iModel->Item( HighlightedIndex() ));
+
+ TBool wasRead = selectedItem->MessagePtr().IsFlagSet( EFSMsgFlag_Read );
+ if ( (wasRead && !aRead) || (!wasRead && aRead) )
+ {
+ // Read status is changed
+ iMsgDataCouldBeChanged = ETrue;
+
+ if ( aRead )
+ {
+ // Send flags, local and server
+ selectedItem->MessagePtr().SetFlag( EFSMsgFlag_Read );
+ }
+ else
+ {
+ // Send flags, local and server
+ selectedItem->MessagePtr().ResetFlag( EFSMsgFlag_Read );
+ }
+ selectedItem->MessagePtr().SaveMessageL(); // Save flag
+ // Switch icon to correct one
+ UpdateMsgIconAndBoldingL( HighlightedIndex() );
+ }
+ }
+ }
+
+void CFSEmailUiSearchListVisualiser::CheckAndUpdateFocusedMessageL()
+ {
+ FUNC_LOG;
+ if ( iModel && iModel->Count() ) // Needed safety check
+ {
+ TInt highlightedIndex = HighlightedIndex();
+ CFSEmailUiMailListModelItem* selectedItem =
+ static_cast<CFSEmailUiMailListModelItem*>( iModel->Item( highlightedIndex ));
+ if ( selectedItem->ModelItemType() == ETypeMailItem )
+ {
+ CFSMailMessage* msgPtr = &selectedItem->MessagePtr();
+ if ( msgPtr )
+ {
+ CFSMailFolder* folderPtr =
+ iAppUi.GetMailClient()->GetFolderByUidL( iAppUi.GetActiveMailboxId(), msgPtr->GetFolderId() );
+ CleanupStack::PushL( folderPtr );
+
+ if ( !folderPtr )
+ {
+ // Pointer is not valid anymore, msg has been delete,
+ // so it must be removed from the search list
+ RemoveFocusedFromListL();
+ }
+ else
+ {
+ CFSMailMessage* confirmedMsgPtr(0);
+ TRAPD( err, confirmedMsgPtr = iAppUi.GetMailClient()->GetMessageByUidL( iAppUi.GetActiveMailboxId(),
+ folderPtr->GetFolderId(), msgPtr->GetMessageId(), EFSMsgDataEnvelope ) );
+ if ( confirmedMsgPtr && err == KErrNone)
+ {
+ CleanupStack::PushL( confirmedMsgPtr );
+ UpdateMsgIconAndBoldingL( confirmedMsgPtr );
+ CleanupStack::PopAndDestroy( confirmedMsgPtr );
+ }
+ else
+ {
+ RemoveFocusedFromListL();
+ }
+ }
+
+ CleanupStack::PopAndDestroy( folderPtr );
+ }
+ }
+ }
+ }
+
+void CFSEmailUiSearchListVisualiser::RemoveFocusedFromListL()
+ {
+ FUNC_LOG;
+ iMsgDataCouldBeChanged = ETrue;
+ SSearchListItem item;
+ item.iSearchListItemId = iSearchList->FocusedItem();
+ TInt IndexToBeDestroyed = iSearchListItemArray.Find( item );
+ iSearchListItemArray.Remove( IndexToBeDestroyed ); // remove from internal array.
+ iModel->RemoveAndDestroy( IndexToBeDestroyed ); // Remove from model
+ iSearchList->RemoveL( iSearchList->FocusedItem() ); // remove from list
+ }
+
+
+// Updates our own message object with the data from a given message object.
+// The messages are matched with the message ID.
+void CFSEmailUiSearchListVisualiser::UpdateMsgIconAndBoldingL( CFSMailMessage* aMsgPtr )
+ {
+ FUNC_LOG;
+ if ( aMsgPtr )
+ {
+ for ( TInt i=0 ; i < iModel->Count() ; i++)
+ {
+ CFSEmailUiMailListModelItem* item =
+ static_cast<CFSEmailUiMailListModelItem*>( Model()->Item(i) );
+ if ( item && item->ModelItemType()==ETypeMailItem &&
+ item->MessagePtr().GetMessageId() == aMsgPtr->GetMessageId() )
+ {
+ // Update all flags
+ TUint32 prevFlags = item->MessagePtr().GetFlags();
+ TUint32 newFlags = aMsgPtr->GetFlags();
+ if ( prevFlags != newFlags )
+ {
+ item->MessagePtr().ResetFlag( prevFlags );
+ item->MessagePtr().SetFlag( newFlags );
+
+ // Save changed flags in internal model array
+ item->MessagePtr().SaveMessageL();
+ iMsgDataCouldBeChanged = ETrue;
+ }
+
+ // Update the list item graphics
+ UpdateMsgIconAndBoldingL( i );
+ break;
+ }
+ }
+ }
+ }
+
+// Updates list item at given index to match the state of the message object
+void CFSEmailUiSearchListVisualiser::UpdateMsgIconAndBoldingL( TInt aListIndex )
+ {
+ FUNC_LOG;
+ if (aListIndex < iSearchListItemArray.Count())
+ {
+ CFSEmailUiMailListModelItem* item =
+ static_cast<CFSEmailUiMailListModelItem*>( Model()->Item(aListIndex) );
+ if ( item && item->ModelItemType()==ETypeMailItem )
+ {
+ CFSMailMessage* msgPtr = &item->MessagePtr();
+ CAlfTexture* itemTexture = &TFsEmailUiUtility::GetMsgIcon( msgPtr, *iAppUi.FsTextureManager() );
+ CFsTreePlainTwoLineItemData* itemData =
+ static_cast<CFsTreePlainTwoLineItemData*>( iSearchListItemArray[aListIndex].iTreeItemData );
+ CFsTreePlainTwoLineItemVisualizer* itemVis =
+ static_cast<CFsTreePlainTwoLineItemVisualizer*>( iSearchListItemArray[aListIndex].iTreeItemVisualiser );
+ itemData->SetIcon( *itemTexture );
+ if ( msgPtr->IsFlagSet( EFSMsgFlag_Read ) )
+ {
+ itemVis->SetTextBold( EFalse );
+ }
+ else
+ {
+ itemVis->SetTextBold( ETrue );
+ }
+ // Set follow up flag icon correctly
+ if ( TFsEmailUiUtility::IsFollowUpSupported( *iAppUi.GetActiveMailbox() ) )
+ {
+ if ( msgPtr->IsFlagSet( EFSMsgFlag_FollowUp ) )
+ {
+ itemData->SetFlagIcon( iAppUi.FsTextureManager()->TextureByIndex( EFollowUpFlagList ) );
+ itemVis->SetFlagIconVisible( ETrue );
+ }
+ else if ( msgPtr->IsFlagSet( EFSMsgFlag_FollowUpComplete ) )
+ {
+ itemData->SetFlagIcon( iAppUi.FsTextureManager()->TextureByIndex( EFollowUpFlagCompleteList ) );
+ itemVis->SetFlagIconVisible( ETrue );
+ }
+ else
+ {
+ itemVis->SetFlagIconVisible( EFalse );
+ }
+ }
+ else
+ {
+ itemVis->SetFlagIconVisible( EFalse );
+ }
+ iSearchTreeListVisualizer->UpdateItemL( iSearchListItemArray[aListIndex].iSearchListItemId );
+ }
+ }
+ }
+
+
+// Delete messages
+void CFSEmailUiSearchListVisualiser::DeleteFocusedMessageL()
+ {
+ FUNC_LOG;
+ if ( iSearchList->Count() )
+ {
+ TInt currentItemIndex = HighlightedIndex();
+ CFSEmailUiMailListModelItem* item =
+ static_cast<CFSEmailUiMailListModelItem*>( Model()->Item(currentItemIndex));
+ if ( item && item->ModelItemType() == ETypeMailItem )
+ {
+ CFSMailMessage& messagePtr = item->MessagePtr();
+ TInt queryTextId(0);
+ if ( messagePtr.IsFlagSet( EFSMsgFlag_CalendarMsg ))
+ {
+ queryTextId = R_FREESTYLE_EMAIL_DELETE_CALEVENT_NOTE;
+ }
+ else
+ {
+ queryTextId = R_FREESTYLE_EMAIL_DELETE_MAIL_NOTE;
+ }
+ HBufC* msgSubject = TFsEmailUiUtility::CreateSubjectTextLC( &messagePtr );
+
+ TInt okToDelete( ETrue );
+ if ( iAppUi.GetCRHandler()->WarnBeforeDelete() )
+ {
+ okToDelete = TFsEmailUiUtility::ShowConfirmationQueryL( queryTextId, *msgSubject );
+ }
+ CleanupStack::PopAndDestroy( msgSubject );
+
+ if ( okToDelete )
+ {
+ iMsgDataCouldBeChanged = ETrue; // Refresh
+ // Delete message from framework, and perform internal housekeeping
+ TFSMailMsgId msgId = messagePtr.GetMessageId();
+ RArray<TFSMailMsgId> msgIds;
+ msgIds.Append( msgId );
+ TFSMailMsgId folderId = messagePtr.GetFolderId();
+ TFSMailMsgId mailBox = iAppUi.GetActiveMailbox()->GetId();
+ iAppUi.GetMailClient()->DeleteMessagesByUidL( mailBox, folderId, msgIds );
+ msgIds.Reset();
+ SSearchListItem item;
+ item.iSearchListItemId = iSearchList->FocusedItem();
+ TInt IndexToBeDestroyed = iSearchListItemArray.Find( item );
+ iSearchListItemArray.Remove( IndexToBeDestroyed ); // remove from internal array.
+ iModel->RemoveAndDestroy( IndexToBeDestroyed ); // Remove from model
+ iSearchList->RemoveL( iSearchList->FocusedItem() ); // remove from list
+ }
+ }
+ }
+ }
+
+
+// Navigation functions, used mainly from viewer
+TBool CFSEmailUiSearchListVisualiser::IsNextMsgAvailable( TFSMailMsgId aCurrentMsgId,
+ TFSMailMsgId& aFoundNextMsgId,
+ TFSMailMsgId& aFoundNextMsgFolderId ) const
+ {
+ FUNC_LOG;
+ TBool ret(EFalse);
+
+ TInt curIdx = ItemIndexFromMessageId( aCurrentMsgId );
+ if ( curIdx >= 0 )
+ {
+ TInt nextIdx = NextMessageIndex(curIdx);
+ if ( nextIdx >= 0 )
+ {
+ ret = ETrue;
+ aFoundNextMsgId = MsgIdFromIndex(nextIdx);
+ CFSEmailUiMailListModelItem* item =
+ static_cast<CFSEmailUiMailListModelItem*>(iModel->Item( nextIdx ));
+ if ( item->ModelItemType() == ETypeMailItem )
+ {
+ aFoundNextMsgFolderId = item->MessagePtr().GetFolderId();
+ }
+ }
+ }
+
+ return ret;
+ }
+
+
+TBool CFSEmailUiSearchListVisualiser::IsPreviousMsgAvailable( TFSMailMsgId aCurrentMsgId,
+ TFSMailMsgId& aFoundPreviousMsgId,
+ TFSMailMsgId& aFoundPrevMsgFolderId ) const
+ {
+ FUNC_LOG;
+ TBool ret(EFalse);
+
+ TInt curIdx = ItemIndexFromMessageId( aCurrentMsgId );
+ if ( curIdx >= 0 )
+ {
+ TInt prevIdx = PreviousMessageIndex(curIdx);
+ if ( prevIdx >= 0 )
+ {
+ ret = ETrue;
+ aFoundPreviousMsgId = MsgIdFromIndex(prevIdx);
+ CFSEmailUiMailListModelItem* item =
+ static_cast<CFSEmailUiMailListModelItem*>(iModel->Item( prevIdx ));
+ if ( item->ModelItemType() == ETypeMailItem )
+ {
+ aFoundPrevMsgFolderId = item->MessagePtr().GetFolderId();
+ }
+ }
+ }
+
+ return ret;
+ }
+
+TInt CFSEmailUiSearchListVisualiser::MoveToNextMsgL( TFSMailMsgId aCurrentMsgId, TFSMailMsgId& aFoundNextMsgId )
+ {
+ FUNC_LOG;
+ TInt ret(KErrNotFound);
+
+ TInt curIdx = ItemIndexFromMessageId( aCurrentMsgId );
+ TInt nextIdx = NextMessageIndex( curIdx );
+
+ if ( curIdx >= 0 && nextIdx >= 0 )
+ {
+ // Focus the new message
+ iSearchTreeListVisualizer->SetFocusedItemL( iSearchListItemArray[nextIdx].iSearchListItemId );
+ ChangeReadStatusOfHighlightedL( ETrue );
+ aFoundNextMsgId = MsgIdFromIndex( nextIdx );
+ ret = KErrNone;
+ }
+ if ( ret == KErrNone )
+ {
+ OpenHighlightedMailL();
+ }
+ return ret;
+ }
+
+TInt CFSEmailUiSearchListVisualiser::MoveToPreviousMsgL( TFSMailMsgId aCurrentMsgId, TFSMailMsgId& aFoundPreviousMsgId )
+ {
+ FUNC_LOG;
+ TInt ret(KErrNotFound);
+
+ TInt curIdx = ItemIndexFromMessageId( aCurrentMsgId );
+ TInt prevIdx = PreviousMessageIndex( curIdx );
+
+ if ( curIdx >= 0 && prevIdx >= 0 )
+ {
+ // Focus the new message
+ iSearchTreeListVisualizer->SetFocusedItemL( iSearchListItemArray[prevIdx].iSearchListItemId );
+ ChangeReadStatusOfHighlightedL( ETrue );
+ aFoundPreviousMsgId = MsgIdFromIndex( prevIdx );
+ ret = KErrNone;
+ }
+ if ( ret == KErrNone )
+ {
+ OpenHighlightedMailL();
+ }
+ return ret;
+ }
+
+
+ // Helper functions to get highlighted message id and folder id
+TFSMailMsgId CFSEmailUiSearchListVisualiser::HighlightedMessageFolderId()
+ {
+ FUNC_LOG;
+ TFSMailMsgId ret;
+ if ( iSearchList->Count() && iModel )
+ {
+ CFSEmailUiMailListModelItem* item = dynamic_cast<CFSEmailUiMailListModelItem*>(iModel->Item(HighlightedIndex()));
+ if ( item && item->ModelItemType() == ETypeMailItem )
+ {
+ ret = item->MessagePtr().GetFolderId();
+ }
+ }
+ return ret;
+ }
+
+TFSMailMsgId CFSEmailUiSearchListVisualiser::HighlightedMessageId()
+ {
+ FUNC_LOG;
+ TFSMailMsgId ret;
+ if ( iSearchList->Count() && iModel )
+ {
+ CFSEmailUiMailListModelItem* item = dynamic_cast<CFSEmailUiMailListModelItem*>(iModel->Item(HighlightedIndex()));
+ if ( item && item->ModelItemType() == ETypeMailItem )
+ {
+ ret = item->MessagePtr().GetMessageId();
+ }
+ }
+ return ret;
+ }
+
+
+//<cmail> Touch
+// ---------------------------------------------------------------------------
+// CFSEmailUiSearchListVisualiser::TreeListEventL
+// From MFsTreeListObserver
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiSearchListVisualiser::TreeListEventL( const TFsTreeListEvent aEvent, const TFsTreeItemId /*aId*/ )
+ {
+ FUNC_LOG;
+
+ switch(aEvent)
+ {
+ case MFsTreeListObserver::EFsTreeListItemTouchAction:
+ DoHandleActionL();
+ break;
+ case MFsTreeListObserver::EFsTreeListItemTouchLongTap:
+ if ( iSearchList->Count() )
+ {
+ LaunchActionMenuL();
+ }
+ break;
+ case MFsTreeListObserver::EFsTreeListItemWillGetFocused:
+ {
+ SetMskL();
+ break;
+ }
+ case MFsTreeListObserver::EFsTreeListItemTouchFocused:
+ default:
+ //Just ignore rest of events
+ break;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CFSEmailUiSearchListVisualiser::DoHandleActionL
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiSearchListVisualiser::DoHandleActionL()
+ {
+ FUNC_LOG;
+ TInt modelCount = 0;
+
+ if ( iModel )
+ {
+ modelCount = iModel->Count();
+ }
+ if ( modelCount ) // Safety check
+ {
+ CFSEmailUiMailListModelItem* item = dynamic_cast<CFSEmailUiMailListModelItem*>(iModel->Item(HighlightedIndex()));
+ if ( item && item->ModelItemType() == ETypeMailItem )
+ {
+ CFSMailMessage* messagePtr = &item->MessagePtr();
+ if ( messagePtr )
+ {
+ OpenHighlightedMailL();
+ }
+ }
+ }
+ }
+
+//</cmail>
+
+// ---------------------------------------------------------------------------
+// From MFSEmailUiContactHandlerObserver
+// The ownership of the CLS items in the contacts array is transferred to the
+// observer, and they must be deleted by the observer.
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiSearchListVisualiser::OperationCompleteL(
+ TContactHandlerCmd /*aCmd*/, const RPointerArray<CFSEmailUiClsItem>& /*aContacts*/ )
+ {
+ FUNC_LOG;
+ }
+
+// ---------------------------------------------------------------------------
+// From MFSEmailUiContactHandlerObserver
+// Handles error in contact handler operation.
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiSearchListVisualiser::OperationErrorL(
+ TContactHandlerCmd /*aCmd*/, TInt /*aError*/ )
+ {
+ FUNC_LOG;
+ }
+
+void CFSEmailUiSearchListVisualiser::CallToSenderL()
+ {
+ FUNC_LOG;
+ CFSEmailUiMailListModelItem* item =
+ dynamic_cast<CFSEmailUiMailListModelItem*>
+ ( iModel->Item( HighlightedIndex() ) );
+ if ( item && item->ModelItemType() == ETypeMailItem )
+ {
+ CFSMailAddress* fromAddress = item->MessagePtr().GetSender();
+ TDesC* emailAddress(0);
+ if ( fromAddress )
+ {
+ emailAddress = &fromAddress->GetEmailAddress();
+ }
+ if ( emailAddress && emailAddress->Length() )
+ {
+ CFsDelayedLoader::InstanceL()->GetContactHandlerL()->
+ FindAndCallToContactByEmailL( *emailAddress,
+ iAppUi.GetActiveMailbox(), this, ETrue );
+ }
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// Logic for changing msk
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiSearchListVisualiser::SetMskL()
+ {
+ FUNC_LOG;
+ if ( iFirstStartCompleted )
+ {
+ if ( iSearchList && iSearchList->Count() )
+ {
+ ChangeMskCommandL( R_FSE_QTN_MSK_OPEN );
+ }
+ else
+ {
+ ChangeMskCommandL( R_FSE_QTN_MSK_EMPTY );
+ }
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// LaunchActionMenuL
+// Function launches action menu based on the highlighted or marked messages
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiSearchListVisualiser::LaunchActionMenuL()
+ {
+ FUNC_LOG;
+ if ( iModel && iModel->Count() )
+ {
+ // Remove old items from action menu
+ CFSEmailUiActionMenu::RemoveAllL();
+ // Construct item list
+ RFsEActionMenuIdList itemList;
+ CleanupClosePushL( itemList );
+
+ CFSEmailUiMailListModelItem* item = dynamic_cast<CFSEmailUiMailListModelItem*>(iModel->Item(HighlightedIndex()));
+ // Right click action menu for calendar events
+ if ( item && item->ModelItemType() == ETypeMailItem &&
+ item->MessagePtr().IsFlagSet( EFSMsgFlag_CalendarMsg ) )
+ {
+ TESMRMeetingRequestMethod mrMethod( EESMRMeetingRequestMethodUnknown );
+ if ( iAppUi.MrViewerInstanceL() )
+ {
+ // Search must be stopped, otherwise resolve will lead to crash
+ if ( iSearchOngoing )
+ {
+ StopSearchL();
+ }
+ mrMethod = iAppUi.MrViewerInstanceL()->ResolveMeetingRequestMethodL( item->MessagePtr() );
+ }
+ switch ( mrMethod )
+ {
+ case EESMRMeetingRequestMethodRequest:
+ itemList.AppendL( FsEActionMenuAccept );
+ itemList.AppendL( FsEActionMenuTentative );
+ itemList.AppendL( FsEActionMenuDecline );
+ break;
+ case EESMRMeetingRequestMethodCancellation:
+ {
+ TBool supportsRemove = iAppUi.GetActiveMailbox()->HasCapability( EFSMBoxCapaRemoveFromCalendar );
+ if( supportsRemove )
+ {
+ itemList.AppendL( FsEActionMenuRemoveFormCal );
+ }
+ break;
+ }
+ default:
+ case EESMRMeetingRequestMethodUnknown:
+ case EESMRMeetingRequestMethodResponse:
+ itemList.AppendL( FsEActionMenuOpen);
+ break;
+ }
+ }
+ // Right click action menu for normal mail items
+ else
+ {
+ itemList.AppendL( FsEActionMenuReply );
+ //Get # of recipients
+ TInt numRecipients(0);
+ CFSMailMessage* messagePtr = &item->MessagePtr();
+ if ( messagePtr )
+ {
+ numRecipients =TFsEmailUiUtility::CountRecepients( messagePtr );
+ if ( numRecipients == 1 )
+ {
+ //check if the malbox ownmailaddress is same as the recipients email address. If not, then assume that the
+ //email is a distribution list and we need to inc num of Recipients so that "Reply ALL" option appears in UI.
+ if ( messagePtr->GetToRecipients().Count() )
+ {
+ if ( iAppUi.GetActiveMailbox()->OwnMailAddress().GetEmailAddress().Compare(messagePtr->GetToRecipients()[0]->GetEmailAddress()) )
+ {
+ numRecipients++;
+ }
+ }
+ if ( messagePtr->GetCCRecipients().Count() )
+ {
+ if ( iAppUi.GetActiveMailbox()->OwnMailAddress().GetEmailAddress().Compare(messagePtr->GetCCRecipients()[0]->GetEmailAddress()) )
+ {
+ numRecipients++;
+ }
+ }
+ if ( messagePtr->GetBCCRecipients().Count() )
+ {
+ if ( iAppUi.GetActiveMailbox()->OwnMailAddress().GetEmailAddress().Compare(messagePtr->GetBCCRecipients()[0]->GetEmailAddress()) )
+ {
+ numRecipients++;
+ }
+ }
+ }
+
+ }
+
+ if ( numRecipients > 1 )
+ {
+ itemList.AppendL( FsEActionMenuReplyAll );
+ }
+ itemList.AppendL( FsEActionMenuForward );
+ }
+ // Add mark as read/unread options
+ if ( item->MessagePtr().IsFlagSet(EFSMsgFlag_Read) )
+ {
+ itemList.AppendL( FsEActionMenuMarkUnread );
+ }
+ else
+ {
+ itemList.AppendL( FsEActionMenuMarkRead );
+ }
+ itemList.AppendL( FsEActionMenuDelete );
+
+// <cmail> Touch
+ TActionMenuCustomItemId itemId = CFSEmailUiActionMenu::ExecuteL( itemList, EFscCustom, 0, this );
+// </cmail>
+ CleanupStack::PopAndDestroy( &itemList );
+ HandleActionMenuCommandL( itemId );
+ }
+ }
+
+
+// <cmail>
+// ---------------------------------------------------------------------------
+// ActionMenuPosition
+// ---------------------------------------------------------------------------
+//
+TPoint CFSEmailUiSearchListVisualiser::ActionMenuPosition()
+ {
+ TAlfRealRect focusRect;
+ TFsTreeItemId listItemId = iSearchList->FocusedItem();
+ iSearchList->GetItemDisplayRectTarget(listItemId, focusRect);
+ return focusRect.iTl;
+ }
+// </cmail>
+
+
+// ---------------------------------------------------------------------------
+// HandleActionMenuCommandL
+// Action menu command callback handler
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiSearchListVisualiser::HandleActionMenuCommandL( TActionMenuCustomItemId itemId )
+ {
+ FUNC_LOG;
+ // Map each Action Menu ID to correcponding command ID.
+ TInt commandId = KErrNotFound;
+
+ switch( itemId )
+ {
+ case FsEActionMenuOpenCalendarEvent:
+ case FsEActionMenuOpen:
+ commandId = EFsEmailUiCmdOpen;
+ break;
+ case FsEActionMenuAccept:
+ commandId = EFsEmailUiCmdCalActionsAccept;
+ break;
+ case FsEActionMenuTentative:
+ commandId = EFsEmailUiCmdCalActionsTentative;
+ break;
+ case FsEActionMenuDecline:
+ commandId = EFsEmailUiCmdCalActionsDecline;
+ break;
+ case FsEActionMenuRemoveFormCal:
+ commandId = EFsEmailUiCmdCalRemoveFromCalendar;
+ break;
+ case FsEActionMenuMarkRead:
+ commandId = EFsEmailUiCmdMarkAsRead;
+ break;
+ case FsEActionMenuMarkUnread:
+ commandId = EFsEmailUiCmdMarkAsUnread;
+ break;
+ case FsEActionMenuDelete:
+ commandId = EFsEmailUiCmdActionsDelete;
+ break;
+ case FsEActionMenuReply:
+ commandId = EFsEmailUiCmdActionsReply;
+ break;
+ case FsEActionMenuReplyAll:
+ commandId = EFsEmailUiCmdActionsReplyAll;
+ break;
+ case FsEActionMenuForward:
+ commandId = EFsEmailUiCmdActionsForward;
+ break;
+ case FsEActionMenuMove:
+ commandId = EFsEmailUiCmdActionsMoveMessage;
+ break;
+ case FsEActionMenuMoveToDrafts:
+ commandId = EFsEmailUiCmdActionsMoveToDrafts;
+ break;
+ case FsEActionMenuDismissed:
+ commandId = KErrCancel;
+ break;
+ default:
+ __ASSERT_DEBUG( EFalse, Panic( EFSEmailUiUnexpectedValue ) );
+ break;
+ }
+
+ if ( commandId >= 0 )
+ {
+ HandleCommandL( commandId );
+ }
+ }
+
+//<cmail>
+// ---------------------------------------------------------------------------
+// CFSEmailUiSearchListVisualiser::SetHeaderTextAttributesL()
+//
+// Apply header text/background attributes
+// This creates i.e "Search result: %S " title caption and background graphics
+// ---------------------------------------------------------------------------
+//
+void CFSEmailUiSearchListVisualiser::SetHeaderAttributesL()
+ {
+ // Set bar text color/style from skin
+ iBarTextVisual->SetTextStyle( iAppUi.LayoutHandler()->
+ FSTextStyleFromLayoutL( AknLayoutScalable_Apps::main_sp_fs_ctrlbar_pane_t1( 0 ) ).Id() );
+ iBarTextVisual->SetColor( iAppUi.LayoutHandler()->
+ ListNormalStateTextSkinColor() );
+
+ if( iBarBgVisual->Brushes() )
+ {
+ iBarBgVisual->Brushes()->Reset();
+ }
+ iBarBgVisual->EnableBrushesL();
+ CAlfBrush* selectorBrush = iAppUi.FsTextureManager()->
+ NewCtrlBarSelectorBrushLC();
+ selectorBrush->SetOpacity( KFSHeaderTextBackgroundOpacity );
+ iBarBgVisual->Brushes()->AppendL( selectorBrush, EAlfHasOwnership );
+ CleanupStack::Pop( selectorBrush );
+ }
+//</cmail>
+
+
+
+
+// End of file