clock2/clockui/uilayer/clockalarmeditor/src/clockalarmeditorimpl.cpp
branchRCL_3
changeset 30 bd7edf625bdd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/clock2/clockui/uilayer/clockalarmeditor/src/clockalarmeditorimpl.cpp	Wed Sep 01 12:32:31 2010 +0100
@@ -0,0 +1,1572 @@
+/*
+* Copyright (c) 2008 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:   This is the source file for the CClockAlarmEditorImpl class.
+*
+*/
+
+// System includes
+#include <e32cmn.h>
+#include <avkon.rsg>
+#include <clock.rsg>
+#include <akntitle.h>
+#include <eikspane.h>
+#include <aknpopupsettingpage.h>
+#include <StringLoader.h>
+#include <wakeupalarm.h>
+#include <bautils.h>
+#include <asshddefs.h>
+#include <tz.h>
+#include <vtzrules.h>
+#include <aknnotewrappers.h>
+#include <centralrepository.h>
+#include <hlplch.h>
+#include <AknPopupField.h>
+#include <AknQueryValueText.h>
+#include <calenconstants.h>
+
+// User includes
+#include "clockalarmeditorimpl.h"
+#include "clock.hrh"
+#include "clock.h"
+#include "clockmainview.h"
+#include "clockprivatecrkeys.h"
+#include "clkcommon.h"
+#include "clock_debug.h"
+
+// Constants
+const TInt KZerothDay( 0 );
+const TInt KNextDayIndex( 1 );
+const TInt KDaysInWeek( 7 );
+const TInt KFirstLine( 1 );
+const TInt KRepeatOnceIndex( 0 );
+const TInt KDailyIndex( 1 );
+const TInt KWorkdaysIndex( 2 );
+const TInt KWeeklyIndex( 3 );
+const TInt KMaxCharsInNote( 32 );
+const TInt KZerothRule( 0 );
+const TInt KOneMinuteInMicrosecond( 1000000 * 60 );
+const TInt KNoDifference( 0 );
+const TInt KOneHour( 1 );
+const TInt KOneHourInMinute( 60 );
+const TInt KOneMinute( 1 );
+
+// Literals
+_LIT( KEmptyString, "" );
+_LIT( KSoundName, "a" );
+_LIT( KClockResource, "\\resource\\apps\\clock.rsc" );
+_LIT( KDateTimeFormatter, "%-B%:0%J%:1%T%:3%+B" );  // For the date and time displayed in the rollover note.
+
+// ---------------------------------------------------------
+// CClockAlarmEditorImpl::NewL
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+CClockAlarmEditorImpl* CClockAlarmEditorImpl::NewL( TAlarmId& aAlarmId )
+    {
+	__PRINTS( "CClockAlarmEditorImpl::NewL - Entry" );
+
+    CClockAlarmEditorImpl* self = new( ELeave ) CClockAlarmEditorImpl( aAlarmId );
+    
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+	
+	__PRINTS( "CClockAlarmEditorImpl::NewL - Exit" );
+    
+    return self;
+    }
+
+// ---------------------------------------------------------
+// CClockAlarmEditorImpl::~CClockAlarmEditorImpl
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+CClockAlarmEditorImpl::~CClockAlarmEditorImpl()
+    {
+	__PRINTS( "CClockAlarmEditorImpl::~CClockAlarmEditorImpl - Entry" );
+		
+	iCoeEnv->DeleteResourceFile( iOffset );
+    
+	// Don't set the title pane text.
+    TRAP_IGNORE( SetTitleL( EFalse ) );
+    if(iAlmDayFieldTextValue)
+        {
+        delete iAlmDayFieldTextValue;
+        }
+    
+    if(iAlmDayFieldTextArray)
+        {
+        delete iAlmDayFieldTextArray;
+        }
+    if(iWeekDaysList)
+        {
+        delete iWeekDaysList;
+        }
+	// Close the session with alarm server.
+    iAlarmSrvSes.Close();
+	
+	__PRINTS( "CClockAlarmEditorImpl::~CClockAlarmEditorImpl - Exit" );
+    }
+
+// ---------------------------------------------------------
+// CClockAlarmEditorImpl::LoadAlarmInformationL
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+void CClockAlarmEditorImpl::LoadAlarmInformationL( SClkAlarmInfo& aAlarmInfo, TBool aEditAlarm )
+    {
+	__PRINTS( "CClockAlarmEditorImpl::LoadAlarmInformationL - Entry" );
+	
+    // First store the alarm time.
+    iAlarmInfo.iAlarmTime = aAlarmInfo.iAlarmTime;
+    iAlarmForEditing = aEditAlarm;
+    
+    // If the user is setting a new alarm, the default repeat type is once only alarm.
+    // The Description is "Alarm" by default too.
+    if( !iAlarmForEditing )
+        {
+        iAlarmInfo.iRepeat = EAlarmRepeatDefintionRepeatOnce;
+        
+        // Here we have to load the default description.
+        HBufC* defaultDescription = StringLoader::LoadLC( R_QTN_CLOCK_ALARM_EDITOR_DESC_DEFAULT, iCoeEnv );
+        iAlarmInfo.iMessage.Copy( defaultDescription->Des() );
+        // Cleanup
+        CleanupStack::PopAndDestroy( defaultDescription );
+        }
+    // Otherwise, we read the info from the structure given. We're interested only in the
+    // repeat type and the message.
+    else
+        {
+        // The repeat type.
+        iAlarmInfo.iRepeat = aAlarmInfo.iRepeat;
+        
+        // As per the ui spec, if the user doesn't change the default description, we need to
+        // leave it blank. Now when we're reading the alarm description, if we find it blank,
+        // while displaying we need to display the default text.
+        if( ( aAlarmInfo.iMessage == KEmptyString ) ||
+            ( aAlarmInfo.iMessage == KSingleSpace ) )
+            {
+            // Here we have to load the default description.
+            HBufC* defaultDescription = StringLoader::LoadLC( R_QTN_CLOCK_ALARM_EDITOR_DESC_DEFAULT, iCoeEnv );
+            iAlarmInfo.iMessage.Copy( defaultDescription->Des() );
+            // Cleanup
+            CleanupStack::PopAndDestroy( defaultDescription );
+            }
+        else
+            {
+            // Copy the description.
+            iAlarmInfo.iMessage = aAlarmInfo.iMessage;
+            }
+        }
+    
+    // The other information we need is the day of the alarm and the repeat type.
+    GetSelectedAlmDayIndex();
+    GetSelectedOccIndex();    
+
+	__PRINTS( "CClockAlarmEditorImpl::LoadAlarmInformationL - Exit" );	
+    }
+
+// ---------------------------------------------------------
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+TInt CClockAlarmEditorImpl::ExecuteLD()
+    {
+    // Execute the form.
+    return CAknForm::ExecuteLD( R_CLOCK_ALARM_EDITOR );
+    }
+
+// ---------------------------------------------------------
+// CClockAlarmEditorImpl::SetInitialCurrentLineL
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+void CClockAlarmEditorImpl::SetInitialCurrentLineL()
+    {
+	__PRINTS( "CClockAlarmEditorImpl::SetInitialCurrentLineL - Entry" );
+	
+    // Let the form update itself first.
+    CAknForm::SetInitialCurrentLine();
+        
+    // We don't display the alarm day selection item for repeated alarms of type daily, next 24 hours and
+    // workdays. So when this functions is called, we check for the type and update the form accordingly.
+    if( KDailyIndex == iOccuranceIndex ||
+        KWorkdaysIndex == iOccuranceIndex )
+        {
+        DeleteAlmDayCtrlL();
+        }
+	
+	__PRINTS( "CClockAlarmEditorImpl::SetInitialCurrentLineL - Exit" );
+    }
+
+// ---------------------------------------------------------
+// CClockAlarmEditorImpl::SaveFormDataL
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+TInt CClockAlarmEditorImpl::SaveFormDataL()
+    {
+	__PRINTS( "CClockAlarmEditorImpl::SaveFormDataL - Entry" );
+	
+    // First read the time from the form.
+    TTime timeFromForm;
+    
+    // We check if the control is there.
+    // Then we get the time from the time editor.
+    if( ControlOrNull( EControlTimeEditor ) )
+        {
+        timeFromForm = TTimeEditorValue( EControlTimeEditor );
+        }
+    
+    // Construct the alarm time.
+    // The hometime.
+    TTime homeTime;
+    homeTime.HomeTime();
+    // The home date time.
+    TDateTime homeDateTime = homeTime.DateTime();
+    // The alarm date time.
+    TDateTime alarmDateTime = timeFromForm.DateTime();
+    // Set the month, day, year.
+    alarmDateTime.SetMonth( homeDateTime.Month() );
+    alarmDateTime.SetDay( homeDateTime.Day() );
+    alarmDateTime.SetYear( homeDateTime.Year() );
+    // We have the alarm time.
+    timeFromForm = alarmDateTime;
+    
+    // Get the actual alarm time based on the alarm type and the current time.
+    GetActualAlarmTime( homeTime, timeFromForm );
+    
+    alarmDateTime = timeFromForm.DateTime();
+    
+    // Update the alarm information variable.
+    iAlarmInfo.iAlarmTime = timeFromForm;
+    
+    // Now lets update the occurance details.
+    switch( iOccuranceIndex )
+        {
+        case KRepeatOnceIndex:
+            {
+            iAlarmInfo.iRepeat = EAlarmRepeatDefintionRepeatOnce;
+            break;
+            }
+        case KDailyIndex:
+            {
+            iAlarmInfo.iRepeat = EAlarmRepeatDefintionRepeatDaily;
+            break;
+            }        
+        case KWorkdaysIndex:
+            {
+            iAlarmInfo.iRepeat = EAlarmRepeatDefintionRepeatWorkday;
+            break;
+            }                        
+        case KWeeklyIndex:
+            {
+            iAlarmInfo.iRepeat = EAlarmRepeatDefintionRepeatWeekly;
+            break;
+            }        
+        default:
+			{
+			// No implementation yet.
+			}
+            break;
+        }
+    
+    // Get the description from the form.
+    GetEdwinText( iAlarmInfo.iMessage, EControlTextEditor );
+    
+    // We check if the desc is the default one. If so, we save it as blank.
+    HBufC* defaultDescription = StringLoader::LoadLC( R_QTN_CLOCK_ALARM_EDITOR_DESC_DEFAULT, iCoeEnv );
+    
+    if( iAlarmInfo.iMessage == defaultDescription->Des() )
+        {
+        // Make the description blank.
+        iAlarmInfo.iMessage = KSingleSpace;
+        }
+    // Cleanup.
+    CleanupStack::PopAndDestroy( defaultDescription );
+    
+    // The alarm sound.
+    iAlarmInfo.iSound = KSoundName;
+    
+    // Set the alarm, here we connect to the alarm server and set the alarm.
+    SetAlarmL();
+    
+    // Save the previous alarm time value.
+    SetPreviousAlarmTimeL( iAlarmInfo.iAlarmTime );
+    
+	__PRINTS( "CClockAlarmEditorImpl::SaveFormDataL - Exit" );
+        
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------
+// CClockAlarmEditorImpl::OkToExitL
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+TBool CClockAlarmEditorImpl::OkToExitL( TInt aButtonId )
+    {
+	__PRINTS( "CClockAlarmEditorImpl::OkToExitL - Entry" );
+    
+    TBool returnVal( ETrue );
+        
+    switch( aButtonId )
+        {
+        case EAknSoftkeyOptions:
+            {
+            DisplayMenuL();
+            returnVal = EFalse ;
+            }
+            break;
+            
+        case EAknSoftkeyDone:
+            {
+            SaveFormDataL();
+            }
+            break;
+            
+        case EAknSoftkeyChange:
+            {
+			//Single click integration
+            CEikCaptionedControl* line=CurrentLine();
+            TInt type=line->iControlType;
+            TBool isPopUp= ( type && EAknCtPopupField ) || ( type == EAknCtPopupFieldText );
+            if ( isPopUp )
+                {
+                CAknPopupField* ctrl = static_cast<CAknPopupField*>( line->iControl );
+                ctrl->ActivateSelectionListL();
+                }
+            returnVal = EFalse ;
+            }
+            break;
+        
+        case EClockAlarmExit:
+            {
+            // Form is closed with returnval ETrue.
+            }
+            break;
+            
+        case EClockAlarmDelete:
+            {
+            // Form is closed with returnval ETrue.
+            }
+            break;
+            
+        case EClockAlarmDiscardChanges:
+            {
+            // Form is closed with return value ETrue.
+            }
+            break;
+   
+        default:
+            {
+            returnVal = EFalse ;
+            }
+            break;
+        }
+    
+    __PRINTS( "CClockAlarmEditorImpl::OkToExitL - Exit" );
+         
+    return returnVal;
+    }
+
+// ---------------------------------------------------------
+// CClockAlarmEditorImpl::PreLayoutDynInitL
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+void CClockAlarmEditorImpl::PreLayoutDynInitL()
+    {
+	__PRINTS( "CClockAlarmEditorImpl::PreLayoutDynInitL - Entry" );
+	
+    // Set the title text.
+    SetTitleL( ETrue );
+    
+	//Single click integration
+    CAknPopupFieldText* repeatPopupFieldText =
+        static_cast< CAknPopupFieldText* > (Control( EControlOccurancePopup ) );
+    if ( repeatPopupFieldText ) 
+        {
+        repeatPopupFieldText->SetCurrentValueIndex( iOccuranceIndex ); 
+        }
+    
+    // Set the value in the time editor control.
+    SetTTimeEditorValue( EControlTimeEditor, iAlarmInfo.iAlarmTime );
+
+	//Single click integration
+    // Set the value to be displayed in the control.
+    if ( iShowAlarmDayControl && iAlmDayFieldTextValue) 
+        {
+        iAlmDayFieldTextValue->SetCurrentValueIndex(iDayIndex); 
+        CAknPopupField* almDayCtrl = static_cast< CAknPopupField* > ( Control( EControlAlarmDayPopup ) );
+        if(almDayCtrl)
+            {
+            almDayCtrl->SetQueryValueL(iAlmDayFieldTextValue);
+            }
+        }
+   
+    
+    // Now the alarm description.
+    HBufC* alarmDescription = HBufC::NewL( KMaxAlarmMessageLength );
+    CleanupStack::PushL( alarmDescription );
+    // Copy the alarm description.
+    alarmDescription->Des().Copy( iAlarmInfo.iMessage );
+    // Set the text in the editor.
+    SetEdwinTextL( EControlTextEditor, alarmDescription );
+    // Cleanup
+    CleanupStack::PopAndDestroy( alarmDescription );
+    
+    // We don't display the alarm day selection item for repeated alarms of type daily, next 24 hours and
+    // workdays. So when this functions is called, we check for the type and update the form accordingly.
+    if( KWeeklyIndex != iOccuranceIndex )
+        {
+        DeleteAlmDayCtrlL();
+        }
+		
+	__PRINTS( "CClockAlarmEditorImpl::PreLayoutDynInitL - Exit" );
+    }
+
+// ---------------------------------------------------------
+// CClockAlarmEditor::PostLayoutDynInitL
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+void CClockAlarmEditorImpl::PostLayoutDynInitL()
+    {
+	__PRINTS( "CClockAlarmEditorImpl::PostLayoutDynInitL - Entry" );
+	
+    LineChangedL( EControlTimeEditor );
+    
+    // Call the base class PostLayoutDynInitL()
+    CAknForm::PostLayoutDynInitL();
+	
+	__PRINTS( "CClockAlarmEditorImpl::PostLayoutDynInitL - Exit" );
+    }
+
+// ---------------------------------------------------------
+// CClockAlarmEditorImpl::ProcessCommandL
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+void CClockAlarmEditorImpl::ProcessCommandL( TInt aCommandId )
+    {
+    __PRINTS( "CClockAlarmEditorImpl::ProcessCommandL - Entry" );
+    
+    // For hiding options menu.
+    HideMenu();
+    
+    switch( aCommandId )
+        {
+        case EClockAlarmChange:
+            {
+			//Single click integration
+            CEikCaptionedControl* line=CurrentLine();
+            TInt type=line->iControlType;
+            TBool isPopUp=( type && EAknCtPopupField ) || ( type == EAknCtPopupFieldText );
+            if ( isPopUp )
+                {
+                CAknPopupField* ctrl = static_cast<CAknPopupField*>( line->iControl );
+                ctrl->ActivateSelectionListL();
+                }
+
+            }
+            break;
+                
+        case EClockAlarmDelete:
+            {
+            // TryExitL will in turn call OkToExitL.
+            TryExitL( EClockAlarmDelete );
+            }
+            break;
+            
+        case EClockAlarmDiscardChanges:
+            {
+            TryExitL( EClockAlarmDiscardChanges );
+            }
+            break;
+        
+        case EClockAlarmHelp:
+            {
+            // Launch help content
+            HlpLauncher::LaunchHelpApplicationL( iCoeEnv->WsSession(), iAvkonAppUi->AppHelpContextL() );
+            }
+            break;
+            
+        case EClockAlarmExit:
+            {
+            TryExitL( EClockAlarmExit );
+            }
+            break;
+
+        default:
+            {
+            // No implementation yet.
+            }
+            break;
+            
+        }
+    
+    __PRINTS( "CClockAlarmEditorImpl::ProcessCommandL - Exit" );
+    }
+
+// ---------------------------------------------------------
+// CClockAlarmEditor::DynInitMenuPaneL
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//  
+void CClockAlarmEditorImpl::DynInitMenuPaneL( TInt aResourceId, CEikMenuPane* aMenuPane )
+    {
+    __PRINTS( "CClockAlarmEditorImpl::DynInitMenuPaneL - Entry" );     
+    
+    if( aResourceId != R_CLOCK_ALARM_EDITOR_MENUPANE )
+        {
+        return;
+        }
+        
+    // Execute the following commands if the resource belongs to alarmeditor.
+    // Display the menu items based on the current focused control.
+    if( ( EControlTextEditor == iSelectedControl ) ||
+        ( EControlTimeEditor == iSelectedControl ) ||
+        ( EControlOccurancePopup == iSelectedControl ) ||
+        ( EControlAlarmDayPopup == iSelectedControl ) )
+        {
+        aMenuPane->SetItemDimmed( EClockAlarmChange, ETrue );
+        }
+    
+    // Do not show Delete option when editing an alarm.
+    // Do not show Discard changes option if its a new alarm.
+    if( !iAlarmForEditing )
+        {
+        aMenuPane->SetItemDimmed( EClockAlarmDiscardChanges, ETrue );
+        }
+    
+    __PRINTS( "CClockAlarmEditorImpl::DynInitMenuPaneL - Exit" ); 
+    }
+
+// ---------------------------------------------------------
+// CClockAlarmEditor::ConstructL
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+void CClockAlarmEditorImpl::ConstructL()
+    {
+	__PRINTS( "CClockAlarmEditorImpl::ConstructL - Entry" );
+	
+	// Open the resource file.
+	TFileName filename( KClockResource );
+	
+	// Get the nearest language file.
+	BaflUtils::NearestLanguageFile( iCoeEnv->FsSession(), filename );
+	// The offset holds the location of the resource file loaded in the memory.
+    iOffset = iCoeEnv->AddResourceFileL( filename );
+	
+    // This will finally hold the alarm information.
+    iObserver = NULL;
+    
+    CAknDialog::ConstructL( R_CLOCK_ALARM_EDITOR_MENUBAR );
+    
+    // Initialize member data.
+    iSelectedControl = KFirstLine;
+    iOccuranceIndex = KZerothDay;
+    iDayIndex = KZerothDay;
+    iShowAlarmDayControl = ETrue;
+    
+    // Alarm day field text control init.
+    iWeekDaysList = iCoeEnv->ReadDesCArrayResourceL( R_CLOCK_WEEK_DAYS_ARRAY );
+    iAlmDayFieldTextArray = CAknQueryValueTextArray::NewL();
+    iAlmDayFieldTextArray->SetArray( *iWeekDaysList );
+    iAlmDayFieldTextValue = CAknQueryValueText::NewL();
+    iAlmDayFieldTextValue->SetArrayL( iAlmDayFieldTextArray );
+    
+    // Connect to the alarm server.
+    User::LeaveIfError( iAlarmSrvSes.Connect() );
+    
+    // Get the alarm information if the alarm ID has been sent by the client.
+    SClkAlarmInfo alarmInfo;
+    TBool editAlarm( ETrue );
+    TInt returnVal( NULL );
+    if( iAlarmId )
+        {
+        // Try to get the alarm information from the alarm server.
+        returnVal = GetAlarmInformationL( iAlarmId, alarmInfo );
+        }
+    
+    // Check for valid alarm id or new alarm.
+    if( KErrNone != returnVal || !iAlarmId )
+        {
+        // We dont have a valid alarm ID or the client wants to
+        // set a new alarm. So get the default alarm values.
+        GetPreviousAlarmTimeL( alarmInfo );
+        editAlarm = EFalse;
+        }
+    
+    // Load the above information to the form.
+    LoadAlarmInformationL( alarmInfo, editAlarm );
+
+    __PRINTS( "CClockAlarmEditorImpl::ConstructL - Exit" );
+    }
+
+// ---------------------------------------------------------
+// CClockAlarmEditor::CClockAlarmEditorImpl
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+CClockAlarmEditorImpl::CClockAlarmEditorImpl( TAlarmId& aAlarmId ) : iAlarmId( aAlarmId )
+    {
+	__PRINTS( "CClockAlarmEditorImpl::CClockAlarmEditor - Entry" );
+
+	// No implementation yet.
+	
+	__PRINTS( "CClockAlarmEditorImpl::CClockAlarmEditor - Exit" );
+    }
+
+// ---------------------------------------------------------
+// CClockAlarmEditorImpl::HandleOccuranceCmdL
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+void CClockAlarmEditorImpl::HandleOccuranceCmdL()
+    {
+	__PRINTS( "CClockAlarmEditorImpl::HandleOccuranceCmdL - Entry" );
+	
+    TInt occuranceIndex( iOccuranceIndex );
+
+	//Single click integration
+    CAknPopupFieldText* repeatPopupFieldText =
+          (CAknPopupFieldText*)Control( EControlOccurancePopup );
+    if( repeatPopupFieldText )
+        {
+        occuranceIndex = repeatPopupFieldText->CurrentValueIndex();
+        }
+
+    // Choose the repeat type depending on what is chosen by the user. 
+ 
+      switch( occuranceIndex )
+
+        {
+        case KRepeatOnceIndex:
+            {
+            iAlarmInfo.iRepeat = EAlarmRepeatDefintionRepeatOnce;
+            }
+            break;
+        
+        case KDailyIndex:
+            {
+            iAlarmInfo.iRepeat = EAlarmRepeatDefintionRepeatDaily;
+            }
+            break;
+            
+        case KWorkdaysIndex:
+            {
+            iAlarmInfo.iRepeat = EAlarmRepeatDefintionRepeatWorkday;
+            }
+            break;
+            
+        case KWeeklyIndex:
+        	{
+        	iAlarmInfo.iRepeat = EAlarmRepeatDefintionRepeatWeekly;	
+        	}
+            break;
+
+        default:
+            {
+            // No implementation yet.
+            }
+            break;
+        }
+    
+    // Get the new occurance index
+    GetSelectedOccIndex();
+    
+    // We don't display the alarm day selection item for repeated alarms of type daily, next 24 hours and
+    // workdays. So when this functions is called, we check for the type and update the form accordingly.
+    if( KWeeklyIndex != iOccuranceIndex )
+        {
+        DeleteAlmDayCtrlL();
+        }
+    // If it is not present, we need to create it.
+    else 
+        {
+        CreateAlmDayCtrlL();
+        }     
+
+	__PRINTS( "CClockAlarmEditorImpl::HandleOccuranceCmdL - Exit" );
+    }
+
+// ---------------------------------------------------------
+// CClockAlarmEditorImpl::HandleAlarmDayCmdL
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+void CClockAlarmEditorImpl::HandleAlarmDayCmdL()
+    {
+    __PRINTS( "CClockAlarmEditorImpl::HandleAlarmDayCmdL - Entry" );
+	//Single click integration
+    // Get the value to be stored in iDayIndex
+
+    if ( iShowAlarmDayControl && iAlmDayFieldTextValue) 
+        {
+        iDayIndex = iAlmDayFieldTextValue->CurrentValueIndex(); 
+        }
+    }
+
+// ---------------------------------------------------------
+// CClockAlarmEditorImpl::GetSelectedOccIndex
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+void CClockAlarmEditorImpl::GetSelectedOccIndex()
+    {
+	__PRINTS( "CClockAlarmEditorImpl::GetSelectedOccIndex - Entry" );
+	
+    // Check the repeat type of the alarm and return the appropriate index.
+    switch( iAlarmInfo.iRepeat )
+        {
+        case EAlarmRepeatDefintionRepeatOnce:
+            {
+            iOccuranceIndex = KRepeatOnceIndex;
+            }
+            break;
+        case EAlarmRepeatDefintionRepeatDaily:
+            {
+            iOccuranceIndex = KDailyIndex;
+            }
+            break;
+            
+        case EAlarmRepeatDefintionRepeatWorkday:
+            {
+            iOccuranceIndex = KWorkdaysIndex;
+            }
+            break;
+        case EAlarmRepeatDefintionRepeatWeekly:
+            {
+            iOccuranceIndex = KWeeklyIndex;
+            }
+            break;
+            
+        default:
+            {
+            // No implementation yet.
+            }
+            break;
+        }
+	
+	__PRINTS( "CClockAlarmEditorImpl::GetSelectedOccIndex - Exit" );
+    }
+
+// ---------------------------------------------------------
+// CClockAlarmEditorImpl::GetSelectedAlmDayIndex
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+void CClockAlarmEditorImpl::GetSelectedAlmDayIndex()
+    {
+	__PRINTS( "CClockAlarmEditorImpl::GetSelectedAlmDayIndex - Entry" );
+	
+    TTime alarmTime = iAlarmInfo.iAlarmTime;
+    TDay weekDay;
+    
+    // If its a new alarm, we need to calculate the alarm day.
+    if( !iAlarmForEditing )
+        {
+        TDateTime alarmDateTime = alarmTime.DateTime();
+        
+        TTime homeTime;
+        homeTime.HomeTime();
+        
+        alarmDateTime.SetDay( homeTime.DateTime().Day() );
+        alarmDateTime.SetMonth( homeTime.DateTime().Month() );
+        alarmDateTime.SetYear( homeTime.DateTime().Year() );
+        alarmTime = alarmDateTime;
+        
+        // Move the alarm time to tomorrow, if the alarm time is in the past.
+        if( alarmTime < homeTime )
+            {
+            TTimeIntervalDays intervalDays( KFirstLine );
+            alarmTime = alarmTime + intervalDays;
+            }
+        }
+    // Select the alarm day.
+    weekDay = alarmTime.DayNoInWeek();
+    iDayIndex = ( TDay ) weekDay;
+	
+	__PRINTS( "CClockAlarmEditorImpl::GetSelectedAlmDayIndex - Exit" );
+    }
+
+// ---------------------------------------------------------
+// CClockAlarmEditorImpl::CreateAlmDayCtrlL
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+void CClockAlarmEditorImpl::CreateAlmDayCtrlL()
+    {
+	__PRINTS( "CClockAlarmEditorImpl::CreateAlmDayCtrlL - Entry" );
+	
+	TTime aNewAlmTime, aCurrTime;   
+	TInt dayIndex = iDayIndex ; 
+    
+	// We construct the alarm day control only if it is not already there.
+    if( !iShowAlarmDayControl )
+        {
+        // Get the current system time
+        aCurrTime.HomeTime();
+        CEikTTimeEditor* tTimeEditor=(CEikTTimeEditor*)Control(KFirstLine);
+        aNewAlmTime = tTimeEditor->GetTTime();
+        
+        TDateTime aTimeChange = aNewAlmTime.DateTime();
+        
+        aTimeChange.SetYear(aCurrTime.DateTime().Year());
+        aTimeChange.SetMonth(aCurrTime.DateTime().Month());
+        aTimeChange.SetDay(aCurrTime.DateTime().Day());
+        
+        TTime tmpTimeChange(aTimeChange);
+        aNewAlmTime = tmpTimeChange;
+                
+        if ( aNewAlmTime > aCurrTime )
+            {
+            dayIndex = aCurrTime.DayNoInWeek();
+            }
+        else
+            {
+            dayIndex = aCurrTime.DayNoInWeek() >= 6?0:(aCurrTime.DayNoInWeek()+1);
+            }
+        
+        // First get the number of lines present.
+        TInt lineCount = GetNumberOfLinesOnPage( KZerothDay );
+        
+        // Insert the line at the position above.
+        InsertLineL( lineCount, R_CLOCK_ALARMDAY_POPUP_LINE, KZerothDay);
+        
+        iAlmDayFieldTextValue->SetCurrentValueIndex(dayIndex);
+        CAknPopupField* almDayCtrl = static_cast< CAknPopupField* > ( Control( EControlAlarmDayPopup ) );
+        if(almDayCtrl)
+            {
+            almDayCtrl->SetQueryValueL(iAlmDayFieldTextValue);
+            }
+        // Set the flag to indicate that the alarm day control is present in the form.
+        iShowAlarmDayControl = ETrue;
+        
+        // Update the page.
+        UpdatePageL( ETrue );
+        }   
+    iDayIndex = dayIndex;
+	
+	__PRINTS( "CClockAlarmEditorImpl::CreateAlmDayCtrlL - Exit" );
+    }
+
+// ---------------------------------------------------------
+// CClockAlarmEditorImpl::DeleteAlmDayCtrlL
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+void CClockAlarmEditorImpl::DeleteAlmDayCtrlL()
+    {
+	__PRINTS( "CClockAlarmEditorImpl::DeleteAlmDayCtrlL - Entry" );
+	
+    // Delete the control only if it is present.
+	//Single click integration
+    if( iShowAlarmDayControl )
+        {
+        iShowAlarmDayControl = EFalse;
+        // Delete the control.
+        DeleteLine( EControlAlarmDayPopup );
+        // Update the form.
+        UpdatePageL( ETrue );
+              
+        }
+		
+	__PRINTS( "CClockAlarmEditorImpl::DeleteAlmDayCtrlL - Exit" );
+    }
+
+// ---------------------------------------------------------
+// CClockAlarmEditorImpl::SetTitleL
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+void CClockAlarmEditorImpl::SetTitleL( TBool aNonDefault )
+    {
+	__PRINTS( "CClockAlarmEditorImpl::SetTitleL - Entry" );
+	
+    // First get the title pane from appui.
+    CAknTitlePane* titlePane = 
+            static_cast< CAknTitlePane* >
+            ( iEikonEnv->AppUiFactory()->StatusPane()->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) );
+            
+    if( aNonDefault )
+        {
+        // Read the title text from resource.
+        HBufC* titleText = StringLoader::LoadLC( R_QTN_CLOCK_ALARM_EDITOR_TITLE, iEikonEnv );
+        TPtr titleTextPtr = titleText->Des();
+        // For converting text         
+        AknTextUtils::DisplayTextLanguageSpecificNumberConversion( titleTextPtr );
+        // Set the text in the title pane.
+        titlePane->SetTextL( *titleText );
+        // Cleanup.
+        CleanupStack::PopAndDestroy( titleText );
+        }
+    else
+        {
+        titlePane->SetTextToDefaultL();
+        }   
+
+	__PRINTS( "CClockAlarmEditorImpl::SetTitleL - Exit" );
+    }
+
+// ---------------------------------------------------------
+// CClockAlarmEditorImpl::SetAlarmL
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+void CClockAlarmEditorImpl::SetAlarmL()
+    {
+	__PRINTS( "CClockAlarmEditorImpl::SetAlarmL - Entry" );
+	
+    // Here we connect to the alarm server to set the alarm. We don't need to use the alarm model
+    // as the alarm editor doesn't need any notification from the alarm server about changes.
+    TASShdAlarm newAlarm;
+    // Connect to the alarm server.
+        
+    // Build the alarm properties from the info provided.
+    newAlarm.Category()           = KAlarmClockOne;
+    newAlarm.Message()            = iAlarmInfo.iMessage;
+    newAlarm.OriginalExpiryTime() = iAlarmInfo.iAlarmTime;
+    newAlarm.RepeatDefinition()   = iAlarmInfo.iRepeat;
+    newAlarm.SoundName()          = iAlarmInfo.iSound;
+    newAlarm.NextDueTime()        = iAlarmInfo.iAlarmTime;
+
+	// SSM related change.
+#ifdef SYMBIAN_SYSTEM_STATE_MANAGEMENT  
+    newAlarm.SetWakeup( ETrue );
+#else
+    newAlarm.ClientFlags().Set( KWakeupAlarmFlagIndex );
+#endif
+    
+    // This will add the alarm with the alarm server.
+	iAlarmSrvSes.AlarmAdd( newAlarm );
+    
+	// Save the new alarm id.
+    iAlarmId = newAlarm.Id();
+    
+    // Close the session with alarmserver.
+    
+    // Update the alarm info.
+    GetAlarmInformationL( iAlarmId, iAlarmInfo );
+	
+	__PRINTS( "CClockAlarmEditorImpl::SetAlarmL - Exit" );
+    }
+// ---------------------------------------------------------
+// CClockAlarmEditorImpl::GetActualAlarmTime
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+void CClockAlarmEditorImpl::GetActualAlarmTime( const TTime& aHomeTime, TTime& aTimeFromForm )
+    {
+    __PRINTS( "CClockAlarmEditorImpl::GetActualAlarmTime - Entry" );
+	
+    // Get the current day of the week.
+    TInt currentDay( aHomeTime.DayNoInWeek() );
+        
+    if( KWeeklyIndex == iOccuranceIndex )
+        {
+        TInt dateOffset( KZerothDay );
+
+        if( currentDay < iDayIndex )
+            {
+            dateOffset = iDayIndex - currentDay;
+            }
+        else if( currentDay > iDayIndex )
+            {
+            dateOffset = KDaysInWeek - ( currentDay - iDayIndex );
+            }
+        else if( currentDay == iDayIndex )
+            {
+            // This is the case where we check if the time set by the user is in the past.
+            // So we add 7 days to the alarm day.
+            if( aTimeFromForm > aHomeTime )
+                {
+                dateOffset = KZerothDay;
+                }
+            else
+                {
+                dateOffset = KDaysInWeek;
+                }
+            }
+        aTimeFromForm += TTimeIntervalDays( dateOffset );
+        }
+        else if( KRepeatOnceIndex == iOccuranceIndex )  
+            {            
+            if( aTimeFromForm < aHomeTime )
+                {                  
+                aTimeFromForm += TTimeIntervalDays( KNextDayIndex );
+                }            
+            }
+    __PRINTS( "CClockAlarmEditorImpl::GetActualAlarmTime - Exit" );
+    }
+
+// ---------------------------------------------------------
+// CClockAlarmEditorImpl::GetAlarmInformationL
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+TInt CClockAlarmEditorImpl::GetAlarmInformationL( TAlarmId aExistingAlarmId, 
+                                                  SClkAlarmInfo& aAlarmInfo )
+    {
+    __PRINTS( "CClockAlarmEditorImpl::GetAlarmInformationL - Entry" );
+    
+    TASShdAlarm tempAlarm;
+    
+    TInt returnVal = iAlarmSrvSes.GetAlarmDetails( aExistingAlarmId, tempAlarm );
+    
+    if( KErrNone == returnVal )
+        {
+        aAlarmInfo.iAlarmTime		= tempAlarm.NextDueTime();
+        aAlarmInfo.iMessage			= tempAlarm.Message();
+        aAlarmInfo.iOrigExpiryTime	= tempAlarm.OriginalExpiryTime();
+        aAlarmInfo.iRepeat			= tempAlarm.RepeatDefinition();
+        aAlarmInfo.iSound			= tempAlarm.SoundName();
+        aAlarmInfo.iState			= tempAlarm.State();
+        aAlarmInfo.iStatus			= tempAlarm.Status();
+        iAlarmSrvSes.GetAlarmCategory( aExistingAlarmId, aAlarmInfo.iCategory );
+        }
+    
+    __PRINTS( "CClockAlarmEditorImpl::GetAlarmInformationL - Exit" ); 
+    
+    return returnVal;
+    }
+
+// ---------------------------------------------------------
+// CClockAlarmEditorImpl::GetPreviousAlarmTimeL
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+void CClockAlarmEditorImpl::GetPreviousAlarmTimeL( SClkAlarmInfo& aAlarmInfo )
+    {
+    __PRINTS( "CClockAlarmEditorImpl::GetPreviousAlarmTimeL - Entry" );
+    
+    // Get the previous alarm time value from cenrep.
+    CRepository* cenRep( NULL );
+    TInt alarmTimeHour( NULL );
+    TTime homeTime;
+    homeTime.HomeTime();
+    TDateTime homeDateTime( homeTime.DateTime() );
+    
+    // Open the repository.
+    TRAPD( errVal, cenRep = CRepository::NewL( KCRUidNitz ) );
+    if( KErrNone == errVal )
+        {
+        CleanupStack::PushL( cenRep );
+
+        // Read the key.
+        errVal = cenRep->Get( KPreviousAlarmTime, alarmTimeHour );
+        
+        // Update the time.
+        homeDateTime.SetHour( alarmTimeHour / 60 );
+        homeDateTime.SetMinute( alarmTimeHour % 60 );
+        homeDateTime.SetSecond( NULL );
+        homeDateTime.SetMicroSecond( NULL );
+        
+        homeTime = homeDateTime;
+        
+        // Save the alarm time in the info.
+        aAlarmInfo.iAlarmTime = homeTime.Int64();
+
+        // Cleanup.
+        CleanupStack::PopAndDestroy( cenRep );
+        
+        __PRINTS( "CClockAlarmEditorImpl::GetPreviousAlarmTimeL - Exit" );
+        
+        return;
+        }
+    
+    // If there is a problem with opening cenrep, we fill the default time.
+    // Set the hour minute and second.
+    homeDateTime.SetHour( 9 );
+    homeDateTime.SetMinute( 0 );
+    homeDateTime.SetSecond( 0 );
+    homeTime = homeDateTime;
+    
+    // Save the alarm time in the info.
+    aAlarmInfo.iAlarmTime = homeTime.Int64();
+    
+    __PRINTS( "CClockAlarmEditorImpl::GetPreviousAlarmTimeL - Exit" );
+    }
+
+// ---------------------------------------------------------
+// CClockAlarmEditorImpl::SetPreviousAlarmTimeL
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+void CClockAlarmEditorImpl::SetPreviousAlarmTimeL( TTime& aTime )
+    {
+    __PRINTS( "CClockAlarmEditorImpl::SetPreviousAlarmTimeL - Entry" );
+    
+    CRepository* cenRep( NULL );
+    TInt alarmTimeMinutes( NULL );
+    
+    // Open the repository.
+    TRAPD( errVal, cenRep = CRepository::NewL( KCRUidNitz ) );
+    if( KErrNone == errVal )
+        {
+        CleanupStack::PushL( cenRep );
+        
+        // Get the high and low alarm time values.
+        alarmTimeMinutes = aTime.DateTime().Hour() * 60 + aTime.DateTime().Minute();
+       
+        // Set the values in cenrep.
+        cenRep->Set( KPreviousAlarmTime, alarmTimeMinutes );
+        
+        // Cleanup.
+        CleanupStack::PopAndDestroy( cenRep );
+
+        __PRINTS( "CClockAlarmEditorImpl::GetPreviousAlarmTimeL - Exit" );
+
+        return;
+        }
+    
+    __PRINTS( "CClockAlarmEditorImpl::SetPreviousAlarmTimeL - Exit" );
+    }
+
+
+// ---------------------------------------------------------
+// CClockAlarmEditorImpl::CheckForDstChangesL
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+TBool CClockAlarmEditorImpl::CheckForDstChangesL()
+    {
+    __PRINTS( "CClockAlarmEditorImpl::CheckForDstChangesL - Entry" );
+    
+    // User to be notified whether DST rollover happens in a day or 
+    // has happen within a day if he tries to change the time.
+    TBool returnValue( ETrue );
+    
+    // Establish connection with RTz to get the timezone ID
+    RTz tzHandle;
+    User::LeaveIfError( tzHandle.Connect() );
+    CleanupClosePushL( tzHandle );
+
+    // The timezone ID (current)
+    CTzId* currentTZId = tzHandle.GetTimeZoneIdL();
+    CleanupStack::PushL( currentTZId );
+
+    // The current time in UTC
+    TTime currentTime;
+    currentTime.UniversalTime();
+
+    // hometime (local time)
+    TTime homeTime;
+    homeTime.HomeTime();
+
+    //(Year, Month, Day, Hour, Minute, Second, Micrsecond)
+    TDateTime dateTime( homeTime.DateTime().Year(), EJanuary, 1, FALSE, FALSE, FALSE, FALSE );
+
+    TTime tempTime( dateTime ); 
+
+    // Get the current rules for the timezone
+    CTzRules* currentRules = tzHandle.GetTimeZoneRulesL( *currentTZId, tempTime, currentTime, ETzUtcTimeReference );
+    CleanupStack::PushL( currentRules );
+
+    // CVTzActualisedRules encapsulates the rules for a specific year.
+    // Every year has a dummy rule and further DST rules if DST is applicable (if Ohlson provides them)
+    CVTzActualisedRules *vActualisedRules = CVTzActualisedRules::NewL(
+            homeTime.DateTime().Year(), 
+            homeTime.DateTime().Year());
+    CleanupStack::PushL( vActualisedRules );
+
+    // The dummy rule is always the begining of the year.
+    // For example there is only 1 rule for India/NewDelhi but USA/Atlanta has 3 rules.
+    currentRules->GetActualisedRulesL( *vActualisedRules );
+
+    const TInt ruleCount( vActualisedRules->Count() );
+    TInt ruleMatchIndex( KNoDifference );
+
+    TTimeIntervalSeconds secondsDifference;
+    TTime ruleMatchTime;
+
+    // Fetch lowest time offset for the year residing at aTime. 
+    // This is used to determine if DST is on.
+    for( TInt ruleIndex( FALSE ); ruleIndex < ruleCount; ++ruleIndex )
+        {
+        const TVTzActualisedRule& actualisedRule = ( *vActualisedRules )[ ruleIndex ];
+
+        // Only check for the same year as requested (aTime)
+        if( actualisedRule.iTimeOfChange.DateTime().Year() == homeTime.DateTime().Year() )
+            {               
+            iAlarmInfo.iAlarmTime.SecondsFrom( actualisedRule.iTimeOfChange, secondsDifference );
+            // Considering the time reference is important as America (North & South) uses
+            // the Wall time (local time) reference where as whole of Europe refers to time
+            // in terms of UTC time. Correspondingly, the choise of local time or utc time 
+            // has to be made.
+            TTime ruleTime;
+
+            if( ETzUtcTimeReference == actualisedRule.iTimeReference )
+                {
+                ruleTime = currentTime;
+                }
+            else if( ETzWallTimeReference == actualisedRule.iTimeReference )
+                {
+                ruleTime = homeTime;
+                }
+            else if( ETzStdTimeReference == actualisedRule.iTimeReference )
+                {
+                // TODO: Testing so far hasn't encountered a rule in this time reference. 
+                // If in case an error is found, corresponding code can be added here.
+                // No support from symbian for this.
+                }
+
+            TDateTime sevenDays( FALSE, EJanuary, KDaysInWeek, FALSE, FALSE, FALSE, FALSE );
+            TTime tempTime( sevenDays );
+            TTime newTime( ruleTime.Int64() + tempTime.Int64() );
+
+            TTimeIntervalDays temp;
+            temp = newTime.DaysFrom( ruleTime );
+
+            if( ( secondsDifference.Int() >= KNoDifference ) &&
+                ( newTime > iAlarmInfo.iAlarmTime ) && 
+                ( actualisedRule.iTimeOfChange < iAlarmInfo.iAlarmTime ) && 
+                ( ruleTime < actualisedRule.iTimeOfChange ) )
+                {
+                // If there is a match, save the index and break.
+                // We've got the rule and there's no need to continue with other rules.
+                ruleMatchIndex = ruleIndex;
+                ruleMatchTime = actualisedRule.iTimeOfChange;
+                break;
+                }
+            }
+        }
+
+    if( ruleMatchIndex > KZerothRule )
+        {
+        // There's a match, display the information note about DST change.
+        TTime displayTime;
+        TTimeIntervalHours oneHour( KOneHour );         
+
+        displayTime = iAlarmInfo.iAlarmTime;
+
+        TBuf< KMaxCharsInNote > dateTimeString;
+
+        // dateString will have "11:59 pm" - as above, but no seconds
+        displayTime.FormatL( dateTimeString, KDateTimeFormatter );
+
+        // If This note is displayed,
+        CAknInformationNote* informationNote = new( ELeave ) CAknInformationNote( ETrue );
+
+        HBufC* noteText = StringLoader::LoadLC(
+                R_QTN_CLOCK_NOTE_ALARM_DST_ROLLOVER, 
+                dateTimeString, 
+                iCoeEnv);               
+        TInt error = informationNote->ExecuteLD( noteText->Des() );
+
+        // Don't display the second note. Not necessary to show both notes.
+        returnValue = ETrue;
+        CleanupStack::PopAndDestroy( noteText );                                
+        } 
+
+    tzHandle.Close();
+    CleanupStack::PopAndDestroy( vActualisedRules);
+    CleanupStack::PopAndDestroy( currentRules );
+    CleanupStack::PopAndDestroy( currentTZId );
+    CleanupStack::PopAndDestroy( &tzHandle );
+    
+    __PRINTS( "CClockAlarmEditorImpl::CheckForDstChangesL - Exit" );
+
+    return returnValue;
+    }
+
+// ---------------------------------------------------------
+// CClockAlarmEditorImpl::DisplayRemainingTimeL
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+void CClockAlarmEditorImpl::DisplayRemainingTimeL()
+    {
+    __PRINTS( "CClockAlarmEditorImpl::DisplayRemainingTimeL - Entry" );
+    
+    HBufC* stringHolder( NULL );
+
+    TTime currentTime;
+    currentTime.HomeTime();     
+
+    TTime alarmTime = iAlarmInfo.iOrigExpiryTime;
+    TBool oneDayDifference( EFalse );    
+
+    // Check for the day of the alarm.
+    if( currentTime < alarmTime )
+        {
+        currentTime += TTimeIntervalDays( 1 );
+        // Check if the alarm is for the current day.
+        oneDayDifference = ( currentTime < alarmTime )? ETrue : EFalse;
+        }
+
+    TInt alarmDay( alarmTime.DayNoInWeek() );
+    const TInt KTimeStringLength( 10 );
+    TBuf< KTimeStringLength > timeString;
+
+    HBufC* timeFormat = StringLoader::LoadLC( R_QTN_TIME_USUAL_WITH_ZERO, iCoeEnv );
+    CleanupStack::Pop( timeFormat );
+
+    alarmTime.FormatL( timeString, *timeFormat );
+
+    CDesCArrayFlat* stringArray = new( ELeave ) CDesCArrayFlat( 2 );
+    CDesCArrayFlat* workDaysList = iCoeEnv->ReadDesCArrayResourceL( R_CLOCK_WEEK_DAYS_ARRAY );
+
+    // The day on which alarm is set.
+    stringArray->AppendL( ( *workDaysList )[ alarmDay ] );
+    // The time string.
+    stringArray->AppendL( timeString );
+
+    // Choose the appropriate Repeat type.
+    switch( iAlarmInfo.iRepeat )
+        {
+        case EAlarmRepeatDefintionRepeatOnce:
+            {
+            if( oneDayDifference )
+                {
+                stringHolder = StringLoader::LoadLC( R_QTN_CLOCK_ALARM_NOTE_ONCE_NEXT, *stringArray, iEikonEnv );
+                }
+            }
+            break;
+        
+        case EAlarmRepeatDefintionRepeatDaily:
+            {
+            stringHolder = StringLoader::LoadLC( R_QTN_CLOCK_ALARM_NOTE_DAY_CLK, timeString, iEikonEnv );
+            }
+            break;
+            
+        case EAlarmRepeatDefintionRepeatWeekly:
+            {
+            stringHolder = StringLoader::LoadLC( R_QTN_CLOCK_ALARM_NOTE_WEEK_CLK, *stringArray, iEikonEnv );
+            }
+            break;
+            
+        case EAlarmRepeatDefintionRepeatWorkday:
+            {
+            stringHolder = StringLoader::LoadLC( R_QTN_CLOCK_ALARM_NOTE_WDAY_CLK, timeString, iEikonEnv );
+            }
+            break;
+            
+        default:
+            {
+            // No implementation yet.
+            }
+            break;
+        }
+    
+    // Cleanup.
+    delete timeFormat;
+    delete stringArray;
+    delete workDaysList;        
+
+    // Need to show the confirmation note.
+    if( ( EAlarmStatusEnabled == iAlarmInfo.iStatus ) && stringHolder )
+        {
+        // TODO: to be verified todo this or not.
+        CAknConfirmationNote* confirmationNote = new( ELeave ) CAknConfirmationNote( ETrue );
+
+        TPtr stringHolderPtr = stringHolder->Des();
+        AknTextUtils::DisplayTextLanguageSpecificNumberConversion( stringHolderPtr );    
+
+        confirmationNote->ExecuteLD( *stringHolder );
+
+        // Cleanup
+        CleanupStack::PopAndDestroy( stringHolder );
+        } 
+
+    // Dislpay the second note.
+    if( !oneDayDifference )
+        {
+        TTime homeTime;
+        homeTime.HomeTime();
+
+        TDateTime currentDate( homeTime.DateTime() );
+        TDateTime alarmDate( iAlarmInfo.iAlarmTime.DateTime() );
+
+        alarmDate.SetYear( currentDate.Year() );
+        alarmDate.SetMonth( currentDate.Month() );
+        alarmDate.SetDay( currentDate.Day() );
+
+        TTime newAlarmTime( alarmDate );
+
+        if( newAlarmTime < homeTime )
+            {
+            newAlarmTime += TTimeIntervalDays( 1 );
+            }
+
+        // Construct the remaining time.            
+        TTimeIntervalMicroSeconds remainingTime( newAlarmTime.MicroSecondsFrom( homeTime ) );
+        TInt64 tempInt = ( remainingTime.Int64() ) / KOneMinuteInMicrosecond;
+        TInt remainingMinutes = I64INT( tempInt );
+
+        CArrayFix< TInt >* timeArray = new( ELeave ) CArrayFixFlat< TInt >( 2 );
+        CleanupStack::PushL( timeArray );
+
+        TInt remainingHours( remainingMinutes / KOneHourInMinute );
+
+        remainingMinutes -= remainingHours * KOneHourInMinute;
+
+        timeArray->AppendL( remainingHours );
+        timeArray->AppendL( remainingMinutes );
+
+        // Alarm is with in 1 day. Choose the appropriate strings to be displayed.
+        switch( remainingHours )
+            {
+            case KOneMinute:
+                {
+                if( KOneMinute == remainingMinutes )
+                    {
+                    stringHolder = StringLoader::LoadLC( R_CLOCK_ALARM_CONF_SINGULAR, *timeArray, iEikonEnv );
+                    }
+                else
+                    {
+                    stringHolder = StringLoader::LoadLC( R_CLOCK_ALARM_CONF_HOUR_SEV_MIN, *timeArray, iEikonEnv );
+                    }
+                }
+                break;
+                
+            default:
+                {
+                if( KOneMinute == remainingMinutes )
+                    {
+                    stringHolder = StringLoader::LoadLC( R_CLOCK_ALARM_CONF_SEV_HOURS_MIN, *timeArray, iEikonEnv );
+                    }
+                else
+                    {
+                    stringHolder = StringLoader::LoadLC( R_CLOCK_ALARM_CONF_PLURAL, *timeArray, iEikonEnv );
+                    }
+                }
+                break;
+            }
+        
+        // TODO: to be verified todo this or not.
+        if( ( EAlarmStatusEnabled == iAlarmInfo.iStatus )  && stringHolder )
+            {
+            CAknConfirmationNote* confirmationNote = new( ELeave ) CAknConfirmationNote( ETrue );
+
+            TPtr stringHolderPtr = stringHolder->Des();
+            AknTextUtils::DisplayTextLanguageSpecificNumberConversion( stringHolderPtr );    
+
+            confirmationNote->ExecuteLD( *stringHolder ); 
+            }
+
+        // Cleanup.        
+        CleanupStack::PopAndDestroy( stringHolder );
+        CleanupStack::PopAndDestroy( timeArray );
+        }
+    
+    __PRINTS( "CClockAlarmEditorImpl::DisplayRemainingTimeL - Exit" );
+    }
+
+// ---------------------------------------------------------
+// CClockAlarmEditorImpl::HandleEdwinEventL
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+void CClockAlarmEditorImpl::HandleEdwinEventL( CEikEdwin* /*aEdwin*/,
+                                           TEdwinEvent /*aEventType*/ )
+    {
+	__PRINTS( "CClockAlarmEditorImpl::HandleEdwinEventL - Entry" );
+	
+    // No implementation yet.
+	
+	__PRINTS( "CClockAlarmEditorImpl::HandleEdwinEventL - Exit" );
+    }
+
+// ---------------------------------------------------------
+// CClockAlarmEditorImpl::OfferKeyEventL
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+TKeyResponse CClockAlarmEditorImpl::OfferKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType )
+    {
+	__PRINTS( "CClockAlarmEditorImpl::OfferKeyEventL - Entry" );
+	
+    if( EEventKey == aType )
+        {
+        if( EStdKeyNo == aKeyEvent.iScanCode )
+            {
+            // This indicates that Call End key was pressed.
+            // The application is hidden in the background.
+            TryExitL( EClockAlarmExit );
+
+            __PRINTS( "CClockAlarmEditorImpl::OfferKeyEventL - Exit" );
+
+            return EKeyWasConsumed;
+            }
+        }
+		
+	__PRINTS( "CClockAlarmEditorImpl::OfferKeyEventL - Exit" );
+    
+    // Allow the form to update itself and then return.
+    return CAknForm::OfferKeyEventL( aKeyEvent, aType );
+    }
+
+
+// ---------------------------------------------------------
+// CClockAlarmEditorImpl::LineChangedL
+// rest of the details are commented in the header
+// ---------------------------------------------------------
+//
+void CClockAlarmEditorImpl::LineChangedL( TInt aControlId )
+    {
+	__PRINTS( "CClockAlarmEditorImpl::LineChangedL - Entry" );
+	
+    // First get the control that is focused.
+    iSelectedControl = aControlId;
+    
+    // Modify the cba.
+    CEikButtonGroupContainer& bgContainer = ButtonGroupContainer();
+    bgContainer.SetCommandSetL( R_CLOCK_ALARM_EDITOR_CBA );
+    
+    // Now depending on the occurance, the Change command should be dimmed or displayed.
+    if( ( EControlTextEditor == iSelectedControl ) ||
+        ( EControlTimeEditor == iSelectedControl ) )
+        {
+        bgContainer.MakeCommandVisible( EAknSoftkeyChange, EFalse );
+        }
+    else if( ( EControlAlarmDayPopup == iSelectedControl ) ||
+             ( EControlOccurancePopup == iSelectedControl ) )
+        {
+        bgContainer.MakeCommandVisible( EAknSoftkeyChange, ETrue );
+        }
+    else
+        {
+        // Blank block, to avoid PC-Lint warning.
+        }
+    
+    // Redraw the cba.
+    bgContainer.DrawNow();
+	
+	__PRINTS( "CClockAlarmEditorImpl::LineChangedL - Exit" );
+    }
+
+//Single click integration
+// ---------------------------------------------------------
+// CClockAlarmEditorImpl::HandleControlStateChangeL
+// Handles state change events from form controls
+// ---------------------------------------------------------
+//
+void CClockAlarmEditorImpl::HandleControlStateChangeL( TInt aControlId )
+    {
+    if ( aControlId == EControlOccurancePopup )
+        {
+        HandleOccuranceCmdL(); 
+        }
+    else if ( aControlId == EControlAlarmDayPopup )
+        {
+        HandleAlarmDayCmdL(); 
+        }
+    }
+
+
+// End of file