--- 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;
}