diff -r d189ee25cf9d -r 3533d4323edc meetingrequest/mrgui/src/cesmrviewerdialog.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/meetingrequest/mrgui/src/cesmrviewerdialog.cpp Wed Sep 01 12:28:57 2010 +0100 @@ -0,0 +1,1967 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: ESMR policy implementation +* +*/ + +#include "cesmrviewerdialog.h" +#include "cesmrpolicy.h" +#include "esmrdef.h" +#include "cesmrpolicymanager.h" +#include "cesmrurlparserplugin.h" +#include "esmricalvieweropcodes.hrh" +#include "tesmrinputparams.h" +#include "cesmrview.h" +#include "esmrgui.hrh" +#include "cesmrfield.h" +#include "cesmrviewerfieldstorage.h" +#include "esmrentryhelper.h" +#include "mesmrmeetingrequestentry.h" +#include "esmrinternaluid.h" +#include "cesmrlistquery.h" +#include "cesmrconfirmationquery.h" +#include "cesmrsendui.h" +#include "cesmrcontactmenuhandler.h" +#include "cesmrfieldbuilderinterface.h" +#include "cesmrtrackingviewdialog.h" +#include "mesmruibase.h" +#include "cesmruifactory.h" +#include "cesmrlocationpluginhandler.h" +#include "cesmrfeaturesettings.h" +#include "esmrconfig.hrh" +#include "mesmrfieldevent.h" +#include "cmrtoolbar.h" +#include "cesmrlistquery.h" +#include "mmrinfoprovider.h" +#include "cmrfocusstrategyviewer.h" +#include "cesmrtitlepanehandler.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// DEBUG +#include "emailtrace.h" +#include "cesmrcaldbmgr.h" + +/// Unnamed namespace for local definitions +namespace { // codescanner::namespace + +#ifdef _DEBUG + +enum TESMRViewerDlgPanic + { + EESMRViewerDlgInvalidCommand, + EESMRViewerDlgnvalidSeriesResult, + EESMRViewerDlgInvalidEntry + }; + +void Panic( TESMRViewerDlgPanic aPanic ) + { + // Literal for viewer dialog + _LIT( KESMRViewerDlgPanicTxt, "ESMRViewerDlg" ); + User::Panic( KESMRViewerDlgPanicTxt, aPanic ); + } + +#endif + +// Definition for default buffer length +const TInt KCalDefaultBufferLen = 40; + +// VGA resolution screen size in pixels +const TInt KVGAOneSide( 640 ); +const TInt KVGAOtherSide( 480 ); + +// Calendar command parameter +_LIT16( KCalCmdDATE, "GRAPHICDAY" ); + +// Definition for time format ("YYYY MM DD HH MM SS MMMMMM" - 26) +_LIT( KCalCmdTimeFormat, "%F %Y %M %D %H %T %S %C" ); + +// Definition for calendar application UID +const TUid KCalendarAppUID = { KUidCalendarApplication }; + + +/** + * Sets recurrence modification rule to entry. Rule is queried + * from the user. Invalid result will cause panic. + * @param aEntry Reference to meeting request. + */ +void SetRecurrenceModRuleL( + MESMRCalEntry& aEntry, + CESMRListQuery::TESMRListQueryType aQueryType ) + { + FUNC_LOG; + if ( aEntry.IsRecurrentEventL() && + aEntry.IsStoredL() ) + { + TInt result = + CESMRListQuery::ExecuteL( aQueryType ); + + if( KErrCancel == result ) + { + // User has cancelled selecting opening the instance + User::Leave( KErrCancel ); + } + + TESMRThisOccurenceOrSeriesQuery recurrenceModRule = + static_cast( result ); + + switch( recurrenceModRule ) + { + case EESMRThisOccurence: + { + aEntry.SetModifyingRuleL( + MESMRMeetingRequestEntry::EESMRThisOnly ); + break; + } + case EESMRSeries: + { + aEntry.SetModifyingRuleL( + MESMRMeetingRequestEntry::EESMRAllInSeries ); + break; + } + default: + { + __ASSERT_DEBUG( EFalse, + Panic(EESMRViewerDlgnvalidSeriesResult) ); + break; + } + } + } + else + { + aEntry.SetModifyingRuleL( + MESMRMeetingRequestEntry::EESMRThisOnly ); + } + } +} + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::CESMRViewerDialog +// --------------------------------------------------------------------------- +// +CESMRViewerDialog::CESMRViewerDialog( + MMRInfoProvider& aInfoProvider, + MAgnEntryUiCallback& aCallback ) : + iCallback( aCallback ), + iInfoProvider( aInfoProvider ) + { + FUNC_LOG; + // Do nothing + } + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::~CESMRViewerDialog +// --------------------------------------------------------------------------- +// +CESMRViewerDialog::~CESMRViewerDialog() + { + FUNC_LOG; + iESMRStatic.Close(); + + if ( iTitlePane ) + { + // Returns the previous title back to titlepane + iTitlePane->Rollback(); + delete iTitlePane; + } + + delete iESMRSendUI; + delete iLocationPluginHandler; + delete iFeatures; + + // iView is deleted by framework because it uses the + // custom control mechanism. + delete iToolbar; + delete iFocusStrategy; + } + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::NewL +// --------------------------------------------------------------------------- +// +EXPORT_C CESMRViewerDialog* CESMRViewerDialog::NewL( + MMRInfoProvider& aInfoProvider, + MAgnEntryUiCallback& aCallback ) + { + FUNC_LOG; + CESMRViewerDialog* self = + new (ELeave) CESMRViewerDialog( aInfoProvider, aCallback ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::ConstructL +// --------------------------------------------------------------------------- +// +void CESMRViewerDialog::ConstructL() + { + FUNC_LOG; + iESMRStatic.ConnectL(); + + CAknDialog::ConstructL( R_MRVIEWER_MENUBAR ); + + // Class disables avkon toolbar by default, which + // we want in case of non-MR + iToolbar = CMRToolbar::NewL(); + + TRect clientRect; + AknLayoutUtils::LayoutMetricsRect( + AknLayoutUtils::EMainPane, + clientRect ); + + TBool responseReady(EFalse); + MESMRCalEntry* calEntry = iInfoProvider.EntryL(); + MESMRMeetingRequestEntry* mrEntry = NULL; + if ( MESMRCalEntry::EESMRCalEntryMeetingRequest == calEntry->Type() ) + { + // This is meeting request + mrEntry = static_cast( calEntry ); + responseReady = mrEntry->IsSentL(); + + // Change the status pane layout to remove navi pane + CEikStatusPane* sp = iEikonEnv->AppUiFactory()->StatusPane(); + sp->SwitchLayoutL(R_AVKON_STATUS_PANE_LAYOUT_USUAL_FLAT); + } + + iESMRSendUI = CESMRSendUI::NewL(EESMRCmdSendAs); + + CESMRViewerFieldStorage* storage = + CESMRViewerFieldStorage::NewL( + iInfoProvider.PolicyProvider().CurrentPolicy(), + this, + responseReady, + *this ); + + // Create focus strategy + iFocusStrategy = CMRFocusStrategyViewer::NewL( *storage ); + // Give the strategy to the iView + + // storage ownership is transferred to CESMRView + iView = CESMRView::NewL( + storage, + *calEntry, + clientRect, + *iFocusStrategy, + *iToolbar, + this ); + + iView->SetViewMode( EESMRViewMR ); + + if ( calEntry->Entry().SummaryL().Length() == 0 ) + { + // if no title, set unnamed text: + HBufC* title = StringLoader::LoadLC ( R_QTN_MEET_REQ_CONFLICT_UNNAMED, + iCoeEnv ); + iView->SetTitleL( *title ); + CleanupStack::PopAndDestroy( title ); + } + else + { + iView->SetTitleL( calEntry->Entry().SummaryL() ); + } + + TInt titleStringId = -1; + switch ( calEntry->Type() ) + { + case MESMRCalEntry::EESMRCalEntryMeetingRequest: + { + titleStringId = R_QTN_MEET_REQ_TITLE_MEETING; + break; + } + case MESMRCalEntry::EESMRCalEntryMeeting: + { + titleStringId = R_QTN_CALENDAR_TITLE_MEETING; + break; + } + case MESMRCalEntry::EESMRCalEntryTodo: + { + titleStringId = R_QTN_CALENDAR_TITLE_TODO; + break; + } + case MESMRCalEntry::EESMRCalEntryMemo: + { + titleStringId = R_QTN_CALENDAR_TITLE_MEMO; + break; + } + case MESMRCalEntry::EESMRCalEntryAnniversary: + { + titleStringId = R_QTN_CALENDAR_TITLE_ANNIVERSARY; + break; + } + case MESMRCalEntry::EESMRCalEntryReminder: // Fall through + default: + { + break; + } + } + if ( titleStringId != -1 ) + { + if( !iTitlePane ) + { + iTitlePane = CESMRTitlePaneHandler::NewL( *iEikonEnv ); + } + + HBufC* titleText = StringLoader::LoadLC( titleStringId, iCoeEnv ); + iTitlePane->SetNewTitle( titleText ); + CleanupStack::PopAndDestroy( titleText ); + } + + iFeatures = CESMRFeatureSettings::NewL(); + } + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::ActivateL +// --------------------------------------------------------------------------- +// +void CESMRViewerDialog::ActivateL() + { + FUNC_LOG; + iView->InternalizeL(); + CAknDialog::ActivateL(); + + // Needs to be constructed here + ConstructToolbarL(); + + switch ( iInfoProvider.EntryL()->Type() ) + { + case MESMRCalEntry::EESMRCalEntryMeetingRequest: + { + iView->InitialScrollL(); + + MESMRMeetingRequestEntry* entry = + static_cast( + iInfoProvider.EntryL() ); + + if ( entry->IsOpenedFromMail() ) + { + iView->SetNaviArrowStatus( + iCallback.IsCommandAvailable( + EESMRCmdMailPreviousMessage ), + iCallback.IsCommandAvailable( + EESMRCmdMailNextMessage ) ); + } + + } + + case MESMRCalEntry::EESMRCalEntryMeeting: + case MESMRCalEntry::EESMRCalEntryMemo: + case MESMRCalEntry::EESMRCalEntryAnniversary: + case MESMRCalEntry::EESMRCalEntryTodo: + case MESMRCalEntry::EESMRCalEntryReminder: // Fall through + default: + break; + } + } + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::PreLayoutDynInitL +// --------------------------------------------------------------------------- +// +void CESMRViewerDialog::PreLayoutDynInitL() + { + FUNC_LOG; + SetDefaultMiddleSoftKeyL(); + ButtonGroupContainer().MakeCommandVisibleByPosition( + CEikButtonGroupContainer::EMiddleSoftkeyPosition, + ETrue ); + } + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::OfferKeyEventL +// --------------------------------------------------------------------------- +// +TKeyResponse CESMRViewerDialog::OfferKeyEventL( + const TKeyEvent& aEvent, + TEventCode aType) + { + FUNC_LOG; + TKeyResponse response( EKeyWasNotConsumed ); + if ( aEvent.iCode != EKeyEscape && !MenuShowing() ) + { + response = iView->OfferKeyEventL( aEvent, aType ); + } + + if ( response == EKeyWasNotConsumed ) + { + switch (aEvent.iScanCode) + { + case '4': + { + response = EKeyWasConsumed; + ProcessCommandL(EESMRCmdMailPreviousMessage); + break; + } + case '6': + { + response = EKeyWasConsumed; + ProcessCommandL(EESMRCmdMailNextMessage); + break; + } + default: + { + response = CAknDialog::OfferKeyEventL( aEvent, aType ); + break; + } + } + } + + return response; + } + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::ProcessCommandL +// --------------------------------------------------------------------------- +// +void CESMRViewerDialog::ProcessCommandL( TInt aCommand ) + { + FUNC_LOG; + + TRAPD( err, DoProcessCommandL( aCommand ) ); + if ( err != KErrNone && + err != KErrCancel && + err != KErrArgument ) + { + User::Leave(err); + } + } + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::DoProcessCommandL +// --------------------------------------------------------------------------- +// +void CESMRViewerDialog::DoProcessCommandL( TInt aCommand ) + { + FUNC_LOG; + CAknDialog::ProcessCommandL( aCommand ); + switch ( aCommand ) + { + case EESMRCmdSendAs: + { + SendCalendarEntryL(aCommand); + break; + } + + case EESMRCmdSendMR: //Fall through + case EESMRCmdSendMRUpdate: + { + TInt ret( KErrGeneral ); + ret = iCallback.ProcessCommandWithResultL ( aCommand ); + + if ( ret == KErrNone ) + { + TryExitL ( EAknSoftkeyClose ); + } + break; + } + // pass-through all calentryui related command to call back + case EESMRCmdCalEntryUISend: // Fall through + case EESMRCmdCalEntryUIAddParticipants: // Fall through + case EESMRCmdCalEntryUISave: // Fall through + { + User::LeaveIfError( + iCallback.ProcessCommandWithResultL( aCommand )); + break; + } + + // EEikBidCancel is called when Red End key is pressed or + // application is killed via Swap Window + case EEikBidCancel: // Fall through + case EAknSoftkeyClose: // Fall through + case EAknCmdExit: + { + TryExitL( aCommand ); + break; + } + case EAknSoftkeySelect: // Fall through + { + iView->ProcessEditorCommandL( aCommand ); + break; + } + case EESMRCmdEdit: // Fall through + case EESMRCmdEditLocal: // Fall through + case EESMRCmdDeleteMR: // Fall through + case EESMRCmdCalEntryUIEdit: // Fall through + case EESMRCmdCalEntryUIDelete: + { + TBool closeDialog = HandleCommandForEventL( aCommand ); + if ( closeDialog ) + { + TryExitL( EAknSoftkeyClose ); + } + break; + } + + case EESMRCmdReply: // Fall through + case EESMRCmdReplyAll: + { + User::LeaveIfError( + iCallback.ProcessCommandWithResultL( aCommand )); + break; + } + + case EAknCmdHelp: + { + iView->LaunchViewerHelpL(); + break; + } + case EESMRCmdViewTrack: + { + User::LeaveIfError( + iCallback.ProcessCommandWithResultL( aCommand )); + TryExitL( EAknSoftkeyClose ); + break; + } + case EESMRCmdAcceptMR: // Fall through + case EESMRCmdTentativeMR: // Fall through + case EESMRCmdDeclineMR: // Fall through + { + if ( !UserWantToHandleAttachmentsL() ) + { + iView->ExternalizeL(); // no forced validation + TInt res = iCallback.ProcessCommandWithResultL( aCommand ); + if ( res != KErrCancel ) + { + TryExitL( EAknSoftkeyClose ); + } + } + break; + } + case EESMRCmdRemoveFromCalendar: + { + iView->ExternalizeL(); // no forced validation + TryExitL( EESMRCmdRemoveFromCalendar ); + break; + } + case EESMRCmdViewCalendar: + { + OpenInDayModeL(); + break; + } + + // Email commands + case EESMRCmdMailDelete: + { + TBool executeCmd( CESMRConfirmationQuery::ExecuteL( + CESMRConfirmationQuery::EESMRDeleteMR ) ); + + if ( executeCmd ) + { + TInt res = iCallback.ProcessCommandWithResultL( aCommand ); + if ( res != KErrCancel ) + { + TryExitL( EAknSoftkeyClose ); + } + } + break; + } + case EESMRCmdClipboardCopy: + { + iView->ProcessEditorCommandL( aCommand ); + break; + } + case EESMRCmdMailPreviousMessage: // Fall through + case EESMRCmdMailNextMessage: // Fall through + case EESMRCmdMailForwardAsMessage: // Fall through + case EESMRCmdMailMoveMessage: // Fall through + case EESMRCmdMailCopyMessage: // Fall through + case EESMRCmdMailMoveMessageToDrafts: // Fall through + case EESMRCmdMailComposeMessage: // Fall through + case EESMRCmdMailMessageDetails: + case EESMRCmdForwardAsMeeting: // Fall through + case EESMRCmdForwardAsMail: + { + if( aCommand == EESMRCmdForwardAsMeeting && + iInfoProvider.EntryL()->Entry().AttachmentCountL() > 0 ) + { + // Show confirmation note if current mailbox does not + // support attachments and attachments exist in the entry + if( !SupportsMailBoxCapabilityL( + MESMRBuilderExtension:: + EMRCFSSupportsAttachmentsInMR ) ) + { + if ( !CESMRConfirmationQuery::ExecuteL( + CESMRConfirmationQuery:: + EESMRAttachmentsNotSupported ) ) + { + break; + } + } + } + + if( aCommand == EESMRCmdForwardAsMail && + iInfoProvider.EntryL()->IsRecurrentEventL() ) + { + iInfoProvider.EntryL()->SetModifyingRuleL( + MESMRMeetingRequestEntry::EESMRAllInSeries ); + } + + TInt res = iCallback.ProcessCommandWithResultL( aCommand ); + if ( res != KErrCancel ) + { + TryExitL( aCommand ); + } + break; + } + +// + case EESMRCmdDownloadManager: + { + TInt res = iCallback.ProcessCommandWithResultL( aCommand ); + if ( res != KErrCancel ) + { + TryExitL( EAknSoftkeyClose ); + } +// + break; + } + +// + case EESMRCmdOpenAttachment: // Fall through + case EESMRCmdOpenAttachmentView: // Fall through + case EESMRCmdDownloadAttachment: // Fall through + case EESMRCmdDownloadAllAttachments: // Fall through + case EESMRCmdSaveAttachment: // Fall through + case EESMRCmdSaveAllAttachments: // Fall through +// + { + TInt res = iCallback.ProcessCommandWithResultL( + aCommand ); + if ( res != KErrCancel ) + { + iExitTriggered = ETrue; + } + break; + } + + /* + * Attachment field viewer context menu commands + */ + case EESMRViewerOpenAttachment: + case EESMRViewerSaveAttachment: + case EESMRViewerSaveAllAttachments: + case EESMRViewerCancelAttachmentDownload: + { + iView->ProcessEditorCommandL( aCommand ); + break; + } + + case EESMRCmdMailFlagMessage: // Fall through + case EESMRCmdMailMarkUnread: // Fall through + case EESMRCmdMailMarkRead: + { + TInt res = iCallback.ProcessCommandWithResultL( aCommand ); + break; + } + case EESMRCmdTodoMarkAsDone: // Fall through + case EESMRCmdTodoMarkAsNotDone: + { + if ( iInfoProvider.EntryL()->Type() == MESMRCalEntry::EESMRCalEntryTodo ) + { + User::LeaveIfError( + iCallback.ProcessCommandWithResultL( aCommand )); + } + break; + } + case EESMRCmdSearchFromMap: + case EESMRCmdShowOnMap: + { + if ( iFeatures->FeatureSupported( + CESMRFeatureSettings::EESMRUIMnFwIntegration ) ) + { + MESMRCalEntry* entry = iInfoProvider.EntryL(); + LocationPluginHandlerL().HandleCommandL( aCommand, *entry ); + iView->SetControlFocusedL( EESMRFieldLocation ); + } + break; + } + case EMRCmdHideAttachmentIndicator: + { + iView->ProcessEditorCommandL( EMRCmdHideAttachmentIndicator ); + } + break; + default: + { + if ( aCommand >= EESMRCmdActionMenuFirst && + aCommand < EESMRCmdActionMenuLast ) + { + iESMRStatic.ContactMenuHandlerL().ExecuteOptionsMenuL(aCommand); + } + else if ( aCommand == EESMRCmdActionMenuLast ) + { + TInt res = iCallback.ProcessCommandWithResultL( + EESMRCmdOpenAttachmentView ); + if ( res != KErrCancel ) + { + iExitTriggered = ETrue; + } + } + else + { + __ASSERT_DEBUG( EFalse, Panic( EESMRViewerDlgInvalidCommand ) ); + } + break; + } + } + } + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::OkToExitL +// --------------------------------------------------------------------------- +// +TBool CESMRViewerDialog::OkToExitL(TInt aButtonId) + { + FUNC_LOG; + TBool res( EFalse ); + // show options + switch ( aButtonId ) + { + case EAknSoftkeyOptions: + { + CAknDialog::DisplayMenuL(); + break; + } + case EAknSoftkeyContextOptions: + { + if ( iFeatures->FeatureSupported( + CESMRFeatureSettings::EESMRUIMnFwIntegration ) ) + { + SetContextMenu(); + ShowContextMenuL(); + } + break; + } + case EESMRCmdEdit: + case EESMRCmdEditLocal: + case EESMRCmdCalEntryUIEdit: + { + res = HandleCommandForEventL( aButtonId ); + break; + } + case EAknSoftkeySelect: + { + iView->ProcessEditorCommandL( aButtonId ); + + if ( iExitTriggered ) + { + res = ETrue; + } + break; + } +// + case EESMRCmdOpenAttachmentView: + case EESMRCmdMskOpenEmailAttachment: + case EESMRCmdOpenAttachment: + case EESMRCmdDownloadAttachment: + { + ProcessCommandL( aButtonId ); + break; + } +// + case EESMRCmdShowAllAttendees: + case EESMRCmdShowOnMap: + { + iView->ProcessEditorCommandL( aButtonId ); + break; + } + case EEikBidCancel: + { + res = ETrue; + break; + } + case EAknSoftkeyClose: // Fall through + case EAknCmdExit: // Fall through + case EESMRCmdMailPreviousMessage: // Fall through + case EESMRCmdMailNextMessage: // Fall through + case EESMRCmdMailForwardAsMessage: // Fall through + case EESMRCmdMailMoveMessage: // Fall through + case EESMRCmdMailCopyMessage: // Fall through + case EESMRCmdMailMoveMessageToDrafts: // Fall through + case EESMRCmdMailComposeMessage: // Fall through + case EESMRCmdMailMessageDetails: + case EESMRCmdRemoveFromCalendar: + { + res = HandleMRExitL( aButtonId ); + break; + } + + default: + { + if(iExitTriggered) + { + res = ETrue; + } + break; + } + } + + return res; + } + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::CreateCustomControlL +// --------------------------------------------------------------------------- +// +SEikControlInfo CESMRViewerDialog::CreateCustomControlL( TInt aType ) // codescanner::LFunctionCantLeave + { + FUNC_LOG; + SEikControlInfo controlInfo; + controlInfo.iControl = NULL; + controlInfo.iFlags = 0; + controlInfo.iTrailerTextId = 0; + + if ( aType == EEsMrViewerType ) + { + controlInfo.iControl = iView; + } + + return controlInfo; + } + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::ExecuteViewLD +// --------------------------------------------------------------------------- +// +TInt CESMRViewerDialog::ExecuteViewLD() + { + FUNC_LOG; + return ExecuteLD( R_MRVIEWER_DIALOG ); + } + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::Response +// --------------------------------------------------------------------------- +// +TBool CESMRViewerDialog::Response( TInt aCommand ) + { + FUNC_LOG; + + TBool retValue( EFalse ); + iExitTriggered = EFalse; + + if ( KErrCancel != aCommand ) + { + TBool handleAttachments( EFalse ); + TRAPD( error, handleAttachments = UserWantToHandleAttachmentsL() ); + + if ( !handleAttachments ) + { + // Documentation says that this function might leave and also might + // return system wide error code. + TInt res = KErrNone; + TRAP( error, res = iCallback.ProcessCommandWithResultL( aCommand ) ); + if ( res != KErrCancel && error == KErrNone ) + { + iExitTriggered = ETrue; + retValue = ETrue; + } + } + } + + return retValue; + } + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::ExitDialog +// --------------------------------------------------------------------------- +// +void CESMRViewerDialog::ExitDialog() + { + FUNC_LOG; + // If closing does not work what can we do + TRAPD( error, ProcessCommandL(EAknSoftkeyClose) ); + if ( error != KErrNone ) + { + iCoeEnv->HandleError( error ); + } + } + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::ChangeReadyResponseL +// --------------------------------------------------------------------------- +// +void CESMRViewerDialog::ChangeReadyResponseL() + { + FUNC_LOG; + iView->ProcessEditorCommandL( EESMRCmdEdit ); + } + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::DynInitToolbarL +// --------------------------------------------------------------------------- +// +void CESMRViewerDialog::DynInitToolbarL ( + TInt /*aResourceId*/, + CAknToolbar* /*aToolbar*/ ) + { + + } + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::OfferToolbarEventL +// --------------------------------------------------------------------------- +// +void CESMRViewerDialog::OfferToolbarEventL( TInt aCommand ) + { + ProcessCommandL( aCommand ); + } + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::DynInitMenuPaneL +// --------------------------------------------------------------------------- +// +void CESMRViewerDialog::DynInitMenuPaneL( + TInt aResourceId, + CEikMenuPane* aMenuPane ) + { + FUNC_LOG; + MESMRCalEntry* entry = iInfoProvider.EntryL(); + + TMRMenuStyle menuStyle( EMROptionsMenu ); + + switch ( aResourceId ) + { + case R_ACTION_MENU: + { + CESMRContactMenuHandler& handler = iESMRStatic.ContactMenuHandlerL(); + if ( handler.OptionsMenuAvailable() ) + { + handler.InitOptionsMenuL( aMenuPane ); + } + break; + } + case R_MR_VIEWER_MENU: + { + HandlePolicyMenuL( + aResourceId, + aMenuPane ); + + // Insert send ui menu for all other entry types than meeting request + if ( entry->Type() != MESMRCalEntry::EESMRCalEntryMeetingRequest ) + { + TryInsertSendMenuL(aMenuPane); + } + + if ( entry->Entry().AttendeesL().Count() <= 1 ) + { + aMenuPane->SetItemDimmed( EESMRCmdReplyAll, ETrue ); + } + + HandleDynamicMenuItemsL( aResourceId, aMenuPane ); + + break; + } + case R_FORWARD_OPTIONS: + { + HandleForwardMenuL( aResourceId, aMenuPane ); + break; + } + case R_MR_VIEWER_LOCATION_MENU: + { + menuStyle = EMRContextMenu; + InitLocationMenuL( aMenuPane ); + break; + } + case R_MR_VIEWER_ATTACHMENT_MENU: + { + menuStyle = EMRContextMenu; + break; + } + default: + { + break; + } + } + + // Handles email submenu + HandleEmailSubmenuL( aResourceId, aMenuPane ); + + // Handles field specific context menu + iView->DynInitMenuPaneL( menuStyle, aResourceId, aMenuPane ); + } + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::HandleDynamicMenuItemsL +// --------------------------------------------------------------------------- +// +void CESMRViewerDialog::HandleDynamicMenuItemsL( + TInt aResourceId, CEikMenuPane* aMenuPane ) + { + FUNC_LOG; + if ( aResourceId == R_MR_VIEWER_MENU ) + { + // Map and Navigation Fw support + if ( iFeatures->FeatureSupported( + CESMRFeatureSettings::EESMRUIMnFwIntegration ) && + iView->IsControlVisible( EESMRFieldLocation )) + { + MESMRCalEntry* entry = iInfoProvider.EntryL(); + TBool showOnMap = LocationPluginHandlerL(). + IsCommandAvailableL( EESMRCmdShowOnMap, *entry ); + aMenuPane->SetItemDimmed( EESMRCmdSearchFromMap, showOnMap ); + aMenuPane->SetItemDimmed( EESMRCmdShowOnMap, !showOnMap ); + } + else + { + aMenuPane->SetItemDimmed( EESMRCmdSearchFromMap, ETrue ); + aMenuPane->SetItemDimmed( EESMRCmdShowOnMap, ETrue ); + } + + // Handle Action Menu item + TBool dim = !iESMRStatic.ContactMenuHandlerL().OptionsMenuAvailable(); + aMenuPane->SetItemDimmed( EESMRCmdActionMenu, dim ); + aMenuPane->SetItemDimmed( EESMRCmdClipboardCopy, dim ); + } + } + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::TryInsertSendMenuL +// --------------------------------------------------------------------------- +// +void CESMRViewerDialog::TryInsertSendMenuL(CEikMenuPane* aMenuPane) + { + FUNC_LOG; + TInt index(KErrNotFound); + + // Insert send menu to the next position from "editing options" + aMenuPane->ItemAndPos(EESMRCmdClipboardCopy, index); + if (index == KErrNotFound) + { + aMenuPane->ItemAndPos(EESMRCmdCalEntryUIDelete, index); + if (index == KErrNotFound) + { + aMenuPane->ItemAndPos(EESMRCmdDeleteMR, index); + } + } + index++; + iESMRSendUI->DisplaySendMenuItemL(*aMenuPane, index); + } + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::SetContextMenu +// --------------------------------------------------------------------------- +// +void CESMRViewerDialog::SetContextMenu() + { + TESMREntryFieldId fieldId = iView->ClickedOrFocusedField(); + + switch( fieldId ) + { + case EESMRFieldViewerAttachments: + { + iContextMenuResourceId = R_MR_VIEWER_ATTACHMENT_CONTEXT_MENU; + } + break; + + default: + iContextMenuResourceId = R_MR_VIEWER_CONTEXT_MENU; + break; + } + + iMenuBar->SetContextMenuTitleResourceId( iContextMenuResourceId ); + } + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::OpenInDayModeL +// --------------------------------------------------------------------------- +// +void CESMRViewerDialog::OpenInDayModeL() + { + FUNC_LOG; + + TApaTaskList taskList( iCoeEnv->WsSession() ); + TApaTask task = taskList.FindApp(KCalendarAppUID ); + + HBufC16* tail = NULL; + CommandTailL( tail ); + CleanupStack::PushL( tail ); + + // copy the 16-bit data into 8-bit buffer + HBufC8* paramBuf = HBufC8::NewLC( tail->Length() *2 ); + TPtr8 tailBuf = paramBuf->Des(); + + tailBuf.Copy( + reinterpret_cast( tail->Ptr() ), tail->Length() *2 ); + + if( task.Exists() ) // Calendar already open + { + const TUid dummyUID = { 0x0 }; + task.SendMessage( dummyUID, tailBuf ); + task.BringToForeground(); + } + else // Launch Calendar into day view + { + TApaAppInfo appInfo; + RApaLsSession lsSession; + User::LeaveIfError(lsSession.Connect()); + CleanupClosePushL( lsSession ); + + if( lsSession.GetAppInfo( appInfo, KCalendarAppUID ) == KErrNone ) + { + CApaCommandLine* cmdLine = CApaCommandLine::NewLC(); + cmdLine->SetExecutableNameL( appInfo.iFullName ); + cmdLine->SetCommandL( EApaCommandRun ); + cmdLine->SetTailEndL( tailBuf ); + + lsSession.StartApp( *cmdLine ); + CleanupStack::PopAndDestroy( cmdLine ); + } + + // Close lsSession + CleanupStack::PopAndDestroy(); // codescanner::cleanup + } + CleanupStack::PopAndDestroy( paramBuf ); + CleanupStack::PopAndDestroy( tail ); + } + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::CommandTailL +// --------------------------------------------------------------------------- +// +void CESMRViewerDialog::CommandTailL(HBufC16*& aTailBuffer) + { + FUNC_LOG; + // "DATE YYYY MM DD HH MM SS MMMMMM" + aTailBuffer = HBufC::NewLC( KCalDefaultBufferLen ); + TPtr tailPtr = aTailBuffer->Des(); + + // get the start time of entry + CCalEntry& entry = iInfoProvider.EntryL()->Entry(); + TTime startTime = entry.StartTimeL().TimeLocalL(); + + startTime.FormatL(tailPtr, KCalCmdTimeFormat() ); + tailPtr.Insert( 0, KCalCmdDATE ); + CleanupStack::Pop( aTailBuffer ); + } + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::HandleCommandForEventL +// --------------------------------------------------------------------------- +// +TBool CESMRViewerDialog::HandleCommandForEventL( TInt aCommand ) + { + FUNC_LOG; + TBool closeDialog( EFalse ); + + MESMRCalEntry* calEntry( iInfoProvider.EntryL() ); + + switch ( aCommand ) + { + case EESMRCmdEdit: //Fall through + case EESMRCmdEditLocal: //Fall through + case EESMRCmdCalEntryUIEdit: + { + if ( calEntry->IsRecurrentEventL() ) + { + // Check is the currently viewed entry a modifying entry. + // MESMRCalEntry should provide this method. + // if the entry is an exception to series, no query + // should be asked in which mode the editor should be launched + // in this occurance or series -mode. + if ( calEntry->Entry().RecurrenceIdL().TimeUtcL() != + Time::NullTTime() ) + { + calEntry->SetModifyingRuleL( MESMRCalEntry::EESMRThisOnly ); + } + else + { + SetRecurrenceModRuleL( + *calEntry, + CESMRListQuery::EESMROpenThisOccurenceOrSeriesQuery ); + } + } + + MESMRMeetingRequestEntry* entry = NULL; + if ( MESMRCalEntry::EESMRCalEntryMeetingRequest == calEntry->Type() ) + { + entry = static_cast(calEntry); + + TESMRRole role = entry->RoleL(); + if ( role == EESMRRoleOrganizer ) + { + User::LeaveIfError( + iCallback.ProcessCommandWithResultL( EESMRCmdEdit )); + closeDialog = ETrue; + } + else + { + User::LeaveIfError( + iCallback.ProcessCommandWithResultL( EESMRCmdEditLocal )); + closeDialog = ETrue; + } + } + else + { + User::LeaveIfError( + iCallback.ProcessCommandWithResultL( EESMRCmdCalEntryUIEdit)); + closeDialog = ETrue; + } + break; + } + case EESMRCmdDeleteMR: // Fall through + case EESMRCmdCalEntryUIDelete: + { + TBool okToDelete = ETrue; + MESMRCalEntry* calEntry = iInfoProvider.EntryL(); + if ( calEntry->IsRecurrentEventL() ) + { + SetRecurrenceModRuleL( + *calEntry, + CESMRListQuery::EESMRDeleteThisOccurenceOrSeriesQuery ); + } + else + { + if( CCalenInterimUtils2::IsMeetingRequestL( calEntry->Entry() ) ) + { + okToDelete = CESMRConfirmationQuery::ExecuteL( + CESMRConfirmationQuery::EESMRDeleteMR ); + } + else + { + okToDelete = CESMRConfirmationQuery::ExecuteL( + CESMRConfirmationQuery::EESMRDeleteEntry ); + } + } + + if ( okToDelete ) + { + // When deleting we do not need to externalize entry + TInt res = iCallback.ProcessCommandWithResultL( aCommand ); + if ( res != KErrCancel ) + { + closeDialog = ETrue; + } + } + break; + } + default: + { + break; + } + } + + return closeDialog; + } + + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::SendCalendarEntryL +// --------------------------------------------------------------------------- +// +void CESMRViewerDialog::SendCalendarEntryL(TInt aCommandId) + { + FUNC_LOG; + // we don't need MenuPane in CCalSend but we need it for the API + CEikMenuPane* pane=NULL; + + // Show menu to user + // CCalenSend handles selection internally, so we don't + // get anything in return + iESMRSendUI->DisplaySendCascadeMenuL(*pane); + + // Try to send + if (iESMRSendUI->CanSendL(aCommandId)) + { + MESMRCalEntry* calEntry = iInfoProvider.EntryL(); + iESMRSendUI->SendAsVCalendarL(aCommandId, calEntry->Entry() ); + } + } + + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::HandleEmailSubmenuL +// --------------------------------------------------------------------------- +// +void CESMRViewerDialog::HandleEmailSubmenuL( + TInt aResourceId, + CEikMenuPane* aMenuPane ) + { + FUNC_LOG; + + MESMRCalEntry* calEntry = iInfoProvider.EntryL(); + + // Insert send ui menu for all other entry types than meeting request + if ( calEntry->Type() == MESMRCalEntry::EESMRCalEntryMeetingRequest ) + { + if ( R_MR_VIEWER_MENU == aResourceId ) + { + const CESMRPolicy& currentPolicy( + iInfoProvider.PolicyProvider().CurrentPolicy() ); + + aMenuPane->SetItemDimmed( + EESMRCmdMailDelete, + !iCallback.IsCommandAvailable( + EESMRCmdMailDelete) ); + aMenuPane->SetItemDimmed( + EESMRCmdMailMessageDetails, + !iCallback.IsCommandAvailable( + EESMRCmdMailMessageDetails ) ); + + aMenuPane->SetItemDimmed( + EESMRCmdMailPreviousMessage, + !iCallback.IsCommandAvailable( + EESMRCmdMailPreviousMessage ) ); + + aMenuPane->SetItemDimmed( + EESMRCmdMailNextMessage, + !iCallback.IsCommandAvailable( + EESMRCmdMailNextMessage ) ); + } + } + } + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::HandlePolicyMenuL +// --------------------------------------------------------------------------- +// +void CESMRViewerDialog::HandlePolicyMenuL( + TInt aResourceId, + CEikMenuPane* aMenuPane ) + { + FUNC_LOG; + MESMRCalEntry* calEntry = iInfoProvider.EntryL(); + const CESMRPolicy& currentPolicy( + iInfoProvider.PolicyProvider().CurrentPolicy() ); + + if ( aResourceId == R_MR_VIEWER_MENU ) + { + if ( calEntry->Type() == MESMRCalEntry::EESMRCalEntryMeetingRequest ) + { + MESMRMeetingRequestEntry* mrEntry = + (MESMRMeetingRequestEntry*)( calEntry ); + CCalEntry::TMethod method( + mrEntry->Entry().MethodL() ); + + TInt itemsInMenu( aMenuPane->NumberOfItemsInPane() ); + for ( TInt i(0); i < itemsInMenu; ++i ) + { + CEikMenuPaneItem::SData& item( + aMenuPane->ItemDataByIndexL( i ) ); + + if ( CCalEntry::EMethodCancel == method && + EESMRRoleOrganizer != mrEntry->RoleL()) + { + switch ( item.iCommandId ) + { + case EESMRCmdAcceptMR: // Fall through + case EESMRCmdTentativeMR: // Fall through + case EESMRCmdDeclineMR: // Fall through + case EESMRCmdDeleteMR: + { + aMenuPane->SetItemDimmed( + item.iCommandId, + ETrue ); + break; + } + case EESMRCmdRemoveFromCalendar: + { + if( SupportsMailBoxCapabilityL( + MESMRBuilderExtension:: + EMRCFSRemoveFromCalendar ) ) + { + aMenuPane->SetItemDimmed( + item.iCommandId, + EFalse ); + } + else + { + aMenuPane->SetItemDimmed( + item.iCommandId, + ETrue ); + } + break; + } + default: + { + aMenuPane->SetItemDimmed( + item.iCommandId, + !currentPolicy.IsDefaultCommand( + item.iCommandId) ); + break; + } + } + } + else + { + if( mrEntry->OccursInPastL() || + mrEntry->IsEntryOutOfDateL() || + mrEntry->IsMeetingCancelledL() ) + { + if( item.iCommandId == EESMRCmdAcceptMR || + item.iCommandId == EESMRCmdTentativeMR || + item.iCommandId == EESMRCmdDeclineMR ) + { + aMenuPane->SetItemDimmed( + item.iCommandId, + ETrue ); + } + else if ( EESMRCmdRemoveFromCalendar == item.iCommandId && + mrEntry->IsOpenedFromMail() ) + { + aMenuPane->SetItemDimmed( + EESMRCmdRemoveFromCalendar, + EFalse ); + } + else + { + aMenuPane->SetItemDimmed( + item.iCommandId, + !currentPolicy.IsDefaultCommand( item.iCommandId) ); + } + } + else + { + if ( EESMRCmdRemoveFromCalendar == item.iCommandId ) + { + aMenuPane->SetItemDimmed( + EESMRCmdRemoveFromCalendar, + ETrue ); + } + else + { + aMenuPane->SetItemDimmed( + item.iCommandId, + !currentPolicy.IsDefaultCommand( item.iCommandId) ); + } + } + } + if ( EESMRRoleOrganizer == mrEntry->RoleL()) + { + //dim tracking view menuitem if no attendees + //or if current cfsmailbox doesn't support attendee status + if( EESMRCmdViewTrack == item.iCommandId ) + { + TInt count(0); + + if ( SupportsMailBoxCapabilityL( + MESMRBuilderExtension:: + EMRCFSAttendeeStatus ) ) + { + count = mrEntry->AttendeeCountL(EESMRRoleRequiredAttendee)+ + mrEntry->AttendeeCountL(EESMRRoleOptionalAttendee); + } + + if (!count) + { + aMenuPane->SetItemDimmed( item.iCommandId, ETrue ); + } + } + } + } + } + else + { + TInt itemsInMenu( aMenuPane->NumberOfItemsInPane() ); + for ( TInt i(0); i < itemsInMenu; ++i ) + { + CEikMenuPaneItem::SData& item = aMenuPane->ItemDataByIndexL(i); + + aMenuPane->SetItemDimmed( + item.iCommandId, + !currentPolicy.IsDefaultCommand( item.iCommandId) ); + } + + if ( calEntry->Type() == MESMRCalEntry::EESMRCalEntryTodo ) + { + if (currentPolicy.IsDefaultCommand( EESMRCmdTodoMarkAsDone ) ) + { + TBool dim(EFalse); + if( calEntry->Entry().StatusL() == CCalEntry::ETodoCompleted ) + { + dim = ETrue; + } + aMenuPane->SetItemDimmed( EESMRCmdTodoMarkAsDone, dim ); + aMenuPane->SetItemDimmed( EESMRCmdTodoMarkAsNotDone, !dim ); + } + } + } + } + } + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::SupportsAttendeeStatusL +// --------------------------------------------------------------------------- +// +TBool CESMRViewerDialog::SupportsMailBoxCapabilityL( + MESMRBuilderExtension::TMRCFSMailBoxCapability aCapa ) + { + FUNC_LOG; + TBool supportsCapability( EFalse ); + CESMRFieldBuilderInterface* plugin = NULL; + TRAPD( error, + plugin = CESMRFieldBuilderInterface::CreatePluginL( + TUid::Uid(KESMRUIFieldBuilderPluginImplUId) ) ); + CleanupStack::PushL( plugin ); + + if (error == KErrNone && plugin) + { + TUid uid = {0}; + MESMRBuilderExtension* extension = + static_cast( plugin->ExtensionL(uid) ); + + MESMRCalEntry* calEntry = iInfoProvider.EntryL(); + + if ( extension && MESMRCalEntry::EESMRCalEntryMeetingRequest == calEntry->Type()) + { + // Static cast is safe here. We know for sure that entry is MR + MESMRMeetingRequestEntry* mrEntry = + static_cast( calEntry ); + + supportsCapability = extension->CFSMailBoxCapabilityL( + mrEntry->Entry().PhoneOwnerL()->Address(), + aCapa ); + } + } + + CleanupStack::PopAndDestroy( plugin ); + + return supportsCapability; + } + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::HandleMRExitL +// --------------------------------------------------------------------------- +// +TBool CESMRViewerDialog::HandleMRExitL( TInt aCommand ) + { + FUNC_LOG; + TBool deleteEntry( EFalse ); + + TBool queryAvailable( ETrue ); + + // disable EESMRRemoveAppointment query if exiting dialog + // through email-based option menu command, + switch ( aCommand ) + { + case EESMRCmdMailPreviousMessage: // Fall through + case EESMRCmdMailNextMessage: // Fall through + case EESMRCmdMailForwardAsMessage: // Fall through + case EESMRCmdMailMoveMessage: // Fall through + case EESMRCmdMailCopyMessage: // Fall through + case EESMRCmdMailMoveMessageToDrafts: // Fall through + case EESMRCmdMailComposeMessage: // Fall through + case EESMRCmdMailMessageDetails: + case EESMRCmdForwardAsMeeting: // Fall through + case EESMRCmdForwardAsMail: + { + queryAvailable = EFalse; + break; + } + case EAknSoftkeyClose: + { + queryAvailable = EFalse; + break; + } + default: + break; + } + + MESMRCalEntry* calEntry = iInfoProvider.EntryL(); + + if ( MESMRCalEntry::EESMRCalEntryMeetingRequest == calEntry->Type() ) + { + // Static cast is safe here. We know for sure that entry is MR + MESMRMeetingRequestEntry* mrEntry = + static_cast( calEntry ); + + // Restore the status pane layout + CEikStatusPane* sp = iEikonEnv->AppUiFactory()->StatusPane(); + sp->SwitchLayoutL(R_AVKON_STATUS_PANE_LAYOUT_USUAL); + + if ( mrEntry->IsOpenedFromMail() ) + { + + + if( queryAvailable && + EESMRRoleOrganizer != mrEntry->RoleL() && + ( mrEntry->IsMeetingCancelledL() || + mrEntry->IsEntryOutOfDateL() || + mrEntry->OccursInPastL() ) && + EESMRAttendeeStatusDecline != mrEntry->AttendeeStatusL() && + CESMRConfirmationQuery::ExecuteL( CESMRConfirmationQuery::EESMRRemoveAppointment) ) + { + deleteEntry = ETrue; + } + } + } + + if ( deleteEntry ) + { + iView->ExternalizeL(); + TInt res = iCallback.ProcessCommandWithResultL( EESMRCmdRemoveFromCalendar ); + if ( res == KErrCancel ) + { + return EFalse; + } + } + + if ( EESMRCmdRemoveFromCalendar == aCommand ) + { + return deleteEntry; + } + + return ETrue; + } + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::HandleForwardMenuL +// --------------------------------------------------------------------------- +// +void CESMRViewerDialog::HandleForwardMenuL( + TInt /*aResourceId*/, + CEikMenuPane* aMenuPane ) + { + FUNC_LOG; + MESMRCalEntry* calEntry = iInfoProvider.EntryL(); + if ( calEntry->Type() == MESMRCalEntry::EESMRCalEntryMeetingRequest ) + { + // Because this is MR entry, it is safe to cast it. + MESMRMeetingRequestEntry* mrEntry = + (MESMRMeetingRequestEntry*)( calEntry ); + + __ASSERT_DEBUG( mrEntry, Panic( EESMRViewerDlgInvalidEntry) ); + + TBool mrOriginatingEnabled( EFalse ); + TESMRMailPlugin currentPlugin = mrEntry->CurrentPluginL(); + + if ( EESMRIntelliSync == currentPlugin ) + { + mrOriginatingEnabled = EFalse; + } + else if ( mrEntry->IsOpenedFromMail() ) + { + // When opened from email, we need to make sure that + // meeting request sending is possible + CESMRFieldBuilderInterface* plugin = NULL; + TRAPD( error, plugin = + CESMRFieldBuilderInterface::CreatePluginL( + TUid::Uid(KESMRUIFieldBuilderPluginImplUId)) ); + + CleanupDeletePushL( plugin ); + + if (error == KErrNone && plugin) + { + TUid uid = {0}; + MESMRBuilderExtension* extension = + static_cast( + plugin->ExtensionL(uid) ); + + if (extension) + { + mrOriginatingEnabled = + extension->MRCanBeOriginateedL(); + } + } + CleanupStack::PopAndDestroy( plugin ); + plugin = NULL; + } + else + { + mrOriginatingEnabled = ETrue; + } + + aMenuPane->SetItemDimmed( + EESMRCmdForwardAsMeeting, + !mrOriginatingEnabled ); + } + } + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::LocationPluginHandlerL +// --------------------------------------------------------------------------- +// +CESMRLocationPluginHandler& CESMRViewerDialog::LocationPluginHandlerL() + { + FUNC_LOG; + if ( !iLocationPluginHandler ) + { + iLocationPluginHandler = CESMRLocationPluginHandler::NewL( *this ); + } + + return *iLocationPluginHandler; + } + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::HandleFieldEventL +// --------------------------------------------------------------------------- +// +void CESMRViewerDialog::HandleFieldEventL( const MESMRFieldEvent& aEvent ) + { + FUNC_LOG; + + MESMRFieldEvent::TEventType type( aEvent.Type() ); + + if ( MESMRFieldEvent::EESMRFieldCommandEvent == type ) + { + ProcessCommandEventL( aEvent ); + } + else if ( MESMRFieldEvent::EESMRFieldChangeEvent == type ) + { + ProcessFieldEventL( aEvent ); + } + } + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::SetDefaultMiddleSoftKeyL +// --------------------------------------------------------------------------- +// +void CESMRViewerDialog::SetDefaultMiddleSoftKeyL() + { + FUNC_LOG; + TInt resourceId = KErrNotFound; + MESMRCalEntry* calEntry = iInfoProvider.EntryL(); + const CESMRPolicy& currentPolicy( + iInfoProvider.PolicyProvider().CurrentPolicy() ); + + if ( MESMRCalEntry::EESMRCalEntryMeetingRequest == calEntry->Type() ) + { + // If 'Edit' command is not allowed then we change the MSK to 'Select' + if ( !currentPolicy.IsDefaultCommand( EESMRCmdEdit ) ) + { + resourceId = R_MR_SELECT_SOFTKEY; + // Disable middle softkey by default + // Focused field enables it if MSK has select functionality + ButtonGroupContainer().MakeCommandVisibleByPosition( + CEikButtonGroupContainer::EMiddleSoftkeyPosition, + EFalse ); + } + else + { + resourceId = R_MR_EDIT_SOFTKEY; + } + + } + else if ( currentPolicy.IsDefaultCommand( EESMRCmdCalEntryUIEdit ) ) + { + // Set correct edit command in MSK. Dialog resource has EESMRCmdEdit + resourceId = R_MR_CAL_EDIT_SOFTKEY; + } + + if ( resourceId != KErrNotFound ) + { + ButtonGroupContainer().SetCommandL( + CEikButtonGroupContainer::EMiddleSoftkeyPosition, + resourceId ); + } + } + +// ----------------------------------------------------------------------------- +// CESMRViewerDialog::ShowContextMenuL +// ----------------------------------------------------------------------------- +// +void CESMRViewerDialog::ShowContextMenuL() + { + FUNC_LOG; + + if ( iMenuBar ) + { + iMenuBar->TryDisplayContextMenuBarL(); + } + } + + // --------------------------------------------------------------------------- + // CESMRViewerDialog::HandleNaviArrowEventL + // --------------------------------------------------------------------------- + // + void CESMRViewerDialog::HandleNaviArrowEventL( const TInt aCommand ) + { + FUNC_LOG; + ProcessCommandL( aCommand ); + } + + // --------------------------------------------------------------------------- + // CESMRViewerDialog::UserWantToHandleAttachmentsL + // --------------------------------------------------------------------------- + // + TBool CESMRViewerDialog::UserWantToHandleAttachmentsL() + { + TBool retValue( EFalse ); + + MESMRCalEntry* calEntry = iInfoProvider.EntryL(); + MESMRMeetingRequestEntry* mrEntry = NULL; + if ( MESMRCalEntry::EESMRCalEntryMeetingRequest == calEntry->Type() ) + { + // This is meeting request + mrEntry = static_cast( calEntry ); + + TBool openedFromEmail( mrEntry->IsOpenedFromMail() ); + + // If entry is opened from mail, contains remote attachments and + // mailbox is MfE, we show the query. + if ( openedFromEmail && mrEntry->ContainsRemoteAttachmentsL() && + mrEntry->CurrentPluginL() == EESMRActiveSync ) + { + retValue = + CESMRConfirmationQuery::ExecuteL( + CESMRConfirmationQuery::EESMRAttachments ); + } + } + + return retValue; + } + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::InitLocationMenuL +// --------------------------------------------------------------------------- +// +void CESMRViewerDialog::InitLocationMenuL( CEikMenuPane* aMenuPane ) + { + FUNC_LOG; + + aMenuPane->SetItemDimmed( EESMRCmdSearchFromMap,ETrue ); + aMenuPane->SetItemDimmed( EESMRCmdShowOnMap, ETrue ); + } + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::ConstructToolbarL +// --------------------------------------------------------------------------- +// +void CESMRViewerDialog::ConstructToolbarL() + { + FUNC_LOG; + if( iInfoProvider.EntryL()->Type() == + MESMRCalEntry::EESMRCalEntryMeetingRequest ) + { + MESMRMeetingRequestEntry* entry = + static_cast( + iInfoProvider.EntryL() ); + + if( !entry->OccursInPastL() && + !entry->IsEntryOutOfDateL() && + !entry->IsMeetingCancelledL() ) + { + if ( entry->RoleL()== EESMRRoleRequiredAttendee || + entry->RoleL()== EESMRRoleOptionalAttendee ) + { + TSize screenSize = + iEikonEnv->ScreenDevice()->SizeInPixels(); + + TBool isVGA( EFalse ); + if( ( screenSize.iHeight == KVGAOneSide || + screenSize.iWidth == KVGAOneSide ) && + ( screenSize.iHeight == KVGAOtherSide || + screenSize.iWidth == KVGAOtherSide ) && + screenSize.iHeight != screenSize.iWidth ) + { + isVGA = ETrue; + } + + // Toolbar is disabled in VGA mode + if( !isVGA ) + { + // Toolbar is always shown in MR viewer when user + // is attendee + iToolbar->SetObserver( this ); + iToolbar->InitializeToolbarL( + CMRToolbar::EMRViewerAttendee ); + iToolbar->ShowToolbar( ETrue ); + + // Toolbar created, relayouting needed + SizeChanged(); + } + } + } + } + } + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::ProcessCommandEventL +// --------------------------------------------------------------------------- +// +void CESMRViewerDialog::ProcessCommandEventL( const MESMRFieldEvent& aEvent ) + { + FUNC_LOG; + + TInt* command = static_cast< TInt* >( aEvent.Param( 0 ) ); + + switch ( *command ) + { + case EESMRCmdRestoreMiddleSoftKey: + { + SetDefaultMiddleSoftKeyL(); + ButtonGroupContainer().DrawDeferred(); + break; + } + case EESMRCmdEdit: // Fall through + case EESMRCmdViewTrack: // Fall through + case EESMRCmdOpenAttachment:// Fall through + case EESMRCmdOpenAttachmentView:// Fall through + case EESMRCmdDownloadAttachment: // Fall through + case EESMRCmdDownloadAllAttachments: // Fall through + case EESMRCmdSaveAttachment: // Fall through + case EESMRCmdSaveAllAttachments: // Fall through + case EESMRCmdMskOpenEmailAttachment: // Fall through + case EESMRCmdSearchFromMap: // Fall through + case EESMRCmdShowOnMap: + case EMRCmdHideAttachmentIndicator: + { + ProcessCommandL( *command ); + break; + } + case EMRLaunchAttachmentContextMenu: + case EAknSoftkeyContextOptions: + { + SetContextMenu(); + ShowContextMenuL(); + break; + } + case EESMRCmdAcceptMR: + case EESMRCmdTentativeMR: + case EESMRCmdDeclineMR: + case EESMRCmdRemoveFromCalendar: + { + ProcessCommandL( *command ); + } + break; + default: + { + break; + } + } + } + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::ProcessFieldEventL +// --------------------------------------------------------------------------- +// +void CESMRViewerDialog::ProcessFieldEventL( const MESMRFieldEvent& aEvent ) + { + FUNC_LOG; + iView->ProcessEventL( aEvent ); + } + +// EOF