meetingrequest/mrgui/src/cesmrmixedfieldstorage.cpp
branchRCL_3
changeset 12 4ce476e64c59
parent 0 8466d47a6819
--- a/meetingrequest/mrgui/src/cesmrmixedfieldstorage.cpp	Mon Mar 15 12:39:10 2010 +0200
+++ b/meetingrequest/mrgui/src/cesmrmixedfieldstorage.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"
@@ -30,6 +30,7 @@
 #include "cesmrvalidatorfactory.h"
 #include "cesmrglobalnote.h"
 #include "cesmrfield.h"
+#include "cesmrfieldeventqueue.h"
 
 // Unnamed namespace for local definitions
 namespace { // codescanner::namespace
@@ -111,12 +112,35 @@
                     CESMRGlobalNote::EESMRAlarmAlreadyPassed );
             }
             break;
+            
         case MESMRFieldValidator::EErrorRescheduleInstance:
             {
             CESMRGlobalNote::ExecuteL(
                                 CESMRGlobalNote::EESMRRepeatReSchedule );
             }
             break;
+            
+        case MESMRFieldValidator::EErrorInstanceOverlapsExistingOne:
+            {
+            CESMRGlobalNote::ExecuteL(
+                                CESMRGlobalNote::EESMROverlapsExistingInstance );
+            }
+            break;
+            
+        case MESMRFieldValidator::EErrorInstanceAlreadyExistsOnThisDay:
+            {
+            CESMRGlobalNote::ExecuteL(
+                                CESMRGlobalNote::EESMRInstanceAlreadyExistsOnThisDay );
+            }
+            break;
+            
+        case MESMRFieldValidator::EErrorInstanceOutOfSequence:
+            {
+            CESMRGlobalNote::ExecuteL(
+                                CESMRGlobalNote::EESMRInstanceOutOfSequence );
+            }
+            break;
+            
         default:
             err = KErrNone;
             break;
@@ -135,11 +159,9 @@
 //
 CESMRMixedFieldStorage::CESMRMixedFieldStorage(
         MESMRFieldEventObserver& aEventObserver,
-        MESMRResponseObserver* aResponseObserver,
-        MESMRCalEntry& aEntry ) :
+        MESMRResponseObserver* aResponseObserver ) :
     CESMRFieldStorage( aEventObserver),
-    iResponseObserver(aResponseObserver),
-    iEntry(aEntry)
+    iResponseObserver(aResponseObserver)
     {
     FUNC_LOG;
     // Do nothing
@@ -161,7 +183,7 @@
 //
 CESMRMixedFieldStorage* CESMRMixedFieldStorage::NewL(
         MESMRFieldEventObserver& aEventObserver,
-        CESMRPolicy* aPolicy,
+        const CESMRPolicy& aPolicy,
         MESMRResponseObserver* aResponseObserver,
         MESMRCalEntry& aEntry )
     {
@@ -169,12 +191,11 @@
     CESMRMixedFieldStorage* self =
             new (ELeave) CESMRMixedFieldStorage(
                     aEventObserver,
-                    aResponseObserver,
-                    aEntry );
+                    aResponseObserver );
 
-    CleanupStack::PushL ( self );
-    self->ConstructL ( aPolicy );
-    CleanupStack::Pop ( self );
+    CleanupStack::PushL( self );
+    self->ConstructL( aPolicy, aEntry );
+    CleanupStack::Pop( self );
 
     return self;
     }
@@ -183,56 +204,14 @@
 // CESMRMixedFieldStorage::ConstructL
 // ---------------------------------------------------------------------------
 //
-void CESMRMixedFieldStorage::ConstructL( CESMRPolicy* aPolicy )
+void CESMRMixedFieldStorage::ConstructL(
+        const CESMRPolicy& aPolicy,
+        MESMRCalEntry& aEntry )
     {
     FUNC_LOG;
     CESMRFieldStorage::BaseConstructL();
-    // FORWARD allows only attendee fields and description to be edited.
-    // EDIT RECURRENT EVENT allows only start-end time and start date
-    // to be edited.
-
-    MESMRCalEntry::TESMRRecurrenceModifyingRule rule(
-            iEntry.RecurrenceModRule() );
-
-    if ( iEntry.IsRecurrentEventL() &&
-         rule == MESMRCalEntry::EESMRAllInSeries  &&
-         EESMREditMR == aPolicy->ViewMode())
-        {
-        // Contruct edit series
-        // validator ownership is transferred
-        MESMRFieldValidator* validator =
-        CESMRValidatorFactory::CreateValidatorL (
-                aPolicy->EventType() );
-
-        ConstructEditSeriesEventL(
-                aPolicy,
-                validator );
-
-        iEventType = EMixedFieldStorageEditSeriesEvent;
-        }
-
-    else if ( aPolicy->ViewMode() != EESMRForwardMR )
-        {
-        MESMRFieldValidator* validator =
-                CESMRValidatorFactory::CreateValidatorL (
-                            aPolicy->EventType() );
-
-        ConstructRecurrentEventL ( aPolicy,
-                validator );
-
-        iEventType = EMixedFieldStorageRecurrentEvent;
-        }
-    else
-        {
-        // No validator is needed because forwarding does not
-        // affecto to any time fields.
-        MESMRFieldValidator* validator = NULL;
-        ConstructForwardEventL (
-                aPolicy,
-                validator );
-
-        iEventType = EMixedFieldStorageForward;
-        }
+    
+    DoChangePolicyL( aPolicy, aEntry );
     }
 
 // ---------------------------------------------------------------------------
@@ -292,17 +271,30 @@
     }
 
 // ---------------------------------------------------------------------------
+// CESMRMixedFieldStorage::ChangePolicyL
+// ---------------------------------------------------------------------------
+//
+void CESMRMixedFieldStorage::ChangePolicyL(
+        const CESMRPolicy& aNewPolicy,
+        MESMRCalEntry& aEntry )
+    {
+    // Delegate to non-virtual
+    DoChangePolicyL( aNewPolicy, aEntry );
+    }
+
+
+// ---------------------------------------------------------------------------
 // CESMRMixedFieldStorage::ConstructForwardEventL
 // ---------------------------------------------------------------------------
 //
 void CESMRMixedFieldStorage::ConstructForwardEventL(
-        CESMRPolicy* aPolicy,
+        const CESMRPolicy& aPolicy,
         MESMRFieldValidator* aValidator )
     {
     FUNC_LOG;
     iValidator = aValidator;
     
-    RArray< TESMREntryField > array = aPolicy->Fields();
+    RArray< TESMREntryField > array = aPolicy.Fields();
 
     TInt fieldCount( array.Count() );
     for (TInt i(0); i < fieldCount; i++ )
@@ -316,20 +308,28 @@
             case EESMRFieldDescription:
                 {
                 field = CreateEditorFieldL( iValidator, array[i] );
-                CleanupStack::PushL( field );
                 }
                 break;
             default:
                 {
                 field =  
 					CreateViewerFieldL( iResponseObserver, array[i], visible );
-                CleanupStack::PushL( field );
+                field->LockL();
                 }
                 break;
             }
         
-        AddFieldL( field, visible );
-        CleanupStack::Pop( field );
+        if( field->FieldViewMode() != EESMRFieldTypeDisabled )
+            {
+            CleanupStack::PushL( field );
+            AddFieldL( field, visible );
+            CleanupStack::Pop( field );
+            }
+        else
+            {
+            delete field;
+            field = NULL;
+            }
         }
     }
 
@@ -338,13 +338,14 @@
 // ---------------------------------------------------------------------------
 //
 void CESMRMixedFieldStorage::ConstructRecurrentEventL(
-        CESMRPolicy* aPolicy,
+        const CESMRPolicy& aPolicy,
         MESMRFieldValidator* aValidator )
     {
     FUNC_LOG;
     iValidator = aValidator;
+    iValidator->SetFieldEventQueue( &EventQueueL() );
 
-    const RArray<TESMREntryField>& array = aPolicy->Fields();
+    const RArray<TESMREntryField>& array = aPolicy.Fields();
     TInt fieldCount( array.Count() );
     for (TInt i(0); i < fieldCount; ++i )
         {
@@ -354,11 +355,6 @@
             {
             case EESMRFieldRecurrence: //Fall through
             case EESMRFieldRecurrenceDate:
-                {
-                // When editing occurence --> Recurrence information
-                // is not shown
-                break;
-                }
             default:
                 field =  CreateEditorFieldL( iValidator, array[i] );
                 break;
@@ -378,18 +374,20 @@
 // ---------------------------------------------------------------------------
 //
 void CESMRMixedFieldStorage::ConstructEditSeriesEventL(
-        CESMRPolicy* aPolicy,
+        const CESMRPolicy& aPolicy,
         MESMRFieldValidator* aValidator )
     {
     FUNC_LOG;
     TESMRRecurrenceValue recurrenceType;
     TBool validRecurrence(
             HasValidRecurrenceForEditingL(
-                    iEntry,
+                    *iEntry,
                     recurrenceType ) );
 
     iValidator = aValidator;
-    const RArray<TESMREntryField>& array = aPolicy->Fields();
+    iValidator->SetFieldEventQueue( &EventQueueL() );
+    
+    const RArray<TESMREntryField>& array = aPolicy.Fields();
     CESMRField* field =  NULL;
     
     TInt fieldCount(  array.Count() );
@@ -405,8 +403,7 @@
                 {
                 if ( validRecurrence )
                     {
-                    field =  CreateEditorFieldL( iValidator, tfield );
-                    CleanupStack::PushL( field );
+                    field = CreateEditorFieldL( iValidator, tfield );
                     }
                 else
                     {
@@ -414,20 +411,98 @@
                     // --> Cannot be edited.
                     field = CreateViewerFieldL( 
 								iResponseObserver, tfield, visible );
-                    CleanupStack::PushL( field );
+                    field->LockL();
                     }
                 }
                 break;
             default:
                 {
-                field =  CreateEditorFieldL( iValidator, tfield );
-                CleanupStack::PushL( field );
+                field = CreateEditorFieldL( iValidator, tfield );
                 }
                 break;
             }
-        
-        AddFieldL( field, visible );
-        CleanupStack::Pop( field );
+
+        if( field->FieldViewMode() != EESMRFieldTypeDisabled )
+            {
+            CleanupStack::PushL( field );
+            AddFieldL( field, visible );
+            CleanupStack::Pop( field );
+            }
+        else
+            {
+            delete field;
+            field = NULL;
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRMixedFieldStorage::ConstructEditSeriesEventL
+// ---------------------------------------------------------------------------
+//
+void CESMRMixedFieldStorage::Reset()
+    {
+    CESMRFieldStorage::Reset();
+    delete iValidator;
+    iValidator = NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRMixedFieldStorage::DoChangePolicyL
+// ---------------------------------------------------------------------------
+//
+void CESMRMixedFieldStorage::DoChangePolicyL(
+        const CESMRPolicy& aNewPolicy,
+        MESMRCalEntry& aEntry )
+    {
+    Reset();
+    iEntry = &aEntry;
+    
+    // FORWARD allows only attendee fields and description to be edited.
+    // EDIT RECURRENT EVENT allows only start-end time and start date
+    // to be edited.
+
+    MESMRCalEntry::TESMRRecurrenceModifyingRule rule(
+            iEntry->RecurrenceModRule() );
+
+    if ( iEntry->IsRecurrentEventL() &&
+         rule == MESMRCalEntry::EESMRAllInSeries  &&
+         EESMREditMR == aNewPolicy.ViewMode())
+        {
+        // Contruct edit series
+        // validator ownership is transferred
+        MESMRFieldValidator* validator =
+        CESMRValidatorFactory::CreateValidatorL (
+                aNewPolicy.EventType() );
+
+        ConstructEditSeriesEventL(
+                aNewPolicy,
+                validator );
+
+        iEventType = EMixedFieldStorageEditSeriesEvent;
+        }
+
+    else if ( aNewPolicy.ViewMode() != EESMRForwardMR )
+        {
+        MESMRFieldValidator* validator =
+                CESMRValidatorFactory::CreateValidatorL (
+                        aNewPolicy.EventType() );
+
+        ConstructRecurrentEventL ( aNewPolicy,
+                validator );
+
+        iEventType = EMixedFieldStorageRecurrentEvent;
+        }
+    else
+        {
+        // No validator is needed because forwarding does not
+        // affecto to any time fields.
+        MESMRFieldValidator* validator = NULL;
+        ConstructForwardEventL (
+                aNewPolicy,
+                validator );
+
+        iEventType = EMixedFieldStorageForward;
         }
     }