emailuis/emailui/src/FreestyleEmailUiAknStatusIndicator.cpp
branchRCL_3
changeset 60 d620048b4810
parent 12 f5907b1a1053
child 61 dcf0eedfc1a3
--- a/emailuis/emailui/src/FreestyleEmailUiAknStatusIndicator.cpp	Mon Jun 21 15:20:54 2010 +0300
+++ b/emailuis/emailui/src/FreestyleEmailUiAknStatusIndicator.cpp	Thu Jul 15 18:19:25 2010 +0300
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* Copyright (c) 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"
@@ -13,19 +13,25 @@
 *
 * Description:  Implementation for status indicator
 *
-*/ 
+*/
 
 #include "FreestyleEmailUiAknStatusIndicator.h"
 
 #include <biditext.h>
 #include <AknIconUtils.h>
 #include <AknBidiTextUtils.h>
+#include <AknsUtils.h>
+#include <layoutmetadata.cdl.h>
 
 const TInt KImageMargin = 8;
 const TInt KTextMargin = 4;
-const TInt KRoundBoundaryEllipse = 5;
-const TInt KTuncationCharsWidth = 20;    
+const TInt KRoundBoundaryEllipse = 7;
+const TInt KTuncationCharsWidth = 20;
 
+const TInt KAnimationFps = 15;
+const TInt KAnimationDelayMs = 1000 / KAnimationFps;
+const TInt KSecondsPerFullRotation = 2;
+const TInt KPenSize = 2;
 
 CFreestyleEmailUiAknStatusIndicator* CFreestyleEmailUiAknStatusIndicator::NewL( const TRect& aRect, const CCoeControl* aParent )
     {
@@ -46,41 +52,48 @@
     {
     ClearImage();
     ClearText();
-    
+
     delete iTimer;
     }
 
-void CFreestyleEmailUiAknStatusIndicator::ShowIndicatorL( CFbsBitmap* aBitmap, 
+void CFreestyleEmailUiAknStatusIndicator::ShowIndicatorL( CFbsBitmap* aBitmap,
                                                           CFbsBitmap* aMaskBitmap,
                                                           TDesC* aText,
-                                                          TInt aDuration )
+                                                          TInt aDuration,
+                                                          const TBool aAnimate )
     {
     iTimer->Stop();
 
+    iAnimate = aAnimate;
     SetImage( aBitmap, aMaskBitmap );
     SetTextL( aText );
 
     MakeVisible( ETrue );
     DrawNow();
-    
+
     if ( aDuration >= 0 )
         {
         HideIndicator( aDuration );
         }
+    else if ( iAnimate )
+        {
+        iHideTimeout = KMaxTInt;
+        StartTimer( KAnimationDelayMs );
+        }
     }
 
 void CFreestyleEmailUiAknStatusIndicator::SetTextL( TDesC* aText )
     {
     SetTextFont();
 
-    ClearText();    
-    iText = aText; 
+    ClearText();
+    iText = aText;
     if ( iText )
         {
         iVisualText = HBufC::NewL( iText->Length() + KAknBidiExtraSpacePerLine );
         CalculateVisualText();
-        }    
-    
+        }
+
     if ( IsVisible() )
         {
         DrawNow();
@@ -89,18 +102,34 @@
 
 void CFreestyleEmailUiAknStatusIndicator::HideIndicator( TInt aDelayBeforeHidingInMs )
     {
-    iTimer->Stop();
-    
-    if ( aDelayBeforeHidingInMs == 0 )
+    if ( !aDelayBeforeHidingInMs )
         {
+        iTimer->Stop();
         MakeVisible( EFalse );
+        iAngle = 0;
         }
     else
         {
-        iTimer->Start( aDelayBeforeHidingInMs );
+        if (iAnimate)
+            {
+            iHideTimeout = aDelayBeforeHidingInMs / KAnimationDelayMs;
+            StartTimer( KAnimationDelayMs );
+            }
+        else
+            {
+            iHideTimeout = 0;
+            iTimer->Start( aDelayBeforeHidingInMs );
+            }
         }
     }
 
+void CFreestyleEmailUiAknStatusIndicator::StartTimer( const TInt aTimeOut )
+    {
+    iTimer->Stop();
+    iTimer->Start( aTimeOut );
+    }
+
+
 CCoeControl* CFreestyleEmailUiAknStatusIndicator::CFreestyleEmailUiAknStatusIndicator::ComponentControl( TInt /*aIndex*/ ) const
     {
     return NULL;
@@ -113,55 +142,60 @@
 
 void CFreestyleEmailUiAknStatusIndicator::Draw( const TRect& aRect ) const
     {
-    CWindowGc& gc = SystemGc();
-    gc.Clear( aRect );
-    
     DrawBoundary( aRect );
     DrawImage( iImageRect );
     DrawText( iTextRect );
     }
 
 void CFreestyleEmailUiAknStatusIndicator::SizeChanged()
-    {  
+    {
     CalculateLayout( Rect() );
     ScaleImage();
     CalculateVisualText();
     }
-    
+
 CFreestyleEmailUiAknStatusIndicator::CFreestyleEmailUiAknStatusIndicator()
     : iBitmap( NULL ),
     iMaskBitmap( NULL ),
     iText( NULL ),
     iVisualText( NULL ),
     iTextFont( NULL )
-    {    
+    {
     }
 
 void CFreestyleEmailUiAknStatusIndicator::ConstructL( const TRect& aRect, const CCoeControl* aParent )
     {
-    iTimer = CFSEmailUiGenericTimer::NewL( this ); 
-    
-    if ( !aParent )
+    iTimer = CFSEmailUiGenericTimer::NewL( this );
+   
+    if ( aParent )
+        {
+        SetContainerWindowL( *aParent );
+        }
+    else
         {
         CreateWindowL();
         }
-    else
-        {
-        SetContainerWindowL( *aParent );
-        }
-    
     SetRect( aRect );
     ActivateL();
-    
     MakeVisible( EFalse );
     }
 
 void CFreestyleEmailUiAknStatusIndicator::TimerEventL( CFSEmailUiGenericTimer* /*aTriggeredTimer*/ )
     {
-    HideIndicator();
+    if ( iAnimate && ( iHideTimeout == KMaxTInt || iHideTimeout-- > 0 ) )
+        {
+        StartTimer( KAnimationDelayMs );
+        iAngle -= 360 / (KAnimationFps * KSecondsPerFullRotation);
+        ScaleImage();
+        DrawDeferred();
+        }
+    else
+        {
+        HideIndicator();
+        }
     }
 
-void CFreestyleEmailUiAknStatusIndicator::CalculateLayout( const TRect& aRect ) const
+TRect CFreestyleEmailUiAknStatusIndicator::ImageRect( const TRect& aRect ) const
     {
     TSize imageSize = aRect.Size();
     imageSize.iHeight = imageSize.iHeight - 2 * KImageMargin;
@@ -174,36 +208,62 @@
         {
         imageSize.iHeight = imageSize.iWidth;
         }
-    
+
+    TPoint imageLeftTop;
+    if ( !Layout_Meta_Data::IsMirrored() )
+        {
+        imageLeftTop = TPoint( aRect.iTl.iX + KImageMargin, aRect.iTl.iY + KImageMargin );
+        }
+    else
+        {
+        imageLeftTop = TPoint( aRect.iBr.iX - KImageMargin - imageSize.iWidth, aRect.iTl.iY + KImageMargin );
+        }
+
+    return TRect( imageLeftTop, imageSize );
+    }
+
+TRect CFreestyleEmailUiAknStatusIndicator::TextRect( const TRect& aRect ) const
+    {
+    TSize imageSize = aRect.Size();
+    imageSize.iHeight = imageSize.iHeight - 2 * KImageMargin;
+    imageSize.iWidth = imageSize.iWidth - 2 * KImageMargin;
+    if ( imageSize.iWidth > imageSize.iHeight )
+        {
+        imageSize.iWidth = imageSize.iHeight;
+        }
+    else
+        {
+        imageSize.iHeight = imageSize.iWidth;
+        }
+
     TSize textSize = aRect.Size();
     textSize.iHeight = textSize.iHeight - 2 * KTextMargin;
     textSize.iWidth = textSize.iWidth - 2 * KTextMargin - 2 * KImageMargin - imageSize.iWidth;
-    
-    TLanguage language = User::Language();
-    TBidiText::TDirectionality  direction = TBidiText::ScriptDirectionality( language );    
-    if ( direction == TBidiText::ELeftToRight )
+
+    TPoint textLeftTop;
+    if ( !Layout_Meta_Data::IsMirrored() )
         {
-        TPoint imageLeftTop ( aRect.iTl.iX + KImageMargin, aRect.iTl.iY + KImageMargin );
-        iImageRect.SetRect( imageLeftTop, imageSize );    
-        
-        TPoint textLeftTop ( aRect.iTl.iX + 2*KImageMargin + imageSize.iWidth + KTextMargin, aRect.iTl.iY + KTextMargin );
-        iTextRect.SetRect( textLeftTop, textSize );    
+        textLeftTop = TPoint( aRect.iTl.iX + KImageMargin + imageSize.iWidth + KTextMargin, aRect.iTl.iY + KTextMargin );
         }
     else
         {
-        TPoint imageLeftTop ( aRect.iBr.iX - KImageMargin - imageSize.iWidth, aRect.iTl.iY + KImageMargin );
-        iImageRect.SetRect( imageLeftTop, imageSize );    
-        
-        TPoint textLeftTop ( aRect.iTl.iX + KTextMargin, aRect.iTl.iY + KTextMargin );
-        iTextRect.SetRect( textLeftTop, textSize );    
+        textLeftTop = TPoint( aRect.iTl.iX + KTextMargin, aRect.iTl.iY + KTextMargin );
         }
+
+    return TRect( textLeftTop, textSize );
+    }
+
+void CFreestyleEmailUiAknStatusIndicator::CalculateLayout( const TRect& aRect ) const
+    {
+    iImageRect = ImageRect( aRect );
+    iTextRect = TextRect( aRect );
     }
 
 void CFreestyleEmailUiAknStatusIndicator::SetTextFont() const
     {
     if ( iTextFont )
         return;
-    
+
     const CFont* font = AknLayoutUtils::FontFromId( EAknLogicalFontPrimarySmallFont );
     iTextFont = CONST_CAST( CFont*, font );
     }
@@ -220,27 +280,65 @@
                                                   visualText,
                                                   *iTextFont,
                                                   MaxWidthInPixels,
-                                                  MaxClippedWidthInPixels );    
+                                                  MaxClippedWidthInPixels );
+        iVisualTextWidth = AknBidiTextUtils::MeasureTextBoundsWidth(
+            *iTextFont, *iVisualText, CFont::TMeasureTextInput::EFVisualOrder );
+        }
+    }
+
+TRgb CFreestyleEmailUiAknStatusIndicator::BackgroundColor() const
+    {
+    TRgb color;
+    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+    if ( AknsUtils::GetCachedColor( skin, color, KAknsIIDQsnOtherColors, EAknsCIQsnOtherColorsCG22 ) )
+        {
+        // fallback to default value
+        color = TRgb(197, 197, 197);
         }
+    return color;
+    }
+
+TRgb CFreestyleEmailUiAknStatusIndicator::BorderColor() const
+    {
+    return KRgbBlack;
+    }
+
+TRgb CFreestyleEmailUiAknStatusIndicator::FontColor() const
+    {
+    TRgb color;
+    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+    if ( AknsUtils::GetCachedColor( skin, color, KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG55 /*EAknsCIQsnTextColorsCG81*/ ) )
+        {
+        // fallback to default value
+        color = KRgbBlack;
+        }
+    return color;
     }
 
 void CFreestyleEmailUiAknStatusIndicator::DrawBoundary( const TRect& aRect ) const
     {
     CWindowGc& gc = SystemGc();
-    gc.SetPenColor( KRgbCyan );
+    gc.SetClippingRect( aRect );
+    gc.SetBrushColor( BackgroundColor() );
+    gc.SetPenColor( BorderColor() );
+    gc.SetPenSize( TSize(KPenSize, KPenSize) );
+    gc.SetBrushStyle( CGraphicsContext::ESolidBrush );
+    gc.SetPenStyle( CGraphicsContext::ESolidPen );
     TSize ellipse( KRoundBoundaryEllipse, KRoundBoundaryEllipse );
-    gc.DrawRoundRect( aRect, ellipse);
+    TRect roundRect( aRect );
+    roundRect.Shrink( 2, 2 );
+    gc.DrawRoundRect( roundRect, ellipse);
     }
 
 void CFreestyleEmailUiAknStatusIndicator::DrawImage( const TRect& aRect ) const
     {
     if ( !iBitmap )
         return;
-    
+
     CWindowGc& gc = SystemGc();
     if ( iMaskBitmap )
         {
-        TRect bmpPieceRect(TPoint(0,0), aRect.Size() ); 
+        TRect bmpPieceRect(TPoint(0,0), aRect.Size() );
         gc.BitBltMasked( aRect.iTl, iBitmap, bmpPieceRect, iMaskBitmap, EFalse );
         }
     else
@@ -255,29 +353,24 @@
         return;
     if ( iVisualText->Length() == 0 )
         return;
-    
-    TLanguage language = User::Language();
-    TBidiText::TDirectionality  direction = TBidiText::ScriptDirectionality( language );
-    
-    CGraphicsContext::TTextAlign alignment = CGraphicsContext::ELeft;
-    if ( direction == TBidiText::ERightToLeft )
-        {
-        alignment = CGraphicsContext::ERight;
-        }
-    
+
+    CGraphicsContext::TTextAlign alignment = Layout_Meta_Data::IsMirrored() ?
+        CGraphicsContext::ERight : CGraphicsContext::ELeft;
+
     CWindowGc& gc = SystemGc();
     gc.UseFont( iTextFont );
+    TInt baseline = aRect.Height() / 2 + iTextFont->FontMaxAscent() / 2;
+    gc.SetPenColor(FontColor());
 
-    TInt baseline = aRect.Height() / 2 + iTextFont->FontMaxAscent() / 2; 
-    
-    gc.SetPenColor(KRgbBlack);
-
-    gc.DrawText( *iVisualText, aRect, baseline, alignment, 0);
+    TRect drawRect( aRect );
+    drawRect.Shrink( (drawRect.Width() - iVisualTextWidth) / 2, 0 );
+    gc.DrawText( *iVisualText, drawRect, baseline, alignment, 0);
     }
 
 void CFreestyleEmailUiAknStatusIndicator::SetImage( CFbsBitmap* aBitmap, CFbsBitmap* aMaskBitmap )
     {
     ClearImage();
+    iAngle = 0;
     iBitmap = aBitmap;
     iMaskBitmap = aMaskBitmap;
     ScaleImage();
@@ -288,13 +381,8 @@
     if ( iBitmap )
         {
         AknIconUtils::DisableCompression( iBitmap );
-        AknIconUtils::SetSize( iBitmap, iImageRect.Size(), EAspectRatioPreserved );
+        AknIconUtils::SetSizeAndRotation( iBitmap, iImageRect.Size(), EAspectRatioPreserved, iAngle );
         }
-    if ( iMaskBitmap )
-        {
-        AknIconUtils::DisableCompression( iMaskBitmap );
-        AknIconUtils::SetSize( iMaskBitmap, iImageRect.Size(), EAspectRatioPreserved );
-        }    
     }
 
 void CFreestyleEmailUiAknStatusIndicator::ClearImage()
@@ -309,7 +397,7 @@
     {
     delete iText;
     iText = NULL;
-    
+
     delete iVisualText;
     iVisualText = NULL;
     }