diff -r 000000000000 -r 8466d47a6819 meetingrequest/mrgui/src/cesmrannivtimevalidator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/meetingrequest/mrgui/src/cesmrannivtimevalidator.cpp Thu Dec 17 08:39:21 2009 +0200 @@ -0,0 +1,735 @@ +/* +* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: ESMR time and date sanity checks and saving +* +*/ + + +#include "emailtrace.h" +#include +#include +#include +#include +#include "cesmrannivtimevalidator.h" +#include "cesmrglobalnote.h" +#include "mesmrfieldstorage.h" +#include "mesmrcalentry.h" + +// Unnamed namespace for local definitions +namespace { + +// Definition fom max possible time +#define KMaxTTime (TTime(TDateTime(2100, EDecember, 31-2, 23, 59, 59, 999999))) + +// Definition fom min possible time +#define KMinTTime (TTime(TDateTime(1900, EJanuary, 2-1, 0, 0, 0, 0))) + +// Definition for max alarm duration +#define KMaxAlarmTime TTimeIntervalDays(31) + +// Definition for halfday +const TInt KNoon( 12 ); + +#ifdef _DEBUG + +// Literal for panics +_LIT( KESMRAnnivTimeValidator, "ESMRAnnivTimeValidator" ); + +/** Panic code definitions */ +enum TESMRAnnivTimeValidator + { + /** Start date field not set */ + EESMRAnnivValidatorNullStartDate, + /** Start date field not set */ + EESMRAnnivValidatorNullAlarmTime, + /** Start date field not set */ + EESMRAnnivValidatorNullAlarmDate, + /** Relative alarm called for non-relative alarm event */ + EESMRAnnivValidatorRelativeAlarm + }; + +/** + * Raises system panic. + * @param aPanic Panic code + * @see TESMRRecurrentEditValidatorPanic + */ +void Panic( TESMRAnnivTimeValidator aPanic ) + { + User::Panic( KESMRAnnivTimeValidator, aPanic ); + } + +#endif // _DEBUG + +/** + * Sets time to editor. Time is checked and adjusted + * between min and max before setting + * @param aEditor Reference to time editor + * @param aTime On return contains the set time. + */ +void SetTimeToEditor( + CEikTimeEditor& aEditor, + TTime& aTime ) + { + if ( aTime < KMinTTime ) + { + aTime = KMinTTime; + } + else if ( aTime > KMaxTTime ) + { + aTime = KMaxTTime; + } + + if ( aEditor.IsVisible() ) + { + aEditor.SetTime( aTime ); + } + } + +/** + * Sets date to editor. Date is checked and adjusted + * between min and max before setting + * @param aEditor Reference to time editor + * @param aDate On return contains the set date. + */ +void SetDateToEditor( + CEikDateEditor& aEditor, + TTime& aDate ) + { + if ( aDate < KMinTTime ) + { + aDate = KMinTTime; + } + else if ( aDate > KMaxTTime ) + { + aDate = KMaxTTime; + } + + if ( aEditor.IsVisible() ) + { + aEditor.SetDate( aDate ); + } + } + +/** + * Returns the default alarm time for all day event + * @param allday event start time + * @return alarm time + */ +TTime DefaultAnniversaryAlarm( TTime& aAnnivStartTime ) + { + TTime defaultAlarmTime = aAnnivStartTime - TTimeIntervalHours(KNoon); + + if ( defaultAlarmTime < KMinTTime ) + { + defaultAlarmTime = KMinTTime; + } + return defaultAlarmTime; + } + +} + + +// --------------------------------------------------------------------------- +// CESMRAnnivTimeValidator::CESMRAnnivTimeValidator() +// --------------------------------------------------------------------------- +// +inline CESMRAnnivTimeValidator::CESMRAnnivTimeValidator() +: iCurrentAnnivDate( Time::NullTTime() ), + iCurrentAlarmTime( Time::NullTTime() ), + iAlarmOnOff( EFalse ) + { + } + +// --------------------------------------------------------------------------- +// CESMRAnnivTimeValidator::~CESMRAnnivTimeValidator +// --------------------------------------------------------------------------- +// +CESMRAnnivTimeValidator::~CESMRAnnivTimeValidator( ) + { + } + +// --------------------------------------------------------------------------- +// CESMRAnnivTimeValidator::NewL +// --------------------------------------------------------------------------- +// +CESMRAnnivTimeValidator* CESMRAnnivTimeValidator::NewL() + { + FUNC_LOG; + CESMRAnnivTimeValidator* self = new (ELeave) CESMRAnnivTimeValidator(); + return self; + } + +// --------------------------------------------------------------------------- +// CESMRAnnivTimeValidator::ValidateL +// --------------------------------------------------------------------------- +// +MESMRFieldValidator::TESMRFieldValidatorError + CESMRAnnivTimeValidator::ValidateL( TBool aCorrectAutomatically ) + { + FUNC_LOG; + const MESMRFieldValidator::TESMRFieldValidatorError KErrorNone( + MESMRFieldValidator::EErrorNone ); + + MESMRFieldValidator::TESMRFieldValidatorError error( KErrorNone ); + + if ( aCorrectAutomatically ) + { + ForceValuesL(); + } + else + { + if ( iAlarmOnOff ) + { + TTime start = StartTimeL(); + TTime alarm = AlarmTimeL(); + + if ( start < alarm ) + { + TDateTime startDt = start.DateTime(); + TDateTime alarmDt = alarm.DateTime(); + + // Alarm needs to be on the same day if it in future + if ( startDt.Year() != alarmDt.Year() || + startDt.Month() != alarmDt.Month() || + startDt.Day() != alarmDt.Day() ) + { + iCurrentAlarmTime = DefaultAnniversaryAlarm( start ); + + SetTimeToEditor( *iAlarmTime, iCurrentAlarmTime ); + SetDateToEditor( *iAlarmDate, iCurrentAlarmTime ); + + error = MESMRFieldValidator::EErrorAlarmLaterThanStart; + } + } + } + } + return error; + } + +// --------------------------------------------------------------------------- +// CESMRAnnivTimeValidator::ReadValuesFromEntryL +// --------------------------------------------------------------------------- +// +void CESMRAnnivTimeValidator::ReadValuesFromEntryL( + MESMRCalEntry& aEntry ) + { + FUNC_LOG; + if ( MESMRCalEntry::EESMRCalEntryAnniversary == aEntry.Type() ) + { + __ASSERT_DEBUG( iStartDate, Panic(EESMRAnnivValidatorNullStartDate) ); + __ASSERT_DEBUG( iAlarmTime, Panic(EESMRAnnivValidatorNullAlarmTime) ); + __ASSERT_DEBUG( iAlarmDate, Panic(EESMRAnnivValidatorNullAlarmDate) ); + + iEntry = &aEntry; + CCalEntry& entry( aEntry.Entry() ); + + TCalTime startTime = entry.StartTimeL(); + iCurrentAnnivDate = startTime.TimeLocalL(); + SetDateToEditor( *iStartDate, iCurrentAnnivDate ); + + + CCalAlarm* alarm = entry.AlarmL(); + CleanupStack::PushL( alarm ); + + if ( alarm ) + { + iCurrentAlarmTime = iCurrentAnnivDate - alarm->TimeOffset(); + iAlarmOnOff = ETrue; + + SetTimeToEditor( *iAlarmTime, iCurrentAlarmTime ); + SetDateToEditor( *iAlarmDate, iCurrentAlarmTime ); + } + + CleanupStack::PopAndDestroy( alarm ); + DrawEditorsDeferred(); + } + } + +// --------------------------------------------------------------------------- +// CESMRAnnivTimeValidator::StoreValuesToEntryL +// --------------------------------------------------------------------------- +// +void CESMRAnnivTimeValidator::StoreValuesToEntryL( + MESMRCalEntry& aEntry ) + { + FUNC_LOG; + if ( MESMRCalEntry::EESMRCalEntryAnniversary == aEntry.Type() ) + { + PreValidateEditorContent(); + CCalEntry& entry( aEntry.Entry() ); + + TTime annivEdirotTime = StartTimeL(); + + TCalTime annivTime; + + // The default mode for anniversary is EFloating, + // But some 3rd party application might have saved a different type + // for one reason or another. In that case we are using + // the existing value. + if ( aEntry.IsStoredL() ) + { + TCalTime::TTimeMode timeMode = + aEntry.Entry().StartTimeL().TimeMode(); + + switch ( timeMode ) + { + case TCalTime::EFixedUtc: + { + annivTime.SetTimeUtcL( annivEdirotTime ); + break; + } + case TCalTime::EFixedTimeZone: + { + annivTime.SetTimeLocalL( annivEdirotTime ); + break; + } + case TCalTime::EFloating: + default: + { + annivTime.SetTimeLocalFloatingL( annivEdirotTime ); + } + } + } + else + { + annivTime.SetTimeLocalFloatingL( annivEdirotTime ); + } + + entry.SetStartAndEndTimeL( annivTime, annivTime ); + if ( iAlarmOnOff ) + { + TTimeIntervalMinutes diff; + + TTime alarm = AlarmTimeL(); + annivEdirotTime.MinutesFrom( alarm, diff ); + + CCalAlarm* alarmObject = entry.AlarmL(); + if ( !alarmObject ) + { + alarmObject = CCalAlarm::NewL(); + } + CleanupStack::PushL( alarmObject ); + alarmObject->SetTimeOffset( diff ); + entry.SetAlarmL( alarmObject ); + CleanupStack::PopAndDestroy( alarmObject ); + alarmObject = NULL; + } + else + { + entry.SetAlarmL( NULL ); + } + } + } + +// --------------------------------------------------------------------------- +// CESMRAnnivTimeValidator::SetStartTimeFieldL +// --------------------------------------------------------------------------- +// +void CESMRAnnivTimeValidator::SetStartTimeFieldL( + CEikTimeEditor& /*aStartTime*/ ) + { + FUNC_LOG; + // No implementation for anniversary + } + +// --------------------------------------------------------------------------- +// CESMRAnnivTimeValidator::SetEndTimeFieldL +// --------------------------------------------------------------------------- +// +void CESMRAnnivTimeValidator::SetEndTimeFieldL( + CEikTimeEditor& /*aEndTime*/ ) + { + FUNC_LOG; + // No implementation for anniversary + } + +// --------------------------------------------------------------------------- +// CESMRAnnivTimeValidator::SetStartDateFieldL +// --------------------------------------------------------------------------- +// +void CESMRAnnivTimeValidator::SetStartDateFieldL( + CEikDateEditor& aStartDate ) + { + FUNC_LOG; + iStartDate = &aStartDate; + } + +// --------------------------------------------------------------------------- +// CESMRAnnivTimeValidator::SetEndDateFieldL +// --------------------------------------------------------------------------- +// +void CESMRAnnivTimeValidator::SetEndDateFieldL( + CEikDateEditor& /*aEndDate*/ ) + { + FUNC_LOG; + // No implementation for anniversary + } + +// --------------------------------------------------------------------------- +// CESMRAnnivTimeValidator::SetAlarmTimeFieldL +// --------------------------------------------------------------------------- +// +void CESMRAnnivTimeValidator::SetAlarmTimeFieldL( + CEikTimeEditor& aAlarmTime ) + { + FUNC_LOG; + iAlarmTime = &aAlarmTime; + } + +// --------------------------------------------------------------------------- +// CESMRAnnivTimeValidator::SetAlarmDateFieldL +// --------------------------------------------------------------------------- +// +void CESMRAnnivTimeValidator::SetAlarmDateFieldL( + CEikDateEditor& aAlarmDate ) + { + FUNC_LOG; + iAlarmDate = &aAlarmDate; + } + +// --------------------------------------------------------------------------- +// CESMRAnnivTimeValidator::SetRecurrenceUntilDateFieldL +// --------------------------------------------------------------------------- +// +void CESMRAnnivTimeValidator::SetRecurrenceUntilDateFieldL( + CEikDateEditor& /*aRecurrenceUntil*/ ) + { + FUNC_LOG; + // No implementation for anniversary + } + +// --------------------------------------------------------------------------- +// CESMRAnnivTimeValidator::StartTimeChangedL +// --------------------------------------------------------------------------- +// +void CESMRAnnivTimeValidator::StartTimeChangedL() + { + FUNC_LOG; + StartDateChandedL(); + } + +// --------------------------------------------------------------------------- +// CESMRAnnivTimeValidator::EndTimeChangedL +// --------------------------------------------------------------------------- +// +void CESMRAnnivTimeValidator::EndTimeChangedL() + { + FUNC_LOG; + // No implementation for anniversary + } + +// --------------------------------------------------------------------------- +// CESMRAnnivTimeValidator::StartDateChandedL +// --------------------------------------------------------------------------- +// +void CESMRAnnivTimeValidator::StartDateChandedL() + { + FUNC_LOG; + PreValidateEditorContent(); + + TTime start = StartTimeL(); + TTimeIntervalDays diff = start.DaysFrom( iCurrentAnnivDate ); + iCurrentAnnivDate = start; + SetDateToEditor( *iStartDate, iCurrentAnnivDate ); + + if ( iAlarmOnOff ) + { + TTime alarm = AlarmTimeL(); + alarm += diff; + + iCurrentAlarmTime = alarm; + + SetTimeToEditor( *iAlarmTime, iCurrentAlarmTime ); + SetDateToEditor( *iAlarmDate, iCurrentAlarmTime ); + } + + DrawEditorsDeferred(); + } + +// --------------------------------------------------------------------------- +// CESMRAnnivTimeValidator::EndDateChangedL +// --------------------------------------------------------------------------- +// +void CESMRAnnivTimeValidator::EndDateChangedL() + { + FUNC_LOG; + // No implementation for anniversary + } + +// --------------------------------------------------------------------------- +// CESMRAnnivTimeValidator::AlarmTimeChangedL +// --------------------------------------------------------------------------- +// +void CESMRAnnivTimeValidator::AlarmTimeChangedL() + { + FUNC_LOG; + AlarmDateChangedL(); + } + +// --------------------------------------------------------------------------- +// CESMRAnnivTimeValidator::AlarmDateChangedL +// --------------------------------------------------------------------------- +// +void CESMRAnnivTimeValidator::AlarmDateChangedL() + { + FUNC_LOG; + TInt err( KErrNone ); + PreValidateEditorContent(); + + TTime start = StartTimeL(); + TTime alarm = AlarmTimeL(); + + if ( alarm > start ) + { + TDateTime startDt = start.DateTime(); + TDateTime alarmDt = alarm.DateTime(); + + // Alarm needs to be on the same day if it in future + if ( startDt.Year() != alarmDt.Year() || + startDt.Month() != alarmDt.Month() || + startDt.Day() != alarmDt.Day() ) + { + err = KErrArgument; + } + } + + if ( KErrNone == err ) + { + iCurrentAlarmTime = alarm; + } + + SetTimeToEditor( *iAlarmTime, iCurrentAlarmTime ); + SetDateToEditor( *iAlarmDate, iCurrentAlarmTime ); + + DrawEditorsDeferred(); + User::LeaveIfError( err ); + } + +// --------------------------------------------------------------------------- +// CESMRAnnivTimeValidator::RelativeAlarmChangedL() +// --------------------------------------------------------------------------- +// +void CESMRAnnivTimeValidator::RelativeAlarmChangedL( + TTimeIntervalMinutes /*aCurrentAlarmTimeOffset*/, + TBool /*aHandleAlarmChange*/, + TBool& /*aRelativeAlarmValid*/ ) + { + FUNC_LOG; + // No implementation for anniversary + } + +// --------------------------------------------------------------------------- +// CESMRAnnivTimeValidator::SetAllDayEventL +// --------------------------------------------------------------------------- +// +void CESMRAnnivTimeValidator::SetAllDayEventL( + TBool /*aAlldayEvent*/ ) + { + FUNC_LOG; + // No implementation for anniversary + } + +// --------------------------------------------------------------------------- +// CESMRAnnivTimeValidator::SetAlarmOnOffL +// --------------------------------------------------------------------------- +// +void CESMRAnnivTimeValidator::SetAlarmOnOffL( + TBool aAlarmOn ) + { + FUNC_LOG; + iAlarmOnOff = aAlarmOn; + + if ( iAlarmOnOff ) + { + if ( iCurrentAlarmTime == Time::NullTTime() || + iCurrentAlarmTime > iCurrentAnnivDate ) + { + iCurrentAlarmTime = DefaultAnniversaryAlarm( iCurrentAnnivDate ); + } + + SetTimeToEditor( *iAlarmTime, iCurrentAlarmTime ); + SetDateToEditor( *iAlarmDate, iCurrentAlarmTime ); + + DrawEditorsDeferred(); + } + } + +// --------------------------------------------------------------------------- +// CESMRAnnivTimeValidator::RecurrenceChangedL +// --------------------------------------------------------------------------- +// +void CESMRAnnivTimeValidator::RecurrenceChangedL( + TESMRRecurrenceValue /*aRecurrence*/ ) + { + FUNC_LOG; + // No implementation for anniversary + } + +// --------------------------------------------------------------------------- +// CESMRAnnivTimeValidator::RecurrenceEndDateChangedL +// --------------------------------------------------------------------------- +// +void CESMRAnnivTimeValidator::RecurrenceEndDateChangedL() + { + FUNC_LOG; + // No implementation for anniversary + } + +// --------------------------------------------------------------------------- +// CESMRAnnivTimeValidator::IsRelativeAlarmValid +// --------------------------------------------------------------------------- +// +TBool CESMRAnnivTimeValidator::IsRelativeAlarmValid( + TTimeIntervalMinutes /*aAlarmTimeOffset*/ ) + { + FUNC_LOG; + return EFalse; + } + +// --------------------------------------------------------------------------- +// CESMRAnnivTimeValidator::PreValidateEditorContent +// --------------------------------------------------------------------------- +// +TInt CESMRAnnivTimeValidator::PreValidateEditorContent() + { + FUNC_LOG; + TRAPD( err, PreValidateEditorContentL() ); + return err; + } + +// --------------------------------------------------------------------------- +// CESMRAnnivTimeValidator::PreValidateEditorContentL +// --------------------------------------------------------------------------- +// +void CESMRAnnivTimeValidator::PreValidateEditorContentL() + { + FUNC_LOG; + if ( iStartDate && iStartDate->IsVisible() ) + { + iStartDate->PrepareForFocusLossL(); + } + + if ( iAlarmTime && iAlarmTime->IsVisible() ) + { + iAlarmTime->PrepareForFocusLossL(); + } + + if ( iAlarmDate && iAlarmDate->IsVisible() ) + { + iAlarmDate->PrepareForFocusLossL(); + } + } + +// --------------------------------------------------------------------------- +// CESMRAnnivTimeValidator::DrawEditorsDeferred +// --------------------------------------------------------------------------- +// +void CESMRAnnivTimeValidator::DrawEditorsDeferred() + { + FUNC_LOG; + if ( iStartDate && iStartDate->IsVisible() ) + { + iStartDate->DrawDeferred(); + } + + if ( iAlarmTime && iAlarmTime->IsVisible() ) + { + iAlarmTime->DrawDeferred(); + } + + if ( iAlarmDate && iAlarmDate->IsVisible() ) + { + iAlarmDate->DrawDeferred(); + } + } + +// --------------------------------------------------------------------------- +// CESMRAnnivTimeValidator::StartTimeL +// --------------------------------------------------------------------------- +// +TDateTime CESMRAnnivTimeValidator::StartTimeL() + { + FUNC_LOG; + return iStartDate->Date().DateTime(); + } + +// --------------------------------------------------------------------------- +// CESMRAnnivTimeValidator::AlarmTimeL +// --------------------------------------------------------------------------- +// +TDateTime CESMRAnnivTimeValidator::AlarmTimeL() + { + FUNC_LOG; + TDateTime alarmDateTime = iAlarmDate->Date().DateTime(); + TDateTime alarmTime = iAlarmTime->Time().DateTime(); + + alarmDateTime.SetHour( alarmTime.Hour() ); + alarmDateTime.SetMinute( alarmTime.Minute() ); + alarmDateTime.SetSecond( alarmTime.Second() ); + + return alarmDateTime; + } + +// --------------------------------------------------------------------------- +// CESMRAnnivTimeValidator::ForceValuesL +// --------------------------------------------------------------------------- +// +void CESMRAnnivTimeValidator::ForceValuesL() + { + FUNC_LOG; + if ( iAlarmOnOff ) + { + TTime start = StartTimeL(); + TTime alarm = AlarmTimeL(); + + // For alarm following cehcks and corrections are made: + // - Alarm is more that 31 days before start + // --> Alarm is adjusted to be 30,5 half days before + // - Alarm is later than start time + // --> Default alarm time is set for alarm + // - Alarm occurs in past + // --> For unsaved entries alarm is set off + // + TTimeIntervalDays alarmBefore = start.DaysFrom(alarm); + if ( alarmBefore > KMaxAlarmTime ) + { + // Adjust alarm time to 30,5 half days earlier + alarm = start - KMaxAlarmTime + TTimeIntervalHours(KNoon); + } + + if ( alarm > start ) + { + // Setting alarm to default value + alarm = DefaultAnniversaryAlarm( start ); + } + + TTime currentTime; currentTime.HomeTime(); + if ( alarm < currentTime ) + { + if ( !iEntry->IsStoredL() ) + { + // Setting alarm to default value if entry is not stored + iAlarmOnOff = EFalse; + } + } + + SetTimeToEditor( *iAlarmTime, alarm ); + SetDateToEditor( *iAlarmDate, alarm ); + + iCurrentAlarmTime = alarm; + } + } + +// EOF +