emailuis/emailui/src/FreestyleEmailUiAknStatusIndicator.cpp
changeset 3 a4d6f1ea0416
child 4 e7aa27f58ae1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emailuis/emailui/src/FreestyleEmailUiAknStatusIndicator.cpp	Tue Jan 26 11:45:42 2010 +0200
@@ -0,0 +1,308 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*/ 
+
+#include "FreestyleEmailUiAknStatusIndicator.h"
+
+#include <biditext.h>
+#include <akniconutils.h>
+#include <aknbiditextutils.h>
+
+const TInt KImageMargin = 8;
+const TInt KTextMargin = 4;
+const TInt KRoundBoundaryEllipse = 5;
+const TInt KTuncationCharsWidth = 20;    
+
+
+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 )
+    {
+    iTimer->Stop();
+
+    SetImage( aBitmap, aMaskBitmap );
+    SetTextL( aText );
+
+    MakeVisible( ETrue );
+    DrawNow();
+    
+    if ( aDuration >= 0 )
+        {
+        HideIndicator( aDuration );
+        }
+    }
+
+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 )
+    {
+    iTimer->Stop();
+    
+    if ( aDelayBeforeHidingInMs == 0 )
+        {
+        MakeVisible( EFalse );
+        }
+    else
+        {
+        iTimer->Start( aDelayBeforeHidingInMs );
+        }
+    }
+
+CCoeControl* CFreestyleEmailUiAknStatusIndicator::CFreestyleEmailUiAknStatusIndicator::ComponentControl( TInt /*aIndex*/ ) const
+    {
+    return NULL;
+    }
+
+TInt CFreestyleEmailUiAknStatusIndicator::CountComponentControls() const
+    {
+    return 0;
+    }
+
+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 )
+        {
+        CreateWindowL();
+        }
+    else
+        {
+        SetContainerWindowL( *aParent );
+        }
+    
+    SetRect( aRect );
+    ActivateL();
+    
+    MakeVisible( EFalse );
+    }
+
+void CFreestyleEmailUiAknStatusIndicator::TimerEventL( CFSEmailUiGenericTimer* /*aTriggeredTimer*/ )
+    {
+    HideIndicator();
+    }
+
+void CFreestyleEmailUiAknStatusIndicator::CalculateLayout( 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 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 );    
+        }
+    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 );    
+        }
+    }
+
+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 );    
+        }
+    }
+
+void CFreestyleEmailUiAknStatusIndicator::DrawBoundary( const TRect& aRect ) const
+    {
+    CWindowGc& gc = SystemGc();
+    gc.SetPenColor( KRgbCyan );
+    TSize ellipse( KRoundBoundaryEllipse, KRoundBoundaryEllipse );
+    gc.DrawRoundRect( aRect, 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;
+    
+    TLanguage language = User::Language();
+    TBidiText::TDirectionality  direction = TBidiText::ScriptDirectionality( language );
+    
+    CGraphicsContext::TTextAlign alignment = CGraphicsContext::ELeft;
+    if ( direction == TBidiText::ERightToLeft )
+        {
+        alignment = CGraphicsContext::ERight;
+        }
+    
+    CWindowGc& gc = SystemGc();
+    gc.UseFont( iTextFont );
+
+    TInt baseline = aRect.Height() / 2 + iTextFont->FontMaxAscent() / 2; 
+    
+    gc.SetPenColor(KRgbBlack);
+
+    gc.DrawText( *iVisualText, aRect, baseline, alignment, 0);
+    }
+
+void CFreestyleEmailUiAknStatusIndicator::SetImage( CFbsBitmap* aBitmap, CFbsBitmap* aMaskBitmap )
+    {
+    ClearImage();
+    iBitmap = aBitmap;
+    iMaskBitmap = aMaskBitmap;
+    ScaleImage();
+    }
+
+void CFreestyleEmailUiAknStatusIndicator::ScaleImage() const
+    {
+    if ( iBitmap )
+        {
+        AknIconUtils::DisableCompression( iBitmap );
+        AknIconUtils::SetSize( iBitmap, iImageRect.Size(), EAspectRatioPreserved );
+        }
+    if ( iMaskBitmap )
+        {
+        AknIconUtils::DisableCompression( iMaskBitmap );
+        AknIconUtils::SetSize( iMaskBitmap, iImageRect.Size(), EAspectRatioPreserved );
+        }    
+    }
+
+void CFreestyleEmailUiAknStatusIndicator::ClearImage()
+    {
+    delete iBitmap;
+    iBitmap = NULL;
+    delete iMaskBitmap;
+    iMaskBitmap = NULL;
+    }
+
+void CFreestyleEmailUiAknStatusIndicator::ClearText()
+    {
+    delete iText;
+    iText = NULL;
+    
+    delete iVisualText;
+    iVisualText = NULL;
+    }
+