voipplugins/accountcreationplugin/src/acpproviderspecificcontainer.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 CAcpProviderSpecificContainer methods
*
*/


#include <aknlists.h>
#include <StringLoader.h>
#include <accountcreationplugin.rsg>
// SKIN: includes
#include <AknsDrawUtils.h>
#include <AknsBasicBackgroundControlContext.h>
#include <gdi.h>

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

const TInt KComponentControlCount = 6;
const TInt KScrollMin = -200;
const TInt KScrollMax = 10;
const TInt KEight = 8;
const TInt KPositionX = 10;
const TInt KScrollSpeed = 10;

// ---------------------------------------------------------------------------
// CAcpProviderSpecificContainer::CAcpProviderSpecificContainer
// ---------------------------------------------------------------------------
//
CAcpProviderSpecificContainer::CAcpProviderSpecificContainer( 
    CAcpController& aController )
    : iController( aController ), iScrollY( KScrollMax )
    {
    }

// ---------------------------------------------------------------------------
// CAcpProviderSpecificContainer::ConstructL
// ---------------------------------------------------------------------------
//
void CAcpProviderSpecificContainer::ConstructL( const TRect& aRect )
    {
    ACPLOG( "CAcpProviderSpecificContainer::ConstructL begin" );

    CreateWindowL();

    // Skin background.
    //SKIN: create the skin context for our control
    iBgContext = CAknsBasicBackgroundControlContext::NewL( 
        KAknsIIDQsnBgAreaMain, aRect, ETrue );

    // Provider.
    TInt index = iController.ActiveIndex();
    TPtrC providerName = iController.ProviderNameFromIndexL( index );
    TPtrC providerType = iController.ProviderTypeFromIndexL( index );
    TPtrC providerDescription = 
        iController.ProviderDescriptionFromIndexL( index );
    
    // Name label.
    iLabel = new (ELeave) CEikLabel;
    iLabel->SetContainerWindowL( *this );
    HBufC* typeText;
    typeText = StringLoader::LoadLC( R_SERVTAB_CD_DETAIL_NAME );
    iLabel->SetTextL( *typeText );
    CleanupStack::PopAndDestroy( typeText );

    // Type label.
    iLabel2 = new (ELeave) CEikLabel;
    iLabel2->SetContainerWindowL( *this );
    HBufC* typeText2;
    typeText2 = StringLoader::LoadLC( R_SERVTAB_CD_DETAIL_TYPE );
    iLabel2->SetTextL( *typeText2 );
    CleanupStack::PopAndDestroy( typeText2 );

    // Description label
    iLabel3 = new (ELeave) CEikLabel;
    iLabel3->SetContainerWindowL( *this );
    HBufC* typeText3;
    typeText3 = StringLoader::LoadLC( R_SERVTAB_CD_DETAIL_DESCRIPTION );
    iLabel3->SetTextL( *typeText3 );
    CleanupStack::PopAndDestroy( typeText3 ); 

    // Edwin for name.
    TResourceReader reader; 
    iCoeEnv->CreateResourceReaderLC( reader, R_ACP_TYPE );
    iEdwin = new (ELeave) CEikEdwin;
    iEdwin->SetContainerWindowL( *this );
    iEdwin->ConstructFromResourceL( reader );       
    CleanupStack::PopAndDestroy();
    if ( !providerName.Length() )
    	{
    	HBufC* typeText6;
        typeText6 = StringLoader::LoadLC( R_SERVTAB_CD_VALUE_UNDEFINED );
        iEdwin->SetTextL( typeText6 );
        CleanupStack::PopAndDestroy( typeText6 );
    	}
    else
        {
    	iEdwin->SetTextL( &providerName );
        }

    // Edwin for type.
    TResourceReader reader2; 
    iCoeEnv->CreateResourceReaderLC( reader2, R_ACP_TYPE );
    iEdwin2 = new (ELeave) CEikEdwin;
    iEdwin2->SetContainerWindowL( *this );
    iEdwin2->ConstructFromResourceL( reader2 );       
    CleanupStack::PopAndDestroy();
    if ( !providerType.Length() )
    	{
    	HBufC* typeText7;
        typeText7 = StringLoader::LoadLC( R_SERVTAB_CD_VALUE_UNDEFINED );
        iEdwin2->SetTextL( typeText7 );
        CleanupStack::PopAndDestroy( typeText7 );
    	}
    else
        {
    	iEdwin2->SetTextL( &providerType );
        }

    // Edwin for description.
    TResourceReader reader3; 
    iCoeEnv->CreateResourceReaderLC( reader3, R_ACP_TYPE );
    iEdwin3 = new (ELeave) CEikEdwin;
    iEdwin3->SetContainerWindowL( *this );
    iEdwin3->ConstructFromResourceL( reader3 );       
    CleanupStack::PopAndDestroy();
    if ( !providerDescription.Length() )
    	{
    	HBufC* typeText8;
        typeText8 = StringLoader::LoadLC( R_SERVTAB_CD_VALUE_UNDEFINED );
        iEdwin3->SetTextL( typeText8 );
        CleanupStack::PopAndDestroy( typeText8 );
    	}
    else
        {
    	iEdwin3->SetTextL( &providerDescription );
        }
    
    // Get label colours from skin.
    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
    TRgb color( 0, 0, 0 );
    
    AknsUtils::GetCachedColor( skin, color, KAknsIIDQsnTextColors,
        EAknsCIQsnTextColorsCG6 );
    iLabel->OverrideColorL( EColorLabelText, color );
    iLabel->SetEmphasis( CEikLabel::ENoEmphasis );
    iLabel2->OverrideColorL(EColorLabelText, color );
    iLabel2->SetEmphasis( CEikLabel::ENoEmphasis );
    iLabel3->OverrideColorL(EColorLabelText, color );
    iLabel3->SetEmphasis( CEikLabel::ENoEmphasis );
    
    CCharFormatLayer* formatLayer = CEikonEnv::NewDefaultCharFormatLayerL();
    CleanupStack::PushL( formatLayer );
    
    TCharFormat format;
    TCharFormatMask formatMask;
    formatLayer->Sense( format, formatMask );
    format.iFontPresentation.iTextColor = color;
    formatMask.SetAttrib( EAttColor );
    formatLayer->SetL( format, formatMask );
    
    iEdwin->SetCharFormatLayer( formatLayer->CloneL() );
    iEdwin2->SetCharFormatLayer( formatLayer->CloneL() );
    
    CleanupStack::Pop( formatLayer );
    iEdwin3->SetCharFormatLayer( formatLayer );
        
    SetRect( aRect );
    ActivateL();

    ACPLOG( "CAcpProviderSpecificContainer::ConstructL end" );
    }

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

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

// ---------------------------------------------------------------------------
// CAcpProviderSpecificContainer::~CAcpProviderSpecificContainer
// ---------------------------------------------------------------------------
//
CAcpProviderSpecificContainer::~CAcpProviderSpecificContainer()
    {
    ACPLOG( 
      "CAcpProviderSpecificContainer::~CAcpProviderSpecificContainer begin" );

    delete iLabel;
    delete iLabel2;
    delete iLabel3;
    delete iEdwin;
    delete iEdwin2;    
    delete iEdwin3;
    delete iBgContext;

    ACPLOG( 
        "CAcpProviderSpecificContainer::~CAcpProviderSpecificContainer end" );
    }

// ---------------------------------------------------------------------------
// CAcpProviderSpecificContainer::ComponentControl
// From class CoeControl.
// ---------------------------------------------------------------------------
//
CCoeControl* CAcpProviderSpecificContainer::ComponentControl( 
    TInt aIndex ) const
    {
    const TInt KZeroCase  = 0;
    const TInt KOneCase   = 1;
    const TInt KTwoCase   = 2;
    const TInt KThreeCase = 3;
    const TInt KFourCase  = 4;
    const TInt KFiveCase  = 5;

    switch ( aIndex )
        {
            case KZeroCase:
                return iLabel;
            case KOneCase:
                return iLabel2;
    		case KTwoCase:
    			return iLabel3;
    		case KThreeCase:
    			return iEdwin;
    		case KFourCase:
    			return iEdwin2;	
    		case KFiveCase: 
    			return iEdwin3;
            default:
                return NULL;
        }
    }

// ---------------------------------------------------------------------------
// CAcpProviderSpecificContainer::MopSupplyObject
// From class CCoeControl.
// SKIN: pass context to child controls.
// ---------------------------------------------------------------------------
//
TTypeUid::Ptr CAcpProviderSpecificContainer::MopSupplyObject( TTypeUid aId )
    {
    if ( iBgContext )
        {
        return MAknsControlContext::SupplyMopObject( aId, iBgContext );
        }
    return CCoeControl::MopSupplyObject( aId );
    }

// ---------------------------------------------------------------------------
// CAcpProviderSpecificContainer::Draw
// From class CoeControl.
// ---------------------------------------------------------------------------
//
void CAcpProviderSpecificContainer::Draw( const TRect& aRect ) const
    {
    // Get the standard graphics context.
    CWindowGc& gc = SystemGc();

    // Draw skin backgound.
    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
  	MAknsControlContext* cc = AknsDrawUtils::ControlContext( this );
    AknsDrawUtils::Background( skin, cc, this, gc, aRect );
    }

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

// ---------------------------------------------------------------------------
// CAcpProviderSpecificContainer::SizeChanged
// From class CoeControl.
// ---------------------------------------------------------------------------
//
void CAcpProviderSpecificContainer::SizeChanged()
    {
    RepositionLabels();

    // Redraw the control.
    DrawDeferred();
    }

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

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

// ---------------------------------------------------------------------------
// CAcpProviderSpecificContainer::ScrollText
// Scrolls text labels up or down.
// ---------------------------------------------------------------------------
//
void CAcpProviderSpecificContainer::ScrollText( TInt aDelta )
    {
    ACPLOG( "CAcpProviderSpecificContainer::ScrollText begin" );
    
    iScrollY += aDelta;
    if ( iScrollY > KScrollMax ) 
        {
        iScrollY = KScrollMax;
        }
    else if ( iScrollY < KScrollMin )
        {
        iScrollY = KScrollMin;
        }
    
    RepositionLabels();
    
    // Redraw the control.
    DrawDeferred();
    
    ACPLOG( "CAcpProviderSpecificContainer::ScrollText end" );
    }

// ---------------------------------------------------------------------------
// CAcpProviderSpecificContainer::RepositionLabels
// ---------------------------------------------------------------------------
//
void CAcpProviderSpecificContainer::RepositionLabels()
    {
    const TInt KWidthX = Rect().Width() - KPositionX;
    const TInt KDeltaY = Rect().Height() / KEight;
    
    TInt yPos = iScrollY;
    iLabel->SetExtent( TPoint( KPositionX, yPos ), 
        TSize( KWidthX, KDeltaY ) );
    yPos += KDeltaY;

    iEdwin->SetExtent( TPoint( KPositionX, yPos ), 
        TSize( KWidthX, KDeltaY ) );
    yPos += KDeltaY;

    iLabel2->SetExtent( TPoint( KPositionX, yPos ), 
        TSize( KWidthX, KDeltaY ) );
    yPos += KDeltaY;

    iEdwin2->SetExtent( TPoint( KPositionX, yPos ), 
        TSize( KWidthX, KDeltaY ) );
    yPos += KDeltaY;

    iLabel3->SetExtent( TPoint( KPositionX, yPos ), 
        TSize( KWidthX, KDeltaY ) );
    yPos += KDeltaY;

    iEdwin3->SetExtent( TPoint( KPositionX, yPos ), 
        TSize( KWidthX, Rect().Height() ) );
    }

// ---------------------------------------------------------------------------
// CAcpProviderSpecificContainer::OfferKeyEventL
// Handles key events.
// ---------------------------------------------------------------------------
//
TKeyResponse CAcpProviderSpecificContainer::OfferKeyEventL(
    const TKeyEvent& aKeyEvent, TEventCode aType )
    {
    ACPLOG( "CAcpProviderSpecificContainer::OfferKeyEventL begin" );
    
    TKeyResponse ret = EKeyWasNotConsumed;
    
    switch ( aKeyEvent.iScanCode )
        {
        case EStdKeyUpArrow:
            if ( aType != EEventKeyUp )
                {
                ScrollText( KScrollSpeed );
                ret = EKeyWasConsumed;
                }
            break;
            
        case EStdKeyDownArrow:
            if ( aType != EEventKeyUp )
                {
                ScrollText( -KScrollSpeed );
                ret = EKeyWasConsumed;
                }
            break;
            
        default:
            break;
        }
    
    ACPLOG( "CAcpProviderSpecificContainer::OfferKeyEventL end" );
    return ret;
    }


// End of file.