diff -r a1caeb42b3a3 -r fcdfafb36fe7 uifw/EikStd/coctlsrc/AknButton.cpp --- a/uifw/EikStd/coctlsrc/AknButton.cpp Thu Jul 15 18:56:19 2010 +0300 +++ b/uifw/EikStd/coctlsrc/AknButton.cpp Thu Aug 19 10:11:06 2010 +0300 @@ -264,6 +264,9 @@ // Sets bitmaps to resource provider (if one exists) void SetProviderPressedBmpsL(); + + //Verify new rectagle size equals to the original + TBool TextRectSizeChanged( TRect aNewRect ); private: // Data @@ -293,6 +296,7 @@ TBool iFeedbackEnabled; TAknsItemID iBackgroundSkinIID; TRect iBgFrameRect; + TRect iTextRect; }; // ============================ MEMBER FUNCTIONS =============================== @@ -327,6 +331,7 @@ iIconSize = layoutRect.Rect().Size(); iFlags.Set( EUseDefaultIconSize ); iFlags.Set( EUseDefaultMargins ); + iTextRect = TRect::EUninitialized; } // ----------------------------------------------------------------------------- @@ -517,6 +522,20 @@ } } +//Verify new rectangle size equals to the original +TBool CAknButtonExtension::TextRectSizeChanged( TRect aNewRect ) + { + TBool result( ETrue ); + if ( !iTextRect.IsEmpty() && !aNewRect.IsEmpty() ) + { + if ( iTextRect.Width() == aNewRect.Width() + && iTextRect.Height() == aNewRect.Height() ) + { + result = EFalse; + } + } + return result; + } // @@ -1682,7 +1701,6 @@ } iExtension->HandleFeedbackAreaChange(); SetFrameIDs(); - ConvertTextToVisualAndClip(); } // ----------------------------------------------------------------------------- @@ -2257,7 +2275,6 @@ TRAP_IGNORE( CreatePressedDownFrameL() ); } SetFrameRects(); - ConvertTextToVisualAndClip(); iExtension->HandleFeedbackAreaChange(); } @@ -2829,19 +2846,12 @@ // ----------------------------------------------------------------------------- // EXPORT_C void CAknButton::SetButtonFlags( const TInt aFlags ) - { + { if ( !( iFlags & KAknButtonNoFrame ) ) { if ( aFlags & KAknButtonNoFrame ) { - iExtension->iMargins.SetAllValuesTo( 0 ); - ConvertTextToVisualAndClip(); - } - // aFlags does not include KAknButtonNoFrame - else if ( iFlags & KAknButtonTextInsideFrame != - aFlags & KAknButtonTextInsideFrame ) - { - ConvertTextToVisualAndClip(); + iExtension->iMargins.SetAllValuesTo( 0 ); } } if ( aFlags & KAknButtonHitTest ) @@ -2853,14 +2863,6 @@ { TRAP_IGNORE ( CreatePressedDownFrameL() ); } - if ( iFlags & KAknButtonNoFrame && !( aFlags & KAknButtonNoFrame ) ) - { - SetFrameIDs(); - if ( aFlags & KAknButtonTextInsideFrame ) - { - ConvertTextToVisualAndClip(); - } - } iFlags = aFlags; } @@ -2957,7 +2959,7 @@ EXPORT_C void CAknButton::SetTextFont( const CFont* aFont ) { iFont = aFont; - ConvertTextToVisualAndClip(); + ConvertTextToVisualAndClip( iExtension->iTextRect ); } // ----------------------------------------------------------------------------- @@ -3522,25 +3524,15 @@ // void CAknButton::DrawTextButton( CWindowGc& aGc ) const { + TRect textRect; + + TRect iconRect; //this is no use + GetCurrentStateTextAndIconRect( iconRect, textRect ); + CAknButtonState* state = State(); - if ( !state || !state->HasText() ) - return; - - if ( state->TextChanged() ) + if ( state->TextChanged() || iExtension->TextRectSizeChanged( textRect ) ) { - ConvertTextToVisualAndClip(); - } - - TRect textRect = iExtension->iMargins.InnerRect( Rect() ); - - if ( !( iFlags & KAknButtonNoFrame ) && - ( iFlags & KAknButtonTextInsideFrame ) ) - { - TAknLayoutRect center; - center.LayoutRect( Rect(), - AknLayoutScalable_Avkon::toolbar_button_pane_g1().LayoutLine() ); - - textRect = center.Rect(); + ConvertTextToVisualAndClip( textRect ); } DrawText( aGc, textRect ); } @@ -3608,13 +3600,13 @@ // void CAknButton::DrawIconButton( CWindowGc& aGc ) const { - TRect iconRect( iExtension->iMargins.InnerRect( Rect() ) ); + TRect iconRect; + TRect textRect; + GetCurrentStateTextAndIconRect( iconRect, textRect ); aGc.SetBrushStyle( CGraphicsContext::ENullBrush ); const CGulIcon* icon = GetCurrentIcon(); - if ( !icon ) - return; CFbsBitmap* buttonBmp = icon->Bitmap(); CFbsBitmap* buttonMask = icon->Mask(); @@ -3696,102 +3688,24 @@ if ( !state || !state->HasText() ) { return; - } - if ( state->TextChanged() ) - { - ConvertTextToVisualAndClip(); - } + } const CGulIcon* icon = GetCurrentIcon(); - if ( !icon ) - { - return; - } - - TRect rect = iExtension->iMargins.InnerRect( Rect() ); + + TRect iconRect; TRect textRect; + GetCurrentStateTextAndIconRect( iconRect, textRect ); - if ( !( iFlags & KAknButtonNoFrame ) && - ( iFlags & KAknButtonTextInsideFrame )) - { - TAknLayoutRect centerLayout; - centerLayout.LayoutRect( rect, - AknLayoutScalable_Avkon::toolbar_button_pane_g1().LayoutLine() ); - rect = centerLayout.Rect(); - } - CFbsBitmap* buttonBmp = icon->Bitmap(); CFbsBitmap* buttonMask = icon->Mask(); TSize iconSize ( buttonBmp->SizeInPixels()); - // Set rects for icon and text according to their positioning - // First icon rect according to icon size - rest is for text - - switch ( iExtension->iTextAndIconAlignment ) + + if ( state->TextChanged() || iExtension->TextRectSizeChanged( textRect ) ) { - case EIconBeforeText: - if ( AknLayoutUtils::LayoutMirrored() ) - { - textRect.SetRect( rect.iTl.iX, rect.iTl.iY, - rect.iBr.iX - iconSize.iWidth, rect.iBr.iY); - iconRect.SetRect( rect.iTl.iX + - rect.Width() -iconSize.iWidth, - rect.iTl.iY, rect.iBr.iX, rect.iBr.iY ); - } - else - { - iconRect.SetRect( rect.iTl.iX, rect.iTl.iY, - rect.iTl.iX + iconSize.iWidth, rect.iBr.iY); - textRect.SetRect( rect.iTl.iX + iconSize.iWidth, - rect.iTl.iY, rect.iBr.iX, rect.iBr.iY ); - } - - break; - - case EIconAfterText: - if ( AknLayoutUtils::LayoutMirrored() ) - { - iconRect.SetRect( rect.iTl.iX, rect.iTl.iY, - rect.iTl.iX + iconSize.iWidth, rect.iBr.iY); - textRect.SetRect( rect.iTl.iX + iconSize.iWidth, - rect.iTl.iY, rect.iBr.iX, rect.iBr.iY ); - } - else - { - textRect.SetRect( rect.iTl.iX, rect.iTl.iY, - rect.iBr.iX - iconSize.iWidth, rect.iBr.iY); - iconRect.SetRect( rect.iTl.iX + - rect.Width() -iconSize.iWidth, - rect.iTl.iY, rect.iBr.iX, rect.iBr.iY ); - } - break; - - case EIconOverText: - iconRect.SetRect( rect.iTl.iX, rect.iTl.iY, - rect.iBr.iX, rect.iTl.iY + iconSize.iHeight ); - textRect.SetRect( rect.iTl.iX, rect.iTl.iY + iconSize.iHeight, - rect.iBr.iX, rect.iBr.iY ); - break; - - case EIconUnderText: - textRect.SetRect( rect.iTl.iX, rect.iTl.iY, - rect.iBr.iX, rect.iBr.iY - iconSize.iHeight ); - iconRect.SetRect( rect.iTl.iX, rect.iBr.iY - iconSize.iHeight, - rect.iBr.iX, rect.iBr.iY ); - break; - - case EOverlay: - { - textRect = rect; - iconRect = rect; - } - break; - - default: - return; + ConvertTextToVisualAndClip( textRect ); } - // Draw icon TPoint iconPoint; switch ( iExtension->iHorizontalIconAlignment ) @@ -4541,6 +4455,13 @@ iHelpNote->SetTimeDelayBeforeShow( iHelpNoteWaitInterval ); iHelpNote->SetTimePopupInView( iHelpNoteInViewInterval ); iHelpNote->SetTooltipModeL( ETrue ); + + //When state changed, empty rect to enable recalculate the + //visual text if text exists in current state. + if ( !(iExtension->iTextRect.IsEmpty()) ) + { + iExtension->iTextRect = TRect::EUninitialized; + } } } @@ -4625,7 +4546,7 @@ // CAknButton::ConvertTextToVisualAndClip // ----------------------------------------------------------------------------- // -void CAknButton::ConvertTextToVisualAndClip() const +void CAknButton::ConvertTextToVisualAndClip( const TRect& aRect ) const { CAknButtonState* state = State(); if ( !state || !state->HasText() ) @@ -4637,18 +4558,22 @@ return; } - TRect textRect = iExtension->iMargins.InnerRect( Rect() ); - - if ( !( iFlags & KAknButtonNoFrame ) && - ( iFlags & KAknButtonTextInsideFrame ) ) + TRect textRect( aRect ); + //Using given rect to calculate the visual text if it's not empty. + if ( !textRect.IsEmpty() ) { - TAknLayoutRect center; - center.LayoutRect( Rect(), - AknLayoutScalable_Avkon::toolbar_button_pane_g1().LayoutLine() ); - - textRect = center.Rect(); + iExtension->iTextRect = textRect; } - + //Calculate text area. + //This branch means that it's the first calling after the state changed + //or client using new font before this is shown. + else + { + TRect iconRect; + GetCurrentStateTextAndIconRect( iconRect, textRect ); + iExtension->iTextRect = textRect; + } + TInt clipWidth = textRect.Width(); const CFont* font = iFont; @@ -4665,6 +4590,135 @@ clipWidth, clipWidth ); } + +// ----------------------------------------------------------------------------- +// CAknButton::GetCurrentStateTextAndIconRect() +// Get rect for icon and text of the current button state . +// ----------------------------------------------------------------------------- +// +void CAknButton::GetCurrentStateTextAndIconRect( TRect& aIconRect, + TRect& aTextRect ) const + { + TRect iconRect( TRect::EUninitialized ) ; + TRect textRect( TRect::EUninitialized ); + + CAknButtonState* state = State(); + + //Return directly if no state + if ( !state ) + { + aIconRect = iconRect; + aTextRect = textRect; + return; + } + + TBool hasText( state->HasText() ); + TBool hasIcon( EFalse ); + + const CGulIcon* icon = GetCurrentIcon(); + if ( icon ) + { + hasIcon = ETrue; + } + + TRect rect = iExtension->iMargins.InnerRect( Rect() ); + + //Icon area is not effected by the frame flags. + if ( hasIcon ) + { + iconRect = rect; + } + + if ( !( iFlags & KAknButtonNoFrame ) && + ( iFlags & KAknButtonTextInsideFrame )) + { + TAknLayoutRect centerLayout; + centerLayout.LayoutRect( rect, + AknLayoutScalable_Avkon::toolbar_button_pane_g1().LayoutLine() ); + rect = centerLayout.Rect(); + } + + if ( hasText ) + { + textRect = rect; + } + + + if ( hasText && hasIcon ) + { + CFbsBitmap* buttonBmp = icon->Bitmap(); + CFbsBitmap* buttonMask = icon->Mask(); + TSize iconSize ( buttonBmp->SizeInPixels()); + + // Set rects for icon and text according to their positioning + // First icon rect according to icon size - rest is for text + + switch ( iExtension->iTextAndIconAlignment ) + { + case CAknButton::EIconBeforeText: + if ( AknLayoutUtils::LayoutMirrored() ) + { + textRect.SetRect( rect.iTl.iX, rect.iTl.iY, + rect.iBr.iX - iconSize.iWidth, rect.iBr.iY); + iconRect.SetRect( rect.iTl.iX + + rect.Width() -iconSize.iWidth, + rect.iTl.iY, rect.iBr.iX, rect.iBr.iY ); + } + else + { + iconRect.SetRect( rect.iTl.iX, rect.iTl.iY, + rect.iTl.iX + iconSize.iWidth, rect.iBr.iY); + textRect.SetRect( rect.iTl.iX + iconSize.iWidth, + rect.iTl.iY, rect.iBr.iX, rect.iBr.iY ); + } + + break; + + case CAknButton::EIconAfterText: + if ( AknLayoutUtils::LayoutMirrored() ) + { + iconRect.SetRect( rect.iTl.iX, rect.iTl.iY, + rect.iTl.iX + iconSize.iWidth, rect.iBr.iY); + textRect.SetRect( rect.iTl.iX + iconSize.iWidth, + rect.iTl.iY, rect.iBr.iX, rect.iBr.iY ); + } + else + { + textRect.SetRect( rect.iTl.iX, rect.iTl.iY, + rect.iBr.iX - iconSize.iWidth, rect.iBr.iY); + iconRect.SetRect( rect.iTl.iX + + rect.Width() -iconSize.iWidth, + rect.iTl.iY, rect.iBr.iX, rect.iBr.iY ); + } + break; + + case CAknButton::EIconOverText: + iconRect.SetRect( rect.iTl.iX, rect.iTl.iY, + rect.iBr.iX, rect.iTl.iY + iconSize.iHeight ); + textRect.SetRect( rect.iTl.iX, rect.iTl.iY + iconSize.iHeight, + rect.iBr.iX, rect.iBr.iY ); + break; + + case CAknButton::EIconUnderText: + textRect.SetRect( rect.iTl.iX, rect.iTl.iY, + rect.iBr.iX, rect.iBr.iY - iconSize.iHeight ); + iconRect.SetRect( rect.iTl.iX, rect.iBr.iY - iconSize.iHeight, + rect.iBr.iX, rect.iBr.iY ); + break; + + case CAknButton::EOverlay: + { + textRect = rect; + iconRect = rect; + } + break; + default: + break; //Do nothing. + } + } + aTextRect = textRect; + aIconRect = iconRect; + } // ----------------------------------------------------------------------------- // CAknButton::TouchArea // Returns the button touchable area.