gssettingsuis/Gs/GSFramework/src/GSParentContainer.cpp
branchRCL_3
changeset 54 7e0eff37aedb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gssettingsuis/Gs/GSFramework/src/GSParentContainer.cpp	Wed Sep 01 12:20:44 2010 +0100
@@ -0,0 +1,891 @@
+/*
+* Copyright (c) 2005-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Container for GSParentPlugin.
+*
+*/
+
+// INCLUDE FILES
+#include    <gsparentcontainer.h>
+#include    <gsparentplugin.h>
+#include    <gsplugininterface.h>
+#include    "GsLogger.h"
+#include    <gsparentpluginrsc.rsg>
+#include    <gsfwviewuids.h>
+#include    "GSBaseDocument.h"
+#include    <mgswatchdog.h>
+
+#include    <AknIconArray.h>  //for loading icons
+#include    <aknlists.h>
+#include    <AknsUtils.h>     //for loading icons
+#include    <akntitle.h>
+#include    <akntitle.h>
+#include    <aknViewAppUi.h>
+#include    <barsread.h> // For TResourceReader
+#include    <bldvariant.hrh>
+#include    <calslbs.h>
+#include    <eikclbd.h>
+#include    "GsContainerExt.h" //For CGsContainerExt
+
+//CONSTANTS
+const TInt KGSPluginArrayInitSize = 10;
+const TInt KGSCaptionBufSize = 256;
+
+// ========================= MEMBER FUNCTIONS ================================
+
+// ---------------------------------------------------------------------------
+// CGSParentContainer::ConstructL(const TRect& aRect)
+// Symbian OS two phased constructor
+//
+// ---------------------------------------------------------------------------
+//
+void CGSParentContainer::ConstructL(
+    const TRect& aRect,
+    CAknViewAppUi* aAppUi,
+    CArrayPtrFlat<CGSPluginInterface>* aPluginArray,
+    TInt aTitleRscId,
+    CGSParentPlugin* aParentPlugin,
+    TGSListboxTypes aListBoxType )
+    {
+    iAppUi = aAppUi;
+    iPluginArray = aPluginArray;
+    iListBoxType = aListBoxType;
+    iParentPlugin = aParentPlugin;
+
+    CGSBaseDocument* doc = static_cast< CGSBaseDocument* >( iAppUi->Document() );
+    iExt = CGsContainerExt::NewL();
+    iExt->iGSWatchDog = doc->WatchDog();
+
+    // Initialize the array containing pointers to plugins that are actually
+    // displayed in lbx.
+    iVisiblePlugins = new (ELeave) CArrayPtrFlat<CGSPluginInterface>( KGSPluginArrayInitSize );
+
+    __GSLOGSTRING( "[CGSParentContainer] ConstructL" );
+
+    // Set view title from resource:
+    CEikStatusPane* sp = iAppUi->StatusPane();
+    CAknTitlePane* title = static_cast<CAknTitlePane*>
+        ( sp->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) );
+    TResourceReader rReader;
+    iCoeEnv->CreateResourceReaderLC( rReader, aTitleRscId );
+    title->SetFromResourceL( rReader );
+    CleanupStack::PopAndDestroy(); // rReader
+
+    CreateWindowL(); //makes this control a window-owning control
+
+    CreateListBoxL( iListBoxType );
+
+    SetRect( aRect );
+    ActivateL();
+    }
+
+
+// ---------------------------------------------------------------------------
+// CGSParentContainer::~CGSParentContainer()
+// Destructor
+//
+// ---------------------------------------------------------------------------
+//
+CGSParentContainer::~CGSParentContainer()
+    {
+    __GSLOGSTRING( "[CGSParentContainer] ~CGSParentContainer()|->" );
+    if  ( iVisiblePlugins )
+        {
+        iVisiblePlugins->Reset();
+        }
+    delete iVisiblePlugins;
+    if ( iListBox )
+        {
+        delete iListBox;
+        }
+    delete iExt;
+    __GSLOGSTRING( "[CGSParentContainer] ~CGSParentContainer()-|" );
+  }
+
+
+// ---------------------------------------------------------------------------
+// CGSParentContainer::UpdateListboxL
+//
+// Updates listbox from iPluginArray. Uses switch statement to handle different
+// listbox types from TGSListboxTypes because the list item format
+// and icon numbers depend on the listbox type.
+// ---------------------------------------------------------------------------
+//
+void CGSParentContainer::UpdateListBoxL()
+    {
+    __GSLOGSTRING( "[CGSParentContainer::UpdateListBoxL]" );
+    iItemTextArray->Reset();
+
+    // Empty the array because it will be updated.
+    iVisiblePlugins->Reset();
+
+    // Array for icons in the listbox. Array owns the icons.
+    CAknIconArray* icons = NULL;
+
+    // Create icon array if required by the listbox type:
+    switch( iListBoxType )
+        {
+        case EGSListBoxTypeSingleLarge:
+        case EGSListBoxTypeDouble2Large:
+        case EGSListBoxTypeDoubleLarge:
+            icons = new (ELeave) CAknIconArray( KGSPluginArrayInitSize );
+            CleanupStack::PushL( icons );
+            break;
+
+        default:
+            break;
+        }
+
+    // Counter for created icons. This is used to maintain corrext indexing for
+    // each plugin's icons in case a plugin has multiple icons and icon indexes
+    // can not be mapped directly to plugin index.
+    TInt iconCounter = 0;
+
+    // 1) Add each plugin's data to listbox if the plugin is visible.
+    for( TInt i = 0; i < iPluginArray->Count(); i++ )
+        {
+        CGSPluginInterface* plugin = iPluginArray->operator[]( i );
+
+        // Adding plugin data to lbx has a lot of CGSPluginInterface API calls.
+        // -> A good place to use quarantine to catch panicking plugins in
+        // any of these calls.
+        #ifdef GS_ENABLE_WATCH_DOG
+            iExt->iGSWatchDog->QuarantineL( plugin->Id() );
+        #endif
+            
+        if( plugin->Visible() )
+            {
+            AddPluginDataToLbxL( plugin,
+                                 iItemTextArray,
+                                 icons,
+                                 iconCounter );
+            }
+        #ifdef GS_ENABLE_WATCH_DOG
+            iExt->iGSWatchDog->RemoveFromQuarantineL( plugin->Id() );
+        #endif
+        }
+
+    // 2) Replace old icon array if needed.
+    switch( iListBoxType )
+        {
+        case EGSListBoxTypeSingleLarge:
+            {
+            // Temporary variable needed to use casted lbx.
+            CAknSingleLargeStyleListBox* lbx =
+                STATIC_CAST( CAknSingleLargeStyleListBox*, iListBox );
+            // Destroy the old icons because SetIconArray() does not destroy them.
+            CArrayPtr<CGulIcon>* oldIcons
+                = lbx->ItemDrawer()->ColumnData()->IconArray();
+            if( oldIcons )
+                {
+                __GSLOGSTRING( "[CGSParentContainer] Destroying old icons." );
+                oldIcons->ResetAndDestroy();
+                delete oldIcons;
+                }
+            // Transfer ownership of icon array to the lbx.
+            // SetIconArray() does not delete the old icon array
+            lbx->ItemDrawer()->ColumnData()->SetIconArray( icons );
+            CleanupStack::Pop( icons );
+            }
+            break;
+        case EGSListBoxTypeDouble2Large:
+        case EGSListBoxTypeDoubleLarge:
+            {
+            // Temporary variable needed to use casted lbx.
+            CEikFormattedCellListBox* lbx =
+                STATIC_CAST( CEikFormattedCellListBox*, iListBox );
+            // Destroy the old icons because SetIconArray() does not destroy them.
+            CArrayPtr<CGulIcon>* oldIcons
+                = lbx->ItemDrawer()->ColumnData()->IconArray();
+            if( oldIcons )
+                {
+                __GSLOGSTRING( "[CGSParentContainer] Destroying old icons." );
+                oldIcons->ResetAndDestroy();
+                delete oldIcons;
+                }
+            // Transfer ownership of icon array to the lbx.
+            // SetIconArray() does not delete the old icon array
+            lbx->ItemDrawer()->ColumnData()->SetIconArray( icons );
+            CleanupStack::Pop( icons );
+            }
+            break;
+
+        case EGSListBoxTypeSettings:
+            break;
+
+        default:
+            break;
+        }
+
+#ifdef _GS_PARENTPLUGIN_LBX_FORMAT_TRACES
+#pragma message("_GS_PARENTPLUGIN_LBX_FORMAT_TRACES activated")
+        __GSLOGSTRING( "[CGSParentContainer::UpdateListBoxL] iItemTextArray:" );
+        for( TInt i = 0; i < iItemTextArray->Count(); i++ )
+            {
+            __GSLOGSTRING1( "%S", &iItemTextArray->operator[]( i ) );
+            }
+#endif // _GS_PARENTPLUGIN_LBX_FORMAT_TRACES
+
+    // 3) Draw listbox again
+    iListBox->HandleItemAdditionL();
+    __GSLOGSTRING( "[CGSParentContainer] UpdateListBoxL()-|" );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CGSParentContainer::AddPluginDataToLbxL()
+//
+//
+// -----------------------------------------------------------------------------
+//
+void CGSParentContainer::AddPluginDataToLbxL( CGSPluginInterface* aPlugin,
+                                              CDesCArray* aItemTextArray,
+                                              CAknIconArray* aIconArray,
+                                              TInt& aIconCounter )
+    {
+    // Used to disable icon
+    const TInt KIconNotSupported = -1;
+
+    // Index of icon used in AB-column
+    TInt iconIndexAB = KIconNotSupported;
+
+    // Index of icon used in D-column
+    TInt iconIndexD = KIconNotSupported;
+
+#pragma message("TODO: The HBufC buffer sizes could be optimized if possible:")
+
+    // First line of lbx item text (plugin caption)
+    HBufC* firstLabelBuf = HBufC::NewLC( KGSCaptionBufSize );
+    TPtr firstLabel = firstLabelBuf->Des();
+
+    // Second line of lbx item text (optional)
+    HBufC* secondLabelBuf = HBufC::NewLC( KGSCaptionBufSize );
+    TPtr secondLabel = secondLabelBuf->Des();
+
+    // The complete formatted lbx item string which is added to lbx
+    HBufC* lbxItemStringBuf = HBufC::NewLC( KGSCaptionBufSize * 2 );
+    TPtr lbxItemString = lbxItemStringBuf->Des();
+
+    // Separates lbx item elements
+    _LIT( KTab, "\t" );
+
+    // Normal icon in AB-Column
+    CGulIcon* iconAB = NULL;
+
+    // Small icon used in D-column (optional)
+    CGulIcon* iconD = NULL;
+
+    // Add the plugin to visible plugins array:
+    iVisiblePlugins->AppendL( aPlugin );
+
+    // 1) Read item descriptor from plugin:
+    TRAPD( captionErr,
+           aPlugin->GetCaptionL( firstLabel );
+         )
+
+    // If plugin caption fails, set caption to error string.
+    if( captionErr != KErrNone )
+        {
+        _LIT( KGSParentPluginCaptionErrorTxt, "Error" );
+        firstLabel.Append( KGSParentPluginCaptionErrorTxt );
+        }
+       else
+        {
+        __GSLOGSTRING2( "[CGSParentContainer] 0x%X::GetCaptionL Error: %d",
+        aPlugin->Id().iUid, captionErr );
+        }
+
+    // 2) Add icons if listbox uses them:
+    //    - AB-column icon
+    //    - D-column icon
+    switch( iListBoxType )
+        {
+        case EGSListBoxTypeSingleLarge:
+        case EGSListBoxTypeDouble2Large:
+        case EGSListBoxTypeDoubleLarge:
+            {
+            // This might fail because plugin implementors might do funny stuff.
+            // GS Must still behave well...
+            TRAPD( iconErr,
+                   iconAB = aPlugin->CreateIconL( KGSIconTypeLbxItem );
+                 )
+            if( iconErr != KErrNone )
+                {
+                // Use default icon because plugin implementor's CreateIconL
+                // failed. If this fails, everything is lost anyway so might as
+                // well leave (abort GS).
+                iconAB = aPlugin->CGSPluginInterface::CreateIconL( KGSIconTypeLbxItem );
+                __GSLOGSTRING2( "[CGSParentContainer] CreateIconL for 0x%X failed:%d",
+                                aPlugin->Id().iUid,
+                                iconErr );
+                }
+            if( iconAB ) // Append only if not NULL (not supported)
+                {
+                CleanupStack::PushL( iconAB );
+                aIconArray->AppendL( iconAB );
+                CleanupStack::Pop( iconAB );
+                iconIndexAB = aIconCounter;
+                aIconCounter++;
+                }
+
+            TRAPD( iconDColErr,
+                   iconD = aPlugin->CreateIconL( KGSIconTypeDColumn );
+                 )
+            if( iconDColErr != KErrNone )
+                {
+                iconD = aPlugin->CGSPluginInterface::CreateIconL( KGSIconTypeDColumn );
+                __GSLOGSTRING2( "[CGSParentContainer] CreateIconL for 0x%X failed:%d",
+                                aPlugin->Id().iUid,
+                                iconErr );
+                }
+            if( iconD ) // Append only if not NULL (not supported)
+                {
+                CleanupStack::PushL( iconD );
+                aIconArray->AppendL( iconD );
+                CleanupStack::Pop( iconD );
+                iconIndexD = aIconCounter;
+                aIconCounter++;
+                }
+            break;
+            }
+        case EGSListBoxTypeSettings:
+            break;
+
+        default:
+            break;
+        }
+
+    /**
+    * 3) Create formatted item string. Lbx item's format string depends
+    *    on lbx type.
+    */
+    switch( iListBoxType )
+        {
+        /**
+        * list_single_large_pane:
+        * list item string format: "1\tTextLabel\t0\t0"
+        * where 0 is an index to icon array
+        */
+        case EGSListBoxTypeSingleLarge:
+            {
+            if( iconIndexAB != KIconNotSupported ) lbxItemString.AppendNum( iconIndexAB ); // AB-Column icon
+            lbxItemString.Append( KTab );
+            lbxItemString.Append( firstLabel );
+            break;
+            }
+        /**
+        * list_setting_pane and list_big_single_setting_pane:
+        * list item string format: "\tFirstLabel\t\tValueText"
+        * list item string format: "\tFirstLabel\t0\t"
+        * list item string format: "\tFirstLabel\t\tValueText\t*"
+        * list item string format: "\tFirstLabel\t\t\t\tSecondLabel"
+        * where 0 is an index to icon array
+        */
+        case EGSListBoxTypeSettings:
+            {
+            aPlugin->GetValue( EGSPluginKeySettingsItemValueString, secondLabel );
+
+            lbxItemString.Append( KTab );
+            lbxItemString.Append( firstLabel );
+            lbxItemString.Append( KTab );
+            lbxItemString.Append( KTab );
+            lbxItemString.Append( secondLabel );
+            break;
+            }
+        /**
+        * list_double2_large_graphic_pane:
+        * list item string format: "1\tFirstLabel\tSecondLabel\t0"
+        * where 0 is an index of small (13x13) icon in icon array
+        *   and 1 is an index of a thumbnail image
+        */
+        case EGSListBoxTypeDouble2Large:
+        case EGSListBoxTypeDoubleLarge:
+            {
+            aPlugin->GetValue( EGSPluginKeySettingsItemValueString, secondLabel );
+
+            if( iconIndexAB != KIconNotSupported ) lbxItemString.AppendNum( iconIndexAB ); // AB-Column icon
+            lbxItemString.Append( KTab );
+            lbxItemString.Append( firstLabel ); // FirstLabel
+            lbxItemString.Append( KTab );
+            lbxItemString.Append( secondLabel ); // SecondLabel
+            lbxItemString.Append( KTab );
+            if( iconIndexD != KIconNotSupported ) lbxItemString.AppendNum( iconIndexD ); // D-Column Icon
+            break;
+            }
+        }
+    aItemTextArray->AppendL( lbxItemString );
+
+    CleanupStack::PopAndDestroy( lbxItemStringBuf );
+    CleanupStack::PopAndDestroy( secondLabelBuf );
+    CleanupStack::PopAndDestroy( firstLabelBuf );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CGSParentContainer::ListBox()
+//
+//
+// ---------------------------------------------------------------------------
+//
+CEikListBox* CGSParentContainer::ListBox()
+    {
+    return iListBox;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CGSParentContainer::SizeChanged
+// called by framework when the view size is changed
+//
+// ---------------------------------------------------------------------------
+//
+void CGSParentContainer::SizeChanged()
+    {
+    if ( iListBox )
+        {
+        iListBox->SetRect( Rect() );
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CGSParentContainer::CountComponentControls
+//
+//
+// ---------------------------------------------------------------------------
+//
+TInt CGSParentContainer::CountComponentControls() const
+    {
+    return 1;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CGSParentContainer::ComponentControl
+//
+//
+// ---------------------------------------------------------------------------
+//
+CCoeControl* CGSParentContainer::ComponentControl(TInt /*aIndex*/) const
+    {
+    return iListBox;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CGSParentContainer::TKeyResponse OfferKeyEventL
+// Called when a key is pressed.
+//
+// ---------------------------------------------------------------------------
+//
+TKeyResponse  CGSParentContainer::OfferKeyEventL( const TKeyEvent& aKeyEvent,
+                                                  TEventCode aType )
+    {
+    switch ( aKeyEvent.iCode )
+        {
+        case EKeyUpArrow:
+        case EKeyDownArrow:
+            {
+            TKeyResponse listboxResp =
+                iListBox->OfferKeyEventL( aKeyEvent, aType );
+            if ( iParentPlugin )
+                {
+                iParentPlugin->CheckMiddleSoftkeyLabelL();
+                }
+            return listboxResp;
+            }
+        case EKeyLeftArrow:
+        case EKeyRightArrow:
+            // Listbox takes all events even if it doesn't use them
+            return EKeyWasNotConsumed;
+        default:
+            break;
+        }
+    // now it's iListBox's job to process the key event
+    return iListBox->OfferKeyEventL( aKeyEvent, aType );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CGSParentContainer::HandleListBoxEventL
+//
+//
+// ---------------------------------------------------------------------------
+void CGSParentContainer::HandleListBoxEventL( CEikListBox* aListBox,
+                                              TListBoxEvent aEventType )
+    {
+    __GSLOGSTRING1(
+        "[CGSParentContainer] HandleListBoxEventL aEventType:%d",
+        aEventType);
+    switch (aEventType)
+        {
+        case EEventEnterKeyPressed:
+        case EEventItemSingleClicked:
+            {
+            __GSLOGSTRING1(
+                "[CGSParentContainer] Activating view plugin in index[%d]",
+                aListBox->CurrentItemIndex() );
+            
+            if( aListBox->CurrentItemIndex() < 0 )
+                {
+                // Negative listbox value -> no item selected? 
+                break;
+                }
+            
+           if(iExt->iDblClickPreventer->IsActive())
+               {
+               break;
+               }
+           iExt->iDblClickPreventer->Start();
+            CGSPluginInterface* selectedPlugin = iVisiblePlugins->operator[](
+                aListBox->CurrentItemIndex() );
+
+            // Different command is used depending on the plugin type.
+            switch( selectedPlugin->ItemType() )
+                {
+                // In these cases the plugin is a view:
+                case EGSItemTypeSingleLarge:
+                case EGSItemTypeSetting:
+                case EGSItemTypeSettingIcon:
+                    iAppUi->ActivateLocalViewL( selectedPlugin->Id() );
+                    break;
+                // In these cases the plugin is a dialog:
+                case EGSItemTypeSettingDialog:
+                case EGSItemTypeSingleLargeDialog:
+                    selectedPlugin->HandleSelection(
+                        EGSSelectionBySelectionKey );
+                    UpdateListBoxL(); // Refrest the listbox if value changed.
+                    break;
+                }
+            }
+            break;
+
+        default:
+           break;
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CGSParentContainer::HandleResourceChange()
+//
+//
+// ---------------------------------------------------------------------------
+//
+void CGSParentContainer::HandleResourceChange( TInt aType )
+    {
+    CCoeControl::HandleResourceChange( aType );
+    //Handle layout orientation or skin change
+    if ( aType == KAknsMessageSkinChange ||
+         aType == KEikDynamicLayoutVariantSwitch )
+        {
+        TRect mainPaneRect;
+        AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane,
+                                           mainPaneRect);
+        SetRect( mainPaneRect );
+        if ( aType == KAknsMessageSkinChange )
+            {
+            TRAP_IGNORE( UpdateListBoxL() );
+            }
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CGSParentContainer::CreateListBoxL()
+//
+//
+// ---------------------------------------------------------------------------
+//
+void CGSParentContainer::CreateListBoxL(
+    TGSListboxTypes aListBoxType )
+    {
+    switch( aListBoxType )
+        {
+        case EGSListBoxTypeSingleLarge:
+            {
+            CAknSingleLargeStyleListBox* lbx =
+                new( ELeave ) CAknSingleLargeStyleListBox;
+            iListBox = lbx;
+            lbx->ConstructL( this );
+            lbx->SetContainerWindowL( *this );
+            lbx->SetListBoxObserver( this );
+            lbx->CreateScrollBarFrameL( ETrue );
+            lbx->ScrollBarFrame()->SetScrollBarVisibilityL(
+                CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto );
+            // Obtain reference to listbox model's item text array:
+            iItemTextArray = STATIC_CAST( CDesCArray*,
+                lbx->Model()->ItemTextArray() );
+            }
+            break;
+
+        case EGSListBoxTypeSettings:
+            {
+            CAknSettingStyleListBox* lbx = 
+                new( ELeave ) CAknSettingStyleListBox;
+            iListBox = lbx;
+            lbx->ConstructL( this, EAknListBoxSelectionList );
+            lbx->SetContainerWindowL( *this );
+            lbx->SetListBoxObserver( this );
+            lbx->CreateScrollBarFrameL( ETrue );
+            lbx->ScrollBarFrame()->SetScrollBarVisibilityL(
+                CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto );
+            // Obtain reference to listbox model's item text array:
+            iItemTextArray = STATIC_CAST( CDesCArray*,
+                lbx->Model()->ItemTextArray() );
+            }
+            break;
+            
+        case EGSListBoxTypeDouble2Large:
+            {
+            TInt flags = 0;
+            CAknDouble2LargeStyleListBox* lbx = 
+                new( ELeave ) CAknDouble2LargeStyleListBox;
+            iListBox = lbx;
+            lbx->ConstructL( this, flags );
+            lbx->SetContainerWindowL( *this );
+            lbx->SetListBoxObserver( this );
+            lbx->CreateScrollBarFrameL( ETrue );
+            lbx->ScrollBarFrame()->SetScrollBarVisibilityL(
+                CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto );
+            // Obtain reference to listbox model's item text array:
+            iItemTextArray = STATIC_CAST( CDesCArray*,
+                lbx->Model()->ItemTextArray() );
+            }
+            break;
+
+        case EGSListBoxTypeDoubleLarge:
+            {
+            TInt flags = 0;
+            CAknDoubleLargeStyleListBox* lbx = 
+                new( ELeave ) CAknDoubleLargeStyleListBox;
+            iListBox = lbx;
+            lbx->ConstructL( this, flags );
+            lbx->SetContainerWindowL( *this );
+            lbx->SetListBoxObserver( this );
+            lbx->CreateScrollBarFrameL( ETrue );
+            lbx->ScrollBarFrame()->SetScrollBarVisibilityL(
+                CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto );
+            // Obtain reference to listbox model's item text array:
+            iItemTextArray = STATIC_CAST( CDesCArray*,
+                lbx->Model()->ItemTextArray() );
+            }
+            break;
+
+        default:
+            break;
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CGSParentContainer::SelectedPlugin()
+//
+//
+// -----------------------------------------------------------------------------
+//
+CGSPluginInterface* CGSParentContainer::SelectedPlugin()
+    {
+    CGSPluginInterface* plugin = NULL;
+    const TInt index = iListBox->CurrentItemIndex();
+    if ( index >= 0 && index < iVisiblePlugins->Count() )
+        {
+        plugin = iVisiblePlugins->operator[]( index );
+        __GSLOGSTRING2( "[CGSParentContainer] SelectedPlugin 0x%X in index %d",
+            plugin->Id().iUid, index );
+        }
+    return plugin;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CGSParentContainer::SetSelectedItem()
+//
+//
+// -----------------------------------------------------------------------------
+//
+void CGSParentContainer::SetSelectedItem( TUid aSelectedItemUid )
+    {
+    __GSLOGSTRING1( "[CGSParentContainer] SetSelectedItem(0x%X)",
+        aSelectedItemUid.iUid );
+
+    if( aSelectedItemUid != KGSNoneSelected )
+        {
+        TInt selectedItemIndex  = 0;
+        for( TInt i = 0; i < iVisiblePlugins->Count(); i++ )
+            {
+            CGSPluginInterface* plugin = iVisiblePlugins->operator[]( i );
+            __GSLOGSTRING2( "[CGSParentContainer] Checking [%d] 0x%X)",
+                i, plugin->Id().iUid );
+            // If plugin is found, select it:
+            if( plugin->Id() == aSelectedItemUid )
+                {
+                __GSLOGSTRING2( "[CGSParentContainer] Match 0x%X in index %d",
+                    plugin->Id().iUid, i );
+                selectedItemIndex = i;
+                break;
+                }
+            }
+        iListBox->SetCurrentItemIndexAndDraw( selectedItemIndex );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CGSParentContainer::GetHelpContext()
+//
+//
+// -----------------------------------------------------------------------------
+//
+void CGSParentContainer::GetHelpContext( TCoeHelpContext& aContext ) const
+    {
+    // This is forwarded to the CGSParentPlugin type class that actually knows
+    // the help context but does not have its own CCoeControl class.
+    iParentPlugin->GetHelpContext( aContext );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CGSParentContainer::FocusChanged
+//
+// Set focus on the selected listbox. For animated skins feature.
+// ---------------------------------------------------------------------------
+EXPORT_C void CGSParentContainer::FocusChanged( TDrawNow /*aDrawNow*/ )
+    {
+    if( iListBox )
+        {
+        iListBox->SetFocus( IsFocused() );
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CGSParentContainer::HandleSelectionKeyL
+//
+// Behaves like a selection key.
+// ---------------------------------------------------------------------------
+void CGSParentContainer::HandleSelectionKeyL()
+    {
+    HandleListBoxEventL( iListBox,EEventEnterKeyPressed );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CGSParentContainer::TopPlugin()
+//
+//
+// -----------------------------------------------------------------------------
+//
+CGSPluginInterface* CGSParentContainer::TopPlugin()
+    {
+    CGSPluginInterface* plugin = NULL;
+    const TInt index = iListBox->TopItemIndex();
+    if ( index >= 0 && index < iVisiblePlugins->Count() )
+        {
+        plugin = iVisiblePlugins->operator[]( index );
+        __GSLOGSTRING2( "[CGSParentContainer] TopPlugin 0x%X in index %d",
+            plugin->Id().iUid, index );
+        }
+    return plugin;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CGSParentContainer::SetSelectedItem()
+//
+//
+// -----------------------------------------------------------------------------
+//
+void CGSParentContainer::SetTopItem( TUid aTopItemUid )
+    {
+    __GSLOGSTRING1( "[CGSParentContainer] SetTopItem(0x%X)",
+        aTopItemUid.iUid );
+
+    if( aTopItemUid != KGSNoneSelected )
+        {
+        TInt topItemIndex  = 0;
+        for( TInt i = 0; i < iVisiblePlugins->Count(); i++ )
+            {
+            CGSPluginInterface* plugin = iVisiblePlugins->operator[]( i );
+            __GSLOGSTRING2( "[CGSParentContainer] Checking [%d] 0x%X)",
+                i, plugin->Id().iUid );
+            // If plugin is found, select it:
+            if( plugin->Id() == aTopItemUid )
+                {
+                __GSLOGSTRING2( "[CGSParentContainer] Match 0x%X in index %d",
+                    plugin->Id().iUid, i );
+                topItemIndex = i;
+                break;
+                }
+            }
+        iListBox->SetTopItemIndex( topItemIndex );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CGSParentContainer::SetListBoxEmptyTextL()
+//
+//Set the empty text of list box.
+// -----------------------------------------------------------------------------
+//
+void CGSParentContainer::SetListBoxEmptyTextL(const TDes& aEmpty )
+    {
+    if ( iListBox )
+        {
+        iListBox->View()->SetListEmptyTextL( aEmpty );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CGSParentContainer::StoreListBoxPositionL
+//
+//Store the exact position of listbox.
+// -----------------------------------------------------------------------------
+//
+void CGSParentContainer::StoreListBoxPositionL( CGSParentPlugin::TListBoxPosition& aPosition )
+	{
+    aPosition.iCurrentItemIndex = iListBox->CurrentItemIndex();
+    aPosition.iItemOffsetInPixels = iListBox->View()->ItemOffsetInPixels();
+    aPosition.iTopItemIndex = iListBox->View()->TopItemIndex();
+	}
+
+// -----------------------------------------------------------------------------
+// CGSParentContainer::RestoreListBoxPositionL
+//
+//Restore the exact position of listbox.
+// -----------------------------------------------------------------------------
+//
+void CGSParentContainer::RestoreListBoxPositionL( const CGSParentPlugin::TListBoxPosition& aPosition, TBool aScreenModeChanged )
+	{
+	if( iListBox->View()->BottomItemIndex()>= aPosition.iCurrentItemIndex )
+		
+		{
+		
+ 		if ( aPosition.iCurrentItemIndex >= 0 )
+        {
+        iListBox->SetCurrentItemIndex( aPosition.iCurrentItemIndex );
+        }
+    
+    if ( aScreenModeChanged )
+        {
+        iListBox->View()->VerticalMoveToItemL( aPosition.iCurrentItemIndex,
+                CListBoxView::ESingleSelection );
+        }
+    else
+        {
+        iListBox->View()->SetItemOffsetInPixels( aPosition.iItemOffsetInPixels );
+        iListBox->View()->SetTopItemIndex( aPosition.iTopItemIndex );
+        }
+		}
+    }
+//End of File