uifw/EikStd/coctlsrc/smileybmpobserver.cpp
changeset 0 2f259fa3e83a
--- /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 <fbs.h>
+#include <AknIconUtils.h>
+#include <coeutils.h>
+#include <eikedwin.h>
+#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 );
+    }