ipsservices/ipssossettings/src/ipssetuibasedialog.cpp
changeset 0 8466d47a6819
child 20 efd4f1afd43e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ipsservices/ipssossettings/src/ipssetuibasedialog.cpp	Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,2683 @@
+/*
+* Copyright (c) 2007 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 file implements class CIpsSetUiBaseDialog.
+*
+*/
+
+
+
+#include "emailtrace.h"
+#include <akntitle.h>               // CAknTitlePane
+#include <AknQueryDialog.h>         // CAknQueryDialog
+#include <aknradiobuttonsettingpage.h> // CAknRadioButtonSettingPage
+#include <aknpasswordsettingpage.h> // CAknPasswordSettingPage
+#include <akntextsettingpage.h>     // CAknTextSettingPage
+#include <akncheckboxsettingpage.h> // CAknCheckBoxSettingPage
+#include <ipssossettings.rsg>
+#include <StringLoader.h>
+//<cmail> checking if MSK is enabled in layout (Layout_Meta_Data::IsMSKEnabled)
+#include <layoutmetadata.cdl.h>
+//</cmail>
+
+#include "ipssetutilsexception.h"
+#include "ipssetuiapprover.h"
+#include "ipssetuiitembase.h"      // CIpsSetUiItem
+#include "ipssetuiitemvalue.h" // CIpsSetUiItemValue
+#include "ipssetuiitemtext.h"  // CIpsSetUiItemEditText
+#include "ipssetuiitemlink.h"      // CIpsSetUiItemLink
+#include "ipssetuiitemextlink.h"   // CIpsSetUiItemExtLink
+#include "ipssetuictrlsoftkey.h"
+#include "ipssetdata.h" // CIpsSetData::EAllDay, KIpsSetDataTimeDefault
+#include "ipssetuibasedialog.h"     // CIpsSetUiBaseDialog
+#include "ipssetutilspageids.hrh"
+
+// Prevent any looping problems by defining maximum amount of editor openings
+const TInt KIpsSetUiMaxEditors = 100;
+
+
+
+// ============================ MEMBER FUNCTIONS ==============================
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::CIpsSetUiBaseDialog()
+// ----------------------------------------------------------------------------
+//
+CIpsSetUiBaseDialog::CIpsSetUiBaseDialog(
+    CEikFormattedCellListBox& aListBox,
+    CAknTitlePane& aTitlePane )
+    :
+    CIpsSetUiBaseArray(),
+    iListBox( aListBox ),
+    iTitlePane( aTitlePane ),
+    iSoftkeys( NULL ),
+    iSettingPage( NULL ),
+    iSettingPageResources( NULL ),
+    iSettingsPageArray( NULL ),
+    iScrollBar( NULL ),
+    iOldTitleText( NULL ),
+    iQueryDialog( NULL ),
+    iSettingsLastItemIndex( NULL ),
+    iSettingValue( KErrNotFound ),
+    iSettingText( NULL ),
+    iNewPassword( NULL ),
+    iOldPassword( NULL ),
+    iButtonArray( NULL ),
+    iCheckboxArray( NULL )
+    {
+    FUNC_LOG;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::~CIpsSetUiBaseDialog()
+// ----------------------------------------------------------------------------
+//
+CIpsSetUiBaseDialog::~CIpsSetUiBaseDialog()
+    {
+    FUNC_LOG;
+    // Remove the scrollbar from listbox
+    iListBox.SetScrollBarFrame( NULL, CEikListBox::EOwnedExternally );
+
+    if ( iSoftkeys )
+        {
+        iSoftkeys->SetObserver( EFalse, EFalse, EFalse, *this );
+        }
+    delete iSoftkeys;
+    iSoftkeys = NULL;
+
+    delete iSettingPageResources;
+    iSettingPageResources = NULL;
+
+    if ( iSettingsLastItemIndex )
+        {
+        iSettingsLastItemIndex->Reset();
+        }
+
+    delete iSettingsLastItemIndex;
+    iSettingsLastItemIndex = NULL;
+
+    if ( iCheckboxArray )
+        {
+        iCheckboxArray->ResetAndDestroy();
+        }
+
+    if ( iSettingsPageArray )
+        {
+        iSettingsPageArray->Reset();
+        }
+
+    if ( iBackupArray )
+        {
+        iBackupArray->ResetAndDestroy();
+        }
+
+    delete iBackupArray;
+    iBackupArray = NULL;
+    delete iSettingsPageArray;
+    iSettingsPageArray = NULL;
+    delete iCheckboxArray;
+    iCheckboxArray = NULL;
+    delete iOldTitleText;
+    iOldTitleText = NULL;
+    delete iQueryDialog;
+    iQueryDialog = NULL;
+    delete iSettingPage;
+    iSettingPage = NULL;
+    delete iButtonArray;
+    iButtonArray = NULL;
+    iSettingText.Close();
+    delete iNewPassword;
+    iNewPassword = NULL;
+    delete iOldPassword;
+    iOldPassword = NULL;
+    iScrollBar = NULL;
+    delete iItemApprover;
+    iItemApprover = NULL;
+    delete iMainMBoxMenuTitleText;
+    iMainMBoxMenuTitleText = NULL;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::ConstructL()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUiBaseDialog::ConstructL(
+    CEikButtonGroupContainer& aSoftkeys,
+    const TInt aResource,
+    const TBool aUpdateMSK )
+    {
+    FUNC_LOG;
+    BaseConstructL( aResource );
+
+    // Set as observer
+    iListBox.SetListBoxObserver( this );
+    iListBox.View()->SetListEmptyTextL( KNullDesC );
+
+    // Get scrollbar
+    iScrollBar = iListBox.CreateScrollBarFrameL( ETrue );
+    iScrollBar->SetScrollBarVisibilityL(
+        CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto );
+
+    // Create array
+    CTextListBoxModel* model = iListBox.Model();
+    model->SetItemTextArray( this );
+    model->SetOwnershipType( ELbmDoesNotOwnItemArray );
+
+    // Set this dialog for button listening
+    iSoftkeys = CIpsSetUiCtrlSoftkey::NewL( aSoftkeys );
+    iSoftkeys->SetObserver( ETrue, ETrue, ETrue, *this );
+    iSoftkeys->SetMSKLabelling( aUpdateMSK );
+    iSoftkeys->UpdateMiddleSoftkeyLabelL(
+        GetResourceForMiddlekey(), EAknSoftkeyOpen, this );
+
+    // Prepare setting page arrays
+    iSettingPageResources = CIpsSetUiCtrlPageResource::NewL();
+    iSettingsLastItemIndex =
+        new ( ELeave ) CIpsSetUiIntArray( KIpsSetUiArrayGranularity );
+
+    // Add array to store the backup items
+    iBackupArray = new ( ELeave ) CIpsSetUiBaseItemArray( KIpsSetUiArrayGranularity );
+
+    // Define setting pages in enumeration order
+    iSettingPageResources->CreateStackL( R_IPS_SET_DIALOG_LISTBOX );
+    iSettingPageResources->CreateStackL( R_IPS_SET_DIALOG_CHECKLISTBOX );
+    iSettingPageResources->CreateStackL( R_IPS_SET_DIALOG_TEXT );
+    iSettingPageResources->CreateStackL( R_IPS_SET_DIALOG_NUMBER );
+    iSettingPageResources->CreateStackL( R_IPS_SET_DIALOG_SC_NUMBER );
+    iSettingPageResources->CreateStackL( R_IPS_SET_DIALOG_PASSWORD );
+    iSettingPageResources->CreateStackL( NULL );
+
+    iItemApprover = CIpsSetUiApprover::NewL();
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::HandleListBoxEventL()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUiBaseDialog::HandleListBoxEventL(
+    CEikListBox* /* aListBox */,
+    TListBoxEvent aEventType )
+    {
+    FUNC_LOG;
+    if( aEventType == EEventItemSingleClicked )
+    	{
+    	CIpsSetUiItem* base = CurrentItem();
+    	OpenSettingPageL( *base );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::OfferKeyEventL
+// ----------------------------------------------------------------------------
+//
+TKeyResponse CIpsSetUiBaseDialog::OfferKeyEventL(
+    const TKeyEvent& /* aKeyEvent */,
+    TEventCode aType )
+    {
+    FUNC_LOG;
+    if ( aType == EEventKeyUp && iSoftkeys->MSKLabelling() )
+        {
+        iSoftkeys->UpdateMiddleSoftkeyLabelL(
+            GetResourceForMiddlekey(), EAknSoftkeyOpen, this );
+        }
+
+    return EKeyWasNotConsumed;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::GetResourceForMiddlekey()
+// ----------------------------------------------------------------------------
+//
+TInt CIpsSetUiBaseDialog::GetResourceForMiddlekey()
+    {
+    FUNC_LOG;
+//<cmail> run-time MSK variation check (enabled in platform + in current layout)
+    TInt resource = 0;
+    if ( AknLayoutUtils::MSKEnabled() && Layout_Meta_Data::IsMSKEnabled() )
+        {
+        CIpsSetUiItem* item = CurrentItem();
+        IPS_ASSERT_DEBUG( item , KErrNotFound, EBaseDialog );
+        if ( item )
+            {
+            resource = ItemSubArrayCheck( *item ) ?
+                R_QTN_MSK_OPEN : R_QTN_MSK_CHANGE; // <cmail>
+            }
+        }
+    return resource;
+//</cmail>
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::SetTitlePaneTextL()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUiBaseDialog::SetMainMBoxMenuTitlePaneTextL(
+    const TDesC& aText,
+    const TBool aSaveCurrent )
+    {
+    FUNC_LOG;
+    // aText contains mailbox name
+    HBufC* titleText = StringLoader::LoadLC(
+            R_FSE_SETTINGS_LIST_MAILBOX_TITLE, aText );
+
+    if ( aSaveCurrent )
+        {
+        delete iOldTitleText;
+        iOldTitleText = NULL;
+        iOldTitleText = iTitlePane.Text()->Alloc();
+        delete iMainMBoxMenuTitleText;
+        iMainMBoxMenuTitleText = NULL;
+        iMainMBoxMenuTitleText = aText.AllocL();
+        }
+
+    iTitlePane.SetTextL( *titleText );
+    CleanupStack::PopAndDestroy( titleText );
+    titleText = NULL;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::SetPreviousTitlePaneText()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUiBaseDialog::SetSettingsMenuTitlePaneText(
+    const TBool aSaveCurrent )
+    {
+    FUNC_LOG;
+    TRAP_IGNORE( SetMainMBoxMenuTitlePaneTextL(
+            *iOldTitleText, aSaveCurrent ) );
+    }
+
+/******************************************************************************
+
+    Settingpage opening
+
+    - Find out the item to be edited
+    - Send start editing event with the item
+    - Check the item type
+    - Check the resources
+    - If no resources available, ask them
+    - Start editing
+    - Send end editing event
+
+******************************************************************************/
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::OpenSettingPageL()
+// ----------------------------------------------------------------------------
+//
+TIpsSetUiPageResult CIpsSetUiBaseDialog::OpenSettingPageL(
+    const TInt aIndex )
+    {
+    FUNC_LOG;
+    // To open setting page, check if the Setting Page index is provided,
+    // if not get the current item index in array
+    TInt index = ( aIndex == KErrNotFound ) ?
+        iListBox.CurrentItemIndex() : aIndex;
+
+    // Search for the item and open it
+    return SettingPageOpenL( *GetItem( index ) );
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::OpenSettingPageL()
+// ----------------------------------------------------------------------------
+//
+TIpsSetUiPageResult CIpsSetUiBaseDialog::OpenSettingPageL(
+    CIpsSetUiItem& aBaseItem )
+    {
+    FUNC_LOG;
+    return SettingPageOpenL( aBaseItem );
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::SettingPageOpenL()
+//
+// This function contains the main logic for the setting editor handling
+// in the settings dialog. The setting editors are kept opening as long
+// as the all the settings are gone through or the editor is dismissed.
+// ----------------------------------------------------------------------------
+//
+TIpsSetUiPageResult CIpsSetUiBaseDialog::SettingPageOpenL(
+    CIpsSetUiItem& aBaseItem )
+    {
+    FUNC_LOG;
+    // Don't open the editor for read-only items
+    if ( aBaseItem.iItemFlags.Flag32( KIpsSetUiFlagReadOnly ) )
+        {
+        return EIpsSetUiPageResultReadOnly;
+        }
+    // Store current focused item for last item index array
+    iCurrentItemIndex = iListBox.CurrentItemIndex();
+
+    // Starting editing of the item, do not allow updating during editing
+    iArrayFlags.ClearFlag( EIpsSetUiArrayAllowRefresh );
+
+    // When starting to edit page, send event so that item can be prepared
+    // for the editing. In case of error, editing won't start
+    TIpsSetUiEventResult eventResult = EventItemEditStartsL( aBaseItem );
+    TIpsSetUiPageResult result;
+
+    if ( eventResult == EIpsSetUiPageEventResultApproved )
+        {
+        // Create the array if it doesn't exist yet
+        if ( !iSettingsPageArray )
+            {
+            iSettingsPageArray = new ( ELeave ) CIpsSetUiBaseItemArray(
+                KIpsSetUiArrayGranularity );
+            }
+
+        // Clear the array and add the editable item to array
+        CleanBackupArray();
+        iSettingsPageArray->Reset();
+        SetCurrentSettingsPageL( aBaseItem );
+        result = SettingsPageOpenCheckL();
+
+        do
+            {
+            if ( result == EIpsSetUiPageResultEditing )
+                {
+                // Open the setting page
+                result = SettingPageOpenEditorL();
+
+                // Do open check. Note that the result can be modified!
+                SettingsCheckNextEditorOpenL( result );
+                }
+
+            // Finish the editing of the item
+            SettingPageOpenFinishL();
+            }
+        while ( result == EIpsSetUiPageResultEditing );
+        }
+    else if ( eventResult == EIpsSetUiPageEventResultDisapproved )
+        {
+        result = EIpsSetUiPageResultOk;
+        }
+    else
+        {
+        result = EIpsSetUiPageResultEventCancel;
+        }
+
+    // Send item edit ends
+    EventItemEditEndsL( aBaseItem );
+    aBaseItem.iItemFlags.ClearFlag32( KIpsSetUiFlagOneTimeForceViewOpen );
+    iArrayFlags.SetFlag( EIpsSetUiArrayAllowRefresh );
+    
+    // Update the listbox
+    Refresh();
+
+    return result;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::EventPrepareSubArrayL()
+// ----------------------------------------------------------------------------
+//
+TInt CIpsSetUiBaseDialog::EventPrepareSubArrayL(
+    CIpsSetUiItem& aBaseItem,
+    const TBool aForward )
+    {
+    FUNC_LOG;
+    // Check direction in array
+    UpdateTitlePaneTextL( GetLastResourceId( ) );
+    if ( aForward )
+        {
+        // Store the index and set to beginning
+        SetSettingsLastItemIndexL( iCurrentItemIndex );
+        iListBox.SetCurrentItemIndex( 0 );
+        }
+    // When going backwards
+    else
+        {
+        // Restore previous index
+        iListBox.SetCurrentItemIndex( SettingsLastItemIndex() );
+        }
+
+    return EventSubArrayChangeL( aBaseItem );
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::UpdateTitlePaneTextL()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUiBaseDialog::UpdateTitlePaneTextL( TInt aId )
+    {
+    FUNC_LOG;
+    HBufC* titleText = NULL;
+    switch ( aId )
+        {
+        case R_IPS_SET_MENU_MAILBOX_SETTINGS:
+            titleText = StringLoader::LoadLC( R_FSE_SETTINGS_TITLE_MAILBOX );
+            iTitlePane.SetTextL( *titleText );
+            break;
+        case R_IPS_SET_MENU_ADVANCED_MAILBOX_SETTINGS:
+            titleText = StringLoader::LoadLC(
+                    R_FSE_SETTINGS_ADVANCED_MAILBOX_SETTINGS );
+            iTitlePane.SetTextL( *titleText );
+            break;
+		// <cmail> ipssossettings to use correct loc strings in titles
+        case R_IPS_SET_MENU_INCOMING_SETTINGS:
+            titleText = StringLoader::LoadLC(
+            	R_FSE_SETTINGS_INCOMING_TITLE );
+            iTitlePane.SetTextL( *titleText );
+            break;
+        case R_IPS_SET_MENU_OUTGOING_SETTINGS:
+            titleText = StringLoader::LoadLC(
+            	R_FSE_SETTINGS_OUTGOING_TITLE );
+            iTitlePane.SetTextL( *titleText );
+            break;
+        case R_IPS_SET_MENU_WHAT_TO_SYNC:
+        case R_IPS_SET_WHAT_TO_SYNC_ARRAY_EMAIL_RETRIEVE_POP3:
+        case R_IPS_SET_WHAT_TO_SYNC_ARRAY_EMAIL_RETRIEVE_IMAP4:
+            titleText = StringLoader::LoadLC( 
+                    R_FSE_SETTINGS_SERVICE_WHAT_TO_SYNC_TITLE );
+            iTitlePane.SetTextL( *titleText );
+            break;
+        case R_IPS_SET_MENU_WHEN_TO_SYNC:
+            titleText = StringLoader::LoadLC( 
+                    R_FSE_SETTINGS_SERVICE_WHEN_TO_SYNC_TITLE );
+            iTitlePane.SetTextL( *titleText );
+            break;
+        // </cmail>
+        default:
+            {
+            delete iMainMBoxMenuTitleText;
+            iMainMBoxMenuTitleText = NULL;
+            iMainMBoxMenuTitleText = GetItem( TUid::Uid( EIpsSetUiMailboxMailboxName ) )->Text().AllocL();
+            Refresh();
+            
+            if ( iMainMBoxMenuTitleText )
+                {
+                titleText = StringLoader::LoadLC(
+                        R_FSE_SETTINGS_LIST_MAILBOX_TITLE, *iMainMBoxMenuTitleText );
+                iTitlePane.SetTextL( *titleText );
+                }
+            break;
+            }
+        }
+    if ( titleText )
+        {
+        CleanupStack::PopAndDestroy( titleText );
+        }
+    }
+
+/******************************************************************************
+
+    Settingpage creation
+
+******************************************************************************/
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::SettingsPageOpenCheckL()
+// ----------------------------------------------------------------------------
+//
+TIpsSetUiPageResult CIpsSetUiBaseDialog::SettingsPageOpenCheckL()
+    {
+    FUNC_LOG;
+    CIpsSetUiItem* base = CurrentSettingsPage();
+
+    // Before starting to open the page, check that item type is not
+    // menuarray. In case of menuarray, just open the next level
+    if ( HandleStackForwardL( *base ) == EIpsSetUiStackResultSubMenuOpen )
+        {
+        iSoftkeys->UpdateMiddleSoftkeyLabelL(
+            GetResourceForMiddlekey(), EAknSoftkeyOpen, this );
+        return EIpsSetUiPageResultSubMenuOpen;
+        }
+
+    // Don't open read only items
+    if ( base->iItemFlags.Flag32( KIpsSetUiFlagReadOnly ) )
+        {
+        return EIpsSetUiPageResultReadOnly;
+        }
+
+    // The page is ok is for edit
+    return EIpsSetUiPageResultEditing;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::SettingsCheckNextEditorOpenL()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUiBaseDialog::SettingsCheckNextEditorOpenL(
+    TIpsSetUiPageResult& aResult )
+    {
+    FUNC_LOG;
+    // The settings user have selected, must be available to user.
+    // For this reason, items shall restored to main array only, when
+    // returning from editors
+
+    switch ( aResult )
+        {
+        // Handle approved
+        case EIpsSetUiPageResultOk:
+            aResult = HandleEditorOk();
+            break;
+
+        // Handle the cancelled editor page
+        case EIpsSetUiPageResultCancelled:
+            aResult = HandleEditorCancelL();
+            break;
+
+        // Continue editing
+        case EIpsSetUiPageResultEditing:
+            aResult = HandleEditorDisapproved();
+            break;
+
+        default:
+            IPS_ASSERT_DEBUG( EFalse, KErrUnknown, EBaseDialog );
+            User::Leave( KErrUnknown );
+            break;
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::HandleEditorCancelL()
+// ----------------------------------------------------------------------------
+//
+TIpsSetUiPageResult CIpsSetUiBaseDialog::HandleEditorCancelL()
+    {
+    FUNC_LOG;
+    // The editor was cancelled, so the first check needed to make
+    // is deterimine, if the editor was first in the line.
+    TIpsSetUiPageResult result = EIpsSetUiPageResultInvalidResult;
+
+    TInt editorCount = iSettingsPageArray->Count();
+    if ( editorCount == 1 )
+        {
+        // Restore all of the items
+        RestoreFromBackup();
+        result = EIpsSetUiPageResultCancelled;
+        }
+    // More than one page in the array, just jump back to the previous
+    // and remove the previous value
+    else if ( editorCount > 0 )
+        {
+        RemoveLastBackupItem();
+        iSettingsPageArray->Delete( editorCount-1 );
+        result = EIpsSetUiPageResultEditing;
+        }
+    // Array is empty, unexpected situation
+    else
+        {
+        IPS_ASSERT_DEBUG( EFalse, KErrNotFound, EBaseDialog );
+        User::Leave( KErrNotFound );
+        }
+
+    return result;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::HandleEditorOk()
+// ----------------------------------------------------------------------------
+//
+TIpsSetUiPageResult CIpsSetUiBaseDialog::HandleEditorOk()
+    {
+    FUNC_LOG;
+    CIpsSetUiItem* nextItem = NULL;
+
+    // Check if current selection contains subeditors
+    if ( iSettingValue >= 0 )
+        {
+        nextItem = SettingFindEditor(
+           *CurrentSettingsPage(), iSettingValue );
+        }
+
+    TIpsSetUiPageResult result = EIpsSetUiPageResultInvalidResult;
+
+    // In case subeditor is found, set the item to list and continue
+    // editing
+    if ( nextItem )
+        {
+        TRAP_IGNORE( SetCurrentSettingsPageL( *nextItem ) );
+        result = EIpsSetUiPageResultEditing;
+        }
+    // Cleanup the array and stop editing
+    else
+        {
+        CleanBackupArray();
+        result = EIpsSetUiPageResultOk;
+        }
+
+    return result;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::HandleEditorDisapproved()
+// ----------------------------------------------------------------------------
+//
+TIpsSetUiPageResult CIpsSetUiBaseDialog::HandleEditorDisapproved()
+    {
+    FUNC_LOG;
+    // Get current setting page
+    CurrentSettingsPage()->SetText( iSettingText );
+
+    return EIpsSetUiPageResultEditing;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::SettingPageOpenEditorL()
+// ----------------------------------------------------------------------------
+//
+TIpsSetUiPageResult CIpsSetUiBaseDialog::SettingPageOpenEditorL()
+    {
+    FUNC_LOG;
+    CIpsSetUiItem* currentEditor = CurrentSettingsPage();
+
+    // Prepare setting page. The setting page shall be acquired
+    // from the owner class, if required, or the setting page is
+    // created with default values
+    TIpsSetUiUpdateMode updateMode;
+    TIpsSetUtilsFlags& editorFlags = currentEditor->iItemFlags;
+
+    // If enter pressed is set, the setting page won't be opened,
+    // which means creation of page is not needed either
+    if ( !( editorFlags.Flag32( KIpsSetUiFlagEnterPressed ) ) ||
+         editorFlags.Flag32( KIpsSetUiFlagOneTimeForceViewOpen ) )
+        {
+        if ( editorFlags.Flag32( KIpsSetUiFlagAcquireCustomPage ) )
+            {
+            SettingPrepareAcquireL( updateMode, *currentEditor );
+            IPS_ASSERT_DEBUG( iSettingPage , KErrUnknown, EBaseDialog );
+            }
+        else
+            {
+            SettingCreateEditorL( *currentEditor, updateMode );
+            }
+        }
+
+    // Finally launch the editor
+    return SettingLaunchPageLD( *currentEditor, updateMode );
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::SettingPageOpenFinishL()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUiBaseDialog::SettingPageOpenFinishL()
+    {
+    FUNC_LOG;
+    // Clean up
+    iBaseDialogFlags &= ~EIpsSetUiRunningCustomPage;
+    delete iButtonArray;
+    iButtonArray = NULL;
+    if ( iCheckboxArray )
+        {
+        iCheckboxArray->ResetAndDestroy();
+        }
+    delete iCheckboxArray;
+    iCheckboxArray = NULL;
+    iSettingPage = NULL;
+    iSettingValue = KErrNotFound;
+    iSettingText.Close();
+    delete iNewPassword;
+    iNewPassword = NULL;
+    delete iOldPassword;
+    iOldPassword = NULL;
+    }
+
+/******************************************************************************
+
+    Settingpage Open
+
+******************************************************************************/
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiDialogCtrl::SettingFindEditor()
+// ----------------------------------------------------------------------------
+//
+CIpsSetUiItem* CIpsSetUiBaseDialog::SettingFindEditor(
+    const CIpsSetUiItem& aBaseItem,
+    const TInt aIndex,
+    const TBool aExcludeHidden )
+    {
+    FUNC_LOG;
+    CIpsSetUiItem* volunteerBase = NULL;
+
+    // The settings structure is constructed in a way, that the radiobutton
+    // or the checkbox editor has the array of buttons. To retrieve the editor
+    // first the radiobutton has to be retrieved, then inside the radiobutton,
+    // the editor can be taken.
+    volunteerBase =
+        GetSubItem( aBaseItem, aIndex, aExcludeHidden );
+
+    if ( volunteerBase &&
+        volunteerBase->iItemFlags.Flag32( KIpsSetUiFlagFindEditor ) )
+        {
+        // Find the editor from the link array
+        volunteerBase = GetSubItem( *volunteerBase, 0, EFalse );
+
+        if ( !volunteerBase )
+            {
+            // Not found, yet. It may be seperate editor in the button arrays
+            volunteerBase = GetSubItemByType( aBaseItem, EIpsSetUiItemValue );
+            }
+
+        if ( !volunteerBase )
+            {
+            // Still not found... time editor perhaps??
+            volunteerBase =
+                GetSubItemByType( aBaseItem, EIpsSetUiItemMultiLine );
+            }
+        }
+    else
+        {
+        volunteerBase = NULL;
+        }
+
+    // return the item
+    return volunteerBase;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiDialogCtrl::SettingFindEditor()
+// ----------------------------------------------------------------------------
+//
+CIpsSetUiItem* CIpsSetUiBaseDialog::SettingFindEditor(
+    const CIpsSetUiItem& aBaseItem,
+    const TUid& aId,
+    const TBool aExcludeHidden )
+    {
+    FUNC_LOG;
+    // The settings structure is constructed in a way, that the radiobutton
+    // or the checkbox editor has the array of buttons. To retrieve the editor
+    // first the radiobutton has to be retrieved, then inside the radiobutton,
+    // the editor can be taken.
+    CIpsSetUiItem* volunteerBase =
+        GetSubItem( aBaseItem, aId, aExcludeHidden );
+
+    // Make sure the item is found and check that it is
+    if ( volunteerBase )
+        {
+        volunteerBase = GetSubItem( *volunteerBase, 0, EFalse );
+        }
+    else
+        {
+        volunteerBase = NULL;
+        }
+
+    // return the item
+    return volunteerBase;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::SettingPrepareAcquireRadioButtonPageL()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUiBaseDialog::SettingPrepareAcquireRadioButtonPageL(
+    CIpsSetUiItem& aBaseItem )
+    {
+    FUNC_LOG;
+    // Convert the base item to link item and define button array
+    CIpsSetUiItemLink* radio = static_cast<CIpsSetUiItemLink*>( &aBaseItem );
+
+    // Make sure the link exist
+    if ( !radio->iItemLinkArray )
+        {
+        radio->iItemLinkArray =
+            new ( ELeave ) CIpsSetUiBaseItemArray( KIpsSetUiArrayGranularity );
+        }
+
+    SettingCreateButtonArrayL( *radio->iItemLinkArray );
+
+    iSettingValue = radio->Value();
+    radio = NULL;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::SettingPrepareAcquireCheckboxPageL()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUiBaseDialog::SettingPrepareAcquireCheckboxPageL(
+    CIpsSetUiItem& aBaseItem )
+    {
+    FUNC_LOG;
+    // Convert the base item to link item and define button array
+    CIpsSetUiItemLink* link = static_cast<CIpsSetUiItemLink*>( &aBaseItem );
+
+    // Make sure the link array exist
+    if ( link->iItemLinkArray )
+        {
+        SettingCreateButtonArrayL( *link->iItemLinkArray );
+        }
+
+    link = NULL;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::SettingPrepareAcquireTextEditorPageL()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUiBaseDialog::SettingPrepareAcquireTextEditorPageL(
+    CIpsSetUiItem& aBaseItem )
+    {
+    FUNC_LOG;
+    // Create either password or plain texts
+    if ( aBaseItem.iItemFlags.Flag32( KIpsSetUiFlagPassword ) )
+        {
+        iNewPassword = new ( ELeave ) TIpsSetUiPasswordText( aBaseItem.Text() );
+        iOldPassword = new ( ELeave ) TIpsSetUiPasswordText( aBaseItem.Text() );
+        }
+    else
+        {
+        iSettingText.CreateL( aBaseItem.Text() );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::SettingPrepareAcquireValueEditorPageL()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUiBaseDialog::SettingPrepareAcquireValueEditorPageL(
+    CIpsSetUiItem& aBaseItem )
+    {
+    FUNC_LOG;
+    iSettingValue = aBaseItem.Value();
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::SettingPrepareAcquireL()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUiBaseDialog::SettingPrepareAcquireL(
+    TIpsSetUiUpdateMode& aUpdateMode,
+    CIpsSetUiItem& aBaseItem )
+    {
+    FUNC_LOG;
+    // Handle the item, based on the type
+    switch ( aBaseItem.Type() )
+        {
+        // Radio button page
+        case EIpsSetUiRadioButtonArray:
+            SettingPrepareAcquireRadioButtonPageL( aBaseItem );
+            break;
+
+        // Checkbox page
+        case EIpsSetUiCheckBoxArray:
+            SettingPrepareAcquireCheckboxPageL( aBaseItem );
+            break;
+
+        // Text editor
+        case EIpsSetUiItemText:
+            SettingPrepareAcquireTextEditorPageL( aBaseItem );
+            break;
+
+        // Number editor
+        case EIpsSetUiItemValue:
+            SettingPrepareAcquireValueEditorPageL( aBaseItem );
+            break;
+
+        // Type is not recognized
+        default:
+            IPS_ASSERT_DEBUG( EFalse, KErrUnknown, EBaseDialog );
+            User::Leave( KErrUnknown );
+        }
+
+    // Acquire the custom setting page
+    AcquireCustomSettingPageL(
+        iSettingPage, aUpdateMode, iSettingValue,
+        iSettingText, *iButtonArray, aBaseItem );
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::AcquireCustomSettingPageL()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUiBaseDialog::AcquireCustomSettingPageL(
+    CAknSettingPage*& /* aReturnPage */,
+    TIpsSetUiUpdateMode& /* aReturnUpdateMode */,
+    TInt& /* aReturnSettingValue */,
+    TDes& /* aReturnSettingText */,
+    CDesCArrayFlat& /* aParamRadioButtonArray */,
+    CIpsSetUiItem& /* aParamBaseItem */ )
+    {
+    FUNC_LOG;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::SettingCreateEditorL()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUiBaseDialog::SettingCreateEditorL(
+    CIpsSetUiItem& aBaseItem,
+    TIpsSetUiUpdateMode& aUpdateMode )
+    {
+    FUNC_LOG;
+    // Create different editors for password settings
+    if ( aBaseItem.iItemFlags.Flag32( KIpsSetUiFlagPassword ) )
+        {
+        switch ( aBaseItem.iItemType )
+            {
+            case EIpsSetUiItemText:
+                SettingCreatePasswordTextEditorPageL(
+                    aBaseItem, aUpdateMode );
+                break;
+
+            }
+        }
+    // Normal editors
+    else
+        {
+        switch ( aBaseItem.iItemType )
+            {
+            case EIpsSetUiRadioButtonArray:
+                SettingCreateRadioButtonPageL( aBaseItem, aUpdateMode );
+                break;
+
+            case EIpsSetUiCheckBoxArray:
+                SettingCreateCheckboxPageL( aBaseItem, aUpdateMode );
+                break;
+
+            case EIpsSetUiItemText:
+                SettingCreatePlainTextEditorPageL(
+                    aBaseItem, aUpdateMode );
+                break;
+
+            case EIpsSetUiItemValue:
+                SettingCreatePlainNumberEditorPageL(
+                    aBaseItem, aUpdateMode );
+                break;
+
+            case EIpsSetUiItemScValue:
+                SettingCreateScNumberEditorPageL(
+                    aBaseItem, aUpdateMode );
+                break;
+
+            default:
+                break;
+            }
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::DefineDefaultSettingPageL()
+// ----------------------------------------------------------------------------
+//
+TIpsSetUiUpdateMode CIpsSetUiBaseDialog::DefineDefaultSettingPageL(
+    const CIpsSetUiItem& aBase )
+    {
+    FUNC_LOG;
+    // Create the aSetting page
+    iSettingPage->SetSettingTextL( *aBase.iItemLabel );
+
+    // Determine the update mode
+    return static_cast<TIpsSetUiUpdateMode>( aBase.iItemFlags.ValueForFlag(
+        KIpsSetUiFlagUpdateOnChange,
+        CAknSettingPage::EUpdateWhenChanged,
+        CAknSettingPage::EUpdateWhenAccepted ) );
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::SettingCreateButtonArrayL()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUiBaseDialog::SettingCreateButtonArrayL(
+    CIpsSetUiBaseItemArray& aButtonArray )
+    {
+    FUNC_LOG;
+    // Get the item count in array
+    const TInt count = aButtonArray.Count();
+    iButtonArray = new ( ELeave ) CDesCArrayFlat( KIpsSetUiArrayGranularity );
+
+    // Do number conversion to all items and add them to temporary array
+    for ( TInt item = 0; item < count; item++ )
+        {
+        CIpsSetUiItem* base = aButtonArray[item];
+
+        // Append only visible items on the list
+        if ( !IsHidden( *base ) )
+            {
+            HBufC* label = base->iItemLabel->AllocLC();
+            TPtr labelPtr = label->Des();
+
+            // Do number conversion when needed
+            if ( base->iItemFlags.Flag32( KIpsSetUiFlagLangSpecificNumConv ) )
+                {
+                AknTextUtils::DisplayTextLanguageSpecificNumberConversion(
+                    labelPtr );
+                }
+
+            // Insert to array and delete old item
+            iButtonArray->AppendL( *label );
+            CleanupStack::PopAndDestroy( label );
+            label = NULL;
+            }
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::SettingCreateCheckboxArrayL()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUiBaseDialog::SettingCreateCheckboxArrayL(
+    CIpsSetUiBaseItemArray& aButtonArray )
+    {
+    FUNC_LOG;
+    // Get the item count in array
+    const TInt count = aButtonArray.Count();
+    iCheckboxArray =
+        new ( ELeave ) CSelectionItemList( KIpsSetUiArrayGranularity );
+
+    // Do number conversion to all items and add them to temporary array
+    for ( TInt item = 0; item < count; item++ )
+        {
+        CIpsSetUiItem* base = aButtonArray[item];
+
+        // Append only visible items on the list
+        if ( !IsHidden( *base ) )
+            {
+            HBufC* label = base->iItemLabel->AllocLC();
+            TPtr labelPtr = label->Des();
+
+            // Do number conversion when needed
+            if ( base->iItemFlags.Flag32( KIpsSetUiFlagLangSpecificNumConv ) )
+                {
+                AknTextUtils::DisplayTextLanguageSpecificNumberConversion(
+                    labelPtr );
+                }
+
+            // Create item and check it
+            CSelectableItem* checkbox =
+                new ( ELeave ) CSelectableItem(
+                   *label, base->iItemFlags.Flag32( KIpsSetUiFlagChecked ) );
+            CleanupStack::PushL( checkbox );
+            checkbox->ConstructL();
+
+            // Insert to array and delete old item
+            iCheckboxArray->AppendL( checkbox );
+            CleanupStack::Pop( checkbox );
+            CleanupStack::PopAndDestroy( label );
+            label = NULL;
+            }
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::SettingCreateRadioButtonPageL()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUiBaseDialog::SettingCreateRadioButtonPageL(
+    CIpsSetUiItem& aBaseItem,
+    TIpsSetUiUpdateMode& aUpdateMode )
+    {
+    FUNC_LOG;
+    // Convert the base item to radiobutton item
+    CIpsSetUiItemLinkExt* radioArray =
+        static_cast<CIpsSetUiItemLinkExt*>( &aBaseItem );
+
+    // Create button array for the page and set the selection for page
+    SettingCreateButtonArrayL( *radioArray->iItemLinkArray );
+    iSettingValue = radioArray->Value();
+
+    // Create the setting page to member
+    iSettingPage = ( new ( ELeave ) CAknRadioButtonSettingPage(
+        ( *iSettingPageResources )[EIpsSetUiRadioButton],
+        iSettingValue, iButtonArray ) );
+
+    // Apply defaults
+    aUpdateMode = DefineDefaultSettingPageL( aBaseItem );
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::SettingCreateCheckboxPageL()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUiBaseDialog::SettingCreateCheckboxPageL(
+    CIpsSetUiItem& aBaseItem,
+    TIpsSetUiUpdateMode& aUpdateMode )
+    {
+    FUNC_LOG;
+    // Convert the base item to radiobutton item
+    CIpsSetUiItemLink* radioArray =
+        static_cast<CIpsSetUiItemLink*>( &aBaseItem );
+
+    // Create button array for the page
+    SettingCreateCheckboxArrayL( *radioArray->iItemLinkArray );
+
+    // Create the setting page to member
+    iSettingPage = ( new ( ELeave ) CAknCheckBoxSettingPage(
+        ( *iSettingPageResources )[EIpsSetUiCheckbox], iCheckboxArray ) );
+
+    // Apply defaults
+    aUpdateMode = DefineDefaultSettingPageL( aBaseItem );
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::SettingCreatePlainTextEditorPageL()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUiBaseDialog::SettingCreatePlainTextEditorPageL(
+    CIpsSetUiItem& aBaseItem,
+    TIpsSetUiUpdateMode& aUpdateMode )
+    {
+    FUNC_LOG;
+    // Get the text to be edited
+    CIpsSetUiItemsEditText* textEditor =
+        static_cast<CIpsSetUiItemsEditText*>( &aBaseItem );
+    iSettingText.CreateL( textEditor->iItemMaxLength );
+    iSettingText.Copy( textEditor->Text() );
+
+    // Define flags according to item
+    TInt flags = GetTextEditorFlags( aBaseItem );
+
+    // Create the setting page using the flags
+    TInt pageResource = ( *iSettingPageResources )[EIpsSetUiText];
+    CAknTextSettingPage* settingPage =
+        new ( ELeave ) CAknTextSettingPage(
+            pageResource, iSettingText, flags );
+    CleanupStack::PushL( settingPage );
+    settingPage->ConstructL();
+    CEikEdwin& txtCtrl = *settingPage->TextControl();
+    txtCtrl.SetTextLimit( textEditor->iItemMaxLength );
+
+    if ( textEditor->iItemFlags.Flag32( KIpsSetUiFlagLatinOnly ) )
+        {
+        txtCtrl.SetAknEditorFlags(
+            EAknEditorFlagLatinInputModesOnly | EAknEditorFlagNoT9 );
+        }
+
+    iSettingPage = settingPage;
+    CleanupStack::Pop( settingPage );
+
+    // Apply defaults
+    aUpdateMode = DefineDefaultSettingPageL( aBaseItem );
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::SettingCreatePasswordTextEditorPageL()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUiBaseDialog::SettingCreatePasswordTextEditorPageL(
+    CIpsSetUiItem& aBaseItem,
+    TIpsSetUiUpdateMode& aUpdateMode )
+    {
+    FUNC_LOG;
+    // Prepare password and save the old
+    CIpsSetUiItemsEditText* textEditor =
+        static_cast<CIpsSetUiItemsEditText*>( &aBaseItem );
+
+    iNewPassword = new ( ELeave ) TIpsSetUiPasswordText(
+        textEditor->Text().Left( KIpsSetUiMaxPasswordLength ) );
+    iOldPassword = new ( ELeave ) TIpsSetUiPasswordText(
+        textEditor->Text().Left( KIpsSetUiMaxPasswordLength ) );
+
+    // Create the settings page
+    iSettingPage = ( new ( ELeave ) CAknAlphaPasswordSettingPage(
+        ( *iSettingPageResources )[EIpsSetUiSecret],
+        *iNewPassword, *iOldPassword ) );
+    iSettingPage->ConstructL();
+    CAknAlphaPasswordSettingPage* pwPage =
+        static_cast<CAknAlphaPasswordSettingPage*>( iSettingPage );
+    pwPage->SetMaxPasswordLength( textEditor->iItemMaxLength );
+    if ( pwPage->AlphaPasswordEditor() )
+        {
+        pwPage->AlphaPasswordEditor()->SetMaxLength(
+            textEditor->iItemMaxLength );
+        }
+
+    // Apply defaults
+    aUpdateMode = DefineDefaultSettingPageL( aBaseItem );
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::SettingCreatePlainNumberEditorPageL()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUiBaseDialog::SettingCreatePlainNumberEditorPageL(
+    CIpsSetUiItem& aBaseItem,
+    TIpsSetUiUpdateMode& aUpdateMode )
+    {
+    FUNC_LOG;
+    // Conver item and set the value
+    CIpsSetUiItemValue* numberEditor =
+        static_cast<CIpsSetUiItemValue*>( &aBaseItem );
+    iSettingValue = numberEditor->Value();
+
+    // Define flags according to item
+    TInt flags = GetValueEditorFlags( aBaseItem );
+
+    // Create aSetting page
+    iSettingPage = ( new ( ELeave ) CAknIntegerSettingPage(
+        ( *iSettingPageResources )[EIpsSetUiNumber],
+           *&iSettingValue, flags ) );
+    iSettingPage->ConstructL();
+    iSettingPage->SetSettingTextL( *numberEditor->iItemLabel );
+
+    // Apply defaults, for number editors, the update mode has to be onchange
+    aBaseItem.iItemFlags.SetFlag32( KIpsSetUiFlagUpdateOnChange );
+    aUpdateMode = DefineDefaultSettingPageL( aBaseItem );
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::SettingCreateScNumberEditorPageL()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUiBaseDialog::SettingCreateScNumberEditorPageL(
+    CIpsSetUiItem& aBaseItem,
+    TIpsSetUiUpdateMode& aUpdateMode )
+    {
+    FUNC_LOG;
+    // Conver item and set the value
+    CIpsSetUiItemsEditText* textEditor =
+        static_cast<CIpsSetUiItemsEditText*>( &aBaseItem );
+    iSettingText.CreateL( textEditor->iItemMaxLength );
+    iSettingText.Copy( textEditor->Text() );
+
+    if ( aBaseItem.iItemFlags.Flag32( KIpsSetUiFlagLangSpecificNumConv ) )
+        {
+        AknTextUtils::DisplayTextLanguageSpecificNumberConversion(
+            iSettingText );
+        }
+
+    // Define flags according to item
+    TInt flags = CAknIntegerSettingPage::EInvalidValueNotOffered;
+    flags |= !aBaseItem.iItemFlags.Flag32( KIpsSetUiFlagForceMustFill ) &
+        CAknIntegerSettingPage::EEmptyValueAllowed;
+    flags |= aBaseItem.iItemFlags.Flag32( KIpsSetUiFlagNoInitialSelection ) &
+        CAknIntegerSettingPage::ENoInitialSelection;
+    flags |= aBaseItem.iItemFlags.Flag32( KIpsSetUiFlagEditorCursorAtBeginning ) &
+        CAknIntegerSettingPage::EPutCursorAtBeginning;
+
+    // Create aSetting page
+    iSettingPage = ( new ( ELeave ) CAknTextSettingPage(
+        ( *iSettingPageResources )[EIpsSetUiScNumber],
+        iSettingText, flags ) );
+    iSettingPage->ConstructL();
+    static_cast<CAknTextSettingPage*>( iSettingPage
+        )->TextControl()->SetTextLimit( textEditor->iItemMaxLength );
+    iSettingPage->SetSettingTextL( *textEditor->iItemLabel );
+
+    // Apply defaults
+    aUpdateMode = DefineDefaultSettingPageL( aBaseItem );
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::SettingLaunchPageLD()
+// ----------------------------------------------------------------------------
+//
+TIpsSetUiPageResult CIpsSetUiBaseDialog::SettingLaunchPageLD(
+    CIpsSetUiItem& aBaseItem,
+    TIpsSetUiUpdateMode& aUpdateMode )
+    {
+    FUNC_LOG;
+    switch ( aBaseItem.Type() )
+        {
+        case EIpsSetUiRadioButtonArray:
+            return SettingLaunchRadioButtonPageLD(
+                aBaseItem, aUpdateMode );
+
+        case EIpsSetUiCheckBoxArray:
+            return SettingLaunchCheckboxPageLD( aBaseItem, aUpdateMode );
+
+        case EIpsSetUiItemText:
+        case EIpsSetUiItemScValue:
+            return SettingLaunchTextEditorPageLD( aBaseItem, aUpdateMode );
+
+        case EIpsSetUiItemValue:
+            return SettingLaunchNumberEditorPageLD( aBaseItem, aUpdateMode );
+
+        // Multiline dialogs are launched from client only
+        case EIpsSetUiItemMultiLine:
+            return SettingLaunchMultilinePageL( aBaseItem, aUpdateMode );
+
+        default:
+            IPS_ASSERT_DEBUG( EFalse, KErrUnknown, EBaseDialog );
+            return EIpsSetUiPageResultCancelled;
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::SettingLaunchRadioButtonPageLD()
+// ----------------------------------------------------------------------------
+//
+TIpsSetUiPageResult CIpsSetUiBaseDialog::SettingLaunchRadioButtonPageLD(
+    CIpsSetUiItem& aBaseItem,
+    TIpsSetUiUpdateMode& aUpdateMode )
+    {
+    FUNC_LOG;
+    // Convert the base item to radio item
+    CIpsSetUiItemLink* linkArray = static_cast<CIpsSetUiItemLink*>( &aBaseItem );
+    TIpsSetUiPageResult result = EIpsSetUiPageResultOk;
+
+    if ( linkArray->iItemFlags.Flag32( KIpsSetUiFlagEnterPressed ) &&
+         !linkArray->iItemFlags.Flag32( KIpsSetUiFlagOneTimeForceViewOpen ) )
+        {
+        TInt value = !linkArray->Value();
+        TIpsSetUiEventResult evaluation =
+            EventItemEvaluateRadioButton( *linkArray, value );
+
+        // Handle approved item
+        if ( evaluation == EIpsSetUiPageEventResultApproved )
+            {
+            // Change the value and the text
+            linkArray->SetValue( value );
+            linkArray->iItemSettingText->Copy(
+               *( *linkArray->iItemLinkArray
+                    )[value]->iItemLabel );
+            }
+
+        result = EIpsSetUiPageResultOk;
+        }
+    else
+        {
+        // Opening the editor, clear flag immediately
+        linkArray->iItemFlags.ClearFlag32( KIpsSetUiFlagOneTimeForceViewOpen );
+
+        // Launch the settings dialog and update the item, if item is valid
+        if ( iSettingPage->ExecuteLD( aUpdateMode ) > 0 )
+            {
+            iSettingPage = NULL;
+            TIpsSetUiEventResult evaluation =
+                EventItemEvaluateRadioButton( *linkArray, iSettingValue );
+
+            // Handle approved item
+            if ( evaluation == EIpsSetUiPageEventResultApproved )
+                {
+                // First store the index value from the visible radiobutton array
+                linkArray->SetValue( iSettingValue );
+                CIpsSetUiItem* subItem =
+                    GetSubItem( *linkArray, iSettingValue );
+
+                // Mark the item as checked and copy the text
+                if ( subItem )
+                    {
+                    CheckRadioButton( *linkArray, subItem->iItemId );
+                    linkArray->iItemSettingText->Copy( *subItem->iItemLabel );
+                    }
+
+                if( linkArray->iItemId.iUid == EIpsSetUiWhenHours && 
+                    iSettingValue == CIpsSetData::EAllDay )
+                    {
+                    // set related 'from' and 'to' settings to 0
+                    CIpsSetUiItem* item = GetItem(
+                        TUid::Uid( EIpsSetUiWhenHoursEditCustomizeFrom ) );
+                    item->SetValue( KIpsSetDataTimeDialogDefault );
+                    item = GetItem(
+                        TUid::Uid( EIpsSetUiWhenHoursEditCustomizeTo ) );
+                    item->SetValue( KIpsSetDataTimeDialogDefault );
+                    }
+
+                result = EIpsSetUiPageResultOk;
+                }
+            // Handle disapproved item
+            else if ( evaluation == EIpsSetUiPageEventResultDisapproved )
+                {
+                result = EIpsSetUiPageResultEditing;
+                }
+            // Handle cancelled item
+            else
+                {
+                result = EIpsSetUiPageResultCancelled;
+                }
+            }
+        else
+            {
+            // Editor cancelled
+            iSettingPage = NULL;
+            result = EIpsSetUiPageResultCancelled;
+            }
+        }
+
+    linkArray = NULL;
+
+    // Return the result
+    return result;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::SettingLaunchCheckboxPageLD()
+// ----------------------------------------------------------------------------
+//
+TIpsSetUiPageResult CIpsSetUiBaseDialog::SettingLaunchCheckboxPageLD(
+    CIpsSetUiItem& aBaseItem,
+    TIpsSetUiUpdateMode& aUpdateMode )
+    {
+    FUNC_LOG;
+    // Convert the base item to link item
+    CIpsSetUiItemLinkExt* checkboxArray =
+        static_cast<CIpsSetUiItemLinkExt*>( &aBaseItem );
+    TIpsSetUiPageResult result = EIpsSetUiPageResultOk;
+
+    // Launch the settings dialog and update the item, if item is valid
+    if ( iSettingPage->ExecuteLD( aUpdateMode ) )
+        {
+        iSettingPage = NULL;
+        TIpsSetUiEventResult evaluation =
+            EventItemEvaluateValue( aBaseItem, iSettingValue );
+
+        if ( evaluation == EIpsSetUiPageEventResultApproved )
+            {
+            // Clean the value
+            TInt checkbox = 0;
+
+            // Check all items in the array, and set the flags to item
+            for ( TInt item = iCheckboxArray->Count()-1; item >= 0; item-- )
+                {
+                TBool checked = iCheckboxArray->At( item )->SelectionStatus();
+                if ( checked )
+                    {
+                    checkboxArray->iItemLinkArray->At(
+                        item )->iItemFlags.SetFlag32( KIpsSetUiFlagChecked );
+                    }
+                else
+                    {
+                    checkboxArray->iItemLinkArray->At(
+                        item )->iItemFlags.ClearFlag32( KIpsSetUiFlagChecked );
+                    }
+                checkbox |= ( checked << item );
+                }
+
+            checkboxArray->SetValue( checkbox );
+
+            result = EIpsSetUiPageResultOk;
+            }
+        // Handle disapproved item
+        else if ( evaluation == EIpsSetUiPageEventResultDisapproved )
+            {
+            result = EIpsSetUiPageResultEditing;
+            }
+        // Handle cancelled item
+        else
+            {
+            result = EIpsSetUiPageResultCancelled;
+            }
+        }
+    else
+        {
+        // Editor cancelled
+        iSettingPage = NULL;
+        result = EIpsSetUiPageResultCancelled;
+        }
+
+    return result;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::SettingLaunchTextEditorPageLD()
+// ----------------------------------------------------------------------------
+//
+TIpsSetUiPageResult CIpsSetUiBaseDialog::SettingLaunchTextEditorPageLD(
+    CIpsSetUiItem& aBaseItem,
+    TIpsSetUiUpdateMode& aUpdateMode )
+    {
+    FUNC_LOG;
+    TIpsSetUiPageResult result = EIpsSetUiPageResultOk;
+
+    if ( iSettingPage->ExecuteLD( aUpdateMode ) > 0 )
+        {
+        iSettingPage = NULL;
+        RBuf tempText;
+
+        // Depending on the text editor, choose the correct text
+        if ( aBaseItem.iItemFlags.Flag32( KIpsSetUiFlagPassword ) )
+            {
+            tempText.CreateL( *iNewPassword );
+            }
+        else
+            {
+            tempText.CreateL( iSettingText );
+            }
+
+        TIpsSetUiEventResult evaluation =
+            EventItemEvaluateText( aBaseItem, tempText );
+
+        if ( evaluation == EIpsSetUiPageEventResultApproved )
+            {
+            // Text is ok, store the text and close editor
+            aBaseItem.SetText( tempText );
+            }
+        // Handle disapproved item
+        else if ( evaluation == EIpsSetUiPageEventResultDisapproved )
+            {
+            result = EIpsSetUiPageResultEditing;
+            }
+        // Handle cancelled item
+        else
+            {
+            result = EIpsSetUiPageResultCancelled;
+            }
+
+        tempText.Close();
+        }
+    else
+        {
+        iSettingPage = NULL;
+        result = EIpsSetUiPageResultCancelled;
+        }
+
+    return result;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::SettingLaunchNumberEditorPageLD()
+// ----------------------------------------------------------------------------
+//
+TIpsSetUiPageResult CIpsSetUiBaseDialog::SettingLaunchNumberEditorPageLD(
+    CIpsSetUiItem& aBaseItem,
+    TIpsSetUiUpdateMode& aUpdateMode )
+    {
+    FUNC_LOG;
+    TIpsSetUiPageResult result = EIpsSetUiPageResultOk;
+
+    // Convert baseitem to number editor
+    CIpsSetUiItemValue* numberEdit =
+        static_cast<CIpsSetUiItemValue*>( &aBaseItem );
+
+    // Launch the editor and fill the settings if approved
+    if ( iSettingPage->ExecuteLD( aUpdateMode ) )
+        {
+        iSettingPage = NULL;
+        TIpsSetUiEventResult evaluation =
+            EventItemEvaluateValue( aBaseItem, iSettingValue );
+
+        // Evaluate item
+        if ( evaluation == EIpsSetUiPageEventResultApproved )
+            {
+            // Item ok
+            numberEdit->SetValue( iSettingValue );
+            numberEdit->iItemSettingText->Num( iSettingValue );
+            result = EIpsSetUiPageResultOk;
+            }
+        // Handle disapproved item
+        else if ( evaluation == EIpsSetUiPageEventResultDisapproved )
+            {
+            result = EIpsSetUiPageResultEditing;
+            }
+        // Handle cancelled item
+        else
+            {
+            result = EIpsSetUiPageResultCancelled;
+            }
+        }
+    else
+        {
+        // Editor cancelled
+        iSettingPage = NULL;
+        result = EIpsSetUiPageResultCancelled;
+        }
+
+    return result;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::SettingLaunchScNumberEditorPageLD()
+// ----------------------------------------------------------------------------
+//
+TIpsSetUiPageResult CIpsSetUiBaseDialog::SettingLaunchScNumberEditorPageLD(
+    CIpsSetUiItem& aBaseItem,
+    TIpsSetUiUpdateMode& aUpdateMode )
+    {
+    FUNC_LOG;
+    // Convert baseitem to number editor
+    CIpsSetUiItemsEditText* textEditor =
+        static_cast<CIpsSetUiItemsEditText*>( &aBaseItem );
+    TIpsSetUiPageResult result = EIpsSetUiPageResultOk;
+
+    // Launch the editor and fill the settings if approved
+    if ( iSettingPage->ExecuteLD( aUpdateMode ) )
+        {
+        iSettingPage = NULL;
+        TIpsSetUiEventResult evaluation =
+            EventItemEvaluateText( aBaseItem, iSettingText );
+
+        if ( evaluation == EIpsSetUiPageEventResultApproved )
+            {
+            // Item ok
+            AknTextUtils::ConvertDigitsTo( iSettingText, EDigitTypeWestern );
+            textEditor->SetText( iSettingText );
+            result = EIpsSetUiPageResultOk;
+            }
+        // Handle disapproved item
+        else if ( evaluation == EIpsSetUiPageEventResultDisapproved )
+            {
+            result = EIpsSetUiPageResultEditing;
+            }
+        // Handle cancelled item
+        else
+            {
+            result = EIpsSetUiPageResultCancelled;
+            }
+        }
+    else
+        {
+        // Editor cancelled
+        iSettingPage = NULL;
+        result = EIpsSetUiPageResultCancelled;
+        }
+
+    return result;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::SettingLaunchMultilinePageL()
+// ----------------------------------------------------------------------------
+//
+TIpsSetUiPageResult CIpsSetUiBaseDialog::SettingLaunchMultilinePageL(
+    CIpsSetUiItem& aBaseItem,
+    TIpsSetUiUpdateMode& aUpdateMode )
+    {
+    FUNC_LOG;
+    TIpsSetUiEventResult result =
+        SettingLaunchMultilineEditorL( aBaseItem, aUpdateMode );
+
+    switch ( result )
+        {
+        case EIpsSetUiPageEventResultApproved:
+            return EIpsSetUiPageResultOk;
+
+        case EIpsSetUiPageEventResultDisapproved:
+            return EIpsSetUiPageResultEditing;
+
+        default:
+        case EIpsSetUiPageEventResultCancel:
+            break;
+        }
+
+    return EIpsSetUiPageResultCancelled;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::SettingLaunchMultilineEditorL()
+// ----------------------------------------------------------------------------
+//
+TIpsSetUiEventResult CIpsSetUiBaseDialog::SettingLaunchMultilineEditorL(
+    CIpsSetUiItem& /* aBaseItem */,
+    TIpsSetUiUpdateMode& /* aUpdateMode */ )
+    {
+    FUNC_LOG;
+    // This should be called from the client side
+    IPS_ASSERT_DEBUG( EFalse, KErrUnknown, EBaseDialog );
+
+    return EIpsSetUiPageEventResultCancel;
+    }
+
+/******************************************************************************
+
+    Event handling
+
+******************************************************************************/
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::EventArrayChangedL()
+// ----------------------------------------------------------------------------
+//
+TInt CIpsSetUiBaseDialog::EventArrayChangedL(
+    const TIpsSetUiArrayEvent aEvent )
+    {
+    FUNC_LOG;
+    switch ( aEvent )
+        {
+        case EIpsSetUiArrayAdded:
+            iListBox.HandleItemAdditionL();
+            break;
+
+        case EIpsSetUiArrayRemoved:
+            iListBox.HandleItemRemovalL();
+            break;
+
+        // When array has changed, send event before updating listbox
+        case EIpsSetUiArrayStackForward:
+        case EIpsSetUiArrayStackBackward:
+            EventPrepareSubArrayL(
+               *GetItem( 0 ),
+                aEvent == EIpsSetUiArrayStackForward ? ETrue : EFalse );
+
+        //lint -fallthrough
+        case EIpsSetUiArrayChanged:
+            iListBox.HandleItemRemovalL();
+            iListBox.HandleItemAdditionL();
+            break;
+        }
+
+    return KErrNone;
+    }
+
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::EventSubArrayChangeL()
+// ----------------------------------------------------------------------------
+//
+TInt CIpsSetUiBaseDialog::EventSubArrayChangeL(
+    CIpsSetUiItem& /* aBaseItem */ )
+    {
+    FUNC_LOG;
+    return KErrNone;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::EventItemEditStartsL()
+// ----------------------------------------------------------------------------
+//
+TIpsSetUiEventResult CIpsSetUiBaseDialog::EventItemEditStartsL(
+    CIpsSetUiItem& /* aBaseItem */ )
+    {
+    FUNC_LOG;
+    return EIpsSetUiPageEventResultApproved;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::EventItemEditEndsL()
+// ----------------------------------------------------------------------------
+//
+TInt CIpsSetUiBaseDialog::EventItemEditEndsL(
+    CIpsSetUiItem& /* aBaseItem */ )
+    {
+    FUNC_LOG;
+    return KErrNone;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::EventItemEvaluateRadioButton()
+// ----------------------------------------------------------------------------
+//
+TIpsSetUiEventResult CIpsSetUiBaseDialog::EventItemEvaluateRadioButton(
+    const CIpsSetUiItem& aBaseItem,
+    TInt& aNewValue )
+    {
+    FUNC_LOG;
+    // This check fails always
+    return iItemApprover->EvaluateValue( aBaseItem, aNewValue );;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::EventItemEvaluateValue()
+// ----------------------------------------------------------------------------
+//
+TIpsSetUiEventResult CIpsSetUiBaseDialog::EventItemEvaluateValue(
+    const CIpsSetUiItem& aBaseItem,
+    TInt& aNewValue )
+    {
+    FUNC_LOG;
+    return iItemApprover->EvaluateValue( aBaseItem, aNewValue );
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::EventItemEvaluateText()
+// ----------------------------------------------------------------------------
+//
+TIpsSetUiEventResult CIpsSetUiBaseDialog::EventItemEvaluateText(
+    const CIpsSetUiItem& aBaseItem,
+    TDes& aNewText )
+    {
+    FUNC_LOG;
+    // This check fails always
+    return iItemApprover->EvaluateText( aBaseItem, aNewText );
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::EventCustomMdcaPoint()
+// ----------------------------------------------------------------------------
+//
+TBool CIpsSetUiBaseDialog::EventCustomMdcaPoint(
+    const TUid& /* aId */,
+    TPtr& /* aString */ ) const
+    {
+    FUNC_LOG;
+    return EFalse;
+    }
+
+/******************************************************************************
+
+    Utilities
+
+******************************************************************************/
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::SettingsStartedL()
+// ----------------------------------------------------------------------------
+//
+TInt CIpsSetUiBaseDialog::SettingsStartedL()
+    {
+    FUNC_LOG;
+    return KErrNone;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::SettingPageResource()
+// ----------------------------------------------------------------------------
+//
+TInt CIpsSetUiBaseDialog::SettingPageResource(
+    const TIpsSetUiPageResource aSettingPage ) const
+    {
+    FUNC_LOG;
+    return ( *iSettingPageResources )[aSettingPage];
+    }
+
+
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::SetSettingPageResource()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUiBaseDialog::SetSettingPageResource(
+    const TIpsSetUiPageResource aSettingPage,
+    const TInt aResourceId )
+    {
+    FUNC_LOG;
+    TRAP_IGNORE( iSettingPageResources->PushResourceL( aSettingPage, aResourceId ) );
+    }
+
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::ShowCustomQueryL()
+// ----------------------------------------------------------------------------
+//
+TInt CIpsSetUiBaseDialog::ShowCustomQueryL(
+    const TInt aResourceStringId )
+    {
+    FUNC_LOG;
+    iQueryDialog = CAknQueryDialog::NewL();
+    TInt result = iQueryDialog->ExecuteLD( aResourceStringId );
+    iQueryDialog = NULL;
+    return result;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::CurrentItemIndex()
+// ----------------------------------------------------------------------------
+//
+TInt CIpsSetUiBaseDialog::CurrentItemIndex() const
+    {
+    FUNC_LOG;
+    return iListBox.CurrentItemIndex();
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::CurrentItem()
+// ----------------------------------------------------------------------------
+//
+CIpsSetUiItem* CIpsSetUiBaseDialog::CurrentItem() const
+    {
+    FUNC_LOG;
+    return GetItem( iListBox.CurrentItemIndex() );
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::GetValueEditorFlags()
+// ----------------------------------------------------------------------------
+//
+TInt CIpsSetUiBaseDialog::GetValueEditorFlags(
+    const CIpsSetUiItem& aBaseItem )
+    {
+    FUNC_LOG;
+    const TIpsSetUtilsFlags& itemFlags = aBaseItem.iItemFlags;
+
+    // Get the flags for editor
+    TInt flags =
+        CAknIntegerSettingPage::EInvalidValueNotOffered;
+    flags |= itemFlags.ValueForFlag(
+        KIpsSetUiFlagForceMustFill,
+        0,
+        CAknIntegerSettingPage::EEmptyValueAllowed );
+
+    flags |= itemFlags.ValueForFlag(
+        KIpsSetUiFlagForceMustFill,
+        CAknIntegerSettingPage::ENoInitialSelection,
+        0 );
+
+    flags |= itemFlags.ValueForFlag(
+        KIpsSetUiFlagForceMustFill,
+        CAknIntegerSettingPage::EPutCursorAtBeginning,
+        0 );
+
+    return flags;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::GetTextEditorFlags()
+// ----------------------------------------------------------------------------
+//
+TInt CIpsSetUiBaseDialog::GetTextEditorFlags(
+    const CIpsSetUiItem& aBaseItem )
+    {
+    FUNC_LOG;
+    const TIpsSetUtilsFlags& itemFlags = aBaseItem.iItemFlags;
+
+    TInt flags =
+        CAknTextSettingPage::EZeroLengthNotOffered;
+    flags |= itemFlags.ValueForFlag(
+        KIpsSetUiFlagForceMustFill,
+        0,
+        CAknTextSettingPage::EZeroLengthAllowed );
+
+    flags |= itemFlags.ValueForFlag(
+        KIpsSetUiFlagForceMustFill,
+        CAknTextSettingPage::ENoInitialSelection,
+        0 );
+
+    flags |= itemFlags.ValueForFlag(
+        KIpsSetUiFlagForceMustFill,
+        CAknTextSettingPage::EPutCursorAtBeginning,
+        0 );
+
+    return flags;
+    }
+
+/******************************************************************************
+
+    Item initialization
+
+******************************************************************************/
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::InitAnyItem()
+// ----------------------------------------------------------------------------
+//
+TInt CIpsSetUiBaseDialog::InitAnyItem(
+    CIpsSetUiItem& aBaseItem,
+    const TInt aValue,
+    const TDesC& aText )
+    {
+    FUNC_LOG;
+    TInt error = KErrNone;
+
+    // Initialize any item
+    switch ( aBaseItem.Type() )
+        {
+        case EIpsSetUiMenuArray:
+            error = InitArrayLink( aBaseItem, aText );
+            break;
+
+        case EIpsSetUiRadioButtonArray:
+            error = InitArrayRadioButton( aBaseItem, aValue, aText );
+            break;
+
+        case EIpsSetUiCheckBoxArray:
+            error = InitArrayCheckBox( aBaseItem, aValue, aText );
+            break;
+
+        case EIpsSetUiItemText:
+            error = InitItemTextEdit( aBaseItem, aText );
+            break;
+
+        case EIpsSetUiItemValue:
+            error = InitItemNumberEdit( aBaseItem, aValue, aText );
+            break;
+
+        // Radiobutton and checkbox initialization is done during
+        // the array initialization
+        default:
+            error = KErrNotFound;
+            break;
+        }
+
+    // Set the initialized flag on for the item
+    if ( !error )
+        {
+        aBaseItem.iItemFlags.SetFlag32( KIpsSetUiFlagIsInitialized );
+        }
+    else
+        {
+        aBaseItem.iItemFlags.ClearFlag32( KIpsSetUiFlagIsInitialized );
+        }
+
+    return error;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::InitArrayLink()
+// ----------------------------------------------------------------------------
+//
+TInt CIpsSetUiBaseDialog::InitArrayLink(
+    CIpsSetUiItem& aBaseItem,
+    const TDesC& aText )
+    {
+    FUNC_LOG;
+    // Convert item
+    CIpsSetUiItemLink* link = static_cast<CIpsSetUiItemLink*>( &aBaseItem );
+
+    // Get the item count in array
+    TInt items = KErrNotFound;
+    if ( link->iItemLinkArray )
+        {
+        items = link->iItemLinkArray->Count();
+        }
+
+    // Clear checked flag from all items
+    while ( --items >= 0 )
+        {
+        link->iItemFlags.ClearFlag32( KIpsSetUiFlagChecked );
+
+        // Uncheck the buttons in the array
+        CIpsSetUiItem* base = GetSubItem( aBaseItem, items );
+        if ( base )
+            {
+            base->iItemFlags.ClearFlag32( KIpsSetUiFlagChecked );
+            base = NULL;
+            }
+        }
+
+    // Set the text if provided
+    if ( link->iItemSettingText )
+        {
+        link->iItemSettingText->Copy( aText );
+        }
+
+    return KErrNone;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::InitArrayRadioButton()
+// ----------------------------------------------------------------------------
+//
+TInt CIpsSetUiBaseDialog::InitArrayRadioButton(
+    CIpsSetUiItem& aBaseItem,
+    const TInt aValue,
+    const TDesC& aText )
+    {
+    FUNC_LOG;
+    // Convert item
+    CIpsSetUiItemLinkExt* radioArray =
+        static_cast<CIpsSetUiItemLinkExt*>( &aBaseItem );
+    CIpsSetUiItem* base = NULL;
+
+    // Do normal link array initialization
+    InitArrayLink( aBaseItem, KNullDesC );
+
+    TInt result = KErrNotFound;
+
+    // If the item has no value, check if any of the radiobuttons is
+    // checked, and get the index from there
+    if ( aValue == KErrNotFound && radioArray->iItemLinkArray )
+        {
+        TUid id = TUid::Uid( 0 );
+        TInt index;
+        FindCheckedRadiobutton( *radioArray, id, index );
+        base = GetSubItem( *radioArray, id );
+
+        radioArray->SetValue( index );
+        }
+    // For listbox item, simply check one of the buttons
+    else if ( aValue >= 0 && radioArray->iItemLinkArray &&
+         aValue < radioArray->iItemLinkArray->Count() )
+        {
+        // In initialization phase, the received index value is from
+        // the main resource. Get the visible array's item index
+        // and setting the item checked and getting the checked item
+        TInt value = GetSubItemIndex( *radioArray, aValue, EFalse );
+        CheckRadioButton( *radioArray, value );
+        base = GetSubItem( *radioArray, value );
+
+        // Set number of radiobox item to indicate the checked item
+        radioArray->SetValue( value );
+        result = KErrNone;
+        }
+    else
+        {
+        result = KErrNotFound;
+        }
+
+    // Make sure the setting text exist and copy text if provided
+    if ( result == KErrNone && radioArray->iItemSettingText &&
+        ( base && base->iItemLabel ) )
+        {
+        radioArray->iItemSettingText->Copy(
+            aText.Length() ? aText : *base->iItemLabel );
+        }
+
+    base = NULL;
+    radioArray = NULL;
+
+    return result;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::InitArrayCheckBox()
+// ----------------------------------------------------------------------------
+//
+TInt CIpsSetUiBaseDialog::InitArrayCheckBox(
+    CIpsSetUiItem& aBaseItem,
+    const TInt aValue,
+    const TDesC& aText )
+    {
+    FUNC_LOG;
+    // Convert item
+    CIpsSetUiItemLinkExt* link =
+        static_cast<CIpsSetUiItemLinkExt*>( &aBaseItem );
+    CIpsSetUiItem* base;
+
+    // Do normal link array initialization
+    InitArrayLink( aBaseItem, KNullDesC );
+    link->SetValue( aValue );
+
+    // aValue can contain value KErrNotFound, which means 32 flags set.
+    // This function trusts the user provides correct value in the field
+    if ( link->iItemLinkArray )
+        {
+        // Get the item count in array
+        TInt buttons = link->iItemLinkArray->Count();
+
+        // Check the checkbox buttons
+        while ( --buttons >= 0 )
+            {
+            base = link->iItemLinkArray->At( buttons );
+            if ( ( aValue >> buttons ) & 0x01 )
+                {
+                base->iItemFlags.SetFlag32( KIpsSetUiFlagChecked );
+                }
+            else
+                {
+                base->iItemFlags.ClearFlag32( KIpsSetUiFlagChecked );
+                }
+            }
+        }
+
+    // Make sure the setting text exist and copy text if provided
+    if ( link->iItemSettingText )
+        {
+        link->iItemSettingText->Copy( aText );
+        }
+
+    link = NULL;
+    base = NULL;
+
+    return KErrNone;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::InitItemTextEdit()
+// ----------------------------------------------------------------------------
+//
+TInt CIpsSetUiBaseDialog::InitItemTextEdit(
+    CIpsSetUiItem& aBaseItem,
+    const TDesC& aText )
+    {
+    FUNC_LOG;
+    CIpsSetUiItemsEditText* textEditor =
+        static_cast<CIpsSetUiItemsEditText*>( &aBaseItem );
+    const TDesC& temp = aText.Left( textEditor->iItemMaxLength );
+    aBaseItem.SetText( temp );
+
+    return KErrNone;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::InitItemNumberEdit()
+// ----------------------------------------------------------------------------
+//
+TInt CIpsSetUiBaseDialog::InitItemNumberEdit(
+    CIpsSetUiItem& aBaseItem,
+    const TInt aValue,
+    const TDesC& aText )
+    {
+    FUNC_LOG;
+    // Convert item
+    CIpsSetUiItemValue* numberEditor =
+        static_cast<CIpsSetUiItemValue*>( &aBaseItem );
+
+    // Fill the existing fields
+    numberEditor->SetValue( aValue );
+
+    // Make sure all of the fields exists
+    if ( numberEditor->iItemSettingText )
+        {
+         if ( !aText.Length() )
+            {
+            numberEditor->iItemSettingText->Num( aValue );
+            }
+         else
+            {
+            numberEditor->iItemSettingText->Copy( aText );
+            }
+        }
+
+    return KErrNone;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::InitItemUnidentified()
+// ----------------------------------------------------------------------------
+//
+TInt CIpsSetUiBaseDialog::InitItemUnidentified(
+    CIpsSetUiItem& /* aBaseItem */,
+    const TInt /* aValue */,
+    const TDesC& /* aText */ )
+    {
+    FUNC_LOG;
+    return KErrNotFound;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::SettingsLastItemIndex()
+// ----------------------------------------------------------------------------
+//
+TInt CIpsSetUiBaseDialog::SettingsLastItemIndex(
+    const TBool aRemove ) const
+    {
+    FUNC_LOG;
+    // Store the last index to speed up fetching and removing
+    TInt lastIndex = iSettingsLastItemIndex->Count() - 1;
+
+    // Fetch the last item in the list and remove it
+    TInt lastItem = iSettingsLastItemIndex->At( lastIndex );
+
+    if ( aRemove )
+        {
+        iSettingsLastItemIndex->Delete( lastIndex );
+        }
+
+    // in case the array has been changed, set the new index in the boundaries
+    // of the new array
+    SetBetweenValues( lastItem, 0, MdcaCount() );
+
+    return lastItem;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::SetSettingsLastItemIndexL()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUiBaseDialog::SetSettingsLastItemIndexL(
+    const TInt aLastItemIndex )
+    {
+    FUNC_LOG;
+    iSettingsLastItemIndex->AppendL( aLastItemIndex );
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::SetListboxEmptyTextL()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUiBaseDialog::SetListboxEmptyTextL(
+    const TDesC& aText )
+    {
+    FUNC_LOG;
+    iListBox.View()->SetListEmptyTextL( aText );
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::CurrentSettingsPage()
+// ----------------------------------------------------------------------------
+//
+CIpsSetUiItem* CIpsSetUiBaseDialog::CurrentSettingsPage(
+    const TBool aRemove )
+    {
+    FUNC_LOG;
+    // Get the last item in the array
+    TInt lastIndex = iSettingsPageArray->Count() - 1;
+
+    // Get item
+    CIpsSetUiItem* currentItem = NULL;
+
+    if ( lastIndex >= 0 )
+        {
+        currentItem = iSettingsPageArray->At( lastIndex );
+        }
+
+    // Remove the item when required
+    if ( aRemove )
+        {
+        iSettingsPageArray->Delete( lastIndex );
+        }
+
+    return currentItem;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::SetCurrentSettingsPageL()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUiBaseDialog::SetCurrentSettingsPageL(
+    CIpsSetUiItem& aBaseItem )
+    {
+    FUNC_LOG;
+    if ( iSettingsPageArray->Count() < KIpsSetUiMaxEditors )
+        {
+        // Set the new item as a last item
+        iSettingsPageArray->AppendL( &aBaseItem );
+
+        // Insert the backup item to array
+        AddBackupItemL( aBaseItem );
+        }
+    else
+        {
+        // Too many editors, something is wrong
+        IPS_ASSERT_DEBUG( EFalse, KErrOverflow, EBaseDialog );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::CheckRadioButton()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUiBaseDialog::CheckRadioButton(
+    CIpsSetUiItemLink& aRadioButtonArray,
+    const TInt aRadioButtonIndex )
+    {
+    FUNC_LOG;
+    // Make sure the array exists
+    if ( aRadioButtonArray.iItemLinkArray )
+        {
+        CIpsSetUiBaseItemArray& array = *aRadioButtonArray.iItemLinkArray;
+
+        // The loop must return the index of the item from the visible list
+        // All items must be searched through
+        // Each item has to be checked from their hidden properties
+        const TInt buttons = array.Count();
+        TInt index = buttons;
+
+        // First, the item flags needs to be cleared
+        while ( --index >= 0 )
+            {
+            array[index]->iItemFlags.ClearFlag32( KIpsSetUiFlagChecked );
+            }
+
+        // Get the item from the actual list
+        CIpsSetUiItem* subItem =
+            GetSubItem( aRadioButtonArray, aRadioButtonIndex );
+
+        if ( subItem )
+            {
+            subItem->iItemFlags.SetFlag32( KIpsSetUiFlagChecked );
+            }
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::CheckRadioButton()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUiBaseDialog::CheckRadioButton(
+    CIpsSetUiItemLink& aRadioButtonArray,
+    const TUid& aId )
+    {
+    FUNC_LOG;
+    // Make sure the array exists
+    if ( aRadioButtonArray.iItemLinkArray )
+        {
+        CIpsSetUiItem* radioButton = NULL;
+
+        TInt buttons = aRadioButtonArray.iItemLinkArray->Count();
+
+        // Check the selected radiobutton
+        while ( --buttons >= 0 )
+            {
+            radioButton = ( *aRadioButtonArray.iItemLinkArray )[buttons];
+            if ( radioButton->iItemId == aId )
+                {
+                radioButton->iItemFlags.SetFlag32( KIpsSetUiFlagChecked );
+                }
+            else
+                {
+                radioButton->iItemFlags.ClearFlag32( KIpsSetUiFlagChecked );
+                }
+            }
+        }
+
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::FindCheckedRadiobutton()
+// ----------------------------------------------------------------------------
+//
+TInt CIpsSetUiBaseDialog::FindCheckedRadiobutton(
+    const CIpsSetUiItemLinkExt& aArray,
+    TUid& aId,
+    TInt& aIndex )
+    {
+    FUNC_LOG;
+    CIpsSetUiItem* radioButton = NULL;
+    aId.iUid = KErrNotFound;
+    aIndex = KErrNotFound;
+
+    if ( aArray.iItemLinkArray )
+        {
+        // Find the checked radio button, as there can be only one!
+        for ( TInt count = aArray.iItemLinkArray->Count()-1; count >= 0; --count)
+            {
+            radioButton = ( *aArray.iItemLinkArray )[count];
+
+            // Search for the radiobuttons but ignore hidden ones,
+            // even if it is checked
+            if ( radioButton && !IsHidden( *radioButton ) )
+                {
+                ++aIndex;
+
+                // If checked, return the value
+                if ( radioButton->iItemFlags.Flag32( KIpsSetUiFlagChecked ) )
+                    {
+                    aId = radioButton->iItemId;
+                    return KErrNone;
+                    }
+                }
+            }
+        }
+
+    return KErrNotFound;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::AddBackupItemL()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUiBaseDialog::AddBackupItemL(
+    const CIpsSetUiItem& aBaseItem )
+    {
+    FUNC_LOG;
+    switch ( aBaseItem.iItemType )
+        {
+        case EIpsSetUiItemMultiLine:
+        case EIpsSetUiRadioButtonArray:
+        case EIpsSetUiCheckBoxArray:
+            BackupItemCreateRadioL( aBaseItem );
+            break;
+
+        case EIpsSetUiItemScValue:
+        case EIpsSetUiItemText:
+            BackupItemCreateTextL( aBaseItem );
+            break;
+
+        case EIpsSetUiItemValue:
+            BackupItemCreateValueL( aBaseItem );
+            break;
+
+        case EIpsSetUiUndefined:
+            BackupItemCreateUndefinedL( aBaseItem );
+            break;
+
+        default:
+            // No need to backup, or unsupported
+            break;
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::RemoveLastBackupItem()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUiBaseDialog::RemoveLastBackupItem()
+    {
+    FUNC_LOG;
+    CIpsSetUiItem* base = GetLastBackupItem();
+    iBackupArray->Delete( iBackupArray->Count() - 1 );
+
+    if ( base )
+        {
+        // With link items do not delete array, since the pointer points
+        // directly to original array. So set the pointer to null before
+        // deleting the item.
+        if ( base->HasLinkArray() )
+            {
+            static_cast<CIpsSetUiItemLink*>( &*base )->iItemLinkArray = NULL;
+            }
+
+        delete base;
+        base = NULL;
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::GetLastBackupItem()
+// ----------------------------------------------------------------------------
+//
+CIpsSetUiItem* CIpsSetUiBaseDialog::GetLastBackupItem()
+    {
+    FUNC_LOG;
+    return iBackupArray->At( iBackupArray->Count() - 1 );
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::RestoreFromBackup()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUiBaseDialog::RestoreFromBackup()
+    {
+    FUNC_LOG;
+    // Restore
+    for ( TInt count = iSettingsPageArray->Count()-1; count >= 0; count-- )
+        {
+        TInt lastPageNum = iSettingsPageArray->Count() - 1;
+        TInt lastBackupNum = iBackupArray->Count() - 1;
+        CIpsSetUiItem* currentPage = iSettingsPageArray->At( lastPageNum );
+        CIpsSetUiItem* backupPage = iBackupArray->At( lastBackupNum );
+
+        // Restore values
+        const TDesC& text( ItemText( *backupPage ) );
+        if ( text.Length() )
+            {
+            SetItemText( *currentPage, text );
+            }
+
+        currentPage->SetValue( backupPage->Value() );
+        currentPage->SetText( backupPage->Text() );
+
+        iSettingsPageArray->Delete( lastPageNum );
+        RemoveLastBackupItem();
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::CleanBackupArray()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUiBaseDialog::CleanBackupArray()
+    {
+    FUNC_LOG;
+    for ( TInt count = iBackupArray->Count()-1; count >= 0; count-- )
+        {
+        RemoveLastBackupItem();
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::BackupItemCreateLinkL()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUiBaseDialog::BackupItemCreateLinkL(
+    const CIpsSetUiItem& aBaseItem )
+    {
+    FUNC_LOG;
+    CIpsSetUiItemLink* linkBackup = CIpsSetUiItemLink::NewL();
+    CleanupStack::PushL( linkBackup );
+    const CIpsSetUiItemLink* link =
+        static_cast<const CIpsSetUiItemLink*>( &aBaseItem );
+    *linkBackup = *link;
+
+    iBackupArray->AppendL( linkBackup );
+    CleanupStack::Pop( linkBackup );
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::BackupItemCreateRadioL()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUiBaseDialog::BackupItemCreateRadioL(
+    const CIpsSetUiItem& aBaseItem )
+    {
+    FUNC_LOG;
+    CIpsSetUiItemLinkExt* radioBackup = CIpsSetUiItemLinkExt::NewL();
+    CleanupStack::PushL( radioBackup );
+    const CIpsSetUiItemLinkExt* radio =
+        static_cast<const CIpsSetUiItemLinkExt*>( &aBaseItem );
+    *radioBackup = *radio;
+
+    iBackupArray->AppendL( radioBackup );
+    CleanupStack::Pop( radioBackup );
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::BackupItemCreateValueL()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUiBaseDialog::BackupItemCreateValueL(
+    const CIpsSetUiItem& aBaseItem )
+    {
+    FUNC_LOG;
+    CIpsSetUiItemValue* valueBackup = CIpsSetUiItemValue::NewL();
+    CleanupStack::PushL( valueBackup );
+    const CIpsSetUiItemValue* value =
+        static_cast<const CIpsSetUiItemValue*>( &aBaseItem );
+    *valueBackup = *value;
+
+    iBackupArray->AppendL( valueBackup );
+    CleanupStack::Pop( valueBackup );
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::BackupItemCreateTextL()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUiBaseDialog::BackupItemCreateTextL(
+    const CIpsSetUiItem& aBaseItem )
+    {
+    FUNC_LOG;
+    CIpsSetUiItemsEditText* textBackup = CIpsSetUiItemsEditText::NewL();
+    CleanupStack::PushL( textBackup );
+    const CIpsSetUiItemsEditText* text =
+        static_cast<const CIpsSetUiItemsEditText*>( &aBaseItem );
+    *textBackup = *text;
+
+    iBackupArray->AppendL( textBackup );
+    CleanupStack::Pop( textBackup );
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::BackupItemCreateUndefinedL()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUiBaseDialog::BackupItemCreateUndefinedL(
+    const CIpsSetUiItem& aBaseItem )
+    {
+    FUNC_LOG;
+    CIpsSetUiItem* base = CreateItemForBackupL( aBaseItem );
+
+    iBackupArray->AppendL( base );
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::CreateItemForBackupL()
+// ----------------------------------------------------------------------------
+//
+CIpsSetUiItem* CIpsSetUiBaseDialog::CreateItemForBackupL(
+    const CIpsSetUiItem& aBaseItem )
+    {
+    FUNC_LOG;
+    CIpsSetUiItemLinkExt* radioBackup = CIpsSetUiItemLinkExt::NewL();
+    const CIpsSetUiItemLinkExt* radio =
+        static_cast<const CIpsSetUiItemLinkExt*>( &aBaseItem );
+    *radioBackup = *radio;
+
+    return radioBackup;
+    }
+
+//<cmail>
+// ----------------------------------------------------------------------------
+// CIpsSetUiBaseDialog::CountInListBox()
+// ----------------------------------------------------------------------------
+//
+TInt CIpsSetUiBaseDialog::CountInListBox() const
+    {
+    return iListBox.Model()->NumberOfItems();
+    }
+//</cmail>
+//  End of File
+