diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/src/FreestyleEmailUiAknStatusIndicator.cpp --- 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 #include #include +#include +#include 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; }