emailuis/emailui/src/FreestyleEmailUiAknStatusIndicator.cpp
branchRCL_3
changeset 64 3533d4323edc
equal deleted inserted replaced
63:d189ee25cf9d 64:3533d4323edc
       
     1 /*
       
     2 * Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Implementation for status indicator
       
    15 *
       
    16 */
       
    17 
       
    18 #include "FreestyleEmailUiAknStatusIndicator.h"
       
    19 
       
    20 #include <biditext.h>
       
    21 #include <AknIconUtils.h>
       
    22 #include <AknBidiTextUtils.h>
       
    23 #include <AknsUtils.h>
       
    24 #include <layoutmetadata.cdl.h>
       
    25 
       
    26 const TInt KImageMargin = 8;
       
    27 const TInt KTextMargin = 4;
       
    28 const TInt KRoundBoundaryEllipse = 7;
       
    29 const TInt KTuncationCharsWidth = 20;
       
    30 
       
    31 const TInt KAnimationFps = 15;
       
    32 const TInt KAnimationDelayMs = 1000 / KAnimationFps;
       
    33 const TInt KSecondsPerFullRotation = 2;
       
    34 const TInt KPenSize = 2;
       
    35 
       
    36 CFreestyleEmailUiAknStatusIndicator* CFreestyleEmailUiAknStatusIndicator::NewL( const TRect& aRect, const CCoeControl* aParent )
       
    37     {
       
    38     CFreestyleEmailUiAknStatusIndicator* self = CFreestyleEmailUiAknStatusIndicator::NewLC( aRect, aParent );
       
    39     CleanupStack::Pop( self );
       
    40     return self;
       
    41     }
       
    42 
       
    43 CFreestyleEmailUiAknStatusIndicator* CFreestyleEmailUiAknStatusIndicator::NewLC( const TRect& aRect, const CCoeControl* aParent )
       
    44     {
       
    45     CFreestyleEmailUiAknStatusIndicator* self = new (ELeave) CFreestyleEmailUiAknStatusIndicator();
       
    46     CleanupStack::PushL( self );
       
    47     self->ConstructL( aRect, aParent );
       
    48     return self;
       
    49     }
       
    50 
       
    51 CFreestyleEmailUiAknStatusIndicator::~CFreestyleEmailUiAknStatusIndicator()
       
    52     {
       
    53     ClearImage();
       
    54     ClearText();
       
    55 
       
    56     delete iTimer;
       
    57     }
       
    58 
       
    59 void CFreestyleEmailUiAknStatusIndicator::ShowIndicatorL( CFbsBitmap* aBitmap,
       
    60                                                           CFbsBitmap* aMaskBitmap,
       
    61                                                           TDesC* aText,
       
    62                                                           TInt aDuration,
       
    63                                                           const TBool aAnimate )
       
    64     {
       
    65     iTimer->Stop();
       
    66 
       
    67     iAnimate = aAnimate;
       
    68     SetImage( aBitmap, aMaskBitmap );
       
    69     SetTextL( aText );
       
    70 
       
    71     MakeVisible( ETrue );
       
    72     DrawNow();
       
    73 
       
    74     if ( aDuration >= 0 )
       
    75         {
       
    76         HideIndicator( aDuration );
       
    77         }
       
    78     else if ( iAnimate )
       
    79         {
       
    80         iHideTimeout = KMaxTInt;
       
    81         StartTimer( KAnimationDelayMs );
       
    82         }
       
    83     }
       
    84 
       
    85 void CFreestyleEmailUiAknStatusIndicator::SetTextL( TDesC* aText )
       
    86     {
       
    87     SetTextFont();
       
    88 
       
    89     ClearText();
       
    90     iText = aText;
       
    91     if ( iText )
       
    92         {
       
    93         iVisualText = HBufC::NewL( iText->Length() + KAknBidiExtraSpacePerLine );
       
    94         CalculateVisualText();
       
    95         }
       
    96 
       
    97     if ( IsVisible() )
       
    98         {
       
    99         DrawNow();
       
   100         }
       
   101     }
       
   102 
       
   103 void CFreestyleEmailUiAknStatusIndicator::HideIndicator( TInt aDelayBeforeHidingInMs )
       
   104     {
       
   105     if ( !aDelayBeforeHidingInMs )
       
   106         {
       
   107         iTimer->Stop();
       
   108         MakeVisible( EFalse );
       
   109         iAngle = 0;
       
   110         }
       
   111     else
       
   112         {
       
   113         if (iAnimate)
       
   114             {
       
   115             iHideTimeout = aDelayBeforeHidingInMs / KAnimationDelayMs;
       
   116             StartTimer( KAnimationDelayMs );
       
   117             }
       
   118         else
       
   119             {
       
   120             iHideTimeout = 0;
       
   121             iTimer->Start( aDelayBeforeHidingInMs );
       
   122             }
       
   123         }
       
   124     }
       
   125 
       
   126 void CFreestyleEmailUiAknStatusIndicator::StartTimer( const TInt aTimeOut )
       
   127     {
       
   128     iTimer->Stop();
       
   129     iTimer->Start( aTimeOut );
       
   130     }
       
   131 
       
   132 
       
   133 CCoeControl* CFreestyleEmailUiAknStatusIndicator::CFreestyleEmailUiAknStatusIndicator::ComponentControl( TInt /*aIndex*/ ) const
       
   134     {
       
   135     return NULL;
       
   136     }
       
   137 
       
   138 TInt CFreestyleEmailUiAknStatusIndicator::CountComponentControls() const
       
   139     {
       
   140     return 0;
       
   141     }
       
   142 
       
   143 void CFreestyleEmailUiAknStatusIndicator::Draw( const TRect& aRect ) const
       
   144     {
       
   145     DrawBoundary( aRect );
       
   146     DrawImage( iImageRect );
       
   147     DrawText( iTextRect );
       
   148     }
       
   149 
       
   150 void CFreestyleEmailUiAknStatusIndicator::SizeChanged()
       
   151     {
       
   152     CalculateLayout( Rect() );
       
   153     ScaleImage();
       
   154     CalculateVisualText();
       
   155     }
       
   156 
       
   157 CFreestyleEmailUiAknStatusIndicator::CFreestyleEmailUiAknStatusIndicator()
       
   158     : iBitmap( NULL ),
       
   159     iMaskBitmap( NULL ),
       
   160     iText( NULL ),
       
   161     iVisualText( NULL ),
       
   162     iTextFont( NULL )
       
   163     {
       
   164     }
       
   165 
       
   166 void CFreestyleEmailUiAknStatusIndicator::ConstructL( const TRect& aRect, const CCoeControl* aParent )
       
   167     {
       
   168     iTimer = CFSEmailUiGenericTimer::NewL( this );
       
   169    
       
   170     if ( aParent )
       
   171         {
       
   172         SetContainerWindowL( *aParent );
       
   173         }
       
   174     else
       
   175         {
       
   176         CreateWindowL();
       
   177         }
       
   178     SetRect( aRect );
       
   179     ActivateL();
       
   180     MakeVisible( EFalse );
       
   181     }
       
   182 
       
   183 void CFreestyleEmailUiAknStatusIndicator::TimerEventL( CFSEmailUiGenericTimer* /*aTriggeredTimer*/ )
       
   184     {
       
   185     if ( iAnimate && ( iHideTimeout == KMaxTInt || iHideTimeout-- > 0 ) )
       
   186         {
       
   187         StartTimer( KAnimationDelayMs );
       
   188         iAngle += 360 / (KAnimationFps * KSecondsPerFullRotation);
       
   189         ScaleImage();
       
   190         DrawDeferred();
       
   191         }
       
   192     else
       
   193         {
       
   194         HideIndicator();
       
   195         }
       
   196     }
       
   197 
       
   198 TRect CFreestyleEmailUiAknStatusIndicator::ImageRect( const TRect& aRect ) const
       
   199     {
       
   200     TSize imageSize = aRect.Size();
       
   201     imageSize.iHeight = imageSize.iHeight - 2 * KImageMargin;
       
   202     imageSize.iWidth = imageSize.iWidth - 2 * KImageMargin;
       
   203     if ( imageSize.iWidth > imageSize.iHeight )
       
   204         {
       
   205         imageSize.iWidth = imageSize.iHeight;
       
   206         }
       
   207     else
       
   208         {
       
   209         imageSize.iHeight = imageSize.iWidth;
       
   210         }
       
   211 
       
   212     TPoint imageLeftTop;
       
   213     if ( !Layout_Meta_Data::IsMirrored() )
       
   214         {
       
   215         imageLeftTop = TPoint( aRect.iTl.iX + KImageMargin, aRect.iTl.iY + KImageMargin );
       
   216         }
       
   217     else
       
   218         {
       
   219         imageLeftTop = TPoint( aRect.iBr.iX - KImageMargin - imageSize.iWidth, aRect.iTl.iY + KImageMargin );
       
   220         }
       
   221 
       
   222     return TRect( imageLeftTop, imageSize );
       
   223     }
       
   224 
       
   225 TRect CFreestyleEmailUiAknStatusIndicator::TextRect( const TRect& aRect ) const
       
   226     {
       
   227     TSize imageSize = aRect.Size();
       
   228     imageSize.iHeight = imageSize.iHeight - 2 * KImageMargin;
       
   229     imageSize.iWidth = imageSize.iWidth - 2 * KImageMargin;
       
   230     if ( imageSize.iWidth > imageSize.iHeight )
       
   231         {
       
   232         imageSize.iWidth = imageSize.iHeight;
       
   233         }
       
   234     else
       
   235         {
       
   236         imageSize.iHeight = imageSize.iWidth;
       
   237         }
       
   238 
       
   239     TSize textSize = aRect.Size();
       
   240     textSize.iHeight = textSize.iHeight - 2 * KTextMargin;
       
   241     textSize.iWidth = textSize.iWidth - 2 * KTextMargin - 2 * KImageMargin - imageSize.iWidth;
       
   242 
       
   243     TPoint textLeftTop;
       
   244     if ( !Layout_Meta_Data::IsMirrored() )
       
   245         {
       
   246         textLeftTop = TPoint( aRect.iTl.iX + KImageMargin + imageSize.iWidth + KTextMargin, aRect.iTl.iY + KTextMargin );
       
   247         }
       
   248     else
       
   249         {
       
   250         textLeftTop = TPoint( aRect.iTl.iX + KTextMargin, aRect.iTl.iY + KTextMargin );
       
   251         }
       
   252 
       
   253     return TRect( textLeftTop, textSize );
       
   254     }
       
   255 
       
   256 void CFreestyleEmailUiAknStatusIndicator::CalculateLayout( const TRect& aRect ) const
       
   257     {
       
   258     iImageRect = ImageRect( aRect );
       
   259     iTextRect = TextRect( aRect );
       
   260     }
       
   261 
       
   262 void CFreestyleEmailUiAknStatusIndicator::SetTextFont() const
       
   263     {
       
   264     if ( iTextFont )
       
   265         return;
       
   266 
       
   267     const CFont* font = AknLayoutUtils::FontFromId( EAknLogicalFontPrimarySmallFont );
       
   268     iTextFont = CONST_CAST( CFont*, font );
       
   269     }
       
   270 
       
   271 void CFreestyleEmailUiAknStatusIndicator::CalculateVisualText() const
       
   272     {
       
   273     if ( iVisualText )
       
   274         {
       
   275         TPtr visualText = iVisualText->Des();
       
   276         visualText.Zero();
       
   277         TInt MaxWidthInPixels = iTextRect.Size().iWidth - KTuncationCharsWidth;
       
   278         TInt MaxClippedWidthInPixels = iTextRect.Size().iWidth;
       
   279         AknBidiTextUtils::ConvertToVisualAndClip( *iText,
       
   280                                                   visualText,
       
   281                                                   *iTextFont,
       
   282                                                   MaxWidthInPixels,
       
   283                                                   MaxClippedWidthInPixels );
       
   284         iVisualTextWidth = AknBidiTextUtils::MeasureTextBoundsWidth(
       
   285             *iTextFont, *iVisualText, CFont::TMeasureTextInput::EFVisualOrder );
       
   286         }
       
   287     }
       
   288 
       
   289 TRgb CFreestyleEmailUiAknStatusIndicator::BackgroundColor() const
       
   290     {
       
   291     TRgb color;
       
   292     MAknsSkinInstance* skin = AknsUtils::SkinInstance();
       
   293     if ( AknsUtils::GetCachedColor( skin, color, KAknsIIDQsnOtherColors, EAknsCIQsnOtherColorsCG22 ) )
       
   294         {
       
   295         // fallback to default value
       
   296         color = TRgb(197, 197, 197);
       
   297         }
       
   298     return color;
       
   299     }
       
   300 
       
   301 TRgb CFreestyleEmailUiAknStatusIndicator::BorderColor() const
       
   302     {
       
   303     return KRgbBlack;
       
   304     }
       
   305 
       
   306 TRgb CFreestyleEmailUiAknStatusIndicator::FontColor() const
       
   307     {
       
   308     TRgb color;
       
   309     MAknsSkinInstance* skin = AknsUtils::SkinInstance();
       
   310     if ( AknsUtils::GetCachedColor( skin, color, KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG55 /*EAknsCIQsnTextColorsCG81*/ ) )
       
   311         {
       
   312         // fallback to default value
       
   313         color = KRgbBlack;
       
   314         }
       
   315     return color;
       
   316     }
       
   317 
       
   318 void CFreestyleEmailUiAknStatusIndicator::DrawBoundary( const TRect& aRect ) const
       
   319     {
       
   320     CWindowGc& gc = SystemGc();
       
   321     gc.SetClippingRect( aRect );
       
   322     gc.SetBrushColor( BackgroundColor() );
       
   323     gc.SetPenColor( BorderColor() );
       
   324     gc.SetPenSize( TSize(KPenSize, KPenSize) );
       
   325     gc.SetBrushStyle( CGraphicsContext::ESolidBrush );
       
   326     gc.SetPenStyle( CGraphicsContext::ESolidPen );
       
   327     TSize ellipse( KRoundBoundaryEllipse, KRoundBoundaryEllipse );
       
   328     TRect roundRect( aRect );
       
   329     roundRect.Shrink( 2, 2 );
       
   330     gc.DrawRoundRect( roundRect, ellipse);
       
   331     }
       
   332 
       
   333 void CFreestyleEmailUiAknStatusIndicator::DrawImage( const TRect& aRect ) const
       
   334     {
       
   335     if ( !iBitmap )
       
   336         return;
       
   337 
       
   338     CWindowGc& gc = SystemGc();
       
   339     if ( iMaskBitmap )
       
   340         {
       
   341         TRect bmpPieceRect(TPoint(0,0), aRect.Size() );
       
   342         gc.BitBltMasked( aRect.iTl, iBitmap, bmpPieceRect, iMaskBitmap, EFalse );
       
   343         }
       
   344     else
       
   345         {
       
   346         gc.DrawBitmap( aRect, iBitmap );
       
   347         }
       
   348     }
       
   349 
       
   350 void CFreestyleEmailUiAknStatusIndicator::DrawText( const TRect& aRect ) const
       
   351     {
       
   352     if ( !iVisualText )
       
   353         return;
       
   354     if ( iVisualText->Length() == 0 )
       
   355         return;
       
   356 
       
   357     CGraphicsContext::TTextAlign alignment = Layout_Meta_Data::IsMirrored() ?
       
   358         CGraphicsContext::ERight : CGraphicsContext::ELeft;
       
   359 
       
   360     CWindowGc& gc = SystemGc();
       
   361     gc.UseFont( iTextFont );
       
   362     TInt baseline = aRect.Height() / 2 + iTextFont->FontMaxAscent() / 2;
       
   363     gc.SetPenColor(FontColor());
       
   364 
       
   365     TRect drawRect( aRect );
       
   366     drawRect.Shrink( (drawRect.Width() - iVisualTextWidth) / 2, 0 );
       
   367     gc.DrawText( *iVisualText, drawRect, baseline, alignment, 0);
       
   368     }
       
   369 
       
   370 void CFreestyleEmailUiAknStatusIndicator::SetImage( CFbsBitmap* aBitmap, CFbsBitmap* aMaskBitmap )
       
   371     {
       
   372     ClearImage();
       
   373     iAngle = 0;
       
   374     iBitmap = aBitmap;
       
   375     iMaskBitmap = aMaskBitmap;
       
   376     ScaleImage();
       
   377     }
       
   378 
       
   379 void CFreestyleEmailUiAknStatusIndicator::ScaleImage() const
       
   380     {
       
   381     if ( iBitmap )
       
   382         {
       
   383         AknIconUtils::DisableCompression( iBitmap );
       
   384         AknIconUtils::SetSizeAndRotation( iBitmap, iImageRect.Size(), EAspectRatioPreserved, iAngle );
       
   385         }
       
   386     }
       
   387 
       
   388 void CFreestyleEmailUiAknStatusIndicator::ClearImage()
       
   389     {
       
   390     delete iBitmap;
       
   391     iBitmap = NULL;
       
   392     delete iMaskBitmap;
       
   393     iMaskBitmap = NULL;
       
   394     }
       
   395 
       
   396 void CFreestyleEmailUiAknStatusIndicator::ClearText()
       
   397     {
       
   398     delete iText;
       
   399     iText = NULL;
       
   400 
       
   401     delete iVisualText;
       
   402     iVisualText = NULL;
       
   403     }
       
   404