phoneuis/BubbleManager/Src/BMBubbleOutlookThreeLined.cpp
branchRCL_3
changeset 62 5266b1f337bd
equal deleted inserted replaced
61:41a7f70b3818 62:5266b1f337bd
       
     1 /*
       
     2 * Copyright (c) 2002-2005 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: Implementation of CBubbleOutlookThreeLined class.
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 // INCLUDE FILES
       
    20 #include    "BMBubbleOutlookThreeLined.h"
       
    21 #include    "BMResourceManager.h"
       
    22 #include    "BMCustomManager.h"
       
    23 #include    "BMBubbleHeader.h"
       
    24 #include    "BMUtils.h"
       
    25 #include    "BMLayout.h"
       
    26 
       
    27 #include    <telbubblecustomelement.h>
       
    28 #include    <telbubbleanim.h>
       
    29 
       
    30 #include    <eiklabel.h>
       
    31 #include    <eikimage.h>
       
    32 
       
    33 #include    <featmgr.h>
       
    34 #include    <AknsDrawUtils.h>
       
    35 
       
    36 // ================= MEMBER FUNCTIONS =======================
       
    37 
       
    38 // C++ default constructor can NOT contain any code, that
       
    39 // might leave.
       
    40 //
       
    41 CBubbleOutlookThreeLined::CBubbleOutlookThreeLined( 
       
    42     CBubbleManager& aBubbleManager )
       
    43 : CBubbleOutlook( aBubbleManager )
       
    44     {
       
    45     }
       
    46 
       
    47 // Symbian OS default constructor can leave.
       
    48 void CBubbleOutlookThreeLined::ConstructL()
       
    49     {
       
    50     iHeader = NULL;
       
    51     iTextLineNumber = 0;
       
    52           
       
    53     CBubbleOutlook::ConstructL( );
       
    54     ActivateL();
       
    55     }
       
    56 
       
    57 // Destructor
       
    58 CBubbleOutlookThreeLined::~CBubbleOutlookThreeLined()
       
    59     {
       
    60     
       
    61     }
       
    62 
       
    63 
       
    64 // ---------------------------------------------------------------------------
       
    65 // CBubbleOutlookThreeLined::Reset
       
    66 //
       
    67 //  
       
    68 // ---------------------------------------------------------------------------
       
    69 //
       
    70 void CBubbleOutlookThreeLined::Reset( )
       
    71     {
       
    72     CBubbleResourceManager& res = iBubbleManager.ResourceManager();
       
    73     res.ReleaseEikImage( iBubble );
       
    74     iBubbleManager.CustomManager().ReleaseCustomElement( iSmallCallIndication );
       
    75     iBubbleManager.CustomManager().ReleaseCustomElement( iNumberType );
       
    76     res.ReleaseEikImage( iTypeIndication1 );
       
    77     res.ReleaseEikImage( iTypeIndication2 );
       
    78     res.ReleaseEikImage( iCyphOffImage );
       
    79     res.ReleaseEikImage( iTnImage );
       
    80     res.ReleaseEikLabel( iTextLine1 );
       
    81     res.ReleaseEikLabel( iTextLine2 );
       
    82     res.ReleaseEikLabel( iTextLine3 );
       
    83     res.ReleaseEikLabel( iTimerCost );
       
    84 
       
    85     iBubbleManager.CustomManager().ReleaseCustomElement( iBigCallIndicator );
       
    86     iBubbleManager.CustomManager().ReleaseCustomElement( iBrandImage );
       
    87     
       
    88     iFullText1.Set( NULL, 0 );
       
    89     iFullText2.Set( NULL, 0 );
       
    90     iFullText3.Set( NULL, 0 );
       
    91     iTextLineNumber = 0;
       
    92 
       
    93     iHeader = NULL;
       
    94     }
       
    95 
       
    96 // ---------------------------------------------------------------------------
       
    97 // CBubbleOutlookThreeLined::ReadBubbleHeader
       
    98 //
       
    99 //  
       
   100 // ---------------------------------------------------------------------------
       
   101 //
       
   102 void CBubbleOutlookThreeLined::ReadBubbleHeader( CBubbleHeader& aHeader )
       
   103     {
       
   104     iHeader = &aHeader;
       
   105     
       
   106     CBubbleManager::TPhoneCallState callState = iHeader->CallState( );
       
   107     
       
   108     // set all icons. divided to rectangle and bubble shaped
       
   109     switch ( callState )
       
   110         {
       
   111         case CBubbleManager::EWaiting: 
       
   112         case CBubbleManager::EIncoming:
       
   113         case CBubbleManager::EOutgoing:
       
   114         case CBubbleManager::EAlerting:
       
   115         case CBubbleManager::EAlertToDisconnected:
       
   116             {
       
   117             // Set big call indicator icon
       
   118             TBool defaultCallIndicator;
       
   119             iBigCallIndicator = 
       
   120                 iBubbleManager.CustomManager().ReserveCustomElement(
       
   121                     aHeader, 
       
   122                     CTelBubbleCustomElement::EBigCallIndicator,
       
   123                     defaultCallIndicator );
       
   124             
       
   125             // Number type not shown with custom call indicator
       
   126             if ( defaultCallIndicator )
       
   127                 {
       
   128                 // Set number type icon
       
   129                 iNumberType = 
       
   130                     iBubbleManager.CustomManager().ReserveCustomElement(
       
   131                         aHeader, 
       
   132                         CTelBubbleCustomElement::ENumberTypeIcon,
       
   133                         defaultCallIndicator );
       
   134                 }
       
   135             }
       
   136             break;
       
   137         case CBubbleManager::EDisconnected:
       
   138         case CBubbleManager::EActive:
       
   139         case CBubbleManager::EOnHold:
       
   140             {
       
   141             // Set small call indication icon
       
   142             TInt defaultCallIndicator;
       
   143             iSmallCallIndication = 
       
   144                 iBubbleManager.CustomManager().ReserveCustomElement(
       
   145                     aHeader, 
       
   146                     CTelBubbleCustomElement::ESmallCallIndicator,
       
   147                     defaultCallIndicator );
       
   148             
       
   149             // Number type not shown with custom call indicator
       
   150             if ( defaultCallIndicator )
       
   151                 {
       
   152                 // Set the additional icons
       
   153                 BubbleUtils::SetCallTypePane( 
       
   154                     *iHeader , 
       
   155                     iTypeIndication1, 
       
   156                     iTypeIndication2, 
       
   157                     iBubbleManager );
       
   158                 }
       
   159             }
       
   160             break;
       
   161         case CBubbleManager::ENone:
       
   162         default:
       
   163             break;
       
   164         }
       
   165 
       
   166     // Set Cyph off image
       
   167     BubbleUtils::SetCyphOffImage( *iHeader, iCyphOffImage, iBubbleManager );
       
   168       
       
   169     // Get texts and possible timer/cost string.
       
   170     // Reserved text buffer is KBubbleLabelMaxLength. If new text is longer it
       
   171     // panics. It is enough if text is cropped to fit (eg. '...1234567890') 
       
   172     BubbleUtils::ChooseTextsToThreeLines( 
       
   173         *iHeader , 
       
   174         iFullText1 , 
       
   175         iFullText2 , 
       
   176         iFullText3 , 
       
   177         iTimerCost ,
       
   178         iTextLine1,
       
   179         iTextLine2,
       
   180         iTextLine3,
       
   181         iBubbleManager,
       
   182         iText1ClipDirection , 
       
   183         iText2ClipDirection , 
       
   184         iText3ClipDirection , 
       
   185         iTextLineNumber );
       
   186     
       
   187     // Get thumbnail
       
   188     if ( !iCallObjectDisplay && iHeader->TnBitmap() != NULL )
       
   189         {
       
   190         iTnImage = iBubbleManager.ResourceManager().ReserveEikImage();
       
   191         if ( iTnImage && iHeader->TnBitmapMask() != NULL )
       
   192             {
       
   193             iTnImage->SetPicture( iHeader->TnBitmap() , 
       
   194                 iHeader->TnBitmapMask() );
       
   195             }
       
   196         else if ( iTnImage )
       
   197             {
       
   198             iTnImage->SetPicture( iHeader->TnBitmap() );
       
   199             }
       
   200         
       
   201         }
       
   202 
       
   203     // Brand image
       
   204     iBrandImage = iBubbleManager.CustomManager().ReserveCustomElement(
       
   205             aHeader, 
       
   206             CTelBubbleCustomElement::EBrandImage );
       
   207     }
       
   208 
       
   209 // ---------------------------------------------------------------------------
       
   210 // CBubbleOutlookThreeLined::CountComponentControls
       
   211 //
       
   212 // All the controls are not used at all times. Athough we want to
       
   213 // keep the drawing order. 
       
   214 // ---------------------------------------------------------------------------
       
   215 //
       
   216 TInt CBubbleOutlookThreeLined::CountComponentControls() const
       
   217     {
       
   218     TInt amount = 0;
       
   219 
       
   220     if ( iNumberType ) 
       
   221         {
       
   222         amount++;
       
   223         }
       
   224 
       
   225     if ( iSmallCallIndication ) 
       
   226         {
       
   227         amount++;
       
   228         }
       
   229 
       
   230     if ( iTypeIndication1 ) 
       
   231         {
       
   232         amount++;
       
   233         }
       
   234 
       
   235     if ( iTypeIndication2 ) 
       
   236         {
       
   237         amount++;
       
   238         }
       
   239 
       
   240     if ( iCyphOffImage ) 
       
   241         {
       
   242         amount++;
       
   243         }
       
   244 
       
   245     if ( iTextLine1 ) 
       
   246         {
       
   247         amount++;
       
   248         }
       
   249 
       
   250     if ( iTextLine2 ) 
       
   251         {
       
   252         amount++;
       
   253         }
       
   254 
       
   255     if ( iTextLine3 ) 
       
   256         {
       
   257         amount++;
       
   258         }
       
   259 
       
   260     if ( iTimerCost ) 
       
   261         {
       
   262         amount++;
       
   263         }
       
   264 
       
   265     if ( iBrandImage )
       
   266         {
       
   267         amount++;
       
   268         }
       
   269 
       
   270     if ( iBigCallIndicator )
       
   271         {
       
   272         amount++;
       
   273         }
       
   274     
       
   275     return amount;
       
   276     }
       
   277 
       
   278 // ---------------------------------------------------------------------------
       
   279 // CBubbleOutlookThreeLined::ComponentControl
       
   280 //
       
   281 //  
       
   282 // ---------------------------------------------------------------------------
       
   283 //
       
   284 CCoeControl* CBubbleOutlookThreeLined::ComponentControl(TInt aIndex) const
       
   285     {
       
   286   
       
   287     TInt amount = -1;
       
   288     // coverity[var_compare_op]
       
   289     if ( iNumberType )
       
   290         {
       
   291         amount++;
       
   292         }
       
   293 
       
   294     if ( aIndex == amount )
       
   295         {
       
   296         // coverity[var_deref_model]
       
   297         return iNumberType->Control();
       
   298         }
       
   299 
       
   300     if ( iCyphOffImage )
       
   301         {
       
   302         amount++;
       
   303         }
       
   304 
       
   305     if ( aIndex == amount )
       
   306         {
       
   307         return iCyphOffImage;
       
   308         }
       
   309         
       
   310     if ( iTextLine1 )
       
   311         {
       
   312         amount++;
       
   313         }
       
   314 
       
   315     if ( aIndex == amount )
       
   316         {
       
   317         return iTextLine1;
       
   318         }
       
   319 
       
   320     if ( iTextLine2 )
       
   321         {
       
   322         amount++;
       
   323         }
       
   324 
       
   325     if ( aIndex == amount )
       
   326         {
       
   327         return iTextLine2;
       
   328         }
       
   329 
       
   330     if ( iTextLine3 )
       
   331         {
       
   332         amount++;
       
   333         }
       
   334 
       
   335     if ( aIndex == amount )
       
   336         {
       
   337         return iTextLine3;
       
   338         }
       
   339 
       
   340     if ( iTimerCost )
       
   341         {
       
   342         amount++;
       
   343         }
       
   344 
       
   345     if ( aIndex == amount )
       
   346         {
       
   347         return iTimerCost;
       
   348         }
       
   349 
       
   350     if ( iSmallCallIndication )
       
   351         {
       
   352         amount++;
       
   353         }
       
   354 
       
   355     if ( aIndex == amount )
       
   356         {
       
   357         // coverity[var_deref_model]
       
   358         return iSmallCallIndication->Control();
       
   359         }
       
   360 
       
   361     if ( iTypeIndication1 )
       
   362         {
       
   363         amount++;
       
   364         }
       
   365 
       
   366     if ( aIndex == amount )
       
   367         {
       
   368         return iTypeIndication1;
       
   369         }
       
   370 
       
   371     if ( iTypeIndication2 )
       
   372         {
       
   373         amount++;
       
   374         }
       
   375 
       
   376     if ( aIndex == amount )
       
   377         {
       
   378         return iTypeIndication2;
       
   379         }
       
   380         
       
   381     if ( iBrandImage )
       
   382         {
       
   383         amount++;
       
   384         }
       
   385 
       
   386     if ( aIndex == amount )
       
   387         {
       
   388         // coverity[var_deref_model]
       
   389         return iBrandImage->Control();
       
   390         }
       
   391     
       
   392     if ( iBigCallIndicator )
       
   393         {
       
   394         amount++;
       
   395         }
       
   396 
       
   397     if ( aIndex == amount )
       
   398         {
       
   399         // coverity[var_deref_model]
       
   400         return iBigCallIndicator->Control();
       
   401         }
       
   402 
       
   403     return NULL;
       
   404     }
       
   405 
       
   406 // ---------------------------------------------------------------------------
       
   407 // CBubbleOutlookThreeLined::Draw
       
   408 // 
       
   409 //  
       
   410 // ---------------------------------------------------------------------------
       
   411 //
       
   412 void CBubbleOutlookThreeLined::Draw( const TRect& /*aRect*/ ) const
       
   413     {
       
   414     
       
   415     // Check that proper call header is set
       
   416     
       
   417     if ( iHeader == NULL ) 
       
   418         { 
       
   419         return; 
       
   420         }
       
   421     
       
   422     if ( !iHeader->IsUsed( ) ) 
       
   423         { 
       
   424         return; 
       
   425         }
       
   426     
       
   427     if ( iHeader->IsInConference( ) ) 
       
   428         { 
       
   429         return; 
       
   430         }
       
   431     
       
   432     TUint32 callFlag = iHeader->CallFlags( );
       
   433 	CBubbleManager::TPhoneCallState callState = iHeader->CallState( );		
       
   434     
       
   435     // Set texts to fit.
       
   436     switch (iTextLineNumber)
       
   437         {
       
   438         case 0:
       
   439             BubbleUtils::ClipToLabel( iFullText1 , iTextLine1 , 
       
   440                 iText1ClipDirection );
       
   441             BubbleUtils::ClipToLabel( iFullText2 , iTextLine2 , 
       
   442                 iText2ClipDirection );
       
   443             BubbleUtils::AddTextToEikLabel( iTextLine3 , KNullDesC );
       
   444             break;
       
   445         case 1:
       
   446             BubbleUtils::SetTextInLabel( iFullText1 , iTextLine1 , 
       
   447                 iText1ClipDirection );
       
   448             BubbleUtils::ClipToLabel( iFullText2 , iTextLine2 , 
       
   449                 iText2ClipDirection );
       
   450             BubbleUtils::ClipToLabel( iFullText3 , iTextLine3 , 
       
   451                 iText3ClipDirection );
       
   452             break;
       
   453         case 3:
       
   454             BubbleUtils::ClipToLabel( iFullText1 , iTextLine1 , 
       
   455                 iText1ClipDirection );
       
   456             BubbleUtils::ClipToLabel( iFullText2 , iTextLine2 , 
       
   457                 iText2ClipDirection );
       
   458             BubbleUtils::SetTextInLabel( iFullText3 , iTextLine3 , 
       
   459                 iText3ClipDirection );
       
   460             break;
       
   461         default:
       
   462             BubbleUtils::AddTextToEikLabel( iTextLine1 , KNullDesC );
       
   463             BubbleUtils::AddTextToEikLabel( iTextLine2 , KNullDesC );
       
   464             BubbleUtils::AddTextToEikLabel( iTextLine3 , KNullDesC );
       
   465             break;
       
   466         }
       
   467 
       
   468 
       
   469     }
       
   470 
       
   471 // ---------------------------------------------------------------------------
       
   472 //CBubbleOutlookThreeLined::DrawTimerCostNow
       
   473 //
       
   474 //  
       
   475 // ---------------------------------------------------------------------------
       
   476 //
       
   477 void CBubbleOutlookThreeLined::DrawTimerCostNow()
       
   478     {
       
   479     if ( iHeader == NULL || iTimerCost == NULL ) 
       
   480         {
       
   481         return;
       
   482         }
       
   483 
       
   484     if ( iHeader->CallState() != CBubbleManager::EActive  
       
   485         || iTimerCost->Text()->Compare( iHeader->TimerCost() ) == 0 ) 
       
   486         {
       
   487         return;
       
   488         }
       
   489     
       
   490     BubbleUtils::ClipToLabel( iHeader->TimerCost() , iTimerCost , 
       
   491         CBubbleManager::ERight );
       
   492     DrawLabelNow( iTimerCost);
       
   493     }
       
   494 
       
   495 // ---------------------------------------------------------------------------
       
   496 // CBubbleOutlookThreeLined::DrawCLINow
       
   497 //
       
   498 //  
       
   499 // ---------------------------------------------------------------------------
       
   500 //
       
   501 void CBubbleOutlookThreeLined::DrawCLINow()
       
   502     {
       
   503     if ( iHeader == NULL ) 
       
   504         {
       
   505         return;
       
   506         }
       
   507     
       
   508     CEikLabel* cli = NULL;
       
   509     
       
   510     if ( iTextLineNumber == 1 )
       
   511         {
       
   512         iFullText3.Set( iHeader->CLI() );
       
   513         cli = iTextLine3;
       
   514         }
       
   515     else
       
   516         {
       
   517         iFullText1.Set( iHeader->CLI() );
       
   518         cli = iTextLine1;
       
   519         }
       
   520     
       
   521     CBubbleManager::TBubbleLabelString full = iHeader->CLI();
       
   522     CBubbleManager::TPhoneClippingDirection clipDir 
       
   523         = iHeader->CLIClipDirection();
       
   524     
       
   525     // Set texts to fit.
       
   526     if ( full.Length() > 0 )
       
   527         {
       
   528         BubbleUtils::ClipToLabel( full , cli , clipDir );
       
   529         BubbleUtils::AddTextToEikLabel( cli , full );
       
   530         }
       
   531     else
       
   532         {
       
   533         BubbleUtils::AddTextToEikLabel( cli , KNullDesC );
       
   534         }
       
   535     
       
   536     // First clear the area and then draw the new text
       
   537     DrawLabelNow( cli );
       
   538     }
       
   539 
       
   540 // ---------------------------------------------------------------------------
       
   541 // CBubbleOutlookThreeLined::DrawBitmaps
       
   542 //
       
   543 //  
       
   544 // ---------------------------------------------------------------------------
       
   545 //
       
   546 void CBubbleOutlookThreeLined::DrawBitmaps( CBitmapContext& aGc ) const
       
   547     {
       
   548     // Check that proper call header is set
       
   549     if ( iHeader == NULL ) 
       
   550         { 
       
   551         return; 
       
   552         }
       
   553     
       
   554     if ( !iHeader->IsUsed() ) 
       
   555         { 
       
   556         return; 
       
   557         }
       
   558     
       
   559     if ( iHeader->IsInConference() ) 
       
   560         { 
       
   561         return; 
       
   562         }
       
   563 
       
   564     if ( !iCallObjectDisplay )
       
   565         {
       
   566         DrawCall1Bitmaps( aGc );    
       
   567         }
       
   568     else
       
   569         {
       
   570         DrawCall2Bitmaps( aGc );    
       
   571         }        
       
   572     
       
   573     }
       
   574 
       
   575 // ---------------------------------------------------------------------------
       
   576 // CBubbleOutlookThreeLined::HandleAnimationStartL
       
   577 //
       
   578 //  
       
   579 // ---------------------------------------------------------------------------
       
   580 //
       
   581 void CBubbleOutlookThreeLined::HandleAnimationStartL() const
       
   582     {
       
   583     if ( iBigCallIndicator && iBigCallIndicator->ControlType() == 
       
   584          CTelBubbleCustomElement::EBubbleAnimation )
       
   585         {
       
   586         CTelBubbleAnim* anim = 
       
   587             static_cast<CTelBubbleAnim*> ( iBigCallIndicator->Control() );
       
   588         anim->StartAnimationL();    
       
   589         }
       
   590     
       
   591     if ( iBrandImage && iBrandImage->ControlType() == 
       
   592          CTelBubbleCustomElement::EBubbleAnimation )
       
   593         {
       
   594         CTelBubbleAnim* anim = 
       
   595             static_cast<CTelBubbleAnim*> ( iBrandImage->Control() );
       
   596         anim->StartAnimationL();    
       
   597         }
       
   598     
       
   599     if ( iSmallCallIndication && iSmallCallIndication->ControlType() == 
       
   600          CTelBubbleCustomElement::EBubbleAnimation )
       
   601         {
       
   602         CTelBubbleAnim* anim = 
       
   603             static_cast<CTelBubbleAnim*> ( iSmallCallIndication->Control() );
       
   604         anim->StartAnimationL();    
       
   605         }
       
   606     
       
   607     if( iNumberType && iNumberType->ControlType() == 
       
   608          CTelBubbleCustomElement::EBubbleAnimation )
       
   609         {
       
   610         CTelBubbleAnim* anim = 
       
   611             static_cast<CTelBubbleAnim*> ( iNumberType->Control() );
       
   612         anim->StartAnimationL();    
       
   613         }
       
   614     }
       
   615 
       
   616 // ---------------------------------------------------------------------------
       
   617 //  CBubbleOutlookThreeLined::DrawCallHeaderText
       
   618 // ---------------------------------------------------------------------------
       
   619 //
       
   620 void CBubbleOutlookThreeLined::DrawCallHeaderText()
       
   621     {
       
   622     if ( iHeader == NULL || iTextLine1 == NULL ) 
       
   623         {
       
   624         return;
       
   625         }
       
   626 
       
   627     if ( iHeader->CallState() != CBubbleManager::EOutgoing )
       
   628         {
       
   629         return;
       
   630         }
       
   631     
       
   632     CEikLabel* label = NULL;
       
   633     iFullText1.Set( iHeader->Text() );
       
   634     label = iTextLine1;
       
   635 
       
   636     CBubbleManager::TPhoneClippingDirection textDir = 
       
   637         iHeader->TextClipDirection();
       
   638 
       
   639     BubbleUtils::ClipToLabel( iHeader->Text(), label, textDir );
       
   640     DrawLabelNow( label );    
       
   641     }
       
   642 
       
   643 // ---------------------------------------------------------------------------
       
   644 //  CBubbleOutlookThreeLined::DrawCall1Bitmaps
       
   645 // ---------------------------------------------------------------------------
       
   646 //
       
   647 void CBubbleOutlookThreeLined::DrawCall1Bitmaps( CBitmapContext& aGc ) const
       
   648     {
       
   649     // Now starts actual drawing.
       
   650     aGc.SetBrushColor( AKN_LAF_COLOR( BubbleLayout::LayoutColourWhite() ) );
       
   651 
       
   652     if ( !BubbleUtils::DrawMaskedImage( aGc , iBubble ) )
       
   653         {
       
   654         BubbleUtils::DrawBackgroundRect( aGc, Rect() );
       
   655         }
       
   656     
       
   657     // If it's a conference bubble, don't draw a thumbnail
       
   658     if ( iHeader->IsConference( ) ) 
       
   659         {
       
   660         return;
       
   661         }
       
   662     
       
   663     // if it's a arriving call on line 2 -> don't show TN
       
   664     if ( !iTnImage || !( iTnImage->Bitmap( ) !=NULL 
       
   665             && ( !( ( iHeader->CallState() == CBubbleManager::EIncoming
       
   666                       || iHeader->CallState() == CBubbleManager::EWaiting )
       
   667                     && iHeader->CallFlags()&CBubbleManager::ELine2 ) ) ) )
       
   668         {
       
   669         return;
       
   670         }
       
   671     
       
   672     // checks if image needs clipping and draws possible thumbnail image.
       
   673     if ( iTnImage->Bitmap() != NULL )
       
   674         {
       
   675         // Draw shadow
       
   676         aGc.SetPenColor( iTnImageShadow.Color() );
       
   677         aGc.DrawRect ( iTnImageShadow.Rect() );
       
   678         aGc.BitBlt( iTnImage->Rect().iTl , iHeader->TnIconBitmap() );
       
   679         }
       
   680     }
       
   681 
       
   682 // ---------------------------------------------------------------------------
       
   683 //  CBubbleOutlookThreeLined::DrawCall2Bitmaps
       
   684 // ---------------------------------------------------------------------------
       
   685 //        
       
   686 void CBubbleOutlookThreeLined::DrawCall2Bitmaps( CBitmapContext& aGc ) const
       
   687     {
       
   688     if ( iBubble->Bitmap() )
       
   689         {
       
   690         BubbleUtils::DrawMaskedImage( aGc , iBubble );    
       
   691         }
       
   692     else
       
   693         {
       
   694         // Draw bubble frame
       
   695         MAknsSkinInstance* skin = AknsUtils::SkinInstance();
       
   696         if ( !AknsDrawUtils::DrawFrame( skin,
       
   697                                         (CWindowGc&) aGc,  
       
   698                                         iOuterRect,
       
   699                                         iInnerRect,
       
   700                                         iFrameId,
       
   701                                         KAknsIIDDefault ) )
       
   702             {
       
   703             BubbleUtils::DrawBackgroundRect( aGc, Rect() );
       
   704             }        
       
   705         }            
       
   706     }
       
   707 
       
   708 
       
   709 //  End of File