emailuis/emailui/src/FreestyleEmailUiAknStatusIndicator.cpp
branchRCL_3
changeset 25 3533d4323edc
--- /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 <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 = 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;
+    }
+