diff -r 8bda91a87a00 -r 8ee96d21d9bf gssettingsuis/Gs/GSListBox/Src/GSListBox.cpp --- a/gssettingsuis/Gs/GSListBox/Src/GSListBox.cpp Thu Aug 19 10:12:30 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,740 +0,0 @@ -/* -* Copyright (c) 2003-2005 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: Class declaration for CGSListboxEntry & CGSItemTextArray. -* -*/ - -// INCLUDES -#include "gslistbox.h" -#include "gscommon.hrh" - -#include -#include - - -// CONSTANTS -const TInt KGSListboxModelGranularity = 5; -_LIT(KGSEngineItemArrayPanic, "GSEngItemArray"); - -// Panic enum -enum TGSEngineItemArrayPanic - { - EGSEngineItemArrayPanicNoRadioSettingsPage = 0, - }; - -/*================================================ -* -* class declaration for CGSListboxEntry -* -*================================================*/ - - -//------------------------------------------------------------------------------ -// CGSListboxEntry::NewLC() -// Symbian OS two-phased constructor -//------------------------------------------------------------------------------ -EXPORT_C CGSListboxEntry* CGSListboxEntry::NewLC( TResourceReader& aReader ) - { - CGSListboxEntry* self = new (ELeave) CGSListboxEntry; - CleanupStack::PushL( self ); - self->ConstructL( aReader ); - return self; - } - -//------------------------------------------------------------------------------ -// CGSListboxEntry::NewLC() -// Symbian OS two-phased constructor -//------------------------------------------------------------------------------ -EXPORT_C CGSListboxEntry* CGSListboxEntry::NewLC( TInt aFeatureId ) - { - CGSListboxEntry* self = new (ELeave) CGSListboxEntry; - CleanupStack::PushL( self ); - self->iFeatureId = aFeatureId; - return self; - } - -//------------------------------------------------ -// CGSListboxEntry::NewLC() -// Symbian OS two-phased constructor -//------------------------------------------------ -EXPORT_C CGSListboxEntry* CGSListboxEntry::NewLC( - TUint32 aResId, CCoeEnv& aEnv, TInt aFeatureId ) - { - CGSListboxEntry* self = new (ELeave) CGSListboxEntry; - CleanupStack::PushL( self ); - self->ConstructL( aResId, aEnv, aFeatureId ); - return self; - } - -//------------------------------------------------ -// CGSListboxEntry::ConstructL() -// Symbian OS 2nd phase constructor -//------------------------------------------------ -void CGSListboxEntry::ConstructL( - TUint32 aResId, CCoeEnv& aEnv, TInt aFeatureId ) - { - // Create resource reader - TResourceReader reader; - aEnv.CreateResourceReaderLC( reader, aResId ); - - // Just read, not actually needed anywhere - reader.ReadInt16(); - - // Take base settings from resources - iCaption = reader.ReadHBufCL(); - iStaticTextLength = iCaption->Length(); - iFeatureId = aFeatureId + reader.ReadInt16(); - iType = reader.ReadInt8(); - - CleanupStack::PopAndDestroy(); //reader - } - -//------------------------------------------------------------------------------ -// CGSListboxEntry::ConstructL() -// Symbian OS 2nd phase constructor -//------------------------------------------------------------------------------ -void CGSListboxEntry::ConstructL( TResourceReader& aReader ) - { - iCaption = aReader.ReadHBufCL(); - iStaticTextLength = iCaption->Length(); - iFeatureId = aReader.ReadInt16(); - iType = aReader.ReadInt8(); - } - -//------------------------------------------------------------------------------ -// CGSListboxEntry() -// c++ default constructor -//------------------------------------------------------------------------------ -CGSListboxEntry::CGSListboxEntry() - { - } - -//------------------------------------------------------------------------------ -// ~CGSListboxEntry() -// destructor -//------------------------------------------------------------------------------ -EXPORT_C CGSListboxEntry::~CGSListboxEntry() - { - delete iCaption; - } - -//------------------------------------------------------------------------------ -// CGSListboxEntry::Feature() -// Provides feature for the selected entry -// @return feature -//------------------------------------------------------------------------------ -EXPORT_C TInt CGSListboxEntry::FeatureId() const - { - return iFeatureId; - } - -//------------------------------------------------------------------------------ -// CGSListboxEntry::Caption -// Provides caption for the selected entry -// @return caption -//------------------------------------------------------------------------------ -EXPORT_C const TDesC& CGSListboxEntry::Caption() const - { - return *iCaption; - } - -//------------------------------------------------------------------------------ -// CGSListboxEntry::Type -// Provides type for the selected entry -// @return type -//------------------------------------------------------------------------------ -EXPORT_C TInt CGSListboxEntry::Type() const - { - return iType; - } - -//------------------------------------------------------------------------------ -// CGSListboxEntry::SetDynamicTextL -// Appends dynamic text to the static text read -// from the resource. -//------------------------------------------------------------------------------ -EXPORT_C void CGSListboxEntry::SetDynamicTextL( const TDesC& aText ) - { - const TInt requiredLength = StaticTextLength() + aText.Length(); - // - TPtr pCaption( iCaption->Des() ); - const TInt maxLength = pCaption.MaxLength(); - // - if( requiredLength >= maxLength ) - { - // Make enough room for static text + new dynamic text - iCaption = iCaption->ReAllocL( requiredLength ); - } - - // Have to re-get a new modifiable descriptor for the HBufC* since the - // memory address may have changed after the realloc. - pCaption.Set( iCaption->Des() ); - - // Set the length back to only the static part - pCaption.SetLength( StaticTextLength() ); - pCaption.Append( aText ); - } - - -//------------------------------------------------------------------------------ -// CGSListboxEntry::SetDynamicTextDoublePaneL -// Appends dynamic text to the static text read -// from the resource. -//------------------------------------------------------------------------------ -EXPORT_C void CGSListboxEntry::SetDynamicTextDoublePaneL( const TDesC& aText ) - { - const TInt requiredLength = StaticTextLength() + aText.Length(); - // - TPtr pCaption( iCaption->Des() ); - const TInt maxLength = pCaption.MaxLength(); - const TInt textSize = aText.Length(); - TInt location; - - // Here if it is the NULL string then we track of the - // Default text size in iDynamicTextSize - if ( textSize > 0 ) - { - iDynamicTextSize = textSize; - // this location is also preserved for the same purpose - location = aText.Locate( aText[0] ); - } - else - { - location = KErrNotFound; - } - // - if ( location == KErrNotFound ) - { - // We take the value from the end of the string - location = pCaption.LocateReverse('\t'); - // We then delete the string; - // iDynamicTextSize is the size of the "Default" text i.e. 7 - // 1 is added bcos \tText\t\t for the last tab - pCaption.Delete( location - ( iDynamicTextSize + 1 ), iDynamicTextSize ); - } - else - { - if( requiredLength >= maxLength ) - { - // Make enough room for static text + new dynamic text - iCaption = iCaption->ReAllocL( requiredLength ); - } - - // Have to re-get a new modifiable descriptor for the HBufC* since the - // memory address may have changed after the realloc. - pCaption.Set( iCaption->Des() ); - location = pCaption.LocateReverse('\t'); - pCaption.Insert( ( location - 1 ), aText ); - } - } -//... HERE IT ENDS -/*================================================ -* -* class declaration for CGSItemTextArray -* -*================================================*/ - -//------------------------------------------------------------------------------ -// CGSItemTextArray::NewLC() -// Symbian OS two-phased constructor -//------------------------------------------------------------------------------ -EXPORT_C CGSItemTextArray* CGSItemTextArray::NewL( TUint32 aResId, - CCoeEnv& aEnv ) - { - CGSItemTextArray* self = - new (ELeave) CGSItemTextArray( ); - CleanupStack::PushL( self ); - self->ConstructL( aResId, aEnv ); - CleanupStack::Pop( self ); - - return self; - } - - -//------------------------------------------------------------------------------ -// CGSItemTextArray() -// constructor -//------------------------------------------------------------------------------ -CGSItemTextArray::CGSItemTextArray() -: iAllEntries( KGSListboxModelGranularity ), - iCurrentlyDisplayedEntries( KGSListboxModelGranularity ) - { - } - - -//------------------------------------------------------------------------------ -// ~CGSItemTextArray() -// destructor -//------------------------------------------------------------------------------ -CGSItemTextArray::~CGSItemTextArray() - { - iCurrentlyDisplayedEntries.Close(); - iAllEntries.ResetAndDestroy(); - iAllEntries.Close(); - } - - -//------------------------------------------------------------------------------ -// CGSItemTextArray::ConstructL() -// Symbian OS two-phased constructor -//------------------------------------------------------------------------------ -void CGSItemTextArray::ConstructL( TUint32 aResId, CCoeEnv& aEnv ) - { - TResourceReader reader; - aEnv.CreateResourceReaderLC( reader, aResId ); - // - const TInt count = reader.ReadInt16(); - for( TInt i = 0; i < count; i++ ) - { - CGSListboxEntry* entry = CGSListboxEntry::NewLC( reader ); - User::LeaveIfError( iAllEntries.Append( entry ) ); - - // Always visible items are added here and never removed - if ( entry->Type() == EGSListBoxItemTypeIsAlwaysVisible ) - { - User::LeaveIfError( iCurrentlyDisplayedEntries.Append( entry ) ); - } - // - CleanupStack::Pop( entry ); - } - - CleanupStack::PopAndDestroy(); //reader - } - -//------------------------------------------------ -// CGSItemTextArray::ConstructL() -// Symbian OS two-phased constructor -//------------------------------------------------ -void CGSItemTextArray::ConstructL( - TUint32 aResId, CCoeEnv& aEnv, TInt aCount ) - { - // Create entries and append them to entrylist. - for( TInt i = 0; i < aCount; i++ ) - { - CGSListboxEntry* entry = CGSListboxEntry::NewLC( aResId, aEnv, i ); - User::LeaveIfError( iAllEntries.Append( entry ) ); - CleanupStack::Pop( entry ); - } - } - -//------------------------------------------------------------------------------ -// CGSItemTextArray::MdcaCount() -// from MDesCArray -// @return count -//------------------------------------------------------------------------------ -EXPORT_C TInt CGSItemTextArray::MdcaCount() const - { - const TInt count = iCurrentlyDisplayedEntries.Count(); - return count; - } - -//------------------------------------------------------------------------------ -// CGSItemTextArray::MdcaPoint() -// from MDesCArray -// @return item text -//------------------------------------------------------------------------------ -EXPORT_C TPtrC CGSItemTextArray::MdcaPoint( TInt aIndex ) const - { - const TPtrC ret( iCurrentlyDisplayedEntries[aIndex]->Caption() ); - return ret; - } - - -//------------------------------------------------------------------------------ -// CGSItemTextArray::SetDynamicTextL() -// Appends dynamic text to a selected listbox item -// -//------------------------------------------------------------------------------ -EXPORT_C void CGSItemTextArray::SetDynamicTextL( TInt aFeatureId, - const TDesC& aAdditionalText ) - { - TIdentityRelation relation(CompareEntries); - // - CGSListboxEntry* entryToSearchFor = CGSListboxEntry::NewLC( aFeatureId ); - const TInt index = iAllEntries.Find( entryToSearchFor, relation ); - CleanupStack::PopAndDestroy( entryToSearchFor ); - User::LeaveIfError( index ); - // - CGSListboxEntry* entry = iAllEntries[index]; - entry->SetDynamicTextL( aAdditionalText ); - } - -//------------------------------------------------------------------------------ -// CGSItemTextArray::SetDynamicTextDoublePaneL() -// Appends dynamic text to a selected listbox item -// -//------------------------------------------------------------------------------ -EXPORT_C void CGSItemTextArray::SetDynamicTextDoublePaneL( TInt aFeatureId, - const TDesC& aAdditionalText ) - { - TIdentityRelation relation(CompareEntries); - // - CGSListboxEntry* entryToSearchFor = CGSListboxEntry::NewLC( aFeatureId ); - const TInt index = iAllEntries.Find( entryToSearchFor, relation ); - CleanupStack::PopAndDestroy( entryToSearchFor ); - User::LeaveIfError( index ); - // - CGSListboxEntry* entry = iAllEntries[index]; - entry->SetDynamicTextDoublePaneL( aAdditionalText ); - } -//*****ENDS HERE - -//------------------------------------------------------------------------------ -// CGSItemTextArray::SetItemVisibilityL() -// Indicates whether an item is to be shown/hidden -// -//------------------------------------------------------------------------------ -EXPORT_C void CGSItemTextArray::SetItemVisibilityL( TInt aFeatureId, - TVisibility aVisibility ) - { - TIdentityRelation relation( CompareEntries ); - CGSListboxEntry* entryToSearchFor = CGSListboxEntry::NewLC( aFeatureId ); - // - if ( aVisibility == EInvisible ) - { - const TInt index = iCurrentlyDisplayedEntries.Find( entryToSearchFor, - relation ); - if ( index != KErrNotFound ) - { - // Remove the item from the currently visible items array - iCurrentlyDisplayedEntries.Remove( index ); - } - } - else if ( aVisibility == EVisible ) - { - // Check its not already visible - const TInt alreadyVisibleIndex = iCurrentlyDisplayedEntries.Find( - entryToSearchFor, relation ); - if ( alreadyVisibleIndex == KErrNotFound ) - { - const TInt index = iAllEntries.Find( entryToSearchFor, relation ); - User::LeaveIfError( index ); - - // This is the entry we are going to make visible - CGSListboxEntry* entry = iAllEntries[index]; - - // Now insert it at the correct location. - TBool foundInsertionPoint = EFalse; - const TInt currentEntriesCount = iCurrentlyDisplayedEntries.Count(); - for( TInt allEntriesIndex=index-1; allEntriesIndex>=0 && - !foundInsertionPoint; allEntriesIndex-- ) - { - // We are going to try and insert the new entry after the entry - // specified as the previous item in the 'all entries' array, - // in the iCurrentlyDisplayedEntries array. - const TInt featureIdOfPreviousItem = - iAllEntries[allEntriesIndex]->FeatureId(); - - for( TInt currentEntriesIndex=0; !foundInsertionPoint && - currentEntriesIndexFeatureId() == featureIdOfPreviousItem ) - { - foundInsertionPoint = ETrue; - // Insert after this item - User::LeaveIfError( iCurrentlyDisplayedEntries.Insert( - entry, currentEntriesIndex+1 ) ); - } - } - - } - - if (!foundInsertionPoint) - { - // Just insert the item at the top of the list - User::LeaveIfError( - iCurrentlyDisplayedEntries.Insert( entry, 0 ) ); - } - } - } - CleanupStack::PopAndDestroy( entryToSearchFor ); - } - - -//------------------------------------------------------------------------------ -// CGSItemTextArray::CurrentFeature() -// Obtains feature id for a selected listbox item (feature) -// @return feature id -//------------------------------------------------------------------------------ -EXPORT_C TInt CGSItemTextArray::CurrentFeature() const - { - return KErrNotFound; - } - - -//------------------------------------------------------------------------------ -// CGSItemTextArray::IndexForFeatureId() -// -// @return index -//------------------------------------------------------------------------------ -EXPORT_C TInt CGSItemTextArray::IndexForFeatureIdL(TInt aFeatureId) const - { - TIdentityRelation relation( CompareEntries ); - CGSListboxEntry* entryToSearchFor = CGSListboxEntry::NewLC( aFeatureId ); - // - const TInt index = iCurrentlyDisplayedEntries.Find( entryToSearchFor, - relation ); - CleanupStack::PopAndDestroy( entryToSearchFor ); - // - return index; - } - - -//------------------------------------------------------------------------------ -// CGSItemTextArray::FeatureIdByIndexL() -// -// @return index -//------------------------------------------------------------------------------ -EXPORT_C TInt CGSItemTextArray::FeatureIdByIndex(TInt aIndex) const - { - TInt featureId = KErrNotFound; - // - const TInt currentEntriesCount = iCurrentlyDisplayedEntries.Count(); - if (aIndex >= 0 && aIndex < currentEntriesCount) - { - featureId = iCurrentlyDisplayedEntries[ aIndex ]->FeatureId(); - } - // - return featureId; - } - - -//------------------------------------------------------------------------------ -// CGSItemTextArray::FeatureById() -// -// @return feature -//------------------------------------------------------------------------------ -EXPORT_C const CGSListboxEntry* CGSItemTextArray::FeatureByIdL( - TInt aFeatureId ) const - { - const CGSListboxEntry* locatedEntry = NULL; - // - TIdentityRelation relation( CompareEntries ); - CGSListboxEntry* entryToSearchFor = CGSListboxEntry::NewLC( aFeatureId ); - // - const TInt index = iAllEntries.Find( entryToSearchFor, - relation ); - if ( index != KErrNotFound ) - { - locatedEntry = iAllEntries[ index ]; - } - CleanupStack::PopAndDestroy( entryToSearchFor ); - // - return locatedEntry; - } - - -//------------------------------------------------------------------------------ -// CGSItemTextArray::GetItemCaptionFromFeatureIdLC() -// -// @return feature's caption -//------------------------------------------------------------------------------ -EXPORT_C HBufC* CGSItemTextArray::GetItemCaptionFromFeatureIdLC( - TUint32 aResourceId, - TInt aFeatureId, - CCoeEnv& aCone ) - { - HBufC* caption = NULL; - // - CGSItemTextArray* items = CGSItemTextArray::NewL( aResourceId, aCone ); - CleanupStack::PushL( items ); - const CGSListboxEntry* entry = items->FeatureByIdL( aFeatureId ); - // - if ( entry ) - { - caption = entry->Caption().AllocL(); - } - else - { - caption = KNullDesC().AllocL(); - } - // - CleanupStack::PopAndDestroy( items ); - CleanupStack::PushL( caption ); - return caption; - } - - -//------------------------------------------------------------------------------ -// CGSItemTextArray::CompareEntries() -// Compares feature id's to check if they are the same -// @return boolean -//------------------------------------------------------------------------------ -TBool CGSItemTextArray::CompareEntries(const CGSListboxEntry& aLeft, - const CGSListboxEntry& aRight) - { - return aLeft.FeatureId() == aRight.FeatureId(); - } - - - - - - - -/*================================================ -* -* class declaration for CGSListBoxItemTextArray -* -*================================================*/ - -//------------------------------------------------------------------------------ -// CGSListBoxItemTextArray::NewLC() -// Symbian OS two-phased constructor -//------------------------------------------------------------------------------ -EXPORT_C CGSListBoxItemTextArray* CGSListBoxItemTextArray::NewL( TUint32 aResId, - CEikListBox& aListBox, - CCoeEnv& aEnv ) - { - CGSListBoxItemTextArray* self = - new (ELeave) CGSListBoxItemTextArray( aListBox ); - CleanupStack::PushL( self ); - self->ConstructL( aResId, aEnv ); - CleanupStack::Pop( self ); - - return self; - } - -//------------------------------------------------ -// CGSListBoxItemTextArray::NewL() -// Symbian OS two-phased constructor -//------------------------------------------------ -EXPORT_C CGSListBoxItemTextArray* CGSListBoxItemTextArray::NewL( - TUint32 aResId, CEikListBox& aListBox, CCoeEnv& aEnv, TInt aCount ) - { - CGSListBoxItemTextArray* self = - new (ELeave) CGSListBoxItemTextArray( aListBox ); - CleanupStack::PushL( self ); - self->ConstructL( aResId, aEnv, aCount ); - CleanupStack::Pop( self ); - - return self; - } - -//------------------------------------------------------------------------------ -// CGSListBoxItemTextArray() -// constructor -//------------------------------------------------------------------------------ -CGSListBoxItemTextArray::CGSListBoxItemTextArray( CEikListBox& aListBox ) -: iListBox( aListBox ) - { - } - - -//------------------------------------------------------------------------------ -// CGSListBoxItemTextArray::CurrentFeature() -// -// Obtains feature id for a selected listbox item (feature) -// @return feature id -//------------------------------------------------------------------------------ -EXPORT_C TInt CGSListBoxItemTextArray::CurrentFeature() const - { - TInt featureId = KErrNotFound; - const TInt listBoxCurrentItemIndex = iListBox.CurrentItemIndex(); - const TInt count = iCurrentlyDisplayedEntries.Count(); - if ( listBoxCurrentItemIndex >= 0 && listBoxCurrentItemIndex < count ) - { - const CGSListboxEntry* entry = - iCurrentlyDisplayedEntries[ listBoxCurrentItemIndex ]; - featureId = entry->FeatureId(); - } - return featureId; - } - - - - - - - - - -/*================================================ -* -* class declaration for CGSRadioButtonSettingPageItemTextArray -* -*================================================*/ - -//------------------------------------------------------------------------------ -// CGSRadioButtonSettingPageItemTextArray::NewL() -// -// Symbian OS two-phased constructor -//------------------------------------------------------------------------------ -EXPORT_C CGSRadioButtonSettingPageItemTextArray* - CGSRadioButtonSettingPageItemTextArray::NewL( TUint32 aResId, - CCoeEnv& aEnv, - CAknRadioButtonSettingPage* aSettingPage ) - { - CGSRadioButtonSettingPageItemTextArray* self = - new (ELeave) CGSRadioButtonSettingPageItemTextArray( aSettingPage ); - CleanupStack::PushL( self ); - self->ConstructL( aResId, aEnv ); - CleanupStack::Pop( self ); - - return self; - } - - -//------------------------------------------------------------------------------ -// CGSRadioButtonSettingPageItemTextArray() -// -// constructor -//------------------------------------------------------------------------------ -CGSRadioButtonSettingPageItemTextArray::CGSRadioButtonSettingPageItemTextArray ( - CAknRadioButtonSettingPage* aSettingPage ) -: iSettingPage( aSettingPage ) - { - } - - -//------------------------------------------------------------------------------ -// CGSRadioButtonSettingPageItemTextArray::SetRadioButtonSettingPage() -// -// -//------------------------------------------------------------------------------ -EXPORT_C void CGSRadioButtonSettingPageItemTextArray::SetRadioButtonSettingPage ( - CAknRadioButtonSettingPage& aSettingPage ) - { - iSettingPage = &aSettingPage; - } - - -//------------------------------------------------------------------------------ -// CGSRadioButtonSettingPageItemTextArray::CurrentFeature() -// Obtains feature id for a selected listbox item (feature) -// @return feature id -//------------------------------------------------------------------------------ -EXPORT_C TInt CGSRadioButtonSettingPageItemTextArray::CurrentFeature() const - { - __ASSERT_ALWAYS(iSettingPage, User::Panic( KGSEngineItemArrayPanic, - EGSEngineItemArrayPanicNoRadioSettingsPage ) ); - - TInt featureId = KErrNotFound; - - const TInt listBoxCurrentItemIndex = - iSettingPage->ListBoxControl()->CurrentItemIndex(); - const TInt count = iCurrentlyDisplayedEntries.Count(); - if ( listBoxCurrentItemIndex >= 0 && listBoxCurrentItemIndex < count ) - { - const CGSListboxEntry* entry = - iCurrentlyDisplayedEntries[ listBoxCurrentItemIndex ]; - featureId = entry->FeatureId(); - } - return featureId; - } - -//End of File