diff -r 0396474f30f5 -r 4ce476e64c59 meetingrequest/mrgui/src/cesmreditordialog.cpp --- a/meetingrequest/mrgui/src/cesmreditordialog.cpp Mon Mar 15 12:39:10 2010 +0200 +++ b/meetingrequest/mrgui/src/cesmreditordialog.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,41 +15,7 @@ * */ -#include "emailtrace.h" #include "cesmreditordialog.h" - -// -#include "esmrdef.h" -#include -#include "cesmrpolicy.h" -// -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -// -#include -// -#include "esmrcommands.h" -// - -#include -#include -#include - #include "esmrgui.hrh" #include "cesmrview.h" #include "mesmrmeetingrequestentry.h" @@ -68,8 +34,41 @@ #include "cesmraddressinfohandler.h" #include "cesmrfeaturesettings.h" #include "mesmrfieldevent.h" +#include "esmrconfig.hrh" +#include "esmrdef.h" +#include "esmrcommands.h" +#include "cesmrpolicy.h" +#include "cmrtoolbar.h" +#include "mmrpolicyprovider.h" +#include "mmrinfoprovider.h" +#include "cesmrcaldbmgr.h" +#include "cmrfocusstrategyeditor.h" +#include "cesmrfieldbuilderinterface.h" -#include "esmrconfig.hrh" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// DEBUG +#include "emailtrace.h" // Removed profiling. @@ -77,7 +76,6 @@ namespace { // codescanner::namespace #ifdef _DEBUG - _LIT( KESMREditDlgPanicTxt, "ESMREDITORDIALOG" ); /** Enumeration for panic codes */ enum TESMREditDlgPanicCode { @@ -88,6 +86,7 @@ void Panic( TESMREditDlgPanicCode aPanic ) { + _LIT( KESMREditDlgPanicTxt, "ESMREDITORDIALOG" ); User::Panic ( KESMREditDlgPanicTxt, aPanic ); } #endif @@ -137,36 +136,8 @@ } else { - 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(EESMREditDlgInvalidSeriesResult)); - break; - } + aEntry.SetModifyingRuleL( + MESMRMeetingRequestEntry::EESMRThisOnly ); } } @@ -174,13 +145,13 @@ * Creates correct type of storage for editing calendar entry. * @param aCommandObserver Reference to command observer * @param aEntry Reference to ES calendar entry - * @param aPolicy. Pointer to used policy. + * @param aPolicyProvider. Pointer to used policy. * @param aResponseObserver Pointer to response observer. */ CESMRFieldStorage* CreateCorrectStorageLC( MESMRFieldEventObserver& aEventObserver, MESMRCalEntry& aEntry, - CESMRPolicy* aPolicy, + const CESMRPolicy& aPolicy, MESMRResponseObserver* aResponseObserver ) { CESMRFieldStorage* storage = NULL; @@ -188,8 +159,7 @@ MESMRCalEntry::TESMRRecurrenceModifyingRule rule( aEntry.RecurrenceModRule() ); - TESMRViewMode mode( - aPolicy->ViewMode() ); + TESMRViewMode mode( aPolicy.ViewMode() ); if ( ( aEntry.IsRecurrentEventL() && rule == MESMRCalEntry::EESMRThisOnly ) || @@ -253,9 +223,10 @@ // --------------------------------------------------------------------------- // CESMREditorDialog::CESMREditorDialog( - MESMRCalEntry& aEntry, + MMRInfoProvider& aInfoProvider, MAgnEntryUiCallback& aCallback ) : - iEntry( aEntry), iCallback( aCallback) + iInfoProvider( aInfoProvider ), + iCallback( aCallback) { FUNC_LOG; // Do nothing @@ -268,18 +239,6 @@ CESMREditorDialog::~CESMREditorDialog( ) { FUNC_LOG; - if ( iFeatureManagerInitialized ) - { - FeatureManager::UnInitializeLib(); - } - - if ( iServiceHandler ) - { - iServiceHandler->DetachMenu ( - R_MR_EDITOR_ORGANIZER_MENU, - R_PS_AIW_INTEREST ); - delete iServiceHandler; - } delete iESMRSendUI; if ( iTitlePane ) @@ -288,14 +247,13 @@ iTitlePane->Rollback(); delete iTitlePane; } - delete iInterimUtils; - delete iLocationPluginHandler; - delete iAddressInfoHandler; - delete iFeatures; + delete iToolbar; + delete iFocusStrategy; + // iView is deleted by framework because it uses the // custom control mechanism. } @@ -305,15 +263,14 @@ // --------------------------------------------------------------------------- // EXPORT_C CESMREditorDialog* CESMREditorDialog::NewL( - CESMRPolicy* aPolicy, - MESMRCalEntry& aEntry, + MMRInfoProvider& aInfoProvider, MAgnEntryUiCallback& aCallback ) { FUNC_LOG; CESMREditorDialog* self = - new (ELeave) CESMREditorDialog( aEntry, aCallback ); + new (ELeave) CESMREditorDialog( aInfoProvider, aCallback ); CleanupStack::PushL( self ); - self->ConstructL( aPolicy ); + self->ConstructL(); CleanupStack::Pop( self ); return self; } @@ -322,31 +279,42 @@ // CESMREditorDialog::ConstructL // --------------------------------------------------------------------------- // -void CESMREditorDialog::ConstructL( - CESMRPolicy* aPolicy ) +void CESMREditorDialog::ConstructL() { FUNC_LOG; CAknDialog::ConstructL ( R_MREDITOR_MENUBAR ); - iPolicy = aPolicy; iESMRSendUI = CESMRSendUI::NewL (EESMRCmdSendAs ); - FeatureManager::InitializeLibL(); - iFeatureManagerInitialized = ETrue; + MESMRCalEntry* entry = iInfoProvider.EntryL(); + CESMRFieldStorage* storage = CreateCorrectStorageLC( + *this, + *entry, + iInfoProvider.PolicyProvider().CurrentPolicy(), + this ); - // remove custom feature KFeatureIdPrintingFrameworkCalendarPlugin - // + iStartTimeUtc = entry->Entry().StartTimeL().TimeUtcL(); - CESMRFieldStorage* storage = - CreateCorrectStorageLC( *this, iEntry, aPolicy, this ); + //clean previous toolbar if there is, and be sure restore toolbar area to EMainPane + iToolbar = CMRToolbar::NewL(); TRect clientRect; AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, clientRect ); + // Create focus strategy + iFocusStrategy = CMRFocusStrategyEditor::NewL( *storage ); + // storage ownership is transferred to CESMRView - iView = CESMRView::NewL( storage, iEntry, clientRect ); + iView = CESMRView::NewL( + storage, + *entry, + clientRect, + *iFocusStrategy, + *iToolbar ); + + iView->SetViewMode( EESMREditMR ); CleanupStack::Pop( storage ); // try to find subject field and set title pane observer @@ -366,62 +334,21 @@ { field->SetTitlePaneObserver( iView ); break; - } + } default: - break; + break; } } - TInt titleStringId = -1; - switch ( iEntry.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::EESMRCalEntryReminder: - break; - case MESMRCalEntry::EESMRCalEntryAnniversary: - titleStringId = R_QTN_CALENDAR_TITLE_ANNIVERSARY; - break; - default: - break; - } - if ( titleStringId != -1 ) - { - iTitlePane = CESMRTitlePaneHandler::NewL( *iEikonEnv ); - HBufC* titleText = StringLoader::LoadLC( titleStringId, iCoeEnv ); - iTitlePane->SetNewTitle( titleText ); - CleanupStack::PopAndDestroy( titleText ); - } - + SetTitleL(); + if(!iInterimUtils) { iInterimUtils = CCalenInterimUtils2::NewL(); } - + iFeatures = CESMRFeatureSettings::NewL(); - - if ( iFeatures->FeatureSupported( - CESMRFeatureSettings::EESMRUILocationFeatures ) ) - { - if ( iPolicy->FieldL( EESMRFieldLocation ).iFieldMode == EESMRFieldModeEdit ) - { - iMenuBar->SetContextMenuTitleResourceId( R_MR_EDITOR_CONTEXT_MENU ); - } - else - { - iMenuBar->SetContextMenuTitleResourceId( R_MR_VIEWER_CONTEXT_MENU ); - } - } + } // --------------------------------------------------------------------------- @@ -477,7 +404,7 @@ { FUNC_LOG; TBool res( EFalse ); - + MESMRCalEntry* entry = iInfoProvider.EntryL(); switch ( aButtonId ) { case EAknSoftkeyOptions: @@ -486,25 +413,53 @@ CAknDialog::DisplayMenuL(); break; } + case EAknSoftkeySend: + { + if ( MESMRCalEntry::EESMRCalEntryMeetingRequest == entry->Type() ) + { + MESMRMeetingRequestEntry* mrEntry = + static_cast( + iInfoProvider.EntryL() ); + + const CESMRPolicy& policy = Policy(); + if ( policy.IsDefaultCommand(EESMRCmdSendMRUpdate ) && + ( mrEntry->IsSentL() && mrEntry->IsStoredL() ) ) + { + ProcessCommandL( EESMRCmdSendMRUpdate ); + } + else + { + ProcessCommandL( EESMRCmdSendMR ); + } + } + break; + } case EESMRCmdSaveMR: { ProcessCommandL( EESMRCmdSaveMR ); break; } + case EESMREditorAddAttachment: + { + ProcessCommandL( EESMREditorAddAttachment ); + break; + } + + case EESMRCmdLongtapDetected: case EAknSoftkeyContextOptions: { - // Show context menu - if ( iFeatures->FeatureSupported( - CESMRFeatureSettings::EESMRUILocationFeatures ) ) + if( SetContextMenuL() ) { - iMenuBar->TryDisplayContextMenuBarL(); + ShowContextMenuL();; } - break; + break; } case EESMRCmdAlarmOn: case EESMRCmdAlarmOff: case EESMRCmdOpenPriorityQuery: case EESMRCmdOpenSyncQuery: + case EESMRCmdOpenUnifiedEditorQuery: + case EESMRCmdOpenMultiCalenSelectQuery: case EESMRCmdOpenRecurrenceQuery: case EESMRCmdOpenAlarmQuery: case EESMRCmdCheckEvent: @@ -533,7 +488,7 @@ { // Exit dialog TRAPD( err, HandleExitL() ) - + switch ( err ) { case KErrNone: @@ -581,19 +536,18 @@ FUNC_LOG; CAknDialog::ActivateL(); iView->InternalizeL(); - + // Notification that MR editor is ready to be shown on screen. - if ( iEntry.Type() == MESMRCalEntry::EESMRCalEntryMeetingRequest ) + MESMRCalEntry* entry = iInfoProvider.EntryL(); + if ( entry->Type() == MESMRCalEntry::EESMRCalEntryMeetingRequest ) { - TTime start = iEntry.Entry().StartTimeL().TimeUtcL(); - TTime now; - now.UniversalTime(); - if ( start < now ) - { - iOccursInPast = ETrue; - } iCallback.ProcessCommandL( EESMRCmdEditorInitializationComplete ); } + + // initial stripe color + MESMRCalDbMgr& dbMgr = entry->GetDBMgr(); + TPtrC calenName = dbMgr.GetCalendarNameByEntryL( *entry ); + dbMgr.SetCurCalendarByNameL( calenName ); } // --------------------------------------------------------------------------- @@ -605,16 +559,16 @@ FUNC_LOG; TBool ret(ETrue); - - if ( ( iEntry.Type() == MESMRCalEntry::EESMRCalEntryMeetingRequest || - iEntry.Type() == MESMRCalEntry::EESMRCalEntryMeeting ) && - iEntry.IsStoredL() && iEntry.IsRecurrentEventL() && - MESMRCalEntry::EESMRAllInSeries == iEntry.RecurrenceModRule() ) + MESMRCalEntry* entry = iInfoProvider.EntryL(); + if ( ( entry->Type() == MESMRCalEntry::EESMRCalEntryMeetingRequest || + entry->Type() == MESMRCalEntry::EESMRCalEntryMeeting ) && + entry->IsStoredL() && entry->IsRecurrentEventL() && + MESMRCalEntry::EESMRAllInSeries == entry->RecurrenceModRule() ) { TDateTime originalDate = - iEntry.OriginalEntry().StartTimeL().TimeLocalL().DateTime(); + entry->OriginalEntry().StartTimeL().TimeLocalL().DateTime(); TDateTime modifiedDate = - iEntry.Entry().StartTimeL().TimeLocalL().DateTime(); + entry->Entry().StartTimeL().TimeLocalL().DateTime(); if ( !IsSameDay( originalDate, modifiedDate ) ) { @@ -640,11 +594,10 @@ TRAPD( err, DoProcessCommandL( aCommand ) ); if ( err != KErrNone && err != KErrCancel && - err != KErrArgument&& - err !=EESMRCmdSendMR) + err != KErrArgument ) { User::Leave(err); - } + } } // --------------------------------------------------------------------------- @@ -657,27 +610,10 @@ FUNC_LOG; CAknDialog::ProcessCommandL ( aCommand ); + MESMRCalEntry* entry = iInfoProvider.EntryL(); + switch ( aCommand ) { - case EESMRCmdPrint: //Fall through - case EESMRCmdPrint_Reserved1: //Fall through - case EESMRCmdPrint_Reserved2: //Fall through - case EESMRCmdPrint_Reserved3: //Fall through - case EESMRCmdPrint_Reserved4: - { - iView->ExternalizeL(); // no force validation - TInt res(KErrGeneral); - res = iCallback.ProcessCommandWithResultL ( EESMRCmdSaveMR ); - - if (res == KErrNone ) - { - this->MakeVisible(EFalse); - HandlePrintCommandL (aCommand ); - this->MakeVisible(ETrue); - } - break; - } - case EESMRCmdSendAs: { SendCalendarEntryL (aCommand ); @@ -687,37 +623,38 @@ case EESMRCmdCalEntryUISend: { User::LeaveIfError( - iCallback.ProcessCommandWithResultL ( aCommand )); - break; - } - case EESMRCmdCalEntryUIDelete: - { - iView->ExternalizeL(); // no force validation - if (!(iCallback.ProcessCommandWithResultL(aCommand) == KErrCancel)) - { - TryExitL( EESMRCmdCalEntryUIDelete ); - } + iCallback.ProcessCommandWithResultL ( aCommand )); break; } case EESMRCmdCalEntryUIAddParticipants: { - iView->ExternalizeL (); // no force validation - TInt result; - TRAPD(err,result=iCallback.ProcessCommandWithResultL ( aCommand )) - if (err != EESMRCmdSendMR&&err!=KErrNone) - { - User::Leave(err); - } - User::LeaveIfError(result); - TryExitL ( EESMRCmdForceExit ); + TRAPD( err, SwitchEntryTypeL( EMRCommandSwitchToMR, ETrue ) ) + + if (KErrArgument == err ) + { + // There was validation error --> Just show the + // existing editor. + err = KErrNone; + } + else if ( err ) + { + iCoeEnv->HandleError( err ); + TryExitL( EESMRCmdForceExit ); + } + + break; + } + case EAknSoftkeyClose: + { + TryExitL ( EAknCmdExit ); break; } case EEikBidCancel: //Fall through case EAknCmdExit: - { + { TryExitL ( aCommand ); break; - } + } case EAknCmdHelp: { iView->LaunchEditorHelpL ( ); @@ -749,27 +686,31 @@ if ( iFeatures->FeatureSupported( CESMRFeatureSettings::EESMRUIPreviousLocationsList ) ) { - LocationPluginHandlerL().StoreLocationToHistoryL( iEntry ); + LocationPluginHandlerL().StoreLocationToHistoryL( *entry ); } - - if ( iEntry.Type() == MESMRCalEntry::EESMRCalEntryTodo ) + + if ( entry->Type() == MESMRCalEntry::EESMRCalEntryTodo ) { CESMRGlobalNote* note = - CESMRGlobalNote::NewL( - CESMRGlobalNote::EESMRTodoEntrySaved ); + CESMRGlobalNote::NewL( + CESMRGlobalNote::EESMRTodoEntrySaved ); note->ExecuteLD(); } else { CESMRGlobalNote* note = - CESMRGlobalNote::NewL( - CESMRGlobalNote::EESMREntrySaved ); + CESMRGlobalNote::NewL( + CESMRGlobalNote::EESMREntrySaved ); note->ExecuteLD(); } } } break; - + case EESMRCmdSaveCloseMR: + { + TryExitL( EAknSoftkeyDone ); + break; + } case EESMRCmdSendMR: //Fall through case EESMRCmdSendMRUpdate: { @@ -785,9 +726,9 @@ if ( iFeatures->FeatureSupported( CESMRFeatureSettings::EESMRUIPreviousLocationsList ) ) { - LocationPluginHandlerL().StoreLocationToHistoryL( iEntry ); + LocationPluginHandlerL().StoreLocationToHistoryL( *entry ); } - + TInt exitCode = aCommand == EESMRCmdDeleteMR ? EESMRCmdDeleteMR : EAknSoftkeyDone; TryExitL ( exitCode ); @@ -796,59 +737,69 @@ break; case EESMRCmdDeleteMR: + case EESMRCmdCalEntryUIDelete: { - if ( iEntry.Type () == MESMRCalEntry::EESMRCalEntryMeetingRequest ) - { - TBool okToDelete = ETrue; + TBool okToDelete = ETrue; - if ( iEntry.IsRecurrentEventL() ) + if ( entry->IsRecurrentEventL() ) + { + SetRecurrenceModRuleL( + *entry, + CESMRListQuery::EESMRDeleteThisOccurenceOrSeriesQuery ); + } + else + { + if( CCalenInterimUtils2::IsMeetingRequestL( entry->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 + if( entry->IsStoredL() ) { - // When deleting we do not need to externalize entry TInt res = iCallback.ProcessCommandWithResultL( aCommand ); if ( res != KErrCancel ) { - TInt exitCode = aCommand == EESMRCmdDeleteMR ? - EESMRCmdDeleteMR : EAknSoftkeyDone; - TryExitL ( exitCode ); + TryExitL( EESMRCmdDeleteMR ); } } + else + { + TryExitL( EESMRCmdDeleteMR ); + } } } break; - + case EESMRCmdAssignFromMap: case EESMRCmdLandmarks: case EESMRCmdPreviousLocations: - { + { if ( iFeatures->FeatureSupported( CESMRFeatureSettings::EESMRUIMnFwIntegration | CESMRFeatureSettings::EESMRUILandmarksIntegration | CESMRFeatureSettings::EESMRUIPreviousLocationsList ) ) { TBool ignoreQuery = EFalse; - + if ( aCommand == EESMRCmdAssignFromMap ) { - HBufC* oldLocation = iEntry.Entry().LocationL().AllocLC(); + HBufC* oldLocation = entry->Entry().LocationL().AllocLC(); iView->ExternalizeL(); - + // if old and new locations are different and old location // exists, the user is updating existing location. Let's discard // the existing coordinates by using command EESMRCmdUpdateFromMap - if ( ( iEntry.Entry().LocationL().Compare( *oldLocation ) != 0 + if ( ( entry->Entry().LocationL().Compare( *oldLocation ) != 0 && oldLocation->Length() != 0 ) || iLocationModified ) { @@ -857,7 +808,7 @@ else if ( oldLocation->Length() == 0 ) { // Assigning location from Maps for first time. - ignoreQuery = EFalse; + ignoreQuery = EFalse; } CleanupStack::PopAndDestroy( oldLocation ); oldLocation = NULL; @@ -866,41 +817,73 @@ { iView->ExternalizeL(); } - + iLocationModified |= LocationPluginHandlerL().HandleCommandL( aCommand, - iEntry, - ignoreQuery ); + *entry, + ignoreQuery ); iView->InternalizeL(); iView->SetControlFocusedL( EESMRFieldLocation ); } - break; - } + break; + } case EESMRCmdSearchFromContacts: - { + { if ( iFeatures->FeatureSupported( CESMRFeatureSettings::EESMRUIContactsIntegration ) ) { iView->ExternalizeL(); iLocationModified |= - AddressInfoHandlerL().SearchAddressFromContactsL( iEntry ); + AddressInfoHandlerL().SearchAddressFromContactsL( *entry ); iView->InternalizeL(); iView->SetControlFocusedL( EESMRFieldLocation ); } - break; - } + break; + } // Scenarios with viewer location field in editor dialog. case EESMRCmdShowOnMap: case EESMRCmdSearchFromMap: { - LocationPluginHandlerL().HandleCommandL(aCommand, iEntry ); + if ( iFeatures->FeatureSupported( + CESMRFeatureSettings::EESMRUIMnFwIntegration ) ) + { + LocationPluginHandlerL().HandleCommandL(aCommand, *entry ); + } break; - } + } case EAknCmdOpen: - { - HandleOpenCmdL(); - break; - } + { + HandleOpenCmdL(); + break; + } + case EESMRCmdAttendeeInsertContact: + { + OkToExitL(EESMRCmdAttendeeInsertContact); + break; + } + /* + * Attachment field editor context menu commands + */ + case EESMREditorOpenAttachment: + case EESMREditorRemoveAttachment: + case EESMREditorRemoveAllAttachments: + case EESMREditorAddAttachment: + { + iView->ProcessEditorCommandL( aCommand ); + break; + } + + case EMRCommandMyLocations: + { + iView->ExternalizeL(); + iLocationModified |= + LocationPluginHandlerL().HandleCommandL( aCommand, + *entry, + EFalse ); + iView->InternalizeL(); + iView->SetControlFocusedL( EESMRFieldLocation ); + break; + } default: break; } @@ -915,77 +898,80 @@ CEikMenuPane* aMenu ) { FUNC_LOG; + MESMRCalEntry* entry = iInfoProvider.EntryL(); - if ( iServiceHandler && iServiceHandler->HandleSubmenuL ( *aMenu ) ) - { - return; - } + TMRMenuStyle menuStyle( EMROptionsMenu ); if ( aResourceId == R_MR_EDITOR_ORGANIZER_MENU ) { - - if ( FeatureManager::FeatureSupported( KFeatureIdFfCmailIntegration ) ) - { - // remove help support in pf5250 - aMenu->SetItemDimmed( EAknCmdHelp, ETrue); - } - + const CESMRPolicy& policy = Policy(); const TInt count(aMenu->NumberOfItemsInPane()); - for (TInt i(0); i < count; i++ ) - { - CEikMenuPaneItem::SData& item = aMenu->ItemDataByIndexL ( i ); - aMenu->SetItemDimmed ( - item.iCommandId, - !iPolicy->IsDefaultCommand(item.iCommandId) ); - } - - //Open command - if ( iView->IsComponentFocused( EESMRFieldSync ) || - iView->IsComponentFocused( EESMRFieldRecurrence ) || - iView->IsComponentFocused( EESMRFieldAlarm ) || - iView->IsComponentFocused( EESMRFieldPriority )) - { - aMenu->SetItemDimmed( EAknCmdOpen, EFalse ); - } - - if( iInterimUtils && !(iInterimUtils->MRViewersEnabledL())) - { - aMenu->SetItemDimmed( EESMRCmdCalEntryUIAddParticipants, ETrue ); - } - - // if the entry is saved (stored) and sent to recipients, - // show 'Send update', otherwise just 'Send' - TBool sentAndStored = iEntry.IsSentL() && iEntry.IsStoredL(); + for ( TInt i(0); i < count; i++ ) + { + CEikMenuPaneItem::SData& item = aMenu->ItemDataByIndexL ( i ); - // enable send only if attendee editors contain attendees and - // entry does not occur in past (unless if this is forwarded - // MR in which case the "in past" sending is also allowed). - TBool occurredInPastCheckPassed( !iOccursInPast ); - if ( MESMRCalEntry::EESMRCalEntryMeetingRequest == iEntry.Type() ) + if ( item.iCommandId ) + { + // Checking from policy for commands that has valid command id and + aMenu->SetItemDimmed ( + item.iCommandId, + !policy.IsDefaultCommand(item.iCommandId) ); + } + } + + //Open command + if ( iView->IsComponentFocused( EESMRFieldSync ) || + iView->IsComponentFocused( EESMRFieldRecurrence ) || + iView->IsComponentFocused( EESMRFieldAlarm ) || + iView->IsComponentFocused( EESMRFieldPriority )) { - // This is meeting request - MESMRMeetingRequestEntry* mrEntry = - static_cast( &iEntry ); - occurredInPastCheckPassed = mrEntry->IsForwardedL(); + aMenu->SetItemDimmed( EAknCmdOpen, EFalse ); } - TBool sendEnabled = - ( iRequiredAttendeesEnabled | iOptionalAttendeesEnabled ) && - occurredInPastCheckPassed; + if( iInterimUtils && !(iInterimUtils->MRViewersEnabledL())) + { + aMenu->SetItemDimmed( EESMRCmdCalEntryUIAddParticipants, ETrue ); + } - if ( iPolicy->IsDefaultCommand( EESMRCmdSendMR ) ) + + TBool sendEnabled( EFalse ); + TBool sentAndStored( EFalse ); + + if ( MESMRCalEntry::EESMRCalEntryMeetingRequest == entry->Type() ) + { + MESMRMeetingRequestEntry* mrEntry = + static_cast( iInfoProvider.EntryL() ); + + // if the entry is saved (stored) and sent to recipients, + // show 'Send update', otherwise just 'Send' + sentAndStored = mrEntry->IsSentL() && mrEntry->IsStoredL(); + + // enable send only if attendee editors contain attendees and + // entry does not occur in past. + TBool bOccursInPast( OccursInPast( iStartTimeUtc ) ); + + TBool sendEnabled = ( !bOccursInPast && + ( mrEntry->RoleL() == EESMRRoleOrganizer ) && + ( iRequiredAttendeesEnabled | iOptionalAttendeesEnabled ) && + ((( mrEntry->RoleL() == EESMRRoleOrganizer ) && + ( iInfoProvider.PolicyProvider().CurrentPolicy().ViewMode() == EESMREditMR )) || + ( iInfoProvider.PolicyProvider().CurrentPolicy().ViewMode() == EESMRForwardMR ) + )); + } + + if ( policy.IsDefaultCommand( EESMRCmdSendMR ) ) { aMenu->SetItemDimmed ( EESMRCmdSendMR, !sendEnabled ); } - if ( iPolicy->IsDefaultCommand(EESMRCmdSendMRUpdate ) ) + if ( policy.IsDefaultCommand(EESMRCmdSendMRUpdate ) ) { if ( sendEnabled ) { - //EESMRCmdSendMRUpdate and EESMRCmdSendMR shouldn't + //EESMRCmdSendMRUpdate and EESMRCmdSendMR shouldn't //be visible at the same time aMenu->SetItemDimmed( EESMRCmdSendMRUpdate, !sentAndStored ); - if(iPolicy->IsDefaultCommand( EESMRCmdSendMR ) ) + if( policy.IsDefaultCommand( EESMRCmdSendMR ) ) { aMenu->SetItemDimmed( EESMRCmdSendMR, sentAndStored ); } @@ -996,12 +982,22 @@ } } - if(iPolicy->IsDefaultCommand( EESMRCmdViewTrack ) ) + if ( policy.IsDefaultCommand( EESMRCmdAddOptAttendee ) ) + { + // if optional attendee (recipient) is already visible, don't show + // the menu item. + TBool isVisible = + iView->IsControlVisible( EESMRFieldOptAttendee ); + aMenu->SetItemDimmed( EESMRCmdAddOptAttendee, isVisible ); + } + + if ( policy.IsDefaultCommand( EESMRCmdViewTrack ) ) { //only show tracking view option when item is sent, stored //and when cfsmailbox actually supports attendee status - if (SupportsAttendeeStatusL()) + if ( SupportsMailBoxCapabilityL( + MESMRBuilderExtension::EMRCFSAttendeeStatus ) ) { aMenu->SetItemDimmed( EESMRCmdViewTrack, !sentAndStored ); } @@ -1009,84 +1005,65 @@ { aMenu->SetItemDimmed( EESMRCmdViewTrack, ETrue ); } - - } - - if ( iPolicy->IsDefaultCommand( EESMRCmdAddOptAttendee ) ) - { - // if optional attendee (recipient) is already visible, don't show - // the menu item. - TBool isVisible = - iView->IsComponentVisible( EESMRFieldOptAttendee ); - aMenu->SetItemDimmed( EESMRCmdAddOptAttendee, isVisible ); } // Insert send ui menu for all other entry types than meeting request - if ( iEntry.Type ( )!= MESMRCalEntry::EESMRCalEntryMeetingRequest ) + if ( entry->Type ( )!= MESMRCalEntry::EESMRCalEntryMeetingRequest ) { TryInsertSendMenuL( aMenu ); } + } - if ( FeatureManager::FeatureSupported( - KFeatureIdPrintingFrameworkCalendarPlugin ) ) - { - // Initiliaze menu - iServiceHandler->InitializeMenuPaneL( - *aMenu, - aResourceId, - EESMRCmdPrint, - iServiceHandler->InParamListL() ); - } - else - { - aMenu->SetItemDimmed( EESMRCmdPrint, ETrue ); - } - - HandleLocationOptionsL( aResourceId, aMenu ); - } - if ( aResourceId == R_LOCATION_OPTIONS || aResourceId == R_MR_EDITOR_LOCATION_MENU || aResourceId == R_MR_VIEWER_LOCATION_MENU ) { + menuStyle = EMRContextMenu; HandleLocationOptionsL( aResourceId, aMenu ); } + if ( aResourceId == R_MR_EDITOR_ATTACHMENT_CONTEXT_MENU + || aResourceId == R_MR_EDITOR_ATTENDEE_CONTEXT_MENU ) + { + menuStyle = EMRContextMenu; + } + + // Field specific context menu + iView->DynInitMenuPaneL( menuStyle, aResourceId, aMenu ); } // --------------------------------------------------------------------------- // CESMREditorDialog::SupportsAttendeeStatusL // --------------------------------------------------------------------------- // -TBool CESMREditorDialog::SupportsAttendeeStatusL( ) +TBool CESMREditorDialog::SupportsMailBoxCapabilityL( + MESMRBuilderExtension::TMRCFSMailBoxCapability aCapa ) { FUNC_LOG; - TBool supportsAttendeeStatus(EFalse); + TBool supportsCapability( EFalse ); CESMRFieldBuilderInterface* plugin = NULL; - TRAPD( error, - plugin = CESMRFieldBuilderInterface::CreatePluginL( - TUid::Uid(KESMRUIFieldBuilderPluginImplUId) ) ); + TRAPD( error, + plugin = CESMRFieldBuilderInterface::CreatePluginL( + TUid::Uid( KESMRUIFieldBuilderPluginImplUId ) ) ); CleanupStack::PushL( plugin ); - - if (error == KErrNone && plugin) + + if ( error == KErrNone && plugin ) { TUid uid = {0}; - MESMRBuilderExtension* extension = - static_cast( plugin->ExtensionL(uid) ); + MESMRBuilderExtension* extension = + static_cast( plugin->ExtensionL( uid ) ); - if (extension) + if ( extension ) { - supportsAttendeeStatus = - extension->CFSMailBoxCapabilityL( - MESMRBuilderExtension::EMRCFSAttendeeStatus); + supportsCapability = + extension->CFSMailBoxCapabilityL( aCapa ); } } CleanupStack::PopAndDestroy( plugin ); - return supportsAttendeeStatus; + return supportsCapability; } - // --------------------------------------------------------------------------- // CESMREditorDialog::ExecuteViewLD // --------------------------------------------------------------------------- @@ -1134,28 +1111,39 @@ { FUNC_LOG; TInt res( KErrNone); - + iView->ExternalizeL(); // no force validation - TBool isStored = iEntry.IsStoredL(); + + // If no attendees, switch MR to regular meeting + VerifyMeetingRequestL(); - if ( iEntry.IsEntryEditedL() ) + // Get the entry to be confirmed for saving + MESMRCalEntry* entry = iInfoProvider.EntryL(); + + // if entry is stored and type changed, we will always save it + if( entry->IsStoredL() && entry->IsEntryTypeChangedL() ) { - if ( IsAllowedToSaveL() ) + res = TryToSaveEntryL(); + } + // If entry is new and type changed, we have to see, if something has + // changed, before we save it. + else if( !entry->IsStoredL() && entry->IsEntryTypeChangedL() ) + { + if( entry->IsEntryEditedL() ) { - res = iCallback.ProcessCommandWithResultL( EESMRCmdSaveMR ); - - if ( res == KErrNone - && iFeatures->FeatureSupported( - CESMRFeatureSettings::EESMRUIPreviousLocationsList ) ) - { - LocationPluginHandlerL().StoreLocationToHistoryL( iEntry ); - } - } - else - { - res = KErrCancel; + res = TryToSaveEntryL(); } } + // Entry is not type changed, we will use normal procedure to + // see if entry will be saved or not. + else + { + if( entry->IsEntryEditedL() ) + { + res = TryToSaveEntryL(); + } + } + return res; } @@ -1166,27 +1154,36 @@ TInt CESMREditorDialog::HandleForcedExitL( TBool aShowConfirmationQuery ) // codescanner::intleaves { FUNC_LOG; + + MESMRCalEntry* entry = iInfoProvider.EntryL(); + TInt res( KErrNone); iView->ExternalizeL ( ETrue ); // force validation should be used - if ( iEntry.IsEntryEditedL() && - iEntry.Type() == MESMRCalEntry::EESMRCalEntryMeetingRequest) + // If no attendees, switch MR to regular meeting + VerifyMeetingRequestL(); + + // The entry data may be changed by the above function VerifyMeetingRequestL() + entry = iInfoProvider.EntryL(); + + if ( entry->IsEntryEditedL() ) { if ( !aShowConfirmationQuery || CESMRConfirmationQuery::ExecuteL( - CESMRConfirmationQuery::EESMRSaveChanges )) + CESMRConfirmationQuery::EESMRSaveChanges )) { res = iCallback.ProcessCommandWithResultL( EESMRCmdSaveMR ); - + if ( res == KErrNone && iFeatures->FeatureSupported( CESMRFeatureSettings::EESMRUIPreviousLocationsList ) ) { - LocationPluginHandlerL().StoreLocationToHistoryL( iEntry ); + LocationPluginHandlerL().StoreLocationToHistoryL( *entry ); } } } + return res; } @@ -1198,6 +1195,9 @@ TInt aCommandId ) { FUNC_LOG; + + MESMRCalEntry* entry = iInfoProvider.EntryL(); + iView->ExternalizeL(); // no force validation TInt res(KErrGeneral); res = iCallback.ProcessCommandWithResultL( EESMRCmdSaveMR ); @@ -1207,21 +1207,21 @@ if ( iFeatures->FeatureSupported( CESMRFeatureSettings::EESMRUIPreviousLocationsList ) ) { - LocationPluginHandlerL().StoreLocationToHistoryL( iEntry ); + LocationPluginHandlerL().StoreLocationToHistoryL( *entry ); } - + // 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, + // 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 ( ) ); + iESMRSendUI->SendAsVCalendarL( aCommandId, entry->Entry ( ) ); } } } @@ -1246,50 +1246,14 @@ } // --------------------------------------------------------------------------- -// CESMREditorDialog::HandlePrintCommandL -// --------------------------------------------------------------------------- -// -void CESMREditorDialog::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 ); - } - -// --------------------------------------------------------------------------- // CESMREditorDialog::HandleOpenCmdL // --------------------------------------------------------------------------- // void CESMREditorDialog::HandleOpenCmdL() - { + { FUNC_LOG; - iView->ProcessEditorCommandL( EAknCmdOpen ); - } + iView->ProcessEditorCommandL( EAknCmdOpen ); + } // --------------------------------------------------------------------------- // CESMREditorDialog::HandleLocationOptionsL @@ -1299,184 +1263,34 @@ CEikMenuPane* aMenuPane ) { FUNC_LOG; - TInt menuPos = KErrNotFound; - - if ( aResourceId == R_MR_EDITOR_ORGANIZER_MENU ) - { - - if ( FeatureManager::FeatureSupported( KFeatureIdFfCmailIntegration ) ) - { - // remove help support in pf5250 - aMenuPane->SetItemDimmed( EAknCmdHelp, ETrue); - } - - if ( iPolicy->FieldL( EESMRFieldLocation ).iFieldMode == EESMRFieldModeView ) - { - // Dim Location cascade menu with viewer field - aMenuPane->SetItemDimmed( EESMRCmdAddLocation, ETrue ); - - if ( iFeatures->FeatureSupported( - CESMRFeatureSettings::EESMRUIMnFwIntegration ) ) - { - TBool showOnMap = - LocationPluginHandlerL().IsCommandAvailableL( EESMRCmdShowOnMap, - iEntry ); - aMenuPane->SetItemDimmed( EESMRCmdShowOnMap, !showOnMap ); - aMenuPane->SetItemDimmed( EESMRCmdSearchFromMap, showOnMap ); - } - } - else if ( aMenuPane->MenuItemExists( EESMRCmdAddLocation, menuPos ) ) - { - TInt numOptions = 0; // number of sub menu items - TInt commandId = 0; // command id if only one sub menu item - - if ( iFeatures->FeatureSupported( - CESMRFeatureSettings::EESMRUIMnFwIntegration ) ) - { - ++numOptions; - commandId = EESMRCmdAssignFromMap; - } - - if ( iFeatures->FeatureSupported( - CESMRFeatureSettings::EESMRUIContactsIntegration ) ) - { - ++numOptions; - commandId = EESMRCmdSearchFromContacts; - } - - if ( iFeatures->FeatureSupported( - CESMRFeatureSettings::EESMRUILandmarksIntegration) ) - { - ++numOptions; - commandId = EESMRCmdLandmarks; - } - - if ( iFeatures->FeatureSupported( - CESMRFeatureSettings::EESMRUIPreviousLocationsList ) ) - { - ++numOptions; - commandId = EESMRCmdPreviousLocations; - } - - - - if ( numOptions == 0 ) - { - // Delete whole sub menu - aMenuPane->DeleteMenuItem( EESMRCmdAddLocation ); - } - else if ( numOptions == 1 ) - { - // Replace submenu with available command - aMenuPane->DeleteMenuItem( EESMRCmdAddLocation ); - - // Insert new menu item - HBufC* text = LoadOptionsMenuTextLC( commandId ); - CEikMenuPaneItem::SData menuItem; - menuItem.iCommandId = commandId; - menuItem.iCascadeId = 0; - menuItem.iFlags = 0; - menuItem.iText = *text; - CleanupStack::PopAndDestroy( text ); - aMenuPane->InsertMenuItemL( menuItem, menuPos ); - } - } - else if ( aMenuPane->MenuItemExists( EESMRCmdPreviousLocations, menuPos ) - && !LocationPluginHandlerL().IsCommandAvailableL( - EESMRCmdPreviousLocations, iEntry ) ) - { - // No items in location history. Dim item. - aMenuPane->SetItemDimmed( EESMRCmdPreviousLocations, ETrue ); - } - } - - if ( aResourceId == R_LOCATION_OPTIONS - || aResourceId == R_MR_EDITOR_LOCATION_MENU ) - { - TBool assignFromMap = iFeatures->FeatureSupported( - CESMRFeatureSettings::EESMRUIMnFwIntegration ); - aMenuPane->SetItemDimmed( EESMRCmdAssignFromMap, !assignFromMap ); - - TBool searchFromContacts = iFeatures->FeatureSupported( - CESMRFeatureSettings::EESMRUIContactsIntegration ); - aMenuPane->SetItemDimmed( EESMRCmdSearchFromContacts, - !searchFromContacts ); - - TBool landmarks = iFeatures->FeatureSupported( - CESMRFeatureSettings::EESMRUILandmarksIntegration ); - aMenuPane->SetItemDimmed( EESMRCmdLandmarks, - !landmarks ); - - TBool previousLocations = iFeatures->FeatureSupported( - CESMRFeatureSettings::EESMRUIPreviousLocationsList ); - if ( previousLocations - && !LocationPluginHandlerL().IsCommandAvailableL( - EESMRCmdPreviousLocations, iEntry ) ) - { - // No items in history. Dim option. - previousLocations = EFalse; - } - aMenuPane->SetItemDimmed( EESMRCmdPreviousLocations, - !previousLocations ); - } - + + MESMRCalEntry* entry = iInfoProvider.EntryL(); + if ( aResourceId == R_MR_VIEWER_LOCATION_MENU ) { - 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 ) ); - } - } + TBool showOnMap = EFalse; + TBool searchFromMap = EFalse; + + if ( iFeatures->FeatureSupported( + CESMRFeatureSettings::EESMRUIMnFwIntegration ) ) + { + showOnMap = LocationPluginHandlerL().IsCommandAvailableL( + EESMRCmdShowOnMap, + *entry ); + searchFromMap = !showOnMap; + } -// --------------------------------------------------------------------------- -// CESMREditorDialog::LoadOptionsMenuTextLC -// --------------------------------------------------------------------------- -// -HBufC* CESMREditorDialog::LoadOptionsMenuTextLC( TInt aCommandId ) - { - FUNC_LOG; - TInt resourceId = 0; - - switch ( aCommandId ) - { - case EESMRCmdAssignFromMap: - { - resourceId = R_MEET_REQ_OPTIONS_ASSIGN_FROM_MAP; - break; - } - case EESMRCmdSearchFromContacts: - { - resourceId = R_MEET_REQ_OPTIONS_SEARCH_FROM_CONTACTS; - break; - } - case EESMRCmdPreviousLocations: - { - resourceId = R_MEET_REQ_OPTIONS_PREVIOUS_LOCATIONS; - break; - } - case EESMRCmdLandmarks: - { - resourceId = R_MEET_REQ_OPTIONS_LANDMARKS; - break; - } - default: - { - User::Leave( KErrArgument ); - } + aMenuPane->SetItemDimmed( EESMRCmdShowOnMap, !showOnMap ); + aMenuPane->SetItemDimmed( EESMRCmdSearchFromMap, !searchFromMap ); + + const CESMRPolicy& policy = Policy(); + aMenuPane->SetItemDimmed( EESMRCmdEdit, + !policy.IsDefaultCommand( EESMRCmdEdit ) ); + aMenuPane->SetItemDimmed( EESMRCmdEditLocal, + !policy.IsDefaultCommand( EESMRCmdEditLocal ) ); + aMenuPane->SetItemDimmed( EESMRCmdCalEntryUIEdit, + !policy.IsDefaultCommand( EESMRCmdCalEntryUIEdit ) ); } - - HBufC* text = StringLoader::LoadLC( resourceId, iCoeEnv ); - return text; } // --------------------------------------------------------------------------- @@ -1490,10 +1304,10 @@ { iLocationPluginHandler = CESMRLocationPluginHandler::NewL( *this ); } - + return *iLocationPluginHandler; } - + // --------------------------------------------------------------------------- // CESMREditorDialog::AddressInfoHandlerL // --------------------------------------------------------------------------- @@ -1505,7 +1319,7 @@ { iAddressInfoHandler = CESMRAddressInfoHandler::NewL(); } - + return *iAddressInfoHandler; } @@ -1527,7 +1341,7 @@ case MESMRFieldEvent::EESMRFieldChangeEvent: { HandleFieldChangeEventL( aEvent ); - break; + break; } default: { @@ -1544,6 +1358,7 @@ const MESMRFieldEvent& aEvent ) { FUNC_LOG; + CEikButtonGroupContainer& cba = ButtonGroupContainer(); TInt* command = static_cast< TInt* >( aEvent.Param( 0 ) ); switch ( *command ) { @@ -1551,12 +1366,12 @@ { iRequiredAttendeesEnabled = ETrue; break; - } + } case EESMRCmdAttendeeRequiredDisabled: { iRequiredAttendeesEnabled = EFalse; break; - } + } case EESMRCmdAttendeeOptionalEnabled: { iOptionalAttendeesEnabled = ETrue; @@ -1569,10 +1384,10 @@ } case EESMRCmdRestoreMiddleSoftKey: { - CEikButtonGroupContainer& cba = ButtonGroupContainer(); - - if ( iPolicy->FieldL( iView->FocusedField() ).iFieldMode - == EESMRFieldModeView ) + iContextMenuResourceId = 0; + + if ( Policy().FieldL( + iView->FocusedField() ).iFieldMode == EESMRFieldModeView ) { // Dim default MSK if editor contains viewer fields cba.MakeCommandVisibleByPosition( @@ -1582,9 +1397,9 @@ else { cba.SetCommandL( - CEikButtonGroupContainer::EMiddleSoftkeyPosition, + CEikButtonGroupContainer::EMiddleSoftkeyPosition, R_MR_SELECT_SOFTKEY ); - + cba.MakeCommandVisibleByPosition( CEikButtonGroupContainer::EMiddleSoftkeyPosition, ETrue ); @@ -1593,15 +1408,109 @@ } break; case EESMRCmdSizeExceeded: - iView->ProcessEditorCommandL( *command ); - break; + iView->ProcessEditorCommandL( *command ); + break; + + case EMRCommandSwitchToMR: + case EMRCommandSwitchToMeeting: + case EMRCommandSwitchToMemo: + case EMRCommandSwitchToAnniversary: + case EMRCommandSwitchToTodo: + { + TRAPD( err, SwitchEntryTypeL( *command, ETrue ) ) + + if (KErrArgument == err ) + { + // There was validation error --> Just show the + // existing editor. + err = KErrNone; + } + else if ( err ) + { + // UI and engine not consistent. Show error and exit + iCoeEnv->HandleError( err ); + TryExitL( EESMRCmdForceExit ); + } + + break; + } + case EESMRCmdLongtapDetected: + { + OkToExitL(EESMRCmdLongtapDetected); + break; + } + case EMRLaunchAttachmentContextMenu: + case EAknSoftkeyContextOptions: + { + OkToExitL( EAknSoftkeyContextOptions ); + break; + } + case EESMRCmdCalendarChange: + { + DrawDeferred(); + break; + } + case EESMRCmdAssignFromMap: + case EMRCommandMyLocations: + { + DoProcessCommandL( *command ); + break; + } default: { break; } } + + + MESMRCalEntry* entry = iInfoProvider.EntryL(); + if ( entry->Type() == MESMRCalEntry::EESMRCalEntryMeetingRequest ) + { + MESMRMeetingRequestEntry* mrEntry = + static_cast( iInfoProvider.EntryL() ); + + TBool bOccursInPast( OccursInPast( iStartTimeUtc ) ); + + TBool sendEnabled = ( !bOccursInPast && + ( mrEntry->RoleL() == EESMRRoleOrganizer || mrEntry->IsForwardedL() ) && + ( iRequiredAttendeesEnabled | iOptionalAttendeesEnabled ) && + (( ( iInfoProvider.PolicyProvider().CurrentPolicy().ViewMode() == EESMREditMR )) || + ( iInfoProvider.PolicyProvider().CurrentPolicy().ViewMode() == EESMRForwardMR ) + )); + + if( sendEnabled ) + { + cba.SetCommandL( + CEikButtonGroupContainer::ERightSoftkeyPosition, + R_MR_SEND_SOFTKEY); + cba.MakeCommandVisibleByPosition( + CEikButtonGroupContainer::ERightSoftkeyPosition, + ETrue ); + cba.DrawDeferred(); + } + else + { + cba.SetCommandL( + CEikButtonGroupContainer::ERightSoftkeyPosition, + R_MR_DONE_SOFTKEY); + cba.MakeCommandVisibleByPosition( + CEikButtonGroupContainer::ERightSoftkeyPosition, + ETrue ); + cba.DrawDeferred(); + } + } + else + { + cba.SetCommandL( + CEikButtonGroupContainer::ERightSoftkeyPosition, + R_MR_DONE_SOFTKEY); + cba.MakeCommandVisibleByPosition( + CEikButtonGroupContainer::ERightSoftkeyPosition, + ETrue ); + cba.DrawDeferred(); + } } - + // --------------------------------------------------------------------------- // CESMREditorDialog::HandleFieldChangeEventL // --------------------------------------------------------------------------- @@ -1610,80 +1519,258 @@ const MESMRFieldEvent& aEvent ) { FUNC_LOG; + TInt* fieldId = static_cast< TInt* >( aEvent.Param( 0 ) ); + MESMRCalEntry* entry = iInfoProvider.EntryL(); + switch ( *fieldId ) { case EESMRFieldLocation: { MESMRFieldEventValue* value = static_cast< MESMRFieldEventValue* >( aEvent.Param( 1 ) ); - if ( iEntry.Entry().LocationL() != value->StringValue() ) + if ( entry->Entry().LocationL() != value->StringValue() ) { // Show query dialog only if entry has geocoordinates. // It can be verified by checking if "Show on map" is available // for iEntry as geocoordinates are required for that. TBool enableQuery = LocationPluginHandlerL().IsCommandAvailableL( - EESMRCmdShowOnMap, iEntry ); - + EESMRCmdShowOnMap, *entry ); + if ( enableQuery && CESMRConfirmationQuery::ExecuteL( CESMRConfirmationQuery::EESMRAssignUpdatedLocation ) ) { - HBufC* oldLocation = iEntry.Entry().LocationL().AllocLC(); + HBufC* oldLocation = entry->Entry().LocationL().AllocLC(); iView->ExternalizeL(); - + // if old and new locations are different and old location // exists, the user is updating existing location. Let's discard // the existing coordinates by using command EESMRCmdUpdateFromMap - if ( iEntry.Entry().LocationL().Compare( *oldLocation ) != 0 && + if ( entry->Entry().LocationL().Compare( *oldLocation ) != 0 && oldLocation->Length() != 0 ) { - LocationPluginHandlerL().HandleCommandL( - EESMRCmdUpdateFromMap, - iEntry ); + LocationPluginHandlerL().HandleCommandL( + EESMRCmdUpdateFromMap, + *entry ); } else { LocationPluginHandlerL().HandleCommandL( EESMRCmdAssignFromMap, - iEntry, - EFalse ); + *entry, + EFalse ); } iView->InternalizeL(); iView->SetControlFocusedL( EESMRFieldLocation ); - + CleanupStack::PopAndDestroy( oldLocation ); oldLocation = NULL; } else if ( enableQuery ) { // Externalize entry, so query won't be displayed - // again for the same text. + // again for the same text. iView->ExternalizeL(); } } break; } + case EESMRFieldStartDate: { - if ( iEntry.Type() == MESMRCalEntry::EESMRCalEntryMeetingRequest ) + // for update iStartTimeUtc when meeting & mr event changing start time + TBool bOccursInPast( OccursInPastL( aEvent ) ); + + if ( entry->Type() == MESMRCalEntry::EESMRCalEntryMeetingRequest ) + { + MESMRMeetingRequestEntry* mrEntry = + static_cast( iInfoProvider.EntryL() ); + TBool bIsOrganizer( mrEntry->RoleL() == EESMRRoleOrganizer ); + + ChangeRightSoftkeyL( bOccursInPast, bIsOrganizer ); + } + break; + } + + case EESMRFieldAllDayEvent: + { + TBool bOccursInPast( OccursInPast( iStartTimeUtc ) ); + TInt* bChecked = static_cast< TInt* >( aEvent.Param( 1 ) ); + if( *bChecked == 1 ) + { + TDateTime startTime = iStartTimeUtc.DateTime(); + startTime.SetHour( 0 ); + startTime.SetMinute( 0 ); + startTime.SetSecond( 0 ); + bOccursInPast = OccursInPast( startTime ); + } + + if ( entry->Type() == MESMRCalEntry::EESMRCalEntryMeetingRequest ) + { + MESMRMeetingRequestEntry* mrEntry = + static_cast( iInfoProvider.EntryL() ); + TBool bIsOrganizer( mrEntry->RoleL() == EESMRRoleOrganizer ); + + ChangeRightSoftkeyL( bOccursInPast, bIsOrganizer ); + } + break; + } + default: + { + break; + } + } + } + +// --------------------------------------------------------------------------- +// CESMREditorDialog::SetContextMenuL +// --------------------------------------------------------------------------- +// +TBool CESMREditorDialog::SetContextMenuL() + { + FUNC_LOG; + TInt ret( EFalse ); + + TESMREntryFieldId fieldId = iView->ClickedOrFocusedField(); + + switch( fieldId ) + { + case EESMRFieldLocation: + { + ret = ETrue; + + if ( Policy().FieldL( EESMRFieldLocation ).iFieldMode + == EESMRFieldModeEdit ) + { + iContextMenuResourceId = + R_MR_EDITOR_LOCATION_CONTEXT_MENU; + } + else + { + iContextMenuResourceId = + R_MR_VIEWER_CONTEXT_MENU; + } + + if ( !iFeatures->FeatureSupported( + CESMRFeatureSettings::EESMRUIMnFwIntegration ) + && iContextMenuResourceId == R_MR_EDITOR_LOCATION_CONTEXT_MENU ) { - MESMRFieldEventValue* value = - static_cast< MESMRFieldEventValue* >( aEvent.Param( 1 ) ); - TTime now; - now.UniversalTime(); - if ( value->TimeValue() < now ) +#ifndef RD_USE_MYLOCATIONUI + // Maps not supported and My Locations UI disabled + ret = EFalse; +#endif //RD_USE_MYLOCATIONUI + } + } + break; + + case EESMRFieldAttachments: + { + if ( Policy().FieldL( + EESMRFieldAttachments ).iFieldMode + == EESMRFieldModeEdit ) + { + iContextMenuResourceId = R_MR_EDITOR_ATTACHMENT_CONTEXT_MENU; + ret = ETrue; + } + } + break; + case EESMRFieldAttendee: + case EESMRFieldOptAttendee: + { + if ( Policy().FieldL( + EESMRFieldAttendee ).iFieldMode == EESMRFieldModeEdit || + Policy().FieldL( + EESMRFieldOptAttendee ).iFieldMode == EESMRFieldModeEdit ) + { + iContextMenuResourceId = R_MR_EDITOR_ATTENDEE_CONTEXT_MENU; + ret = ETrue; + } + } + break; + default: + break; + } + + if ( ret ) + { + iMenuBar->SetContextMenuTitleResourceId( + iContextMenuResourceId ); + } + else + { + iContextMenuResourceId = 0; + } + + return ret; + } + +// --------------------------------------------------------------------------- +// CESMREditorDialog::SwitchEntryTypeL +// --------------------------------------------------------------------------- +// +void CESMREditorDialog::SwitchEntryTypeL( + TInt aCommand, + TBool aAdjustView ) + { + FUNC_LOG; + TBool change( EFalse ); + MESMRCalEntry* entry = iInfoProvider.EntryL(); + + switch ( aCommand ) + { + case EMRCommandSwitchToMR: + { + TBool ret( ETrue ); + + // Show confirmation note if current mailbox does not + // support attachments and attachments exist in the entry + if( entry->Entry().AttachmentCountL() > 0 && + !SupportsMailBoxCapabilityL( + MESMRBuilderExtension:: + EMRCFSSupportsAttachmentsInMR ) ) + { + if ( !CESMRConfirmationQuery::ExecuteL( + CESMRConfirmationQuery:: + EESMRAttachmentsNotSupported ) ) { - // disable send option - iOccursInPast = ETrue; - } - else - { - iOccursInPast = EFalse; + ret = EFalse; } } + + if( ret ) + { + change = + ( entry->Type() != + MESMRCalEntry::EESMRCalEntryMeetingRequest ); + } + + break; + } + case EMRCommandSwitchToMeeting: + { + change = + ( entry->Type() != MESMRCalEntry::EESMRCalEntryMeeting ); + break; + } + case EMRCommandSwitchToMemo: + { + change = + ( entry->Type() != MESMRCalEntry::EESMRCalEntryMemo ); + break; + } + case EMRCommandSwitchToAnniversary: + { + change = + ( entry->Type() != MESMRCalEntry::EESMRCalEntryAnniversary ); + break; + } + case EMRCommandSwitchToTodo: + { + change = + ( entry->Type() != MESMRCalEntry::EESMRCalEntryTodo); break; } default: @@ -1691,7 +1778,292 @@ break; } } + + if ( change ) + { + iView->ExternalizeL(ETrue); + iStartTimeUtc = entry->Entry().StartTimeL().TimeUtcL(); + iCallback.ProcessCommandL( aCommand ); + + if( aAdjustView ) + { + MESMRCalEntry* entry = iInfoProvider.EntryL(); + iView->AdjustViewL( entry, Policy() ); + SetTitleL(); + } + } + } + +// --------------------------------------------------------------------------- +// CESMREditorDialog::Policy +// --------------------------------------------------------------------------- +// +const CESMRPolicy& CESMREditorDialog::Policy() const + { + FUNC_LOG; + return iInfoProvider.PolicyProvider().CurrentPolicy(); + } + +// --------------------------------------------------------------------------- +// CESMREditorDialog::DynInitToolbarL +// --------------------------------------------------------------------------- +// +void CESMREditorDialog::DynInitToolbarL ( TInt /*aResourceId*/, + CAknToolbar* /*aToolbar*/ ) + { + // TODO: Not implemented yet + } + +// --------------------------------------------------------------------------- +// CESMREditorDialog::OfferToolbarEventL +// --------------------------------------------------------------------------- +// +void CESMREditorDialog::OfferToolbarEventL ( TInt aCommand ) + { + DoProcessCommandL(aCommand); + } + + +// --------------------------------------------------------------------------- +// CESMREditorDialog::SetTitleL +// --------------------------------------------------------------------------- +// +void CESMREditorDialog::SetTitleL () + { + FUNC_LOG; + + MESMRCalEntry* entry = iInfoProvider.EntryL(); + + // Setting title to status pane's title pane + TInt titleStringId = -1; + switch ( entry->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::EESMRCalEntryReminder: + break; + case MESMRCalEntry::EESMRCalEntryAnniversary: + titleStringId = R_QTN_CALENDAR_TITLE_ANNIVERSARY; + break; + default: + break; + } + + if ( titleStringId != -1 ) + { + if( !iTitlePane ) + { + iTitlePane = CESMRTitlePaneHandler::NewL( *iEikonEnv ); + } + + HBufC* titleText = StringLoader::LoadLC( titleStringId, iCoeEnv ); + iTitlePane->SetNewTitle( titleText ); + CleanupStack::PopAndDestroy( titleText ); + } + + // If subject does not exist, let's update the title also + // to main window + if( entry->Entry().SummaryL().Length() <= 0 ) + { + HBufC* title ; + switch( entry->Type() ) + { + case MESMRCalEntry::EESMRCalEntryTodo: + { + title = StringLoader::LoadLC ( R_QTN_CALENDAR_TITLE_NEW_TODO ); + break; + } + case MESMRCalEntry::EESMRCalEntryMemo: + { + title = StringLoader::LoadLC ( R_QTN_CALENDAR_TITLE_NEW_MEMO ); + break; + } + case MESMRCalEntry::EESMRCalEntryAnniversary: + { + title = StringLoader::LoadLC(R_QTN_CALENDAR_TITLE_NEW_ANNIVERSARY); + break; + } + case MESMRCalEntry::EESMRCalEntryMeetingRequest: // Fall through + case MESMRCalEntry::EESMRCalEntryMeeting: // Fall through + case MESMRCalEntry::EESMRCalEntryReminder: // Fall through + default: + { + title = StringLoader::LoadLC( R_QTN_MEET_REQ_TITLE ); + break; + } + } + iView->SetTitleL( *title ); + CleanupStack::PopAndDestroy( title ); + } + } + +// --------------------------------------------------------------------------- +// CESMREditorDialog::VerifyMeetingRequestL +// --------------------------------------------------------------------------- +// +void CESMREditorDialog::VerifyMeetingRequestL() + { + FUNC_LOG; + + MESMRCalEntry* entry = iInfoProvider.EntryL(); + + // If entry is meeting request, but no attendees have been added, + // entry is switched to and saved as regular meeting + if( CCalenInterimUtils2::IsMeetingRequestL( entry->Entry() ) ) + { + RPointerArray& attendees( + entry->Entry().AttendeesL() ); + + TInt attendeeCount = attendees.Count(); + + if( ( attendeeCount == 0 ) && + (iInfoProvider.PolicyProvider().CurrentPolicy().ViewMode() != EESMRForwardMR) ) + { + TRAPD( err, SwitchEntryTypeL( EMRCommandSwitchToMeeting, EFalse ) ) + + if ( err ) + { + // UI and engine not consistent. Show error and exit + iCoeEnv->HandleError( err ); + TryExitL( EESMRCmdForceExit ); + } + } + } + } + +// ----------------------------------------------------------------------------- +// CESMREditorDialog::ShowContextMenuL +// ----------------------------------------------------------------------------- +// +void CESMREditorDialog::ShowContextMenuL() + { + FUNC_LOG; + + if ( iMenuBar ) + { + iMenuBar->TryDisplayContextMenuBarL(); + } + } + + +// ----------------------------------------------------------------------------- +// CESMREditorDialog::OccursInPast +// ----------------------------------------------------------------------------- +// +TBool CESMREditorDialog::OccursInPastL( const MESMRFieldEvent& aEvent ) + { + FUNC_LOG; + MESMRFieldEventValue* value = static_cast< MESMRFieldEventValue* >( aEvent.Param( 1) ); + + TCalTime startCalTime; + startCalTime.SetTimeLocalL( value->TimeValue() ); + + iStartTimeUtc = startCalTime.TimeUtcL(); + + return OccursInPast( iStartTimeUtc ); + } + +// ----------------------------------------------------------------------------- +// CESMREditorDialog::OccursInPast +// ----------------------------------------------------------------------------- +// +TBool CESMREditorDialog::OccursInPast( const TTime& aStartUtc ) + { + FUNC_LOG; + TBool bOccursInPast(EFalse); + + TTime now; + now.UniversalTime(); + + if ( aStartUtc < now ) + { + bOccursInPast = ETrue; + } + + return bOccursInPast; + } + +// ----------------------------------------------------------------------------- +// CESMREditorDialog::ChangeRightSoftkeyL +// ----------------------------------------------------------------------------- +// +void CESMREditorDialog::ChangeRightSoftkeyL( TBool aOccursInPast, TBool aIsOrganizer ) + { + FUNC_LOG; + TBool sendEnabled = + ( iRequiredAttendeesEnabled | iOptionalAttendeesEnabled ) && + !aOccursInPast && aIsOrganizer; + + CEikButtonGroupContainer& cba = ButtonGroupContainer(); + + if( sendEnabled ) + { + cba.SetCommandL( + CEikButtonGroupContainer::ERightSoftkeyPosition, + R_MR_SEND_SOFTKEY); + cba.DrawDeferred(); + } + else + { + cba.SetCommandL( + CEikButtonGroupContainer::ERightSoftkeyPosition, + R_MR_DONE_SOFTKEY); + cba.DrawDeferred(); + } + } + +// ----------------------------------------------------------------------------- +// CESMREditorDialog::TryToSaveEntryL +// ----------------------------------------------------------------------------- +// +TInt CESMREditorDialog::TryToSaveEntryL() + { + FUNC_LOG; + TInt res( KErrNone ); + + MESMRCalEntry* entry = iInfoProvider.EntryL(); + + if ( IsAllowedToSaveL() ) + { + res = iCallback.ProcessCommandWithResultL( EESMRCmdSaveMR ); + + if ( res == KErrNone + && iFeatures->FeatureSupported( + CESMRFeatureSettings::EESMRUIPreviousLocationsList ) ) + { + LocationPluginHandlerL().StoreLocationToHistoryL( *entry ); + } + if ( entry->Type() == MESMRCalEntry::EESMRCalEntryTodo ) + { + CESMRGlobalNote* note = + CESMRGlobalNote::NewL( + CESMRGlobalNote::EESMRTodoEntrySaved ); + note->ExecuteLD(); + } + else + { + CESMRGlobalNote* note = + CESMRGlobalNote::NewL( + CESMRGlobalNote::EESMREntrySaved ); + note->ExecuteLD(); + } + } + else + { + res = KErrCancel; + } + + return res; } // EOF -