vtuis/videotelui/src/CVtUiEndCallButton.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:29:12 +0100
branchRCL_3
changeset 25 779871d1e4f4
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* Copyright (c) 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:  Button of ending call.
*
*/


#include    <AknsConstants.h>
#include    <AknsSkinInstance.h>
#include    <data_caging_path_literals.hrh>
#include    <AknsFrameBackgroundControlContext.h>
#include    <aknlayoutscalable_avkon.cdl.h>
#include    <AknsDrawUtils.h>
#include    <gulicon.h>
#include    <AknIconUtils.h>
#include    <AknBidiTextUtils.h>
#include    <cvtlogger.h>

#include    "CVtUiEndCallButton.h"
#include    "VtUiLayout.h"

const TInt KEndCallButtonText = 255;

// -----------------------------------------------------------------------------
// CVtUiEndCallButton::CVtUiEndCallButton
// -----------------------------------------------------------------------------
//
CVtUiEndCallButton::CVtUiEndCallButton(): CAknButton( 0 )
    {
    // No implementation required
    }

// -----------------------------------------------------------------------------
// CVtUiEndCallButton::NewL
// -----------------------------------------------------------------------------
//
CVtUiEndCallButton* CVtUiEndCallButton::NewL()
    {
    CVtUiEndCallButton* self = new (ELeave) CVtUiEndCallButton();
    CleanupStack::PushL(self);
    self->ConstructL();
    CleanupStack::Pop(); // self;
    return self;
    }

// -----------------------------------------------------------------------------
// CVtUiEndCallButton::ConstructL
// -----------------------------------------------------------------------------
//
void CVtUiEndCallButton::ConstructL()
    {
    CAknButton::ConstructL();
    }

// -----------------------------------------------------------------------------
// CVtUiEndCallButton::~CVtUiEndCallButton
// -----------------------------------------------------------------------------
//
CVtUiEndCallButton::~CVtUiEndCallButton()
    {
    }

// -----------------------------------------------------------------------------
// CVtUiEndCallButton::ConstructFromResourceL
// -----------------------------------------------------------------------------
//
void CVtUiEndCallButton::ConstructFromResourceL( const TInt aResourceId )
    {    
    CAknButton::ConstructFromResourceL( aResourceId );
    
    // function button text color
    SetTextColorIds( KAknsIIDQsnTextColors, 
                              EAknsCIQsnTextColorsCG65 );
    
    // Customize icons
    LoadButtonIcon( EVtUiBitmap_qgn_indi_button_end_active_call,
                    EVtUiBitmap_qgn_indi_button_end_active_call_mask );
    
    if ( State()->Icon() )
        {
        SetIconScaleMode( EAspectRatioPreserved );
        }
    }

// -----------------------------------------------------------------------------
// CVtUiEndCallButton::SetLayout
// -----------------------------------------------------------------------------
//
void CVtUiEndCallButton::SetLayout( const TAknLayoutText aLayoutText,
                                        const TRect aIconRect ) 
    {
    iLayoutText = aLayoutText;
    iIconRect = aIconRect;
    } 

// -----------------------------------------------------------------------------
// CVtUiEndCallButton::Draw
// -----------------------------------------------------------------------------
//
void CVtUiEndCallButton::Draw(const TRect& aRect) const
    {
    __VTPRINTENTER( "CCVtUiEndCallButton::Draw" )
    TAknLayoutRect centerLayout;
    centerLayout.LayoutRect( aRect,
        AknLayoutScalable_Avkon::toolbar_button_pane_g1().LayoutLine() );
    TRect innerRect = centerLayout.Rect();
    CWindowGc& gc = SystemGc();
    MAknsSkinInstance* skin = AknsUtils::SkinInstance();

    TAknsItemID frameId = KAknsIIDQsnFrButtonNormalReject;
    
    if ( iButtonPressed )
        {
        frameId = KAknsIIDQsnFrButtonPressedReject;
        }
    else if ( IsDimmed() )
        {
        frameId = KAknsIIDQsnFrButtonInactiveReject;
        }    
    
    iBgContext->SetFrame( frameId );
    iBgContext->SetCenter( KAknsIIDQsnFrButtonCenterNormal );
    iBgContext->SetFrameRects( aRect, innerRect );
    
    if ( !AknsDrawUtils::Background( skin, 
                                    iBgContext, 
                                    NULL, 
                                    gc, 
                                    aRect, 
                                    KAknsDrawParamNoClearUnderImage ) )
        {
        gc.SetBrushColor( KRgbRed );
        gc.SetBrushStyle( CGraphicsContext::ESolidBrush );
        gc.DrawRect( aRect );
        }
    
    LayoutIconAndText( gc );
    __VTPRINTEXIT( "CCVtUiEndCallButton::Draw" )
    }

// -----------------------------------------------------------------------------
// CVtUiEndCallButton::HandleResourceChange
// -----------------------------------------------------------------------------
//
void CVtUiEndCallButton::HandleResourceChange( TInt aType )
    {
    __VTPRINTENTER( "CCVtUiEndCallButton::HandleResourceChange" )
    CAknButton::HandleResourceChange( aType );
    
    if ( aType == KAknsMessageSkinChange )
        {
        LoadButtonIcon( EVtUiBitmap_qgn_indi_button_end_active_call,
                        EVtUiBitmap_qgn_indi_button_end_active_call_mask );
        }
    __VTPRINTEXIT( "CCVtUiEndCallButton::HandleResourceChange" )
    }

// -----------------------------------------------------------------------------
// CVtUiEndCallButton::GetTextColors
// -----------------------------------------------------------------------------
//
void CVtUiEndCallButton::GetTextColors( TRgb& aPenColor ) const
    {
    __VTPRINTENTER( "CCVtUiEndCallButton::GetTextColors" )
    if ( IsDimmed() ) 
        {
        aPenColor = iEikonEnv->ControlColor( EColorButtonTextDimmed, *this ); 
        }
    else if ( iButtonPressed )
        {
        aPenColor = iEikonEnv->ControlColor( EColorButtonTextPressed, *this );
        }
    else
        {
        aPenColor = iEikonEnv->ControlColor( EColorButtonText, *this );
        }
    __VTPRINTEXIT( "CCVtUiEndCallButton::GetTextColors" )
    } 

// -----------------------------------------------------------------------------
// CVtUiEndCallButton::LoadButtonIcon
// -----------------------------------------------------------------------------
//
void CVtUiEndCallButton::LoadButtonIcon( TVtUiBitmapId aIconId, TVtUiBitmapId aMaskId )
    {
    __VTPRINTENTER( "CCVtUiEndCallButton::LoadButtonIcon" )
    CGulIcon* icon = NULL;
    TFileName fileName;
    TInt fileIndex;
    TInt maskIndex;
    TAknsItemID skinId = 
        VtUiLayout::MapBitmapToSkinId( aIconId );
    VtUiLayout::Resolve( aIconId, fileName, fileIndex );
    VtUiLayout::Resolve( aMaskId, fileName, maskIndex );
        
    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
    
    icon = AknsUtils::CreateGulIconL( skin, 
                                      skinId, 
                                      fileName, 
                                      fileIndex,
                                      maskIndex );
    
    if ( icon )       
        {
        CAknButtonState* state = State();
        // State takes ownership of icon
        state->SetIcon( icon );
        }
        __VTPRINTEXIT( "CCVtUiEndCallButton::LoadButtonIcon" )
    }

// -----------------------------------------------------------------------------
// CVtUiEndCallButton::LayoutIconAndText
// -----------------------------------------------------------------------------
//
void CVtUiEndCallButton::LayoutIconAndText( CWindowGc& aGc ) const
    {
    __VTPRINTENTER( "CCVtUiEndCallButton::LayoutIconAndText" )
    CAknButtonState* state = State();
    if ( !state  ||       
         !state->Icon() ||
         !state->Text().Length() )
        {
        return;
        } 
    TRgb penColor;
    TRgb brushColor;
    GetTextColors( penColor ); 
    
    // buffer for visually ordered text
    TBuf< KEndCallButtonText + KAknBidiExtraSpacePerLine> visualText; 
    TInt clipWidth = iLayoutText.TextRect().Width();
        
    // bidi processing - using AknBidiTextUtils.
    AknBidiTextUtils::ConvertToVisualAndClip(
            state->Text(),
            visualText,
            *iLayoutText.Font(),
            clipWidth,
            clipWidth );
    
    iLayoutText.DrawText( aGc, visualText, EFalse, penColor );
    
    const CGulIcon* icon = GetCurrentIcon();

    if ( icon )
        {
        CFbsBitmap* buttonBmp = icon->Bitmap();
        CFbsBitmap* buttonMask = icon->Mask();
        
        if( buttonBmp && buttonMask )
            {
            aGc.BitBltMasked( iIconRect.iTl, buttonBmp,
                    iIconRect.Size(), buttonMask, EFalse );
            }
        }
    __VTPRINTEXIT( "CCVtUiEndCallButton::LayoutIconAndText" )
    }