--- 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.