--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/email/imum/Utils/Src/MuiuDynamicSettingsArray.cpp Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,1688 @@
+/*
+* Copyright (c) 2006 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: MuiuDynamicSettingsArray.cpp
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <e32base.h> // Base symbian include
+#include <gulutil.h> // KColumnListSeparator
+#include <eikrutil.h> // EikResourceUtils
+#include <AknUtils.h> // AknTextUtils
+#include <barsread.h> // TResourceReader
+#include "MuiuDynamicSettingsArray.h"
+#include "MuiuDynamicSettingItemBase.h" // CMuiuSettingBase
+#include "MuiuDynamicSettingItemEditValue.h" // CMuiuSettingEditValue
+#include "MuiuDynamicSettingItemEditText.h" // CMuiuSettingEditText
+#include "MuiuDynamicSettingItemLink.h" // CMuiuSettingLink
+#include "MuiuDynamicSettingItemExtLink.h" // CMuiuSettingExtLink
+#include <StringLoader.h>
+#include <ImumUtils.rsg>
+#include <data_caging_path_literals.hrh>
+#include <muiu_internal.rsg>
+
+#include "EmailFeatureUtils.h"
+#include "MuiuDynamicSettingsItemFinder.h"
+
+// EXTERNAL DATA STRUCTURES
+// EXTERNAL FUNCTION PROTOTYPES
+// CONSTANTS
+
+// This is added at the end of the locked setting item string
+_LIT( KMuiuDynStrProtected, "\t\t\t\t\t0" );
+// This is added at the end of the compulsory setting item string
+_LIT( KMuiuDynStrCompulsory, "\t*" );
+// Muiu resource file
+_LIT( KMuiuResFileName, "z:muiu_internal.rsc" );
+// The number of characters that can be shown in the screen
+const TInt KMuiuDynVisibleTextLength = 30;
+// The number of characters that is shown in password field
+const TInt KMuiuDynVisiblePasswordChars = 4;
+
+// MACROS
+// LOCAL CONSTANTS AND MACROS
+// MODULE DATA STRUCTURES
+// LOCAL FUNCTION PROTOTYPES
+// FORWARD DECLARATIONS
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::CMuiuDynamicSettingsArray()
+// ----------------------------------------------------------------------------
+//
+CMuiuDynamicSettingsArray::CMuiuDynamicSettingsArray()
+ :
+ iResourceLoader( *CCoeEnv::Static() ),
+ iFinder( NULL ),
+ iItemArray( NULL ),
+ iCompulsoryText( NULL ),
+ iPasswordFill( 0x00 ),
+ iActiveCount( 0 ),
+ iError( KErrNone ),
+ iEnv( CEikonEnv::Static() )
+ {
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::~CMuiuDynamicSettingsArray()
+// ----------------------------------------------------------------------------
+//
+CMuiuDynamicSettingsArray::~CMuiuDynamicSettingsArray()
+ {
+ CleanArrayItems();
+
+ if ( iResourceStack )
+ {
+ iResourceStack->Reset();
+ delete iResourceStack;
+ iResourceStack = NULL;
+ }
+ delete iItemArray;
+ iItemArray = NULL;
+ delete iTempText;
+ iTempText = NULL;
+ delete iResourceText;
+ iResourceText = NULL;
+ delete iCompulsoryText;
+ iCompulsoryText = NULL;
+ delete iFinder;
+ iFinder = NULL;
+ iResourceLoader.Close();
+
+ iEnv = NULL;
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::BaseConstructL()
+// ----------------------------------------------------------------------------
+//
+void CMuiuDynamicSettingsArray::BaseConstructL( const TBool aLockedSettings )
+ {
+ // Prepare the arrays
+ iItemArray = new ( ELeave ) CMuiuDynSetItemArray( KMuiuDynArrayGranularity );
+ iResourceStack = new ( ELeave ) RResourceStack( KMuiuDynArrayGranularity );
+ iFinder = CMuiuDynamicSettingsItemFinder::NewL( *this );
+
+ // Define resource file and open it
+ TParse parse;
+ parse.Set( KMuiuResFileName, &KDC_RESOURCE_FILES_DIR, NULL );
+ TFileName fileName( parse.FullName() );
+ iResourceLoader.OpenL( fileName );
+ iArrayFlags.SetFlag( EMuiuDynArrayAllowRefresh );
+ iArrayFlags.ChangeFlag( EMuiuEMailLockedSettings, aLockedSettings );
+
+ // Prepare strings
+ iTempText = HBufC::NewL( KMuiuDynMaxSettingsTextLength );
+ iResourceText = iEnv->AllocReadResourceL(
+ R_IMUM_SELEC_SETT_VAL_FIELD_NONE );
+ iPasswordFill = EikResourceUtils::ReadTInt16L(
+ R_MUIU_SETTINGS_DIALOG_PASSWORD_FILL, iEnv );
+ iCompulsoryText = iEnv->AllocReadResourceL(
+ R_MUIU_SETTINGS_DIALOG_COMPULSORY_FILL );
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::BaseConstructL()
+// ----------------------------------------------------------------------------
+//
+void CMuiuDynamicSettingsArray::BaseConstructL(
+ const TInt aResourceId,
+ const TBool aLockedSettings )
+ {
+ // Initialize the members
+ BaseConstructL( aLockedSettings );
+
+ // If resource provided add it into the setting array
+ LoadSettingArrayFromResourceL( aResourceId );
+
+ UpdateActiveItemsCount();
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::CleanArrayItems()
+// ----------------------------------------------------------------------------
+//
+void CMuiuDynamicSettingsArray::CleanArrayItems()
+ {
+ if ( iItemArray )
+ {
+ // Delete items from the array
+ TInt index = iItemArray->Count() - 1;
+
+ // Search through all items in the array
+ for ( ; index >= 0; index-- )
+ {
+ // Only certain type of items can contain subarrays
+ CMuiuSettingBase* base = ( *iItemArray )[index];
+ delete base;
+ base = NULL;
+ }
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::CreateCustomItemToArrayLC()
+// ----------------------------------------------------------------------------
+//
+CMuiuSettingBase* CMuiuDynamicSettingsArray::CreateCustomItemToArrayLC(
+ const TUid& /* aId */ )
+ {
+ return NULL;
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::ListboxItemFillMultiLineLabel()
+// ----------------------------------------------------------------------------
+//
+void CMuiuDynamicSettingsArray::ListboxItemFillMultiLineLabel(
+ const CMuiuSettingBase& aBaseItem,
+ TMuiuSettingsText& aText ) const
+ {
+ aText = static_cast<const CMuiuSettingsLink*>(
+ &aBaseItem )->iItemSettingText->Left( KMuiuDynVisibleTextLength );
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::ListboxItemFillEditTextLabel()
+// ----------------------------------------------------------------------------
+//
+void CMuiuDynamicSettingsArray::ListboxItemFillEditTextLabel(
+ const CMuiuSettingBase& aBaseItem,
+ TMuiuSettingsText& aText ) const
+ {
+ aText.Copy( aBaseItem.VisibleText().Left( KMuiuDynVisibleTextLength ) );
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::ListboxItemFillEditValueLabel()
+// ----------------------------------------------------------------------------
+//
+void CMuiuDynamicSettingsArray::ListboxItemFillEditValueLabel(
+ const CMuiuSettingBase& aBaseItem,
+ TMuiuSettingsText& aText ) const
+ {
+ aText.Append( aBaseItem.Value() );
+ aText.SetLength( KMuiuDynVisibleTextLength );
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::ListboxItemFillEditTimeLabel()
+// ----------------------------------------------------------------------------
+//
+void CMuiuDynamicSettingsArray::ListboxItemFillEditTimeLabel(
+ const CMuiuSettingBase& aBaseItem,
+ TMuiuSettingsText& aText ) const
+ {
+ aText.Append( aBaseItem.Value() );
+ aText.SetLength( KMuiuDynVisibleTextLength );
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::ListboxUndefinedFillLabel()
+// ----------------------------------------------------------------------------
+//
+void CMuiuDynamicSettingsArray::ListboxUndefinedFillLabel(
+ const CMuiuSettingBase& aBaseItem,
+ TMuiuSettingsText& aText ) const
+ {
+ aText = static_cast<const CMuiuSettingsLinkExtended*>(
+ &aBaseItem )->iItemSettingText->Left( KMuiuDynVisibleTextLength );
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::ListboxRadioButtonFillArrayLabel()
+// ----------------------------------------------------------------------------
+//
+void CMuiuDynamicSettingsArray::ListboxRadioButtonFillArrayLabel(
+ const CMuiuSettingBase& aBaseItem,
+ TMuiuSettingsText& aText ) const
+ {
+ aText = static_cast<const CMuiuSettingsLinkExtended*>(
+ &aBaseItem )->iItemSettingText->Left( KMuiuDynVisibleTextLength );
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::ListboxCheckboxFillArrayLabel()
+// ----------------------------------------------------------------------------
+//
+void CMuiuDynamicSettingsArray::ListboxCheckboxFillArrayLabel(
+ const CMuiuSettingBase& aBaseItem,
+ TMuiuSettingsText& aText ) const
+ {
+ aText = static_cast<const CMuiuSettingsLinkExtended*>(
+ &aBaseItem )->iItemSettingText->Left( KMuiuDynVisibleTextLength );
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::ListboxItemLabelFillL()
+// ----------------------------------------------------------------------------
+//
+TPtrC16 CMuiuDynamicSettingsArray::ListboxItemLabelFillL(
+ CMuiuSettingBase& aBaseItem ) const
+ {
+ // Get the type of the setting item
+ TMuiuDynSettingsType type = aBaseItem.iItemType;
+ TMuiuSettingsText tempSettingText;
+ tempSettingText.Zero();
+
+ switch ( type )
+ {
+ case EMuiuDynSetItemMultiLine:
+ ListboxItemFillMultiLineLabel( aBaseItem, tempSettingText );
+ break;
+
+ case EMuiuDynSetUndefined:
+ ListboxUndefinedFillLabel( aBaseItem, tempSettingText );
+ break;
+
+ case EMuiuDynSetRadioButtonArray:
+ ListboxRadioButtonFillArrayLabel( aBaseItem, tempSettingText );
+ break;
+
+ case EMuiuDynSetCheckBoxArray:
+ ListboxCheckboxFillArrayLabel( aBaseItem, tempSettingText );
+ break;
+
+ case EMuiuDynSetItemEditText:
+ ListboxItemFillEditTextLabel( aBaseItem, tempSettingText );
+ break;
+
+ case EMuiuDynSetItemEditValue:
+ ListboxItemFillEditValueLabel( aBaseItem, tempSettingText );
+ break;
+
+ case EMuiuDynSetItemEditTime:
+ ListboxItemFillEditTimeLabel( aBaseItem, tempSettingText );
+ break;
+
+ default:
+ // Nothing to show, send empty text
+ break;
+ }
+
+ // If the setting is marked as password, fill special character
+ // instead of readable text
+ TInt length = tempSettingText.Length();
+ if ( length > 0 && aBaseItem.iItemFlags.Flag( EMuiuDynItemPassword ) )
+ {
+ // Add special chars to all type characters in setting field
+ TChar passFill = TChar( iPasswordFill );
+ tempSettingText.Zero();
+ tempSettingText.AppendFill( passFill, KMuiuDynVisiblePasswordChars );
+ }
+
+ return tempSettingText;
+ }
+
+/******************************************************************************
+
+ Item property editors
+
+******************************************************************************/
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::SetItemValue()
+// ----------------------------------------------------------------------------
+//
+void CMuiuDynamicSettingsArray::SetItemValue(
+ const TUid& aId,
+ const TInt aValue,
+ const TBool aUpdate )
+ {
+ CMuiuSettingBase* baseItem = GetItem( aId, EFalse );
+
+ if ( baseItem )
+ {
+ SetItemValue( *baseItem, aValue, aUpdate );
+ }
+
+ baseItem = NULL;
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::SetItemValue()
+// ----------------------------------------------------------------------------
+//
+void CMuiuDynamicSettingsArray::SetItemValue(
+ const TInt aIndex,
+ const TInt aValue,
+ const TBool aUpdate )
+ {
+ CMuiuSettingBase* baseItem = iItemArray->At( aIndex );
+
+ if ( baseItem )
+ {
+ SetItemValue( *baseItem, aValue, aUpdate );
+ }
+
+ baseItem = NULL;
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::SetItemValue()
+// ----------------------------------------------------------------------------
+//
+void CMuiuDynamicSettingsArray::SetItemValue(
+ CMuiuSettingBase& aBaseItem,
+ const TInt aValue,
+ const TBool aUpdate )
+ {
+ aBaseItem.SetValue( aValue );
+
+ // Issue update when needed
+ if ( aUpdate )
+ {
+ Refresh();
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::SetItemText()
+// ----------------------------------------------------------------------------
+//
+void CMuiuDynamicSettingsArray::SetItemText(
+ const TUid& aId,
+ const TMuiuSettingsText& aText,
+ const TBool aUpdate )
+ {
+ CMuiuSettingBase* baseItem = GetItem( aId, EFalse );
+
+ if ( baseItem )
+ {
+ SetItemText( *baseItem, aText, aUpdate );
+ }
+
+ baseItem = NULL;
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::SetItemText()
+// ----------------------------------------------------------------------------
+//
+void CMuiuDynamicSettingsArray::SetItemText(
+ const TInt aIndex,
+ const TMuiuSettingsText& aText,
+ const TBool aUpdate )
+ {
+ CMuiuSettingBase* baseItem = iItemArray->At( aIndex );
+
+ if ( baseItem )
+ {
+ SetItemText( *baseItem, aText, aUpdate );
+ }
+
+ baseItem = NULL;
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::SetItemText()
+// ----------------------------------------------------------------------------
+//
+void CMuiuDynamicSettingsArray::SetItemText(
+ CMuiuSettingBase& aBaseItem,
+ const TMuiuSettingsText& aText,
+ const TBool aUpdate )
+ {
+ switch ( aBaseItem.iItemType )
+ {
+ case EMuiuDynSetItemEditValue:
+ static_cast<CMuiuSettingsEditValue*>(
+ &aBaseItem )->iItemSettingText->Copy( aText );
+ break;
+
+ case EMuiuDynSetRadioButtonArray:
+ case EMuiuDynSetCheckBoxArray:
+ static_cast<CMuiuSettingsLinkExtended*>(
+ &aBaseItem )->iItemSettingText->Copy( aText );
+ break;
+
+ default:
+ aBaseItem.SetText( &aText );
+ break;
+ }
+
+ // Issue update when needed
+ if ( aUpdate )
+ {
+ Refresh();
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::ItemText()
+// ----------------------------------------------------------------------------
+//
+const TMuiuSettingsText* CMuiuDynamicSettingsArray::ItemText(
+ CMuiuSettingBase& aBaseItem )
+ {
+ switch ( aBaseItem.iItemType )
+ {
+ case EMuiuDynSetItemEditValue:
+ return static_cast<CMuiuSettingsEditValue*>(
+ &aBaseItem )->iItemSettingText;
+
+ case EMuiuDynSetRadioButtonArray:
+ case EMuiuDynSetCheckBoxArray:
+ return static_cast<CMuiuSettingsLinkExtended*>(
+ &aBaseItem )->iItemSettingText;
+ }
+
+ return aBaseItem.Text();
+ }
+
+/******************************************************************************
+
+ Base class function definitions
+
+******************************************************************************/
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::SearchDoError()
+// ----------------------------------------------------------------------------
+//
+TBool CMuiuDynamicSettingsArray::SearchDoError()
+ {
+ return ETrue;
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::SearchDoContinuationCheck()
+// ----------------------------------------------------------------------------
+//
+TBool CMuiuDynamicSettingsArray::SearchDoContinuationCheck(
+ const CMuiuSettingBase& /* aItem */,
+ const TInt /* aIndex */ )
+ {
+ return ETrue;
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::SearchDoItemCheck()
+// ----------------------------------------------------------------------------
+//
+TBool CMuiuDynamicSettingsArray::SearchDoItemCheck(
+ CMuiuSettingBase& /* aItem */ )
+ {
+ return ETrue;
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::MdcaCount()
+// ----------------------------------------------------------------------------
+//
+TInt CMuiuDynamicSettingsArray::MdcaCount() const
+ {
+ return iActiveCount;
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::MdcaPoint()
+// ----------------------------------------------------------------------------
+//
+TPtrC16 CMuiuDynamicSettingsArray::MdcaPoint( TInt aIndex ) const
+ {
+ // First search the currently active resource to array and check
+ // the given index is in the current array
+ __ASSERT_DEBUG( aIndex < StackCountItems(),
+ User::Panic( KMuiuDynSettingsArrayPanic, KErrOverflow ) );
+
+ // Search for item from the active array
+ CMuiuSettingBase* setting = iFinder->FinderArray()->At( aIndex ).iItem;
+ __ASSERT_DEBUG( setting != NULL,
+ User::Panic( KMuiuDynSettingsArrayPanic, KErrNotFound ) );
+
+ // Prepare strings
+ TPtr tempText = iTempText->Des();
+
+ // Send custom event and if not used, prepare default
+ if ( !EventCustomMdcaPoint( setting->iItemId, tempText ) )
+ {
+ // Initialize string
+ tempText.Zero();
+ tempText.Append( KMuiuDynStrSpace );
+ tempText.Append( KColumnListSeparator );
+ tempText.Append( *setting->iItemLabel );
+
+ // Submenus doesn't contain other information
+ if ( !ItemSubArrayCheck( *setting ) )
+ {
+ tempText.Append( KColumnListSeparator );
+ tempText.Append( KColumnListSeparator );
+
+ TMuiuSettingsText tempSettingText;
+ // Try to add the text, error detected in next if
+ TRAP_IGNORE( tempSettingText =
+ ListboxItemLabelFillL( *setting ) );
+
+ // Fill the setting text with string
+ if ( tempSettingText.Length() )
+ {
+ tempText.Append( tempSettingText );
+ }
+ else
+ {
+ // Write compulsory text to required fields
+ if ( setting->iItemFlags.Flag( EMuiuDynItemCompulsory ) )
+ {
+ tempText.Append( *iCompulsoryText );
+ }
+ else if( setting->iItemFlags.Flag( EMuiuDynItemPassword ) )
+ {
+ tempText.Append( KMuiuDynStrSpace );
+ }
+ else
+ {
+ tempText.Append( *iResourceText );
+ }
+ }
+
+ // Add the special string after compulsory fields
+ if ( setting->iItemFlags.Flag( EMuiuDynItemCompulsory ) )
+ {
+ tempText.Append( KMuiuDynStrCompulsory );
+ }
+
+ // Do the number conversion, if allowed
+ if ( setting->iItemFlags.Flag( EMuiuDynItemLangSpecificNumConv ) )
+ {
+ AknTextUtils::DisplayTextLanguageSpecificNumberConversion(
+ tempText );
+ }
+ }
+ else if( iArrayFlags.Flag( EMuiuEMailLockedSettings ) &&
+ setting->iItemFlags.Flag( EMuiuDynItemLockableSetting ) )
+ {
+ tempText.Append( KMuiuDynStrProtected );
+ }
+ }
+
+ setting = NULL;
+ return tempText;
+ }
+
+/******************************************************************************
+
+ Resource loading functions
+
+******************************************************************************/
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::LoadDynamicSettingItemL()
+// ----------------------------------------------------------------------------
+//
+void CMuiuDynamicSettingsArray::LoadDynamicSettingItemL(
+ TResourceReader& aReader,
+ CMuiuSettingBase& aBaseItem )
+ {
+ // Read rest of the settings first
+ // STRUCT MUIU_DYNAMIC_SETTINGS_ITEM : LTEXT itemlabel
+ HBufC* txt = aReader.ReadHBufCL(); // message text
+
+ if ( txt )
+ {
+ aBaseItem.iItemLabel->Copy( *txt );
+ }
+
+ delete txt;
+ txt = NULL;
+
+ // STRUCT MUIU_DYNAMIC_SETTINGS_ITEM : WORD itemmaxlength
+ TInt maxLength = aReader.ReadInt16();
+
+ // STRUCT MUIU_DYNAMIC_SETTINGS_ITEM : LTEXT itememptytext
+ HBufC* empty = aReader.ReadHBufCL();
+ CleanupStack::PushL( empty );
+
+ // STRUCT MUIU_DYNAMIC_SETTINGS_ITEM : LONG itemflags
+ aBaseItem.iItemFlags = MAKE_TUINT64( aReader.ReadInt32(), 0 );
+
+ // STRUCT MUIU_DYNAMIC_SETTINGS_ITEM : LLINK itemarray
+ TInt linkResourceId = aReader.ReadInt32();
+
+ // STRUCT MUIU_DYNAMIC_SETTINGS_ITEM : WORD itemsubtype
+ TMuiuDynSettingsType subtype =
+ static_cast<TMuiuDynSettingsType>( aReader.ReadInt16() );
+
+ // Finally add the item to list
+ HandleDynamicSettingsItemL(
+ aBaseItem, maxLength, subtype, linkResourceId, empty );
+
+ CleanupStack::PopAndDestroy( empty );
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::UpdateItemEditTextL()
+// ----------------------------------------------------------------------------
+//
+void CMuiuDynamicSettingsArray::UpdateItemEditTextL(
+ CMuiuSettingBase& aBaseItem,
+ const TInt aMaxLength,
+ const TDesC* aEmptyText )
+ {
+ CMuiuSettingsEditText* text =
+ static_cast<CMuiuSettingsEditText*>( &aBaseItem );
+ text->iItemMaxLength = aMaxLength;
+ if( aEmptyText )
+ {
+ text->SetEmptyText( *aEmptyText );
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::UpdateItemEditValueL()
+// ----------------------------------------------------------------------------
+//
+void CMuiuDynamicSettingsArray::UpdateItemEditValueL(
+ CMuiuSettingBase& aBaseItem,
+ const TInt aMaxLength )
+ {
+ CMuiuSettingsEditValue* value =
+ static_cast<CMuiuSettingsEditValue*>( &aBaseItem );
+ value->iItemMaxLength = aMaxLength;
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::HandleDynamicSettingsItemL()
+// ----------------------------------------------------------------------------
+//
+void CMuiuDynamicSettingsArray::HandleDynamicSettingsItemL(
+ CMuiuSettingBase& aBaseItem,
+ const TInt aMaxLength,
+ const TMuiuDynSettingsType aSubType,
+ const TInt aLinkResourceId,
+ const TDesC* aEmptyText )
+ {
+ switch ( aBaseItem.Type() )
+ {
+ // Load dynamically linked items or submenus
+ case EMuiuDynSetMenuArray:
+ case EMuiuDynSetRadioButtonArray:
+ case EMuiuDynSetCheckBoxArray:
+ case EMuiuDynSetItemMultiLine:
+ LoadDynamicSettingsItemLinkItemL(
+ aBaseItem, aSubType, aLinkResourceId );
+ break;
+
+ // Finish text item
+ case EMuiuDynSetItemEditText:
+ UpdateItemEditTextL( aBaseItem, aMaxLength, aEmptyText );
+ break;
+
+ // Finish number item
+ case EMuiuDynSetItemEditValue:
+ case EMuiuDynSetItemEditTime:
+ UpdateItemEditValueL( aBaseItem, aMaxLength );
+ break;
+
+ // Other items are already finished
+ case EMuiuDynSetItemRadioButton:
+ case EMuiuDynSetItemCheckBox:
+ default:
+ break;
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::CreateItemToArrayL()
+// ----------------------------------------------------------------------------
+//
+CMuiuSettingBase* CMuiuDynamicSettingsArray::CreateItemToArrayL(
+ const TMuiuDynSettingsType aType,
+ const TUid& aId,
+ CMuiuDynSetItemArray& aItemArray )
+ {
+ CMuiuSettingBase* base = NULL;
+
+ switch ( aType )
+ {
+ // Create array item
+ case EMuiuDynSetMenuArray:
+ base = CMuiuSettingsLink::NewLC();
+ break;
+
+ // Force manual item creation
+ case EMuiuDynSetUndefined:
+ base = CreateCustomItemToArrayLC( aId );
+ __ASSERT_DEBUG( base != NULL,
+ User::Panic( KMuiuDynSettingsArrayPanic, KErrUnknown ) );
+ break;
+
+ // Create radiobutton array item
+ case EMuiuDynSetRadioButtonArray:
+ case EMuiuDynSetCheckBoxArray:
+ case EMuiuDynSetItemMultiLine:
+ base = CMuiuSettingsLinkExtended::NewLC();
+ break;
+
+ // Create edit text item
+ case EMuiuDynSetItemEditText:
+ base = CMuiuSettingsEditText::NewLC();
+ break;
+
+ // Create edit number item
+ case EMuiuDynSetItemEditValue:
+ case EMuiuDynSetItemEditTime:
+ base = CMuiuSettingsEditValue::NewLC();
+ break;
+
+ // Create normal base item
+ case EMuiuDynSetItemRadioButton:
+ case EMuiuDynSetItemCheckBox:
+ default:
+ base = CMuiuSettingBase::NewLC();
+ break;
+ }
+
+ // Add to array
+ aItemArray.AppendL( base );
+ CleanupStack::Pop( base );
+
+ return base;
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::LoadDynamicSettingsItemLinkItemL()
+// ----------------------------------------------------------------------------
+//
+void CMuiuDynamicSettingsArray::LoadDynamicSettingsItemLinkItemL(
+ CMuiuSettingBase& aBaseItem,
+ const TMuiuDynSettingsType aSubType,
+ const TInt aLinkResourceId )
+ {
+ // Prepare the item
+ CMuiuSettingsLink* linkItem = static_cast<CMuiuSettingsLink*>( &aBaseItem );
+ linkItem->iItemSubType = aSubType;
+ linkItem->iItemFlags.SetFlag( EMuiuDynItemUpdateOnChange );
+
+ // Start reading only if resource is provided
+ if ( aLinkResourceId )
+ {
+ linkItem->iItemLinkArray =
+ new ( ELeave ) CMuiuDynSetItemArray(
+ KMuiuDynArrayGranularity );
+
+ // Start loading the settings
+ LoadSettingItemsToArrayL( aLinkResourceId, *linkItem->iItemLinkArray );
+ }
+
+ linkItem = NULL;
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::LoadSettingArrayFromResource()
+// ----------------------------------------------------------------------------
+//
+void CMuiuDynamicSettingsArray::LoadSettingArrayFromResourceL(
+ const TInt aResourceId )
+ {
+ // Start reading only if resource is provided
+ if ( aResourceId )
+ {
+ iResourceStack->AppendL( aResourceId );
+ const TInt items = iItemArray->Count();
+
+ // Begin to read the items from the resource
+ TInt count = LoadSettingItemsToArrayL( aResourceId, *iItemArray );
+
+ // Update the item count
+ UpdateActiveItemsCount( count );
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::LoadSettingItemsToArrayL()
+// ----------------------------------------------------------------------------
+//
+TInt CMuiuDynamicSettingsArray::LoadSettingItemsToArrayL(
+ const TInt aResourceId,
+ CMuiuDynSetItemArray& aItemArray )
+ {
+ // Define new read based on last item
+ TResourceReader reader;
+ iEnv->CreateResourceReaderLC(
+ reader, aResourceId );
+
+ // Get the count of items in resource
+ TInt count = reader.ReadInt16();
+ for ( TInt loop = 0; loop < count; loop++ )
+ {
+ // Read the settings from the resource
+
+ // STRUCT MUIU_DYNAMIC_SETTINGS_ITEM : WORD itemtype
+ TMuiuDynSettingsType type =
+ static_cast<TMuiuDynSettingsType>( reader.ReadInt16() );
+
+ // STRUCT MUIU_DYNAMIC_SETTINGS_ITEM : WORD itemid
+ TUid id = TUid::Uid( reader.ReadInt16() );
+
+ // Create the setting item
+ CMuiuSettingBase* base =
+ CreateItemToArrayL( type, id, aItemArray );
+ base->iItemId = id;
+ base->iItemType = type;
+ base->iItemResourceId = aResourceId;
+
+ // Start loading the item, based on item type
+ LoadDynamicSettingItemL( reader, *base );
+ base = NULL;
+ }
+
+ CleanupStack::PopAndDestroy(); // reader
+
+ return count;
+ }
+
+/******************************************************************************
+
+ Item addition and deletion functions
+
+******************************************************************************/
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::AddItemsL()
+// ----------------------------------------------------------------------------
+//
+TInt CMuiuDynamicSettingsArray::AddItemsL( const TInt aResource )
+ {
+ // Load the resource and add it to array
+ LoadSettingArrayFromResourceL( aResource );
+
+ iError = EventArrayChangedL( EMuiuDynArrayAdded );
+
+ // return the error state
+ return iError;
+ }
+
+/******************************************************************************
+
+ Item hide functions
+
+******************************************************************************/
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::IsHidden()
+// ----------------------------------------------------------------------------
+//
+TInt CMuiuDynamicSettingsArray::IsHidden( const TUid& aId ) const
+ {
+ return IsHidden( *GetItem( aId ) );
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::IsHidden()
+// ----------------------------------------------------------------------------
+//
+TInt CMuiuDynamicSettingsArray::IsHidden(
+ const CMuiuSettingBase& aItem ) const
+ {
+ if ( aItem.iItemFlags.Flag( EMuiuDynItemPermanentlyHidden ) )
+ {
+ return KErrNotSupported;
+ }
+ else if ( aItem.iItemFlags.Flag( EMuiuDynItemHidden ) )
+ {
+ return KErrNotFound;
+ }
+ else
+ {
+ return KErrNone;
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::IsHidden()
+// ----------------------------------------------------------------------------
+//
+TInt CMuiuDynamicSettingsArray::IsHidden( const TInt aIndex ) const
+ {
+ return IsHidden( *GetItem( aIndex ) );
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::DoHideItems()
+// ----------------------------------------------------------------------------
+//
+void CMuiuDynamicSettingsArray::DoHideItems( const TBool aHide )
+ {
+ // All items collected, set their flags hidden flags
+ CMuiuDynFinderItemArray& array = *iFinder->FinderArray();
+ TInt item = array.Count();
+ while ( --item >= 0 )
+ {
+ CMuiuSettingBase* base = array[item].iItem;
+ base->iItemFlags.ChangeFlag( EMuiuDynItemHidden, aHide );
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::HideItems()
+// ----------------------------------------------------------------------------
+//
+void CMuiuDynamicSettingsArray::SetHideItems(
+ const TBool aHide,
+ const TInt aResourceId,
+ const TBool aUpdate )
+ {
+ // When hiding all, search through all subfolders and allow the state
+ // change
+ TMuiuFlags search;
+ search.SetFlag( CMuiuDynamicSettingsItemFinder::EFinderSearchSubFolders );
+ search.SetFlag( CMuiuDynamicSettingsItemFinder::EFinderResourceSearch );
+ iFinder->SetSearchFlags( search );
+
+ // Try to hide items and panic in any error
+ TRAPD( error, iFinder->StartSearchL( *iItemArray, aResourceId ) );
+ if ( error != KErrNone )
+ {
+ __ASSERT_DEBUG( EFalse,
+ User::Panic( KMuiuDynSettingsArrayPanic, error ) );
+ }
+
+ DoHideItems( aHide );
+
+ // Handle the array change
+ if ( aUpdate )
+ {
+ Refresh();
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::SetHideAll()
+// ----------------------------------------------------------------------------
+//
+void CMuiuDynamicSettingsArray::SetHideAll(
+ const TBool aHide,
+ const TBool aUpdate )
+ {
+ // When hiding all, search through all subfolders and allow the state
+ // change
+ TMuiuFlags search;
+ search.SetFlag( CMuiuDynamicSettingsItemFinder::EFinderSearchSubFolders );
+ search.SetFlag( CMuiuDynamicSettingsItemFinder::EFinderSearchAll );
+ iFinder->SetSearchFlags( search );
+
+ // Try to hide items and panic in any error
+ TRAPD( error, iFinder->StartSearchL( *iItemArray, KErrNotFound ) );
+ if ( error != KErrNone )
+ {
+ __ASSERT_DEBUG( EFalse,
+ User::Panic( KMuiuDynSettingsArrayPanic, error ) );
+ }
+
+ // Do hide action
+ DoHideItems( aHide );
+
+ // Handle the array change
+ if ( aUpdate )
+ {
+ Refresh();
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::SetHideItem()
+// ----------------------------------------------------------------------------
+//
+void CMuiuDynamicSettingsArray::SetHideItem(
+ const TBool aHide,
+ const TInt aIndex,
+ const TBool aUpdate )
+ {
+ GetItem( aIndex )->iItemFlags.ChangeFlag( EMuiuDynItemHidden, aHide );
+
+ // Handle the array change
+ if ( aUpdate )
+ {
+ Refresh();
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::SetHideItem()
+// ----------------------------------------------------------------------------
+//
+void CMuiuDynamicSettingsArray::SetHideItem(
+ const TBool aHide,
+ const TUid& aId,
+ const TBool aUpdate )
+ {
+ GetItem( aId )->iItemFlags.ChangeFlag( EMuiuDynItemHidden, aHide );
+
+ // Handle the array change
+ if ( aUpdate )
+ {
+ Refresh();
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::SetHideItemsExceptIn()
+// ----------------------------------------------------------------------------
+//
+void CMuiuDynamicSettingsArray::SetHideItemsExceptIn(
+ const TBool aHide,
+ const TInt aResource,
+ const TBool aUpdate )
+ {
+ // When hiding all, search through all subfolders and allow the state
+ // change
+ TMuiuFlags search;
+ search.SetFlag( CMuiuDynamicSettingsItemFinder::EFinderSearchSubFolders );
+ search.SetFlag( CMuiuDynamicSettingsItemFinder::EFinderExlusiveSearch );
+ search.SetFlag( CMuiuDynamicSettingsItemFinder::EFinderResourceSearch );
+ iFinder->SetSearchFlags( search );
+
+ // Try to hide items and panic in any error
+ TRAPD( error, iFinder->StartSearchL( *iItemArray, aResource ) );
+ if ( error != KErrNone )
+ {
+ __ASSERT_DEBUG( EFalse,
+ User::Panic( KMuiuDynSettingsArrayPanic, error ) );
+ }
+
+ // Do hide action
+ DoHideItems( aHide );
+
+ // Handle the array change
+ if ( aUpdate )
+ {
+ Refresh();
+ }
+ }
+
+/******************************************************************************
+
+ Item search functions
+
+******************************************************************************/
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::InitDefaultSearch()
+// ----------------------------------------------------------------------------
+//
+void CMuiuDynamicSettingsArray::InitDefaultSearch(
+ const TBool aExcludeHidden ) const
+ {
+ // In default search, subfolders are included and hidden items are not
+ // included into the search
+ TMuiuFlags search;
+ search.SetFlag( CMuiuDynamicSettingsItemFinder::EFinderSearchSubFolders );
+ search.ChangeFlag(
+ CMuiuDynamicSettingsItemFinder::EFinderDoHideCheck, aExcludeHidden );
+ iFinder->SetSearchFlags( search );
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::ItemIndex()
+// ----------------------------------------------------------------------------
+//
+TInt CMuiuDynamicSettingsArray::ItemIndex(
+ const TUid& aId,
+ const TBool aExcludeHidden ) const
+ {
+ InitDefaultSearch( aExcludeHidden );
+
+ // Try to make the search, but if the search fails, allow caller
+ // to handle the result
+ TRAP_IGNORE( iFinder->StartSearchL( *iItemArray, aId ) );
+
+ // Return the found item
+ return iFinder->FinderArray()->At( 0 ).iIndex;
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::GetItem()
+// ----------------------------------------------------------------------------
+//
+CMuiuSettingBase* CMuiuDynamicSettingsArray::GetItem(
+ const TInt aIndex,
+ const TBool aExcludeHidden ) const
+ {
+ // First search the currently active resource to array and check
+ // the given index is in the current array
+ TBool ok = aIndex < StackCountItems( aExcludeHidden );
+ __ASSERT_DEBUG( ok,
+ User::Panic( KMuiuDynSettingsArrayPanic, KErrOverflow ) );
+ __ASSERT_DEBUG( aIndex >= 0,
+ User::Panic( KMuiuDynSettingsArrayPanic, KErrUnderflow ) );
+
+ // Return the found item
+ return ok ? iFinder->FinderArray()->At( aIndex ).iItem : NULL;
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::GetItem()
+// ----------------------------------------------------------------------------
+//
+CMuiuSettingBase* CMuiuDynamicSettingsArray::GetItem(
+ const TUid& aId,
+ const TBool aExcludeHidden ) const
+ {
+ InitDefaultSearch( aExcludeHidden );
+
+ // Try to make the search, but if the search fails, allow caller
+ // to handle the result
+ TRAP_IGNORE( iFinder->StartSearchL( *iItemArray, aId ) );
+
+ // Return the found item
+ return iFinder->FinderArray()->At( 0 ).iItem;
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::GetSubItem()
+// ----------------------------------------------------------------------------
+//
+CMuiuSettingBase* CMuiuDynamicSettingsArray::GetSubItem(
+ const CMuiuSettingBase& aBaseItem,
+ const TUid& aId,
+ const TBool aExcludeHidden ) const
+ {
+ // Make sure the item has subitems
+ if ( ItemSubItemCheck( aBaseItem ) )
+ {
+ // Convert the item to link item
+ const CMuiuSettingsLink* link =
+ static_cast<const CMuiuSettingsLink*>( &aBaseItem );
+
+ // Get item count
+ TInt count = link->iItemLinkArray ?
+ link->iItemLinkArray->Count() : KErrNotFound;
+
+ // Find the item from the array
+ while ( --count >= 0)
+ {
+ CMuiuSettingBase* base = ( *link->iItemLinkArray )[count];
+
+ if ( IsVisibleCheck( aBaseItem, aExcludeHidden ) &&
+ base->iItemId == aId )
+ {
+ return base;
+ }
+ }
+ }
+
+ return NULL;
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::GetSubItem()
+// ----------------------------------------------------------------------------
+//
+CMuiuSettingBase* CMuiuDynamicSettingsArray::GetSubItem(
+ const CMuiuSettingBase& aBaseItem,
+ const TInt aIndex,
+ const TBool aExcludeHidden ) const
+ {
+ CMuiuSettingBase* base = NULL;
+
+ // Make sure the item has subitems
+ if ( ItemSubItemCheck( aBaseItem ) )
+ {
+ // Convert the item to link item
+ const CMuiuSettingsLink* link =
+ static_cast<const CMuiuSettingsLink*>( &aBaseItem );
+
+ // Get the item count and make sure the required index is
+ // below the number of items
+ TInt count = link->iItemLinkArray ?
+ link->iItemLinkArray->Count() : KErrNotFound;
+ count = ( aIndex >= 0 && aIndex < count ) ? count : KErrNotFound;
+ TInt index = KErrNotFound;
+ TInt item = 0;
+
+ for ( ; index != aIndex && item < count; item++ )
+ {
+ base = ( *link->iItemLinkArray )[item];
+
+ if ( IsVisibleCheck( *base, aExcludeHidden ) )
+ {
+ index++;
+ }
+ }
+
+ // At the end of the items and still not found
+ if ( item == count && index != aIndex )
+ {
+ base = NULL;
+ }
+ }
+
+ return base;
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsDialog::GetSubItemIndex()
+// ----------------------------------------------------------------------------
+//
+TInt CMuiuDynamicSettingsArray::GetSubItemIndex(
+ const CMuiuSettingsLink& aLinkItem,
+ const TUid& aId,
+ const TBool aExcludeHidden ) const
+ {
+ TBool found = EFalse;
+ TInt index = KErrNotFound;
+
+ if ( aLinkItem.iItemLinkArray )
+ {
+ CMuiuSettingBase* subItem = NULL;
+
+ const TInt items = aLinkItem.iItemLinkArray->Count();
+ TInt button = KErrNotFound;
+
+ // Seek the item id and return its index
+ while ( !found && ++button < items )
+ {
+ subItem = ( *aLinkItem.iItemLinkArray )[button];
+
+ // Ignore hidden items AND item is not hidden OR
+ // check all the items
+ if ( IsVisibleCheck( *subItem, aExcludeHidden ) )
+ {
+ ++index;
+
+ found = ( subItem->iItemId == aId );
+ }
+ }
+ }
+
+ return found ? index : KErrNotFound;
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsDialog::GetSubItemIndex()
+// ----------------------------------------------------------------------------
+//
+TInt CMuiuDynamicSettingsArray::GetSubItemIndex(
+ const CMuiuSettingsLink& aLinkItem,
+ const TInt aIndex,
+ const TBool aActualIndex ) const
+ {
+ TInt result = KErrNotFound;
+
+ if ( aLinkItem.iItemLinkArray )
+ {
+ CMuiuSettingBase* radioButton = NULL;
+ TInt visibleCount = KErrNotFound;
+ TInt resourceCount = KErrNotFound;
+
+ TInt items = aLinkItem.iItemLinkArray->Count();
+
+ for ( TInt index = 0; result < 0 && index < items; index++ )
+ {
+ radioButton = ( *aLinkItem.iItemLinkArray )[index];
+
+ resourceCount++;
+ if ( !IsHidden( *radioButton ) )
+ {
+ visibleCount++;
+ }
+
+ if ( aActualIndex )
+ {
+ if ( aIndex == visibleCount )
+ {
+ result = resourceCount;
+ }
+ }
+ else
+ {
+ if ( aIndex == resourceCount )
+ {
+ result = visibleCount;
+ }
+ }
+ }
+ }
+
+ return result;
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::SearchResourceL()
+// ----------------------------------------------------------------------------
+//
+void CMuiuDynamicSettingsArray::SearchResourceL(
+ const TInt aResourceId,
+ const TBool aExcludeHidden ) const
+ {
+ // When hiding all, search through all subfolders and allow the state
+ // change
+ TMuiuFlags search;
+ search.SetFlag( CMuiuDynamicSettingsItemFinder::EFinderSearchSubFolders );
+ search.SetFlag( CMuiuDynamicSettingsItemFinder::EFinderResourceSearch );
+ search.ChangeFlag(
+ CMuiuDynamicSettingsItemFinder::EFinderDoHideCheck, aExcludeHidden );
+ iFinder->SetSearchFlags( search );
+
+ // Try to hide items and panic in any error
+ TRAPD( error, iFinder->StartSearchL( *iItemArray, aResourceId ) );
+ if ( error != KErrNone )
+ {
+ __ASSERT_DEBUG( EFalse,
+ User::Panic( KMuiuDynSettingsArrayPanic, error ) );
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::GetResource()
+// ----------------------------------------------------------------------------
+//
+CMuiuDynFinderItemArray* CMuiuDynamicSettingsArray::GetResource(
+ const TInt aResourceId,
+ const TBool aExcludeHidden ) const
+ {
+ // Start the resource search
+ TRAP_IGNORE( SearchResourceL( aResourceId, aExcludeHidden ) );
+
+ // Return the pointer to array
+ return iFinder->FinderArray();
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::GetResourceLC()
+// ----------------------------------------------------------------------------
+//
+CMuiuDynFinderItemArray* CMuiuDynamicSettingsArray::GetResourceLC(
+ const TInt aResourceId,
+ const TBool aExcludeHidden ) const
+ {
+ // Start the resource search
+ SearchResourceL( aResourceId, aExcludeHidden );
+ TMuiuFlags search = iFinder->SearchFlags();
+ search.SetFlag( CMuiuDynamicSettingsItemFinder::EFinderMoveOwnership );
+ iFinder->SetSearchFlags( search );
+
+ // Return the copy of the array
+ return iFinder->FinderArrayLC();
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::ItemSubArrayCheck()
+// ----------------------------------------------------------------------------
+//
+TBool CMuiuDynamicSettingsArray::ItemSubArrayCheck(
+ const CMuiuSettingBase& aBaseItem ) const
+ {
+ // Check if the item type is menu array
+ return aBaseItem.Type() == EMuiuDynSetMenuArray;
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::ItemSubItemCheck()
+// ----------------------------------------------------------------------------
+//
+TBool CMuiuDynamicSettingsArray::ItemSubItemCheck(
+ const CMuiuSettingBase& aBaseItem ) const
+ {
+ // if item is not any of the following types it cannot contain subitems
+ if ( aBaseItem.iItemType != EMuiuDynSetMenuArray &&
+ aBaseItem.iItemType != EMuiuDynSetRadioButtonArray &&
+ aBaseItem.iItemType != EMuiuDynSetCheckBoxArray &&
+ aBaseItem.iItemType != EMuiuDynSetUndefined &&
+ aBaseItem.iItemType != EMuiuDynSetItemMultiLine )
+ {
+ return EFalse;
+ }
+
+ const CMuiuSettingsLink* link =
+ static_cast<const CMuiuSettingsLink*>( &aBaseItem );
+
+ // If the item has an array and it contains items, return true
+ return ( link->iItemLinkArray != NULL &&
+ link->iItemLinkArray->Count() > 0 );
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::SetBetweenValues()
+// ----------------------------------------------------------------------------
+//
+void CMuiuDynamicSettingsArray::SetBetweenValues(
+ TInt& aValue,
+ TInt aMin,
+ TInt aMax ) const
+ {
+ // Make a sanity check
+ if ( aMin > aMax )
+ {
+ // Swap the values
+ TInt temp = aMin;
+ aMin = aMax;
+ aMax = temp;
+ }
+
+ // Make sure that we are above the minimum
+ if ( aValue < aMin )
+ {
+ aValue = aMin;
+ }
+
+ // Make sure that we are below the maximum
+ if ( aValue > aMax )
+ {
+ aValue = aMax;
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::Refresh()
+// ----------------------------------------------------------------------------
+//
+void CMuiuDynamicSettingsArray::Refresh()
+ {
+ if ( iArrayFlags.Flag( EMuiuDynArrayAllowRefresh ) )
+ {
+ UpdateActiveItemsCount();
+ TRAP_IGNORE( EventArrayChangedL( EMuiuDynArrayChanged ) );
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::UpdateActiveItemsCount()
+// ----------------------------------------------------------------------------
+//
+void CMuiuDynamicSettingsArray::UpdateActiveItemsCount(
+ const TInt aNewCount )
+ {
+ // If count not provided, update it manually
+ if ( aNewCount == KErrNotFound )
+ {
+ iActiveCount = StackCountItems();
+ }
+ // Just update the count
+ else
+ {
+ iActiveCount = aNewCount;
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::HandleStackForwardL()
+// ----------------------------------------------------------------------------
+//
+TMuiuStackResult CMuiuDynamicSettingsArray::HandleStackForwardL(
+ const TInt aIndex )
+ {
+ // If index is provided, append the resource to stack immediately
+ if ( aIndex != KErrNotFound )
+ {
+ TInt resource = iItemArray->At( aIndex )->iItemResourceId;
+
+ if ( resource )
+ {
+ iResourceStack->AppendL( resource );
+ }
+ else
+ {
+ return EMuiuStackResultInvalid;
+ }
+ }
+ // Otherwise find the last submenu item in the array
+ else
+ {
+ TInt index = iItemArray->Count();
+
+ while ( --index >= 0 )
+ {
+ // Check the item is menu item
+ if ( iItemArray->At( index )->iItemType == EMuiuDynSetMenuArray )
+ {
+ iResourceStack->AppendL(
+ iItemArray->At( index )->iItemResourceId );
+ index = EMuiuStackResultInvalid;
+ }
+ }
+ }
+
+ return HandleStackChangeL( ETrue );
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::HandleStackForwardL()
+// ----------------------------------------------------------------------------
+//
+TMuiuStackResult CMuiuDynamicSettingsArray::HandleStackForwardL(
+ const TUid& aId )
+ {
+ TInt index = iItemArray->Count();
+
+ // Search through the list
+ while ( --index >= 0 )
+ {
+ CMuiuSettingBase* base = iItemArray->At( index );
+
+ // Check the item is menu item
+ if ( base->iItemId == aId &&
+ base->iItemType == EMuiuDynSetMenuArray )
+ {
+ iResourceStack->AppendL( base->iItemResourceId );
+ index = KErrNotFound;
+ }
+ else
+ {
+ return EMuiuStackResultInvalid;
+ }
+ }
+
+ return HandleStackChangeL( ETrue );
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::HandleStackForwardL()
+// ----------------------------------------------------------------------------
+//
+TMuiuStackResult CMuiuDynamicSettingsArray::HandleStackForwardL(
+ const CMuiuSettingBase& aBase )
+ {
+ // Make sure the item is subarray item
+ if ( ItemSubArrayCheck( aBase ) )
+ {
+ // Make sure the array exists and it contains items
+ const CMuiuSettingsLink* link =
+ static_cast<const CMuiuSettingsLink*>( &aBase );
+ __ASSERT_DEBUG( link->iItemLinkArray != NULL,
+ User::Panic( KMuiuDynSettingsArrayPanic, KErrNotFound ) );
+ const CMuiuSettingBase* nextItem = link->iItemLinkArray->At( 0 ) ;
+ __ASSERT_DEBUG( nextItem != NULL,
+ User::Panic( KMuiuDynSettingsArrayPanic, KErrNotFound ) );
+
+ // new item has been found, check the resource is not same
+ __ASSERT_DEBUG( nextItem->iItemResourceId != StackActiveResource(),
+ User::Panic( KMuiuDynSettingsArrayPanic, KErrAlreadyExists ) );
+
+ HandleStackChangeL( ETrue, nextItem->iItemResourceId );
+
+ return EMuiuStackResultSubMenuOpen;
+ }
+
+ return EMuiuStackResultOk;
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::HandleStackBackwardL()
+// ----------------------------------------------------------------------------
+//
+TMuiuStackResult CMuiuDynamicSettingsArray::HandleStackBackwardL( TInt aCount )
+ {
+ // Remove the last item from stack number of times
+ while ( aCount-- && iResourceStack->Count() )
+ {
+ iResourceStack->Remove( iResourceStack->Count() - 1 );
+ }
+
+ return HandleStackChangeL( EFalse );
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::HandleStackChangeL()
+// ----------------------------------------------------------------------------
+//
+TMuiuStackResult CMuiuDynamicSettingsArray::HandleStackChangeL(
+ const TInt aForward,
+ const TInt aResourceId )
+ {
+ // If resource id not provided
+ if ( aResourceId != KErrNotFound )
+ {
+ iResourceStack->AppendL( aResourceId );
+ }
+
+ // Update the active count
+ UpdateActiveItemsCount();
+
+ // Inform of the array change
+ EventArrayChangedL(
+ aForward ? EMuiuDynArrayStackForward : EMuiuDynArrayStackBackward );
+
+ return EMuiuStackResultOk;
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::StackCountItems()
+// ----------------------------------------------------------------------------
+//
+TInt CMuiuDynamicSettingsArray::StackCountItems(
+ const TBool aExcludeHidden ) const
+ {
+ // Set the array finder to contain the current resource in array
+ GetResource( StackActiveResource(), aExcludeHidden );
+
+ return iFinder->FinderArray()->Count();
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::StackActiveResource()
+// ----------------------------------------------------------------------------
+//
+TInt CMuiuDynamicSettingsArray::StackActiveResource() const
+ {
+ return ( *iResourceStack )[iResourceStack->Count() - 1];
+ }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsArray::IsVisibleCheck()
+// ----------------------------------------------------------------------------
+//
+TBool CMuiuDynamicSettingsArray::IsVisibleCheck(
+ const CMuiuSettingBase& aBaseItem,
+ const TBool aExcludeHidden ) const
+ {
+ return ( aExcludeHidden && !IsHidden( aBaseItem ) || !aExcludeHidden );
+ }
+
+// End of File
+