appinstaller/AppMngr2/src/appmngr2listcontainer.cpp
changeset 80 9dcba1ee99f7
parent 77 d1838696558c
--- a/appinstaller/AppMngr2/src/appmngr2listcontainer.cpp	Thu Oct 14 14:11:30 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,484 +0,0 @@
-/*
-* Copyright (c) 2008-2009 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:   Base class for AppMngr2 list view containers
-*
-*/
-
-
-#include "appmngr2listcontainer.h"      // CAppMngr2ListContainer
-#include "appmngr2appui.h"              // CAppMngr2AppUi
-#include "appmngr2model.h"              // CAppMngr2Model
-#include "appmngr2listview.h"           // CAppMngr2ListView
-#include "appmngr2.hrh"                 // Icon IDs
-#include <appmngr2runtime.h>            // CAppMngr2Runtime
-#include <appmngr2infobase.h>           // CAppMngr2InfoBase
-#include <appmngr2debugutils.h>         // FLOG macros
-#include <aknlists.h>                   // CAknDoubleLargeStyleListBox
-#include <eiktxlbm.h>                   // CTextListBoxModel
-#include <AknIconArray.h>               // CAknIconArray
-#include <StringLoader.h>               // StringLoader
-#include <gulicon.h>                    // CGulIcon
-
-const TInt KGranularity = 8;
-const TInt KSpaceForTabsAndIconIndexes = 9; // 3 tabs + 2 * 3 digits
-_LIT( KItemFormatFull,  "%d\t%S\t%S\t%d" );
-_LIT( KItemFormatNoInd, "%d\t%S\t%S" );
-
-
-// ======== MEMBER FUNCTIONS ========
-
-// ---------------------------------------------------------------------------
-// CAppMngr2ListContainer::CAppMngr2ListContainer()
-// ---------------------------------------------------------------------------
-//
-CAppMngr2ListContainer::CAppMngr2ListContainer( CAppMngr2ListView& aView )
-        : iView( aView )
-    {
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2ListContainer::~CAppMngr2ListContainer()
-// ---------------------------------------------------------------------------
-//
-CAppMngr2ListContainer::~CAppMngr2ListContainer()
-    {
-    delete iListBox;
-    delete iItemArray;
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2ListContainer::OfferKeyEventL()
-// ---------------------------------------------------------------------------
-//
-TKeyResponse CAppMngr2ListContainer::OfferKeyEventL(
-        const TKeyEvent& aKeyEvent, TEventCode aType )
-    {
-    TKeyResponse response = iListBox->OfferKeyEventL( aKeyEvent, aType ); 
-    if( aKeyEvent.iCode == EKeyUpArrow || aKeyEvent.iCode == EKeyDownArrow )
-        {
-        iView.UpdateMiddleSoftkeyCommandL();
-        iView.CurrentItemSelectedByUser( ETrue );
-        }
-    return response;
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2ListContainer::HandleResourceChange()
-// ---------------------------------------------------------------------------
-//
-void CAppMngr2ListContainer::HandleResourceChange( TInt aType )
-    {
-    CCoeControl::HandleResourceChange( aType );
-
-    if( aType == KAknsMessageSkinChange )
-        {
-        TRAP_IGNORE( LoadIconsL() );
-        }
-
-    if( aType == KEikDynamicLayoutVariantSwitch )
-        {
-        TRect mainPaneRect;
-        if( AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane,
-                mainPaneRect ) )
-            {
-            SetRect( mainPaneRect );
-            }
-        DrawDeferred();
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2ListContainer::SizeChanged()
-// ---------------------------------------------------------------------------
-//
-void CAppMngr2ListContainer::SizeChanged()
-    {
-    if( iListBox )
-        {
-        iListBox->SetRect( Rect() );
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2ListContainer::CountComponentControls()
-// ---------------------------------------------------------------------------
-//
-TInt CAppMngr2ListContainer::CountComponentControls() const
-    {
-    return 1;   // always only iListBox
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2ListContainer::ComponentControl()
-// ---------------------------------------------------------------------------
-//
-CCoeControl* CAppMngr2ListContainer::ComponentControl( TInt /*aIndex*/ ) const
-    {
-    return iListBox;
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2ListContainer::HandleListBoxEventL()
-// ---------------------------------------------------------------------------
-//
-void CAppMngr2ListContainer::HandleListBoxEventL( CEikListBox* /*aListBox*/,
-        TListBoxEvent aEventType )
-    {
-    if( aEventType == EEventItemClicked || aEventType == EEventItemSingleClicked )
-        {
-        iView.UpdateMiddleSoftkeyCommandL();
-        iView.CurrentItemSelectedByUser( ETrue );
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2ListContainer::IsListEmpty()
-// ---------------------------------------------------------------------------
-//
-TBool CAppMngr2ListContainer::IsListEmpty() const
-    {
-    if( iItemArray )
-        {
-        return ( iItemArray->Count() == 0 );
-        }
-    return ETrue;
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2ListContainer::HandleGenericCommandL()
-// ---------------------------------------------------------------------------
-//
-void CAppMngr2ListContainer::HandleGenericCommandL( TInt aCommand )
-    {
-    if( !IsListEmpty() )
-        {
-        CAppMngr2InfoBase& currentItem = CurrentItem();
-        if( currentItem.SupportsGenericCommand( aCommand ) )
-            {
-            Model().HandleCommandL( currentItem, aCommand );
-            }
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2ListContainer::RefreshL()
-// ---------------------------------------------------------------------------
-//
-void CAppMngr2ListContainer::RefreshL( TBool aPreserveSelectedItem,
-        TBool& aSelectedItemChanged, TInt aMoreRefreshesExpected )
-    {
-    FLOG( "CAppMngr2ListContainer::RefreshL( %d )", aPreserveSelectedItem );
-    
-    // Record the item text of the current item if selection must be preserved in
-    // the current item. The item text is used to identify the item later, so that
-    // it can be selected again.
-    HBufC* itemText = NULL;
-    TInt currentItemIndex = iListBox->CurrentItemIndex();
-    if( aPreserveSelectedItem && currentItemIndex >= 0 )
-        {
-        itemText = (*iItemArray)[ currentItemIndex ].AllocL();
-        CleanupStack::PushL( itemText );
-        }
-
-    SetEmptyTextL( aMoreRefreshesExpected );    // defines empty text in first refresh
-    CreateItemArrayL();                         // resets the item array
-    PopulateItemArrayL();                       // fills in new items
-    iListBox->HandleItemAdditionL();            // re-calculates size and scrollbar
-    
-    // If selection must be preserved, search the item in new item array
-    // and select it again. Make sure to delete itemText if it was allocated.
-    TBool currentItemSet = EFalse;
-    TInt itemCount = iItemArray->Count();
-    if( itemText )
-        {
-        for( TInt index = 0; index < itemCount && !currentItemSet; index++ )
-            {
-            if( itemText->Compare( (*iItemArray)[ index ] ) == 0 )
-                {
-                iListBox->SetCurrentItemIndex( index );
-                currentItemSet = ETrue;
-                }
-            }
-        CleanupStack::PopAndDestroy( itemText );
-        }
-    
-    // If item is not found (it may have been deleted), then tell to the
-    // caller that the selected item was changed and select another item
-    // from the same row number than the previously selected item.
-    aSelectedItemChanged = !currentItemSet;
-    if( aSelectedItemChanged )
-        {
-        if( currentItemIndex >= itemCount )
-            {
-            currentItemIndex = itemCount - 1;
-            }
-        if( currentItemIndex < 0 )
-            {
-            currentItemIndex = 0;
-            }
-        if( currentItemIndex != iListBox->CurrentItemIndex() )
-            {
-            iListBox->SetCurrentItemIndex( currentItemIndex );
-            }
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2ListContainer::ConstructL()
-// ---------------------------------------------------------------------------
-//
-void CAppMngr2ListContainer::ConstructL( const TRect& aRect )
-    {
-    CreateWindowL();
-    SetRect( aRect );
-    iListBox = new (ELeave) CAknDoubleLargeStyleListBox;
-    iListBox->SetContainerWindowL( *this );
-    iListBox->ConstructL( this, EAknListBoxSelectionList );
-    iListBox->SetListBoxObserver( this );
-    
-    // Dont display default "(no data)" empty text
-    iListBox->View()->SetListEmptyTextL( KNullDesC );
-
-    LoadIconsL();
-    CreateItemArrayL();
-    PopulateItemArrayL();
-    
-    iListBox->CreateScrollBarFrameL();
-    iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(
-            CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto );
-    iListBox->SetRect( aRect.Size() );
-    
-    // Enable marquee effect
-    iListBox->ItemDrawer()->ColumnData()->EnableMarqueeL( ETrue );
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2ListContainer::Model()
-// ---------------------------------------------------------------------------
-//
-CAppMngr2Model& CAppMngr2ListContainer::Model() const
-    {
-    return reinterpret_cast<CAppMngr2AppUi*>( iEikonEnv->EikAppUi() )->Model();
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2ListContainer::LoadIconsL()
-// ---------------------------------------------------------------------------
-//
-void CAppMngr2ListContainer::LoadIconsL()
-    {
-    CAknIconArray* iconArray = new ( ELeave ) CAknIconArray( KGranularity );
-    CleanupStack::PushL( iconArray );
-    Model().LoadIconsL( *iconArray );
-    delete iListBox->ItemDrawer()->ColumnData()->IconArray();
-    iListBox->ItemDrawer()->ColumnData()->SetIconArray( iconArray );
-    CleanupStack::Pop( iconArray );
-    iItemSpecificIcons = 0;
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2ListContainer::CreateItemArrayL()
-// ---------------------------------------------------------------------------
-//
-void CAppMngr2ListContainer::CreateItemArrayL()
-    {
-    if( iItemArray )
-        {
-        iListBox->Model()->SetItemTextArray( NULL );
-        delete iItemArray;
-        iItemArray = NULL;
-        }
-    iItemArray = new ( ELeave ) CDesCArrayFlat( KGranularity );
-    iListBox->Model()->SetItemTextArray( iItemArray );
-    iListBox->Model()->SetOwnershipType( ELbmDoesNotOwnItemArray );
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2ListContainer::PopulateItemArrayL()
-// ---------------------------------------------------------------------------
-//
-void CAppMngr2ListContainer::PopulateItemArrayL()
-    {
-    FLOG( "CAppMngr2ListContainer::PopulateItemArrayL()" );
-    
-    CArrayPtr<CGulIcon>* iconArray = iListBox->ItemDrawer()->ColumnData()->IconArray();
-    DeleteItemSpecificIcons( *iconArray );
-    
-    TInt count = ItemCount();
-    for( TInt index = 0; index < count; index++ )
-        {
-        const CAppMngr2InfoBase& appInfo = ItemInfo( index );
-
-        // Get name and details
-        TPtrC name = appInfo.Name();
-        TPtrC size = appInfo.Details();
-
-        // Get icon indexes that plugin loaded in LoadIconsL()
-        TInt iconIndexBase;
-        TInt iconIndexMax;
-        Model().GetIconIndexesL( appInfo.Runtime().RuntimeUid(),
-                iconIndexBase, iconIndexMax );
-        
-        // Get list icon index from plugin
-        TInt iconIndex = appInfo.IconIndex();
-        
-        // Convert index into the range of 0 .. (icons - 1)
-        if( iconIndex == EAppMngr2UseSpecificIcon )
-            {
-            CGulIcon* icon = NULL;
-            TRAP_IGNORE( icon = appInfo.SpecificIconL() );
-            if( icon )
-                {
-                CleanupStack::PushL( icon );
-                iconIndex = iconArray->Count();
-                iconArray->AppendL( icon );
-                CleanupStack::Pop( icon );
-                iItemSpecificIcons++;
-                }
-            else
-                {
-                iconIndex = EAppMngr2IconIndex_QgnPropUnknown;
-                }
-            }
-        else
-            {
-            // There are no default list icons that plugins could use, so
-            // this must be list icon that plugin has loaded in LoadIconsL().
-            // Icons (of this plugin) are indexed from iconIndexBase.
-            iconIndex += iconIndexBase;
-
-            // Plugin should use only those icons it has provided. Use
-            // default unknown icon if plugin tries to use icons that
-            // another plugin has loaded.
-            if( iconIndex < iconIndexBase || iconIndex >= iconIndexMax )
-                {
-                iconIndex = EAppMngr2IconIndex_QgnPropUnknown;
-                }
-            }
-        // Sanity check - index must be in range, otherwise list panics 
-        if( iconIndex < 0 || iconIndex >= iconArray->Count() )
-            {
-            iconIndex = EAppMngr2IconIndex_QgnPropUnknown;
-            }
-
-        // Get indicator icon index from plugin
-        TInt indIconIndex = appInfo.IndicatorIconIndex();
-        
-        // Convert indicator icon index into the range of 0 .. (icons-1) or
-        // leave special value EAppMngr2NoIndicatorIcon in it
-        if( indIconIndex == EAppMngr2UseSpecificIcon )
-            {
-            CGulIcon* icon = NULL;
-            TRAP_IGNORE( icon = appInfo.SpecificIndicatorIconL() );
-            if( icon )
-                {
-                CleanupStack::PushL( icon );
-                indIconIndex = iconArray->Count();
-                iconArray->AppendL( icon );
-                CleanupStack::Pop( icon );
-                iItemSpecificIcons++;
-                }
-            else
-                {
-                indIconIndex = EAppMngr2NoIndicatorIcon;
-                }
-            }
-        else
-            {
-            // EAppMngr2NoIndicatorIcon is special value that is handled later
-            if( indIconIndex != EAppMngr2NoIndicatorIcon )
-                {
-                // Default icon indexes (starting from EAppMngr2NoIndicatorIcon) are
-                // all above the icon index range reserved for plugins
-                if( indIconIndex > EAppMngr2NoIndicatorIcon )
-                    {
-                    // Use default icons, indexes start from zero
-                    indIconIndex -= ( EAppMngr2NoIndicatorIcon + 1 );
-                    }
-                else
-                    {
-                    // Use item specific icons, indexes start from iconIndexBase
-                    indIconIndex += iconIndexBase;
-                    }
-                }
-            }
-        // Sanity check - icon index must be in range, otherwise list panics
-        if( ( indIconIndex != EAppMngr2NoIndicatorIcon ) &&
-                ( indIconIndex < 0 || indIconIndex >= iconArray->Count() ) )
-            {
-            indIconIndex = EAppMngr2NoIndicatorIcon;
-            }
-
-        // Construct line to be displayed
-        HBufC* temp = HBufC::NewLC( name.Length() + size.Length() + KSpaceForTabsAndIconIndexes );
-        TPtr line = temp->Des();
-        if( indIconIndex == EAppMngr2NoIndicatorIcon )
-            {
-            line.AppendFormat( KItemFormatNoInd, iconIndex, &name, &size );
-            }
-        else
-            {
-            line.AppendFormat( KItemFormatFull, iconIndex, &name, &size, indIconIndex );
-            }
-        iItemArray->AppendL( line );
-        FLOG( "CAppMngr2ListContainer::PopulateItemArrayL(): %S", temp );
-        CleanupStack::PopAndDestroy( temp );
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2ListContainer::DeleteItemSpecificIcons()
-// ---------------------------------------------------------------------------
-//
-void CAppMngr2ListContainer::DeleteItemSpecificIcons( CArrayPtr<CGulIcon>& aIconArray )
-    {
-    if( iItemSpecificIcons )
-        {
-        TInt iconArrayCount = aIconArray.Count();
-        TInt firstItemSpecificIcon = iconArrayCount - iItemSpecificIcons;
-        for( TInt index = firstItemSpecificIcon; index < iconArrayCount; index++ )
-            {
-            delete aIconArray[ index ];
-            }
-        aIconArray.Delete( firstItemSpecificIcon, iItemSpecificIcons );
-        iItemSpecificIcons = 0;
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CAppMngr2ListContainer::SetEmptyTextL()
-// ---------------------------------------------------------------------------
-//
-void CAppMngr2ListContainer::SetEmptyTextL( TInt aMoreRefreshesExpected )
-    {
-    // Set empty text if it is not already set
-    CListBoxView* view = iListBox->View();
-    if( view )
-        {
-        const TDesC* text = view->EmptyListText();
-        if( text == NULL || text->Length() == 0 )
-            {
-            // The first refresh may happen too soon. If there are no items
-            // to be displayed, and more refreshes are still expected, then
-            // do not set the empty text yet -- it would be displayed.
-            if( ItemCount() > 0 || !aMoreRefreshesExpected )
-                {
-                HBufC* emptyText = StringLoader::LoadLC( ListEmptyTextResourceId() );
-                view->SetListEmptyTextL( *emptyText );
-                CleanupStack::PopAndDestroy( emptyText );
-                }
-            }
-        }
-    }
-