diff -r 000000000000 -r 2f259fa3e83a uifw/EikStd/coctlsrc/smileydrawer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/EikStd/coctlsrc/smileydrawer.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,322 @@ +/* +* 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: smiely engine class +* +*/ + +#include +#include +#include +#include +#include + +#include "smileymanager.h" +#include "smileymodel.h" +#include "smileydrawer.h" +#include "smileyimagedata.h" +#include "smileybmpobserver.h" +#include "smileyiconrecord.h" + +const TInt KAnimInterval = 1000000; +const TInt KMaxAnimTimeout = 3; + +// ======== MEMBER FUNCTIONS ======== +// --------------------------------------------------------------------------- +// TSmileyAnimCheckerWrapper::TSmileyAnimCheckerWrapper +// --------------------------------------------------------------------------- +// +TSmileyAnimCheckerWrapper::TSmileyAnimCheckerWrapper( + MSmileyAnimChecker* aAnimChecker, TInt aMaxCheckTimes ) : + iAnimChecker( aAnimChecker ), iCheckTimes( 0 ), iMaxCheckTimes( aMaxCheckTimes ) + { + } + +// --------------------------------------------------------------------------- +// CSmileyAnimCheckerWrapper::CheckAnimProgressL +// --------------------------------------------------------------------------- +// +void TSmileyAnimCheckerWrapper::CheckAnimProgressL() + { + if ( iAnimChecker ) + { + if ( iAnimChecker->IsOnProgress() && iCheckTimes < iMaxCheckTimes ) + { + iAnimChecker->ResetStatus(); + iCheckTimes++; + } + else + { + iAnimChecker->DoOnAnimStoppedL(); + iCheckTimes = 0; + } + } + } + +// --------------------------------------------------------------------------- +// TSmileyAnimCheckerWrapper::CheckAnimProgressL +// --------------------------------------------------------------------------- +// +TBool TSmileyAnimCheckerWrapper::IsContainingAnimChecker( + const MSmileyAnimChecker* aAnimChecker ) const + { + return ( iAnimChecker == aAnimChecker ); + } + +// ======== MEMBER FUNCTIONS ======== +// --------------------------------------------------------------------------- +// CSmileyDrawer::CSmileyDrawer +// --------------------------------------------------------------------------- +// +CSmileyDrawer::CSmileyDrawer( CSmileyModel& aModel, CEikEdwin& aEdwin ) : + iModel( aModel ), iEdwin( aEdwin ), iPlayTimes( KDisplayTimes ) + { + } + +// --------------------------------------------------------------------------- +// CSmileyDrawer::~CSmileyDrawer +// --------------------------------------------------------------------------- +// +CSmileyDrawer::~CSmileyDrawer() + { + iImageArray.ResetAndDestroy(); + iImageArray.Close(); + delete iAsyncDraw; + if ( iPeriodic ) + { + iPeriodic->Cancel(); + } + delete iPeriodic; + iAnimArray.Reset(); + iAnimArray.Close(); + } + +// --------------------------------------------------------------------------- +// CSmileyDrawer::SetHighlightColor +// --------------------------------------------------------------------------- +// +void CSmileyDrawer::SetHighlightColor( TRgb aColor ) + { + const TInt KAlphaFactor = 127; + iHighlightColor = TRgb( aColor.Internal(), KAlphaFactor ); + } + +// --------------------------------------------------------------------------- +// CSmileyDrawer::DrawSmileyContainer +// --------------------------------------------------------------------------- +// +void CSmileyDrawer::DrawTextView() + { + iEdwin.DrawTextView(); + } + +// --------------------------------------------------------------------------- +// CSmileyDrawer::StartAnimTimerL +// --------------------------------------------------------------------------- +// +void CSmileyDrawer::StartAnimTimerL() + { + if ( !iPeriodic ) + { + iPeriodic = CPeriodic::NewL( CActive::EPriorityStandard ); + } + if ( !iPeriodic->IsActive() ) + { + TTimeIntervalMicroSeconds32 interval( KAnimInterval ); + iPeriodic->Start( interval, interval, + TCallBack( AnimTimerCallbackL, this ) ); + } + } + +// --------------------------------------------------------------------------- +// CSmileyDrawer::AnimTimerCallback +// --------------------------------------------------------------------------- +// +TInt CSmileyDrawer::AnimTimerCallbackL( TAny* aPtr ) + { + CSmileyDrawer* drawer( static_cast( aPtr ) ); + drawer->CheckAnimStatusL(); + return 0; + } + +// --------------------------------------------------------------------------- +// CSmileyDrawer::CheckAnimStatus +// --------------------------------------------------------------------------- +// +void CSmileyDrawer::CheckAnimStatusL() + { + for ( TInt i( 0 ); i < iAnimArray.Count(); i++ ) + { + iAnimArray[i].CheckAnimProgressL(); + } + } + +// --------------------------------------------------------------------------- +// CSmileyDrawer::RegisterAnimChecker +// --------------------------------------------------------------------------- +// +void CSmileyDrawer::RegisterAnimChecker( MSmileyAnimChecker* aAnimChecker ) + { + TBool found( EFalse ); + for ( TInt i( 0 ); i < iAnimArray.Count(); i++ ) + { + if ( iAnimArray[i].IsContainingAnimChecker( aAnimChecker ) ) + { + found = ETrue; + break; + } + } + if ( !found ) + { + TSmileyAnimCheckerWrapper wrapper( aAnimChecker, KMaxAnimTimeout ); + iAnimArray.Append( wrapper ); + } + } + +// --------------------------------------------------------------------------- +// CSmileyDrawer::RemoveAnimChecker +// --------------------------------------------------------------------------- +// +void CSmileyDrawer::RemoveAnimChecker( MSmileyAnimChecker* aAnimChecker ) + { + for ( TInt i( 0 ); i < iAnimArray.Count(); i++ ) + { + if ( iAnimArray[i].IsContainingAnimChecker( aAnimChecker ) ) + { + iAnimArray.Remove( i ); + break; + } + } + } + +// --------------------------------------------------------------------------- +// CSmileyDrawer::DrawImageByInfo +// --------------------------------------------------------------------------- +// +void CSmileyDrawer::DrawImageByIconL( CBitmapContext& aGc, + CSmileyIcon* aIcon ) + { + if ( aIcon->DocPos() < iVisibleStart && aIcon->DocPos() >= + iVisibleStart + iVisibleLength ) + { + return; + } + CSmileyImageData* image( aIcon->ImageData() ); + CFbsBitmap* bmp( image->Bitmap() ); + CFbsBitmap* mask( image->Mask() ); + if ( aIcon->IsPlayFinished() ) + { + bmp = image->StaticBmp(); + mask = image->StaticMask(); + } + TRect rect( image->BitmapSize() ); + TPoint pt( aIcon->Rect().iTl ); + if ( bmp && mask ) + { + aGc.BitBltMasked( pt, bmp, rect, mask, EFalse ); + } + if ( aIcon->IsHighlight() ) + { + aGc.SetPenStyle( CGraphicsContext::ENullPen ); + aGc.SetBrushStyle( CGraphicsContext::ESolidBrush ); + aGc.SetBrushColor( iHighlightColor ); + aGc.SetDrawMode( CGraphicsContext::EDrawModeNOTOR ); + aGc.DrawRect( TRect( pt, rect.Size() ) ); + } + } + +// --------------------------------------------------------------------------- +// CSmileyDrawer::CreateImageByIconL +// --------------------------------------------------------------------------- +// +void CSmileyDrawer::CreateImageByIconL( CSmileyIcon* aIcon ) + { + StartAnimTimerL(); + if ( !aIcon->ImageData() ) + { + aIcon->SetPlayTimes( iPlayTimes ); + TText code( aIcon->Code() ); + CSmileyImageData* imageData( FindImageDataByCode( code ) ); + TBool needNewImage( EFalse ); + if ( !imageData ) + { + imageData = CreateImageDataL( code ); + needNewImage = ETrue; + } + else if ( imageData && imageData->IsAnimation() ) + { + needNewImage = imageData->IsAnimationFinished(); + } + aIcon->SetImageData( imageData ); + imageData->AddToRefArray( aIcon ); + imageData->SetBitmapSize( aIcon->Rect().Size() ); + if ( needNewImage ) + { + iAsyncDraw->AddReplayImage( imageData ); + } + } + } + +// --------------------------------------------------------------------------- +// CSmileyDrawer::CreateImageDataL +// --------------------------------------------------------------------------- +// +void CSmileyDrawer::CreateImageL( CSmileyImageData* aImage ) + { + if ( aImage ) + { + HBufC* fileName( NULL ); + TImageInfo imageInfo; + imageInfo.iCode = aImage->Code(); + iModel.GetImageInfo( imageInfo, &fileName ); + aImage->CreateImageL( *fileName, imageInfo ); + } + } + +// --------------------------------------------------------------------------- +// CSmileyDrawer::FindImageDataByCode +// --------------------------------------------------------------------------- +// +CSmileyImageData* CSmileyDrawer::FindImageDataByCode( TText aCode ) + { + for ( TInt i( 0 ); i < iImageArray.Count(); i++ ) + { + if ( aCode == iImageArray[i]->Code() ) + { + return iImageArray[i]; + } + } + return NULL; + } + +// --------------------------------------------------------------------------- +// CSmileyDrawer::FindImageDataByCode +// --------------------------------------------------------------------------- +// +CSmileyImageData* CSmileyDrawer::CreateImageDataL( TText aCode ) + { + if ( !iAsyncDraw ) + { + iAsyncDraw = new( ELeave ) CSmileyAsyncDraw( *this ); + } + CSmileyBmpObserver* observer( new( ELeave ) CSmileyBmpObserver( *iAsyncDraw ) ); + CleanupStack::PushL( observer ); + CSmileyImageData* imageData( new( ELeave ) CSmileyImageData( observer ) ); + CleanupStack::PushL( imageData ); + iImageArray.AppendL( imageData ); + imageData->SetCode( aCode ); + CleanupStack::Pop( imageData ); + CleanupStack::Pop( observer ); + return imageData; + } +