diff -r d189ee25cf9d -r 3533d4323edc emailuis/emailui/src/FreestyleEmailUiAknStatusIndicator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailuis/emailui/src/FreestyleEmailUiAknStatusIndicator.cpp Wed Sep 01 12:28:57 2010 +0100 @@ -0,0 +1,404 @@ +/* +* 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" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Implementation for status indicator +* +*/ + +#include "FreestyleEmailUiAknStatusIndicator.h" + +#include +#include +#include +#include +#include + +const TInt KImageMargin = 8; +const TInt KTextMargin = 4; +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 ) + { + CFreestyleEmailUiAknStatusIndicator* self = CFreestyleEmailUiAknStatusIndicator::NewLC( aRect, aParent ); + CleanupStack::Pop( self ); + return self; + } + +CFreestyleEmailUiAknStatusIndicator* CFreestyleEmailUiAknStatusIndicator::NewLC( const TRect& aRect, const CCoeControl* aParent ) + { + CFreestyleEmailUiAknStatusIndicator* self = new (ELeave) CFreestyleEmailUiAknStatusIndicator(); + CleanupStack::PushL( self ); + self->ConstructL( aRect, aParent ); + return self; + } + +CFreestyleEmailUiAknStatusIndicator::~CFreestyleEmailUiAknStatusIndicator() + { + ClearImage(); + ClearText(); + + delete iTimer; + } + +void CFreestyleEmailUiAknStatusIndicator::ShowIndicatorL( CFbsBitmap* aBitmap, + CFbsBitmap* aMaskBitmap, + TDesC* aText, + 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; + if ( iText ) + { + iVisualText = HBufC::NewL( iText->Length() + KAknBidiExtraSpacePerLine ); + CalculateVisualText(); + } + + if ( IsVisible() ) + { + DrawNow(); + } + } + +void CFreestyleEmailUiAknStatusIndicator::HideIndicator( TInt aDelayBeforeHidingInMs ) + { + if ( !aDelayBeforeHidingInMs ) + { + iTimer->Stop(); + MakeVisible( EFalse ); + iAngle = 0; + } + else + { + 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; + } + +TInt CFreestyleEmailUiAknStatusIndicator::CountComponentControls() const + { + return 0; + } + +void CFreestyleEmailUiAknStatusIndicator::Draw( const TRect& aRect ) const + { + 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 ) + { + SetContainerWindowL( *aParent ); + } + else + { + CreateWindowL(); + } + SetRect( aRect ); + ActivateL(); + MakeVisible( EFalse ); + } + +void CFreestyleEmailUiAknStatusIndicator::TimerEventL( CFSEmailUiGenericTimer* /*aTriggeredTimer*/ ) + { + if ( iAnimate && ( iHideTimeout == KMaxTInt || iHideTimeout-- > 0 ) ) + { + StartTimer( KAnimationDelayMs ); + iAngle += 360 / (KAnimationFps * KSecondsPerFullRotation); + ScaleImage(); + DrawDeferred(); + } + else + { + HideIndicator(); + } + } + +TRect CFreestyleEmailUiAknStatusIndicator::ImageRect( 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; + } + + 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; + + TPoint textLeftTop; + if ( !Layout_Meta_Data::IsMirrored() ) + { + textLeftTop = TPoint( aRect.iTl.iX + KImageMargin + imageSize.iWidth + KTextMargin, aRect.iTl.iY + KTextMargin ); + } + else + { + 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 ); + } + +void CFreestyleEmailUiAknStatusIndicator::CalculateVisualText() const + { + if ( iVisualText ) + { + TPtr visualText = iVisualText->Des(); + visualText.Zero(); + TInt MaxWidthInPixels = iTextRect.Size().iWidth - KTuncationCharsWidth; + TInt MaxClippedWidthInPixels = iTextRect.Size().iWidth; + AknBidiTextUtils::ConvertToVisualAndClip( *iText, + visualText, + *iTextFont, + MaxWidthInPixels, + 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.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 ); + 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() ); + gc.BitBltMasked( aRect.iTl, iBitmap, bmpPieceRect, iMaskBitmap, EFalse ); + } + else + { + gc.DrawBitmap( aRect, iBitmap ); + } + } + +void CFreestyleEmailUiAknStatusIndicator::DrawText( const TRect& aRect ) const + { + if ( !iVisualText ) + return; + if ( iVisualText->Length() == 0 ) + return; + + 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()); + + 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(); + } + +void CFreestyleEmailUiAknStatusIndicator::ScaleImage() const + { + if ( iBitmap ) + { + AknIconUtils::DisableCompression( iBitmap ); + AknIconUtils::SetSizeAndRotation( iBitmap, iImageRect.Size(), EAspectRatioPreserved, iAngle ); + } + } + +void CFreestyleEmailUiAknStatusIndicator::ClearImage() + { + delete iBitmap; + iBitmap = NULL; + delete iMaskBitmap; + iMaskBitmap = NULL; + } + +void CFreestyleEmailUiAknStatusIndicator::ClearText() + { + delete iText; + iText = NULL; + + delete iVisualText; + iVisualText = NULL; + } +