diff -r 000000000000 -r 5f000ab63145 phoneuis/BubbleManager/Src/BMTouchPaneButton.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phoneuis/BubbleManager/Src/BMTouchPaneButton.cpp Mon Jan 18 20:18:27 2010 +0200 @@ -0,0 +1,412 @@ +/* +* Copyright (c) 2006-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: Button for touch pane. +* +*/ + +#include +#include +#include +#include +#include +#include +#include + +#include "bmtouchpanebutton.h" +#include "BMTouchPaneInterface.h" +#include "bmpanic.h" + + +const TInt KBubbleButtonText = 255; + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// C++ default constructor +// --------------------------------------------------------------------------- +// +CBubbleTouchPaneButton::CBubbleTouchPaneButton( + MBubbleTouchPaneIconProvider* aIconProvider, + const TInt aFlags ) : + CAknButton( aFlags ), + iIconProvider( aIconProvider ) + { + } + +// ----------------------------------------------------------------------------- +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CBubbleTouchPaneButton* CBubbleTouchPaneButton::NewL( + MBubbleTouchPaneIconProvider* aIconProvider, + const TInt aFlags ) + { + CBubbleTouchPaneButton* self = + new(ELeave) CBubbleTouchPaneButton( aIconProvider, aFlags ); + CleanupStack::PushL( self ); + self->ConstructL(); + + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// Symbian 2nd phase constructor +// ----------------------------------------------------------------------------- +// +void CBubbleTouchPaneButton::ConstructL() + { + CAknButton::ConstructL(); + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CBubbleTouchPaneButton::~CBubbleTouchPaneButton() + { + iCommands.Close(); + } + +// --------------------------------------------------------------------------- +// CBubbleTouchPaneButton::ConstructFromResouceL +// --------------------------------------------------------------------------- +// +void CBubbleTouchPaneButton::ConstructFromResouceL( TResourceReader& aReader ) + { + + TInt commandCount = aReader.ReadInt16(); + for ( TInt i=0; i < commandCount; i++ ) + { + TInt command = aReader.ReadInt16(); + iCommands.AppendL( command ); + } + + aReader.ReadInt16(); // this is mystery? + + CAknButton::ConstructFromResourceL( aReader ); + + // function button text color + SetTextColorIds( KAknsIIDQsnTextColors, + EAknsCIQsnTextColorsCG65 ); + + // Customize icons + if ( iIconProvider ) + { + LoadCustomIcons( *iIconProvider ); + } + + if ( State()->Icon() ) + { + SetIconScaleMode( EAspectRatioPreserved ); + } + } + +// --------------------------------------------------------------------------- +// CBubbleTouchPaneButton::LoadCustomIconsL +// --------------------------------------------------------------------------- +// +void CBubbleTouchPaneButton::LoadCustomIcons( + MBubbleTouchPaneIconProvider& aIconProvider ) + { + TInt commandCount = iCommands.Count(); + + for ( TInt i=0; i < commandCount; i++ ) + { + CGulIcon* icon = NULL; + + TRAPD( err, icon = aIconProvider.GetIconForCommandL( + iCommands[i] ) ); + + if ( !err && icon ) + { + CAknButtonState* state = State( i ); + // State takes ownership of icon + state->SetIcon( icon ); + } + } + } + +// --------------------------------------------------------------------------- +// CBubbleTouchPaneButton::CommandId +// --------------------------------------------------------------------------- +// +TInt CBubbleTouchPaneButton::CommandId( TBool aPreviousState ) const + { + __ASSERT_DEBUG( iCommands.Count(), Panic( EBMPanicTouchPane ) ); + + TInt command; + if ( iCommands.Count() > 1 ) + { + TInt index = StateIndex(); + if ( aPreviousState ) + { + // return command from previous state + index -= 1; + if ( index < 0 ) + { + index = iCommands.Count() - 1; + } + } + + command = iCommands[index]; + } + else + { + command = iCommands[0]; + } + + return command; + } + +// --------------------------------------------------------------------------- +// CBubbleTouchPaneButton::SetState +// --------------------------------------------------------------------------- +// +void CBubbleTouchPaneButton::SetState( TInt aCommand, + TBool aDrawNow ) + { + for ( TInt i=0; i < iCommands.Count(); i++ ) + { + if ( iCommands[i] == aCommand ) + { + if ( i != StateIndex() ) + { + SetCurrentState( i, aDrawNow ); + } + } + } + } + +// --------------------------------------------------------------------------- +// CBubbleTouchPaneButton::SetDimmed +// --------------------------------------------------------------------------- +// +void CBubbleTouchPaneButton::SetDimmed( TBool aDimmed ) + { + CAknButton::SetDimmed( aDimmed ); + DrawDeferred(); + } + +// --------------------------------------------------------------------------- +// CBubbleTouchPaneButton::HasState +// --------------------------------------------------------------------------- +// +TBool CBubbleTouchPaneButton::HasState( TInt aCommand ) const + { + TBool hasState = EFalse; + + for ( TInt i=0; i < iCommands.Count(); i++ ) + { + if ( iCommands[i] == aCommand ) + { + hasState = ETrue; + break; + } + } + + return hasState; + } + + +// --------------------------------------------------------------------------- +// Draw button, text and icon. +// --------------------------------------------------------------------------- +// +void CBubbleTouchPaneButton::Draw( const TRect& aRect ) const + { + TAknsItemID frameId( KAknsIIDQsnFrButtonNormal ); + TAknLayoutRect centerLayout; + centerLayout.LayoutRect( aRect, + AknLayoutScalable_Avkon::toolbar_button_pane_g1().LayoutLine() ); + TRect innerRect = centerLayout.Rect(); + + CWindowGc& gc = SystemGc(); + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + + TInt commandCount = iCommands.Count(); + + for ( TInt i=0; i < commandCount; i++ ) + { + frameId = iIconProvider->GetButtonForCommandL( + iCommands[i]); + + if ( iButtonPressed ) + { + frameId = SelectPressedButton( frameId ); + } + else if ( IsDimmed() ) + { + frameId = SelectDimmedButton( frameId ); + } + + 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 ); + } + } + +// -------------------------------------------------------------------------- +// Draw text and icon according to the layout. +// -------------------------------------------------------------------------- + +void CBubbleTouchPaneButton::LayoutIconAndText( CWindowGc& aGc ) const + { + TRect parentRect( Rect() ); + CAknButtonState* state = State(); + if ( !state || + !state->Icon() || + !state->Text().Length() ) + { + return; + } + + TRgb penColor; + TRgb brushColor; + GetTextColors( penColor ); + + // buffer for visually ordered text + TBuf< KBubbleButtonText + 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, ETrue ); + } + } + } + +// --------------------------------------------------------------------------- +// CBubbleTouchPaneButton::SetLayout +// --------------------------------------------------------------------------- +// +void CBubbleTouchPaneButton::SetLayout( const TAknLayoutText aLayoutText, + const TRect aIconRect ) + { + iLayoutText = aLayoutText; + iIconRect = aIconRect; + } + +// --------------------------------------------------------------------------- +// CBubbleTouchPaneButton::HandleResourceChange +// --------------------------------------------------------------------------- +// +void CBubbleTouchPaneButton::HandleResourceChange( TInt aType ) + { + CAknButton::HandleResourceChange( aType ); + + if ( aType == KAknsMessageSkinChange && + iIconProvider ) + { + LoadCustomIcons( *iIconProvider ); + } + } + +// ----------------------------------------------------------------------------- +// Gets the correct text color. +// ----------------------------------------------------------------------------- +// +void CBubbleTouchPaneButton::GetTextColors( TRgb& aPenColor ) const + { + if ( IsDimmed() ) + { + aPenColor = iEikonEnv->ControlColor( EColorButtonTextDimmed, *this ); + } + else if ( iButtonPressed ) + { + aPenColor = iEikonEnv->ControlColor( EColorButtonTextPressed, *this ); + } + else + { + aPenColor = iEikonEnv->ControlColor( EColorButtonText, *this ); + } + } + +// ----------------------------------------------------------------------------- +// Selects the correct pressed button. +// ----------------------------------------------------------------------------- +// +TAknsItemID CBubbleTouchPaneButton::SelectPressedButton( TAknsItemID frameId ) const + { + if( frameId == KAknsIIDQsnFrButtonNormalAnswer ) + { + return KAknsIIDQsnFrButtonPressedAnswer; + } + else if( frameId == KAknsIIDQsnFrButtonNormalReject ) + { + return KAknsIIDQsnFrButtonPressedReject; + } + else if( frameId == KAknsIIDQsnFrButtonNormalHold ) + { + return KAknsIIDQsnFrButtonPressedHold; + } + else + { + return KAknsIIDQsnFrButtonPressed; + } + } + +// ----------------------------------------------------------------------------- +// Selects the correct dimmed button. +// ----------------------------------------------------------------------------- +// + TAknsItemID CBubbleTouchPaneButton::SelectDimmedButton( TAknsItemID frameId ) const + { + if( frameId == KAknsIIDQsnFrButtonNormalAnswer ) + { + return KAknsIIDQsnFrButtonInactiveAnswer; + } + else if( frameId == KAknsIIDQsnFrButtonNormalReject ) + { + return KAknsIIDQsnFrButtonInactiveReject; + } + else if( frameId == KAknsIIDQsnFrButtonNormalHold ) + { + return KAknsIIDQsnFrButtonInactiveHold; + } + else + { + return KAknsIIDQsnFrButtonInactive; + } + }