calendarui/editors/src/calenrepeatfield.cpp
branchRCL_3
changeset 30 bd7edf625bdd
--- /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 <AknPopupField.h>
+#include <AknQueryValueText.h>
+#include <calentry.h>
+#include <calrrule.h>
+#include <calendateutils.h>
+#include <CalenDefaultEditorsData.rsg>
+
+// 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<TCalenRepeatIndex>( 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<TCalenRepeatIndex>( 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<TInt>( 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<CAknPopupField*>( 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