calendarui/controller/src/calenmultidbeditor.cpp
branchRCL_3
changeset 66 bd7edf625bdd
child 67 1539a383d7b6
child 78 356f28cd5ca0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/calendarui/controller/src/calenmultidbeditor.cpp	Wed Sep 01 12:32:31 2010 +0100
@@ -0,0 +1,1284 @@
+/*
+* Copyright (c) 2002 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:  Include common routine for each note editor.
+ *                For example, handling menu, key event, error handling etc.
+ *
+*/
+
+#include <AknColourSelectionGrid.h>
+#include <eikrted.h>
+#include <aknnotewrappers.h>
+#include <bldvariant.hrh>
+#include <coeaui.h>
+#include <eikcapc.h>
+#include <eikedwin.h>
+#include <StringLoader.h>
+#include <aknnavi.h>
+#include <txtrich.h>
+#include <hlplch.h>
+#include <calcalendarinfo.h>
+#include <Calendar.rsg>
+#include <calencommonui.rsg>
+#include <sysutil.h>
+#include <ErrorUI.h>
+
+#include "calenmultidbeditor.h"
+#include "calendarui_debug.h"
+#include "calendar.hrh"
+#include "calentitlepane.h"
+#include "calencontroller.h"
+#include "calenmultipledbui.h"
+
+// Constants.
+const TUint16 KIllegalChars[] = {
+    '<', '>', '"', '/', '//', '|', ':', '*', '?',
+    0xFF02, // Full width quote
+    0xFF0A, // Full width asterisk
+    0xFF0F, // Full width slash
+    0xFF1A, // Full width colon
+    0xFF1C, // Full width left arrow
+    0xFF1E, // Full width right arrow
+    0xFF1F, // Full width question mark
+    0xFF3C, // Full width back slash
+    0xFF5C, // Full width pipe
+    0x201C, // Left quote
+    0x201D, // Right quote
+    0x201F, // Reversed quote
+    0x21B2, // Downwards arrow with tip leftwards
+    0, // Array terminator
+};
+const TInt KCalenMaxELAFTextEditorLength(256);
+const TInt KOne( 1 );
+const TInt KBuffLength ( 16 );
+const TInt KTen( 10 );
+
+// Literals.
+_LIT( KFormatStringTwoDigit, "%02d" );
+_LIT( KFormatString, "%d" );
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ----------------------------------------------------------------------------
+// CCalenMultiDBEditor::NewL
+// Two-phased constructor.
+// ----------------------------------------------------------------------------
+// 
+CCalenMultiDBEditor* CCalenMultiDBEditor::NewL(
+        CCalenMultipleDbUi& aMultipleDbui, CCalCalendarInfo& aCalendarInfo,
+        CCalenController& aController, TBool aEditFlag)
+    {
+    TRACE_ENTRY_POINT;
+
+    CCalenMultiDBEditor* self = new (ELeave) CCalenMultiDBEditor(
+            aMultipleDbui, aCalendarInfo, aController, aEditFlag);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+
+    TRACE_EXIT_POINT;
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenMultiDBEditor::~CCalenMultiDBEditor
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CCalenMultiDBEditor::~CCalenMultiDBEditor()
+    {
+    TRACE_ENTRY_POINT; 
+    
+    if(iRgbColors)
+        {
+        iRgbColors->Reset();
+        delete iRgbColors;
+        iRgbColors = NULL;
+        }
+    
+    if(iCalendarName)
+        {
+        delete iCalendarName;
+        iCalendarName = NULL;
+        }
+    
+    if( iNaviContainer )
+        {
+        iNaviContainer->Pop(); // Remove navi pane used by settings view
+        iNaviContainer = NULL; // iNaviContainer is not owned
+        }
+    TRACE_EXIT_POINT;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenMultiDBEditor::CCalenMultiDBEditor
+// C++ constructor can NOT contain any code, that might leave.
+// This overload is used when the repeat type is known.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CCalenMultiDBEditor::CCalenMultiDBEditor(CCalenMultipleDbUi& aMultipleDbui,
+        CCalCalendarInfo& aCalendarInfo, CCalenController& aController,
+        TBool aEditFlag) :
+            iCalendarInfo(aCalendarInfo), iController(
+            aController), iEditFlag(aEditFlag),
+			iMultipleDbUi(aMultipleDbui)
+    {
+    TRACE_ENTRY_POINT;
+    
+    iCalendarStatus = ECalenMultiDbVisible;
+
+    TRACE_EXIT_POINT;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenMultiDBEditor::ConstructL
+// Leaving construction common to all editors.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCalenMultiDBEditor::ConstructL()
+     {
+    TRACE_ENTRY_POINT;
+    
+    iConflict = CCalenMultiDBEditor::EConflictNone;
+    
+    CAknDialog::ConstructL( R_CALEN_MULTIDB_MENUBAR );  // superclass
+    SetTitlePaneL();
+    iCalendarName = HBufC::NewL(KCalenMaxELAFTextEditorLength); 
+        
+    //Initial color value
+    iColVal = iCalendarInfo.Color().Value();  
+    iChoosenColor = TRgb(iColVal);
+        
+    iPicture = new( ELeave )CDbColorPicture( TSize( 0, 0 ) );
+    iPicture->SetRgbColorsL(iChoosenColor);
+    
+    
+    
+    LoadColorsL();
+    
+    TRACE_EXIT_POINT;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenMultiDBEditor::LoadColorsL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCalenMultiDBEditor::LoadColorsL()
+    {
+    TRACE_ENTRY_POINT
+    
+    if(iRgbColors)
+        {
+        iRgbColors->Reset();
+        delete iRgbColors;
+        iRgbColors = NULL;
+        }
+    
+    iRgbColors = new(ELeave) CArrayFixFlat<TRgb>(2);
+    
+    iRgbColors->AppendL(KCalenDarkBlue);
+    iRgbColors->AppendL(KCalenDarkGreen);
+    iRgbColors->AppendL(KCalenDarkRed);
+    iRgbColors->AppendL(KCalenMegenta);
+    iRgbColors->AppendL(KCalenBlue);
+    iRgbColors->AppendL(KCalenGreen);
+    iRgbColors->AppendL(KCalenOrange);
+    iRgbColors->AppendL(KCalenlightMagenta);
+    iRgbColors->AppendL(KCalenCyan);
+    iRgbColors->AppendL(KCalenlightGreen);
+    iRgbColors->AppendL(KCalenYellow);
+    iRgbColors->AppendL(KCalenlightPink);
+    iRgbColors->AppendL(KCalenlightBlue);
+    iRgbColors->AppendL(KCalenGold);
+    iRgbColors->AppendL(KCalenDarkOrange);
+    iRgbColors->AppendL(KCalenPink);
+    
+    TRACE_EXIT_POINT
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenMultiDBEditor::ProcessCommandL
+// Process commands from the user.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCalenMultiDBEditor::ProcessCommandL( TInt aCommandId )
+    {
+    TRACE_ENTRY_POINT;
+    
+    HideMenu();
+    
+    switch(aCommandId)
+	    {
+	    case ECalenMultiDbHelp:
+			{
+			HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession(),
+                                		(iEikonEnv->AppUi())->AppHelpContextL ());
+			}
+			break;
+		case EAknCmdExit:
+		case EAknSoftkeyExit:
+			{
+			TryExitL( EAknSoftkeyExit );			
+			}
+			break;
+			
+		case EAknSoftkeyChange:
+		    {
+			if( ECalenMultiDbHiddenVisible == IdOfFocusControl() )
+		        {
+		        iCalendarStatus = iCalendarInfo.Enabled();
+
+		        if( ECalenMultiDbHidden == iCalendarStatus  )
+		            {
+		            SetVisiblityFieldL( ECalenMultiDbVisible ); 
+		            iCalendarStatus = ECalenMultiDbVisible;
+		            iCalendarInfo.SetEnabled(iCalendarStatus);
+		            }
+		        else
+		            {
+		            SetVisiblityFieldL( ECalenMultiDbHidden );
+		            iCalendarStatus = ECalenMultiDbHidden;
+		            iCalendarInfo.SetEnabled(iCalendarStatus);
+		            }
+		        }
+		    else if ( ECalenMultiDbColor == IdOfFocusControl() )
+		        {
+		        GetColorL();
+		        }
+		    }
+		    break; 
+
+		case EAknSoftkeyOpen:
+		    {
+		    GetColorL();
+		    } 
+		    break;
+			
+		default:
+		    {
+		    // No implementation yet.
+		    }
+		    break;
+		}
+    
+	TRACE_EXIT_POINT;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenMultiDBEditor::HandleEditCommandL
+// Process commands from the user.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//    
+ void CCalenMultiDBEditor::HandleEditCommandL()
+   {
+   switch(IdOfFocusControl())
+       {
+       case ECalenMultiDbColor:
+          {
+          GetColorL();
+          }
+          break;
+	  default:
+           {
+           // No implementation yet.
+           }
+          break;
+       }
+   } 
+ 
+
+ // -----------------------------------------------------------------------------
+ // CCalenMultiDBEditor::SetConflict
+ // (other items were commented in a header).
+ // -----------------------------------------------------------------------------
+ // 
+void CCalenMultiDBEditor::SetConflict(TCalendarConflicts aConflict)
+    {
+    TRACE_ENTRY_POINT
+    iConflict = aConflict;
+    TRACE_EXIT_POINT
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenMultiDBEditor::Conflict
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+// 
+CCalenMultiDBEditor::TCalendarConflicts CCalenMultiDBEditor::Conflict() const
+    {
+    TRACE_ENTRY_POINT
+    TRACE_EXIT_POINT
+    return iConflict;
+    }
+ 
+ // -----------------------------------------------------------------------------
+ // CCalenMultiDBEditor::HandleNotification
+ // (other items were commented in a header).
+ // -----------------------------------------------------------------------------
+ // 
+       
+// -----------------------------------------------------------------------------
+// CCalenMultiDBEditor::OkToExitL
+// Handle CBA-key on a form.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CCalenMultiDBEditor::OkToExitL(TInt aButtonId)
+    {
+    TRACE_ENTRY_POINT;
+    TBool isExitForm(EFalse);
+    
+    switch(aButtonId)
+        {
+        case EAknSoftkeyOpen:
+            {
+            GetColorL();
+            } 
+            break;
+            
+        case EAknSoftkeyOptions:
+            {
+            DisplayMenuL();
+            isExitForm = EFalse;
+            }
+            break;
+            
+        case EAknSoftkeyChange:
+            {
+            isExitForm=EFalse;
+			if( ECalenMultiDbHiddenVisible == IdOfFocusControl() )
+				{
+                iCalendarStatus = iCalendarInfo.Enabled();
+
+                if( ECalenMultiDbHidden == iCalendarStatus )
+                    {
+                    SetVisiblityFieldL( ECalenMultiDbVisible ); 
+                    iCalendarStatus = ECalenMultiDbVisible;
+                    iCalendarInfo.SetEnabled(iCalendarStatus);
+                    }
+                else
+                    {
+                    SetVisiblityFieldL( ECalenMultiDbHidden );
+                    iCalendarStatus = ECalenMultiDbHidden;
+                    iCalendarInfo.SetEnabled(iCalendarStatus);
+                    }
+                }
+            else if ( ECalenMultiDbColor == IdOfFocusControl() )
+                {
+                GetColorL();
+                }
+            }
+            break;    
+            
+        case EAknSoftkeyDone:
+            {
+            isExitForm = SaveNoteL(aButtonId);
+            if (isExitForm)
+                {
+                TInt err = iMultipleDbUi.UpdateOnAddOrEditL(!iEditFlag);
+                if (err != KErrNone)
+                    {
+                    ShowErrorNoteL(err);
+                    }
+                }
+            }
+            break;
+        case EAknSoftkeyExit:    
+        case EAknCmdExit:
+            {
+            isExitForm = SaveNoteL(aButtonId);
+            if (isExitForm)
+                {
+                TInt err = iMultipleDbUi.UpdateOnAddOrEditL(!iEditFlag);
+                if (err != KErrNone)
+                    {
+                    ShowErrorNoteL(err);
+                    }
+                }
+            isExitForm = ETrue;
+            iMultipleDbUi.ExitDialogL();
+            }
+            break;
+        case EAknSoftkeyQuit:
+            {
+            isExitForm = ETrue;
+            }
+            break;
+        default:
+            {
+            isExitForm=CAknForm::OkToExitL(aButtonId);
+            }
+            break;
+        }
+    TRACE_EXIT_POINT;
+    
+    return isExitForm;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenMultiDBEditor::OfferKeyEventL
+// Passes key events to MsgEditorView to enable scrolling.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+TKeyResponse CCalenMultiDBEditor::OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType)
+    {
+    TRACE_ENTRY_POINT;
+    TKeyResponse keyResponse(EKeyWasNotConsumed);
+
+    if (aType == EEventKey)
+       {
+       switch (aKeyEvent.iCode)
+        	{
+        	case EKeyEscape:
+			    TryExitL( EAknCmdExit );
+        		keyResponse = EKeyWasConsumed;
+        		break;
+          	default:
+           		keyResponse = CAknForm::OfferKeyEventL(aKeyEvent,aType);    
+              	break;
+            }
+       }
+    else
+        {
+        // Swallow all other keyevents to prevent the active container processing them.
+        keyResponse = EKeyWasConsumed;        
+        }        
+    TRACE_EXIT_POINT;
+    return keyResponse;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenMultiDBEditor::PreLayoutDynInitL()
+// Updates fields just before the form is shown.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCalenMultiDBEditor::PreLayoutDynInitL()
+    {
+    TRACE_ENTRY_POINT;
+    
+    
+    
+    // Set data to controls in the editor.
+    SetDataToFormL();
+    
+    TRACE_EXIT_POINT;
+    }
+	
+// -----------------------------------------------------------------------------
+// CCalenMultiDBEditor::SetDataToFormL()
+// Reads data from the entry and updates the form with the appropriate values.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCalenMultiDBEditor::SetDataToFormL()
+    {
+    TRACE_ENTRY_POINT;
+    //First filed "Name" of the Form
+    CEikEdwin* edwin =
+        reinterpret_cast<CEikEdwin*>(Control(ECalenMultiDbName));
+   
+    if( edwin )
+        {
+        edwin->SetTextLimit(KCalenMaxELAFTextEditorLength);
+        edwin->SetSelectionL( edwin->TextLength(), 0 );
+        }
+
+    SetEditableL(ETrue);
+    Line(ECalenMultiDbName)->SetFocus(ETrue);
+    Line(ECalenMultiDbName)->ActivateL();
+    
+    HBufC* calendarName = iCalendarInfo.NameL().AllocLC();
+    
+    // Check for the empty text.
+    if( ( !calendarName->Size() ) )
+        {   
+        CleanupStack::PopAndDestroy(calendarName);
+        TInt index( KOne );
+        calendarName = StringLoader::LoadLC( R_CALE_DB_CALENDAR );
+        TBuf< KBuffLength > numBuf;
+
+        // Check if name is already there or not.
+        while( IsNameFoundL( *calendarName ) )
+            {
+            CleanupStack::PopAndDestroy( calendarName );
+            numBuf.Zero();
+            if( index < KTen ) 
+                {
+                numBuf.Format( KFormatStringTwoDigit, index );
+                }
+            else
+                {
+                numBuf.Format( KFormatString, index );
+                }
+            AknTextUtils::DisplayTextLanguageSpecificNumberConversion(
+                    numBuf );
+            calendarName = StringLoader::LoadLC(
+                    R_CALE_DB_CALENDAR_DEFAULT_NAME, numBuf );
+
+            ++index;
+            }
+        }
+    SetEdwinTextL( ECalenMultiDbName, calendarName );
+    CleanupStack::PopAndDestroy(calendarName);
+	
+    //Second field "Color" of the form
+    // Instantiate CDbColorPicture object 300x300 twips in size
+    CEikRichTextEditor* colorControl = static_cast<CEikRichTextEditor*>(Control(ECalenMultiDbColor));   
+   
+    //Prepare the iPicture header, which will be inserted into the rich text
+    TPictureHeader header;
+    header.iPicture = TSwizzle<CPicture>(iPicture);
+        
+    // Position where we insert iPicture is not valid as it always draws icon depending the rect we provide
+    colorControl->RichText()->InsertL(0, header);   
+    colorControl->AddFlagToUserFlags(CEikEdwin::EAvkonDisableCursor | CEikEdwin::EReadOnly );
+    GetLineByLineAndPageIndex(1,0)->DrawNow(); 	
+
+    iCalendarStatus = iCalendarInfo.Enabled();
+    
+  
+        
+    if( ECalenMultiDbHidden == iCalendarStatus )
+        {
+        SetVisiblityFieldL( ECalenMultiDbHidden );
+        }
+    else
+        {
+        SetVisiblityFieldL( ECalenMultiDbVisible );
+        }
+	TRACE_EXIT_POINT;
+    }
+    
+// ---------------------------------------------------------
+// CCalenMultiDBEditor::DynInitMenuPaneL
+// Gets called before form is displayed
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCalenMultiDBEditor::DynInitMenuPaneL( TInt aResourceId,
+										          CEikMenuPane* aMenuPane )
+	{
+	TRACE_ENTRY_POINT;
+	
+	if( aResourceId != R_CALEN_MULTIDB_MENUPANE )
+	    {
+	    return;
+	    }
+
+	// Execute the following commands if the resource belongs to calendar.
+	// Display the menu items based on the current focused control.
+	if( ECalenMultiDbName == IdOfFocusControl() )
+	    {
+	    aMenuPane->SetItemDimmed( EAknSoftkeyChange, ETrue );
+	    }
+
+	TRACE_EXIT_POINT;
+	}
+	
+// ---------------------------------------------------------------------------
+// CCalenMultiDBEditor::GetColorL
+// From class CAknSettingItem.
+// GetColorL overridden to launch colour selection grid.
+// ---------------------------------------------------------------------------
+//
+void CCalenMultiDBEditor::GetColorL()
+    {  
+    TRACE_ENTRY_POINT;
+    iNoneChoosen = ETrue;
+    
+    // Construct colour selection grid
+    CAknDialog  *dlg = CAknColourSelectionGrid::NewL(iRgbColors, EFalse,
+            iNoneChoosen,iChoosenColor );
+
+    dlg->ExecuteLD(R_CALEN_MULTIDB_EDITOR_COLOR_GRID_DLG);
+    
+    TRACE_EXIT_POINT;
+    }
+
+// ---------------------------------------------------------------------------
+// CCalenMultiDBEditor::FocusChanged
+// ---------------------------------------------------------------------------
+//
+void CCalenMultiDBEditor::FocusChanged(TDrawNow /*aDrawNow*/)
+    {
+    TRACE_ENTRY_POINT
+    
+    if(IsFocused() && !iNoneChoosen)
+        {
+        iColVal = iChoosenColor.Value();
+        TRAP_IGNORE(iPicture->SetRgbColorsL(iChoosenColor));
+        GetLineByLineAndPageIndex(1, 0)->DrawNow();
+        }
+    
+    TRACE_EXIT_POINT
+    }
+
+// ---------------------------------------------------------------------------
+// CCalenMultiDBEditor::SaveNoteL
+// Try to save note. Initializes all the member variables of DBInfo.
+// ---------------------------------------------------------------------------
+//    
+TBool CCalenMultiDBEditor::SaveNoteL( TInt aButtonId )
+	{
+    TRACE_ENTRY_POINT;
+
+    if (CheckSpaceBelowCriticalLevelL())
+        {
+        TRACE_EXIT_POINT;
+        return EFalse;
+        }
+
+    if (Conflict() == CCalenMultiDBEditor::EConflictDelete)
+        {
+        CAknNoteDialog *note = new (ELeave) CAknNoteDialog(
+                CAknNoteDialog::EWarningTone, CAknNoteDialog::ENoTimeout);
+        HBufC* buf = StringLoader::LoadLC(
+                R_QTN_CALENDAREDITOR_NOTE_DB_CONFLICT_DELETE, iEikonEnv);
+        note->SetTextL(*buf);
+        note->ExecuteLD(R_CALEN_CALENDAREDITOR_CONFLICT_DIALOG);
+        CleanupStack::PopAndDestroy(buf);
+        return ETrue;
+        }
+    else if (Conflict() == CCalenMultiDBEditor::EConflictUpdate)
+        {
+        CAknNoteDialog *note = new (ELeave) CAknNoteDialog(
+                CAknNoteDialog::EWarningTone, CAknNoteDialog::ENoTimeout);
+        HBufC* buf = StringLoader::LoadLC(
+                R_QTN_CALENDAREDITOR_NOTE_DB_CONFLICT_UPDATE, iEikonEnv);
+        note->SetTextL(*buf);
+        note->ExecuteLD(R_CALEN_CALENDAREDITOR_CONFLICT_DIALOG);
+        CleanupStack::PopAndDestroy(buf);
+        return ETrue;
+        }
+    else
+        {
+        }
+
+    TBool retValue = ETrue;
+    RPointerArray<CCalCalendarInfo> calendarInfoList;
+    iController.GetAllCalendarInfoL(calendarInfoList);
+    CleanupClosePushL(calendarInfoList);
+    const TBool continueOnError = ETrue;
+    ReadDataFromFormL(continueOnError);
+
+    iCalendarName->Des().Trim();
+    // Check for the empty text
+    if ((!iCalendarName->Size()))
+        {
+        // If in editing mode, just save the name used before.
+        if (iEditFlag)
+            {
+            iCalendarName->Des().Copy(iCalendarInfo.NameL());
+            SetEdwinTextL(ECalenMultiDbName, iCalendarName);
+            }
+        else
+            {
+            // else use the default name.
+            TInt index(KOne);
+            HBufC* calendarName = StringLoader::LoadLC(R_CALE_DB_CALENDAR);
+            TBuf<KBuffLength> numBuf;
+
+            // Check if the name is already present.
+            while (IsNameFoundL(*calendarName))
+                {
+                CleanupStack::PopAndDestroy(calendarName);
+                numBuf.Zero();
+                if (index < KTen)
+                    {
+                    numBuf.Format(KFormatStringTwoDigit, index);
+                    }
+                else
+                    {
+                    numBuf.Format(KFormatString, index);
+                    }
+                AknTextUtils::DisplayTextLanguageSpecificNumberConversion(
+                        numBuf);
+                calendarName = StringLoader::LoadLC(
+                        R_CALE_DB_CALENDAR_DEFAULT_NAME, numBuf);
+
+                ++index;
+                }
+
+            iCalendarName->Des().Append(calendarName->Des());
+
+            CleanupStack::PopAndDestroy(calendarName);
+            SetEdwinTextL(ECalenMultiDbName, iCalendarName);
+            }
+
+        }
+
+    // Check for the validity of the calendar name.
+    if (IsNameValid(*iCalendarName))
+        {
+        // Name is valid. then check if it already exists or not.
+        if (IsNameEditedL(*iCalendarName))
+            {
+            TInt index = calendarInfoList.Find(*iCalendarName,
+                    CCalenMultiDBEditor::CalenInfoIdentifierL);
+            if (index != KErrNotFound)
+                {
+                retValue = EFalse;
+                if (EAknCmdExit != aButtonId)
+                    {
+                    HBufC* infoText = StringLoader::LoadLC(
+                            R_QTN_CALE_DB_ALREADY_EXISTS_NOTE,
+                            iCalendarName->Des());
+                    CAknInformationNote* dialog =
+                            new (ELeave) CAknInformationNote(ETrue);
+                    dialog->ExecuteLD(*infoText);
+                    CleanupStack::PopAndDestroy(infoText);
+                    }
+                }
+            else
+                {
+                iCalendarInfo.SetNameL(*iCalendarName);
+                }
+            }
+
+        }
+    else
+        {
+        if (EAknCmdExit != aButtonId)
+            {
+            retValue = EFalse;
+            HBufC* infoText(NULL);
+            infoText
+                    = AreIllegalChars(*iCalendarName)
+                                                      ? StringLoader::LoadLC(
+                                                             R_CALEN_ILLEGAL_CHARACTERS)
+                                                         : StringLoader::LoadLC(
+                                                                 R_CALEN_BAD_FILE_NAME);
+            CAknInformationNote* dialog = new (ELeave) CAknInformationNote(
+                    ETrue);
+            dialog->ExecuteLD(*infoText);
+            CleanupStack::PopAndDestroy(infoText);
+            }
+        }
+
+    if (IsColorEditedL(iColVal))
+        {
+        iCalendarInfo.SetColor(iColVal);
+        }
+
+    if (IsVisiblityFieldEditedL(iCalendarStatus))
+        {
+        iCalendarInfo.SetEnabled(iCalendarStatus);
+        }
+
+    CleanupStack::PopAndDestroy(&calendarInfoList);
+    TRACE_EXIT_POINT;
+    return retValue;
+    }
+
+// ---------------------------------------------------------------------------
+// CCalenMultiDBEditor::ExecuteLD
+// Launches the MultiDB Form 
+// ---------------------------------------------------------------------------
+//
+TInt CCalenMultiDBEditor::ExecuteLD()
+	{
+	TRACE_ENTRY_POINT; 
+	TRACE_EXIT_POINT;
+	return CAknForm::ExecuteLD(R_CALEN_MULTIDB_EDITOR);
+	}
+
+// ---------------------------------------------------------------------------
+// CCalenMultiDBEditor::ReadDataFromFormL
+// Read all the data from the form.
+// ---------------------------------------------------------------------------
+//
+void CCalenMultiDBEditor::ReadDataFromFormL( TBool /*aContinueOnError */)
+    {
+    TRACE_ENTRY_POINT;
+    //Initial Name value
+    TPtr summary = iCalendarName->Des();
+
+    CEikEdwin* edwin = reinterpret_cast<CEikEdwin*> (Control(
+            ECalenMultiDbName));
+    GetEdwinText(summary, ECalenMultiDbName);
+
+    TRACE_EXIT_POINT;
+    }
+// ---------------------------------------------------------------------------
+// CCalenMultiDBEditor::IsNameEditedL
+// Checks wether Name got edited or not.
+// ---------------------------------------------------------------------------
+//    
+TBool CCalenMultiDBEditor::IsNameEditedL(const TDesC& aName)		
+	{
+	TRACE_ENTRY_POINT;	
+	HBufC* calendarName = iCalendarInfo.NameL().AllocLC();
+	calendarName->Des().Trim();	
+	
+	TBool isEdited = EFalse;
+    if (calendarName->CompareF(aName))
+        {
+        isEdited =  ETrue;
+        }   
+    CleanupStack::PopAndDestroy();
+    TRACE_EXIT_POINT;
+      
+    return isEdited;
+	}
+
+// ---------------------------------------------------------------------------
+// CCalenMultiDBEditor::IsNameFoundL
+// Checks wether Name got edited or not.
+// ---------------------------------------------------------------------------
+//  
+TBool CCalenMultiDBEditor::IsNameFoundL(const TDesC& aName)    
+    {
+    TRACE_ENTRY_POINT;
+    
+    TBool retValue = EFalse;
+    RPointerArray<CCalCalendarInfo> calendarInfoList;
+    iController.GetAllCalendarInfoL(calendarInfoList);
+    CleanupClosePushL(calendarInfoList);  
+    HBufC *calendarName = aName.AllocLC();
+    
+    TInt index = calendarInfoList.Find( *calendarName, 
+            CCalenMultiDBEditor::CalenInfoIdentifierL );
+
+    CleanupStack::PopAndDestroy( calendarName );
+    CleanupStack::PopAndDestroy( &calendarInfoList );    
+    
+    // Name is matched.
+    if(index != KErrNotFound)
+        {
+        retValue = ETrue;
+        }
+    
+    TRACE_EXIT_POINT;
+    return retValue;
+    }
+
+// ---------------------------------------------------------------------------
+// CCalenMultiDBEditor::AreIllegalChars
+// Rest of the details are commented in header.
+// ---------------------------------------------------------------------------
+//  
+TBool CCalenMultiDBEditor::AreIllegalChars( const TDesC& aName )
+    {
+    TRACE_ENTRY_POINT;
+    
+    for ( TInt i( 0 ); KIllegalChars[ i ]; i++ )
+        {
+        if ( aName.Locate( KIllegalChars[ i ] ) != KErrNotFound )
+            {
+            // name is valid.
+            return ETrue;
+            }
+        }
+    TRACE_EXIT_POINT; 
+    
+    return EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+// CCalenMultiDBEditor::IsValidName
+// Rest of the details are commented in header.
+// ---------------------------------------------------------------------------
+// 
+TBool CCalenMultiDBEditor::IsNameValid( const TDesC& aName )
+    {
+    TRACE_ENTRY_POINT;
+    
+    // Check name for bad chars
+    const TUint16 KMinAllowedChar = 0x0020;
+    const TUint16 KParagraphSeparator = 0x2029;
+    const TUint16 KDot = '.';
+    
+    TInt nameLen( aName.Length() );
+    if ( !nameLen )
+        {
+        return EFalse;
+        }
+    
+    for ( TInt i( 0 ); i < nameLen; i++ )
+        {
+        TUint16 ch( aName[ i ] );
+        if ( ch < KMinAllowedChar || ch == KParagraphSeparator )
+            {
+            return EFalse;
+            }
+        }
+    
+    // File system ignores totally dot in the end of name, so 
+    // we set here as not valid name, so that user gets correctly informed
+    if ( aName[ nameLen - 1 ] == KDot || AreIllegalChars( aName ) )
+        {
+        return EFalse;
+        }
+    return ETrue;
+    }
+
+// ---------------------------------------------------------------------------
+// CCalenMultiDBEditor::IsColorEditedL
+// Checks wether Color got edited or not.
+// ---------------------------------------------------------------------------
+//	
+TBool CCalenMultiDBEditor::IsColorEditedL(TInt iColVal)
+	{
+	TRACE_ENTRY_POINT;
+    TRACE_EXIT_POINT;   
+    return (iCalendarInfo.Color() != iColVal);
+	}
+
+// ---------------------------------------------------------------------------
+// CCalenMultiDBEditor::IsVisiblityFieldEditedL
+// Checks the visibility status of the calendar being edited.
+// ---------------------------------------------------------------------------
+//
+TBool CCalenMultiDBEditor::IsVisiblityFieldEditedL( TInt aCalendarStatus )
+    {
+    TRACE_ENTRY_POINT;
+    TRACE_EXIT_POINT;   
+    return (iCalendarInfo.Enabled() != aCalendarStatus );
+    }
+
+
+// ----------------------------------------------------------------------------
+// CCalenMultiDBEditor::HandleDialogPageEventL
+// Process pointer event on the dialog.
+// (other items were commented in a header).
+// ----------------------------------------------------------------------------
+void CCalenMultiDBEditor::HandleDialogPageEventL( TInt aEventID )
+    {
+    TRACE_ENTRY_POINT;
+    
+    CAknForm::HandleDialogPageEventL( aEventID );
+    if ( aEventID == MEikDialogPageObserver::EDialogPageTapped )
+        {
+        TInt focusControl( IdOfFocusControl() );
+        
+        switch(focusControl)
+            {
+            case ECalenMultiDbColor:
+                {
+                GetColorL();
+                }
+                break;
+                    
+
+                
+            case ECalenMultiDbHiddenVisible:
+                {
+                iCalendarStatus = iCalendarInfo.Enabled();
+                
+                if( ECalenMultiDbHidden == iCalendarStatus )
+                    {
+                    SetVisiblityFieldL( ECalenMultiDbVisible ); 
+                    iCalendarStatus = ECalenMultiDbVisible;
+                    iCalendarInfo.SetEnabled(iCalendarStatus);
+                    }
+                else
+                    {
+                    SetVisiblityFieldL( ECalenMultiDbHidden );
+                    iCalendarStatus = ECalenMultiDbHidden;
+                    iCalendarInfo.SetEnabled(iCalendarStatus);
+                    }
+                }
+                break;
+                    
+             default:
+                 {
+                 
+                 }
+                 break;
+             }
+         }
+    TRACE_EXIT_POINT;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenMultiDBEditor::LineChangedL
+// This function gets called by the framework each time line is changed in
+// the dialog (form). .
+// We will use it for MSK label switching.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCalenMultiDBEditor::LineChangedL( TInt aControlId )
+    {
+    TRACE_ENTRY_POINT;
+ 
+    CEikButtonGroupContainer&  cba = ButtonGroupContainer ();
+    TInt resId = 0;
+    TInt controlId = aControlId;
+
+    switch( controlId )
+        {
+        case ECalenMultiDbName:
+            {
+            resId = R_CALEN_MULTIDB_MSK_EMPTY_CBA;
+            }
+            break;
+
+        case ECalenMultiDbColor:
+        case ECalenMultiDbHiddenVisible: 
+            {
+            resId = R_CALEN_MULTIDB_MSK_CHANGE_CBA;
+            }
+            break;
+            
+        default:
+            {
+            // No implementation yet.
+            }
+            break;
+        }
+
+    // set desired CBA
+    cba.SetCommandSetL( resId );
+    cba.DrawNow();
+
+    TRACE_EXIT_POINT;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenEditorBase::PostLayoutDynInitL
+// This is called in CEikDialog::ExecuteLD() after a form is drawn.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCalenMultiDBEditor::PostLayoutDynInitL()
+    {
+    TRACE_ENTRY_POINT;    
+    SetEditableL(ETrue);
+    
+    LineChangedL( ECalenMultiDbName );
+    
+    CAknForm::PostLayoutDynInitL(); // chain back up to baseclass
+    TRACE_EXIT_POINT;
+    }
+    
+// -----------------------------------------------------------------------------
+// CCalenMultipleDbUi::CalenInfoIdentifierL
+// -----------------------------------------------------------------------------
+//
+TBool CCalenMultiDBEditor::CalenInfoIdentifierL( const HBufC* aName,
+                                        const CCalCalendarInfo& aCalendarInfo )
+    {
+    TRACE_ENTRY_POINT;
+    HBufC* calendarName = aCalendarInfo.NameL().AllocLC();
+    calendarName->Des().Trim();
+    TBool retVal = EFalse;
+    retVal = calendarName->Compare(*aName);
+    CleanupStack::PopAndDestroy();          
+    TRACE_EXIT_POINT;
+    return (!retVal);
+    }
+
+// -----------------------------------------------------------------------------
+// CDbColorPicture::SetVisiblityFieldL
+// Rest of the details are commented in header.
+// -----------------------------------------------------------------------------
+//
+void CCalenMultiDBEditor::SetVisiblityFieldL( TBool aStatusVal )
+    {
+    TRACE_ENTRY_POINT;
+    HBufC* statusString( NULL );
+    CEikEdwin* fieldText =( CEikEdwin* )Control( ECalenMultiDbHiddenVisible );
+    if( aStatusVal )
+        {
+        // load string Visible
+        statusString = StringLoader::LoadLC( R_CALE_DB_SHOWN_SETTING ,iCoeEnv );
+        }
+    else
+        {
+        // load string Hidden
+        statusString = StringLoader::LoadLC( R_CALE_DB_HIDDEN_SETTING ,iCoeEnv );
+        }
+    // set status field string
+    fieldText->SetTextL( statusString );
+    fieldText->DrawDeferred();
+    CleanupStack::PopAndDestroy( statusString );    
+    TRACE_EXIT_POINT;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenMultiDBEditor::SetTitlePaneL
+// Rest of the details are commented in header.
+// -----------------------------------------------------------------------------
+//
+void CCalenMultiDBEditor::SetTitlePaneL()
+    {
+    TRACE_ENTRY_POINT;
+    
+    CEikStatusPane* sp = iEikonEnv->AppUiFactory()->StatusPane();
+
+    // Set empty navi pane label
+    iNaviContainer = static_cast<CAknNavigationControlContainer*>(
+            sp->ControlL( TUid::Uid( EEikStatusPaneUidNavi ) ) );
+    iNaviContainer->PushDefaultL();
+
+    // Set title text
+    CAknTitlePane* tp = static_cast<CAknTitlePane*>(
+            sp->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) );
+
+    HBufC* titleText = StringLoader::LoadLC( R_QTN_CALE_TITLE_CALENDAR , iCoeEnv );
+    tp->SetTextL( *titleText );
+    CleanupStack::PopAndDestroy( titleText );
+    
+    TRACE_EXIT_POINT;   
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenMultiDBEditor::SetSyncFieldL
+// Rest of the details are commented in header.
+// -----------------------------------------------------------------------------
+//
+void CCalenMultiDBEditor::SetSyncFieldL( TBool aSyncVal )
+    {
+    TRACE_ENTRY_POINT;
+    
+    if(!ControlOrNull(ECalenMultiDbSyncStatus))
+        {
+        return;
+        }
+    
+    HBufC* syncString( NULL );
+    CEikEdwin* syncFieldText =( CEikEdwin* )Control( ECalenMultiDbSyncStatus );
+    if( EFalse == aSyncVal )
+        {
+        // load string Off
+        syncString = StringLoader::LoadLC( R_CALE_SYNC_OFF , iCoeEnv );
+        }
+    else
+        {
+        // load string On
+        syncString = StringLoader::LoadLC( R_CALE_SYNC_ON ,iCoeEnv );
+        }
+    // set sync field string
+    syncFieldText->SetTextL( syncString );
+    syncFieldText->DrawDeferred();
+    CleanupStack::PopAndDestroy( syncString );    
+    TRACE_EXIT_POINT;
+    }
+
+// -----------------------------------------------------------------------------
+// CheckSpaceBelowCriticalLevelL
+// Checks if the Flash File System storage will fall below critical level. 
+// If there is not enough space, display an error message and return EFalse.
+// Return ETrue otherwise.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CCalenMultiDBEditor::CheckSpaceBelowCriticalLevelL()
+    {
+    TRACE_ENTRY_POINT;
+    
+    TBool retcode(EFalse);
+    if ( SysUtil::FFSSpaceBelowCriticalLevelL( &( iCoeEnv->FsSession() ) ) )
+        {
+        ShowErrorNoteL(KErrDiskFull);
+        retcode = ETrue;
+        }
+    TRACE_EXIT_POINT;
+    return retcode;
+    }
+
+// -----------------------------------------------------------------------------
+// CCalenMultiDBEditor::ShowErrorNoteL
+// -----------------------------------------------------------------------------
+//
+void CCalenMultiDBEditor::ShowErrorNoteL(TInt aError)
+    {
+    TRACE_ENTRY_POINT
+    CErrorUI* errorUi = CErrorUI::NewLC();
+    errorUi->ShowGlobalErrorNoteL( aError );
+    CleanupStack::PopAndDestroy( errorUi ); 
+    TRACE_EXIT_POINT
+    }
+
+// -----------------------------------------------------------------------------
+// CDbColorPicture::CDbColorPicture
+// C++ Constructor
+// -----------------------------------------------------------------------------
+//
+CDbColorPicture::CDbColorPicture(TSize aSize) 
+: iSize(aSize) 
+	{
+	TRACE_ENTRY_POINT;
+	TRACE_EXIT_POINT;	
+	}
+
+// -----------------------------------------------------------------------------
+// CDbColorPicture::ExternalizeL
+// Pure virtual from CPicture, intentionally empty.
+// -----------------------------------------------------------------------------
+//	
+void CDbColorPicture::ExternalizeL(RWriteStream& ) const 
+	{
+	TRACE_ENTRY_POINT;
+	TRACE_EXIT_POINT;	
+	}
+
+// -----------------------------------------------------------------------------
+// CDbColorPicture::GetOriginalSizeInTwips
+// Convert size to twips
+// -----------------------------------------------------------------------------
+//
+void CDbColorPicture::GetOriginalSizeInTwips(TSize& /*aSize*/ ) const 
+    {
+    TRACE_ENTRY_POINT;
+    TRACE_EXIT_POINT;	 
+    }
+
+// -----------------------------------------------------------------------------
+// CDbColorPicture::SetRgbColorsL
+// -----------------------------------------------------------------------------
+//
+void CDbColorPicture::SetRgbColorsL(TRgb aColors)  
+    {
+    TRACE_ENTRY_POINT;
+    iColors = aColors;
+    TRACE_EXIT_POINT;    
+    }
+
+// -----------------------------------------------------------------------------
+// CDbColorPicture::Draw
+// Draw funtion to draw the map icon
+// -----------------------------------------------------------------------------
+//
+void CDbColorPicture::Draw(CGraphicsContext& aGc, 
+                      const TPoint&  aTopLeft ,
+                      const TRect&  /*aClipRect*/ ,
+                      MGraphicsDeviceMap* /*aMap*/ ) const
+    {
+    TRACE_ENTRY_POINT;
+    
+    
+    //aGc.Reset();
+     aGc.CancelClippingRect();    
+    
+	TSize pixelsize;
+    pixelsize.iWidth = 225;
+    pixelsize.iHeight = 16;
+    TPoint aPoint;
+    TRect area = TRect(aTopLeft, pixelsize);
+    area.Move(0,-11);
+    // Draw a datbase color rectangle
+    aGc.SetBrushColor(iColors);
+    aGc.SetBrushStyle(CGraphicsContext::ESolidBrush);
+    
+    aGc.DrawRect(area);	  
+    }
+
+//  End of File