--- a/uifw/EikStd/coctlsrc/AknButton.cpp Wed Sep 15 12:29:17 2010 +0300
+++ b/uifw/EikStd/coctlsrc/AknButton.cpp Wed Oct 13 14:50:15 2010 +0300
@@ -170,16 +170,16 @@
{
CGulIcon* newIcon = CGulIcon::NewLC();
CFbsBitmap* newPic = new ( ELeave ) CFbsBitmap;
+ CleanupStack::PushL( newPic );
newPic->Duplicate( aIcon->Bitmap()->Handle() );
- //newPic ownership is transferred to newIcon
- newIcon->SetBitmap( newPic );
+ newIcon->SetBitmap( newPic );
CFbsBitmap* newMask = new ( ELeave ) CFbsBitmap;
- CleanupStack::PushL( newMask );
User::LeaveIfError( newMask->Create(
newIcon->Bitmap()->SizeInPixels(), EGray256 ) );
+ CleanupStack::PushL( newMask );
CFbsBitmapDevice* bitmapDevice = CFbsBitmapDevice::NewL( newMask );
CleanupStack::PushL( bitmapDevice );
@@ -212,7 +212,7 @@
ReplaceIconStatic( aDimmedIcon, newIcon, aScaleMode );
CleanupStack::PopAndDestroy( 2 ); // bitmapDevice, bitGc
- CleanupStack::Pop( 2 ); // newIcon, newMask
+ CleanupStack::Pop( 3 ); // newIcon, newPic, newMask
}
}
}
@@ -264,9 +264,6 @@
// Sets bitmaps to resource provider (if one exists)
void SetProviderPressedBmpsL();
-
- //Verify new rectagle size equals to the original
- TBool TextRectSizeChanged( TRect aNewRect );
private: // Data
@@ -296,7 +293,6 @@
TBool iFeedbackEnabled;
TAknsItemID iBackgroundSkinIID;
TRect iBgFrameRect;
- TRect iTextRect;
};
// ============================ MEMBER FUNCTIONS ===============================
@@ -331,7 +327,6 @@
iIconSize = layoutRect.Rect().Size();
iFlags.Set( EUseDefaultIconSize );
iFlags.Set( EUseDefaultMargins );
- iTextRect = TRect::EUninitialized;
}
// -----------------------------------------------------------------------------
@@ -522,20 +517,6 @@
}
}
-//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;
- }
//
@@ -1701,6 +1682,7 @@
}
iExtension->HandleFeedbackAreaChange();
SetFrameIDs();
+ ConvertTextToVisualAndClip();
}
// -----------------------------------------------------------------------------
@@ -2275,6 +2257,7 @@
TRAP_IGNORE( CreatePressedDownFrameL() );
}
SetFrameRects();
+ ConvertTextToVisualAndClip();
iExtension->HandleFeedbackAreaChange();
}
@@ -2307,11 +2290,11 @@
{
return;
}
- //Using HitAreaContainsL() to verify whether pointer event locates in valid area
- //when KAknButtonHitTest is defined.
- if ( iFlags & KAknButtonHitTest )
+
+ if ( ( iFlags & KAknButtonHitTest ) &&
+ !HitAreaContainsL( aPointerEvent.iPosition, EFalse ) )
{
- TRAP_IGNORE( buttonEvent = HitAreaContainsL( aPointerEvent.iPosition, EFalse ))
+ buttonEvent = EFalse;
}
TBool redrawNeeded(EFalse);
@@ -2846,12 +2829,19 @@
// -----------------------------------------------------------------------------
//
EXPORT_C void CAknButton::SetButtonFlags( const TInt aFlags )
- {
+ {
if ( !( iFlags & KAknButtonNoFrame ) )
{
if ( aFlags & KAknButtonNoFrame )
{
- iExtension->iMargins.SetAllValuesTo( 0 );
+ iExtension->iMargins.SetAllValuesTo( 0 );
+ ConvertTextToVisualAndClip();
+ }
+ // aFlags does not include KAknButtonNoFrame
+ else if ( iFlags & KAknButtonTextInsideFrame !=
+ aFlags & KAknButtonTextInsideFrame )
+ {
+ ConvertTextToVisualAndClip();
}
}
if ( aFlags & KAknButtonHitTest )
@@ -2863,6 +2853,14 @@
{
TRAP_IGNORE ( CreatePressedDownFrameL() );
}
+ if ( iFlags & KAknButtonNoFrame && !( aFlags & KAknButtonNoFrame ) )
+ {
+ SetFrameIDs();
+ if ( aFlags & KAknButtonTextInsideFrame )
+ {
+ ConvertTextToVisualAndClip();
+ }
+ }
iFlags = aFlags;
}
@@ -2959,7 +2957,7 @@
EXPORT_C void CAknButton::SetTextFont( const CFont* aFont )
{
iFont = aFont;
- ConvertTextToVisualAndClip( iExtension->iTextRect );
+ ConvertTextToVisualAndClip();
}
// -----------------------------------------------------------------------------
@@ -3524,15 +3522,25 @@
//
void CAknButton::DrawTextButton( CWindowGc& aGc ) const
{
- TRect textRect;
-
- TRect iconRect; //this is no use
- GetCurrentStateTextAndIconRect( iconRect, textRect );
-
CAknButtonState* state = State();
- if ( state->TextChanged() || iExtension->TextRectSizeChanged( textRect ) )
+ if ( !state || !state->HasText() )
+ return;
+
+ if ( state->TextChanged() )
{
- ConvertTextToVisualAndClip( 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();
}
DrawText( aGc, textRect );
}
@@ -3600,13 +3608,13 @@
//
void CAknButton::DrawIconButton( CWindowGc& aGc ) const
{
- TRect iconRect;
- TRect textRect;
- GetCurrentStateTextAndIconRect( iconRect, textRect );
+ TRect iconRect( iExtension->iMargins.InnerRect( Rect() ) );
aGc.SetBrushStyle( CGraphicsContext::ENullBrush );
const CGulIcon* icon = GetCurrentIcon();
+ if ( !icon )
+ return;
CFbsBitmap* buttonBmp = icon->Bitmap();
CFbsBitmap* buttonMask = icon->Mask();
@@ -3688,24 +3696,102 @@
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());
-
- if ( state->TextChanged() || iExtension->TextRectSizeChanged( textRect ) )
+ // Set rects for icon and text according to their positioning
+ // First icon rect according to icon size - rest is for text
+
+ switch ( iExtension->iTextAndIconAlignment )
{
- ConvertTextToVisualAndClip( 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;
}
+
// Draw icon
TPoint iconPoint;
switch ( iExtension->iHorizontalIconAlignment )
@@ -4455,13 +4541,6 @@
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;
- }
}
}
@@ -4546,7 +4625,7 @@
// CAknButton::ConvertTextToVisualAndClip
// -----------------------------------------------------------------------------
//
-void CAknButton::ConvertTextToVisualAndClip( const TRect& aRect ) const
+void CAknButton::ConvertTextToVisualAndClip() const
{
CAknButtonState* state = State();
if ( !state || !state->HasText() )
@@ -4558,22 +4637,18 @@
return;
}
- TRect textRect( aRect );
- //Using given rect to calculate the visual text if it's not empty.
- if ( !textRect.IsEmpty() )
+ TRect textRect = iExtension->iMargins.InnerRect( Rect() );
+
+ if ( !( iFlags & KAknButtonNoFrame ) &&
+ ( iFlags & KAknButtonTextInsideFrame ) )
{
- iExtension->iTextRect = textRect;
+ TAknLayoutRect center;
+ center.LayoutRect( Rect(),
+ AknLayoutScalable_Avkon::toolbar_button_pane_g1().LayoutLine() );
+
+ textRect = center.Rect();
}
- //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;
@@ -4590,135 +4665,6 @@
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.