/*
* Copyright (c) 2002-2005 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:  Implementation of CBubbleOutlookOneLined class.
*
*/


// INCLUDE FILES
#include    "BMBubbleOutlookOneLined.h"
#include    "BMResourceManager.h"
#include    "BMBubbleHeader.h"
#include    "BMUtils.h"
#include    "BMCustomManager.h"
#include    "telbubbleanim.h"
#include    "BMLayout.h"

#include    <eiklabel.h>
#include    <eikimage.h>
#include    <featmgr.h>     
#include    <AknsDrawUtils.h>

// ================= MEMBER FUNCTIONS =======================

// ---------------------------------------------------------------------------
// CBubbleOutlookOneLined::CBubbleOutlookOneLined( )
//
//  
// ---------------------------------------------------------------------------
//
CBubbleOutlookOneLined::CBubbleOutlookOneLined( 
                                   CBubbleManager& aBubbleManager ) 
: CBubbleOutlook( aBubbleManager )                               
    {
    }

// ---------------------------------------------------------------------------
// CBubbleOutlookOneLined::ConstructL
// 
// ---------------------------------------------------------------------------
//
void CBubbleOutlookOneLined::ConstructL()
    {
    
    iHeader = NULL;
    CBubbleOutlook::ConstructL( );
    ActivateL();
    }

// ---------------------------------------------------------------------------
// CBubbleOutlookOneLined::~CBubbleOutlookOneLined()
//
//  
// ---------------------------------------------------------------------------
//
CBubbleOutlookOneLined::~CBubbleOutlookOneLined()
    {
    }


// ---------------------------------------------------------------------------
// CBubbleOutlookOneLined::Reset
//
//  
// ---------------------------------------------------------------------------
//
void CBubbleOutlookOneLined::Reset( )
    {

    iBubbleManager.ResourceManager().ReleaseEikImage( iBubble );
    iBubbleManager.CustomManager().ReleaseCustomElement( iSmallCallIndication );
    iBubbleManager.ResourceManager().ReleaseEikImage( iTypeIndication1 );
    iBubbleManager.ResourceManager().ReleaseEikImage( iTypeIndication2 );
    iBubbleManager.ResourceManager().ReleaseEikImage( iCyphOffImage );
    iBubbleManager.ResourceManager().ReleaseEikLabel( iTextLine1 );

    iFullText1.Set( NULL , 0 );
    iHeader = NULL;
    }


// ---------------------------------------------------------------------------
// CBubbleOutlookOneLined::ReadBubbleHeader
//
//  
// ---------------------------------------------------------------------------
//
void CBubbleOutlookOneLined::ReadBubbleHeader( CBubbleHeader& aHeader )
    {
    iHeader = &aHeader;
    
    CBubbleManager::TPhoneCallState callState = iHeader->CallState( );

    // Set small call indication icon
    TInt defaultCallIndicator;
    iSmallCallIndication = 
        iBubbleManager.CustomManager().ReserveCustomElement(
            aHeader, 
            CTelBubbleCustomElement::ESmallCallIndicator,
            defaultCallIndicator );
    
    // Number type not shown with custom call indicator
    if ( defaultCallIndicator )
        {
        // Set the additional icons
        BubbleUtils::SetCallTypePane( 
            *iHeader , 
            iTypeIndication1, 
            iTypeIndication2, 
            iBubbleManager );
        }

    // Set Cyph off image
    BubbleUtils::SetCyphOffImage( *iHeader, iCyphOffImage, iBubbleManager );
    
    
    
    // Get texts and possible timer/cost string.
    // Reserved text buffer is KBubbleLabelMaxLength. If new text 
    // is longer it panics.
    // It is enough if text is cropped to fit (eg. '...1234567890') 
   
    switch ( callState )
        {
        
        case CBubbleManager::EOnHold:
        case CBubbleManager::EDisconnected:
        case CBubbleManager::EActive:
        case CBubbleManager::EWaiting:
        case CBubbleManager::EOutgoing:
        case CBubbleManager::EAlertToDisconnected:
        case CBubbleManager::EAlerting:
            iTextLine1 = iBubbleManager.ResourceManager().ReserveEikLabel();
            iFullText1.Set( iHeader->CLI() );
            iText1ClipDirection = iHeader->CLIClipDirection( );
            break;
        case CBubbleManager::EIncoming:
        case CBubbleManager::ENone:
        default:
            iFullText1.Set( NULL , 0 );
            break;
        }
    }
    

// ---------------------------------------------------------------------------
// CBubbleOutlookOneLined::CountComponentControls() const
//
//  
// ---------------------------------------------------------------------------
//
TInt CBubbleOutlookOneLined::CountComponentControls() const
    {
    TInt amount = 0;
    if ( iSmallCallIndication )
        {
        amount++;
        }

    if ( iTypeIndication1 ) 
        {
        amount++;
        }

    if ( iTypeIndication2 ) 
        {
        amount++;
        }

    if ( iCyphOffImage ) 
        {
        amount++;
        }

    if ( iTextLine1 ) 
        {
        amount++;
        }
    return amount;
    }

// ---------------------------------------------------------------------------
// CBubbleOutlookOneLined::ComponentControl
//
//  
// ---------------------------------------------------------------------------
//
CCoeControl* CBubbleOutlookOneLined::ComponentControl( TInt aIndex ) const
    {
    TInt amount = -1;
    // coverity[var_compare_op]
    if ( iSmallCallIndication )
        {
        amount++;
        }

    if ( aIndex == amount )
        {
        // coverity[var_deref_model]
        return iSmallCallIndication->Control();
        }

    if ( iTypeIndication1 )
        {
        amount++;
        }

    if ( aIndex == amount )
        {
        return iTypeIndication1;
        }

    if ( iTypeIndication2 )
        {
        amount++;
        }

    if ( aIndex == amount )
        {
        return iTypeIndication2;
        }

    if ( iCyphOffImage )
        {
        amount++;
        }

    if ( aIndex == amount )
        {
        return iCyphOffImage;
        }

    if ( iTextLine1 ) 
        {
        amount++;
        }

    if ( aIndex == amount )
        {
        return iTextLine1;
        }

    return NULL;

    }


// ---------------------------------------------------------------------------
// CBubbleOutlookOneLined::Draw
// 
//  
// ---------------------------------------------------------------------------
//
void CBubbleOutlookOneLined::Draw( const TRect& /*aRect*/ ) const
    {
    
    // Check that proper call header is set
    if ( iHeader == NULL ) 
        { 
        return; 
        }
    
    if ( !iHeader->IsUsed( ) || iHeader->IsInConference( ) ) 
        { 
        return; 
        }
    
    
    // Set texts to fit.
    BubbleUtils::ClipToLabel( iFullText1 , iTextLine1 , iText1ClipDirection );  

    }

// ---------------------------------------------------------------------------
// CBubbleOutlookOneLined::DrawTimerCostNow
//
//  
// ---------------------------------------------------------------------------
//
void CBubbleOutlookOneLined::DrawTimerCostNow()
    {
    }

// ---------------------------------------------------------------------------
// CBubbleOutlookOneLined::DrawCLINow
//
//  
// ---------------------------------------------------------------------------
//
void CBubbleOutlookOneLined::DrawCLINow()
    {
    if ( iHeader == NULL ) 
        {
        return;
        }
    
    iFullText1.Set( iHeader->CLI() );
    
    CBubbleManager::TBubbleLabelString full = iHeader->CLI();
    CBubbleManager::TPhoneClippingDirection clipDir = 
        iHeader->CLIClipDirection();
    
    // Set texts to fit.
    if ( full.Length() > 0 )
        {
        BubbleUtils::ClipToLabel( full , iTextLine1 , clipDir );
        BubbleUtils::AddTextToEikLabel( iTextLine1 , full );
        }
    else
        {
        BubbleUtils::AddTextToEikLabel( iTextLine1 , KNullDesC );
        }
    
    
    // First clear the area and then draw the new text
    DrawLabelNow( iTextLine1 );
    }

// ---------------------------------------------------------------------------
// CBubbleOutlookOneLined::DrawBitmaps
//
//  
// ---------------------------------------------------------------------------
//
void CBubbleOutlookOneLined::DrawBitmaps( CBitmapContext& aGc ) const
    {
    // Check that proper call header is set
    if ( iHeader == NULL ) 
        { 
        return; 
        }
    
    if ( !iHeader->IsUsed( ) || iHeader->IsInConference( ) ) 
        { 
        return; 
        }

    if ( !iCallObjectDisplay )
        {
        DrawCall1Bitmaps( aGc );    
        }
    else
        {
        DrawCall2Bitmaps( aGc );    
        }        
    }

// ---------------------------------------------------------------------------
// CBubbleOutlookOneLined::HandleAnimationStartL
//
//  
// ---------------------------------------------------------------------------
//
void CBubbleOutlookOneLined::HandleAnimationStartL() const
    {
    if( iSmallCallIndication && 
        iSmallCallIndication->ControlType() == CTelBubbleCustomElement::EBubbleAnimation )
        {
        CTelBubbleAnim* anim = 
            static_cast<CTelBubbleAnim*> ( iSmallCallIndication->Control() );
        anim->StartAnimationL(); 
        }

    }

// ---------------------------------------------------------------------------
//  CBubbleOutlookOneLined::ReleaseBitmaps
// ---------------------------------------------------------------------------
//
void CBubbleOutlookOneLined::ReleaseBitmaps()
    {

    }

// ---------------------------------------------------------------------------
//  CBubbleOutlookOneLined::RebuildBitmaps
// ---------------------------------------------------------------------------
//
void CBubbleOutlookOneLined::RebuildBitmaps()
    {

    }

// ---------------------------------------------------------------------------
//  CBubbleOutlookOneLined::DrawCallHeaderText
// ---------------------------------------------------------------------------
//
void CBubbleOutlookOneLined::DrawCallHeaderText()
    {
    }

// ---------------------------------------------------------------------------
//  CBubbleOutlookTwoLined::DrawCall1Bitmaps
// ---------------------------------------------------------------------------
//
void CBubbleOutlookOneLined::DrawCall1Bitmaps( CBitmapContext& aGc ) const
    {

    aGc.SetBrushColor( AKN_LAF_COLOR( BubbleLayout::LayoutColourWhite() ) );
    if ( !BubbleUtils::DrawMaskedImage( aGc , iBubble ) )
        {
        BubbleUtils::DrawBackgroundRect( aGc, Rect() );
        }
    }

// ---------------------------------------------------------------------------
//  CBubbleOutlookTwoLined::DrawCall2Bitmaps
// ---------------------------------------------------------------------------
//        
void CBubbleOutlookOneLined::DrawCall2Bitmaps( CBitmapContext& aGc ) const
    {
    if ( iBubble->Bitmap() )
        {
        BubbleUtils::DrawMaskedImage( aGc , iBubble );    
        }
    else
        {
        // Draw bubble frame
        MAknsSkinInstance* skin = AknsUtils::SkinInstance();
        if ( !AknsDrawUtils::DrawFrame( skin,
                                        (CWindowGc&) aGc,  
                                        iOuterRect,
                                        iInnerRect,
                                        iFrameId,
                                        KAknsIIDDefault ) )
            {
            BubbleUtils::DrawBackgroundRect( aGc, Rect() );
            }        
        }            
    }

//  End of File  
