diff -r 000000000000 -r 2f259fa3e83a uifw/EikStd/coctlsrc/smileybmpobserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/EikStd/coctlsrc/smileybmpobserver.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,248 @@ +/* +* 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 "smileybmpobserver.h" +#include "smileydrawer.h" +#include "smileyimagedata.h" +#include "smileyiconrecord.h" + +// ======== MEMBER FUNCTIONS ======== +// --------------------------------------------------------------------------- +// CSmileyImageData::CSmileyImageData +// --------------------------------------------------------------------------- +// +CSmileyBmpObserver::CSmileyBmpObserver( CSmileyAsyncDraw& aAsyncDraw ) : + iAsyncDraw( aAsyncDraw ) + { + } + +// --------------------------------------------------------------------------- +// CSmileyBmpObserver::~CSmileyBmpObserver +// --------------------------------------------------------------------------- +// +CSmileyBmpObserver::~CSmileyBmpObserver() + { + } + +// --------------------------------------------------------------------------- +// CSmileyBmpObserver::SetImageData +// --------------------------------------------------------------------------- +// +void CSmileyBmpObserver::SetImageData( CSmileyImageData* aImage ) + { + iImage = aImage; + } + +// --------------------------------------------------------------------------- +// CSmileyBmpObserver::BitmapChanged +// --------------------------------------------------------------------------- +// +void CSmileyBmpObserver::BitmapChanged( CFbsBitmap* /*aBitmap*/ ) + { + if ( iImage ) + { + if ( !iIsRegisted ) + { + iAsyncDraw.SmileyDrawer().RegisterAnimChecker( this ); + iIsRegisted = EFalse; + } + iIsAnimProgress = ETrue; + iAsyncDraw.RequestAsyncDraw(); + } + } + +// --------------------------------------------------------------------------- +// CSmileyBmpObserver::ReplayAnimationL +// --------------------------------------------------------------------------- +// +void CSmileyBmpObserver::ReplayAnimationL() + { + if ( iImage ) + { + iAsyncDraw.SmileyDrawer().CreateImageL( iImage ); + } + } + +// --------------------------------------------------------------------------- +// CSmileyBmpObserver::StopAnimation +// --------------------------------------------------------------------------- +// +void CSmileyBmpObserver::StopAnimation() + { + if ( iImage ) + { + iImage->DeleteImage(); + iAsyncDraw.SmileyDrawer().RemoveAnimChecker( this ); + } + } + +// --------------------------------------------------------------------------- +// CSmileyBmpObserver::IsOnProgress +// --------------------------------------------------------------------------- +// +TBool CSmileyBmpObserver::IsOnProgress() const + { + return iIsAnimProgress; + } + +// --------------------------------------------------------------------------- +// CSmileyBmpObserver::IsOnProgress +// --------------------------------------------------------------------------- +// +void CSmileyBmpObserver::ResetStatus() + { + iIsAnimProgress = EFalse; + } + +// --------------------------------------------------------------------------- +// CSmileyBmpObserver::IsOnProgress +// --------------------------------------------------------------------------- +// +void CSmileyBmpObserver::DoOnAnimStoppedL() + { + TBool replay( EFalse ); + for ( TInt i( 0 ); i < iImage->RefArrayCount(); i++ ) + { + CSmileyIcon* icon( iImage->RefIcon( i ) ); + icon->IncreasePlayCount(); + replay = ( replay || !icon->IsPlayFinished() ); + } + if ( replay ) + { + iAsyncDraw.AddReplayImage( iImage ); + } + else + { + StopAnimation(); + } + iAsyncDraw.RequestAsyncDraw( ETrue ); + } + +// ======== MEMBER FUNCTIONS ======== +// --------------------------------------------------------------------------- +// CSmileyAsyncDraw::CSmileyAsyncDraw +// --------------------------------------------------------------------------- +// +CSmileyAsyncDraw::CSmileyAsyncDraw( CSmileyDrawer& aDrawer ) : + CActive( EPriorityStandard ), iDrawer( aDrawer ) + { + CActiveScheduler::Add( this ); + } + +// --------------------------------------------------------------------------- +// CSmileyAsyncDraw::~CSmileyAsyncDraw +// --------------------------------------------------------------------------- +// +CSmileyAsyncDraw::~CSmileyAsyncDraw() + { + Cancel(); + iReplayImageArray.Reset(); + iReplayImageArray.Close(); + } + +// --------------------------------------------------------------------------- +// CSmileyAsyncDraw::StartActive +// --------------------------------------------------------------------------- +// +void CSmileyAsyncDraw::RequestAsyncDraw( TBool aForce ) + { + if ( !IsActive() && ( IsRequestIntervalBigEnough() || aForce ) ) + { + iEverActivated = ETrue; + iLastRequestTime.HomeTime(); + iStatus = KRequestPending; + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrNone ); + SetActive(); + } + } + +// --------------------------------------------------------------------------- +// CSmileyAsyncDraw::DoCancel +// --------------------------------------------------------------------------- +// +void CSmileyAsyncDraw::DoCancel() + { + } + +// --------------------------------------------------------------------------- +// CSmileyAsyncDraw::RunL +// --------------------------------------------------------------------------- +// +void CSmileyAsyncDraw::RunL() + { + CreateReplayImageL(); + iDrawer.DrawTextView(); + } + +// --------------------------------------------------------------------------- +// CSmileyAsyncDraw::AddReplayImage +// --------------------------------------------------------------------------- +// +void CSmileyAsyncDraw::AddReplayImage( CSmileyImageData* aImage ) + { + if ( aImage ) + { + TBool found( EFalse ); + for ( TInt i( 0 ); i < iReplayImageArray.Count(); i++ ) + { + if ( iReplayImageArray[i] == aImage ) + { + found = ETrue; + break; + } + } + if ( !found ) + { + aImage->DeleteImage(); + iReplayImageArray.Append( aImage ); + } + } + RequestAsyncDraw( ETrue ); + } + +// --------------------------------------------------------------------------- +// CSmileyAsyncDraw::CreateReplayImageL +// --------------------------------------------------------------------------- +// +void CSmileyAsyncDraw::CreateReplayImageL() + { + for ( TInt i( 0 ); i < iReplayImageArray.Count(); i++ ) + { + iDrawer.CreateImageL( iReplayImageArray[i] ); + } + iReplayImageArray.Reset(); + } + +// --------------------------------------------------------------------------- +// CSmileyAsyncDraw::IsRequestIntervalBigEnough +// --------------------------------------------------------------------------- +// +TBool CSmileyAsyncDraw::IsRequestIntervalBigEnough() const + { + if ( !iEverActivated ) + { + return ETrue; + } + TTime current; + current.HomeTime(); + return ( current.MicroSecondsFrom( iLastRequestTime ) >= KDrawIntervalMicroSec ); + }