diff -r 000000000000 -r 72b543305e3a email/imum/Utils/Src/MuiuDynamicSettingsArray.cpp --- /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 // Base symbian include +#include // KColumnListSeparator +#include // EikResourceUtils +#include // AknTextUtils +#include // 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 +#include +#include +#include + +#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( + &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( + &aBaseItem )->iItemSettingText->Left( KMuiuDynVisibleTextLength ); + } + +// ---------------------------------------------------------------------------- +// CMuiuDynamicSettingsArray::ListboxRadioButtonFillArrayLabel() +// ---------------------------------------------------------------------------- +// +void CMuiuDynamicSettingsArray::ListboxRadioButtonFillArrayLabel( + const CMuiuSettingBase& aBaseItem, + TMuiuSettingsText& aText ) const + { + aText = static_cast( + &aBaseItem )->iItemSettingText->Left( KMuiuDynVisibleTextLength ); + } + +// ---------------------------------------------------------------------------- +// CMuiuDynamicSettingsArray::ListboxCheckboxFillArrayLabel() +// ---------------------------------------------------------------------------- +// +void CMuiuDynamicSettingsArray::ListboxCheckboxFillArrayLabel( + const CMuiuSettingBase& aBaseItem, + TMuiuSettingsText& aText ) const + { + aText = static_cast( + &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( + &aBaseItem )->iItemSettingText->Copy( aText ); + break; + + case EMuiuDynSetRadioButtonArray: + case EMuiuDynSetCheckBoxArray: + static_cast( + &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( + &aBaseItem )->iItemSettingText; + + case EMuiuDynSetRadioButtonArray: + case EMuiuDynSetCheckBoxArray: + return static_cast( + &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( 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( &aBaseItem ); + text->iItemMaxLength = aMaxLength; + if( aEmptyText ) + { + text->SetEmptyText( *aEmptyText ); + } + } + +// ---------------------------------------------------------------------------- +// CMuiuDynamicSettingsArray::UpdateItemEditValueL() +// ---------------------------------------------------------------------------- +// +void CMuiuDynamicSettingsArray::UpdateItemEditValueL( + CMuiuSettingBase& aBaseItem, + const TInt aMaxLength ) + { + CMuiuSettingsEditValue* value = + static_cast( &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( &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( 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( &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( &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( &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( &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 +