calendarui/editors/src/calenreminderfield.cpp
changeset 0 f979ecb2b13e
child 48 bf573002ff72
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/calendarui/editors/src/calenreminderfield.cpp	Tue Feb 02 10:12:19 2010 +0200
@@ -0,0 +1,556 @@
+/*
+* 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 : Class looking after alarm fields for forms.
+*
+*/
+
+// user includes
+#include "calenreminderfield.h"
+#include "CalenDefaultEditors.hrh"
+#include "calenunifiededitor.h"
+
+// system includes 
+#include <AknQueryValueText.h>
+#include <AknPopupField.h>
+#include <AknUtils.h>
+#include <eikenv.h>
+#include <eikedwin.h>
+#include <eikmfne.h>
+#include <StringLoader.h>
+#include <eikdialg.h>
+#include <centralrepository.h>
+#include <calalarm.h>
+#include <calentry.h>
+#include <calrrule.h>
+#include <caltime.h>
+#include <calendateutils.h>
+#include <CalenDefaultEditorsData.rsg>
+#include <calenconstants.h>
+
+//debug
+#include "calendarui_debug.h"
+
+// -----------------------------------------------------------------------------
+// CCalenReminderField::NewL()
+// Two-phased constructor.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CCalenReminderField* CCalenReminderField::NewL( CCalenUnifiedEditor& aUnifiedEditor )
+    {
+    TRACE_ENTRY_POINT;
+
+    CCalenReminderField* self =
+        new( ELeave ) CCalenReminderField( aUnifiedEditor );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+
+    TRACE_EXIT_POINT;
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenReminderField::CCalenReminderField()
+// Constructor.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CCalenReminderField::CCalenReminderField( CCalenUnifiedEditor& aUnifiedEditor )
+    : iUnifiedEditor( aUnifiedEditor )
+    {
+    TRACE_ENTRY_POINT;
+    TRACE_EXIT_POINT;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenReminderField::ConstructL()
+// Leaving construction.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCalenReminderField::ConstructL()
+    {
+    TRACE_ENTRY_POINT;
+    
+    iIsAlarmOnOff = CCalenReminderField::EAlarmNoAlarm;
+    
+    TRACE_EXIT_POINT;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenReminderField::~CCalenReminderField()
+// Destructor.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CCalenReminderField::~CCalenReminderField()
+    {
+    TRACE_ENTRY_POINT;
+
+    TRACE_EXIT_POINT;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenReminderField::DeleteMeaninglessLinesL()
+// Remove any lines not needed by the current entry.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCalenReminderField::DeleteMeaninglessLinesL()
+    {
+    TRACE_ENTRY_POINT;
+
+    if ( !iUnifiedEditor.Edited().IsAlarmActivated() )
+        {
+        SetAlarmDateTimeLinesDimmedL( ETrue );
+        }
+
+    TRACE_EXIT_POINT;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenReminderField::SetAlarmDateTimeLinesDimmedL()
+// Delete alarm time and date items from form.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCalenReminderField::SetAlarmDateTimeLinesDimmedL(
+    const TBool& aDimmed )
+    {
+    TRACE_ENTRY_POINT;
+
+    CCoeControl* alarmDateCtrl = iUnifiedEditor.ControlOrNull( ECalenEditorReminderDate );
+    CCoeControl* alarmTimeCtrl = iUnifiedEditor.ControlOrNull( ECalenEditorReminderTime );
+    		
+    if( aDimmed )
+        {
+        // Alarm Off, Delete alarm date & alarm time fields from Editor
+        if( alarmTimeCtrl )
+            {
+            iUnifiedEditor.DeleteLine( ECalenEditorReminderTime,ETrue );
+            }
+        if( alarmDateCtrl )
+            {
+            iUnifiedEditor.DeleteLine( ECalenEditorReminderDate,ETrue );
+            }
+        }
+    else
+        {
+        // Alarm On, Add alarm time & alarm date fields to Editor
+        if(!alarmDateCtrl)
+            {		
+            iUnifiedEditor.InsertFieldL( R_CALEN_EDITOR_REMINDER_TIME_ITEM,
+                    ECalenEditorReminderTime, ECalenEditorReminder);
+            }
+        if(!alarmTimeCtrl)
+            {
+            iUnifiedEditor.InsertFieldL( R_CALEN_EDITOR_REMINDER_DATE_ITEM,
+                    ECalenEditorReminderDate, ECalenEditorReminderTime);
+            }
+        }
+
+    TRACE_EXIT_POINT;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenReminderField::HandleControlStateChangeL()
+// Called when a field is modifed.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCalenReminderField::HandleControlStateChangeL(TInt aControlId )
+    {
+    TRACE_ENTRY_POINT;
+
+    switch (aControlId)
+        {
+        case ECalenEditorReminder:
+            {
+            HandleAlarmActiveFieldChangeL();
+            break;
+            }
+        default:
+            break;
+        }
+
+    TRACE_EXIT_POINT;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenReminderField::NotifyChangeIsAlarmActiveL()
+// Called when an alarm field is changed.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCalenReminderField::HandleAlarmActiveFieldChangeL( )
+    {
+    TRACE_ENTRY_POINT;
+    // Activate and initialize the alarm field if it is not already on
+    if( IsAlarmActiveInForm() )
+        {
+        if( !iUnifiedEditor.Edited().IsAlarmActivated() )
+            {
+            // no more info note "Alarm Already Passed"
+            // if the note is an old note and it is in past
+            iUnifiedEditor.EditorDataHandler().SetDefaultAlarmDateTimeL();
+            SetAlarmDateTimeLinesDimmedL( EFalse );
+            SetDataToEditorL();
+            }
+        }
+    else
+        {
+        // Hide alarm date/time field
+        iUnifiedEditor.Edited().SetAlarmOffL();
+        SetAlarmDateTimeLinesDimmedL( ETrue );
+        }
+
+    iUnifiedEditor.UpdateFormL();
+
+    TRACE_EXIT_POINT;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenReminderField::UpdateAlarmDateTimeWhenStartChanged()
+// When the start time of the entry is changed, this function
+// gets called to keep the time interval between the entry start
+// and the alarm constant.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCalenReminderField::UpdateAlarmTimeWhenStartChangedL()
+    {
+    TRACE_ENTRY_POINT;
+
+    // Updating operation is executed only if alarm date/time field exists.
+    if( iUnifiedEditor.Edited().IsAlarmActivated() )
+        {
+        TTime start = iUnifiedEditor.Edited().EventDateTime();
+        TTime alarm = start + iAlarmOffset;
+        alarm = CalenDateUtils::LimitToValidTime( alarm );
+        iUnifiedEditor.Edited().SetAlarmDateTimeL( alarm );
+        SetDataToEditorL();
+        }
+
+    TRACE_EXIT_POINT;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenReminderField::SetAlarmDateTimeField()
+// Sets the alarm date/time to the specified TTime.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCalenReminderField::SetAlarmDateTimeField( const TTime& aTime )
+    {
+    TRACE_ENTRY_POINT;
+
+    iUnifiedEditor.EditorFields().SetTimeField( ECalenEditorReminderTime, aTime );
+    iUnifiedEditor.EditorFields().SetDateField( ECalenEditorReminderDate, aTime );
+
+    TRACE_EXIT_POINT;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenReminderField::HandleErrorL()
+// Handle error codes related to the alarm fields.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CCalenReminderField::HandleErrorL( const TInt& aError )
+    {
+    TRACE_ENTRY_POINT;
+    
+    TBool handled = EFalse;
+    switch ( aError )
+        {
+        case CCalenEditorDataHandler::EFormErrAlarmTimeLaterThanNote:
+            {
+            TTime startDay = CalenDateUtils::BeginningOfDay( iUnifiedEditor.Edited().EventDateTime() );
+            TTime alarmDay = CalenDateUtils::BeginningOfDay( iUnifiedEditor.Edited().AlarmDateTime() );
+
+            TInt newFocusId = startDay == alarmDay ? ECalenEditorReminderTime : ECalenEditorReminderDate;
+            iUnifiedEditor.TryChangeFocusToL( newFocusId );
+            handled = ETrue;
+            break;
+            }
+        case CCalenEditorDataHandler::EFormErrAlarmDateTooManyDaysBeforeNote:
+            {
+            iUnifiedEditor.TryChangeFocusToL( ECalenEditorReminderDate );
+            handled = ETrue;
+            break;
+            }
+        case CCalenEditorDataHandler::EFormErrAlarmTimePast:
+            {
+            TTime alarmTime = iUnifiedEditor.Edited().AlarmDateTime();
+
+            TTime now;
+            now.HomeTime();
+            TInt newFocusId = ECalenEditorReminderDate;
+            if( CalenDateUtils::OnSameDay( now, alarmTime ) )
+                {
+                newFocusId = ECalenEditorReminderTime;
+                }
+            iUnifiedEditor.TryChangeFocusToL( newFocusId );
+ 
+            handled = ETrue;
+            break;
+            }
+        default:
+            handled = EFalse;
+            break;
+        }
+
+     TRACE_EXIT_POINT;
+    return handled;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenReminderField::PrepareForFocusTransitionL()
+// Called when focus is moved from the specified line.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCalenReminderField::PrepareForFocusTransitionL( TInt aFocusedId )
+    {
+    TRACE_ENTRY_POINT;
+
+    switch( aFocusedId )
+        {
+        case ECalenEditorStartDate:
+        case ECalenEditorStartTime:
+            {
+            UpdateAlarmTimeWhenStartChangedL();
+            break;
+            }
+        case ECalenEditorReminderDate:
+        case ECalenEditorReminderTime:
+            {
+            const TBool continueOnError = EFalse;
+            ReadDataFromFormL( continueOnError );
+            TTime start = iUnifiedEditor.Edited().EventDateTime();
+            TTime alarm = iUnifiedEditor.Edited().AlarmDateTime();
+            User::LeaveIfError( alarm.MinutesFrom( start, iAlarmOffset ) );
+            break;
+            }
+        default:
+            {
+            break;
+            }
+        }
+
+    TRACE_EXIT_POINT;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenReminderField::IsStartTimeInFutureL()
+// Checks to see if the current value of the alarm date/time line is in the future.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CCalenReminderField::IsStartTimeInFutureL()
+    {
+    TRACE_ENTRY_POINT;
+
+    TTime currentTime;
+    currentTime.HomeTime();
+
+    TTime start = iUnifiedEditor.Edited().EventDateTime();
+
+    if( iUnifiedEditor.EditorDataHandler().IsTimedEntry() )
+        {
+        if( currentTime>start )
+            {
+            TRACE_EXIT_POINT;
+            return EFalse;
+            }
+        }
+    else
+        {
+        TTime startDay = CalenDateUtils::BeginningOfDay( start );
+        TTime currentDay = CalenDateUtils::BeginningOfDay( currentTime );
+        if( currentDay>startDay )
+            {
+            TRACE_EXIT_POINT;
+            return EFalse;
+            }
+        }
+
+    TRACE_EXIT_POINT;
+    return ETrue;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenReminderField::IsAlarmActiveInForm()
+// Checks to see if the alarm is active.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CCalenReminderField::IsAlarmActiveInForm()
+    {
+    TRACE_ENTRY_POINT;
+
+    TInt pos = iIsAlarmOnOff;
+
+    TRACE_EXIT_POINT;
+    return pos == CCalenReminderField::EAlarmActive;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenReminderField::SetDataToEditorL()
+// Reads data from the entry and updates the form with the appropriate values.
+// -----------------------------------------------------------------------------
+//
+void CCalenReminderField::SetDataToEditorL()
+    {
+    TRACE_ENTRY_POINT;
+
+    // Alarm popup choice item
+    TInt pos = CCalenReminderField::EAlarmNoAlarm;
+
+    if ( iUnifiedEditor.Edited().IsAlarmActivated() )
+        {
+        pos = CCalenReminderField::EAlarmActive;
+
+        // FIXME: How about todos with different start and end dates?
+        TTime alarm = iUnifiedEditor.Edited().AlarmDateTime();        
+        TTime start = iUnifiedEditor.Edited().EventDateTime();
+
+        User::LeaveIfError( alarm.MinutesFrom( start, iAlarmOffset ) );
+        SetAlarmDateTimeField( alarm );
+        }
+    else
+        {
+        SetAlarmDateTimeLinesDimmedL( ETrue );
+        }
+
+    iIsAlarmOnOff = pos;    
+    
+    if( pos == CCalenReminderField::EAlarmActive )
+        {
+        iUnifiedEditor.EditorFields().SetAlarmFieldOnOffL( ETrue );               
+        }
+    else 
+        {
+        iUnifiedEditor.EditorFields().SetAlarmFieldOnOffL( EFalse );  
+        }   
+
+    TRACE_EXIT_POINT;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenReminderField::ReadDataFromFormL()
+// Reads data from the form and updates the entry with the appropriate values.
+// -----------------------------------------------------------------------------
+//
+void CCalenReminderField::ReadDataFromFormL( TBool aContinueOnError )
+    {
+    TRACE_ENTRY_POINT;
+
+    if( IsAlarmActiveInForm() )
+        {
+        TTime alarm = iUnifiedEditor.Edited().AlarmDateTime();
+        TRAPD(err, alarm = AlarmDateTimeFromFormL() );
+        if(!aContinueOnError)
+            {
+            User::LeaveIfError( err );
+            }
+        iUnifiedEditor.Edited().SetAlarmDateTimeL( alarm );
+        }
+    else
+        {
+        iUnifiedEditor.Edited().SetAlarmOffL();
+        }
+
+    TRACE_EXIT_POINT;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenReminderField::InitReminderFieldLdayoutL()
+// Updates fields just before the form is shown.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCalenReminderField::InitReminderFieldLdayoutL()
+    {
+    TRACE_ENTRY_POINT;
+    
+    if(iUnifiedEditor.Edited().IsAlarmActivated() )
+        {
+        SetAlarmDateTimeLinesDimmedL( EFalse );
+        }
+    else
+        {
+        SetAlarmDateTimeLinesDimmedL( ETrue );
+        }
+    
+    TRACE_EXIT_POINT;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenReminderField::GetTimeField
+// Get the time field in touch layouts
+// -----------------------------------------------------------------------------
+//
+TTime CCalenReminderField::GetTimeField( TInt aControlId )
+	{
+	TRACE_ENTRY_POINT;
+	TRACE_EXIT_POINT;
+	
+	return iUnifiedEditor.EditorFields().ReadTimeField( aControlId );
+	}
+
+// -----------------------------------------------------------------------------
+// CCalenReminderField::AlarmDateTimeFromFormL()
+// Returns the current date/time value of the alarm field.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TTime CCalenReminderField::AlarmDateTimeFromFormL()
+	{
+    TRACE_ENTRY_POINT;
+    
+    // get user entered date & time from the editor
+    TTime alarm = CalenDateUtils::BeginningOfDay( GetTimeField( ECalenEditorReminderDate ) );
+    alarm += CalenDateUtils::TimeOfDay( GetTimeField( ECalenEditorReminderTime ) );
+    
+    TRACE_EXIT_POINT;
+    return alarm;
+	}
+// -----------------------------------------------------------------------------
+// CCalenReminderField::CheckAlarmActive()
+// Gets the info whether alarm on/off 
+// adds & updates the alarm fields accordingly
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+// 
+void CCalenReminderField::CheckAlarmActive( TBool aAlarmActive )
+    {
+    TRACE_ENTRY_POINT;     
+
+    if( aAlarmActive )
+        {
+        iIsAlarmOnOff = CCalenReminderField::EAlarmActive;
+        }
+    else 
+        {
+        iIsAlarmOnOff = CCalenReminderField::EAlarmNoAlarm;
+        }   
+    
+    TRAP_IGNORE( HandleAlarmActiveFieldChangeL() );
+    
+    TRACE_EXIT_POINT;
+    }
+ 
+// End of File