--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/mce/src/MceMessageListView.cpp Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,4176 @@
+/*
+* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+* This view is created when user opens folder.
+*
+*/
+
+
+
+
+// INCLUDE FILES
+
+#include <eikmenub.h> // menu stuff
+#include <apgcli.h> // RApaLsSession
+#include <msvuids.h>
+#include <msvids.h>
+#include <StringLoader.h> // StringLoader
+#include <aknlists.h>
+#include <akntitle.h> // CAknTitlePane
+#include <aknclearer.h> // CAknLocalScreenClearer
+#include <NpdApi.h> // CNotepadApi
+#include <SenduiMtmUids.h> // mtm uids
+
+#include "MceMessageListContainer.h"
+#include "MceOneRowMessageListContainer.h"
+#include "MceMessageListbox.h"
+#include "MceMessageListView.h"
+#include "MceMainViewListView.h"
+#include "MceSessionHolder.h"
+#include "MceBitmapResolver.h"
+#include "mceui.h"
+#include "MceCommands.hrh"
+#include <mce.rsg>
+
+#include <CommonContentPolicy.h> // banned mime types
+#include <MsgBioUids.h> // KMsgBioUidPictureMsg
+
+#include <bldvariant.hrh>
+#include <featmgr.h>
+#include <mmsconst.h>
+#include <MtmExtendedCapabilities.hrh>
+
+// MMS.Content.Upload
+#include <SenduiMtmUids.h>
+
+#include <centralrepository.h>
+#include <messaginginternalcrkeys.h>
+#include <MessagingDomainCRKeys.h>
+#include <messagingvariant.hrh>
+
+#include <AiwServiceHandler.h>
+#include <AiwGenericParam.hrh>
+#include <AiwVariant.h>
+#include <msvuids.h>
+#include <SendUiConsts.h>
+#include <msvstd.h>
+
+#include <akntoolbar.h> //CAknToolbar
+#include <eikcolib.h> //CEikAppUiFactory
+#include <MNcnInternalNotification.h>
+#include <NcnNotificationDefs.h>
+
+class CMsvStore;
+#include <muiucontactservice.h> //CMuiuContactService
+#include <miuthdr.h> // CImHeader
+#include <msvapi.h> //TMsvEntry::ReadStoreL
+#include <miutpars.h> //TImMessageField::GetValidInternetEmailAddressFromString(),
+
+
+#include <bacntf.h> // CEnvironmentChangeNotifier
+
+#include <AknDlgShut.h> // for AknDialogShutter
+#include <messaginginternalpskeys.h>
+// CONSTANTS
+const TInt KMceArraysGranularity = 4;
+
+const TInt KMceOnlyInboxInImap = 1;
+const TInt KMSKPosition = 3;
+
+// Mail technology type
+const TUid KMailTechnologyTypeUid = { 0x10001671 };
+
+// These are for opening the viewer in inbox.
+// We need to wait possible opened editor to be closed before opening received message.
+const TInt KMceLaunchViewerStartTime = 1; // try to open viewer immediately
+const TInt KMceLaunchViewerRetryTime = 500000; // wait 0.5 secs for the next trial
+const TInt KMceLaunchViewerRetryCounter = 20; // so editors have approx 10 secs to save...
+
+// This is the paramater used to set mark as read/unread options menu
+const TBool KIsEmail = ETrue;
+
+// ================= MEMBER FUNCTIONS =======================
+
+
+CMceMessageListView* CMceMessageListView::NewL(
+ CMsvSessionPtr aSession,
+ TMsvId aFolderId,
+ CMceSessionHolder& aSessionHolder,
+ CMceBitmapResolver& aBitmapResolver,
+ CMceMainViewListView& aMainView )
+ {
+ CMceMessageListView* self = new (ELeave) CMceMessageListView(
+ aSession, aFolderId, aSessionHolder, aBitmapResolver, aMainView );
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(); // self
+ return self;
+ }
+
+CMceMessageListView::CMceMessageListView(
+ CMsvSessionPtr aSession,
+ TMsvId aFolderId,
+ CMceSessionHolder& aSessionHolder,
+ CMceBitmapResolver& aBitmapResolver,
+ CMceMainViewListView& aMainView )
+ :
+ iSession( aSession ),
+ iFolderId( aFolderId ),
+ iSessionHolder( aSessionHolder ),
+ iBitmapResolver( aBitmapResolver ),
+ iSelectedIndex( KErrNotFound ),
+ iMainViewListView( aMainView ),
+ iSortOrder( EMceCmdSortByDate ),
+ iOrdering( EFalse ),
+ iContextCommand(EFalse)
+ {
+ iSessionHolder.AddClient();
+ iReadUnread = EFalse;
+ }
+
+CMceMessageListView::~CMceMessageListView()
+ {
+ delete iListboxMailTypeObserver;
+ delete iListboxInboxTypeObserver;
+ if (iMsgListContainer)
+ {
+ SetMskObserver(EFalse);
+ AppUi()->RemoveFromStack(iMsgListContainer);
+ delete iMsgListContainer;
+ }
+ delete iInboxName;
+ delete iRemoteMailboxEmptyText;
+ delete iEmptyText;
+ delete iMessageViewerLauncher;
+ delete iLocalScreenClearer;
+ delete iFolderItemArray;
+ delete iDateTimeNotifier;
+ delete iAiwServiceHandler;
+ RProperty::Delete( KPSUidMuiu, KMceTemplatesDialog );
+ iSessionHolder.RemoveClient();
+ }
+
+void CMceMessageListView::ConstructL( )
+ {
+ MCELOGGER_ENTERFN("CMceMessageListView::ConstructL");
+
+ BaseConstructL( R_MCE_FOLDER_VIEW );
+ iMceUi = STATIC_CAST( CMceUi*, AppUi() );
+
+ iInboxName = StringLoader::LoadL( R_INBOX_NAME, iEikonEnv );
+ iRemoteMailboxEmptyText = StringLoader::LoadL( R_MCE_TEXT_NO_EMAIL, iEikonEnv );
+ iEmptyText = StringLoader::LoadL( R_MCE_TEXT_NO_ITEMS, iEikonEnv );
+ iFolderItemArray = new(ELeave) CMceFolderItemArray( KMceArraysGranularity );
+ CRepository* repository = CRepository::NewL( KCRUidMuiuVariation );
+ TInt featureBitmask = 0;
+ TInt error = repository->Get( KMuiuEmailConfigFlags,featureBitmask );
+ delete repository;
+ repository = NULL;
+ if ( error == KErrNone )
+ {
+ iIsUnread = featureBitmask & KEmailFeatureIdEmailUnreadFunction;
+ }
+ else
+ {
+ iIsUnread = EFalse;
+ }
+ iListboxMailTypeObserver = CMceListboxTypeObserver::NewL( *this, KMuiuMailMessageListType );
+ iListboxInboxTypeObserver = CMceListboxTypeObserver::NewL( *this, KMuiuInboxMessageListType );
+
+ MCELOGGER_LEAVEFN("CMceMessageListView::ConstructL");
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::DoActivateL
+// ----------------------------------------------------
+void CMceMessageListView::DoActivateL(
+ const TVwsViewId& aPrevViewId,
+ TUid aCustomMessageId, /* Folder ID */
+ const TDesC8& /*aCustomMessage*/)
+ {
+
+ MCELOGGER_ENTERFN("CMceMessageListView::DoActivateL()");
+
+ // if new message is shown during disconnecting
+ // prevent to exit from mce
+ iMceUi->ClearExitAfterDisconnectFlag();
+
+ // Save the sort ordering in the message store
+ // Set the default sort order
+ iSortOrder = EMceCmdSortByDate;
+ iOrdering = EFalse;
+ if ( iMsgListContainer )
+ {
+ TMsvId fId = iMsgListContainer->CurrentFolderId();
+ for( TInt loop = 0; loop < iFolderItemArray->Count() ; loop++ )
+ {
+ TMceFolderItem item = ((*iFolderItemArray)[loop]);
+ if ( item.iFolderId == fId && aPrevViewId == TDRVIEWID)
+ {
+ iSortOrder = item.iSortOrder;
+ iOrdering = item.iOrdering;
+ }
+ }
+ }
+ if (aPrevViewId != TDRVIEWID )
+ {
+ // Reset the sort order
+ iFolderItemArray->Reset();
+ }
+ if ( iMsgListContainer )
+ {
+ iMsgListContainer->SetSortTypeL( iSortOrder, iOrdering );
+ }
+
+ TMsvId id = 0;
+ TBool editorLaunched = EFalse;
+ TBool launchingFromOutside = EFalse;
+ TInt msgMtmUid = 0;
+ TMsvId service = KMsvLocalServiceIndexEntryId;
+ TMsvEntry entry;
+
+ if ( aCustomMessageId.iUid > KMsvRootIndexEntryId )
+ {
+
+ if ( iSession->GetEntry( aCustomMessageId.iUid, service, entry ) != KErrNone )
+ {
+ iSession->GetEntry( KMsvGlobalInBoxIndexEntryId, service, entry ); // this should always succeed!
+ }
+
+ // outside the app.
+ launchingFromOutside = ETrue;
+ //check, if message store has been changed from MMC to phone
+ iMceUi->ToPhoneMemoryQueryL( ETrue );
+
+ // Set the forder containing the entry
+ if ( entry.iType == KUidMsvMessageEntry )
+ {
+ // The aCustomMessageId is an ID of a message, set Inbox
+ SetFolderL( entry.Parent() );
+ id = aCustomMessageId.iUid;
+ }
+ else
+ {
+ // Set the folder based on the given ID
+ iFolderId = aCustomMessageId.iUid;
+ // this is performance optimization, start to launch viewer before container creation
+ if ( !iMsgListContainer && entry.Id() == KMsvGlobalInBoxIndexEntryId )
+ {
+ if ( LaunchViewerWhenOneUnreadL( msgMtmUid ) > KErrNotFound )
+ {
+ editorLaunched = ETrue;
+ }
+ }
+ }
+ iMceUi->SetDontExitOnNextOperationComplete();
+ }
+
+ if ( iMsgListContainer &&
+ iCurrentListType != GetFolderListBoxType())
+ {
+ ListboxTypeChangedL();
+ }
+ else
+ {
+ CreateListboxL();
+ }
+
+
+ if ( iMsgListContainer && aPrevViewId == TDRVIEWID )
+ {
+ // Save the sort ordering in the message store
+ // Set the default sort order
+ iSortOrder = EMceCmdSortByDate;
+ iOrdering = EFalse;
+ TMsvId fId = iFolderId;
+ for( TInt loop = 0; loop < iFolderItemArray->Count() ; loop++ )
+ {
+ TMceFolderItem item = ((*iFolderItemArray)[loop]);
+ if ( item.iFolderId == fId )
+ {
+ iSortOrder = item.iSortOrder;
+ iOrdering = item.iOrdering;
+ }
+ }
+
+ iMsgListContainer->SetSortTypeL( iSortOrder, iOrdering );
+ }
+
+ iMsgListContainer->SetFolderL( iFolderId );
+
+ // Unset flag so one row list container knows that first subtitle is to be opened
+ iMsgListContainer->SetContainerFlag( EMceOneRowFlagFirstSubtitleOpen, EFalse );
+
+ iMsgListContainer->ClearSelection();
+ iMsgListContainer->SetRect(ClientRect());
+
+ SetMskObserver( ETrue );
+ AppUi()->RemoveFromStack( iMsgListContainer );
+ AppUi()->AddToStackL( *this,iMsgListContainer );
+ iMsgListContainer->ActivateL();
+ iMsgListContainer->MakeVisible(ETrue);
+
+ //const TMsvEntry& folderEntry = iMsgListContainer->FolderEntry();
+
+ entry = iMsgListContainer->FolderEntry();
+
+ if ( entry.Parent() == KMsvRootIndexEntryId &&
+ entry.iType == KUidMsvServiceEntry &&
+ entry.iMtm == KSenduiMtmImap4Uid &&
+ iMsgListContainer->Count() )
+ {
+ // TODO: container and array should handle this?
+ FindInboxAndOpenItL();// special handling for imap4 Inbox, folderEntry -> empty
+ }
+
+ if ( IsSyncMl() && launchingFromOutside )
+ {
+ SyncMlFindInboxAndOpenItL();
+ }
+
+
+ // Handle the resource change
+ if ( iMceUi->ResourceChangeCalled() )
+ {
+ iMsgListContainer->HandleResourceChange( KEikDynamicLayoutVariantSwitch );
+ iMceUi->ResetResourceChange();
+ }
+
+ SetEmptyTextL();
+
+ iMsgListContainer->ResetCurrentItemL();
+
+ // Fetch pointer to the default title pane control
+ CAknTitlePane* title = iMceUi->TitlePaneL();
+ TMsvEntry serviceEntry;
+ TMsvId serviceId;
+
+ entry = iMsgListContainer->FolderEntry();
+
+ if ( (entry.iMtm == KSenduiMtmImap4Uid || IsSyncMl() ) &&
+ iSession->GetEntry( entry.iServiceId, serviceId, serviceEntry) == KErrNone )
+ {
+ title->SetTextL( serviceEntry.iDetails );
+ }
+ else
+ {
+ title->SetTextL( entry.iDetails );
+ }
+
+ // Set the MSK for the view
+ SetMSKButtonL();
+
+ iMceViewActivated = ETrue;
+
+ TBool activateConnQueryTimer = ETrue;
+
+ if ( launchingFromOutside )
+ {
+ iMceUi->RemoveTabs(); // just to make sure, doesn't do anything if no tabs
+ const TMsvId entryId = entry.Id();
+
+ if ( entry.Parent() == KMsvRootIndexEntryId ||
+ ( entry.iMtm == KSenduiMtmImap4Uid && !IsImapFolderOpenL( ) ) ||
+ entryId == KMsvGlobalInBoxIndexEntryId ||
+ entryId == KMsvGlobalOutBoxIndexEntryId ||
+ entryId == KMsvDraftEntryId ||
+ entryId == KMsvSentEntryId ||
+ entryId == KMceDocumentsEntryId ||
+ ( IsSyncMl() && entry.iRelatedId == KMsvGlobalInBoxIndexEntryId ) )
+ {
+ if ( entry.iMtm == KSenduiMtmImap4Uid && entry.iDetails.CompareF( iInboxName->Des() ) == 0 )
+ {
+ iMceUi->ShowTabsL( serviceId ); // this was got above so this points to correct service.
+ }
+ else
+ {
+ iMceUi->ShowTabsL( aCustomMessageId.iUid );
+ }
+ }
+ else
+ {
+ ChangeFolderL(ETrue);
+ }
+
+ if ( !editorLaunched )
+ {
+ if ( iFolderId == KMsvGlobalOutBoxIndexEntryId ||
+ iFolderId == KMsvGlobalInBoxIndexEntryId ||
+ ( entry.Parent() == KMsvRootIndexEntryId &&
+ ( iMceUi->CheckTechnologyTypeFromMtm( KMailTechnologyTypeUid, entry.iMtm ) ) &&
+ entry.iType == KUidMsvServiceEntry ) ||
+ ( SyncMlOutboxInbox( KMsvGlobalInBoxIndexEntryId ) &&
+ entry.iType == KUidMsvServiceEntry) )
+ {
+ if ( !FindUnreadMessageAndOpenItL( id ) )
+ {
+ activateConnQueryTimer = ETrue;
+ }
+ else
+ {
+ activateConnQueryTimer = EFalse;
+ }
+ }
+ }
+ }
+
+
+ iMceUi->SetMceViewActive( EMceMessageViewActive );
+
+ if ( activateConnQueryTimer )
+ {
+ if ( entry.iMtm == KSenduiMtmImap4Uid ||
+ entry.iMtm == KSenduiMtmPop3Uid )
+ {
+ iConnectionNote = ETrue;
+ iMceUi->ActivateConnectionQueryTimerL( iFolderId );
+ }
+ }
+
+ iMsgListContainer->RefreshSelectionIndexesL ( EFalse );
+ iMsgListContainer->RefreshListbox();
+
+ // NCN reset, if the mail folder contains unread messages
+ if ( iMceUi->CheckTechnologyTypeFromMtm( KMailTechnologyTypeUid, entry.iMtm ) &&
+ HasUnreadMessagesL() )
+ {
+ iMceUi->HandleNotif(iMsgListContainer->FolderEntry().iServiceId);
+ }
+
+ if ( !iDateTimeNotifier )
+ {
+ iDateTimeNotifier = CEnvironmentChangeNotifier::NewL(
+ CActive::EPriorityLow,
+ TCallBack( EnvironmentChanged, this ) );
+ }
+
+ if ( !iDateTimeNotifier->IsActive() )
+ {
+ iDateTimeNotifier->Start();
+ }
+
+ MCELOGGER_LEAVEFN("CMceMessageListView::DoActivateL()");
+ }
+
+
+// ----------------------------------------------------
+// CMceMessageListView::DoDeactivate
+// ----------------------------------------------------
+void CMceMessageListView::DoDeactivate()
+ {
+ if (iMsgListContainer)
+ {
+ delete iDateTimeNotifier;
+ iDateTimeNotifier = NULL;
+ iMsgListContainer->MakeVisible(EFalse);
+ AppUi()->RemoveFromStack(iMsgListContainer);
+ delete iMsgListContainer;
+ iMsgListContainer = NULL;
+ }
+ iMceViewActivated = EFalse;
+ }
+
+
+// ----------------------------------------------------
+// CMceMessageListView::HandleCommandL
+// ----------------------------------------------------
+void CMceMessageListView::HandleCommandL( TInt aCommand )
+ {
+ MCELOGGER_WRITE_FORMAT("CMceMessageListView::HandleCommandL: aCommand: %d", aCommand);
+
+ if ( !iMceViewActivated )
+ {
+ return;
+ }
+
+ switch (aCommand)
+ {
+ case EAknSoftkeyBack:
+ if ( FolderOpenedL() )
+ {
+ ChangeFolderL( ETrue );
+ }
+ else
+ {
+ iConnectionNote = EFalse;
+ HandleCloseL();
+ }
+ break;
+ case EAknCmdOpen:
+ case EAknSoftkeyContextOptions:
+ HandleOpenL();
+ break;
+ case EAknCmdHideInBackground:
+ // handled by app ui and sent directly to appui by avkon framework so ignore this by view.
+ break;
+ case EMceCmdConnect:
+ {
+ if ( iMsgListContainer->FolderEntry().iMtm == KSenduiMtmImap4Uid ||
+ iMsgListContainer->FolderEntry().iMtm == KSenduiMtmPop3Uid )
+ {
+ iMceUi->GoOnlineL( iMsgListContainer->FolderEntry().iServiceId );
+ }
+ break;
+ }
+ case EMceCmdCloseConnection:
+ {
+ if ( iMsgListContainer->FolderEntry().iMtm == KSenduiMtmImap4Uid ||
+ iMsgListContainer->FolderEntry().iMtm == KSenduiMtmPop3Uid )
+ {
+ iMceUi->GoOfflineL( iMsgListContainer->FolderEntry().iServiceId );
+ }
+ break;
+ }
+ case EAknCmdMark:
+ {
+ iMsgListContainer->AddCurrentItemToSelectionL();
+ SetMSKButtonL();
+ break;
+ }
+ case EAknCmdUnmark:
+ {
+ iMsgListContainer->RemoveCurrentItemFromSelection();
+ SetMSKButtonL();
+ break;
+ }
+ case EAknUnmarkAll:
+ {
+ iMsgListContainer->ClearSelection();
+ SetMSKButtonL();
+ break;
+ }
+
+ case EAknMarkAll:
+ {
+ iMsgListContainer->AddAllToSelectionL();
+ SetMSKButtonL();
+ break;
+ }
+
+ case EAknCmdMarkReadMsgs:
+ {
+ FindAllReadMsgAndMarkL();
+ break;
+ }
+
+ case EMceCmdSendViaIr:
+ iMceUi->SendViaL( iMsgListContainer->CurrentItemId(), KSenduiMtmIrUid );
+ break;
+
+ case EMceCmdSendViaBt:
+ iMceUi->SendViaL( iMsgListContainer->CurrentItemId(), KSenduiMtmBtUid );
+ break;
+
+
+ case EMceCmdSortByDate:
+ case EMceCmdSortBySubject:
+ case EMceCmdSortByRecipient:
+ case EMceCmdSortBySender:
+ case EMceCmdSortByType:
+ HandleSortCommandL( aCommand );
+ break;
+
+ case EMceCommandMMSContentUpload:
+ // MMS.Content.Upload
+ iMceUi->ShowUploadQueryL();
+ break;
+ case EMceCmdDelete:
+ // Cannot delete while the message viewer is being launched by the NCN
+ if ( !iMessageViewerLauncher )
+ {
+ iMceUi->HandleCommandL( aCommand );
+ }
+ break;
+
+ case EMceHCListCmdExpand:
+ case EMceHCListCmdCollapse:
+ case EMceHCListCmdCollapse1:
+ case EMceHCListCmdCollapse2:
+ HandleContainerOptionsCommandL( aCommand );
+ break;
+
+ case EMceCmdNewFolder:
+ case EMceCmdRenameFolder:
+ iMsgListContainer->ClearSelection();
+ // drop through
+ default:
+ if ( iAiwServiceHandler && FeatureManager::FeatureSupported(KFeatureIdSyncMlDsEmail) &&
+ KAiwCmdSynchronize == iAiwServiceHandler->ServiceCmdByMenuCmd(aCommand))
+ {
+ TInt appId = EGenericParamMessageItemEMail;
+ const TMsvEntry entry = iMsgListContainer->FolderEntry();
+ CAiwGenericParamList* list = AiwSyncParamListLC( appId, entry.iDetails );
+
+ iAiwServiceHandler->ExecuteMenuCmdL(aCommand, *list,
+ iAiwServiceHandler->OutParamListL() );
+ CleanupStack::PopAndDestroy(list);
+ }
+ // NSS Handling MessageReader AIW command
+ else if( iAiwServiceHandler && KAiwCmdView == iAiwServiceHandler->ServiceCmdByMenuCmd(aCommand))
+ {
+ /**
+ * @todo Fetching and packing message list is duplicated in
+ * HandleCommandL and in DynInitMenuPaneL. should be extracted
+ * into a separate method. I don't dare to introduce a new
+ * method. Let the mce team care about it
+ */
+ CMsvEntrySelection* itemIds = iMsgListContainer->CurrentItemSelectionL();
+ CleanupStack::PushL( itemIds );
+
+ CAiwGenericParamList& inList = iAiwServiceHandler->InParamListL();
+
+ for ( TInt i( 0 ); i < itemIds->Count(); i++ )
+ {
+ TMsvId itemId ( (*itemIds)[i] );
+ TMsvEntry currentEntry;
+ TMsvId serviceId; // not used here but needed by GetEntry function
+
+ if ( iSession->GetEntry( itemId, serviceId, currentEntry ) == KErrNone )
+ {
+ // Pack the TMsvEntry into the TAiwVariant and add it to the param list
+ TPckgC<TMsvEntry> packedEntry ( currentEntry );
+
+ // does not copy the data
+ TAiwVariant varEntry( packedEntry );
+ TAiwGenericParam parEntry( EGenericParamUnspecified, varEntry );
+
+ // copies the data
+ inList.AppendL( parEntry );
+ } // if
+ // message reader wise ignore the error
+ // @todo log the error according to the mce team standards
+ } // for
+
+ CleanupStack::PopAndDestroy( itemIds );
+
+ iAiwServiceHandler->ExecuteMenuCmdL( aCommand, inList,
+ iAiwServiceHandler->OutParamListL() );
+ }
+ // NSS End of handling MessageReader AIW command
+ else
+ {
+ iMceUi->HandleCommandL( aCommand );
+ }
+ break;
+ }
+ MCELOGGER_LEAVEFN("CMceMessageListView::HandleCommandL()");
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::HandleSessionEventL
+// ----------------------------------------------------
+void CMceMessageListView::HandleSessionEventL(
+ TMsvSessionEvent aEvent, TAny* aArg1, TAny* aArg2, TAny* aArg3)
+ {
+ MCELOGGER_WRITE_TIMESTAMP("CMceMessageListView::HandleSessionEventL() start");
+ switch ( aEvent )
+ {
+ case EMsvEntriesDeleted:
+ {
+ // check that we don't have deleted folder open
+ CMsvEntrySelection* selection = (CMsvEntrySelection*) aArg1;
+ if ( iMceViewActivated && selection->Find( iFolderId ) != KErrNotFound )
+ {
+ // opened folder is deleted, must change to documents
+ SetFolderL( KMceDocumentsEntryId );
+ iMceUi->ShowTabsL( KMceDocumentsEntryId );
+ CAknTitlePane* title=iMceUi->TitlePaneL();
+ TMsvEntry documentsEntry;
+ TMsvId serviceId;
+ if ( iSession->GetEntry( KMceDocumentsEntryId, serviceId, documentsEntry)
+ == KErrNone )
+ {
+ title->SetTextL( documentsEntry.iDetails );
+ }
+ if ( iMsgListContainer )
+ {
+ iMsgListContainer->SetFolderL( KMceDocumentsEntryId );
+ iMsgListContainer->ClearSelection();
+ }
+ }
+
+ if ( /*!iMceUi->ViewUpdateSuppressionFlag() &&*/
+ iMsgListContainer &&
+ iFolderId == (*(TMsvId*) (aArg2)) )
+ {
+ iMsgListContainer->HandleMsvSessionEventL( aEvent, *selection, !iMceUi->ViewUpdateSuppressionFlag() );
+ //HandleEntriesDeletedL();
+ SetMSKButtonL();
+ //this has been commented due to toolbar not showing up after opening a message and deleting and come back to main view
+ //UpdateToolbarL();
+ }
+
+ }
+ break;
+ case EMsvEntriesCreated:
+ case EMsvEntriesChanged:
+ {
+ const TMsvId parentId = (*(TMsvId*) aArg2);
+ CMsvEntrySelection* selection = (CMsvEntrySelection*) aArg1;
+ MessageViewHandleEntriesCreatedOrChangedL( parentId, selection);
+ if ( iMsgListContainer )
+ {
+ // Set the middle soft key
+ SetMSKButtonL();
+
+ if ( iFolderId == (*(TMsvId*) (aArg2)) )
+ {
+ iMsgListContainer->HandleMsvSessionEventL( aEvent, *selection, !iMceUi->ViewUpdateSuppressionFlag() );
+ }
+
+ // Imap: Refresh list
+ if ( iMsgListContainer->FolderEntry().iMtm == KSenduiMtmImap4Uid )
+ {
+ iMsgListContainer->SetRect( ClientRect() );
+ iMsgListContainer->DrawDeferred();
+ }
+ }
+ }
+
+ break;
+ case EMsvEntriesMoved:
+ {
+ const TMsvId parentId = (*(TMsvId*) aArg2);
+ CMsvEntrySelection* selection = (CMsvEntrySelection*) aArg1;
+ if ( iMsgListContainer )
+ {
+ // Set the middle soft key
+ SetMSKButtonL();
+ if ( parentId == iFolderId )
+ {
+ iMsgListContainer->HandleMsvSessionEventL( EMsvEntriesCreated, *selection, !iMceUi->ViewUpdateSuppressionFlag() );
+ }
+ else if ( (*(TMsvId*) (aArg3)) == iFolderId )
+ {
+ iMsgListContainer->HandleMsvSessionEventL( EMsvEntriesDeleted, *selection, !iMceUi->ViewUpdateSuppressionFlag() );
+ }
+
+ // Folder string update for one row list
+ if (iMsgListContainer->MceListId() == EMceListTypeOneRow )
+ {
+ TMsvId service;
+ TMsvEntry toFolder;
+ if ( iSession->GetEntry( parentId, service, toFolder ) == KErrNone )
+ {
+ // Is target folder subfolder for current folder
+ if ( toFolder.Parent() == iFolderId )
+ {
+ CMsvEntrySelection* targetSelection = new(ELeave) CMsvEntrySelection();
+ CleanupStack::PushL( targetSelection );
+ targetSelection->AppendL( parentId );
+ // Send EMsvEntriesChanged to one row message list container
+ // with move target folder information to get folder string updated
+ iMsgListContainer->HandleMsvSessionEventL( EMsvEntriesChanged, *targetSelection,
+ !iMceUi->ViewUpdateSuppressionFlag() );
+ CleanupStack::PopAndDestroy( targetSelection );
+ }
+ }
+ }
+ }
+ }
+
+ break;
+
+ case EMsvCloseSession:
+ {
+ if (iMsgListContainer)
+ {
+//TODO
+// CMceMessageListItemArray* listArray = iMsgListContainer->ListItems();
+// listArray->HandleSessionEventL( aEvent, aArg1, aArg2, aArg3 );
+ }
+
+ iSession->RemoveObserver( *this );
+ }
+ break;
+
+ case EMsvMediaChanged:
+ {
+ if (iMceUi->MceViewActive(EMceMessageViewActive) )
+ {
+
+ // this is because DoDeactivate saves current index and when returning to main view
+ // we want to reset current index
+ iMceUi->SetCustomControl(1);
+ iSelectedIndex = 0;
+ iMainViewListView.SetSelectedFolderId( iFolderId );
+ iMceUi->ActivateLocalViewL( KMceMainViewListViewId );
+ iMceUi->RemoveTabs();
+ }
+ }
+ break;
+
+ default:
+ break;
+
+ };
+ UpdateViewL();
+ MCELOGGER_WRITE_TIMESTAMP("CMceMessageListView::HandleSessionEventL() end");
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::ProcessCommandL
+// ----------------------------------------------------
+void CMceMessageListView::ProcessCommandL(TInt aCommand)
+ {
+ iMceUi->CancelMailboxTimer();
+ MCELOGGER_WRITE("CMceMessageListView::ProcessCommandL");
+
+ if ( ( !iMessageViewerLauncher || ( iMessageViewerLauncher && !iMessageViewerLauncher->IsActive() ) ) &&
+ !iMceUi->IsEditorOpen() )
+ {
+ if ( aCommand == EAknSoftkeyContextOptions )
+ {
+ // Handle the context sensitive menu
+ iFetchMenuSelectionKeyPressed = ETrue;
+ iHideExitCommand = ETrue;
+ aCommand = EAknSoftkeyOptions;
+ if(iFolderId == KMsvGlobalOutBoxIndexEntryIdValue)
+ iContextCommand = ETrue;
+ MenuBar()->SetMenuType(CEikMenuBar::EMenuContext);
+ }
+ CAknView::ProcessCommandL( aCommand );
+ MenuBar()->SetMenuType(CEikMenuBar::EMenuOptions);
+ }
+#ifdef _DEBUG
+ else
+ {
+ MCELOGGER_WRITE("MCE: Editor is open so don't call CAknView::ProcessCommandL");
+ }
+#endif
+ }
+
+
+// ----------------------------------------------------
+// CMceMessageListView::Id
+// ----------------------------------------------------
+TUid CMceMessageListView::Id() const
+ {
+ return KMceMessageListViewId;
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::HandleListBoxEventL
+// ----------------------------------------------------
+void CMceMessageListView::HandleListBoxEventL(
+ CEikListBox* /*aListBox*/,
+ TListBoxEvent aEventType )
+ {
+ switch(aEventType)
+ {
+ case EEventEnterKeyPressed:
+ case EEventItemSingleClicked:
+ iMceUi->CancelMailboxTimer();
+ HandleOpenL();
+ break;
+ default:
+ break;
+ }
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::HandleCloseL
+// ----------------------------------------------------
+void CMceMessageListView::HandleCloseL( )
+ {
+ // this is because DoDeactivate saves current index and when returning to main view
+ // we want to reset current index
+ iSelectedIndex = 0;
+ if ( iMsgListContainer->FolderEntry().iMtm == KUidMsvLocalServiceMtm )
+ {
+ iMainViewListView.SetSelectedFolderId( iFolderId );
+ }
+ else
+ {
+ // we are closing service and we should inform main view that
+ // service id, not folder id.
+ iMainViewListView.SetSelectedFolderId( iMsgListContainer->FolderEntry().iServiceId );
+ }
+ iMceUi->ActivateLocalViewL( KMceMainViewListViewId );
+ iMceUi->RemoveTabs();
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::ChangeFolderL
+// ----------------------------------------------------
+void CMceMessageListView::ChangeFolderL( TBool aOpenParent )
+ {
+ if ( aOpenParent && FolderOpenedL() )
+ {
+ iMceUi->RemoveFolderTabs();
+ ChangeFolderAndRefreshListboxL( iMsgListContainer->FolderEntry().Parent() );
+ const TMsvEntry& entry = iMsgListContainer->FolderEntry();
+ const TMsvId entryId = entry.Id();
+ if ( entry.Parent() == KMsvRootIndexEntryId ||
+ ( entry.iMtm == KSenduiMtmImap4Uid && !IsImapFolderOpenL( ) ) ||
+ entryId == KMsvGlobalInBoxIndexEntryId ||
+ entryId == KMsvGlobalOutBoxIndexEntryId ||
+ entryId == KMsvDraftEntryId ||
+ entryId == KMsvSentEntryId ||
+ entryId == KMceDocumentsEntryId )
+ {
+ iMceUi->ShowTabsL( entry.Id() );
+ }
+ }
+ else if ( !aOpenParent )
+ {
+ iMceUi->RemoveTabs();
+ TMsvEntry child;
+ TMsvId serviceId;
+ TInt error = iSession->GetEntry( iMsgListContainer->CurrentItemId(), serviceId, child );
+ if ( error == KErrNone )
+ {
+ if ( child.Id() == KMceTemplatesEntryId )
+ {
+
+ TInt r = RProperty::Define( KPSUidMuiu, KMceTemplatesDialog, RProperty::EInt );
+ if ( r != KErrAlreadyExists )
+ {
+ User::LeaveIfError( r );
+ }
+ if ( iCurrentListType == EMceListTypeOneRow)
+ {
+ r = RProperty::Set( KPSUidMuiu, KMceTemplatesDialog, MceTemplatesDialogOpen );
+ }
+
+ if ( CNotepadApi::ExecTemplatesL() == EAknSoftkeyExit )
+ {
+ iAvkonViewAppUi->ProcessCommandL( EAknCmdExit );
+ }
+
+ if ( iCurrentListType == EMceListTypeOneRow)
+ {
+ r = RProperty::Set( KPSUidMuiu, KMceTemplatesDialog, MceTemplatesDialogClose );
+ }
+ if ( !(iMceUi->MceViewActive( EMceMainViewActive )))
+ iMceUi->ShowTabsL( iMsgListContainer->FolderEntry().Id() );
+ ListContainer()->DrawDeferred();
+ }
+ else if ( child.iType == KUidMsvFolderEntry ||
+ child.iType == KUidMsvServiceEntry ) // this should not be possible
+ {
+ ChangeFolderAndRefreshListboxL( child.Id() );
+ }
+ } // end if error == KErrNone
+ } // else
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::DynInitMenuPaneL
+// ----------------------------------------------------
+
+void CMceMessageListView::DynInitMenuPaneL(
+ TInt aResourceId,
+ CEikMenuPane* aMenuPane )
+ {
+ if ( !iMceViewActivated )
+ {
+ return;
+ }
+
+ if ( !iAiwServiceHandler )
+ {
+ iAiwServiceHandler = CAiwServiceHandler::NewL();
+ }
+
+ if ( !iListViewFlags.MceFlag(EMceUiFlagsMainViewAiwCreated) )
+ {
+ iAiwServiceHandler->AttachMenuL( R_MCE_FOLDER_MENU, R_AIWMCE_INTEREST );
+ iListViewFlags.SetMceFlag(EMceUiFlagsMainViewAiwCreated);
+ }
+
+ if (iAiwServiceHandler->HandleSubmenuL(*aMenuPane))
+ {
+ return;
+ }
+
+ switch ( aResourceId )
+ {
+ case R_MCE_FOLDER_MENU:
+ aMenuPane->SetItemDimmed( EAknCmdHelp,
+ !FeatureManager::FeatureSupported( KFeatureIdHelp ) );
+
+ iMsgListContainer->MarkItemSelectionL();
+ if ( !iHideExitCommand &&
+ !iMsgListContainer->DisplayOptionsMenuFromSelectionKey() &&
+ iMsgListContainer->CurrentItemType() == CMceMessageListContainerBase::EMessageListItemMsvItem
+ )
+ {
+ iMceUi->DynInitMenuPaneL( aResourceId, aMenuPane );
+ }
+ // MMS.Content.Upload
+ aMenuPane->SetItemDimmed( EMceCommandMMSContentUpload, !FeatureManager::FeatureSupported(KFeatureIdSenduiMmsUpload) );
+ if ( !iMceUi->NumUploadServices() )
+ {
+ aMenuPane->SetItemDimmed( EMceCommandMMSContentUpload, ETrue );
+ }
+
+ FolderMenuL( aMenuPane );
+
+ //multiselection, handle MMMbox item
+ iMceUi->AddMultiselectionMTMFunctionsL(*aMenuPane, EAknCmdOpen);
+
+ // NSS Fetch the MessageReader menu
+ if ( iAiwServiceHandler->IsAiwMenu( aResourceId ) )
+ {
+ /**
+ * @todo Fetching and packing message list is duplicated in
+ * HandleCommandL and in DynInitMenuPaneL. should be extracted
+ * into a separate method. I don't dare to introduce a new
+ * method. Let the mce team care about it
+ */
+ CMsvEntrySelection* itemIds = iMsgListContainer->CurrentItemSelectionL();
+ CleanupStack::PushL( itemIds );
+
+ CAiwGenericParamList& inList = iAiwServiceHandler->InParamListL();
+
+ for ( TInt i( 0 ); i < itemIds->Count(); i++ )
+ {
+ TMsvId itemId ( (*itemIds)[i] );
+ TMsvEntry currentEntry;
+ TMsvId serviceId; // not used here but needed by GetEntry function
+
+ if ( iSession->GetEntry( itemId, serviceId, currentEntry ) == KErrNone )
+ {
+ // Pack the TMsvEntry into the TAiwVariant and add it to the param list
+ TPckgC<TMsvEntry> packedEntry ( currentEntry );
+
+ // does not copy the data
+ TAiwVariant varEntry( packedEntry );
+ TAiwGenericParam parEntry( EGenericParamUnspecified, varEntry );
+
+ // copies the data
+ inList.AppendL( parEntry );
+ } // if
+ // message reader wise ignore the error
+ // @todo log the error according to the mce team standards
+ } // for
+
+ CleanupStack::PopAndDestroy( itemIds );
+
+ iAiwServiceHandler->InitializeMenuPaneL( *aMenuPane, aResourceId,
+ EMceCmdFirstMessageReaderAiwCommand,
+ inList );
+ HandleContainerOptionsMenuL( aMenuPane );
+ }
+
+ break;
+ case R_MCE_EDIT_MENU:
+ EditMenuL( aMenuPane );
+ break;
+ case R_MCE_FETCH_MENU:
+ FetchMenuL( aMenuPane );
+ break;
+
+ case R_MCE_SENDVIA_MENU:
+ aMenuPane->SetItemDimmed( EMceCmdSendViaIr,
+ !FeatureManager::FeatureSupported( KFeatureIdIrda ) );
+ aMenuPane->SetItemDimmed( EMceCmdSendViaBt,
+ !FeatureManager::FeatureSupported( KFeatureIdBt ) );
+
+ break;
+
+ case R_MCE_SORT_BY_MENU:
+ {
+ if ( ( iFolderId != KMsvSentEntryId ) &&
+ ( iFolderId != KMsvDraftEntryId ) &&
+ ( iFolderId != KMsvGlobalOutBoxIndexEntryId) )
+ {
+ aMenuPane->DeleteMenuItem(EMceCmdSortByRecipient);
+ aMenuPane->SetItemDimmed( EMceCmdSortBySender, EFalse );
+ }
+ else
+ {
+ aMenuPane->DeleteMenuItem(EMceCmdSortBySender);
+ aMenuPane->SetItemDimmed( EMceCmdSortByRecipient, EFalse );
+ }
+
+ if ( IsMSKMailBox() )
+ {
+ // Mail folder, only single message type
+ aMenuPane->SetItemDimmed( EMceCmdSortByType, ETrue );
+ }
+ else
+ {
+ // Inbox etc.
+ aMenuPane->SetItemDimmed( EMceCmdSortByType, EFalse );
+ }
+ aMenuPane->SetItemButtonState( iSortOrder, EEikMenuItemSymbolOn );
+ break;
+ }
+
+ case R_MCE_NEW_MESSAGE_MENU:
+ default:
+ iMceUi->DynInitMenuPaneL( aResourceId, aMenuPane );
+ iMsgListContainer->SetContainerFlag( EMceOneRowFlagOptionsMenuOpen, ETrue );
+ break;
+ }
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::HandleContainerOptionsMenuL
+// ----------------------------------------------------
+void CMceMessageListView::HandleContainerOptionsMenuL( CEikMenuPane* aMenuPane )
+ {
+ TUint validCommands = iMsgListContainer->OptionsCommandSupported();
+
+ aMenuPane->SetItemDimmed( EMceHCListCmdExpand, !(validCommands & CMceMessageListContainerBase::TMessageListCommandExpand ));
+ aMenuPane->SetItemDimmed( EMceHCListCmdCollapse1, !(validCommands & CMceMessageListContainerBase::TMessageListCommandCollapse1 ));
+ aMenuPane->SetItemDimmed( EMceHCListCmdCollapse2, !(validCommands & CMceMessageListContainerBase::TMessageListCommandCollapse2 ));
+
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::HandleContainerOptionsCommandL
+// ----------------------------------------------------
+void CMceMessageListView::HandleContainerOptionsCommandL( TInt aCommand )
+ {
+ TInt containerCommand = 0;
+ switch ( aCommand )
+ {
+ case EMceHCListCmdExpand:
+ containerCommand = CMceMessageListContainerBase::TMessageListCommandExpand;
+ break;
+ case EMceHCListCmdCollapse:
+ case EMceHCListCmdCollapse1:
+ case EMceHCListCmdCollapse2:
+ containerCommand = CMceMessageListContainerBase::TMessageListCommandCollapse1;
+ break;
+ default:
+ break;
+ }
+ if ( containerCommand > 0 )
+ {
+ iMsgListContainer->HandleOptionsCommandL( containerCommand );
+ }
+ }
+
+
+// ----------------------------------------------------
+// CMceMessageListView::EditEntryL
+// ----------------------------------------------------
+void CMceMessageListView::EditEntryL()
+ {
+ if ( iMceUi->IsEditorOpen() )
+ {
+ MCELOGGER_WRITE("MCE: EditEntry: do not open because already editing one");
+ return;
+ }
+
+ TMsvId id = iMsgListContainer->CurrentItemId();
+ if ( id < KMsvRootIndexEntryId )
+ {
+ return;
+ }
+ TMsvEntry currentEntry;
+ TMsvId serviceId; // not used here but needed by GetEntry function
+ if ( iSession->GetEntry( id, serviceId, currentEntry ) == KErrNone &&
+ currentEntry.iType == KUidMsvMessageEntry )
+ {
+ if ( (currentEntry.iMtm==KSenduiMtmImap4Uid) || (currentEntry.iMtm==KSenduiMtmPop3Uid) ||
+ (currentEntry.iMtm==KSenduiMtmSyncMLEmailUid)||
+ iMceUi->CheckTechnologyTypeFromMtm( KMailTechnologyTypeUid, currentEntry.iMtm ) )
+ {
+ // Mailbox entry
+ if ( currentEntry.Unread() )
+ {
+ // NCN reset, opening the unread entry
+
+ iMceUi->HandleNotif(iMsgListContainer->FolderEntry().iServiceId);
+ }
+ }
+
+ // just to make sure...
+ iMceUi->CancelMailboxTimer();
+ iRunningEditFunction = ETrue;
+ TRAPD( error, iMceUi->EditMTMEntryL( currentEntry ) );
+ iRunningEditFunction = EFalse;
+ User::LeaveIfError( error );
+ }
+
+ }
+
+
+// ----------------------------------------------------
+// CMceMessageListView::HandleOpenL
+// ----------------------------------------------------
+void CMceMessageListView::HandleOpenL()
+ {
+ if ( !iMsgListContainer->DisplayOptionsMenuFromSelectionKey() )
+ {
+ CMsvEntrySelection* selection = iMsgListContainer->CurrentItemSelectionRefreshL();
+ CleanupStack::PushL( selection );
+ iHideExitCommand = EFalse;
+ TMsvEntry currentEntry;
+ TMsvId serviceId; // not used here but needed by GetEntry function
+ if ( selection->Count() &&
+ iSession->GetEntry( selection->At(0), serviceId, currentEntry ) == KErrNone )
+ {
+ switch ( currentEntry.iType.iUid )
+ {
+ case KUidMsvMessageEntryValue:
+ if ( currentEntry.Parent() != KMsvGlobalOutBoxIndexEntryId )
+ {
+ EditEntryL();
+ }
+ else // Open context sensitive menu
+ {
+ ProcessCommandL( EAknSoftkeyContextOptions );
+ }
+ break;
+ case KUidMsvFolderEntryValue:
+ ChangeFolderL();
+ break;
+ default:
+ break;
+ }
+ }
+ CleanupStack::PopAndDestroy( selection );
+ }
+ else
+ {
+ iHideExitCommand = ETrue;
+ ProcessCommandL( EAknSoftkeyContextOptions );
+ }
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::FetchMenuL
+// ----------------------------------------------------
+void CMceMessageListView::FetchMenuL( CEikMenuPane* aMenuPane ) const
+ {
+ if ( iMsgListContainer->CurrentItemSelectionCount() == 0 )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdFetchSelected, ETrue );
+ }
+ else if ( iFetchMenuSelectionKeyPressed )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdFetchNew, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdFetchAll, ETrue );
+ }
+ }
+
+//
+// ----------------------------------------------------------------------------
+// CMceMessageListView::GetSetRead()
+// ----------------------------------------------------------------------------
+//
+TInt CMceMessageListView::GetSetRead( const CMsvEntrySelection& aEntries )
+ {
+ TBool allRead = ETrue;
+ TBool allUnread = ETrue;
+ TMsvId service;
+ TMsvEntry tEntry;
+
+ for ( TInt cc=aEntries.Count(); --cc>=0; )
+ {
+ if ( iSession->GetEntry(
+ aEntries.At( cc ), service, tEntry ) == KErrNone )
+ {
+ if ( tEntry.Unread() )
+ {
+ allRead = EFalse;
+ }
+ else
+ {
+ allUnread = EFalse;
+ }
+ }
+ }
+
+ if ( allRead && !allUnread )
+ {
+ return MessageFolderAllRead;
+ }
+ else if ( !allRead && allUnread )
+ {
+ // all unread
+ return MessageFolderAllUnread;
+ }
+ else if ( !allRead && !allUnread )
+ {
+ // both read and unread
+ return MessageFolderReadUnread;
+ }
+ else
+ {
+ /* never */
+ return MessageFolderReadUnread;
+ }
+
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::FolderMenuL
+// ----------------------------------------------------
+void CMceMessageListView::FolderMenuL( CEikMenuPane* aMenuPane )
+ {
+ if(iFolderId == KMsvGlobalOutBoxIndexEntryIdValue )
+ {
+ if(iContextCommand)
+ {
+ aMenuPane->SetItemDimmed( EMceCmdOutboxSuspend, EFalse );
+ aMenuPane->SetItemDimmed( EMceCmdOutboxStart, EFalse );
+ aMenuPane->SetItemDimmed( EMceCmdOutboxMoveToDrafts, EFalse );
+ aMenuPane->SetItemDimmed( EMceCmdDelete, EFalse );
+ iContextCommand = EFalse;
+ }
+ else
+ {
+ aMenuPane->SetItemDimmed( EMceCmdOutboxSuspend, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdOutboxStart, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdOutboxMoveToDrafts, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdDelete, ETrue );
+ }
+ }
+ const TInt count = iMsgListContainer->CurrentItemSelectionCount();
+ TBool remotemailboxOpened = ( iMsgListContainer->FolderEntry().iMtm == KSenduiMtmImap4Uid
+ || iMsgListContainer->FolderEntry().iMtm == KSenduiMtmPop3Uid );
+
+ TBool thirdPartEmail = ( !remotemailboxOpened &&
+ iMceUi->CheckTechnologyTypeFromMtm(
+ KMailTechnologyTypeUid,
+ iMsgListContainer->FolderEntry().iMtm ) );
+
+ //Forward is disabled in all folder menus, except is enabled in Sent Items seperately
+ aMenuPane->SetItemDimmed( EMceCmdForward, ETrue );
+ if ( remotemailboxOpened )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdMailboxSettings, IsImapFolderOpenL() );
+ if ( !IsImapFolderOpenL() )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdMailboxSettings, iHideExitCommand );
+ }
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsRead, iHideExitCommand );
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsUnread, iHideExitCommand );
+ aMenuPane->SetItemDimmed( EMceCmdSort, iHideExitCommand );
+ aMenuPane->SetItemDimmed( EMceCmdReply, iHideExitCommand );
+ TMsvEntry tempEntry;
+ TMsvId serviceId;
+ if ( iSession->GetEntry( iMsgListContainer->FolderEntry().iServiceId, serviceId, tempEntry )
+ == KErrNone )
+ {
+ if ( tempEntry.Connected() )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdConnect, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdCloseConnection, (iHideExitCommand && count > 0) );
+ }
+ else
+ {
+ aMenuPane->SetItemDimmed( EMceCmdCloseConnection, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdConnect, (iHideExitCommand && count > 0) );
+ }
+ }
+ // MMS.Content.Upload
+ aMenuPane->SetItemDimmed( EMceCommandMMSContentUpload, ETrue );
+ // No move and copy commands for mail messages
+ aMenuPane->SetItemDimmed( EMceCmdMove, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdCopy, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdOutboxMoveToDrafts, ETrue );
+ }
+ else
+ {
+ aMenuPane->SetItemDimmed( EMceCmdCloseConnection, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdConnect, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdMailboxSettings, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsUnread, !iIsUnread );
+ }
+
+ if ( iFolderId != KMceDocumentsEntryId )
+ {
+ // only documents can have create, rename folder menu items
+ aMenuPane->SetItemDimmed( EMceCmdNewFolder, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdRenameFolder, ETrue );
+ }
+ else
+ {
+ aMenuPane->SetItemDimmed( EMceCmdNewFolder, iHideExitCommand );
+ aMenuPane->SetItemDimmed( EMceCmdRenameFolder, iHideExitCommand );
+ }
+ TInt totalCount = iMsgListContainer->Count();
+ TInt subfolderCount = SubfolderCount();
+ // TODO: I don't understand this if...
+ if ( totalCount != subfolderCount && totalCount - subfolderCount == 1)
+ {
+ aMenuPane->SetItemDimmed( EMceCmdSort, ETrue );
+ }
+ if ( iFolderId == KMsvGlobalOutBoxIndexEntryId )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdEditList, ETrue );
+ }
+ else if ( count > 0 && totalCount == subfolderCount )
+ {
+ // only folders in the list, then "Edit" submenu would be empty so delete it
+ aMenuPane->SetItemDimmed( EMceCmdEditList, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdSort, ETrue );
+ }
+
+ aMenuPane->SetItemDimmed( EMceCmdExit, iHideExitCommand );
+ aMenuPane->SetItemDimmed( EAknCmdOpen, iHideExitCommand );
+ aMenuPane->SetItemDimmed( EMceCmdSort, iHideExitCommand );
+
+ if ( IsSyncMl() )
+ {
+ if ( iMsgListContainer->FolderEntry().iType == KUidMsvServiceEntry )
+ {
+ // Prepare the menu for the SyncML main folder
+ FolderMenuSyncMLMain( aMenuPane );
+ }
+ else
+ {
+ // Prepare the menu for the message lists
+ FolderMenuSyncMLFolderL( aMenuPane );
+ }
+ }
+ else
+ {
+ // Show the SyncML command only for the SyncML folder, no other folders
+ aMenuPane->SetItemDimmed( EMceCmdAiwPlaceholder, ETrue );
+ }
+
+ if ( FeatureManager::FeatureSupported( KFeatureIdHelp ) )
+ {
+ aMenuPane->SetItemDimmed( EAknCmdHelp, iHideExitCommand );
+ }
+
+ TBool hideNewMessageCommand = iHideExitCommand;
+ if ( iHideExitCommand && iFolderId == KMsvDraftEntryId )
+ {
+ hideNewMessageCommand = count > 0;
+ }
+ if ( !IsSyncMl() )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdNewMessage, hideNewMessageCommand );
+ }
+ if ( count == 0 ) // No items in the list
+ {
+ // MMS.Content.Upload
+ aMenuPane->SetItemDimmed( EMceCommandMMSContentUpload, ETrue );
+ FolderMenuNoItemsL( aMenuPane );
+ }
+ else if ( count == 1 ) // 1 selected from the list
+ {
+ FolderMenuOneItemL( aMenuPane, remotemailboxOpened, thirdPartEmail );
+ }
+ else // More than 1 selected from the list
+ {
+ // MMS.Content.Upload
+ aMenuPane->SetItemDimmed( EMceCommandMMSContentUpload, ETrue );
+
+ CMsvEntrySelection* entries = ListContainer()->CurrentItemSelectionL();
+ CleanupStack::PushL( entries );
+
+ TInt setRead = GetSetRead( *entries );
+ FolderMenuManyItemsL( aMenuPane, remotemailboxOpened, thirdPartEmail, setRead );
+
+ if ( remotemailboxOpened ||
+ SyncMlOutboxInbox( KMsvGlobalInBoxIndexEntryId ) ||
+ SyncMlOutboxInbox( KMsvDraftEntryId ) ||
+ SyncMlOutboxInbox( KMsvSentEntryId ) )
+ {
+ switch ( GetDeleteFlagStatusL( entries ) )
+ {
+ case MessageFolderAllDelete:
+ aMenuPane->SetItemDimmed( EMceCmdUndelete, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdDelete, EFalse );
+ break;
+ case MessageFolderAllUnDelete:
+ aMenuPane->SetItemDimmed( EMceCmdDelete, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdUndelete, EFalse );
+ break;
+ case MessageFolderDeleteUnDelete:
+ aMenuPane->SetItemDimmed( EMceCmdUndelete, EFalse );
+ aMenuPane->SetItemDimmed( EMceCmdDelete, EFalse );
+ break;
+ default:
+ break;
+ }
+ }
+
+ // MMS notifications cannot be moved
+ CBaseMtmUiData* uiData = NULL;
+ uiData = iMceUi->GetMtmUiDataL( KUidMsgMMSNotification );// NULL check
+ TMsvId id;
+ TMsvId service;
+ TMsvEntry tEntry;
+ TInt mmsCount = 0;
+ TInt mmsNotDeleteCount = 0;
+
+ for ( TInt cc=entries->Count(); --cc>=0; )
+ {
+ id = entries->At(cc);
+ if ( iSession->GetEntry( id, service, tEntry ) == KErrNone )
+ {
+ if ( tEntry.iMtm == KUidMsgMMSNotification )
+ {
+ mmsCount++;
+ if ( uiData->OperationSupportedL( KMtmUiFunctionDeleteMessage, tEntry ) )
+ {
+ //MMS notification delete this entry not supported
+ mmsNotDeleteCount ++;
+ }
+ }
+ }
+ }
+ if ( mmsCount == count )
+ {
+ //if only mms notifications, then move cannot be done
+ aMenuPane->SetItemDimmed( EMceCmdMove, ETrue );
+ if ( mmsCount == mmsNotDeleteCount )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdDelete, ETrue );
+ }
+ }
+
+ CleanupStack::PopAndDestroy( entries );
+ }
+
+ if( iReadUnread )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsRead, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsUnread, ETrue );
+ }
+
+ iFetchMenuSelectionKeyPressed = iHideExitCommand;
+ iHideExitCommand = EFalse;
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::FolderMenuNoItemsL
+// ----------------------------------------------------
+void CMceMessageListView::FolderMenuNoItemsL( CEikMenuPane* aMenuPane ) const
+ {
+ aMenuPane->SetItemDimmed( EAknCmdOpen, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdEditList, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdDelete, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdUndelete, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdMove, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdOutboxMoveToDrafts, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdCopy, ETrue );
+
+ // "Write New Message" enabled for options and context sensitive menu
+ // in case of empty list in Mail For Exchange mailbox
+ if ( iMsgListContainer->FolderEntry().iMtm == KMceMtmMailForExchangeUid )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdNewMessage, EFalse );
+ }
+
+ if ( !( iMsgListContainer->FolderEntry().iMtm == KSenduiMtmImap4Uid ||
+ iMsgListContainer->FolderEntry().iMtm == KSenduiMtmPop3Uid ) )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdFetch, ETrue );
+ }
+ else
+ {
+ TMsvEntry tempEntry;
+ TMsvId serviceId;
+ if ( iSession->GetEntry( iMsgListContainer->FolderEntry().iServiceId, serviceId, tempEntry ) == KErrNone )
+ {
+ if ( tempEntry.Connected() )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdFetch, ETrue );
+ }
+ }
+ }
+ aMenuPane->SetItemDimmed( EMceCmdOutboxSuspend, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdOutboxStart, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdSendVia, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdReply, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsRead, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsUnread, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsReadMsg, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsUnreadMsg, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsReadMsgs, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsUnreadMsgs, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsReadEmails, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsUnreadEmails, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdSort, ETrue );
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::FolderMenuOneItemL
+// ----------------------------------------------------
+void CMceMessageListView::FolderMenuOneItemL( CEikMenuPane* aMenuPane,
+ TBool aRemoteMailboxOpened,
+ TBool aThirdPartEmail )
+ {
+ if ( iMsgListContainer->CurrentItemType() != CMceMessageListContainerBase::EMessageListItemMsvItem )
+ {
+ aMenuPane->SetItemDimmed( EAknCmdOpen, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdMove, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdRenameFolder, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdCopy, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdOutboxMoveToDrafts, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdOutboxSuspend, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdOutboxStart, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdSendVia, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdReply, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdFetch, !aRemoteMailboxOpened );
+ DimReadUnreadOptionsMenu( aMenuPane );
+
+ if ( iMsgListContainer->CurrentItemType() == CMceMessageListContainerBase::EMessageListItemSubtitle )
+ {
+ CMsvEntrySelection* entriesInNode = iMsgListContainer->CurrentItemSelectionL();
+ CleanupStack::PushL( entriesInNode );
+ if ( entriesInNode->Count() > 0 )
+ {
+ switch ( GetDeleteFlagStatusL( entriesInNode ) )
+ {
+ case MessageFolderAllUnDelete:
+ aMenuPane->SetItemDimmed( EMceCmdDelete, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdUndelete, EFalse );
+ break;
+ case MessageFolderAllDelete:
+ case MessageFolderDeleteUnDelete:
+ aMenuPane->SetItemDimmed( EMceCmdUndelete, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdDelete, EFalse );
+ break;
+ default:
+ break;
+ }
+
+ TInt setRead = GetSetRead( *entriesInNode );
+ TMsvId currentFolderId = iFolderId;
+
+ // Set Mark as Read/Unread Options menu
+ if ( ( currentFolderId == KMceDocumentsEntryId ||
+ currentFolderId == KMsvGlobalInBoxIndexEntryId ||
+ iMsgListContainer->FolderEntry().Parent() == KMceDocumentsEntryId ) )
+ {
+ SetReadUnreadOptionsMenu( aMenuPane, !KIsEmail, setRead );
+ }
+ else if( aRemoteMailboxOpened || aThirdPartEmail )
+ {
+ SetReadUnreadOptionsMenu( aMenuPane, KIsEmail, setRead );
+ }
+ }
+ CleanupStack::PopAndDestroy( entriesInNode );
+ }
+ else
+ {
+ aMenuPane->SetItemDimmed( EMceCmdUndelete, !aRemoteMailboxOpened );
+ }
+
+ // Disable Mark as read/unread if focus on subtitle
+ if ( iMsgListContainer->CurrentItemType() != CMceMessageListContainerBase::EMessageListItemSubtitle )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsRead, !aRemoteMailboxOpened );
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsUnread, !aRemoteMailboxOpened );
+ }
+ TMsvId currentFolderId = iFolderId;
+ // Drafts does not have sort
+ if ( currentFolderId == KMsvDraftEntryId )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdSort, ETrue );
+ }
+ return;
+ }
+
+ // CurrentItemSelectionL() collects currently focused item if there is no marked one
+ // For marked items, check iMsgListContainer->DisplayOptionsMenuFromSelectionKey()
+ CMsvEntrySelection* selection = iMsgListContainer->CurrentItemSelectionL();
+ CleanupStack::PushL( selection );
+ TMsvEntry currentEntry;
+ TMsvId serviceId;
+ if ( iSession->GetEntry( selection->At(0), serviceId, currentEntry )
+ == KErrNone || iMceUi->GetMsgDeletedStatus())
+ {
+ DimReadUnreadOptionsMenu ( aMenuPane );
+ if ( currentEntry.iType == KUidMsvFolderEntry )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdMove, ETrue );
+
+ if ( MceUtils::IsEntryFixed( currentEntry.Id() ) )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdRenameFolder, ETrue );
+ }
+ if ( aRemoteMailboxOpened )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdFetch, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdUndelete, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdDelete, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdSort, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdCopy, ETrue );
+ }
+ // MMS.Content.Upload
+ aMenuPane->SetItemDimmed( EMceCommandMMSContentUpload, ETrue );
+ } // end folder
+ else
+ {
+ // not folder so delete "Rename"
+ aMenuPane->SetItemDimmed( EMceCmdRenameFolder, ETrue );
+
+ // MMS.Content.Upload
+ if ( currentEntry.iMtm.iUid != KSenduiMtmMmsUidValue )
+ {
+ aMenuPane->SetItemDimmed( EMceCommandMMSContentUpload, ETrue );
+ }
+ }
+
+ if ( IsSyncMl() )
+ {
+ if ( iMceUi->CheckCommandAvailableL( EMceCmdUndelete, currentEntry ) )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdUndelete, ETrue );
+ }
+ else
+ {
+ aMenuPane->SetItemDimmed( EMceCmdDelete, ETrue );
+ }
+
+ // Sync: remove New Message, Open, Reply and Sort from menu if item marked
+ if ( iMsgListContainer->DisplayOptionsMenuFromSelectionKey() )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdReply, ETrue );
+ aMenuPane->SetItemDimmed( EAknCmdOpen, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdSort, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdNewMessage, ETrue );
+ }
+ else
+ {
+ if ( SyncMlOutboxInbox( KMsvGlobalInBoxIndexEntryId ) )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdReply,
+ iMceUi->CheckCommandAvailableL( EMceCmdReply, currentEntry ) );
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsRead, !currentEntry.Unread() );
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsUnread, currentEntry.Unread() );
+ }
+ }
+
+ CleanupStack::PopAndDestroy( selection );
+ return;
+ }
+
+ TMsvId currentFolderId = iFolderId;
+
+ // Forward is enabled in sent item folder.
+ if ( currentFolderId == KMsvSentEntryId )
+ {
+ SetForwardMenuL( aMenuPane, currentEntry );
+ }
+
+ //reply is enabled in Inbox,Remote mailbox and in Document folder
+ if ( currentFolderId == KMsvDraftEntryId ||
+ currentFolderId == KMsvGlobalOutBoxIndexEntryId ||
+ currentFolderId == KMsvSentEntryId ||
+ currentFolderId == KMceTemplatesEntryId )
+ {
+ //reply is disabled in drafts, sent, outbox and templates folder
+ aMenuPane->SetItemDimmed( EMceCmdReply, ETrue );
+
+ if ( currentEntry.iMtm == KUidMsgMMSNotification )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdOutboxMoveToDrafts, ETrue );
+ }
+ else if ( currentEntry.iMtm.iUid==KSenduiMtmImap4UidValue ||
+ currentEntry.iMtm.iUid==KSenduiMtmPop3UidValue ||
+ currentEntry.iMtm.iUid==KSenduiMtmSmtpUidValue )
+ {
+ // No copy or move commands for the mail messages
+ aMenuPane->SetItemDimmed( EMceCmdMove, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdCopy, ETrue );
+ }
+ }
+ else
+ {
+ if ( iMsgListContainer->IsItemFolder( currentEntry.Id() )
+ || iMceUi->IsMailSetToBeDeletedFromServerL( currentEntry.Id() )
+ || iMsgListContainer->MarkedItemsCount() > 0 )
+ {
+ // Reply is disabled for folder or
+ // when mailbox is not connected and the message is set to be deleted from the server
+ aMenuPane->SetItemDimmed( EMceCmdReply, ETrue );
+ }
+ else
+ {
+ aMenuPane->SetItemDimmed( EMceCmdReply,
+ iMceUi->CheckCommandAvailableL( EMceCmdReply, currentEntry ) );
+ }
+ }
+
+ if ( currentFolderId != KMsvGlobalOutBoxIndexEntryId )
+ {
+ TBool selectionKeyPressed = iMsgListContainer->DisplayOptionsMenuFromSelectionKey();
+
+ if ( iMceUi->IsMailSetToBeDeletedFromServerL( currentEntry.Id() ) )
+ {
+ // Open, Fetch and Delete is disabled
+ // when mailbox is not connected and the message is set to be deleted from the server
+ aMenuPane->SetItemDimmed( EAknCmdOpen, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdFetch, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdDelete, ETrue );
+ }
+ else
+ {
+ aMenuPane->SetItemDimmed( EAknCmdOpen, selectionKeyPressed );
+ }
+
+ if ( ( currentFolderId == KMsvGlobalInBoxIndexEntryId ) &&
+ ( currentEntry.iMtm == KUidMsgMMSNotification ) )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdMove, ETrue );
+ //check also open
+ CBaseMtmUiData* uiData = iMceUi->GetMtmUiDataL( KUidMsgMMSNotification );
+ aMenuPane->SetItemDimmed( EAknCmdOpen,
+ uiData->OperationSupportedL( KMtmUiFunctionOpenMessage, currentEntry ) );
+ aMenuPane->SetItemDimmed( EMceCmdDelete,
+ uiData->OperationSupportedL( KMtmUiFunctionDeleteMessage, currentEntry ) );
+ }
+
+ aMenuPane->SetItemDimmed( EMceCmdOutboxSuspend, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdOutboxStart, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdOutboxMoveToDrafts, ETrue );
+ if ( currentEntry.iMtm != KSenduiMtmIrUid &&
+ currentEntry.iMtm != KSenduiMtmBtUid )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdSendVia, ETrue );
+ }
+ else
+ {
+ if ( selectionKeyPressed )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdSendVia, ETrue );
+ }
+ else
+ {
+ TRAPD( error, HandleSendViaMenuItemL( currentEntry.Id(), aMenuPane ) );
+ if ( error != KErrNone )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdSendVia, ETrue );
+ }
+ }
+ }
+ }
+ else
+ {
+ // Outbox, MMS.Content.Upload
+ if ( currentEntry.iBioType == KUidMsgSubTypeMmsUpload.iUid )
+ {
+ aMenuPane->SetItemDimmed( EMceCommandMMSContentUpload, ETrue );
+ }
+
+ // outbox does not have open
+ aMenuPane->SetItemDimmed( EAknCmdOpen, ETrue );
+ TBool deleteStart = EFalse;
+ TBool deleteSuspend = EFalse;
+ switch ( currentEntry.SendingState() )
+ {
+ case KMsvSendStateResend:
+ if ( currentEntry.iMtm == KUidMsgMMSNotification )
+ {
+ deleteStart = ETrue;
+ deleteSuspend = ETrue;
+ }
+ //go through
+ case KMsvSendStateScheduled:
+ break;
+
+ case KMsvSendStateWaiting:
+ {
+ if ( currentEntry.iMtm == KSenduiMtmSmsUid ||
+ currentEntry.iMtm == KSenduiMtmMmsUid )
+ {
+ // disable 'Start' option to waiting SMS and
+ // waiting MMS
+ aMenuPane->SetItemDimmed( EMceCmdOutboxStart, ETrue );
+ }
+
+ if ( currentEntry.iMtm == KUidMsgMMSNotification )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdOutboxSuspend, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdOutboxStart, ETrue );
+ }
+ break;
+ }
+
+ case KMsvSendStateFailed:
+ if ( currentEntry.iMtm == KUidMsgMMSNotification )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdOutboxStart, ETrue );
+ }
+ //go through
+ case KMsvSendStateSuspended:
+ if ( currentEntry.iMtm == KUidMsgMMSNotification )
+ {
+ deleteStart = ETrue;
+ }
+ //go through
+ case KMsvSendStateUponRequest:
+ deleteSuspend = ETrue;
+ break;
+
+ case KMsvSendStateSending:
+ aMenuPane->SetItemDimmed( EMceCmdDelete, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdOutboxMoveToDrafts, ETrue );
+ // go through
+ case KMsvSendStateSent:
+ deleteStart = ETrue;
+ break;
+ case KMsvSendStateUnknown:
+ case KMsvSendStateNotApplicable:
+ default:
+ deleteSuspend = ETrue;
+ deleteStart = ETrue;
+ break;
+ }
+
+ if ( currentEntry.Connected() ||
+ deleteStart )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdOutboxStart, ETrue );
+ if ( currentEntry.iMtm == KSenduiMtmSmsUid ||
+ currentEntry.iMtm == KSenduiMtmMmsUid ||
+ currentEntry.iMtm == KSenduiMtmIrUid||
+ currentEntry.iMtm == KSenduiMtmBtUid||
+ currentEntry.iMtm == KUidMsgMMSNotification )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdOutboxSuspend, ETrue );
+
+ //if message has no status, do not disable 'move to drafts'
+ if ( currentEntry.SendingState() != KMsvSendStateUnknown)
+ {
+ aMenuPane->SetItemDimmed( EMceCmdOutboxMoveToDrafts, ETrue );
+ }
+
+ if ( ( currentEntry.SendingState() != KMsvSendStateSent ) &&
+ ( ( currentEntry.iMtm == KSenduiMtmSmsUid ) ||
+ ( currentEntry.iMtm == KSenduiMtmMmsUid ) ) )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdDelete, ETrue );
+ }
+ }
+ }
+ if ( deleteSuspend )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdOutboxSuspend, ETrue );
+ }
+ aMenuPane->SetItemDimmed( EMceCmdSendVia, ETrue );
+ if ( iMsgListContainer->Count() > 1 )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdSort, iHideExitCommand );
+ }
+ else
+ {
+ aMenuPane->SetItemDimmed( EMceCmdSort, ETrue );
+ }
+ } // end outbox handling
+
+ // Drafts and Outbox does not have move
+ if ( currentFolderId == KMsvDraftEntryId ||
+ currentFolderId == KMsvGlobalOutBoxIndexEntryId ||
+ aRemoteMailboxOpened )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdMove, ETrue );
+ }
+ // Drafts does not have sort
+ if ( currentFolderId == KMsvDraftEntryId )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdSort, ETrue );
+ }
+ if ( !aRemoteMailboxOpened )
+ {
+ if ( iMsgListContainer->FolderEntry().iServiceId == KMsvLocalServiceIndexEntryId )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdCopy, ETrue );
+ }
+ else
+ {
+ aMenuPane->SetItemDimmed( EMceCmdMove, ETrue );
+ }
+ aMenuPane->SetItemDimmed( EMceCmdFetch, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdUndelete, ETrue );
+
+ // enable mark as read/unread in Inbox and Document folder
+ EnableMarkAllReadMsgInInboxAndDocument( currentEntry, currentFolderId, aMenuPane );
+ }
+ if ( aRemoteMailboxOpened || aThirdPartEmail )
+ {
+ if ( iMceUi->CheckCommandAvailableL( EMceCmdUndelete, currentEntry ) )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdUndelete, ETrue );
+ }
+ else
+ {
+ aMenuPane->SetItemDimmed( EMceCmdDelete, ETrue );
+ }
+ if ( aRemoteMailboxOpened || aThirdPartEmail )
+ {
+ if ( currentEntry.iType != KUidMsvFolderEntry &&
+ !iMceUi->IsMailSetToBeDeletedFromServerL( currentEntry.Id() ) )
+ { // MarkAsUnread and MarkAsRead is disabled when the message is set to be deleted from the server
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsRead, !currentEntry.Unread() );
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsUnread, currentEntry.Unread() );
+ }
+ }
+ }
+
+ if ( currentEntry.iType == KUidMsvFolderEntry )
+ {
+ if ( MceUtils::IsEntryFixed( currentEntry.Id() ) )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdDelete, ETrue );
+ }
+ } // end folder
+ iMceUi->SetMsgDeletedStatus(EFalse);
+ } // end if ( iSession->GetEntry == KErrNone )
+ CleanupStack::PopAndDestroy( selection ); // selection
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::FolderMenuManyItemsL
+// ----------------------------------------------------
+void CMceMessageListView::FolderMenuManyItemsL(
+ CEikMenuPane* aMenuPane,
+ TBool aRemoteMailboxOpened,
+ TBool aThirdPartEmail,
+ TBool aSetRead )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdRenameFolder, ETrue );
+ aMenuPane->SetItemDimmed( EAknCmdOpen, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdOutboxSuspend, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdOutboxStart, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdReply, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdSendVia, ETrue );
+ DimReadUnreadOptionsMenu( aMenuPane );
+
+ if ( IsSyncMl() )
+ {
+ if( SyncMlOutboxInbox ( KMsvGlobalInBoxIndexEntryId ) )
+ {
+ SetReadUnreadOptionsMenu( aMenuPane, KIsEmail, aSetRead );
+ }
+
+ aMenuPane->SetItemDimmed( EMceCmdNewMessage, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdSort, ETrue );
+ if ( iHideExitCommand )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsReadEmails, iHideExitCommand );
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsUnreadEmails, iHideExitCommand );
+ }
+ // SyncML Sent
+ if ( SyncMlOutboxInbox( KMsvSentEntryId ) || SyncMlOutboxInbox( KMsvDraftEntryId ) )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdNewMessage, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdSort, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdUndelete, ETrue );
+ }
+ return;
+ }
+
+ TMsvId serviceId;
+ CMsvEntrySelection* selection = iMsgListContainer->CurrentItemSelectionL();
+ CleanupStack::PushL( selection );
+ TMsvEntry currentEntry;
+
+ TMsvId currentFolderId = iFolderId;
+
+ if ( currentFolderId != KMsvGlobalOutBoxIndexEntryId )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdOutboxMoveToDrafts, ETrue );
+ }
+
+ if ( currentFolderId == KMsvGlobalOutBoxIndexEntryId )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdMove, ETrue );
+ }
+ if ( currentFolderId == KMsvSentEntryId )
+ {
+ TInt selectionCount = selection->Count();
+ TBool mailMessage = EFalse;
+ TBool otherMessage = EFalse;
+
+ aMenuPane->SetItemDimmed( EMceCmdSort, EFalse );
+
+ // Check type of message
+ for ( TInt loop = 0; loop < selectionCount; loop++ )
+ {
+ if ( iSession->GetEntry( selection->At(loop), serviceId, currentEntry )
+ == KErrNone || iMceUi->GetMsgDeletedStatus())
+ {
+ if ( currentEntry.iMtm.iUid==KSenduiMtmImap4UidValue ||
+ currentEntry.iMtm.iUid==KSenduiMtmPop3UidValue ||
+ currentEntry.iMtm.iUid==KSenduiMtmSmtpUidValue )
+ {
+ mailMessage = ETrue;
+ }
+ else
+ {
+ otherMessage = ETrue;
+ }
+ iMceUi->SetMsgDeletedStatus(EFalse);
+ }
+ }
+ if ( otherMessage && mailMessage )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdMove, EFalse );
+ }
+ else if ( mailMessage && !otherMessage ) // Only mailmessages
+ {
+ aMenuPane->SetItemDimmed( EMceCmdMove, ETrue );
+ }
+ else // Only other messages
+ {
+ aMenuPane->SetItemDimmed( EMceCmdMove, EFalse );
+ }
+ }
+ // Drafts does not have move and sort
+ if ( currentFolderId == KMsvDraftEntryId)
+ {
+ aMenuPane->SetItemDimmed( EMceCmdMove, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdSort, ETrue );
+ }
+
+ if (aRemoteMailboxOpened )
+ {
+ // Incase of mailbox, sort should be enabled for all defined folder inside (e.g. inbox. outbox, draft, sent etc)
+ aMenuPane->SetItemDimmed( EMceCmdSort, iHideExitCommand );
+ }
+
+ if ( !aRemoteMailboxOpened )
+ {
+ if ( iMsgListContainer->FolderEntry().iServiceId == KMsvLocalServiceIndexEntryId )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdCopy, ETrue );
+ }
+ else
+ {
+ aMenuPane->SetItemDimmed( EMceCmdMove, ETrue );
+ }
+ aMenuPane->SetItemDimmed( EMceCmdFetch, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdUndelete, ETrue );
+ }
+
+ if ( iMsgListContainer->CurrentItemType() !=
+ CMceMessageListContainerBase::EMessageListItemSubtitle
+ || selection->Count()>0 )
+ {
+ // Set Mark as Read/Unread Options menu
+ if ( ( currentFolderId == KMceDocumentsEntryId ||
+ currentFolderId == KMsvGlobalInBoxIndexEntryId ||
+ iMsgListContainer->FolderEntry().Parent() == KMceDocumentsEntryId ) )
+ {
+ SetReadUnreadOptionsMenu( aMenuPane, !KIsEmail, aSetRead );
+ }
+ else if( aRemoteMailboxOpened || aThirdPartEmail )
+ {
+ SetReadUnreadOptionsMenu( aMenuPane, KIsEmail, aSetRead );
+ }
+ }
+
+ CleanupStack::PopAndDestroy( selection );
+ }
+
+
+// ----------------------------------------------------
+// CMceMessageListView::FolderMenuSyncMLMain
+// ----------------------------------------------------
+void CMceMessageListView::FolderMenuSyncMLMain( CEikMenuPane *aMenuPane )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdSendVia, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdConnect, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdCloseConnection, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdReply, ETrue );
+ aMenuPane->SetItemDimmed( EMceCommandMMSContentUpload, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdOutboxSuspend, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdFetch, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdDelete, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdUndelete, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsRead, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsUnread, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdSort, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdMove, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdOutboxStart, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdOutboxMoveToDrafts, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdNewFolder, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdRenameFolder, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdCopy, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdEditList, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdMailboxSettings, ETrue );
+ // + MessageDetails
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::FolderMenuSyncMLFolderL
+// ----------------------------------------------------
+void CMceMessageListView::FolderMenuSyncMLFolderL( CEikMenuPane *aMenuPane )
+ {
+ CMsvEntrySelection* selection = iMsgListContainer->CurrentItemSelectionL();
+ CleanupStack::PushL( selection );
+ TMsvEntry currentEntry;
+ TMsvId serviceId;
+
+ // All SyncML folders: Inbox, Sent items, Drafts, Outbox
+ aMenuPane->SetItemDimmed( EMceCmdAiwPlaceholder, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdSendVia, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdConnect, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdCloseConnection, ETrue );
+ aMenuPane->SetItemDimmed( EMceCommandMMSContentUpload, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdOutboxSuspend, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdMove, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdOutboxStart, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdNewFolder, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdRenameFolder, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdMailboxSettings, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdFetch, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdCopy, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsRead, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsUnread, ETrue );
+
+ TInt numberOfEntries = iMsgListContainer->Count();
+
+ // All except SyncML Outbox
+ if ( SyncMlOutboxInbox( KMsvGlobalInBoxIndexEntryId ) )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdOutboxMoveToDrafts, ETrue );
+ if ( numberOfEntries > 0 &&
+ iSession->GetEntry( selection->At(0), serviceId, currentEntry ) == KErrNone &&
+ selection->Count() == 1 )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsRead, !currentEntry.Unread() );
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsUnread, currentEntry.Unread() );
+ }
+ }
+
+ // SyncML Drafts
+ if ( SyncMlOutboxInbox( KMsvDraftEntryId ) )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdReply, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdOutboxMoveToDrafts, ETrue );
+ }
+
+ // SyncML Sent
+ if ( SyncMlOutboxInbox( KMsvSentEntryId ) )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdOutboxMoveToDrafts, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdReply, ETrue );
+ }
+
+ // SyncML Outbox
+ if ( SyncMlOutboxInbox( KMsvGlobalOutBoxIndexEntryIdValue ) )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdEditList, ETrue );
+ aMenuPane->SetItemDimmed( EAknCmdOpen, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdFetch, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsRead, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsUnread, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdSort, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdCopy, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdReply, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdNewMessage, iHideExitCommand );
+ }
+ if ( numberOfEntries == 0 )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdNewMessage, EFalse );
+ }
+ CleanupStack::PopAndDestroy( selection );
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::EditMenuL
+// ----------------------------------------------------
+void CMceMessageListView::EditMenuL( CEikMenuPane* aMenuPane ) const
+ {
+ // This function is not called if empty folder because in that case
+ // EditMenu is hidden
+ aMenuPane->SetItemDimmed( EAknCmdMarkReadMsgs, ETrue );
+
+ TInt count = iMsgListContainer->SelectionCount();
+
+ if ( count == 0 )
+ {
+ //if no selection, disable unmarkall
+ aMenuPane->SetItemDimmed( EAknUnmarkAll, ETrue );
+ TBool remoteMailboxOpened = ( iMsgListContainer->FolderEntry().iMtm == KSenduiMtmImap4Uid ||
+ iMsgListContainer->FolderEntry().iMtm == KSenduiMtmPop3Uid );
+ if ( remoteMailboxOpened || // Mailbox
+ IsSyncMl() || //SyncMailbox
+ iMsgListContainer->FolderEntry().Id() == KMsvGlobalInBoxIndexEntryId || //Inbox
+ iMsgListContainer->FolderEntry().Id() == KMceDocumentsEntryId || //Document
+ iMsgListContainer->FolderEntry().Parent() == KMceDocumentsEntryId ) //Subfolder of Document
+ {
+ aMenuPane->SetItemDimmed( EAknCmdMarkReadMsgs, EFalse );
+ }
+ }
+
+ if ( ( count + SubfolderCount() ) == iMsgListContainer->Count() )
+ {
+ //if all selected, disable markall
+ aMenuPane->SetItemDimmed( EAknMarkAll, ETrue );
+ }
+
+ if ( iMsgListContainer->IsItemFolder( iMsgListContainer->CurrentItemId() ) )
+ {
+ aMenuPane->SetItemDimmed( EAknCmdMark, ETrue );
+ aMenuPane->SetItemDimmed( EAknCmdUnmark, ETrue );
+ }
+ else
+ {
+ if (iMsgListContainer->IsItemSelected( iMsgListContainer->CurrentItemId() ) )
+ {
+ aMenuPane->SetItemDimmed( EAknCmdMark, ETrue );
+ }
+ else
+ {
+ aMenuPane->SetItemDimmed( EAknCmdUnmark, ETrue );
+ }
+ } // end else
+
+ // Mark All and Unmark All are always visible
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::FolderOpenedL
+// ----------------------------------------------------
+TBool CMceMessageListView::FolderOpenedL()
+ {
+ // return EFalse if cd.. returns to main view, ETrue if returns to Parent in folder view.
+
+ TBool folderOpened = ETrue;
+
+ const TMsvEntry& entry = iMsgListContainer->FolderEntry();
+ const TMsvId entryId = entry.Id();
+
+ if ( entry.Parent() == KMsvRootIndexEntryId ||
+ ( entry.iMtm == KSenduiMtmImap4Uid && !IsImapFolderOpenL( ) ) ||
+ entryId == KMsvGlobalInBoxIndexEntryId ||
+ entryId == KMsvGlobalOutBoxIndexEntryId ||
+ entryId == KMsvDraftEntryId ||
+ entryId == KMsvSentEntryId ||
+ entryId == KMceDocumentsEntryId )
+ {
+ folderOpened = EFalse;
+ }
+
+ return folderOpened;
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::SubfolderCount
+// ----------------------------------------------------
+TInt CMceMessageListView::SubfolderCount() const
+ {
+ return iMsgListContainer->FolderCount();
+ }
+
+
+// ----------------------------------------------------
+// CMceMessageListView::CancelMailboxTimer
+// ----------------------------------------------------
+void CMceMessageListView::CancelMailboxTimer() const
+ {
+ iMceUi->CancelMailboxTimer();
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::IsFolderNameUsedL
+// ----------------------------------------------------
+TBool CMceMessageListView::IsFolderNameUsedL(const TDesC& aName, TMsvId aId /* = KErrNotFound */) const
+//
+// Return ETrue if a service of name 'aName' already exists.
+//
+ {
+ CMsvEntry* entry = CMsvEntry::NewL(
+ *iSession,
+ iMsgListContainer->CurrentFolderId(),
+ TMsvSelectionOrdering(
+ KMsvGroupByStandardFolders, EMsvSortByDateReverse) );
+ CleanupStack::PushL( entry );
+ TBool ret = EFalse;
+ const TInt total = entry->Count();
+ for(TInt cc = 0; cc < total; ++cc)
+ {
+ const TMsvEntry& tEntry = (*entry)[cc];
+ if( tEntry.iType == KUidMsvFolderEntry &&
+ tEntry.Id() != aId )
+ {
+ // This entry is a service, so ensure the passed name isn't used
+ if(!aName.CompareF(tEntry.iDetails))
+ {
+ ret = ETrue;
+ break;
+ }
+ }
+ }
+ CleanupStack::PopAndDestroy( entry );
+ return ret;
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::FindUnreadMessageAndOpenItL
+// ----------------------------------------------------
+TBool CMceMessageListView::FindUnreadMessageAndOpenItL( const TMsvId aId )
+ {
+// TODO: how to simplify this ?
+ TMsvId firstUnreadMessageId = KErrNotFound;
+ TBool oneUnreadMessage = EFalse;
+ if ( aId )
+ {
+ //
+ oneUnreadMessage = ETrue;
+ firstUnreadMessageId = aId;
+ }
+ else
+ {
+ oneUnreadMessage = iMsgListContainer->FindFirstUnreadMessageL( firstUnreadMessageId );
+ }
+
+ if ( firstUnreadMessageId > KErrNotFound )
+ {
+ iMsgListContainer->SetCurrentItemIdL(
+ firstUnreadMessageId );
+ }
+
+ if ( !iRunningEditFunction )
+ {
+ iMceUi->CloseEditorApp();
+ }
+
+ TMsvEntry firstEntry;
+ TMsvId serviceId;
+ if ( oneUnreadMessage && firstUnreadMessageId > KErrNotFound &&
+ iSession->GetEntry( firstUnreadMessageId, serviceId, firstEntry ) == KErrNone )
+ {
+ TUid messageMtm = firstEntry.iMtm;
+
+ if ( (messageMtm!=KSenduiMtmIrUidValue) &&
+ (messageMtm!=KSenduiMtmBtUidValue) &&
+ (messageMtm!=KSenduiMtmSmtpUidValue) &&
+ (messageMtm!=KSenduiMtmImap4UidValue) &&
+ (messageMtm!=KSenduiMtmPop3UidValue)
+ )
+ {
+
+ if ( !iMessageViewerLauncher )
+ {
+ iMessageViewerLauncher = CPeriodic::NewL( CActive::EPriorityIdle );
+ }
+
+ if ( !(iMessageViewerLauncher->IsActive()) )
+ {
+ delete iLocalScreenClearer;
+ iLocalScreenClearer = NULL;
+ iLocalScreenClearer = CAknLocalScreenClearer::NewL( EFalse );
+ MCELOGGER_WRITE("FindUnreadMessageAndOpenItL: start viewer launcher");
+ const TTimeIntervalMicroSeconds32 startTimeInterval = KMceLaunchViewerStartTime;
+ const TTimeIntervalMicroSeconds32 retryTimeInterval = KMceLaunchViewerRetryTime;
+ iLaunchViewerCounter = 0;
+ iMessageViewerLauncher->Start(
+ startTimeInterval,
+ retryTimeInterval,
+ TCallBack(LaunchViewer, this ) );
+ }
+ }
+ return ETrue;
+ }
+ return EFalse;
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::FindInboxAndOpenItL
+// ----------------------------------------------------
+void CMceMessageListView::FindInboxAndOpenItL()
+ {
+ //imapfolders
+ //first count subscribed folders. If only one ( inbox ) open it
+ //otherwise show folderlist.
+ TMsvId inboxId = KErrNotFound;
+ TMsvEntry child;
+ TInt cnt = 0;
+ CMsvEntry* entry = CMsvEntry::NewL(
+ *iSession,
+ iMsgListContainer->CurrentFolderId(),
+ TMsvSelectionOrdering(
+ KMsvGroupByStandardFolders, EMsvSortByDateReverse) );
+ CleanupStack::PushL( entry );
+
+ const TInt count = entry->Count();
+
+ for ( TInt loop = 0; loop < count; loop++ )
+ {
+ child = (*entry)[loop];
+ if( child.iType == KUidMsvFolderEntry )
+ {
+ cnt++;
+ inboxId = child.Id();
+ }
+ }
+
+ //if only one subscribed, it must be inbox, but check it also to be sure
+ if( cnt == KMceOnlyInboxInImap && child.iDetails.CompareF( iInboxName->Des() ) == 0 )
+ {
+ SetFolderL( inboxId );
+ }
+ CleanupStack::PopAndDestroy( entry );
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::ChangeFolderAndRefreshListboxL
+// ----------------------------------------------------
+void CMceMessageListView::ChangeFolderAndRefreshListboxL( TMsvId aNewFolderId )
+ {
+ MCELOGGER_ENTERFN("CMceMessageListView::ChangeFolderAndRefreshListboxL");
+
+ TInt oldCount = iMsgListContainer->Count(); // how many items in current folder
+ TMsvId oldId = iMsgListContainer->FolderEntry().Id();
+ TMsvEntry currentEntry;
+ TMsvId serviceId; // not used here but needed by GetEntry function
+ if ( iSession->GetEntry( aNewFolderId, serviceId, currentEntry )
+ == KErrNone )
+ {
+ iMsgListContainer->ClearSelection();
+ SetFolderL( aNewFolderId );
+ TUid mtm = iMsgListContainer->FolderEntry().iMtm;
+ if ( mtm == KSenduiMtmImap4Uid )
+ {
+ FindInboxAndOpenItL();
+ }
+
+ // NCN reset, if the mail folder contains unread messages
+ if ( iMceUi->CheckTechnologyTypeFromMtm( KMailTechnologyTypeUid, mtm ) &&
+ HasUnreadMessagesL() )
+ {
+
+ iMceUi->HandleNotif(iMsgListContainer->FolderEntry().iServiceId);
+ }
+
+ if ( ( mtm == KSenduiMtmImap4Uid ||
+ mtm == KSenduiMtmPop3Uid ) && !iConnectionNote )
+ {
+ iMceUi->ActivateConnectionQueryTimerL( iFolderId );
+ }
+
+ SetEmptyTextL();
+
+ if ( IsImapFolderOpenL( ) )
+ {
+ //show folder tabs
+ TInt depth = 1;
+ const TMsvEntry child = iMsgListContainer->FolderEntry();
+ TMsvId id = child.Parent();
+ TMsvId service = KMsvLocalServiceIndexEntryId;
+ TMsvEntry entry;
+ TInt err = iSession->GetEntry( id, service, entry );
+
+ while ( err == KErrNone && entry.iType == KUidMsvFolderEntry)
+ {
+ err = iSession->GetEntry( entry.Parent(), service, entry );
+ depth++;
+ }
+ iMceUi->ShowFolderTabsL( depth );
+ }
+ }
+
+ const TMsvEntry entry = iMsgListContainer->FolderEntry();
+ // Fetch pointer to the default title pane control
+ CAknTitlePane* title=iMceUi->TitlePaneL();
+ TMsvEntry serviceEntry;
+ if ( ( entry.iMtm == KSenduiMtmImap4Uid || IsSyncMl() ) &&
+ iSession->GetEntry( entry.iServiceId, serviceId, serviceEntry)
+ == KErrNone )
+ {
+ title->SetTextL( serviceEntry.iDetails );
+ }
+ else
+ {
+ title->SetTextL( entry.iDetails );
+ }
+
+ TInt sorting = EMceCmdSortByDate;
+ TBool ordering = EFalse;
+ TMsvId id = iFolderId;
+ for( TInt loop = 0; loop < iFolderItemArray->Count() ; loop++ )
+ {
+ TMceFolderItem item = ((*iFolderItemArray)[loop]);
+ if ( item.iFolderId == id )
+ {
+ sorting = item.iSortOrder;
+ ordering = item.iOrdering;
+ }
+ }
+
+ // MSK
+ SetMSKButtonL();
+
+ iSortOrder = sorting;
+ iOrdering = ordering;
+
+ // Unset flag so one row list container knows that first subtitle is to be opened
+ iMsgListContainer->SetContainerFlag( EMceOneRowFlagFirstSubtitleOpen, EFalse );
+
+ iMsgListContainer->SetSortTypeL( iSortOrder, iOrdering );
+
+ if ( !iMsgListContainer->SetCurrentItemIdL( oldId ) )
+ {
+ iMsgListContainer->ResetCurrentItemL( );
+ }
+
+ iMsgListContainer->RefreshSelectionIndexesL( EFalse );
+ iMsgListContainer->RefreshListbox();
+
+ MCELOGGER_LEAVEFN("CMceMessageListView::ChangeFolderAndRefreshListboxL");
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::SetHideExitCommand
+// ----------------------------------------------------
+void CMceMessageListView::SetHideExitCommand( TBool aHideExitCommand )
+ {
+ iHideExitCommand = aHideExitCommand;
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::SetEmptyTextL
+// now we need to set correct empty string because in remote mailbox it is
+// different than in other folders
+// ----------------------------------------------------
+void CMceMessageListView::SetEmptyTextL() const
+ {
+ TBool folderIsRemote = iMsgListContainer->IsItemRemote( iMsgListContainer->CurrentFolderId() );
+ if ( folderIsRemote && !IsSyncMl() )
+ {
+ iMsgListContainer->SetListEmptyTextL( *iRemoteMailboxEmptyText );
+ }
+ else
+ {
+ iMsgListContainer->SetListEmptyTextL( *iEmptyText);
+ }
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::LaunchViewer
+// ----------------------------------------------------
+TInt CMceMessageListView::LaunchViewer( TAny* aSelf )
+ {
+ return REINTERPRET_CAST(CMceMessageListView*,aSelf)->LaunchMceViewer();
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::LaunchMceViewer
+// ----------------------------------------------------
+TInt CMceMessageListView::LaunchMceViewer()
+ {
+ if ( iMceUi->IsEditorOpen() )
+ // something is embedded in mce, wait for that to be closed
+ {
+ if ( iRunningEditFunction )
+ {
+ return KErrNone;
+ }
+ iMceUi->CloseEditorApp();
+ if ( iLaunchViewerCounter++ < KMceLaunchViewerRetryCounter )
+ {
+ MCELOGGER_WRITE_FORMAT("LaunchMceViewer: wait editor to close...iLaunchViewerCounter = %d", iLaunchViewerCounter);
+ return KErrNotReady;
+ }
+ else
+ {
+ MCELOGGER_WRITE("LaunchMceViewer: editor did not close quickly enough, give up waiting...");
+ delete iLocalScreenClearer;
+ iLocalScreenClearer = NULL;
+ delete iMessageViewerLauncher;
+ iMessageViewerLauncher = NULL;
+ return KErrNone;
+ }
+ }
+
+ if ( iMceUi->IsEditorOpen() )
+ {
+ MCELOGGER_WRITE("LaunchMceViewer: do not open because already editing one");
+ delete iLocalScreenClearer;
+ iLocalScreenClearer = NULL;
+ delete iMessageViewerLauncher;
+ iMessageViewerLauncher = NULL;
+ return KErrNone;
+ }
+
+ TMsvId firstUnreadMessageId = KErrNotFound;
+ TBool oneUnreadMessage = EFalse;
+ TRAPD( error, oneUnreadMessage = iMsgListContainer->FindFirstUnreadMessageL( firstUnreadMessageId ));
+ if ( error )
+ {
+ oneUnreadMessage = EFalse;
+ }
+ TMsvEntry firstEntry;
+ TMsvId serviceId;
+
+ if ( oneUnreadMessage && firstUnreadMessageId > KErrNotFound &&
+ iSession->GetEntry( firstUnreadMessageId, serviceId, firstEntry ) == KErrNone )
+ {
+ TUid messageMtm = firstEntry.iMtm;
+
+ if ( (messageMtm!=KSenduiMtmIrUidValue) &&
+ (messageMtm!=KSenduiMtmBtUidValue) &&
+ (messageMtm!=KSenduiMtmSmtpUidValue) &&
+ (messageMtm!=KSenduiMtmImap4UidValue) &&
+ (messageMtm!=KSenduiMtmPop3UidValue)
+ )
+ {
+ MCELOGGER_WRITE("LaunchMceViewer: launch editor");
+ iRunningEditFunction = ETrue;
+ TRAP_IGNORE( iMceUi->EditMTMEntryL( firstEntry ) );
+ iRunningEditFunction = EFalse;
+ }
+ }
+ delete iLocalScreenClearer;
+ iLocalScreenClearer = NULL;
+ delete iMessageViewerLauncher;
+ iMessageViewerLauncher = NULL;
+ MCELOGGER_WRITE("LaunchMceViewer: done");
+ return KErrNone;
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::HandleSendViaMenuItemL
+//
+// ----------------------------------------------------
+void CMceMessageListView::HandleSendViaMenuItemL( TMsvId aEntryId, CEikMenuPane* aMenuPane ) const
+ {
+ TBool dimSendVia = ETrue;
+ TFileName fileName;
+ RApaLsSession apaLs;
+ TBool isProgram = EFalse;
+ TUid appUid(KNullUid);
+
+ MCELOGGER_WRITE_FORMAT("CMceMessageListView::HandleSendViaMenuItemL: aEntryId: 0x%x", aEntryId );
+ TInt fileSize;
+ RFile fileHandle;
+ MceUtils::GetIrFilePathL( *iSession, aEntryId, fileName, fileHandle, fileSize );
+ CleanupClosePushL( fileHandle );
+
+ TBuf<KMaxDataTypeLength> mimeType;
+ mimeType.Zero();
+ if (apaLs.Connect() == KErrNone)
+ {
+ TDataType datatype;
+ apaLs.SetAcceptedConfidence( CApaDataRecognizerType::ECertain );
+ apaLs.AppForDocument( fileName, appUid, datatype );
+ apaLs.IsProgram( fileName, isProgram );
+ mimeType = datatype.Des();
+ apaLs.Close();
+ }
+
+#ifdef _DEBUG
+ // make sure buffer does not get too long for logging.
+ TBuf<KMcePrintableTextLength> debugMimeType = mimeType.Left( KMcePrintableTextLength );
+ MCELOGGER_WRITE_FORMAT("mime type: \"%s\"", debugMimeType.PtrZ());
+#endif
+ if (appUid.iUid == 0 || isProgram)
+ {
+ MCELOGGER_WRITE( "application not found" );
+ dimSendVia = EFalse;
+ }
+#ifdef _DEBUG
+ else
+ {
+ MCELOGGER_WRITE_FORMAT("application found: uid 0x%x", appUid.iUid );
+ MCELOGGER_WRITE_FORMAT("is program: %d", isProgram );
+ }
+#endif
+
+ CCommonContentPolicy* contentPolicy = CCommonContentPolicy::NewLC();
+ TBool banned = ( contentPolicy->IsClosedFileL( fileHandle ) );
+ if ( banned )
+ {
+ dimSendVia = banned;
+ }
+ CleanupStack::PopAndDestroy(2); // contentPolicy, fileHandle
+
+ MCELOGGER_WRITE_FORMAT("dim EMceCmdSendVia menu: %d", dimSendVia );
+ aMenuPane->SetItemDimmed( EMceCmdSendVia, dimSendVia );
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::MessageViewHandleEntriesCreatedOrChangedL
+//
+// ----------------------------------------------------
+void CMceMessageListView::MessageViewHandleEntriesCreatedOrChangedL(
+ TMsvId aParentId,
+ CMsvEntrySelection* aSelection )
+ {
+ if ( !iMsgListContainer )
+ {
+ return;
+ }
+ TMsvEntry entry = iMsgListContainer->FolderEntry();
+ MCELOGGER_WRITE_FORMAT("parentId 0x%x", aParentId );
+ MCELOGGER_WRITE_FORMAT("currentId 0x%x", entry.Id() );
+ if ( aParentId != entry.Id() )
+ {
+ MCELOGGER_WRITE("Not happening in our folder, just skip");
+ return;
+ }
+ if ( entry.Parent() == KMsvRootIndexEntryId &&
+ entry.iMtm == KSenduiMtmImap4Uid &&
+ entry.iType == KUidMsvServiceEntry &&
+ iMsgListContainer->Count() )
+ {
+ FindInboxAndOpenItL();
+ if ( iMsgListContainer )
+ {
+ iMsgListContainer->SetFolderL( iMsgListContainer->FolderEntry().Id() );
+ }
+ }
+
+ if ( aSelection->Count() && iMsgListContainer )
+ {
+ iMsgListContainer->RefreshSelectionIndexesL( EFalse );
+ iMsgListContainer->RefreshListbox();
+ }
+
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::FindAndSelectEntryL
+// Sets found item in message list
+// ----------------------------------------------------
+void CMceMessageListView::FindAndSelectEntryL( const TDesC& aMatchString ) const
+ {
+ TMsvId foundEntry = iMsgListContainer->FindEntry( aMatchString );
+ if ( foundEntry > KErrNotFound )
+ {
+ iMsgListContainer->SetCurrentItemIdL( foundEntry );
+ iMsgListContainer->RefreshListbox();
+ }
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::HandleSortCommandL
+//
+// ----------------------------------------------------
+void CMceMessageListView::HandleSortCommandL( const TInt aCommand )
+ {
+ // set sort order in folder array
+ TMsvId id = iFolderId;
+ TBool folderFound = EFalse;
+
+ if ( aCommand == iSortOrder )
+ {
+ // Toggle
+ iOrdering = !iOrdering;
+ }
+ else
+ {
+ iOrdering = EFalse;
+ }
+
+ for( TInt loop = 0; loop < iFolderItemArray->Count() ; loop++ )
+ {
+ TMceFolderItem item = ((*iFolderItemArray)[loop]);
+ if ( item.iFolderId == id/*service*/ )
+ {
+ ((*iFolderItemArray)[loop]).iSortOrder = aCommand;
+ ((*iFolderItemArray)[loop]).iOrdering = iOrdering;
+ folderFound = ETrue;
+ }
+ }
+ // add folder item to folder array
+ if (!folderFound)
+ {
+ TMceFolderItem item;
+ item.iFolderId = id/*service*/;
+ item.iSortOrder = aCommand;
+ item.iOrdering = iOrdering;
+
+ iFolderItemArray->AppendL( item );
+ }
+
+ // Switch the sort ordering if needed
+ iSortOrder = aCommand;
+
+ // Update the selection in the listbox
+ TMsvId currentItemId = iMsgListContainer->CurrentItemId();
+
+ // If no focused item in one row list or focused item is folder
+ // first subtitle is opened
+ if ( currentItemId == KErrNotFound ||
+ iMsgListContainer->IsItemFolder( currentItemId ) )
+ {
+ iMsgListContainer->SetContainerFlag(
+ EMceOneRowFlagFirstSubtitleOpen, EFalse );
+ }
+
+ // Sort the items of the listbox
+ iMsgListContainer->SetSortTypeL( aCommand, iOrdering );
+ iMsgListContainer->RefreshSelectionIndexesL( EFalse );
+
+ // Update the selection in the listbox
+ iMsgListContainer->SetCurrentItemIdL( currentItemId );
+
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::SyncMlOutboxInbox
+//
+// ----------------------------------------------------
+TBool CMceMessageListView::SyncMlOutboxInbox( TMsvId aFolder ) const
+ {
+ TBool syncMl = EFalse;
+ if ( IsSyncMl() )
+ {
+ TMsvId id = iMsgListContainer->FolderEntry().Parent();
+ TMsvEntry parentEntry;
+ TMsvId serviceId;
+ if ( iSession->GetEntry( id, serviceId, parentEntry ) == KErrNone )
+ {
+ if ( aFolder == KMsvGlobalInBoxIndexEntryId )
+ {
+ if ( ( iMsgListContainer->FolderEntry().Id() == parentEntry.iMtmData1 ) ||
+ ( iMsgListContainer->FolderEntry().iRelatedId == KMsvGlobalInBoxIndexEntryId ) )
+ {
+ syncMl = ETrue;
+ }
+ }
+ else if ( aFolder == KMsvGlobalOutBoxIndexEntryId )
+ {
+ if ( ( iMsgListContainer->FolderEntry().Id() == parentEntry.iMtmData2 ) ||
+ ( iMsgListContainer->FolderEntry().iRelatedId == KMsvGlobalOutBoxIndexEntryId ) )
+ {
+ syncMl = ETrue;
+ }
+ }
+ else if ( aFolder == KMsvDraftEntryId )
+ {
+ if ( ( iMsgListContainer->FolderEntry().Id() == parentEntry.iMtmData1 ) ||
+ ( iMsgListContainer->FolderEntry().iRelatedId == KMsvDraftEntryId ) )
+ {
+ syncMl = ETrue;
+ }
+ }
+ else if ( aFolder == KMsvSentEntryId )
+ {
+ if ( ( iMsgListContainer->FolderEntry().Id() == parentEntry.iMtmData1 ) ||
+ ( iMsgListContainer->FolderEntry().iRelatedId == KMsvSentEntryId ) )
+ {
+ syncMl = ETrue;
+ }
+ }
+ }
+ }
+
+ return syncMl;
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::IsSyncMl
+//
+// Checks if the folder is a SyncML folder
+// ----------------------------------------------------
+TBool CMceMessageListView::IsSyncMl() const
+ {
+ return ( iMceUi->IsPresent( KSenduiMtmSyncMLEmailUid ) &&
+ ( iMsgListContainer->FolderEntry().iMtm == KSenduiMtmSyncMLEmailUid ) );
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::SyncMlFindInboxAndOpenItL
+// ----------------------------------------------------
+void CMceMessageListView::SyncMlFindInboxAndOpenItL()
+ {
+ TMsvId inboxId = KErrNotFound;
+ TMsvEntry child;
+ CMsvEntry* entry = CMsvEntry::NewL(
+ *iSession,
+ iMsgListContainer->CurrentFolderId(),
+ TMsvSelectionOrdering(
+ KMsvGroupByStandardFolders, EMsvSortByDateReverse) );
+ CleanupStack::PushL( entry );
+ const TInt count = entry->Count();
+ for (TInt loop = 0; loop < count && inboxId == KErrNotFound; loop++)
+ {
+ child = (*entry)[loop];
+ if ( child.iType == KUidMsvFolderEntry &&
+ child.iRelatedId == KMsvGlobalInBoxIndexEntryId )
+ {
+ inboxId = child.Id();
+ }
+ }
+
+ if ( inboxId != KErrNotFound )
+ {
+ SetFolderL( inboxId );
+ }
+ CleanupStack::PopAndDestroy( entry );
+ }
+// ----------------------------------------------------
+// CMceMessageListView::IsImapFolderOpenL
+// ----------------------------------------------------
+TBool CMceMessageListView::IsImapFolderOpenL( ) const
+ {
+ //imapfolders
+ //we can't have imap folder if mtm isn't imap
+ if( iMsgListContainer->FolderEntry().iMtm != KSenduiMtmImap4Uid )
+ {
+ return EFalse;
+ }
+
+ TMsvEntry child;
+ TInt cnt = 0;
+
+ CMsvEntry *parent = iSession->GetEntryL( iMsgListContainer->FolderEntry().Parent() );
+ CleanupStack::PushL( parent );
+ if( parent->Entry().iType != KUidMsvFolderEntry )
+ {
+ const TInt count = parent->Count();
+
+ for ( TInt loop = 0; loop < count; loop++ )
+ {
+ child = (*parent)[loop];
+ if( child.iType == KUidMsvFolderEntry )
+ {
+ cnt++;
+ //entry = child;
+ }
+ }
+ }
+
+ CleanupStack::PopAndDestroy( parent );
+
+ //if type is folder, then we must have a folder open.
+ if( iMsgListContainer->FolderEntry().iType == KUidMsvFolderEntry && cnt != KMceOnlyInboxInImap )
+ {
+ return ETrue;
+ }
+
+ return EFalse;
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::CheckMMSNotificationOpenL
+// ----------------------------------------------------
+TBool CMceMessageListView::CheckMMSNotificationOpenL( ) const
+ {
+ TBool skip = EFalse;
+ TMsvId currentFolderId = iFolderId;
+ const TInt count = iMsgListContainer->CurrentItemSelectionCount();
+ TMsvId currentId = KErrNotFound;
+ if ( count == 1 )
+ {
+ // one selected
+ currentId = iMsgListContainer->CurrentItemId();
+ }
+
+ if ( ( currentId != KErrNotFound )
+ && ( currentFolderId == KMsvGlobalInBoxIndexEntryId ) )
+ {
+ TMsvEntry currentEntry;
+ TMsvId serviceId;
+
+ if ( iSession->GetEntry( currentId, serviceId, currentEntry )
+ == KErrNone )
+ {
+ if ( ( currentEntry.iType == KUidMsvMessageEntry ) &&
+ ( currentEntry.iMtm == KUidMsgMMSNotification ) )
+ {
+ CBaseMtmUiData* uiData = iMceUi->GetMtmUiDataL( KUidMsgMMSNotification );
+ skip = uiData->OperationSupportedL( KMtmUiFunctionOpenMessage, currentEntry );
+ }
+ }
+ }
+ return skip;
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::OpenMailboxSettingsL()
+//
+// ----------------------------------------------------
+void CMceMessageListView::OpenMailboxSettingsL()
+ {
+ TInt currentIndex = 0;
+ TMsvId currentId = 0;
+ TInt currentCount = iMsgListContainer->Count();
+ if ( currentCount > 0 )
+ {
+ currentId = iMsgListContainer->CurrentItemId();
+ }
+
+ const TMsvEntry& entry = iMsgListContainer->FolderEntry();
+
+ CAknTitlePane* title = iMceUi->TitlePaneL();
+ TMsvEntry tEntry;
+ TMsvId serviceId;
+ User::LeaveIfError( iSession->GetEntry( entry.iServiceId, serviceId, tEntry ) );
+
+
+ iMceUi->EditAccountL( tEntry.iRelatedId );
+ User::LeaveIfError( iSession->GetEntry( serviceId, serviceId, tEntry ) );
+
+ //set title even if inbox was opened directly
+ if ( iMsgListContainer->FolderEntry().Id() == tEntry.Id() ||
+ iMsgListContainer->FolderEntry().Parent() == tEntry.Id() )
+ {
+ title->SetTextL( tEntry.iDetails );
+ }
+
+ if ( iMsgListContainer->FolderEntry().Id() == tEntry.Id() )
+ {
+ TInt newCount = iMsgListContainer->Count();
+
+ if ( newCount > 0 )
+ {
+ if ( currentIndex >= newCount )
+ {
+ currentIndex = newCount - 1;
+ }
+ else
+ {
+ iMsgListContainer->SetCurrentItemIdL( currentId );
+ }
+ }
+ }
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::HandleStatusPaneSizeChange()
+//
+// ----------------------------------------------------
+void CMceMessageListView::HandleStatusPaneSizeChange()
+ {
+ if ( iMsgListContainer )
+ {
+ iMsgListContainer->SetRect( ClientRect() );
+ }
+ CAknView::HandleStatusPaneSizeChange();
+ }
+
+//// ----------------------------------------------------
+// CMceMessageListView::LaunchViewerWhenOneUnreadL( TInt &aMsgMtmUid )
+//
+// ----------------------------------------------------
+TInt CMceMessageListView::LaunchViewerWhenOneUnreadL( TInt &aMsgMtmUid )
+ {
+ if ( iRunningEditFunction || iMsgListContainer || iMceUi->MailboxCreationOn() || iMceUi->IsEditorOpen() )
+ {
+ return KErrNotFound;
+ }
+
+ // TODO: change this so that FindFirstUnreadMessageL is not called so many times!
+ // TODO: this is performance optimisation: we should launch viewer before creating container!!
+ // so container is not created yet, need to calculate unread message count some other way...
+
+ TInt unreadMessageMtmUid = KErrNotFound;
+ TInt numberOfUnreadMessages = 0;
+ TInt firstUnreadMessage = KErrNotFound;
+
+ CMsvEntry* entry = CMsvEntry::NewL(
+ *iSession,
+ iFolderId,
+ TMsvSelectionOrdering(
+ KMsvGroupByStandardFolders, EMsvSortByDateReverse) );
+ CleanupStack::PushL( entry );
+
+ const TInt itemCount = entry->Count();
+ for ( TInt loop = 0; loop < itemCount; loop++ )
+ {
+ if ( (*entry)[loop].iType == KUidMsvMessageEntry &&
+ (*entry)[loop].Unread() )
+ {
+ if ( firstUnreadMessage == KErrNotFound )
+ {
+ firstUnreadMessage = loop;
+ unreadMessageMtmUid = (*entry)[firstUnreadMessage].iMtm.iUid;
+ }
+ numberOfUnreadMessages++;
+ if ( numberOfUnreadMessages > 1 )
+ {
+ // we are only interested of first unread message and info that if
+ // there are more than one unread messages.
+ // So we can stop if there are more than one.
+ break;
+ }
+ }
+ }
+
+ if ( (numberOfUnreadMessages==1) && (firstUnreadMessage!=KErrNotFound) &&
+ (unreadMessageMtmUid!=KSenduiMtmIrUidValue) &&
+ (unreadMessageMtmUid!=KSenduiMtmBtUidValue) &&
+ (unreadMessageMtmUid!=KSenduiMtmSmtpUidValue) &&
+ (unreadMessageMtmUid!=KSenduiMtmImap4UidValue) &&
+ (unreadMessageMtmUid!=KSenduiMtmPop3UidValue)
+ )
+ {
+ MCELOGGER_WRITE("LaunchMceViewer: launch editor");
+ iRunningEditFunction = ETrue;
+ iMceUi->EditMTMEntryL( (*entry)[firstUnreadMessage] );
+ iRunningEditFunction = EFalse;
+ }
+ aMsgMtmUid = unreadMessageMtmUid ;
+ CleanupStack::PopAndDestroy( entry );
+ return ( numberOfUnreadMessages==1 ? firstUnreadMessage : KErrNotFound );
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::SetMskObserver
+//
+// ----------------------------------------------------
+void CMceMessageListView::SetMskObserver( TBool aObserver )
+ {
+ CEikButtonGroupContainer* bgc = Cba();
+ if ( bgc )
+ {
+ CEikCba* cba = static_cast< CEikCba* >( bgc->ButtonGroup() );
+ if ( aObserver )
+ {
+ cba->SetMSKCommandObserver( iMsgListContainer );
+ }
+ else
+ {
+ cba->SetMSKCommandObserver( NULL );
+ }
+ }
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::GetDeleteFlagStatusL
+//
+// ----------------------------------------------------
+TInt CMceMessageListView::GetDeleteFlagStatusL( const CMsvEntrySelection* aEntries )
+ {
+ TBool allDelete = ETrue;
+ TBool allUnDelete = ETrue;
+
+ TMsvEntry entry;
+ TMsvId serviceId;
+ TMsvId id = (*aEntries)[0];
+ TInt rid = 0;
+ if ( iSession->GetEntry( id, serviceId, entry ) != KErrNone )
+ {
+ return KErrNotSupported;
+ }
+ if ( entry.iServiceId != KMsvLocalServiceIndexEntryId )
+ {
+ CBaseMtmUiData* uiData = iMceUi->GetMtmUiDataL( entry.iMtm );
+ if ( uiData )
+ {
+ const TInt count = aEntries->Count();
+ for ( TInt loop = 0; loop < count; loop++ )
+ {
+ id = (*aEntries)[loop];
+ if ( iSession->GetEntry( id, serviceId, entry ) == KErrNone )
+ {
+ if ( uiData->CanDeleteFromEntryL(entry, rid) )
+ {
+ allUnDelete = EFalse;
+ }
+ else if ( uiData->CanUnDeleteFromEntryL(entry, rid) )
+ {
+ allDelete = EFalse;
+ }
+ }
+ }
+ }
+ }
+
+ if ( allDelete && !allUnDelete )
+ {
+ // all delete
+ return MessageFolderAllDelete;
+ }
+ else if ( !allDelete && allUnDelete )
+ {
+ // all undelete
+ return MessageFolderAllUnDelete;
+ }
+ else if ( !allDelete && !allUnDelete )
+ {
+ // both delete and undelete
+ return MessageFolderDeleteUnDelete;
+ }
+ else
+ {
+ // never
+ return MessageFolderDeleteUnDelete;
+ }
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::FindAllReadMsgAndMarkL()
+// Private
+// ----------------------------------------------------
+void CMceMessageListView::FindAllReadMsgAndMarkL()
+ {
+ if ( iMsgListContainer )
+ {
+ iMsgListContainer->MarkAllReadMessagesL();
+ }
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::IsItemUnread( TMsvId aId )
+// Public
+// ----------------------------------------------------
+TBool CMceMessageListView::IsItemUnread(TMsvId aId)
+ {
+ TMsvEntry aEntry;
+ TMsvId serviceId;
+ if ( iSession->GetEntry( aId, serviceId, aEntry ) == KErrNone )
+ {
+ if ( aEntry.Unread() )
+ {
+ return ETrue;
+ }
+ }
+ return EFalse;
+ }
+// ----------------------------------------------------
+// CMceMessageListView::AnySelectedItemsVisible( CArrayFixFlat<TInt>* msgIndexArray )
+// private
+// ----------------------------------------------------
+TBool CMceMessageListView::AnySelectedItemsVisible ( CArrayFixFlat<TInt>* /*msgIndexArray */)
+ {
+ return EFalse;
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::EnableMarkAllReadMsgInInboxAndDocument( TMsvEntry currentEntry,
+// TMsvId currentFolderId,
+// CEikMenuPane* aMenuPane )
+// private
+// ----------------------------------------------------
+void CMceMessageListView::EnableMarkAllReadMsgInInboxAndDocument(
+ TMsvEntry currentEntry,
+ TMsvId currentFolderId,
+ CEikMenuPane* aMenuPane )
+ {
+ if ( currentFolderId == KMsvGlobalInBoxIndexEntryId ||
+ currentFolderId == KMceDocumentsEntryId ||
+ iMsgListContainer->FolderEntry().Parent() == KMceDocumentsEntryId ) // subfolder of Document
+ {
+ if ( iMsgListContainer->IsItemFolder( currentEntry.Id() ) )
+ {
+ // folder item does not have mark as read/unread
+ }
+ else
+ {
+ aMenuPane->SetItemDimmed(
+ EMceCmdMarkAsReadMsg, !currentEntry.Unread() );
+ aMenuPane->SetItemDimmed(
+ EMceCmdMarkAsUnreadMsg, currentEntry.Unread() );
+ }
+ }
+ }
+
+// ----------------------------------------------------
+// void CMceMessageListView::HandleSendkeyInMailboxL( TMsvId aEntryId )
+// public
+// ----------------------------------------------------
+void CMceMessageListView::HandleSendkeyInMailboxL( TMsvId aEntryId )
+ {
+ TPtrC addressString; // mail address string
+ TBool tempDoMoreCleanup = EFalse;
+
+ CMsvEntry* entry = iSession->GetEntryL( aEntryId );
+ CleanupStack::PushL( entry ); //<<<---------------------------entry
+
+ if ( entry->Entry().iType != KUidMsvMessageEntry )
+ {
+ // do not try to call if entry is not message
+ CleanupStack::PopAndDestroy( entry );
+ return;
+ }
+ if ( entry->HasStoreL() ) // only mails that have been retrivaled have stores
+ {
+ tempDoMoreCleanup = ETrue;
+ CMsvStore* store = entry->ReadStoreL();
+ if ( store == NULL) // just in case no crash if something wrong with store
+ {
+ CleanupStack::PopAndDestroy( entry ); //entry, store,
+ return;
+ }
+ CleanupStack::PushL( store ); //<<<--------------------------- store
+ CImHeader* iHeader = CImHeader::NewLC(); //<<<-----------------iHeader into stack
+ iHeader->RestoreL( *store );
+ TImMessageField email;
+ addressString.Set( email.GetValidInternetEmailAddressFromString( iHeader->From() ) );
+ }
+
+ else // Only mails that are not retrivaled should use iDetails instead.
+ {
+ TImMessageField email;
+ addressString.Set( email.GetValidInternetEmailAddressFromString( entry->Entry().iDetails ) );
+ }
+
+ CMuiuContactService* contactService = CMuiuContactService::NewL( *iEikonEnv );
+ CleanupStack::PushL( contactService ); //<<<--------------- contactService
+ contactService->SetAddress( addressString );
+ // This LINE is commented for the new send key behaviour in mailboxes
+ // there shall be no VOIP calls but only dialer shall be opened
+ // contactService->CallL();
+
+ if ( tempDoMoreCleanup )
+ {
+ CleanupStack::PopAndDestroy( 4, entry ); //iHeader store contactService entry
+ }
+ else
+ {
+ CleanupStack::PopAndDestroy( 2, entry ); // contactService entry
+ }
+ }
+
+
+// ----------------------------------------------------
+// CMceMessageListView::HandleClientRectChange
+// ----------------------------------------------------
+void CMceMessageListView::HandleClientRectChange()
+ {
+ if (iMsgListContainer)
+ {
+ iMsgListContainer->SetRect(ClientRect());
+ }
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::HandleEntriesCreatedChangedL
+// ----------------------------------------------------
+void CMceMessageListView::HandleEntriesCreatedChangedL( const CMsvEntrySelection* aSelection )
+ {
+ iMsgListContainer->ItemCountChangedL( ETrue );
+
+ if ( IsMSKMailBox() ) // focus setting only for email
+ {
+ iMsgListContainer->SetCurrentItemIdL( iCurrentItemId );
+
+ }
+ else
+ {
+ TMsvEntry currentEntry;
+ TMsvId serviceId; // not used here but needed by GetEntry function
+ if ( iSession->GetEntry( aSelection->At(0), serviceId, currentEntry ) == KErrNone &&
+ serviceId == KMsvLocalServiceIndexEntryId )
+ {
+ iMsgListContainer->SetCurrentItemIdL( aSelection->At(0) );
+ }
+ }
+
+ if ( iMceViewActivated )
+ {
+ iMsgListContainer->RefreshListbox();
+ }
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::HandleEntriesDeletedL
+// ----------------------------------------------------
+void CMceMessageListView::HandleEntriesDeletedL( )
+ {
+ TInt currentItem = KErrNotFound;
+ TMsvId currentSelectedItemId = 0;
+ if ( IsMSKMailBox() ) // focus setting only for email
+ {
+ if ( iMceUi->IsMailSetToBeDeletedFromServerL( iCurrentItemId ) )
+ {
+ currentSelectedItemId = iMceUi->AnchoredItem();
+ }
+ else
+ {
+ currentSelectedItemId = iCurrentItemId;
+ }
+ }
+ else
+ {
+ currentSelectedItemId = iMceUi->AnchoredItem();
+ }
+
+ iMsgListContainer->ItemCountChangedL( EFalse );
+ if ( currentItem != KErrNotFound )
+ {
+ iMsgListContainer->RefreshSelectionIndexesL( ETrue );
+ }
+ iMsgListContainer->SetCurrentItemIdL( currentSelectedItemId );
+ SetCurrentItemId();
+ if ( iMceViewActivated )
+ {
+ iMsgListContainer->RefreshListbox();
+ SetMSKButtonL();
+ }
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::HandleEntriesMovedL
+// ----------------------------------------------------
+void CMceMessageListView::HandleEntriesMovedL( TMsvId aSourceFolderId, TMsvId aTargetFolderId )
+ {
+ if ( iFolderId == aTargetFolderId )
+ {
+ iMsgListContainer->ItemCountChangedL( ETrue );
+ iMsgListContainer->RefreshSelectionIndexesL( EFalse );
+ iMsgListContainer->SetCurrentItemIdL( iMceUi->AnchoredItem() );
+ if ( iMceViewActivated )
+ {
+ iMsgListContainer->RefreshListbox();
+ }
+ }
+ else if ( iFolderId == aSourceFolderId )
+ {
+ iMsgListContainer->ItemCountChangedL( EFalse );
+ iMsgListContainer->SetCurrentItemIdL( iMceUi->AnchoredItem() );
+ iMsgListContainer->RefreshSelectionIndexesL( EFalse );
+ if ( iMceViewActivated )
+ {
+ iMsgListContainer->RefreshListbox();
+ }
+ }
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::SetFolderL
+// ----------------------------------------------------
+void CMceMessageListView::SetFolderL( TMsvId aFolderId )
+ {
+ if ( iFolderId != aFolderId && iMsgListContainer )
+ {
+ iFolderId = aFolderId;
+ if ( GetFolderListBoxType() != iMsgListContainer->MceListId() )
+ {
+ ListboxTypeChangedL();
+ }
+ }
+
+ iFolderId = aFolderId;
+ if ( iMsgListContainer )
+ {
+ iMsgListContainer->SetFolderL( aFolderId );
+ }
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::GetFolderListBoxType
+// ----------------------------------------------------
+TInt CMceMessageListView::GetFolderListBoxType()
+ {
+ TInt listType = EMceListTypeTwoRow;
+ TMsvEntry serviceEntry;
+ TMsvId serviceId;
+
+ if ( iSession->GetEntry( iFolderId, serviceId, serviceEntry ) == KErrNone )
+ {
+ const TMsvId entryId = serviceEntry.Id();
+ if ( entryId == KMsvGlobalInBoxIndexEntryId
+ || entryId == KMsvDraftEntryId
+ || entryId == KMsvSentEntryId
+ || entryId == KMceDocumentsEntryId
+ || serviceEntry.Parent() == KMceDocumentsEntryId )
+ {
+ listType = iListboxInboxTypeObserver->ListboxType();
+ }
+ else if ( iMceUi->CheckTechnologyTypeFromMtm( KMailTechnologyTypeUid, serviceEntry.iMtm ))
+ {
+ listType = iListboxMailTypeObserver->ListboxType();
+ }
+ }
+ return listType;
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::ListContainer
+// ----------------------------------------------------
+CMceMessageListContainerBase* CMceMessageListView::ListContainer() const
+ {
+ return iMsgListContainer;
+ }
+
+
+// ----------------------------------------------------
+// CMceMessageListView::HandleMsgServerStartupL
+// ----------------------------------------------------
+void CMceMessageListView::HandleMsgServerStartupL()
+ {
+ iSession->AddObserverL( *this );
+ iMsvSessionReady = ETrue;
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::AiwSyncParamListLC()
+//
+// ----------------------------------------------------
+CAiwGenericParamList* CMceMessageListView::AiwSyncParamListLC(TInt /*aId*/, const TDesC& aText)
+ {
+ TAiwVariant variant;
+ variant.Set(KNullDesC);
+ TAiwGenericParam param(EGenericParamMessageItemEMail, variant);
+
+ TAiwVariant variant2;
+ variant2.Set(aText);
+ TAiwGenericParam param2(EGenericParamMessageItemMbox, variant2);
+
+ CAiwGenericParamList* list = CAiwGenericParamList::NewLC();
+ list->AppendL(param);
+ list->AppendL(param2);
+
+ return list;
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::CheckUnreadMessages
+//
+// ----------------------------------------------------
+TBool CMceMessageListView::HasUnreadMessagesL()
+ {
+ // TODO: to list array or container???
+ CMsvEntry* entry = CMsvEntry::NewL(
+ *iSession,
+ iMsgListContainer->CurrentFolderId(),
+ TMsvSelectionOrdering(
+ KMsvGroupByStandardFolders, EMsvSortByDateReverse) );
+ CleanupStack::PushL( entry );
+
+ const TInt count = entry->Count();
+
+ for ( TInt i=0; i<count; ++i )
+ {
+ if ( (*entry)[i].Unread() )
+ {
+ CleanupStack::PopAndDestroy( entry );
+ // Current folder has unread/new message
+ return ETrue;
+ }
+ }
+ CleanupStack::PopAndDestroy( entry );
+ return EFalse;
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::SetMSKButtonL()
+//
+// ----------------------------------------------------
+void CMceMessageListView::SetMSKButtonL()
+ {
+
+ if ( AknLayoutUtils::MSKEnabled() )
+ {
+ TMsvId newFolderId = iFolderId;
+ TMsvId syncFolderId = 0;
+ TInt resourceId = R_MCE_MSK_BUTTON_OPEN;
+ TInt numberOfEntries = iMsgListContainer->Count();
+ TInt currentItemSelectionCount = iMsgListContainer->SelectionCount();
+
+ if ( IsMSKSyncMlMailBox() )
+ {
+ syncFolderId = iMsgListContainer->FolderEntry().iRelatedId;
+ if ( syncFolderId > 0 && newFolderId != syncFolderId )
+ {
+ newFolderId = syncFolderId;
+ }
+ }
+
+ if ( IsMSKMailBox() && ( !IsMSKSyncMlMailBox() ) )
+ {
+ TInt rid = 0; // command is available
+ TMsvId id = iMsgListContainer->CurrentItemId();
+ if ( id < 0 )
+ {
+ if ( CMceMessageListContainerBase::EMessageListItemSubtitle
+ != iMsgListContainer->CurrentItemType())
+ {
+ resourceId = R_MCE_MSK_BUTTON_CONTEXT_OPTIONS;
+ }
+ else
+ {
+ resourceId = iMsgListContainer->SetSpecialMskL();
+ }
+ }
+ else
+ {
+ TMsvEntry currentEntry;
+ TMsvId serviceId;
+ iSession->GetEntry( id, serviceId, currentEntry );
+
+ TMsvEntry serviceEntry;
+ iSession->GetEntry( currentEntry.iServiceId, serviceId, serviceEntry );
+
+ CBaseMtmUiData* mtmUiData = iMceUi->GetMtmUiDataL( currentEntry.iMtm );
+
+ if ( !mtmUiData)
+ {
+ resourceId = R_MCE_MSK_BUTTON_EMPTY;
+ }
+ else if ( mtmUiData->CanUnDeleteFromEntryL( currentEntry, rid ) &&
+ !serviceEntry.Connected() && currentItemSelectionCount == 0 )
+ {
+ // Offline and deleted item in focus
+ resourceId = R_MCE_MSK_BUTTON_UNDELETE;
+ }
+ else
+ {
+ if ( currentItemSelectionCount >= 1 || numberOfEntries == 0 )
+ {
+ resourceId = R_MCE_MSK_BUTTON_CONTEXT_OPTIONS;
+ }
+ else
+ {
+ if ( CMceMessageListContainerBase::EMessageListItemSubtitle == iMsgListContainer->CurrentItemType())
+ {
+ resourceId = iMsgListContainer->SetSpecialMskL();
+ }
+ else
+ {
+ resourceId = R_MCE_MSK_BUTTON_OPEN;
+ }
+ }
+ }
+ }
+ }
+ else if ( newFolderId == KMceDeliveryReportsId )
+ {
+ // Delivery reports
+ if ( numberOfEntries > 0 )
+ {
+ resourceId = R_MCE_MSK_BUTTON_CONTEXT_OPTIONS;
+ }
+ else
+ {
+ resourceId = R_MCE_MSK_BUTTON_EMPTY;
+ }
+ }
+ else if ( newFolderId == KMsvGlobalOutBoxIndexEntryId )
+ {
+ // Outbox
+ if ( numberOfEntries > 0 )
+ {
+ resourceId = R_MCE_MSK_BUTTON_CONTEXT_OPTIONS;
+ }
+ else if ( numberOfEntries == 0 )
+ {
+ if ( IsMSKSyncMlMailBox() )
+ {
+ resourceId = R_MCE_MSK_BUTTON_CONTEXT_OPTIONS;
+ }
+ else
+ {
+ resourceId = R_MCE_MSK_BUTTON_EMPTY;
+ }
+ }
+ }
+ else if ( newFolderId == KMceDocumentsEntryId )
+ {
+ // Documents, user's own folder
+ if ( currentItemSelectionCount >= 1 )
+ {
+ resourceId = R_MCE_MSK_BUTTON_CONTEXT_OPTIONS;
+ }
+ else
+ {
+ if ( CMceMessageListContainerBase::EMessageListItemSubtitle == iMsgListContainer->CurrentItemType())
+ {
+ resourceId = iMsgListContainer->SetSpecialMskL();
+ }
+ else
+ {
+ resourceId = R_MCE_MSK_BUTTON_OPEN;
+ }
+ }
+ }
+ else if ( newFolderId == KMsvGlobalInBoxIndexEntryId ||
+ newFolderId == KMsvSentEntryId ||
+ newFolderId == KMceTemplatesEntryId )
+ {
+ // Inbox, Sent Items, Templates
+ if ( currentItemSelectionCount >= 1 )
+ {
+ resourceId = R_MCE_MSK_BUTTON_CONTEXT_OPTIONS;
+ }
+ else if ( numberOfEntries == 0 )
+ {
+ if ( IsMSKSyncMlMailBox() )
+ {
+ resourceId = R_MCE_MSK_BUTTON_CONTEXT_OPTIONS;
+ }
+ else
+ {
+ resourceId = R_MCE_MSK_BUTTON_EMPTY;
+ }
+ }
+ else
+ {
+ // One row list handles expand/collape MSK setting
+ if ( CMceMessageListContainerBase::EMessageListItemSubtitle != iMsgListContainer->CurrentItemType())
+ {
+ TMsvId id = iMsgListContainer->CurrentItemId();
+ TMsvEntry currentEntry;
+ TMsvId serviceId;
+ iSession->GetEntry( id, serviceId, currentEntry );
+
+ CBaseMtmUiData* mtmUiData = iMceUi->GetMtmUiDataL( currentEntry.iMtm );
+ if ( currentEntry.iMtm == KUidMsgMMSNotification &&
+ mtmUiData->OperationSupportedL(KMtmUiFunctionOpenMessage, currentEntry ) )
+ {
+ // when MMSNotification is in retrieving status, the hide open for MSK
+ resourceId = R_MCE_MSK_BUTTON_EMPTY;
+ }
+ else
+ {
+ resourceId = R_MCE_MSK_BUTTON_OPEN;
+ }
+ }
+ else
+ {
+ if ( CMceMessageListContainerBase::EMessageListItemSubtitle == iMsgListContainer->CurrentItemType())
+ {
+ resourceId = iMsgListContainer->SetSpecialMskL();
+ }
+ else
+ {
+ resourceId = R_MCE_MSK_BUTTON_OPEN;
+ }
+ }
+ }
+ }
+ else if ( newFolderId == KMsvDraftEntryId )
+ {
+ // Drafts
+ if ( currentItemSelectionCount >= 1 )
+ {
+ resourceId = R_MCE_MSK_BUTTON_CONTEXT_OPTIONS;
+ }
+ else if ( numberOfEntries == 0 )
+ {
+ if ( IsMSKSyncMlMailBox() )
+ {
+ resourceId = R_MCE_MSK_BUTTON_CONTEXT_OPTIONS;
+ }
+ else
+ {
+ resourceId = R_MCE_MSK_BUTTON_EMPTY;
+ }
+ }
+ else
+ {
+ if ( CMceMessageListContainerBase::EMessageListItemSubtitle == iMsgListContainer->CurrentItemType())
+ {
+ resourceId = iMsgListContainer->SetSpecialMskL();
+ }
+ else
+ {
+ resourceId = R_MCE_MSK_BUTTON_OPEN;
+ }
+ }
+ }
+ else
+ {
+ // User's own folders
+ if ( currentItemSelectionCount >= 1 )
+ {
+ resourceId = R_MCE_MSK_BUTTON_CONTEXT_OPTIONS;
+ }
+ else if ( numberOfEntries == 0 )
+ {
+ resourceId = R_MCE_MSK_BUTTON_EMPTY;
+ }
+ else
+ {
+ // One row list handles expand/collape MSK setting
+ if ( CMceMessageListContainerBase::EMessageListItemSubtitle != iMsgListContainer->CurrentItemType())
+ {
+ TMsvId id = iMsgListContainer->CurrentItemId();
+ TMsvEntry currentEntry;
+ TMsvId serviceId;
+ iSession->GetEntry( id, serviceId, currentEntry );
+
+ CBaseMtmUiData* mtmUiData = iMceUi->GetMtmUiDataL( currentEntry.iMtm );
+ if ( currentEntry.iMtm == KUidMsgMMSNotification &&
+ mtmUiData->OperationSupportedL(KMtmUiFunctionOpenMessage, currentEntry ) )
+ {
+ // when MMSNotification is in retrieving status, the hide open for MSK
+ resourceId = R_MCE_MSK_BUTTON_EMPTY;
+ }
+ else
+ {
+ resourceId = R_MCE_MSK_BUTTON_OPEN;
+ }
+ }
+ else
+ {
+ resourceId = iMsgListContainer->SetSpecialMskL();
+ }
+ }
+ }
+
+ CEikButtonGroupContainer* cba = Cba();
+ cba->SetCommandL( KMSKPosition, resourceId );
+ cba->DrawDeferred();
+
+ }
+ }
+
+
+// ----------------------------------------------------
+// CMceMessageListView::IsMSKMailBox()
+//
+// ----------------------------------------------------
+TBool CMceMessageListView::IsMSKMailBox()
+ {
+ TBool mailBox = EFalse;
+ const TMsvEntry& entry = iMsgListContainer->FolderEntry();
+ if ( iMceUi->CheckTechnologyTypeFromMtm( KMailTechnologyTypeUid, entry.iMtm ) )
+ {
+ mailBox = ETrue;
+ }
+ return mailBox;
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::IsMSKSyncMlMailBox()
+//
+// ----------------------------------------------------
+TBool CMceMessageListView::IsMSKSyncMlMailBox()
+ {
+ TBool syncMailBox = EFalse;
+ const TMsvEntry& entry = iMsgListContainer->FolderEntry();
+ if ( iMceUi->IsPresent( entry.iMtm ) &&
+ iMsgListContainer->FolderEntry().iMtm == KSenduiMtmSyncMLEmailUid )
+ {
+ syncMailBox = ETrue;
+ }
+ return syncMailBox;
+ }
+
+ // ----------------------------------------------------
+// CMceMessageListView::SetCurrentItemId
+// ----------------------------------------------------
+void CMceMessageListView::SetCurrentItemId()
+ {
+ if ( iMsgListContainer && IsMSKMailBox() )
+ {
+ iCurrentItemId = iMsgListContainer->CurrentItemId();
+ }
+ else
+ {
+ iCurrentItemId = KErrNotFound;
+ }
+ }
+
+
+// ----------------------------------------------------
+// CMceMessageListView::CreateListboxL
+// ----------------------------------------------------
+void CMceMessageListView::CreateListboxL()
+ {
+ TInt newListType = EMceListTypeTwoRow;
+
+ newListType = GetFolderListBoxType();
+
+ if ( !iMsgListContainer )
+ {
+ if ( newListType != EMceListTypeOneRow )
+ {
+ iMsgListContainer = CMceMessageListContainer::NewL(
+ ClientRect(),
+ iSession,
+ iFolderId,
+ iBitmapResolver,
+ *this );
+ iCurrentListType = EMceListTypeTwoRow;
+ }
+ else
+ {
+ iMsgListContainer = CMceOneRowMessageListContainer::NewL(
+ *this,
+ ClientRect(),
+ iSession,
+ *iMceUi );
+ iCurrentListType = EMceListTypeOneRow;
+ }
+
+ iMsgListContainer->SetMopParent( this );
+ iMsgListContainer->SetMtmUiDataRegistry( iMceUi );
+ }
+
+ iCurrentListboxId = iMsgListContainer->MceListId();
+ }
+
+
+// ----------------------------------------------------
+// CMceMessageListView::EnvironmentChanged
+// ----------------------------------------------------
+TInt CMceMessageListView::EnvironmentChanged( TAny* aSelf )
+ {
+ TInt err = KErrArgument;
+ CMceMessageListView* self = static_cast<CMceMessageListView*>(aSelf);
+ if ( self )
+ {
+ err = self->HandleEnvironmentChanged();
+ }
+ return err;
+
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::HandleEnvironmentChanged
+// ----------------------------------------------------
+TInt CMceMessageListView::HandleEnvironmentChanged()
+ {
+ TInt err = KErrNone;
+ if ( iMsgListContainer &&
+ iDateTimeNotifier )
+ {
+ TInt change = iDateTimeNotifier->Change();
+ if ( change & EChangesMidnightCrossover ||
+ change & EChangesLocale ||
+ change & EChangesSystemTime )
+ {
+ // inform container that date/time format has been changed
+ TRAP( err, iMsgListContainer->DateTimeFormatChangedL( change ) );
+ }
+ }
+ return err;
+ }
+
+
+// ----------------------------------------------------
+// CMceMessageListView::ListboxTypeChangedL
+// ----------------------------------------------------
+void CMceMessageListView::ListboxTypeChangedL()
+ {
+ if (iMsgListContainer)
+ {
+ CEikonEnv* eikEnv = CEikonEnv::Static();
+ if( eikEnv )
+ {
+ // New listbox will overlap any remaining dialog,
+ // so we'll close them here.
+ AknDialogShutter::ShutDialogsL( *eikEnv );
+ }
+
+ iMsgListContainer->MakeVisible(EFalse);
+ AppUi()->RemoveFromStack(iMsgListContainer);
+ delete iMsgListContainer;
+ iMsgListContainer = NULL;
+ iLocalScreenClearer = CAknLocalScreenClearer::NewL( EFalse );
+ CreateListboxL();
+ iMsgListContainer->SetFolderL( iFolderId );
+ iMsgListContainer->ClearSelection();
+ iMsgListContainer->SetRect(ClientRect());
+ SetMskObserver( ETrue );
+ AppUi()->AddToStackL( *this,iMsgListContainer );
+ iMsgListContainer->ActivateL();
+ iMsgListContainer->MakeVisible(ETrue);
+ delete iLocalScreenClearer;
+ iLocalScreenClearer = NULL;
+ }
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::SetForwardMenuL
+// ----------------------------------------------------
+void CMceMessageListView::SetForwardMenuL( CEikMenuPane* aMenuPane, TMsvEntry& aEntry )
+ {
+ TBool canForward = EFalse;
+ switch( aEntry.iMtm.iUid )
+ {
+ case KSenduiMtmIrUidValue:
+ case KSenduiMtmBtUidValue:
+ case KSenduiMtmBioUidValue:
+ {
+ canForward = EFalse;
+ break;
+ }
+ case KSenduiMtmSmsUidValue:
+ {
+ canForward = !( aEntry.iBioType ) &&
+ iMceUi->CheckCommandAvailableL( EMceCmdForward, aEntry ) ;
+ break;
+ }
+ default:
+ {
+ canForward = iMceUi->CheckCommandAvailableL( EMceCmdForward, aEntry );
+ }
+ }
+ aMenuPane->SetItemDimmed( EMceCmdForward, !canForward );
+ }
+
+
+
+
+// ---------------------------------------------------------
+// CMceMessageListView::DimReadUnreadOptionsMenu
+// ---------------------------------------------------------
+//
+void CMceMessageListView::DimReadUnreadOptionsMenu( CEikMenuPane *aMenuPane )
+ {
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsRead, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsUnread, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsReadMsg, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsUnreadMsg, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsReadMsgs, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsUnreadMsgs, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsReadEmails, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsUnreadEmails, ETrue );
+ }
+
+// ---------------------------------------------------------
+// CMceMessageListView::SetReadUnreadOptionsMenu
+// ---------------------------------------------------------
+//
+void CMceMessageListView::SetReadUnreadOptionsMenu( CEikMenuPane *aMenuPane, TBool aIsEmail, TBool aSetRead )
+ {
+ if ( aIsEmail )
+ {// emails
+ switch ( aSetRead )
+ {
+ case MessageFolderAllRead:
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsReadEmails, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsUnreadEmails, EFalse );
+ break;
+ case MessageFolderAllUnread:
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsReadEmails, EFalse );
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsUnreadEmails, ETrue );
+ break;
+ case MessageFolderReadUnread:
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsReadEmails, EFalse );
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsUnreadEmails, EFalse );
+ break;
+ default:
+ // never
+ break;
+ }
+ }
+ else
+ {// messages
+ switch ( aSetRead )
+ {
+ case MessageFolderAllRead:
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsReadMsgs, ETrue );
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsUnreadMsgs, EFalse );
+ break;
+ case MessageFolderAllUnread:
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsReadMsgs, EFalse );
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsUnreadMsgs, ETrue );
+ break;
+ case MessageFolderReadUnread:
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsReadMsgs, EFalse );
+ aMenuPane->SetItemDimmed( EMceCmdMarkAsUnreadMsgs, EFalse );
+ break;
+ default:
+ // never
+ break;
+ }
+ }
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::SetMarkReadUnread( TBool aValue )
+// ----------------------------------------------------
+void CMceMessageListView::SetMarkReadUnread( TBool aValue )
+ {
+ iReadUnread = aValue;
+ }
+
+// ----------------------------------------------------
+// CMceMessageListView::SetContextCommandFlag( TBool aContextCommandFlag )
+// ----------------------------------------------------
+void CMceMessageListView::SetContextCommandFlag(TBool aContextCommandFlag)
+ {
+ iContextCommand = aContextCommandFlag;
+ }
+
+// End of File