uifw/EikStd/coctlsrc/smileydrawer.cpp
changeset 0 2f259fa3e83a
child 6 9f56a4e1b8ab
--- /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 <fbs.h>
+#include <AknIconUtils.h>
+#include <coeutils.h>
+#include <AknsDrawUtils.h>
+#include <eikedwin.h>
+
+#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<CSmileyDrawer*>( 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;
+    }
+