diff -r 0396474f30f5 -r 4ce476e64c59 meetingrequest/mrgui/src/cesmrviewerdialog.cpp --- a/meetingrequest/mrgui/src/cesmrviewerdialog.cpp Mon Mar 15 12:39:10 2010 +0200 +++ b/meetingrequest/mrgui/src/cesmrviewerdialog.cpp Wed Mar 31 21:08:33 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +* 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" @@ -15,50 +15,13 @@ * */ -#include "emailtrace.h" #include "cesmrviewerdialog.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -// -#include -// -#include - #include "cesmrpolicy.h" #include "esmrdef.h" #include "cesmrpolicymanager.h" #include "cesmrurlparserplugin.h" #include "esmricalvieweropcodes.hrh" #include "tesmrinputparams.h" -#include "cesmrattachmentinfo.h" #include "cesmrview.h" #include "esmrgui.hrh" #include "cesmrfield.h" @@ -78,17 +41,42 @@ #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 "cfsmailbox.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 -// Literal for viewer dialog -_LIT( KESMRViewerDlgPanicTxt, "ESMRViewerDlg" ); - enum TESMRViewerDlgPanic { EESMRViewerDlgInvalidCommand, @@ -98,7 +86,8 @@ void Panic( TESMRViewerDlgPanic aPanic ) { - + // Literal for viewer dialog + _LIT( KESMRViewerDlgPanicTxt, "ESMRViewerDlg" ); User::Panic( KESMRViewerDlgPanicTxt, aPanic ); } @@ -107,6 +96,10 @@ // 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" ); @@ -116,45 +109,6 @@ // Definition for calendar application UID const TUid KCalendarAppUID = { KUidCalendarApplication }; -// Defs for prefix -_LIT( KMailtoMatchPattern, "mailto:*" ); // these are never localized -const TInt KMailtoLength = 7; // "mailto:" length - - -// ======== LOCAL FUNCTIONS ======== - -// --------------------------------------------------------------------------- -// Set empty buttons to toolbar. -// --------------------------------------------------------------------------- -// -void SetEmptyButtonsL( CAknToolbar* aToolbar ) - { - aToolbar->AddItemL( CAknButton::NewL(), EAknCtButton, EESMRCmdUndefined, 0, 0 ); - aToolbar->AddItemL( CAknButton::NewL(), EAknCtButton, EESMRCmdUndefined, 0, 1 ); - aToolbar->AddItemL( CAknButton::NewL(), EAknCtButton, EESMRCmdUndefined, 0, 2 ); - } - -// --------------------------------------------------------------------------- -// Set buttons for responding to meeting request to toolbar. -// --------------------------------------------------------------------------- -// -void SetResponseButtonsL( CAknToolbar* aToolbar ) - { - CAknButton* buttonAccept = CAknButton::NewLC(); - buttonAccept->ConstructFromResourceL( R_ACCEPT_BUTTON ); - aToolbar->AddItemL( buttonAccept, EAknCtButton, EESMRCmdAcceptMR, 0, 0 ); - CleanupStack::Pop( buttonAccept ); - - CAknButton* buttonTentative = CAknButton::NewLC(); - buttonTentative->ConstructFromResourceL( R_TENTATIVE_BUTTON ); - aToolbar->AddItemL( buttonTentative, EAknCtButton, EESMRCmdTentativeMR, 0, 1 ); - CleanupStack::Pop( buttonTentative ); - - CAknButton* buttonDecline = CAknButton::NewLC(); - buttonDecline->ConstructFromResourceL( R_DECLINE_BUTTON ); - aToolbar->AddItemL( buttonDecline, EAknCtButton, EESMRCmdDeclineMR, 0, 2 ); - CleanupStack::Pop( buttonDecline ); - } /** * Sets recurrence modification rule to entry. Rule is queried @@ -188,16 +142,16 @@ aEntry.SetModifyingRuleL( MESMRMeetingRequestEntry::EESMRThisOnly ); break; - } + } case EESMRSeries: { aEntry.SetModifyingRuleL( MESMRMeetingRequestEntry::EESMRAllInSeries ); break; - } + } default: { - __ASSERT_DEBUG( EFalse, + __ASSERT_DEBUG( EFalse, Panic(EESMRViewerDlgnvalidSeriesResult) ); break; } @@ -218,11 +172,10 @@ // --------------------------------------------------------------------------- // CESMRViewerDialog::CESMRViewerDialog( - MESMRCalEntry& aEntry, + MMRInfoProvider& aInfoProvider, MAgnEntryUiCallback& aCallback ) : - iEntry( aEntry ), iCallback( aCallback ), - iClearToolbar( EFalse ) + iInfoProvider( aInfoProvider ) { FUNC_LOG; // Do nothing @@ -235,36 +188,23 @@ CESMRViewerDialog::~CESMRViewerDialog() { FUNC_LOG; - - if ( iIdleNaviEventRunner ) - { - iIdleNaviEventRunner->Cancel(); - delete iIdleNaviEventRunner; - } - iESMRStatic.Close(); - if ( iFeatureManagerInitialized ) - { - FeatureManager::UnInitializeLib(); - } - - if ( iServiceHandler ) + if ( iTitlePane ) { - iServiceHandler->DetachMenu( R_MRVIEWER_MENUBAR, R_PS_AIW_INTEREST ); - delete iServiceHandler; + // Returns the previous title back to titlepane + iTitlePane->Rollback(); + delete iTitlePane; } - + delete iESMRSendUI; - delete iLocationPluginHandler; - delete iFeatures; - - TRAP_IGNORE( ClearToolbarL() ); // iView is deleted by framework because it uses the // custom control mechanism. + delete iToolbar; + delete iFocusStrategy; } // --------------------------------------------------------------------------- @@ -272,15 +212,14 @@ // --------------------------------------------------------------------------- // EXPORT_C CESMRViewerDialog* CESMRViewerDialog::NewL( - CESMRPolicy* aPolicy, - MESMRCalEntry& aEntry, + MMRInfoProvider& aInfoProvider, MAgnEntryUiCallback& aCallback ) { FUNC_LOG; CESMRViewerDialog* self = - new (ELeave) CESMRViewerDialog( aEntry, aCallback ); + new (ELeave) CESMRViewerDialog( aInfoProvider, aCallback ); CleanupStack::PushL( self ); - self->ConstructL( aPolicy ); + self->ConstructL(); CleanupStack::Pop( self ); return self; } @@ -289,46 +228,61 @@ // CESMRViewerDialog::ConstructL // --------------------------------------------------------------------------- // -void CESMRViewerDialog::ConstructL( - CESMRPolicy* aPolicy ) +void CESMRViewerDialog::ConstructL() { FUNC_LOG; - - iIdleNaviEventRunner = CIdle::NewL( CActive::EPriorityStandard ); - - iPolicy = aPolicy; 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 ); + AknLayoutUtils::LayoutMetricsRect( + AknLayoutUtils::EMainPane, + clientRect ); TBool responseReady(EFalse); + MESMRCalEntry* calEntry = iInfoProvider.EntryL(); MESMRMeetingRequestEntry* mrEntry = NULL; - if ( MESMRCalEntry::EESMRCalEntryMeetingRequest == iEntry.Type() ) + if ( MESMRCalEntry::EESMRCalEntryMeetingRequest == calEntry->Type() ) { // This is meeting request - mrEntry = static_cast( &iEntry ); + 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); - FeatureManager::InitializeLibL(); - iFeatureManagerInitialized = ETrue; - CESMRViewerFieldStorage* storage = CESMRViewerFieldStorage::NewL( - aPolicy, + 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, iEntry, clientRect ); + iView = CESMRView::NewL( + storage, + *calEntry, + clientRect, + *iFocusStrategy, + *iToolbar, + this ); + + iView->SetViewMode( EESMRViewMR ); - if ( iEntry.Entry().SummaryL().Length() == 0 ) + if ( calEntry->Entry().SummaryL().Length() == 0 ) { // if no title, set unnamed text: HBufC* title = StringLoader::LoadLC ( R_QTN_MEET_REQ_CONFLICT_UNNAMED, @@ -338,12 +292,17 @@ } else { - iView->SetTitleL( iEntry.Entry().SummaryL() ); + iView->SetTitleL( calEntry->Entry().SummaryL() ); } TInt titleStringId = -1; - switch ( iEntry.Type() ) + switch ( calEntry->Type() ) { + case MESMRCalEntry::EESMRCalEntryMeetingRequest: + { + titleStringId = R_QTN_MEET_REQ_TITLE_MEETING; + break; + } case MESMRCalEntry::EESMRCalEntryMeeting: { titleStringId = R_QTN_CALENDAR_TITLE_MEETING; @@ -358,14 +317,13 @@ { titleStringId = R_QTN_CALENDAR_TITLE_MEMO; break; - } + } case MESMRCalEntry::EESMRCalEntryAnniversary: { titleStringId = R_QTN_CALENDAR_TITLE_ANNIVERSARY; break; } - case MESMRCalEntry::EESMRCalEntryReminder: // Fall through - case MESMRCalEntry::EESMRCalEntryMeetingRequest: // Fall through + case MESMRCalEntry::EESMRCalEntryReminder: // Fall through default: { break; @@ -373,46 +331,17 @@ } if ( titleStringId != -1 ) { - CEikStatusPane* sp = iEikonEnv->AppUiFactory()->StatusPane(); - CAknTitlePane* tp = - static_cast( - sp->ControlL(TUid::Uid(EEikStatusPaneUidTitle)) ); + if( !iTitlePane ) + { + iTitlePane = CESMRTitlePaneHandler::NewL( *iEikonEnv ); + } + HBufC* titleText = StringLoader::LoadLC( titleStringId, iCoeEnv ); - tp->SetTextL( *titleText ); + iTitlePane->SetNewTitle( titleText ); CleanupStack::PopAndDestroy( titleText ); } - iFeatures = CESMRFeatureSettings::NewL(); - if ( iFeatures->FeatureSupported( - CESMRFeatureSettings::EESMRUIMnFwIntegration ) ) - { - iMenuBar->SetContextMenuTitleResourceId( R_MR_VIEWER_CONTEXT_MENU ); - } - - // start to observe navigation decorator - CEikStatusPane* sp = - static_cast( - iEikonEnv->AppUiFactory() )->StatusPane(); - - CAknNavigationControlContainer* naviPane = - static_cast( - sp->ControlL( TUid::Uid( EEikStatusPaneUidNavi ) ) ); - - if ( naviPane ) - { - iESMRNaviDecorator = naviPane->Top(); - - if ( iESMRNaviDecorator ) - { - iESMRNaviDecorator->SetNaviDecoratorObserver( this ); - } - } - - - //start service handler and add the interests of this class - iServiceHandler = CAiwServiceHandler::NewL(); - iServiceHandler->AttachL( R_PS_AIW_INTEREST ); } // --------------------------------------------------------------------------- @@ -424,6 +353,39 @@ 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; + } } // --------------------------------------------------------------------------- @@ -450,46 +412,37 @@ FUNC_LOG; TKeyResponse response( EKeyWasNotConsumed ); if ( aEvent.iCode != EKeyEscape && !MenuShowing() ) - { - response = iView->OfferKeyEventL( aEvent, aType ); - } + { + response = iView->OfferKeyEventL( aEvent, aType ); + } if ( response == EKeyWasNotConsumed ) { switch (aEvent.iScanCode) { - case EStdKeyLeftArrow: - if ( aType == EEventKey ) - { - response = EKeyWasConsumed; - if ( iCallback.IsCommandAvailable( - EESMRCmdMailPreviousMessage ) ) - { - ProcessCommandL( EESMRCmdMailPreviousMessage ); - } - } + case '4': + { + response = EKeyWasConsumed; + ProcessCommandL(EESMRCmdMailPreviousMessage); break; - case EStdKeyRightArrow: - if ( aType == EEventKey ) - { - response = EKeyWasConsumed; - if ( iCallback.IsCommandAvailable( - EESMRCmdMailNextMessage ) ) - { - ProcessCommandL( EESMRCmdMailNextMessage ); - } - } + } + case '6': + { + response = EKeyWasConsumed; + ProcessCommandL(EESMRCmdMailNextMessage); break; + } default: + { response = CAknDialog::OfferKeyEventL( aEvent, aType ); break; + } } } return response; } - // --------------------------------------------------------------------------- // CESMRViewerDialog::ProcessCommandL // --------------------------------------------------------------------------- @@ -497,6 +450,7 @@ void CESMRViewerDialog::ProcessCommandL( TInt aCommand ) { FUNC_LOG; + TRAPD( err, DoProcessCommandL( aCommand ) ); if ( err != KErrNone && err != KErrCancel && @@ -514,44 +468,37 @@ { FUNC_LOG; CAknDialog::ProcessCommandL( aCommand ); - switch ( aCommand ) { - case EESMRCmdPrint: // Fall through - case EESMRCmdPrint_Reserved1: // Fall through - case EESMRCmdPrint_Reserved2: // Fall through - case EESMRCmdPrint_Reserved3: // Fall through - case EESMRCmdPrint_Reserved4: - { - this->MakeVisible(EFalse); - HandlePrintCommandL(aCommand); - this->MakeVisible(ETrue); - break; - } 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( + User::LeaveIfError( iCallback.ProcessCommandWithResultL( aCommand )); break; - } - case EESMRCmdCalEntryUIDelete: - { - if (!(iCallback.ProcessCommandWithResultL(aCommand) == KErrCancel)) - { - TryExitL( EAknSoftkeyClose ); - } - break; - } - // EEikBidCancel is called when Red End key is pressed or + } + + // EEikBidCancel is called when Red End key is pressed or // application is killed via Swap Window case EEikBidCancel: // Fall through case EAknSoftkeyClose: // Fall through @@ -565,25 +512,28 @@ iView->ProcessEditorCommandL( aCommand ); break; } - case EESMRCmdEdit: // Fall through - case EESMRCmdEditLocal: // Fall through - case EESMRCmdDeleteMR: // Fall through - case EESMRCmdCalEntryUIEdit: + case EESMRCmdEdit: // Fall through + case EESMRCmdEditLocal: // Fall through + case EESMRCmdDeleteMR: // Fall through + case EESMRCmdCalEntryUIEdit: // Fall through + case EESMRCmdCalEntryUIDelete: { - TBool closeDialog = HandleCommandForRecurrentEventL( aCommand ); + TBool closeDialog = HandleCommandForEventL( aCommand ); if ( closeDialog ) { TryExitL( EAknSoftkeyClose ); } break; } + case EESMRCmdReply: // Fall through case EESMRCmdReplyAll: { - User::LeaveIfError( + User::LeaveIfError( iCallback.ProcessCommandWithResultL( aCommand )); break; - } + } + case EAknCmdHelp: { iView->LaunchViewerHelpL(); @@ -600,12 +550,15 @@ case EESMRCmdTentativeMR: // Fall through case EESMRCmdDeclineMR: // Fall through { - iView->ExternalizeL(); // no forced validation - TInt res = iCallback.ProcessCommandWithResultL( aCommand ); - if ( res != KErrCancel ) + if ( !UserWantToHandleAttachmentsL() ) { - TryExitL( EAknSoftkeyClose ); - } + iView->ExternalizeL(); // no forced validation + TInt res = iCallback.ProcessCommandWithResultL( aCommand ); + if ( res != KErrCancel ) + { + TryExitL( EAknSoftkeyClose ); + } + } break; } case EESMRCmdRemoveFromCalendar: @@ -613,13 +566,14 @@ iView->ExternalizeL(); // no forced validation TryExitL( EESMRCmdRemoveFromCalendar ); break; - } + } case EESMRCmdViewCalendar: { OpenInDayModeL(); break; - } - // Email commands + } + + // Email commands case EESMRCmdMailDelete: { TBool executeCmd( CESMRConfirmationQuery::ExecuteL( @@ -634,12 +588,12 @@ } } break; - } + } case EESMRCmdClipboardCopy: { iView->ProcessEditorCommandL( aCommand ); break; - } + } case EESMRCmdMailPreviousMessage: // Fall through case EESMRCmdMailNextMessage: // Fall through case EESMRCmdMailForwardAsMessage: // Fall through @@ -648,7 +602,37 @@ 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 entry is recurring, we want to ask from user, if + // single instance or whole series will be forwarded + if( aCommand == EESMRCmdForwardAsMail && + iInfoProvider.EntryL()->IsRecurrentEventL() ) + { + SetRecurrenceModRuleL( + *( iInfoProvider.EntryL() ), + CESMRListQuery::EESMRForwardThisOccurenceOrSeriesQuery ); + } + TInt res = iCallback.ProcessCommandWithResultL( aCommand ); if ( res != KErrCancel ) { @@ -656,36 +640,8 @@ } break; } - case EESMRCmdForward: - { - if ( iEntry.Type() == MESMRCalEntry::EESMRCalEntryMeetingRequest ) - { - // Because this is MR entry, it is safe to cast it. - MESMRMeetingRequestEntry* mrEntry = - static_cast( &iEntry ); - __ASSERT_DEBUG( mrEntry, Panic( EESMRViewerDlgInvalidEntry ) ); - - TInt command = SupportsForwardingAsMeetingL( mrEntry, ETrue ) - ? EESMRCmdForwardAsMeeting : EESMRCmdForwardAsMail; - - CAknToolbar* currentToolbar = static_cast( - iEikonEnv->AppUiFactory() )->CurrentFixedToolbar(); - if ( currentToolbar ) - { - currentToolbar->SetToolbarVisibility( EFalse ); - } - TInt res = iCallback.ProcessCommandWithResultL( command ); - if ( currentToolbar ) - { - currentToolbar->SetToolbarVisibility( ETrue ); - } - if ( res != KErrCancel ) - { - TryExitL( aCommand ); - } - } - break; - } + +// case EESMRCmdDownloadManager: { TInt res = iCallback.ProcessCommandWithResultL( aCommand ); @@ -693,14 +649,18 @@ { 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 ); @@ -710,6 +670,19 @@ } 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: @@ -720,34 +693,40 @@ case EESMRCmdTodoMarkAsDone: // Fall through case EESMRCmdTodoMarkAsNotDone: { - if ( iEntry.Type() == MESMRCalEntry::EESMRCalEntryTodo ) + if ( iInfoProvider.EntryL()->Type() == MESMRCalEntry::EESMRCalEntryTodo ) { User::LeaveIfError( iCallback.ProcessCommandWithResultL( aCommand )); } break; - } + } case EESMRCmdSearchFromMap: - case EESMRCmdShowOnMap: + case EESMRCmdShowOnMap: { if ( iFeatures->FeatureSupported( CESMRFeatureSettings::EESMRUIMnFwIntegration ) ) { - LocationPluginHandlerL().HandleCommandL( aCommand, iEntry ); + MESMRCalEntry* entry = iInfoProvider.EntryL(); + LocationPluginHandlerL().HandleCommandL( aCommand, *entry ); iView->SetControlFocusedL( EESMRFieldLocation ); } break; } + case EMRCmdHideAttachmentIndicator: + { + iView->ProcessEditorCommandL( EMRCmdHideAttachmentIndicator ); + } + break; default: { - if ( aCommand >= EESMRCmdActionMenuFirst && + if ( aCommand >= EESMRCmdActionMenuFirst && aCommand < EESMRCmdActionMenuLast ) { iESMRStatic.ContactMenuHandlerL().ExecuteOptionsMenuL(aCommand); } else if ( aCommand == EESMRCmdActionMenuLast ) { - TInt res = iCallback.ProcessCommandWithResultL( + TInt res = iCallback.ProcessCommandWithResultL( EESMRCmdOpenAttachmentView ); if ( res != KErrCancel ) { @@ -784,7 +763,8 @@ if ( iFeatures->FeatureSupported( CESMRFeatureSettings::EESMRUIMnFwIntegration ) ) { - iMenuBar->TryDisplayContextMenuBarL(); + SetContextMenu(); + ShowContextMenuL(); } break; } @@ -792,9 +772,9 @@ case EESMRCmdEditLocal: case EESMRCmdCalEntryUIEdit: { - res = HandleCommandForRecurrentEventL( aButtonId ); + res = HandleCommandForEventL( aButtonId ); break; - } + } case EAknSoftkeySelect: { iView->ProcessEditorCommandL( aButtonId ); @@ -805,22 +785,22 @@ } break; } - +// case EESMRCmdOpenAttachmentView: case EESMRCmdMskOpenEmailAttachment: case EESMRCmdOpenAttachment: - case EESMRCmdDownloadAttachment: + case EESMRCmdDownloadAttachment: { ProcessCommandL( aButtonId ); break; - } - + } +// case EESMRCmdShowAllAttendees: case EESMRCmdShowOnMap: { iView->ProcessEditorCommandL( aButtonId ); break; - } + } case EEikBidCancel: { res = ETrue; @@ -836,16 +816,12 @@ case EESMRCmdMailMoveMessageToDrafts: // Fall through case EESMRCmdMailComposeMessage: // Fall through case EESMRCmdMailMessageDetails: + case EESMRCmdRemoveFromCalendar: { - iClearToolbar = ETrue; res = HandleMRExitL( aButtonId ); break; - } - case EESMRCmdRemoveFromCalendar: - { - res = iCallback.ProcessCommandWithResultL ( aButtonId ); - break; - } + } + default: { if(iExitTriggered) @@ -853,7 +829,7 @@ res = ETrue; } break; - } + } } return res; @@ -886,7 +862,6 @@ TInt CESMRViewerDialog::ExecuteViewLD() { FUNC_LOG; - MakeMrGuiToolbarButtonsL(); return ExecuteLD( R_MRVIEWER_DIALOG ); } @@ -897,17 +872,30 @@ TBool CESMRViewerDialog::Response( TInt aCommand ) { FUNC_LOG; + + TBool retValue( EFalse ); iExitTriggered = EFalse; - // Documentation says that this function might leave and also might - // return system might error code. - TInt res = KErrNone; - TRAPD( error, res = iCallback.ProcessCommandWithResultL( aCommand ) ); - if ( res != KErrCancel && error == KErrNone ) + + if ( KErrCancel != aCommand ) { - iExitTriggered = ETrue; - return ETrue; + 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 EFalse; + + return retValue; } // --------------------------------------------------------------------------- @@ -921,7 +909,7 @@ TRAPD( error, ProcessCommandL(EAknSoftkeyClose) ); if ( error != KErrNone ) { - CEikonEnv::Static()->HandleError( error );// codescanner::eikonenvstatic + iCoeEnv->HandleError( error ); } } @@ -936,6 +924,26 @@ } // --------------------------------------------------------------------------- +// CESMRViewerDialog::DynInitToolbarL +// --------------------------------------------------------------------------- +// +void CESMRViewerDialog::DynInitToolbarL ( + TInt /*aResourceId*/, + CAknToolbar* /*aToolbar*/ ) + { + // TODO: Not implemented yet + } + +// --------------------------------------------------------------------------- +// CESMRViewerDialog::OfferToolbarEventL +// --------------------------------------------------------------------------- +// +void CESMRViewerDialog::OfferToolbarEventL( TInt aCommand ) + { + ProcessCommandL( aCommand ); + } + +// --------------------------------------------------------------------------- // CESMRViewerDialog::DynInitMenuPaneL // --------------------------------------------------------------------------- // @@ -944,90 +952,56 @@ CEikMenuPane* aMenuPane ) { FUNC_LOG; - if ( iServiceHandler ) - { - if ( iServiceHandler->HandleSubmenuL( *aMenuPane ) ) - { - return; - } - } + MESMRCalEntry* entry = iInfoProvider.EntryL(); + + TMRMenuStyle menuStyle( EMROptionsMenu ); switch ( aResourceId ) { case R_ACTION_MENU: { - iESMRStatic.ContactMenuHandlerL().InitOptionsMenuL( aMenuPane ); + CESMRContactMenuHandler& handler = iESMRStatic.ContactMenuHandlerL(); + if ( handler.OptionsMenuAvailable() ) + { + handler.InitOptionsMenuL( aMenuPane ); + } break; } case R_MR_VIEWER_MENU: { - if (FeatureManager::FeatureSupported( KFeatureIdFfCmailIntegration )) - { - // remove help support in pf5250 - aMenuPane->SetItemDimmed( EAknCmdHelp, ETrue); - } - HandlePolicyMenuL( aResourceId, aMenuPane ); - + // Insert send ui menu for all other entry types than meeting request - if ( iEntry.Type() != MESMRCalEntry::EESMRCalEntryMeetingRequest ) + if ( entry->Type() != MESMRCalEntry::EESMRCalEntryMeetingRequest ) { TryInsertSendMenuL(aMenuPane); } - - if ( iEntry.Entry().AttendeesL().Count() <= 1 ) + + if ( entry->Entry().AttendeesL().Count() <= 1 ) { aMenuPane->SetItemDimmed( EESMRCmdReplyAll, ETrue ); } - + HandleDynamicMenuItemsL( aResourceId, aMenuPane ); - if ( FeatureManager::FeatureSupported( - KFeatureIdPrintingFrameworkCalendarPlugin ) ) - { - // Initiliaze menu - iServiceHandler->InitializeMenuPaneL( - *aMenuPane, - aResourceId, - EESMRCmdPrint, - iServiceHandler->InParamListL() ); - } - else - { - aMenuPane->SetItemDimmed( EESMRCmdPrint, ETrue ); - } - - TBool canCopyToClipboard = iView->CanProcessEditorCommandL( EESMRCmdClipboardCopy ); - if ( !canCopyToClipboard ) - { - aMenuPane->SetItemDimmed( EESMRCmdClipboardCopy, ETrue ); - } - + break; + } + case R_FORWARD_OPTIONS: + { + HandleForwardMenuL( aResourceId, aMenuPane ); break; } - case R_MR_VIEWER_LOCATION_MENU: { - if ( iFeatures->FeatureSupported( - CESMRFeatureSettings::EESMRUIMnFwIntegration ) ) - { - TBool showOnMap = - LocationPluginHandlerL().IsCommandAvailableL( EESMRCmdShowOnMap, - iEntry ); - - aMenuPane->SetItemDimmed( EESMRCmdShowOnMap, !showOnMap ); - aMenuPane->SetItemDimmed( EESMRCmdSearchFromMap, showOnMap ); - - aMenuPane->SetItemDimmed( EESMRCmdEdit, - !iPolicy->IsDefaultCommand( EESMRCmdEdit ) ); - aMenuPane->SetItemDimmed( EESMRCmdEditLocal, - !iPolicy->IsDefaultCommand( EESMRCmdEditLocal ) ); - aMenuPane->SetItemDimmed( EESMRCmdCalEntryUIEdit, - !iPolicy->IsDefaultCommand( EESMRCmdCalEntryUIEdit ) ); - } - + menuStyle = EMRContextMenu; + InitLocationMenuL( aMenuPane ); + break; + } + case R_MR_VIEWER_ATTACHMENT_MENU: + { + menuStyle = EMRContextMenu; break; } default: @@ -1038,6 +1012,9 @@ // Handles email submenu HandleEmailSubmenuL( aResourceId, aMenuPane ); + + // Handles field specific context menu + iView->DynInitMenuPaneL( menuStyle, aResourceId, aMenuPane ); } // --------------------------------------------------------------------------- @@ -1050,34 +1027,23 @@ FUNC_LOG; if ( aResourceId == R_MR_VIEWER_MENU ) { - if (FeatureManager::FeatureSupported( KFeatureIdFfCmailIntegration )) - { - // remove help support in pf5250 - aMenuPane->SetItemDimmed( EAknCmdHelp, ETrue); - } + // Map and Navigation Fw support if ( iFeatures->FeatureSupported( - CESMRFeatureSettings::EESMRUIMnFwIntegration ) ) + CESMRFeatureSettings::EESMRUIMnFwIntegration ) && + iView->IsControlVisible( EESMRFieldLocation )) { - if ( !iView->IsComponentVisible( EESMRFieldLocation )) - { - aMenuPane->SetItemDimmed( EESMRCmdSearchFromMap, ETrue ); - aMenuPane->SetItemDimmed( EESMRCmdShowOnMap, ETrue ); - } - else - { - TBool showOnMap = LocationPluginHandlerL(). - IsCommandAvailableL( EESMRCmdShowOnMap, - iEntry ); - aMenuPane->SetItemDimmed( EESMRCmdSearchFromMap, showOnMap ); - aMenuPane->SetItemDimmed( EESMRCmdShowOnMap, !showOnMap ); - } + 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 ); @@ -1093,7 +1059,7 @@ { FUNC_LOG; TInt index(KErrNotFound); - + // Insert send menu to the next position from "editing options" aMenuPane->ItemAndPos(EESMRCmdClipboardCopy, index); if (index == KErrNotFound) @@ -1109,6 +1075,30 @@ } // --------------------------------------------------------------------------- +// 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 // --------------------------------------------------------------------------- // @@ -1127,7 +1117,7 @@ HBufC8* paramBuf = HBufC8::NewLC( tail->Length() *2 ); TPtr8 tailBuf = paramBuf->Des(); - tailBuf.Copy( + tailBuf.Copy( reinterpret_cast( tail->Ptr() ), tail->Length() *2 ); if( task.Exists() ) // Calendar already open @@ -1153,7 +1143,7 @@ lsSession.StartApp( *cmdLine ); CleanupStack::PopAndDestroy( cmdLine ); } - + // Close lsSession CleanupStack::PopAndDestroy(); // codescanner::cleanup } @@ -1169,11 +1159,11 @@ { FUNC_LOG; // "DATE YYYY MM DD HH MM SS MMMMMM" - aTailBuffer = HBufC::NewLC( KCalDefaultBufferLen ); + aTailBuffer = HBufC::NewLC( KCalDefaultBufferLen ); TPtr tailPtr = aTailBuffer->Des(); // get the start time of entry - CCalEntry& entry = iEntry.Entry(); + CCalEntry& entry = iInfoProvider.EntryL()->Entry(); TTime startTime = entry.StartTimeL().TimeLocalL(); startTime.FormatL(tailPtr, KCalCmdTimeFormat() ); @@ -1182,45 +1172,46 @@ } // --------------------------------------------------------------------------- -// CESMRViewerDialog::HandleCommandForRecurrentEventL +// CESMRViewerDialog::HandleCommandForEventL // --------------------------------------------------------------------------- // -TBool CESMRViewerDialog::HandleCommandForRecurrentEventL( TInt aCommand ) +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 EESMRCmdEdit: //Fall through + case EESMRCmdEditLocal: //Fall through case EESMRCmdCalEntryUIEdit: { - this->MakeVisible(EFalse); - if ( iEntry.IsRecurrentEventL() ) + 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 ( iEntry.Entry().RecurrenceIdL().TimeUtcL() != + if ( calEntry->Entry().RecurrenceIdL().TimeUtcL() != Time::NullTTime() ) { - iEntry.SetModifyingRuleL( MESMRCalEntry::EESMRThisOnly ); + calEntry->SetModifyingRuleL( MESMRCalEntry::EESMRThisOnly ); } else { SetRecurrenceModRuleL( - iEntry, + *calEntry, CESMRListQuery::EESMROpenThisOccurenceOrSeriesQuery ); } } MESMRMeetingRequestEntry* entry = NULL; - if ( MESMRCalEntry::EESMRCalEntryMeetingRequest == iEntry.Type() ) + if ( MESMRCalEntry::EESMRCalEntryMeetingRequest == calEntry->Type() ) { - entry = static_cast(&iEntry); + entry = static_cast(calEntry); TESMRRole role = entry->RoleL(); if ( role == EESMRRoleOrganizer ) @@ -1238,40 +1229,44 @@ } else { - User::LeaveIfError( + User::LeaveIfError( iCallback.ProcessCommandWithResultL( EESMRCmdCalEntryUIEdit)); closeDialog = ETrue; } - this->MakeVisible(ETrue); break; } - case EESMRCmdDeleteMR: + case EESMRCmdDeleteMR: // Fall through + case EESMRCmdCalEntryUIDelete: { - if ( iEntry.Type () == MESMRCalEntry::EESMRCalEntryMeetingRequest ) + TBool okToDelete = ETrue; + MESMRCalEntry* calEntry = iInfoProvider.EntryL(); + if ( calEntry->IsRecurrentEventL() ) { - TBool okToDelete = ETrue; - - if ( iEntry.IsRecurrentEventL() ) + SetRecurrenceModRuleL( + *calEntry, + CESMRListQuery::EESMRDeleteThisOccurenceOrSeriesQuery ); + } + else + { + if( CCalenInterimUtils2::IsMeetingRequestL( calEntry->Entry() ) ) { - SetRecurrenceModRuleL( - iEntry, - CESMRListQuery::EESMRDeleteThisOccurenceOrSeriesQuery ); + okToDelete = CESMRConfirmationQuery::ExecuteL( + CESMRConfirmationQuery::EESMRDeleteMR ); } else { okToDelete = CESMRConfirmationQuery::ExecuteL( - CESMRConfirmationQuery::EESMRDeleteMR ); - + CESMRConfirmationQuery::EESMRDeleteEntry ); } + } - if ( okToDelete ) + if ( okToDelete ) + { + // When deleting we do not need to externalize entry + TInt res = iCallback.ProcessCommandWithResultL( aCommand ); + if ( res != KErrCancel ) { - // When deleting we do not need to externalize entry - TInt res = iCallback.ProcessCommandWithResultL( aCommand ); - if ( res != KErrCancel ) - { - closeDialog = ETrue; - } + closeDialog = ETrue; } } break; @@ -1297,53 +1292,18 @@ CEikMenuPane* pane=NULL; // Show menu to user - // CCalenSend handles selection internally, so we don't + // CCalenSend handles selection internally, so we don't // get anything in return iESMRSendUI->DisplaySendCascadeMenuL(*pane); // Try to send if (iESMRSendUI->CanSendL(aCommandId)) { - iESMRSendUI->SendAsVCalendarL(aCommandId, iEntry.Entry() ); + MESMRCalEntry* calEntry = iInfoProvider.EntryL(); + iESMRSendUI->SendAsVCalendarL(aCommandId, calEntry->Entry() ); } } -// --------------------------------------------------------------------------- -// CESMRViewerDialog::HandlePrintCommandL -// --------------------------------------------------------------------------- -// -void CESMRViewerDialog::HandlePrintCommandL(TInt aCommand) - { - FUNC_LOG; - CAiwGenericParamList& inParams = iServiceHandler->InParamListL(); - - // Param date - - TCalTime startTime = iEntry.Entry().StartTimeL(); - - TAiwGenericParam dateParam( EGenericParamDateTime ); - TTime activeDay = startTime.TimeUtcL(); - - TAiwGenericParam calendarParam( EGenericParamCalendarItem ); - calendarParam.Value().Set( TUid::Uid(iEntry.Entry().LocalUidL()) ); - inParams.AppendL( calendarParam ); - - // Append date param - dateParam.Value().Set( activeDay ); - inParams.AppendL( dateParam ); - - const TUid uid( TUid::Uid( KUidCalendarApplication ) ); - TAiwGenericParam uidParam( EGenericParamApplication ); - uidParam.Value().Set( uid ); - inParams.AppendL( uidParam ); - - // Execute service command with given parameters - iServiceHandler->ExecuteMenuCmdL( aCommand, - inParams, - iServiceHandler->OutParamListL(), - 0, - NULL ); - } // --------------------------------------------------------------------------- // CESMRViewerDialog::HandleEmailSubmenuL @@ -1354,36 +1314,17 @@ CEikMenuPane* aMenuPane ) { FUNC_LOG; + + MESMRCalEntry* calEntry = iInfoProvider.EntryL(); + // Insert send ui menu for all other entry types than meeting request - if ( iEntry.Type() == MESMRCalEntry::EESMRCalEntryMeetingRequest ) + if ( calEntry->Type() == MESMRCalEntry::EESMRCalEntryMeetingRequest ) { - if ( R_MRVIEWER_EMAIL_MENU == aResourceId ) + if ( R_MR_VIEWER_MENU == aResourceId ) { - TInt menuItemCount( aMenuPane->NumberOfItemsInPane() ); - for ( TInt i(0); i < menuItemCount; ++i ) - { - CEikMenuPaneItem::SData& item( - aMenuPane->ItemDataByIndexL( i ) ); - aMenuPane->SetItemDimmed( - item.iCommandId, - !iCallback.IsCommandAvailable(item.iCommandId) ); - } - } - else if ( R_MR_VIEWER_MENU == aResourceId ) - { - if (FeatureManager::FeatureSupported( KFeatureIdFfCmailIntegration )) - { - // remove help support in pf5250 - aMenuPane->SetItemDimmed( EAknCmdHelp, ETrue); - } - - TBool emailMenuDimmed( ETrue ); - // Try insert email specific menu - if ( EESMRAppESEmail == iPolicy->AllowedApp() ) - { - emailMenuDimmed = EFalse; - } - + const CESMRPolicy& currentPolicy( + iInfoProvider.PolicyProvider().CurrentPolicy() ); + aMenuPane->SetItemDimmed( EESMRCmdMailDelete, !iCallback.IsCommandAvailable( @@ -1402,10 +1343,6 @@ EESMRCmdMailNextMessage, !iCallback.IsCommandAvailable( EESMRCmdMailNextMessage ) ); - - aMenuPane->SetItemDimmed( - EESMRCmdMailEmailMoreMenu, - emailMenuDimmed ); } } } @@ -1419,18 +1356,16 @@ CEikMenuPane* aMenuPane ) { FUNC_LOG; + MESMRCalEntry* calEntry = iInfoProvider.EntryL(); + const CESMRPolicy& currentPolicy( + iInfoProvider.PolicyProvider().CurrentPolicy() ); + if ( aResourceId == R_MR_VIEWER_MENU ) { - if (FeatureManager::FeatureSupported( KFeatureIdFfCmailIntegration )) - { - // remove help support in pf5250 - aMenuPane->SetItemDimmed( EAknCmdHelp, ETrue); - } - - if ( iEntry.Type() == MESMRCalEntry::EESMRCalEntryMeetingRequest ) + if ( calEntry->Type() == MESMRCalEntry::EESMRCalEntryMeetingRequest ) { MESMRMeetingRequestEntry* mrEntry = - (MESMRMeetingRequestEntry*)( &iEntry ); + (MESMRMeetingRequestEntry*)( calEntry ); CCalEntry::TMethod method( mrEntry->Entry().MethodL() ); @@ -1457,11 +1392,9 @@ } case EESMRCmdRemoveFromCalendar: { - TPtrC addr = DigMailboxAndRemovePrefixL(); - - if( iESMRStatic.MailBoxL( addr ).HasCapability( - EFSMBoxCapaRemoveFromCalendar ) && - iEntry.IsStoredL() ) + if( SupportsMailBoxCapabilityL( + MESMRBuilderExtension:: + EMRCFSRemoveFromCalendar ) ) { aMenuPane->SetItemDimmed( item.iCommandId, @@ -1479,7 +1412,7 @@ { aMenuPane->SetItemDimmed( item.iCommandId, - !iPolicy->IsDefaultCommand( + !currentPolicy.IsDefaultCommand( item.iCommandId) ); break; } @@ -1487,17 +1420,46 @@ } else { - if ( EESMRCmdRemoveFromCalendar == item.iCommandId ) - { - aMenuPane->SetItemDimmed( - EESMRCmdRemoveFromCalendar, - ETrue ); - } - else - { - aMenuPane->SetItemDimmed( - item.iCommandId, - !iPolicy->IsDefaultCommand( item.iCommandId) ); + 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()) @@ -1508,7 +1470,9 @@ { TInt count(0); - if ( SupportsAttendeeStatusL() ) + if ( SupportsMailBoxCapabilityL( + MESMRBuilderExtension:: + EMRCFSAttendeeStatus ) ) { count = mrEntry->AttendeeCountL(EESMRRoleRequiredAttendee)+ mrEntry->AttendeeCountL(EESMRRoleOptionalAttendee); @@ -1531,15 +1495,15 @@ aMenuPane->SetItemDimmed( item.iCommandId, - !iPolicy->IsDefaultCommand( item.iCommandId) ); + !currentPolicy.IsDefaultCommand( item.iCommandId) ); } - if ( iEntry.Type() == MESMRCalEntry::EESMRCalEntryTodo ) + if ( calEntry->Type() == MESMRCalEntry::EESMRCalEntryTodo ) { - if (iPolicy->IsDefaultCommand(EESMRCmdTodoMarkAsDone)) + if (currentPolicy.IsDefaultCommand( EESMRCmdTodoMarkAsDone ) ) { TBool dim(EFalse); - if( iEntry.Entry().StatusL() == CCalEntry::ETodoCompleted ) + if( calEntry->Entry().StatusL() == CCalEntry::ETodoCompleted ) { dim = ETrue; } @@ -1555,33 +1519,40 @@ // CESMRViewerDialog::SupportsAttendeeStatusL // --------------------------------------------------------------------------- // -TBool CESMRViewerDialog::SupportsAttendeeStatusL( ) +TBool CESMRViewerDialog::SupportsMailBoxCapabilityL( + MESMRBuilderExtension::TMRCFSMailBoxCapability aCapa ) { FUNC_LOG; - TBool supportsAttendeeStatus(EFalse); + TBool supportsCapability( EFalse ); CESMRFieldBuilderInterface* plugin = NULL; - TRAPD( error, - plugin = CESMRFieldBuilderInterface::CreatePluginL( + 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) ); + MESMRBuilderExtension* extension = + static_cast( plugin->ExtensionL(uid) ); - if (extension) + MESMRCalEntry* calEntry = iInfoProvider.EntryL(); + + if ( extension && MESMRCalEntry::EESMRCalEntryMeetingRequest == calEntry->Type()) { - supportsAttendeeStatus = - extension->CFSMailBoxCapabilityL( - MESMRBuilderExtension::EMRCFSAttendeeStatus); + // 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 supportsAttendeeStatus; + return supportsCapability; } // --------------------------------------------------------------------------- @@ -1592,10 +1563,10 @@ { FUNC_LOG; TBool deleteEntry( EFalse ); - + TBool queryAvailable( ETrue ); - - // disable EESMRRemoveAppointment query if exiting dialog + + // disable EESMRRemoveAppointment query if exiting dialog // through email-based option menu command, switch ( aCommand ) { @@ -1606,28 +1577,48 @@ case EESMRCmdMailCopyMessage: // Fall through case EESMRCmdMailMoveMessageToDrafts: // Fall through case EESMRCmdMailComposeMessage: // Fall through - case EESMRCmdMailMessageDetails: // Fall through - case EESMRCmdForward: + case EESMRCmdMailMessageDetails: + case EESMRCmdForwardAsMeeting: // Fall through + case EESMRCmdForwardAsMail: { queryAvailable = EFalse; break; } + case EAknSoftkeyClose: + { + queryAvailable = EFalse; + break; + } default: break; } - - if ( MESMRCalEntry::EESMRCalEntryMeetingRequest == iEntry.Type() ) + + MESMRCalEntry* calEntry = iInfoProvider.EntryL(); + + if ( MESMRCalEntry::EESMRCalEntryMeetingRequest == calEntry->Type() ) { - MESMRMeetingRequestEntry* mrEntry = static_cast( &iEntry ); + // 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() && - queryAvailable && - EESMRRoleOrganizer != mrEntry->RoleL() && - mrEntry->IsMeetingCancelledL() && - EESMRAttendeeStatusDecline != mrEntry->AttendeeStatusL() && - CESMRConfirmationQuery::ExecuteL( CESMRConfirmationQuery::EESMRRemoveAppointment) ) + if ( mrEntry->IsOpenedFromMail() ) { - deleteEntry = ETrue; + + + if( queryAvailable && + EESMRRoleOrganizer != mrEntry->RoleL() && + ( mrEntry->IsMeetingCancelledL() || + mrEntry->IsEntryOutOfDateL() || + mrEntry->OccursInPastL() ) && + EESMRAttendeeStatusDecline != mrEntry->AttendeeStatusL() && + CESMRConfirmationQuery::ExecuteL( CESMRConfirmationQuery::EESMRRemoveAppointment) ) + { + deleteEntry = ETrue; + } } } @@ -1643,60 +1634,59 @@ if ( EESMRCmdRemoveFromCalendar == aCommand ) { - return deleteEntry; + return deleteEntry; } - + return ETrue; } // --------------------------------------------------------------------------- -// CESMRViewerDialog::SupportsForwardingAsMeetingL +// CESMRViewerDialog::HandleForwardMenuL // --------------------------------------------------------------------------- // -TBool CESMRViewerDialog::SupportsForwardingAsMeetingL( - MESMRMeetingRequestEntry* aEntry, - TBool aForceResetDefaultMRMailbox ) +void CESMRViewerDialog::HandleForwardMenuL( + TInt /*aResourceId*/, + CEikMenuPane* aMenuPane ) { FUNC_LOG; - TBool sendingAsMRSupported( EFalse ); - TESMRMailPlugin currentPlugin = aEntry->CurrentPluginL(); + MESMRCalEntry* calEntry = iInfoProvider.EntryL(); + if ( calEntry->Type() == MESMRCalEntry::EESMRCalEntryMeetingRequest ) + { + // Because this is MR entry, it is safe to cast it. + MESMRMeetingRequestEntry* mrEntry = + (MESMRMeetingRequestEntry*)( calEntry ); - if ( EESMRIntelliSync != currentPlugin ) - { - if ( aEntry->IsOpenedFromMail() ) + __ASSERT_DEBUG( mrEntry, Panic( EESMRViewerDlgInvalidEntry) ); + + TBool mrOriginatingEnabled( EFalse ); + TESMRMailPlugin currentPlugin = mrEntry->CurrentPluginL(); + + if ( EESMRIntelliSync == currentPlugin ) { - // Set default MR mail box to the one used for this MR - // unless if it already is set - CMRMailboxUtils* mbUtils = CMRMailboxUtils::NewL(); - CleanupStack::PushL( mbUtils ); - TInt currentEntryId = AccountIdL( aEntry->CurrentMailBoxIdL() ); - CMRMailboxUtils::TMailboxInfo mrMailboxInfo; - mbUtils->GetDefaultMRMailBoxL( mrMailboxInfo ); - if ( mrMailboxInfo.iEntryId != currentEntryId ) - { - mbUtils->SetDefaultMRMailBoxL( currentEntryId ); - } - CleanupStack::PopAndDestroy( mbUtils ); - + mrOriginatingEnabled = EFalse; + } + else if ( mrEntry->IsOpenedFromMail() ) + { // When opened from email, we need to make sure that // meeting request sending is possible - CESMRFieldBuilderInterface* plugin = + CESMRFieldBuilderInterface* plugin = NULL; + TRAPD( error, plugin = CESMRFieldBuilderInterface::CreatePluginL( - TUid::Uid( KESMRUIFieldBuilderPluginImplUId ) ); + TUid::Uid(KESMRUIFieldBuilderPluginImplUId)) ); + CleanupDeletePushL( plugin ); - if ( plugin ) + if (error == KErrNone && plugin) { TUid uid = {0}; MESMRBuilderExtension* extension = static_cast( - plugin->ExtensionL( uid ) ); + plugin->ExtensionL(uid) ); - if ( extension ) + if (extension) { - sendingAsMRSupported = - extension->MRCanBeOriginateedL( - aForceResetDefaultMRMailbox ); + mrOriginatingEnabled = + extension->MRCanBeOriginateedL(); } } CleanupStack::PopAndDestroy( plugin ); @@ -1704,14 +1694,15 @@ } else { - sendingAsMRSupported = ETrue; + mrOriginatingEnabled = ETrue; } - } - return sendingAsMRSupported; + aMenuPane->SetItemDimmed( + EESMRCmdForwardAsMeeting, + !mrOriginatingEnabled ); + } } - // --------------------------------------------------------------------------- // CESMRViewerDialog::LocationPluginHandlerL // --------------------------------------------------------------------------- @@ -1723,46 +1714,27 @@ { iLocationPluginHandler = CESMRLocationPluginHandler::NewL( *this ); } - + return *iLocationPluginHandler; } // --------------------------------------------------------------------------- -// CESMRViewerDialog::LocationPluginHandlerL +// CESMRViewerDialog::HandleFieldEventL // --------------------------------------------------------------------------- // void CESMRViewerDialog::HandleFieldEventL( const MESMRFieldEvent& aEvent ) { FUNC_LOG; - if ( aEvent.Type() == MESMRFieldEvent::EESMRFieldCommandEvent ) + + MESMRFieldEvent::TEventType type( aEvent.Type() ); + + if ( MESMRFieldEvent::EESMRFieldCommandEvent == type ) { - TInt* command = static_cast< TInt* >( aEvent.Param( 0 ) ); - - switch ( *command ) - { - case EESMRCmdRestoreMiddleSoftKey: - { - SetDefaultMiddleSoftKeyL(); - ButtonGroupContainer().DrawDeferred(); - 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 - case EESMRCmdMskOpenEmailAttachment: - { - ProcessCommandL( *command ); - - break; - } - default: - { - break; - } - } + ProcessCommandEventL( aEvent ); + } + else if ( MESMRFieldEvent::EESMRFieldChangeEvent == type ) + { + ProcessFieldEventL( aEvent ); } } @@ -1774,10 +1746,14 @@ { FUNC_LOG; TInt resourceId = KErrNotFound; - if ( MESMRCalEntry::EESMRCalEntryMeetingRequest == iEntry.Type() ) + 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 ( !iPolicy->IsDefaultCommand( EESMRCmdEdit ) ) + if ( !currentPolicy.IsDefaultCommand( EESMRCmdEdit ) ) { resourceId = R_MR_SELECT_SOFTKEY; // Disable middle softkey by default @@ -1790,215 +1766,205 @@ { resourceId = R_MR_EDIT_SOFTKEY; } - + } - else if ( iPolicy->IsDefaultCommand( EESMRCmdCalEntryUIEdit ) ) + 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, + 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 + iView->ReLayout(); + } + } + } + } + } + // --------------------------------------------------------------------------- -// CESMRViewerDialog::DigMailboxAndRemovePrefixL +// CESMRViewerDialog::ProcessCommandEventL // --------------------------------------------------------------------------- // -TPtrC CESMRViewerDialog::DigMailboxAndRemovePrefixL() - { - CCalUser* calUser = iEntry.Entry().PhoneOwnerL(); - TPtrC addrWithoutPrefix = calUser->Address(); - TInt pos = KErrNotFound; - - do - { - pos = addrWithoutPrefix.MatchF( KMailtoMatchPattern ); - if ( pos != KErrNotFound ) - { - addrWithoutPrefix.Set( addrWithoutPrefix.Mid( KMailtoLength ) ); - } - } - while ( pos != KErrNotFound ); - - return addrWithoutPrefix; - } - -// --------------------------------------------------------------------------- -// CESMRViewerDialog::OfferToolbarEventL -// --------------------------------------------------------------------------- -// -void CESMRViewerDialog::OfferToolbarEventL( TInt aCommand ) - { - ProcessCommandL( aCommand ); - } - -// --------------------------------------------------------------------------- -// CESMRViewerDialog::HandleNaviDecoratorEventL -// --------------------------------------------------------------------------- -// -void CESMRViewerDialog::HandleNaviDecoratorEventL( TInt aEventID ) +void CESMRViewerDialog::ProcessCommandEventL( const MESMRFieldEvent& aEvent ) { FUNC_LOG; - if ( iESMRNaviDecorator ) - { - iESMRNaviDecorator->SetNaviDecoratorObserver( NULL ); - } - if ( iIdleNaviEventRunner && !iIdleNaviEventRunner->IsActive() ) - { - if( aEventID == - MAknNaviDecoratorObserver::EAknNaviDecoratorEventRightTabArrow ) - { - iIdleNaviEventRunner->Start( - TCallBack( RunCmdMailNextMessageIdle, this ) ); - } - else - { - iIdleNaviEventRunner->Start( - TCallBack( RunCmdMailPreviousMessageIdle, this ) ); - } - } - } - + + TInt* command = static_cast< TInt* >( aEvent.Param( 0 ) ); -// --------------------------------------------------------------------------- -// CESMRViewerDialog::HandleSessionEventL -// --------------------------------------------------------------------------- -// -void CESMRViewerDialog::HandleSessionEventL( - TMsvSessionEvent /*aEvent*/, TAny* /*aArg1*/, - TAny* /*aArg2*/, TAny* /*aArg3*/ ) - { - FUNC_LOG; - } - - -// --------------------------------------------------------------------------- -// CESMRViewerDialog::RunCmdMailNextMessageIdle [static] -// --------------------------------------------------------------------------- -// -TInt CESMRViewerDialog::RunCmdMailNextMessageIdle( TAny* aObjPtr ) - { - CESMRViewerDialog* self = - reinterpret_cast( aObjPtr ); - if ( self ) + switch ( *command ) { - TRAP_IGNORE( self->ProcessCommandL( EESMRCmdMailNextMessage ) ); - } - return KErrNone; + 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::RunCmdMailPreviousMessageIdle [static] -// --------------------------------------------------------------------------- -// -TInt CESMRViewerDialog::RunCmdMailPreviousMessageIdle( TAny* aObjPtr ) - { - CESMRViewerDialog* self = - reinterpret_cast( aObjPtr ); - if ( self ) - { - TRAP_IGNORE( self->ProcessCommandL( EESMRCmdMailPreviousMessage ) ); - } - return KErrNone; - } - -// --------------------------------------------------------------------------- -// CESMRViewerDialog::MakeMrGuiToolbarButtonsL -// --------------------------------------------------------------------------- -// -void CESMRViewerDialog::MakeMrGuiToolbarButtonsL() - { - CAknToolbar* currentToolbar = static_cast( - iEikonEnv->AppUiFactory() )->CurrentFixedToolbar(); - if ( currentToolbar ) - { - iOldObserver = currentToolbar->ToolbarObserver(); - currentToolbar->SetToolbarObserver( this ); - - TBool setResponseButtons = EFalse; - if ( iEntry.Type() == MESMRCalEntry::EESMRCalEntryMeetingRequest ) - { - CCalEntry::TMethod method = iEntry.Entry().MethodL(); - if ( method != CCalEntry::EMethodCancel ) - { - setResponseButtons = ETrue; - } - } - - if ( setResponseButtons ) - { - SetResponseButtonsL( currentToolbar ); - } - else - { - SetEmptyButtonsL( currentToolbar ); - } - } - } - -// --------------------------------------------------------------------------- -// CESMRViewerDialog::ClearToolbarL +// CESMRViewerDialog::ProcessFieldEventL // --------------------------------------------------------------------------- // -void CESMRViewerDialog::ClearToolbarL() - { - if ( iClearToolbar ) - { - // creating empty toolbar buttons - CAknToolbar* currentToolbar = static_cast( - iEikonEnv->AppUiFactory() )->CurrentFixedToolbar(); - if ( currentToolbar ) - { - SetEmptyButtonsL( currentToolbar ); - } - } - } - -// --------------------------------------------------------------------------- -// CESMRViewerDialog::AccountIdL -// --------------------------------------------------------------------------- -// -TInt CESMRViewerDialog::AccountIdL( const TFSMailMsgId& aMailboxId ) +void CESMRViewerDialog::ProcessFieldEventL( const MESMRFieldEvent& aEvent ) { - FUNC_LOG; - - CMsvSession* msvSession = CMsvSession::OpenSyncL( *this ); - CleanupStack::PushL( msvSession ); - CMsvEntry* rootEntry = msvSession->GetEntryL( KMsvRootIndexEntryIdValue ); - CleanupStack::PushL( rootEntry ); - - rootEntry->SetSortTypeL( - TMsvSelectionOrdering( KMsvNoGrouping, EMsvSortByNone, ETrue ) ); - - TInt accountId = 0; - TBool found = EFalse; - const TInt count = rootEntry->Count(); - for ( TInt ii = 0; ii < count && !found; ++ii ) - { - const TMsvEntry& entry = (*rootEntry)[ii]; - if ( entry.iType == KUidMsvServiceEntry ) - { - if ( entry.iMtmData1 == aMailboxId.PluginId().iUid && - entry.iMtmData2 == aMailboxId.Id() ) - { - accountId = entry.Id(); - found = ETrue; - } - } - } - - if ( !found ) - { - User::Leave( KErrNotFound ); - } - - CleanupStack::PopAndDestroy( rootEntry ); - CleanupStack::PopAndDestroy( msvSession ); - return accountId; + FUNC_LOG; + iView->ProcessEventL( aEvent ); } + +// EOF