uifw/EikStd/coctlsrc/smileydrawer.cpp
changeset 0 2f259fa3e83a
child 10 9f56a4e1b8ab
equal deleted inserted replaced
-1:000000000000 0:2f259fa3e83a
       
     1 /*
       
     2 * Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  smiely engine class
       
    15 *
       
    16 */
       
    17 
       
    18 #include <fbs.h>
       
    19 #include <AknIconUtils.h>
       
    20 #include <coeutils.h>
       
    21 #include <AknsDrawUtils.h>
       
    22 #include <eikedwin.h>
       
    23 
       
    24 #include "smileymanager.h"
       
    25 #include "smileymodel.h"
       
    26 #include "smileydrawer.h"
       
    27 #include "smileyimagedata.h"
       
    28 #include "smileybmpobserver.h"
       
    29 #include "smileyiconrecord.h"
       
    30 
       
    31 const TInt KAnimInterval = 1000000;
       
    32 const TInt KMaxAnimTimeout = 3;
       
    33 
       
    34 // ======== MEMBER FUNCTIONS ========
       
    35 // ---------------------------------------------------------------------------
       
    36 // TSmileyAnimCheckerWrapper::TSmileyAnimCheckerWrapper
       
    37 // ---------------------------------------------------------------------------
       
    38 //
       
    39 TSmileyAnimCheckerWrapper::TSmileyAnimCheckerWrapper( 
       
    40     MSmileyAnimChecker* aAnimChecker, TInt aMaxCheckTimes ) :
       
    41     iAnimChecker( aAnimChecker ), iCheckTimes( 0 ), iMaxCheckTimes( aMaxCheckTimes )
       
    42     {
       
    43     }
       
    44 
       
    45 // ---------------------------------------------------------------------------
       
    46 // CSmileyAnimCheckerWrapper::CheckAnimProgressL
       
    47 // ---------------------------------------------------------------------------
       
    48 //
       
    49 void TSmileyAnimCheckerWrapper::CheckAnimProgressL()
       
    50     {
       
    51     if ( iAnimChecker )
       
    52         {
       
    53         if ( iAnimChecker->IsOnProgress() && iCheckTimes < iMaxCheckTimes )
       
    54             {
       
    55             iAnimChecker->ResetStatus();
       
    56             iCheckTimes++;
       
    57             }
       
    58         else
       
    59             {
       
    60             iAnimChecker->DoOnAnimStoppedL();
       
    61             iCheckTimes = 0;
       
    62             }
       
    63         }
       
    64     }
       
    65 
       
    66 // ---------------------------------------------------------------------------
       
    67 // TSmileyAnimCheckerWrapper::CheckAnimProgressL
       
    68 // ---------------------------------------------------------------------------
       
    69 //
       
    70 TBool TSmileyAnimCheckerWrapper::IsContainingAnimChecker( 
       
    71     const MSmileyAnimChecker* aAnimChecker ) const
       
    72     {  
       
    73     return ( iAnimChecker == aAnimChecker );
       
    74     }
       
    75 
       
    76 // ======== MEMBER FUNCTIONS ========
       
    77 // ---------------------------------------------------------------------------
       
    78 // CSmileyDrawer::CSmileyDrawer
       
    79 // ---------------------------------------------------------------------------
       
    80 //
       
    81 CSmileyDrawer::CSmileyDrawer( CSmileyModel& aModel, CEikEdwin& aEdwin ) : 
       
    82     iModel( aModel ), iEdwin( aEdwin ), iPlayTimes( KDisplayTimes )
       
    83     {
       
    84     }
       
    85     
       
    86 // ---------------------------------------------------------------------------
       
    87 // CSmileyDrawer::~CSmileyDrawer
       
    88 // ---------------------------------------------------------------------------
       
    89 //
       
    90 CSmileyDrawer::~CSmileyDrawer()
       
    91     {    
       
    92     iImageArray.ResetAndDestroy();
       
    93     iImageArray.Close();
       
    94     delete iAsyncDraw;
       
    95     if ( iPeriodic )
       
    96         {
       
    97         iPeriodic->Cancel();
       
    98         }
       
    99     delete iPeriodic;
       
   100     iAnimArray.Reset();
       
   101     iAnimArray.Close();
       
   102     }
       
   103 
       
   104 // ---------------------------------------------------------------------------
       
   105 // CSmileyDrawer::SetHighlightColor
       
   106 // ---------------------------------------------------------------------------
       
   107 //
       
   108 void CSmileyDrawer::SetHighlightColor( TRgb aColor )
       
   109     {
       
   110     const TInt KAlphaFactor = 127;
       
   111     iHighlightColor = TRgb( aColor.Internal(), KAlphaFactor );
       
   112     }
       
   113 
       
   114 // ---------------------------------------------------------------------------
       
   115 // CSmileyDrawer::DrawSmileyContainer
       
   116 // ---------------------------------------------------------------------------
       
   117 //
       
   118 void CSmileyDrawer::DrawTextView()
       
   119     {
       
   120     iEdwin.DrawTextView();   
       
   121     }
       
   122 
       
   123 // ---------------------------------------------------------------------------
       
   124 // CSmileyDrawer::StartAnimTimerL
       
   125 // ---------------------------------------------------------------------------
       
   126 //
       
   127 void CSmileyDrawer::StartAnimTimerL()
       
   128     {
       
   129     if ( !iPeriodic )
       
   130         {
       
   131         iPeriodic = CPeriodic::NewL( CActive::EPriorityStandard );
       
   132         }
       
   133     if ( !iPeriodic->IsActive() )
       
   134         {
       
   135         TTimeIntervalMicroSeconds32 interval( KAnimInterval );
       
   136         iPeriodic->Start( interval, interval, 
       
   137             TCallBack( AnimTimerCallbackL, this ) );
       
   138         }
       
   139     }
       
   140 
       
   141 // ---------------------------------------------------------------------------
       
   142 // CSmileyDrawer::AnimTimerCallback
       
   143 // ---------------------------------------------------------------------------
       
   144 //
       
   145 TInt CSmileyDrawer::AnimTimerCallbackL( TAny* aPtr )
       
   146     {
       
   147     CSmileyDrawer* drawer( static_cast<CSmileyDrawer*>( aPtr ) );
       
   148     drawer->CheckAnimStatusL();
       
   149     return 0;
       
   150     }
       
   151 
       
   152 // ---------------------------------------------------------------------------
       
   153 // CSmileyDrawer::CheckAnimStatus
       
   154 // ---------------------------------------------------------------------------
       
   155 //
       
   156 void CSmileyDrawer::CheckAnimStatusL()
       
   157     {
       
   158     for ( TInt i( 0 ); i < iAnimArray.Count(); i++ )
       
   159         {
       
   160         iAnimArray[i].CheckAnimProgressL();
       
   161         }
       
   162     }
       
   163 
       
   164 // ---------------------------------------------------------------------------
       
   165 // CSmileyDrawer::RegisterAnimChecker
       
   166 // ---------------------------------------------------------------------------
       
   167 //
       
   168 void CSmileyDrawer::RegisterAnimChecker( MSmileyAnimChecker* aAnimChecker )
       
   169     {
       
   170     TBool found( EFalse );
       
   171     for ( TInt i( 0 ); i < iAnimArray.Count(); i++ )
       
   172         {
       
   173         if ( iAnimArray[i].IsContainingAnimChecker( aAnimChecker ) )
       
   174             {
       
   175             found = ETrue;
       
   176             break;
       
   177             }
       
   178         }
       
   179     if ( !found )
       
   180         {
       
   181         TSmileyAnimCheckerWrapper wrapper( aAnimChecker, KMaxAnimTimeout );
       
   182         iAnimArray.Append( wrapper );
       
   183         }
       
   184     }
       
   185 
       
   186 // ---------------------------------------------------------------------------
       
   187 // CSmileyDrawer::RemoveAnimChecker
       
   188 // ---------------------------------------------------------------------------
       
   189 //
       
   190 void CSmileyDrawer::RemoveAnimChecker( MSmileyAnimChecker* aAnimChecker )
       
   191     {
       
   192     for ( TInt i( 0 ); i < iAnimArray.Count(); i++ )
       
   193         {
       
   194         if ( iAnimArray[i].IsContainingAnimChecker( aAnimChecker ) )
       
   195             {
       
   196             iAnimArray.Remove( i );
       
   197             break;
       
   198             }
       
   199         }
       
   200     }
       
   201 
       
   202 // ---------------------------------------------------------------------------
       
   203 // CSmileyDrawer::DrawImageByInfo
       
   204 // ---------------------------------------------------------------------------
       
   205 //
       
   206 void CSmileyDrawer::DrawImageByIconL( CBitmapContext& aGc, 
       
   207     CSmileyIcon* aIcon )
       
   208     {
       
   209     if ( aIcon->DocPos() < iVisibleStart && aIcon->DocPos() >= 
       
   210         iVisibleStart + iVisibleLength )
       
   211         {
       
   212         return;
       
   213         }
       
   214     CSmileyImageData* image( aIcon->ImageData() );
       
   215     CFbsBitmap* bmp( image->Bitmap() );
       
   216     CFbsBitmap* mask( image->Mask() );
       
   217     if ( aIcon->IsPlayFinished() )
       
   218         {
       
   219         bmp = image->StaticBmp();
       
   220         mask = image->StaticMask();
       
   221         }
       
   222     TRect rect( image->BitmapSize() );
       
   223     TPoint pt( aIcon->Rect().iTl );
       
   224     if ( bmp && mask )
       
   225         {
       
   226         aGc.BitBltMasked( pt, bmp, rect, mask, EFalse );
       
   227         }    
       
   228     if ( aIcon->IsHighlight() )
       
   229         { 
       
   230         aGc.SetPenStyle( CGraphicsContext::ENullPen );
       
   231         aGc.SetBrushStyle( CGraphicsContext::ESolidBrush );
       
   232         aGc.SetBrushColor( iHighlightColor );
       
   233         aGc.SetDrawMode( CGraphicsContext::EDrawModeNOTOR );
       
   234         aGc.DrawRect( TRect( pt, rect.Size() ) );
       
   235         }
       
   236     }
       
   237 
       
   238 // ---------------------------------------------------------------------------
       
   239 // CSmileyDrawer::CreateImageByIconL
       
   240 // ---------------------------------------------------------------------------
       
   241 //
       
   242 void CSmileyDrawer::CreateImageByIconL( CSmileyIcon* aIcon )
       
   243     {
       
   244     StartAnimTimerL();
       
   245     if ( !aIcon->ImageData() )
       
   246         {
       
   247         aIcon->SetPlayTimes( iPlayTimes );
       
   248         TText code( aIcon->Code() );
       
   249         CSmileyImageData* imageData( FindImageDataByCode( code ) );
       
   250         TBool needNewImage( EFalse );
       
   251         if ( !imageData )
       
   252             {
       
   253             imageData = CreateImageDataL( code );
       
   254             needNewImage = ETrue;
       
   255             }
       
   256         else if ( imageData && imageData->IsAnimation() )
       
   257             {
       
   258             needNewImage = imageData->IsAnimationFinished();
       
   259             }
       
   260         aIcon->SetImageData( imageData );
       
   261         imageData->AddToRefArray( aIcon );
       
   262         imageData->SetBitmapSize( aIcon->Rect().Size() );
       
   263         if ( needNewImage )
       
   264             {
       
   265             iAsyncDraw->AddReplayImage( imageData );
       
   266             }
       
   267         }
       
   268     }
       
   269 
       
   270 // ---------------------------------------------------------------------------
       
   271 // CSmileyDrawer::CreateImageDataL
       
   272 // ---------------------------------------------------------------------------
       
   273 //
       
   274 void CSmileyDrawer::CreateImageL( CSmileyImageData* aImage )
       
   275     {
       
   276     if ( aImage )
       
   277         {
       
   278         HBufC* fileName( NULL );
       
   279         TImageInfo imageInfo;
       
   280         imageInfo.iCode = aImage->Code();
       
   281         iModel.GetImageInfo( imageInfo, &fileName );
       
   282         aImage->CreateImageL( *fileName, imageInfo );
       
   283         }
       
   284     }
       
   285 
       
   286 // ---------------------------------------------------------------------------
       
   287 // CSmileyDrawer::FindImageDataByCode
       
   288 // ---------------------------------------------------------------------------
       
   289 //
       
   290 CSmileyImageData* CSmileyDrawer::FindImageDataByCode( TText aCode )
       
   291     {
       
   292     for ( TInt i( 0 ); i < iImageArray.Count(); i++ )
       
   293         {
       
   294         if ( aCode == iImageArray[i]->Code() )
       
   295             {
       
   296             return iImageArray[i];
       
   297             }
       
   298         }
       
   299     return NULL;
       
   300     }
       
   301 
       
   302 // ---------------------------------------------------------------------------
       
   303 // CSmileyDrawer::FindImageDataByCode
       
   304 // ---------------------------------------------------------------------------
       
   305 //
       
   306 CSmileyImageData* CSmileyDrawer::CreateImageDataL( TText aCode )
       
   307     {
       
   308     if ( !iAsyncDraw )
       
   309         {
       
   310         iAsyncDraw = new( ELeave ) CSmileyAsyncDraw( *this );
       
   311         }
       
   312     CSmileyBmpObserver* observer( new( ELeave ) CSmileyBmpObserver( *iAsyncDraw ) );
       
   313     CleanupStack::PushL( observer );
       
   314     CSmileyImageData* imageData( new( ELeave ) CSmileyImageData( observer ) );
       
   315     CleanupStack::PushL( imageData );
       
   316     iImageArray.AppendL( imageData );
       
   317     imageData->SetCode( aCode );        
       
   318     CleanupStack::Pop( imageData );
       
   319     CleanupStack::Pop( observer );
       
   320     return imageData;
       
   321     }
       
   322