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