phoneuis/BubbleManager/Src/BMBubbleOutlookThreeLined.cpp
changeset 0 5f000ab63145
child 9 8871b09be73b
equal deleted inserted replaced
-1:000000000000 0:5f000ab63145
       
     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     
       
   289     if ( iNumberType )
       
   290         {
       
   291         amount++;
       
   292         }
       
   293 
       
   294     if ( aIndex == amount )
       
   295         {
       
   296         return iNumberType->Control();
       
   297         }
       
   298 
       
   299     if ( iCyphOffImage )
       
   300         {
       
   301         amount++;
       
   302         }
       
   303 
       
   304     if ( aIndex == amount )
       
   305         {
       
   306         return iCyphOffImage;
       
   307         }
       
   308         
       
   309     if ( iTextLine1 )
       
   310         {
       
   311         amount++;
       
   312         }
       
   313 
       
   314     if ( aIndex == amount )
       
   315         {
       
   316         return iTextLine1;
       
   317         }
       
   318 
       
   319     if ( iTextLine2 )
       
   320         {
       
   321         amount++;
       
   322         }
       
   323 
       
   324     if ( aIndex == amount )
       
   325         {
       
   326         return iTextLine2;
       
   327         }
       
   328 
       
   329     if ( iTextLine3 )
       
   330         {
       
   331         amount++;
       
   332         }
       
   333 
       
   334     if ( aIndex == amount )
       
   335         {
       
   336         return iTextLine3;
       
   337         }
       
   338 
       
   339     if ( iTimerCost )
       
   340         {
       
   341         amount++;
       
   342         }
       
   343 
       
   344     if ( aIndex == amount )
       
   345         {
       
   346         return iTimerCost;
       
   347         }
       
   348 
       
   349     if ( iSmallCallIndication )
       
   350         {
       
   351         amount++;
       
   352         }
       
   353 
       
   354     if ( aIndex == amount )
       
   355         {
       
   356         return iSmallCallIndication->Control();
       
   357         }
       
   358 
       
   359     if ( iTypeIndication1 )
       
   360         {
       
   361         amount++;
       
   362         }
       
   363 
       
   364     if ( aIndex == amount )
       
   365         {
       
   366         return iTypeIndication1;
       
   367         }
       
   368 
       
   369     if ( iTypeIndication2 )
       
   370         {
       
   371         amount++;
       
   372         }
       
   373 
       
   374     if ( aIndex == amount )
       
   375         {
       
   376         return iTypeIndication2;
       
   377         }
       
   378         
       
   379     if ( iBrandImage )
       
   380         {
       
   381         amount++;
       
   382         }
       
   383 
       
   384     if ( aIndex == amount )
       
   385         {
       
   386         return iBrandImage->Control();
       
   387         }
       
   388     
       
   389     if ( iBigCallIndicator )
       
   390         {
       
   391         amount++;
       
   392         }
       
   393 
       
   394     if ( aIndex == amount )
       
   395         {
       
   396         return iBigCallIndicator->Control();
       
   397         }
       
   398 
       
   399     return NULL;
       
   400     }
       
   401 
       
   402 // ---------------------------------------------------------------------------
       
   403 // CBubbleOutlookThreeLined::Draw
       
   404 // 
       
   405 //  
       
   406 // ---------------------------------------------------------------------------
       
   407 //
       
   408 void CBubbleOutlookThreeLined::Draw( const TRect& /*aRect*/ ) const
       
   409     {
       
   410     
       
   411     // Check that proper call header is set
       
   412     
       
   413     if ( iHeader == NULL ) 
       
   414         { 
       
   415         return; 
       
   416         }
       
   417     
       
   418     if ( !iHeader->IsUsed( ) ) 
       
   419         { 
       
   420         return; 
       
   421         }
       
   422     
       
   423     if ( iHeader->IsInConference( ) ) 
       
   424         { 
       
   425         return; 
       
   426         }
       
   427     
       
   428     TUint32 callFlag = iHeader->CallFlags( );
       
   429 	CBubbleManager::TPhoneCallState callState = iHeader->CallState( );		
       
   430     
       
   431     // Set texts to fit.
       
   432     switch (iTextLineNumber)
       
   433         {
       
   434         case 0:
       
   435             BubbleUtils::ClipToLabel( iFullText1 , iTextLine1 , 
       
   436                 iText1ClipDirection );
       
   437             BubbleUtils::ClipToLabel( iFullText2 , iTextLine2 , 
       
   438                 iText2ClipDirection );
       
   439             BubbleUtils::AddTextToEikLabel( iTextLine3 , KNullDesC );
       
   440             break;
       
   441         case 1:
       
   442             BubbleUtils::SetTextInLabel( iFullText1 , iTextLine1 , 
       
   443                 iText1ClipDirection );
       
   444             BubbleUtils::ClipToLabel( iFullText2 , iTextLine2 , 
       
   445                 iText2ClipDirection );
       
   446             BubbleUtils::ClipToLabel( iFullText3 , iTextLine3 , 
       
   447                 iText3ClipDirection );
       
   448             break;
       
   449         case 3:
       
   450             BubbleUtils::ClipToLabel( iFullText1 , iTextLine1 , 
       
   451                 iText1ClipDirection );
       
   452             BubbleUtils::ClipToLabel( iFullText2 , iTextLine2 , 
       
   453                 iText2ClipDirection );
       
   454             BubbleUtils::SetTextInLabel( iFullText3 , iTextLine3 , 
       
   455                 iText3ClipDirection );
       
   456             break;
       
   457         default:
       
   458             BubbleUtils::AddTextToEikLabel( iTextLine1 , KNullDesC );
       
   459             BubbleUtils::AddTextToEikLabel( iTextLine2 , KNullDesC );
       
   460             BubbleUtils::AddTextToEikLabel( iTextLine3 , KNullDesC );
       
   461             break;
       
   462         }
       
   463 
       
   464 
       
   465     }
       
   466 
       
   467 // ---------------------------------------------------------------------------
       
   468 //CBubbleOutlookThreeLined::DrawTimerCostNow
       
   469 //
       
   470 //  
       
   471 // ---------------------------------------------------------------------------
       
   472 //
       
   473 void CBubbleOutlookThreeLined::DrawTimerCostNow()
       
   474     {
       
   475     if ( iHeader == NULL || iTimerCost == NULL ) 
       
   476         {
       
   477         return;
       
   478         }
       
   479 
       
   480     if ( iHeader->CallState() != CBubbleManager::EActive  
       
   481         || iTimerCost->Text()->Compare( iHeader->TimerCost() ) == 0 ) 
       
   482         {
       
   483         return;
       
   484         }
       
   485     
       
   486     BubbleUtils::ClipToLabel( iHeader->TimerCost() , iTimerCost , 
       
   487         CBubbleManager::ERight );
       
   488     DrawLabelNow( iTimerCost);
       
   489     }
       
   490 
       
   491 // ---------------------------------------------------------------------------
       
   492 // CBubbleOutlookThreeLined::DrawCLINow
       
   493 //
       
   494 //  
       
   495 // ---------------------------------------------------------------------------
       
   496 //
       
   497 void CBubbleOutlookThreeLined::DrawCLINow()
       
   498     {
       
   499     if ( iHeader == NULL ) 
       
   500         {
       
   501         return;
       
   502         }
       
   503     
       
   504     CEikLabel* cli = NULL;
       
   505     
       
   506     if ( iTextLineNumber == 1 )
       
   507         {
       
   508         iFullText3.Set( iHeader->CLI() );
       
   509         cli = iTextLine3;
       
   510         }
       
   511     else
       
   512         {
       
   513         iFullText1.Set( iHeader->CLI() );
       
   514         cli = iTextLine1;
       
   515         }
       
   516     
       
   517     CBubbleManager::TBubbleLabelString full = iHeader->CLI();
       
   518     CBubbleManager::TPhoneClippingDirection clipDir 
       
   519         = iHeader->CLIClipDirection();
       
   520     
       
   521     // Set texts to fit.
       
   522     if ( full.Length() > 0 )
       
   523         {
       
   524         BubbleUtils::ClipToLabel( full , cli , clipDir );
       
   525         BubbleUtils::AddTextToEikLabel( cli , full );
       
   526         }
       
   527     else
       
   528         {
       
   529         BubbleUtils::AddTextToEikLabel( cli , KNullDesC );
       
   530         }
       
   531     
       
   532     // First clear the area and then draw the new text
       
   533     DrawLabelNow( cli );
       
   534     }
       
   535 
       
   536 // ---------------------------------------------------------------------------
       
   537 // CBubbleOutlookThreeLined::DrawBitmaps
       
   538 //
       
   539 //  
       
   540 // ---------------------------------------------------------------------------
       
   541 //
       
   542 void CBubbleOutlookThreeLined::DrawBitmaps( CBitmapContext& aGc ) const
       
   543     {
       
   544     // Check that proper call header is set
       
   545     if ( iHeader == NULL ) 
       
   546         { 
       
   547         return; 
       
   548         }
       
   549     
       
   550     if ( !iHeader->IsUsed() ) 
       
   551         { 
       
   552         return; 
       
   553         }
       
   554     
       
   555     if ( iHeader->IsInConference() ) 
       
   556         { 
       
   557         return; 
       
   558         }
       
   559 
       
   560     if ( !iCallObjectDisplay )
       
   561         {
       
   562         DrawCall1Bitmaps( aGc );    
       
   563         }
       
   564     else
       
   565         {
       
   566         DrawCall2Bitmaps( aGc );    
       
   567         }        
       
   568     
       
   569     }
       
   570 
       
   571 // ---------------------------------------------------------------------------
       
   572 // CBubbleOutlookThreeLined::HandleAnimationStartL
       
   573 //
       
   574 //  
       
   575 // ---------------------------------------------------------------------------
       
   576 //
       
   577 void CBubbleOutlookThreeLined::HandleAnimationStartL() const
       
   578     {
       
   579     if ( iBigCallIndicator && iBigCallIndicator->ControlType() == 
       
   580          CTelBubbleCustomElement::EBubbleAnimation )
       
   581         {
       
   582         CTelBubbleAnim* anim = 
       
   583             static_cast<CTelBubbleAnim*> ( iBigCallIndicator->Control() );
       
   584         anim->StartAnimationL();    
       
   585         }
       
   586     
       
   587     if ( iBrandImage && iBrandImage->ControlType() == 
       
   588          CTelBubbleCustomElement::EBubbleAnimation )
       
   589         {
       
   590         CTelBubbleAnim* anim = 
       
   591             static_cast<CTelBubbleAnim*> ( iBrandImage->Control() );
       
   592         anim->StartAnimationL();    
       
   593         }
       
   594     
       
   595     if ( iSmallCallIndication && iSmallCallIndication->ControlType() == 
       
   596          CTelBubbleCustomElement::EBubbleAnimation )
       
   597         {
       
   598         CTelBubbleAnim* anim = 
       
   599             static_cast<CTelBubbleAnim*> ( iSmallCallIndication->Control() );
       
   600         anim->StartAnimationL();    
       
   601         }
       
   602     
       
   603     if( iNumberType && iNumberType->ControlType() == 
       
   604          CTelBubbleCustomElement::EBubbleAnimation )
       
   605         {
       
   606         CTelBubbleAnim* anim = 
       
   607             static_cast<CTelBubbleAnim*> ( iNumberType->Control() );
       
   608         anim->StartAnimationL();    
       
   609         }
       
   610     }
       
   611 
       
   612 // ---------------------------------------------------------------------------
       
   613 //  CBubbleOutlookThreeLined::DrawCallHeaderText
       
   614 // ---------------------------------------------------------------------------
       
   615 //
       
   616 void CBubbleOutlookThreeLined::DrawCallHeaderText()
       
   617     {
       
   618     if ( iHeader == NULL || iTextLine1 == NULL ) 
       
   619         {
       
   620         return;
       
   621         }
       
   622 
       
   623     if ( iHeader->CallState() != CBubbleManager::EOutgoing )
       
   624         {
       
   625         return;
       
   626         }
       
   627     
       
   628     CEikLabel* label = NULL;
       
   629     iFullText1.Set( iHeader->Text() );
       
   630     label = iTextLine1;
       
   631 
       
   632     CBubbleManager::TPhoneClippingDirection textDir = 
       
   633         iHeader->TextClipDirection();
       
   634 
       
   635     BubbleUtils::ClipToLabel( iHeader->Text(), label, textDir );
       
   636     DrawLabelNow( label );    
       
   637     }
       
   638 
       
   639 // ---------------------------------------------------------------------------
       
   640 //  CBubbleOutlookThreeLined::DrawCall1Bitmaps
       
   641 // ---------------------------------------------------------------------------
       
   642 //
       
   643 void CBubbleOutlookThreeLined::DrawCall1Bitmaps( CBitmapContext& aGc ) const
       
   644     {
       
   645     // Now starts actual drawing.
       
   646     aGc.SetBrushColor( AKN_LAF_COLOR( BubbleLayout::LayoutColourWhite() ) );
       
   647 
       
   648     if ( !BubbleUtils::DrawMaskedImage( aGc , iBubble ) )
       
   649         {
       
   650         BubbleUtils::DrawBackgroundRect( aGc, Rect() );
       
   651         }
       
   652     
       
   653     // If it's a conference bubble, don't draw a thumbnail
       
   654     if ( iHeader->IsConference( ) ) 
       
   655         {
       
   656         return;
       
   657         }
       
   658     
       
   659     // if it's a arriving call on line 2 -> don't show TN
       
   660     if ( !iTnImage || !( iTnImage->Bitmap( ) !=NULL 
       
   661             && ( !( ( iHeader->CallState() == CBubbleManager::EIncoming
       
   662                       || iHeader->CallState() == CBubbleManager::EWaiting )
       
   663                     && iHeader->CallFlags()&CBubbleManager::ELine2 ) ) ) )
       
   664         {
       
   665         return;
       
   666         }
       
   667     
       
   668     // checks if image needs clipping and draws possible thumbnail image.
       
   669     if ( iTnImage->Bitmap() != NULL )
       
   670         {
       
   671         // Draw shadow
       
   672         aGc.SetPenColor( iTnImageShadow.Color() );
       
   673         aGc.DrawRect ( iTnImageShadow.Rect() );
       
   674         aGc.BitBlt( iTnImage->Rect().iTl , iHeader->TnIconBitmap() );
       
   675         }
       
   676     }
       
   677 
       
   678 // ---------------------------------------------------------------------------
       
   679 //  CBubbleOutlookThreeLined::DrawCall2Bitmaps
       
   680 // ---------------------------------------------------------------------------
       
   681 //        
       
   682 void CBubbleOutlookThreeLined::DrawCall2Bitmaps( CBitmapContext& aGc ) const
       
   683     {
       
   684     if ( iBubble->Bitmap() )
       
   685         {
       
   686         BubbleUtils::DrawMaskedImage( aGc , iBubble );    
       
   687         }
       
   688     else
       
   689         {
       
   690         // Draw bubble frame
       
   691         MAknsSkinInstance* skin = AknsUtils::SkinInstance();
       
   692         if ( !AknsDrawUtils::DrawFrame( skin,
       
   693                                         (CWindowGc&) aGc,  
       
   694                                         iOuterRect,
       
   695                                         iInnerRect,
       
   696                                         iFrameId,
       
   697                                         KAknsIIDDefault ) )
       
   698             {
       
   699             BubbleUtils::DrawBackgroundRect( aGc, Rect() );
       
   700             }        
       
   701         }            
       
   702     }
       
   703 
       
   704 
       
   705 //  End of File