meetingrequest/mrgui/src/cesmrannivtimevalidator.cpp
branchRCL_3
changeset 12 4ce476e64c59
parent 0 8466d47a6819
--- a/meetingrequest/mrgui/src/cesmrannivtimevalidator.cpp	Mon Mar 15 12:39:10 2010 +0200
+++ b/meetingrequest/mrgui/src/cesmrannivtimevalidator.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"
@@ -147,7 +147,11 @@
 inline CESMRAnnivTimeValidator::CESMRAnnivTimeValidator()
 :   iCurrentAnnivDate( Time::NullTTime() ),
     iCurrentAlarmTime( Time::NullTTime() ),
-    iAlarmOnOff( EFalse )
+    iAlarmOnOff( EFalse ),
+    iInitialAlarmTime( Time::NullTTime() ),
+    iInitialAlarmOnOff( EFalse ),
+    iInitialStartDate( Time::NullTTime() )
+
     {
     }
 
@@ -237,7 +241,7 @@
         TCalTime startTime = entry.StartTimeL();
         iCurrentAnnivDate = startTime.TimeLocalL();
         SetDateToEditor( *iStartDate, iCurrentAnnivDate );
-
+        iInitialStartDate = iStartDate->Date();
 
         CCalAlarm* alarm = entry.AlarmL();
         CleanupStack::PushL( alarm );
@@ -246,9 +250,13 @@
             {
             iCurrentAlarmTime = iCurrentAnnivDate - alarm->TimeOffset();
             iAlarmOnOff = ETrue;
+            iInitialAlarmOnOff = iAlarmOnOff;
 
             SetTimeToEditor( *iAlarmTime, iCurrentAlarmTime );
             SetDateToEditor( *iAlarmDate, iCurrentAlarmTime );
+            
+            iInitialAlarmTime = iAlarmTime->Time();
+            iInitialAlarmDate = iAlarmDate->Date();
             }
 
         CleanupStack::PopAndDestroy( alarm );
@@ -268,66 +276,75 @@
         {
         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() )
+        TDateTime annivEditorTime = StartTimeL();
+        
+        // If entry has been modified, we will write new values to entry.
+        // Otherwise entry will not be modified and thus saved 
+        // (ex. new entry and press only Done )
+        if( IsModifiedL( aEntry ) )
             {
-            TCalTime::TTimeMode timeMode =
-                            aEntry.Entry().StartTimeL().TimeMode();
-
-            switch ( timeMode )
+            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() )
                 {
-                case TCalTime::EFixedUtc:
-                	{
-                    annivTime.SetTimeUtcL( annivEdirotTime );
-                    break;
-                	}
-                case TCalTime::EFixedTimeZone:
-                	{
-                    annivTime.SetTimeLocalL( annivEdirotTime );
-                    break;
-                	}
-                case TCalTime::EFloating:
-                default:
-                	{
-                    annivTime.SetTimeLocalFloatingL( annivEdirotTime );
-                	}
+                TCalTime::TTimeMode timeMode =
+                                aEntry.Entry().StartTimeL().TimeMode();
+    
+                switch ( timeMode )
+                    {
+                    case TCalTime::EFixedUtc:
+                        {
+                        annivTime.SetTimeUtcL( annivEditorTime );
+                        break;
+                        }
+                    case TCalTime::EFixedTimeZone:
+                        {
+                        annivTime.SetTimeLocalL( annivEditorTime );
+                        break;
+                        }
+                    case TCalTime::EFloating:
+                    default:
+                        {
+                        annivTime.SetTimeLocalFloatingL( annivEditorTime );
+                        }
+                    }
                 }
-            }
-        else
-            {
-            annivTime.SetTimeLocalFloatingL( annivEdirotTime );
-            }
+            else
+                {
+                annivTime.SetTimeLocalFloatingL( annivEditorTime );
+                }
+    
+            entry.SetStartAndEndTimeL( annivTime, annivTime );
 
-        entry.SetStartAndEndTimeL( annivTime, annivTime );
-        if ( iAlarmOnOff )
-            {
-            TTimeIntervalMinutes diff;
 
-            TTime alarm = AlarmTimeL();
-            annivEdirotTime.MinutesFrom( alarm, diff );
-
-            CCalAlarm* alarmObject = entry.AlarmL();
-            if ( !alarmObject )
+            // Setting alarm only if entry needs to be saved
+            if ( iAlarmOnOff )
                 {
-                alarmObject = CCalAlarm::NewL();
+                TTimeIntervalMinutes diff;
+                
+                TTime alarm = AlarmTimeL();
+                TTime editorTime = annivEditorTime;
+                editorTime.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;
                 }
-            CleanupStack::PushL( alarmObject );
-            alarmObject->SetTimeOffset( diff );
-            entry.SetAlarmL( alarmObject );
-            CleanupStack::PopAndDestroy( alarmObject );
-            alarmObject = NULL;
-            }
-        else
-            {
-            entry.SetAlarmL( NULL );
+            else
+                {
+                entry.SetAlarmL( NULL );
+                }
             }
         }
     }
@@ -363,6 +380,11 @@
     {
     FUNC_LOG;
     iStartDate = &aStartDate;
+    
+    if ( Time::NullTTime() != iCurrentAnnivDate )
+        {
+        SetDateToEditor( *iStartDate, iCurrentAnnivDate );
+        }    
     }
 
 // ---------------------------------------------------------------------------
@@ -385,6 +407,11 @@
     {
     FUNC_LOG;
     iAlarmTime = &aAlarmTime;
+    
+    if ( iAlarmOnOff )
+        {
+        SetTimeToEditor( *iAlarmTime, iCurrentAlarmTime );
+        }
     }
 
 // ---------------------------------------------------------------------------
@@ -396,6 +423,11 @@
     {
     FUNC_LOG;
     iAlarmDate = &aAlarmDate;
+    
+    if ( iAlarmOnOff )
+        {
+        SetDateToEditor( *iAlarmDate, iCurrentAlarmTime );
+        }
     }
 
 // ---------------------------------------------------------------------------
@@ -410,6 +442,17 @@
     }
 
 // ---------------------------------------------------------------------------
+// CESMRAnnivTimeValidator::SetAbsoluteAlarmOnOffFieldL
+// ---------------------------------------------------------------------------
+//
+void CESMRAnnivTimeValidator::SetAbsoluteAlarmOnOffFieldL( 
+        MMRAbsoluteAlarmController& /*aAbsoluteAlarmController*/ )
+    {
+    FUNC_LOG;
+    // No implementation for anniversary
+    }
+
+// ---------------------------------------------------------------------------
 // CESMRAnnivTimeValidator::StartTimeChangedL
 // ---------------------------------------------------------------------------
 //
@@ -620,12 +663,12 @@
         iStartDate->PrepareForFocusLossL();
         }
 
-    if ( iAlarmTime && iAlarmTime->IsVisible() )
+    if ( iAlarmOnOff && iAlarmTime && iAlarmTime->IsVisible() )
         {
         iAlarmTime->PrepareForFocusLossL();
         }
 
-    if ( iAlarmDate && iAlarmDate->IsVisible() )
+    if ( iAlarmOnOff && iAlarmDate && iAlarmDate->IsVisible() )
         {
         iAlarmDate->PrepareForFocusLossL();
         }
@@ -731,5 +774,36 @@
         }
     }
 
+// ---------------------------------------------------------------------------
+// CESMRAnnivTimeValidator::IsModifiedL
+// ---------------------------------------------------------------------------
+//
+TBool CESMRAnnivTimeValidator::IsModifiedL( MESMRCalEntry& aEntry )
+    {
+    // Checks if any of the editor fields have changed from the original /
+    // initial values
+    TBool isEdited( EFalse );
+    
+    TBool isSame = aEntry.Entry().CompareL( aEntry.OriginalEntry() );
+        
+    if( !isSame ||
+            iInitialAlarmOnOff != iAlarmOnOff ||
+                iStartDate->Date() != iInitialStartDate )
+        {
+        isEdited = ETrue;
+        }
+
+    // If alarm is on, we will check alarm time and date also for changes
+    if( iAlarmOnOff )
+        {
+        if( iAlarmTime->Time() != iInitialAlarmTime ||
+                iAlarmDate->Date() != iInitialAlarmDate )
+            {
+            isEdited = ETrue;
+            }
+        }
+
+    return isEdited;
+    }
+
 // EOF
-