uifw/EikStd/coctlsrc/AknButton.cpp
branchRCL_3
changeset 51 fcdfafb36fe7
parent 50 a1caeb42b3a3
child 55 aecbbf00d063
--- 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.