voipplugins/accountcreationplugin/src/acpproviderlistcontainer.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 18 Jan 2010 20:12:36 +0200
changeset 0 a4daefaec16c
permissions -rw-r--r--
Revision: 201001 Kit: 201003

/*
* Copyright (c) 2007-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:  Implements CAcpProviderListContainer methods
*
*/


#include <aknlists.h>
#include <pathinfo.h>
#include <AknsUtils.h>
#include <acpicons.mbg>
#include <AknIconArray.h>
#include <StringLoader.h>
#include <accountcreationplugin.rsg>
#include <data_caging_path_literals.hrh>
#include <imageconversion.h>
#include <fbs.h>
#include <gulicon.h>
#include <AknIconUtils.h>
#include <eikclbd.h>

#include "acpcontroller.h"
#include "acpproviderlistcontainer.h"
#include "accountcreationpluginlogger.h"
#include "accountcreationpluginconstants.h"


const TInt KComponentControlCount = 1;

// ---------------------------------------------------------------------------
// CAcpProviderListContainer::CAcpProviderListContainer
// ---------------------------------------------------------------------------
//
CAcpProviderListContainer::CAcpProviderListContainer( 
    CAcpController& aController )
    : iController( aController )
    {
    }

// ---------------------------------------------------------------------------
// CAcpProviderListContainer::ConstructL
// ---------------------------------------------------------------------------
//
void CAcpProviderListContainer::ConstructL( const TRect& aRect )
    {
    ACPLOG( "CAcpProviderListContainer::ConstructL begin" );
    
    CreateWindowL();
    ConstructListBoxL();
    SetRect( aRect );
    ActivateL();
    
    ACPLOG( "CAcpProviderListContainer::ConstructL end" );
    }

// ---------------------------------------------------------------------------
// CAcpProviderListContainer::NewL
// ---------------------------------------------------------------------------
//      
CAcpProviderListContainer* CAcpProviderListContainer::NewL( 
    CAcpController& aController,
    const TRect& aRect )
    {    
    CAcpProviderListContainer* self = 
        CAcpProviderListContainer::NewLC( aController, aRect );
    CleanupStack::Pop( self );
    return self;
    }

// ---------------------------------------------------------------------------
// CAcpProviderListContainer::NewLC
// ---------------------------------------------------------------------------
//
CAcpProviderListContainer* CAcpProviderListContainer::NewLC(
    CAcpController& aController,
    const TRect& aRect )
    {    
    CAcpProviderListContainer* self = 
        new ( ELeave ) CAcpProviderListContainer( aController );
    CleanupStack::PushL( self );
    self->ConstructL( aRect );
    return self;
    }

// ---------------------------------------------------------------------------
// CAcpProviderListContainer::~CAcpProviderListContainer
// ---------------------------------------------------------------------------
//
CAcpProviderListContainer::~CAcpProviderListContainer()
    {
    ACPLOG( "CAcpProviderListContainer::~CAcpProviderListContainer begin" );
    delete iListBox;
    ACPLOG( "CAcpProviderListContainer::~CAcpProviderListContainer end" );
    }

// ---------------------------------------------------------------------------
// CAcpProviderListContainer::AddProvidersToListboxL
// Adds and updates listbox with providers.
// ---------------------------------------------------------------------------
//
void CAcpProviderListContainer::AddProvidersToListboxL( )
    {
    ACPLOG( "CAcpProviderListContainer::AddProvidersToListboxL begin" );

    CTextListBoxModel* model = iListBox->Model();
    MDesCArray* textArray = model->ItemTextArray();
    CDesCArray* listBoxItems = static_cast<CDesCArray*>( textArray );
    
    if ( !listBoxItems->Count() )
        {
        TInt count = iController.CountOfProviders(); // Amount of provider.
    
        LoadProviderIconsL( count ); // Load icons of providers.
    
        for ( TInt i = 0; i < count; i++ )
            {
            // Entry for listbox.
            TBuf<KMaxSettingLength> listBoxItemText( KNullDesC ); 
            // Get provider name for adding it to the list later on.
            TPtrC namePtr = iController.ProviderNameFromIndexL( i );
            // Formats the listbox entry with the index and the provider name.  
            listBoxItemText.Format( KListFormat, i,&namePtr );
            // Add the entry to the list.
            listBoxItems->AppendL( listBoxItemText );
            }
    
        iListBox->HandleItemAdditionL();
        iListBox->SetCurrentItemIndexAndDraw( 0 );
        }

    ACPLOG( "CAcpProviderListContainer::AddProvidersToListboxL end" );

    }

// ---------------------------------------------------------------------------
// CAcpProviderListContainer::ListBox
// Returns handle to the listbox.
// ---------------------------------------------------------------------------
//    
CAknSingleLargeStyleListBox* CAcpProviderListContainer::ListBox()
    {
    return iListBox;
    }

// ---------------------------------------------------------------------------
// CAcpProviderListContainer::CurrentItemIndex
// Returns index of selected listbox item. 
// ---------------------------------------------------------------------------
//
TInt CAcpProviderListContainer::CurrentItemIndex() const
    {
    return iListBox->CurrentItemIndex();
    }

// ---------------------------------------------------------------------------
// CAcpProviderListContainer::LoadDefaultIconsL
// Loads default icons.
// ---------------------------------------------------------------------------
//
void CAcpProviderListContainer::LoadProviderIconsL( TInt aCount )
    {
    ACPLOG( "CAcpProviderListContainer::LoadProviderIconsL begin" );

    if ( aCount > 0 )
        {
        // Delete previous icon array.
        CArrayPtr<CGulIcon>* oldArray = iListBox->ItemDrawer()->ColumnData()->
            IconArray();
        if ( oldArray )
            {
            iListBox->ItemDrawer()->ColumnData()->SetIconArray( NULL );
            delete oldArray;
            }
        
        // Create a new icon array.
        CAknIconArray* iconArray = new( ELeave ) CAknIconArray( aCount );

        for ( TInt i = 0; i < aCount; i++ )
            {
            // Try to get bitmap and mask for provider.
            CFbsBitmap* bitmap( NULL );
            CFbsBitmap* mask( NULL );
            
            iController.ProviderBitmapsFromIndexL( i, bitmap, mask );
 
            if ( !bitmap ) // Mask can be NULL.
                {
                // Default icon.
                LoadDefaultIconsL( iconArray );
                }
            else
                {
                // Provider icon.
                CGulIcon* providerIcon = CGulIcon::NewL( bitmap, mask );

                // Owned by provider.
                providerIcon->SetBitmapsOwnedExternally( ETrue );

                CleanupStack::PushL( providerIcon );
                // Insert into icon array.
                iconArray->AppendL( providerIcon );
                CleanupStack::Pop( providerIcon );
                }
            }

        // Set an icon array to the listbox.
        iListBox->ItemDrawer()->ColumnData()->SetIconArray( iconArray );
        }

    ACPLOG( "CAcpProviderListContainer::LoadProviderIconsL end" );
    }

// ---------------------------------------------------------------------------
// CAcpProviderListContainer::ResetListBox
// Resets the listbox.
// ---------------------------------------------------------------------------
//
void CAcpProviderListContainer::ResetListBox()
    {
    ACPLOG( "CAcpProviderListContainer::ResetListBox begin" );
    
    CDesCArrayFlat* array = static_cast<CDesCArrayFlat*>(
        iListBox->Model()->ItemTextArray() );
    
    if ( array )
        {
        array->Reset();
        }
    
    iListBox->SetCurrentItemIndexAndDraw( 0 );
    
    ACPLOG( "CAcpProviderListContainer::ResetListBox end" );
    }

// ---------------------------------------------------------------------------
// CAcpProviderListContainer::ConstructListBoxL
// Creates listbox item for provider list items.
// ---------------------------------------------------------------------------
//
void CAcpProviderListContainer::ConstructListBoxL()
    {
    ACPLOG( "CAcpProviderListContainer::ConstructListBoxL begin" );

    // Create listbox and array for listbox items.
    iListBox = new( ELeave ) CAknSingleLargeStyleListBox;
    iListBox->SetContainerWindowL( *this );
    iListBox->ConstructL( this, EAknGenericListBoxFlags );    
    iListBox->CreateScrollBarFrameL( ETrue );
    iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(
        CEikScrollBarFrame::EOff, 
        CEikScrollBarFrame::EAuto );
    iListBox->Model()->SetOwnershipType( ELbmOwnsItemArray );

    CDesCArrayFlat* array = new ( ELeave ) CDesCArrayFlat( KArrayGranuality );
    iListBox->Model()->SetItemTextArray( array );

    // Set listbox background data when there are no providers available.
    HBufC* empty = StringLoader::LoadLC( R_ACP_PROVIDER_LIST_NO_PROVIDERS );
    iListBox->View()->SetListEmptyTextL( *empty );
    CleanupStack::PopAndDestroy( empty );

    ACPLOG( "CAcpProviderListContainer::ConstructListBoxL end" );
    }

// ---------------------------------------------------------------------------
// CAcpProviderListContainer::LoadDefaultIconsL
// Loads default icons.
// ---------------------------------------------------------------------------
//
void CAcpProviderListContainer::LoadDefaultIconsL( 
    CArrayPtr<CGulIcon>* aIconArray )
    {
    ACPLOG( "CAcpProviderListContainer::LoadDefaultIconsL begin" );

    // This when going to ROM (PhoneMemoryRootPath is used only for testing).
    TFileName fileName = 
        TParsePtrC( PathInfo::RomRootPath() ).Drive();
    fileName.Append( KDC_APP_BITMAP_DIR );
    fileName.Append( KIconFileName );

    // Just one icon for providers which does not have own icon.
    MAknsSkinInstance* skinInstance = AknsUtils::SkinInstance();

    CGulIcon* defaultIcon( NULL );
    TRAPD( err, defaultIcon = AknsUtils::CreateGulIconL( 
        skinInstance, 
        KAknsIIDDefault,
        fileName, 
        EMbmAcpiconsQgn_prop_set_conn_voip, 
        EMbmAcpiconsQgn_prop_set_conn_voip ) );

    if ( KErrNone != err )
        {
        ACPLOG2( "CreateGulIconL error: %d", err );
        }

    CleanupStack::PushL( defaultIcon );
    aIconArray->AppendL( defaultIcon );
    CleanupStack::Pop( defaultIcon );

    ACPLOG( "CAcpProviderListContainer::LoadDefaultIconsL end");
    }

// ---------------------------------------------------------------------------
// CAcpProviderListContainer::ComponentControl
// From class CoeControl
// ---------------------------------------------------------------------------
//
CCoeControl* CAcpProviderListContainer::ComponentControl( 
    TInt /*aIndex*/ ) const
    {
    return iListBox;
    }

// ---------------------------------------------------------------------------
// From class CoeControl
// CAcpProviderListContainer::OfferKeyEventL
// ---------------------------------------------------------------------------
//
TKeyResponse CAcpProviderListContainer::OfferKeyEventL( 
    const TKeyEvent& aKeyEvent, TEventCode aType )
    {
    return iListBox->OfferKeyEventL( aKeyEvent, aType );
    }

// ---------------------------------------------------------------------------
// CAcpProviderListContainer::CountComponentControls
// From class CoeControl.
// ---------------------------------------------------------------------------
//
TInt CAcpProviderListContainer::CountComponentControls() const
    {
    return KComponentControlCount;
    }

// ---------------------------------------------------------------------------
// CAcpProviderListContainer::SizeChanged
// From class CoeControl.
// ---------------------------------------------------------------------------
//
void CAcpProviderListContainer::SizeChanged()
    {
    iListBox->SetRect( Rect() );
    }

// ---------------------------------------------------------------------------
// CAcpProviderListContainer::FocusChanged
// From class CoeControl.
// ---------------------------------------------------------------------------
//
void CAcpProviderListContainer::FocusChanged( TDrawNow aDrawNow )
    {
    CCoeControl::FocusChanged( aDrawNow );

    if ( iListBox )
        {
        iListBox->SetFocus( IsFocused() );
        }
    }

// ---------------------------------------------------------------------------
// CAcpProviderListContainer::HandleResourceChange
// From class CCoeControl.
// Called by framework when layout is changed.
// ---------------------------------------------------------------------------
//
void CAcpProviderListContainer::HandleResourceChange( TInt aType )
    {
    CCoeControl::HandleResourceChange(aType);

    // *****************************
    // ADDED FOR SCALABLE UI SUPPORT
    // *****************************
    if ( KEikDynamicLayoutVariantSwitch == aType )
        {
        TRect rect;
        AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, rect );
        SetRect( rect );
        }
    }

// End of file.