diff -r 12af337248b1 -r bd7edf625bdd calendarui/editors/src/calenrepeatfield.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/editors/src/calenrepeatfield.cpp Wed Sep 01 12:32:31 2010 +0100 @@ -0,0 +1,561 @@ +/* +* Copyright (c) 2002-2004 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 : +* +*/ + +// user includes +#include "calenrepeatfield.h" +#include "CalenDefaultEditors.hrh" +#include "CalenDescription.h" +#include "calennotedatautil.h" +#include "calenentryutil.h" +#include "CalenEditorDataHandler.h" + +// system includes +#include +#include +#include +#include +#include +#include + +// debug +#include "calendarui_debug.h" + +//Feb 29th will be read as 28 as indexing of days starts from 0,1,2.... +const TInt KLastDayInFebLeapYear = 28; + +// CONSTRUCTION AND DESTRUCTION METHODS + +// ----------------------------------------------------------------------------- +// CCalenRepeatField::NewL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CCalenRepeatField* CCalenRepeatField::NewL( CCalenUnifiedEditor& aUnifiedEditor ) + { + TRACE_ENTRY_POINT; + + CCalenRepeatField* self = + new( ELeave ) CCalenRepeatField( aUnifiedEditor ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + + TRACE_EXIT_POINT; + return self; + } + +// ----------------------------------------------------------------------------- +// CCalenRepeatField::CCalenRepeatField +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CCalenRepeatField::CCalenRepeatField( CCalenUnifiedEditor& aUnifiedEditor ) + : iUnifiedEditor( aUnifiedEditor ) + { + TRACE_ENTRY_POINT; + TRACE_EXIT_POINT; + } + +// ----------------------------------------------------------------------------- +// CCalenRepeatField::ConstructL +// second phase constructor +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCalenRepeatField::ConstructL() + { + TRACE_ENTRY_POINT; + + // read resource for confideitiality popup list + iRepeatArrayText = iUnifiedEditor.ControlEnv()->ReadDesCArrayResourceL( + R_CALEN_EDITOR_REPEAT_POPUP_ITEMS); + + // create textarray + iRepeatArray = CAknQueryValueTextArray::NewL(); + iRepeatTextValues = CAknQueryValueText::NewL(); + iRepeatArray->SetArray(*iRepeatArrayText); + iRepeatTextValues->SetArrayL(iRepeatArray); + + TRACE_EXIT_POINT; + } + +// ----------------------------------------------------------------------------- +// CCalenRepeatField::~CCalenRepeatField +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CCalenRepeatField::~CCalenRepeatField() + { + TRACE_ENTRY_POINT; + + delete iRepeatArrayText; + delete iRepeatArray; + delete iRepeatTextValues; + + TRACE_EXIT_POINT; + } + + +// ----------------------------------------------------------------------------- +// CCalenRepeatField::HandleControlStateChangedL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCalenRepeatField::HandleControlStateChangeL( TInt aControlId ) + { + TRACE_ENTRY_POINT; + + switch (aControlId) + { + case ECalenEditorRepeat: + { + NotifyChangeRepeatChoiceL(); + break; + } + default: + { + break; + } + } + + TRACE_EXIT_POINT; + } + +// ----------------------------------------------------------------------------- +// CCalenRepeatField::HandleErrorL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CCalenRepeatField::HandleErrorL( const TInt& aError ) + { + TRACE_ENTRY_POINT; + + TBool handled = EFalse; + switch ( aError ) + { + case CCalenEditorDataHandler::EFormErrRepeatUntilEarlierThanNote: + { + // ReapetUntill is earlier that note instance + iUnifiedEditor.TryChangeFocusToL( ECalenEditorRepeatUntil ); + handled = ETrue; + break; + } + case CCalenEditorDataHandler::EFormErrStopTimeEarlierThanStartTime: + { + TInt newFocusId = ECalenEditorEndDate; + + // Stop time erarliar that satrt time of event + if( CalenDateUtils::OnSameDay( iUnifiedEditor.Edited().StartDateTime(), + iUnifiedEditor.Edited().EndDateTime() ) ) + { + newFocusId = ECalenEditorEndTime; + } + iUnifiedEditor.TryChangeFocusToL( newFocusId ); + + handled = ETrue; + break; + } + case CCalenEditorDataHandler::EFormErrCancelSaveRepNoteWhenStartChange: + { + iUnifiedEditor.TryChangeFocusToL( ECalenEditorStartDate ); + handled = ETrue; + break; + } + default: + { + handled = EFalse; + break; + } + } + + TRACE_EXIT_POINT; + return handled; + } + +// ----------------------------------------------------------------------------- +// CCalenRepeatField::FormRepeatType +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TCalenRepeatIndex CCalenRepeatField::FormRepeatType() + { + TRACE_ENTRY_POINT; + TRACE_EXIT_POINT; + return static_cast( iRepeatTextValues->CurrentValueIndex() ); + } + +// ----------------------------------------------------------------------------- +// CCalenRepeatField::FormRepeatUntilDateTimeL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TTime CCalenRepeatField::FormRepeatUntilDateTimeL() + { + TRACE_ENTRY_POINT; + TRACE_EXIT_POINT; + return iUnifiedEditor.EditorFields().ReadDateField( ECalenEditorRepeatUntil ); + } + +// ---------------------------------------------------- +// CCalenMeetingForm::DeleteOtherItemFromRepeatField +// Delete "Other" item from repeat field. +// It MUST be called in following case. +// 1. Default repeat value is other then "Other". +// 2. Repeat is changed from "Other" to another value. +// +// If "Other" item has already been deleted, nothing is executed. +// (other items were commented in a header). +// ---------------------------------------------------- +// +void CCalenRepeatField::DeleteOtherItemFromRepeatField() + { + TRACE_ENTRY_POINT; + + TInt itemCount = iRepeatArrayText->Count(); + + if ( itemCount > ERepeatOther ) + // ERepeatOther is the last item index, + // which is zero origin. + { + iRepeatArrayText->Delete( ERepeatOther ); + } + + TRACE_EXIT_POINT; + } + +// --------------------------------------------------------- +// CCalenRepeatField::NotifyChangeRepeatChoiceL +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCalenRepeatField::NotifyChangeRepeatChoiceL() + { + TRACE_ENTRY_POINT; + + TInt repeatType = iRepeatTextValues->CurrentValueIndex(); + + if ( repeatType == ERepeatNotRepeated ) + { + // Repeat type field value selected as 'Non repeating' + iUnifiedEditor.Edited().SetNonRepeatingL(); + SetRepeatUntilLineDimmedL( ETrue ); + UpdateEndDateTimeFields(); + } + else + { + TTime start = iUnifiedEditor.Edited().StartDateTime(); + TTime until; + + if ( iUnifiedEditor.Edited().IsRepeating() ) + { + until = iUnifiedEditor.Edited().RepeatUntilDateTime(); + } + else + { + //Fix for repeated event date change: + TDateTime startDate = start.DateTime(); + + //Checking for leap year feb.29th, next year it should be 28. + TInt untilDay; + if(startDate.Month() == EFebruary && startDate.Day() == KLastDayInFebLeapYear) + { + untilDay = KLastDayInFebLeapYear - 1; + } + else + { + untilDay = startDate.Day(); + } + + TDateTime repOneYear(startDate.Year()+1,startDate.Month(), untilDay, 0, 0, 0, 0); + TTime aTime( repOneYear ); + until = aTime; + } + + iUnifiedEditor.Edited().SetRepeatingL( static_cast( repeatType ), until ); + SetRepeatUntilLineDimmedL( EFalse ); + SetDataToEditorL(); + } + + if ( repeatType != ERepeatOther ) + { + // Nothing is executed if "Other" item has already been deleted. + DeleteOtherItemFromRepeatField(); + } + + iUnifiedEditor.UpdateFormL(); + + TRACE_EXIT_POINT; + } + +// --------------------------------------------------------- +// CCalenRepeatField::SetRepeatUntilLineDimmedL +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCalenRepeatField::SetRepeatUntilLineDimmedL( const TBool& aDimmed ) + { + TRACE_ENTRY_POINT; + + CCoeControl* repUntilCtrl = iUnifiedEditor.ControlOrNull( ECalenEditorRepeatUntil ); + + if(aDimmed) + { + if( repUntilCtrl ) + { + // Delete RepeatUntil line from From + iUnifiedEditor.DeleteLine( ECalenEditorRepeatUntil, EFalse ); + } + } + else + { + if( !repUntilCtrl ) + { + // Insert RepeatUntil line to From + iUnifiedEditor.InsertFieldL( R_CALEN_EDITOR_REPEAT_UNTIL_ITEM, + ECalenEditorRepeatUntil, ECalenEditorRepeat ); + } + } + + TRACE_EXIT_POINT; + } + +// --------------------------------------------------------- +// CCalenRepeatField::UpdateEndDateTimeFields +// Called when "Repeat" is updated from any repeat value +// to "Not Repeated". +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCalenRepeatField::UpdateEndDateTimeFields() + { + TRACE_ENTRY_POINT; + + TTime end = iUnifiedEditor.Edited().EndDateTime(); + + if( iUnifiedEditor.HasField(ECalenEditorEndDate) ) + { + // Set End Date field value in Editor + iUnifiedEditor.EditorFields().SetDateField( ECalenEditorEndDate, end, EFalse ); + } + if( iUnifiedEditor.HasField( ECalenEditorEndTime ) ) + { + // Set End Time field value in Editor + iUnifiedEditor.EditorFields().SetTimeField( ECalenEditorEndTime, end ); + } + TRACE_EXIT_POINT; + } + +// ----------------------------------------------------------------------------- +// CCalenRepeatField::AskRepeatingNoteQueriesL +// Ask the user of the repeat type when neccessary +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CCalenEditorDataHandler::TError CCalenRepeatField::AskRepeatingNoteQueriesL( + CalCommon::TRecurrenceRange& aRepeatType) + { + TRACE_ENTRY_POINT; + + CCalenEditorDataHandler::TError error = CCalenEditorDataHandler::EFormErrNone; + + if( ShouldQueryRepeatTargetL() ) + { + // Query whether user want to edit This/all instanced of repeat entry. + error = QueryRepeatTargetL( aRepeatType ); + } + + TRACE_EXIT_POINT; + return error; + } + +// ----------------------------------------------------------------------------- +// CCalenRepeatField::ShouldQueryRepeatTargetL +// Check if the repeat query should be shown +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CCalenRepeatField::ShouldQueryRepeatTargetL() + { + TRACE_ENTRY_POINT; + + /** + * Show save to this/all query if: + * Editing a repeating entry (not for child entries!!!) + * AND + * any of the following fields have changed: + * subject, location, description, + * start time, end time, (not for date changes) + * alarm state, alarm time, alarm date + * + **/ + + if( iUnifiedEditor.IsCreatingNewEntry() || + ! iUnifiedEditor.Original().IsRepeating() || + ! iUnifiedEditor.Edited().IsRepeating() || + iUnifiedEditor.EditorDataHandler().IsChildL() ) + { + TRACE_EXIT_POINT; + return EFalse; + } + + // This should take care of checking start date editing: + if ( iUnifiedEditor.EditorDataHandler().IsRepeatRuleEdited() ) + { + TRACE_EXIT_POINT; + return EFalse; + } + + TBool isInstanceFieldEdited = + iUnifiedEditor.EditorDataHandler().IsSummaryEdited() || + iUnifiedEditor.EditorDataHandler().IsLocationEdited() || + iUnifiedEditor.EditorDataHandler().IsDescriptionEdited() || + iUnifiedEditor.EditorDataHandler().IsStartDateTimeEdited() || + iUnifiedEditor.EditorDataHandler().IsEndDateTimeEdited() || + iUnifiedEditor.EditorDataHandler().IsAlarmEditedL(); + + TRACE_EXIT_POINT; + return isInstanceFieldEdited; + } + +// ----------------------------------------------------------------------------- +// CCalenRepeatField::QueryRepeatTargetL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CCalenEditorDataHandler::TError CCalenRepeatField::QueryRepeatTargetL( + CalCommon::TRecurrenceRange& aRepeatType ) + { + TRACE_ENTRY_POINT; + + const TBool ok = CalenNoteDataUtil::ShowRepeatTypeQueryL( aRepeatType, + CalenNoteDataUtil::ESave ); + + if( !ok ) // Repeat dialog is canceled + { + TRACE_EXIT_POINT; + return CCalenEditorDataHandler::EFormErrCancelChangeRepeatingNote; + } + + TRACE_EXIT_POINT; + return CCalenEditorDataHandler::EFormErrNone; + } + +// ----------------------------------------------------------------------------- +// CCalenRepeatField::ReadDataFromFormL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCalenRepeatField::ReadDataFromFormL( TBool /*aContinueOnError*/ ) + { + TRACE_ENTRY_POINT; + + // read repeat type data from form + TCalenRepeatIndex repeatType = FormRepeatType(); + if ( repeatType == ERepeatNotRepeated ) + { + iUnifiedEditor.Edited().SetNonRepeatingL(); + } + else + { + TTime until = iUnifiedEditor.Edited().RepeatUntilDateTime(); + until = FormRepeatUntilDateTimeL(); + iUnifiedEditor.Edited().SetRepeatingL( repeatType, until ); + } + + TRACE_EXIT_POINT; + } + +// ----------------------------------------------------------------------------- +// CCalenRepeatField::SetDataToEditorL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCalenRepeatField::SetDataToEditorL() + { + TRACE_ENTRY_POINT; + + // Update repeat field data in Form + TCalenRepeatIndex pos = iUnifiedEditor.Edited().RepeatType(); + iRepeatTextValues->SetCurrentValueIndex( static_cast( pos ) ); + if ( iUnifiedEditor.Edited().IsRepeating() ) + { + // Set RepeatUntil date in Form + TTime until = iUnifiedEditor.Edited().RepeatUntilDateTime(); + iUnifiedEditor.EditorFields().SetDateField( ECalenEditorRepeatUntil, until ); + } + else + { + // Delete RepeatUntil line from Form + SetRepeatUntilLineDimmedL( ETrue ); + } + + TRACE_EXIT_POINT; + } + +// ----------------------------------------------------------------------------- +// CCalenRepeatField::InitRepetFieldLayoutL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCalenRepeatField::InitRepetFieldLayoutL() + { + TRACE_ENTRY_POINT; + + CAknPopupField* pops = + static_cast( iUnifiedEditor.Control( ECalenEditorRepeat ) ); + pops->SetQueryValueL(iRepeatTextValues); + + if( iUnifiedEditor.Edited().RepeatType() != ERepeatOther ) + { + DeleteOtherItemFromRepeatField(); + } + + if ( iUnifiedEditor.Edited().IsRepeating() ) + { + SetRepeatUntilLineDimmedL( EFalse ); + } + + TRACE_EXIT_POINT; + } + +// ----------------------------------------------------------------------------- +// CCalenRepeatField::PrepareForFocusTransitionL +// Prepare for focus change +// ----------------------------------------------------------------------------- +// +void CCalenRepeatField::PrepareForFocusTransitionL( TInt aFocusedId ) + { + TRACE_ENTRY_POINT; + + switch( aFocusedId ) + { + case ECalenEditorRepeatUntil: + { + TBool continueOnError = EFalse; + ReadDataFromFormL( continueOnError ); + break; + } + default: + { + break; + } + } + + TRACE_EXIT_POINT; + } + +// End of File