internetradio2.0/uicontrolssrc/iradvertisinglistbox.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 19 Apr 2010 14:01:53 +0300
changeset 0 09774dfdd46b
permissions -rw-r--r--
Revision: 201011 Kit: 201015

/*
* Copyright (c) 2008-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:  Listbox implementation supporting bitmap advertisement.
*
*/


#include <gulicon.h>
#include <stringloader.h>
#include <internetradio.rsg>
#include <aknbiditextutils.h> 
#include <aknlayoutscalable_avkon.cdl.h>
#include <aknutils.h> 

#include "irui.h"
#include "irdebug.h"
#include "irfavoritesdb.h"
#include "irmainview.h"
#include "irmaincontainer.h"
#include "iradvertisinglistbox.h"

const TInt KThree = 3;
const TInt KFour = 4;
const TInt KSix = 6;
const TInt KTen = 10;

// ---------------------------------------------------------------------------
// CIRAdvertisingListBoxData::NewL
// ---------------------------------------------------------------------------
//
CIRAdvertisingListBoxData* CIRAdvertisingListBoxData::NewL()
    {
    CIRAdvertisingListBoxData* self = new (ELeave) CIRAdvertisingListBoxData();
    CleanupStack::PushL( self );
    self->ConstructLD();
    CleanupStack::Pop( self );
    return self;
    }

// ---------------------------------------------------------------------------
// CIRAdvertisingListBoxData::SetAdvertisementIcon
// ---------------------------------------------------------------------------
//
void CIRAdvertisingListBoxData::SetAdvertisementIcon( CGulIcon* aIcon )
    {
    delete iIcon;
    iIcon = aIcon;
    }

// ---------------------------------------------------------------------------
// CIRAdvertisingListBoxData::AdvertisementIcon
// ---------------------------------------------------------------------------
//
CGulIcon* CIRAdvertisingListBoxData::AdvertisementIcon()
    {
    return iIcon;
    }

// ---------------------------------------------------------------------------
// CIRAdvertisingListBoxData::SetControlFlag
// ---------------------------------------------------------------------------
//
void CIRAdvertisingListBoxData::SetControlFlag(TBool aControlFlag)
    {
    iControlFlag = aControlFlag;
    }
// ---------------------------------------------------------------------------
// CIRAdvertisingListBoxData::GetControlFlag
// ---------------------------------------------------------------------------
//
TBool CIRAdvertisingListBoxData::GetControlFlag()
    {
    return iControlFlag;
    }
// ---------------------------------------------------------------------------
// CIRAdvertisingListBoxData::CIRAdvertisingListBoxData
// ---------------------------------------------------------------------------
//
CIRAdvertisingListBoxData::CIRAdvertisingListBoxData()
    {
    }
// ---------------------------------------------------------
// CIRAdvertisingListBoxData::DrawNoMatchesText
// Draws the NoMatches Text on the view
// ---------------------------------------------------------
//
void CIRAdvertisingListBoxData::DrawEmptyListL(CWindowGc &aGc,
											   TPtrC aText,
											   TRect aParentRect) const 
	{
    IRLOG_DEBUG( "CIRAdvertisingListBoxData::DrawEmptyListL - Entering" );
    
	MAknsSkinInstance* skin = AknsUtils::SkinInstance () ;


    TRgb color( KRgbBlack );
    if ( AknsUtils::AvkonSkinEnabled() )
        {
        TRgb c;
        MAknsSkinInstance *skin = AknsUtils::SkinInstance();
        TInt err = AknsUtils::GetCachedColor( skin,
                                              c,
                                              KAknsIIDQsnTextColors,
                                              EAknsCIQsnTextColorsCG6 );
        if ( !err )
            {
            color = c;
            }
        }

	
    if ( !aText.Length() )
        {
        return;
        }

    HBufC* hbuf = HBufC::New( aText.Size() + 3 * ( KAknBidiExtraSpacePerLine  +1 )
                              + KTen );  // reserve space for newlines
    if ( !hbuf )
        { // can't really do anything
        return;
        }

    TPtr buffer(hbuf->Des());
    

    /*
    * input text can be either
    * - "line1"
    * - "line1 which will be wrapped to 2 lines and truncated with..."
    * - "line1\nline2"
    * - "line1\nMany other lines which will be wrapped to several lines"
    *
    * there are 3 layouts
    * - 1 line with big font,
    * - 2 lines with big font
    * - 1 line with big font + 1..3 lines with small font (not for popup lists)
    *
    *  so first we need to check if given text has a newline,
    *  if so, then we need to check if given text fits to 2 lines or
    *  should it be split to several small font lines
    */

    TInt i, n;
    n = 0;
    for (i = 0; i < aText.Length(); i ++)
        {
        if ( aText[i] == '\n' )
            {
            n++;
            }
        }

    
    TAknTextComponentLayout layout1( AknLayoutScalable_Avkon::main_pane_empty_t1( 0 ) );
    TAknTextComponentLayout layout2( AknLayoutScalable_Avkon::main_pane_empty_t2( 0 ) );
    TAknLayoutText line1;
    TAknLayoutText line2;

    line1.LayoutText( aParentRect, layout1 );
    TInt line1length = line1.TextRect().Size().iWidth;

    line2.LayoutText( aParentRect, layout2 ); 
    TInt line2length = line2.TextRect().Size().iWidth;

    const CFont *font = line1.Font();

    if ( n == 0 )
        { // one line, or one line which will be wrapped to two
        DrawEmptyListDrawUpToTwoLinesL( aGc,aText, line1, line2,
                                                 line1length, line2length,
                                                 font, color, buffer,
                                                 aParentRect );

        delete hbuf;
        return;
        }
    
    CArrayFix<TInt>* wrapWidthArray = new( ELeave ) CArrayFixFlat<TInt>(KTen);
    CleanupStack::PushL( wrapWidthArray );

    wrapWidthArray->AppendL( line1length );
    wrapWidthArray->AppendL( line2length );
    wrapWidthArray->AppendL( line2length ); // allow wrap to 3 lines
    
    TRAPD( error,AknBidiTextUtils::ConvertToVisualAndWrapToStringL(
        aText, *wrapWidthArray, *font, buffer, ETrue ));

    CleanupStack::PopAndDestroy(wrapWidthArray); 


    n = 0;
    for ( i = 0; i < buffer.Length(); i ++)
        {
        if (buffer[i] == '\n')
            {
            n++;
            }
        }

    // wrapping adds a \n to end of each line --> n < 3
    
    if ( error != KErrNone || n < KThree)
        { // 2 lines which fit to 2 line space
        DrawEmptyListDrawUpToTwoLinesL( aGc,aText, line1, line2,
                                                 line1length, line2length,
                                                 font, color, buffer,
                                                 aParentRect );

        }
    else
        { // 1 line with big font + 1..3 lines with small font
        DrawEmptyListDrawMoreThanTwoLinesL( aGc,aParentRect, aText,
        											 color, buffer );

        }

    delete hbuf;
   
    IRLOG_DEBUG( "CIRAdvertisingListBoxData::DrawEmptyListL - Exiting" );
	}   
// ---------------------------------------------------------
// CIRAdvertisingListBoxData::DrawEmptyListDrawUpToTwoLines
// 
// ---------------------------------------------------------
//
void CIRAdvertisingListBoxData::DrawEmptyListDrawUpToTwoLinesL(CWindowGc &aGc,
											  TPtrC aText,
                                              TAknLayoutText &aLine1,
                                              TAknLayoutText &aLine2,
                                              TInt aLine1length,
                                              TInt aLine2length,
                                              const CFont* aFont,
                                              TRgb aColor,
                                              TDes& aBuffer,
                                              TRect aParentRect) const 
    {
    IRLOG_DEBUG("CIRAdvertisingListBoxData::DrawEmptyListDrawUpToTwoLinesL-Entering" );
    CArrayFix<TInt>* wrapWidthArray = new( ELeave ) CArrayFixFlat<TInt>(KTen);
    CleanupStack::PushL( wrapWidthArray );

    wrapWidthArray->AppendL( aLine1length );
    wrapWidthArray->AppendL( aLine2length );
    
    TRAPD( error,AknBidiTextUtils::ConvertToVisualAndWrapToStringL( 
        aText, *wrapWidthArray, *aFont, aBuffer, ETrue ));
    
    CleanupStack::PopAndDestroy(wrapWidthArray); 
    
    if ( error != KErrNone )
        {
        aBuffer = aText;
        }
    
    // Drawing text
    aGc.Reset();
    TBool oneline( EFalse );
    TPtrC ptr = aBuffer;
    TPtrC top = ptr;
    TInt off = ptr.Locate('\n');
    if ( off >= 0 )
        {
        top.Set(ptr.Left(off));
        ptr.Set(ptr.Mid(off+1));

        TInt off1 = ptr.Locate('\n');
        if ( off1 >= 0 )
            {
            ptr.Set(ptr.Left(off1));
            }
        else
            {
            oneline = ETrue;
            }
        }
    
    aGc.SetBrushStyle(CGraphicsContext::ENullBrush);
    aGc.SetOpaque( ETrue ); // transparency off

    // no layout exist for popup list - mainpane layout is ok for X
    // coords, center vertically.  Also need to calculate vertical
    // position for mainpane lists, since laf is broken as designed.
    // If you don't believe this, try using laf values in phonebook.
    aGc.UseFont( aFont );
    aGc.SetPenColor( aColor );
    
    // center horizontally
    CGraphicsContext::TTextAlign textAlign( CGraphicsContext::ECenter );
    
    // center vertically
    TInt h = aParentRect.Height();
    TInt lineh = aLine1.TextRect().Height();
    TRect r1( aLine1.TextRect() );
    TRect r2( aLine2.TextRect() );

    // gap between lines - must be calculated this way, since no other
    // way really exists. Could be calculated from layout data, but
    // data is wrong, as 1st line is calculated from top of parent
    // rect, and 2nd line is calculated from bottom of the parent
    // rect. iAvkonAppUi->ClientRect() as parent rect would otherwise
    // be ok and give nice results, but in phonebook ClientRect() is
    // not what it should be - it is some strange amount too large.
    // This can not be fixed unless layout data is fixed to use only
    // top marginals.
    TInt lineGap( lineh / KSix );

    TInt m;  // // middle point of texts
    m = aParentRect.iTl.iY + h / 2;// + lineh + lineGap / 2;
    if ( oneline )
        {
        m += lineh / 2;
        }
    TInt b1( m - lineGap / 2 );           // bottom of 1st line
    TInt b2( m + lineh + lineGap / 2 );   // botton of 2nd line
    
    
    // rects of texts
    r1.iTl.iY = b1 - lineh;
    r1.iBr.iY = b1;
        
    r2.iTl.iY = b2 - lineh;
    r2.iBr.iY = b2;
        
	TInt baseLineOffset = ((r1.iBr.iY - r1.iTl.iY - aFont->HeightInPixels())/2
				+ aFont->AscentInPixels());

    aGc.DrawText( top, r1, baseLineOffset, textAlign );
    if ( !oneline )
        {
        aGc.DrawText( ptr, r2, baseLineOffset, textAlign );
        }
    
    
    aGc.DiscardFont();
    aGc.SetOpaque( EFalse ); // transparency back on
    IRLOG_DEBUG("CIRAdvertisingListBoxData::DrawEmptyListDrawUpToTwoLinesL-Exiting" );
    }    
// ---------------------------------------------------------
// CIRAdvertisingListBoxData::DrawEmptyListDrawMoreThanTwoLines
// Draws the NoMatches Text on the view
// ---------------------------------------------------------
//
void CIRAdvertisingListBoxData::DrawEmptyListDrawMoreThanTwoLinesL(CWindowGc &aGc,
												  TRect &aParentRect,
                                                  TPtrC aText,
                                                  TRgb aColor,
                                                  TDes& buffer ) const

    {
    IRLOG_DEBUG("CIRAdvertisingListBoxData::DrawEmptyListDrawMoreThanTwoLinesL-Entering" );
    // fetch layouts
    TAknLayoutText line[KFour];
    
    line[0].LayoutText( aParentRect, AknLayoutScalable_Avkon::main_pane_empty_t1(2) );
    line[1].LayoutText( aParentRect, AknLayoutScalable_Avkon::main_pane_empty_t3(0) );
    line[2].LayoutText( aParentRect, AknLayoutScalable_Avkon::main_pane_empty_t4(0) );
    line[3].LayoutText( aParentRect, AknLayoutScalable_Avkon::main_pane_empty_t5(0) );

    TInt lineLength[KFour];
    TInt i;
    for ( i = 0; i < KFour; i++ )
        {
        lineLength[i] = line[i].TextRect().Width();
        }
    
    const CFont *bigFont = line[0].Font();
    const CFont *smallFont = line[1].Font(); 

    // wrap text
    TInt off = aText.Locate('\n');
    TPtrC rest( aText );
    rest.Set( aText.Right(aText.Length() - off - 1 ));

    HBufC* firstLine = NULL;
    
    TRAPD( error1, 
            {
            firstLine = HBufC::NewL(
                aText.Left(off).Length() + KAknBidiExtraSpacePerLine );
            });

    if (error1 == KErrNone)
        {
        TPtr firstLinePtr = firstLine->Des();
        AknBidiTextUtils::ConvertToVisualAndClip(
                                aText.Left(off),
                                firstLinePtr,
                                *bigFont,
                                lineLength[0],
                                lineLength[0] );
        }
    
    CArrayFix<TInt>* wrapWidthArray = new( ELeave ) CArrayFixFlat<TInt>(KTen);
    CleanupStack::PushL( wrapWidthArray );
    
    // wrap small font lines
    wrapWidthArray->Reset();
    for ( i = 1; i < KFour; i++ )
        {
		TInt temp = lineLength[i];
		if(wrapWidthArray->Count() >= 0  && wrapWidthArray->Count() < KTen)
			{
			wrapWidthArray->AppendL( temp );
			}
        }
    
    TRAPD( error2,AknBidiTextUtils::ConvertToVisualAndWrapToStringL( 
        rest, *wrapWidthArray, *smallFont, buffer, ETrue ));
    
    CleanupStack::PopAndDestroy(wrapWidthArray);
    
    
    TPtrC ptr[KFour];
    TInt n = 0;
    
    if (error1 == KErrNone)
        {
        ptr[0].Set( firstLine->Des() );
        }
    if ( error1 != KErrNone || error2 != KErrNone )
        {
        ptr[0].Set(aText.Left(off));
        }
    else
        {
        TInt newlines[KThree];
        n = 0;
        for ( i = 0; i < buffer.Length(); i++ )
            {
            if ( buffer[i] != '\n' )
                {
                continue;
                }
            newlines[n] = i;
            
            n++;
            if ( n >= KThree )
                {
                break;
                }
            }
        
        if ( n >= 1 )
            {
            ptr[1].Set( buffer.Left( newlines[0] ) );
            }
        if ( n >= 2 )
            {
            ptr[2].Set( buffer.Mid( newlines[0] + 1, newlines[1] - newlines[0] - 1 ) );
            }
        if ( n >= KThree )
            {
            ptr[3].Set( buffer.Mid( newlines[1] + 1, newlines[2] - newlines[1] - 1 ) );
            }
        }
    
    // draw texts
    aGc.SetBrushStyle(CGraphicsContext::ENullBrush);
    aGc.SetOpaque( ETrue ); // transparency off
    
    for ( i = 0; i < KFour; i++ )
        {
        line[i].DrawText( aGc,ptr[i], EFalse, aColor );
        }
 
    aGc.SetOpaque( EFalse ); // transparency back on  
    delete firstLine;
    IRLOG_DEBUG("CIRAdvertisingListBoxData::DrawEmptyListDrawMoreThanTwoLinesL-Exiting" );

    }

// ---------------------------------------------------------------------------
// CIRAdvertisingListBoxData::~CIRAdvertisingListBoxData
// ---------------------------------------------------------------------------
//
CIRAdvertisingListBoxData::~CIRAdvertisingListBoxData()
    {
    delete iIcon;
    }


// ---------------------------------------------------------------------------
// CIRAdvertisingListBoxDrawer::CIRAdvertisingListBoxDrawer
// ---------------------------------------------------------------------------
//
CIRAdvertisingListBoxDrawer::CIRAdvertisingListBoxDrawer( MTextListBoxModel* aTextListBoxModel,
                                                          const CFont* aFont,
                                                          CIRAdvertisingListBoxData* 
                                                          aFormattedCellData,
                                                          CIRAdvertisingListBox* aListBox,
                      									  CIRCategoryAdvertisingListBox* aCatListBox) 
    : CFormattedCellListBoxItemDrawer( aTextListBoxModel, aFont, aFormattedCellData ),
      iListBox(aListBox),
      iCatListBox(aCatListBox)

    {
    }
// ---------------------------------------------------------------------------
// CIRAdvertisingListBoxDrawer::DrawActualItem
// ---------------------------------------------------------------------------
//
void CIRAdvertisingListBoxDrawer::DrawActualItem( TInt aItemIndex, 
                                                  const TRect& aActualItemRect, 
                                                  TBool aItemIsCurrent, 
                                                  TBool aViewIsEmphasized, 
                                                  TBool aViewIsDimmed,
                                                  TBool aItemIsSelected) const
	{
	IRLOG_DEBUG( "CIRAdvertisingListBox::DrawActualItem - Entering" );
	CIRAdvertisingListBoxData* formattedCellData = static_cast<CIRAdvertisingListBoxData*>
														( FormattedCellData() );
	if (aItemIndex == 0)
		{
		TBool flag(EFalse);
		if (iListBox)
			{
			flag = iListBox->GetLastPlayed();
			}
		TBool selectedItem =aItemIsSelected;
		if(flag)	
			{
			selectedItem = EFalse;	
			}
		CFormattedCellListBoxItemDrawer::DrawActualItem( aItemIndex, 
		                                                 aActualItemRect, 
		                                                 aItemIsCurrent, 
		                                                 aViewIsEmphasized, 
		                                                 aViewIsDimmed,
		                                                 selectedItem);


		// For MainView the folowing code is executed for hacking to make the
		// (NoMatches) string to be visible. The icon used for drawing in main
		// view is totally transparent, which makes it invisible.
		if (aItemIndex == 0 && formattedCellData->AdvertisementIcon() )
		    {
		    const CFbsBitmap* bitmap = formattedCellData->AdvertisementIcon()->Bitmap();
		    const CFbsBitmap* mask = formattedCellData->AdvertisementIcon()->Mask();
		    TSize bitmapSize = bitmap->SizeInPixels();
		    TRect maskRect;
		    if ( mask )
		        {
		        maskRect.SetSize( mask->SizeInPixels() );
		        }
		    
		    TPoint bitmapPos( aActualItemRect.iTl.iX + 
		    				 (aActualItemRect.Width() - bitmapSize.iWidth)/2,
		                      aActualItemRect.iTl.iY + 
		                      (aActualItemRect.Height() - bitmapSize.iHeight)/2 );

		    Gc()->BitBltMasked( bitmapPos, bitmap, maskRect, mask, EFalse );
		    }

		}
	else
		{
		CFormattedCellListBoxItemDrawer::DrawActualItem( aItemIndex, 
		                                                 aActualItemRect, 
		                                                 aItemIsCurrent, 
		                                                 aViewIsEmphasized, 
		                                                 aViewIsDimmed,
		                                                 aItemIsSelected);
		}

	IRLOG_DEBUG( "CIRAdvertisingListBox::DrawActualItem - Exiting" );
	}
        
// ---------------------------------------------------------------------------
// CIRAdvertisingListBox::CIRAdvertisingListBox
// ---------------------------------------------------------------------------
//
CIRAdvertisingListBox::CIRAdvertisingListBox()
    {
    }

// ---------------------------------------------------------------------------
// CIRAdvertisingListBox::SetGC
// ---------------------------------------------------------------------------
//
void CIRAdvertisingListBox::SetGC(CWindowGc& aGc)
	{
	iGc = &aGc;	
	}
// ---------------------------------------------------------------------------
// CIRAdvertisingListBox::SetControlFlag
// ---------------------------------------------------------------------------
//
void CIRAdvertisingListBox::SetControlFlag(TBool aControlFlag)
	{
    CIRAdvertisingListBoxData* irListBoxData = 
        static_cast<CIRAdvertisingListBoxData*>( ItemDrawer()->FormattedCellData() );
	irListBoxData->SetControlFlag(aControlFlag);	
	}
// ---------------------------------------------------------------------------
// CIRAdvertisingListBox::Draw
// ---------------------------------------------------------------------------
//
void CIRAdvertisingListBox::Draw(const TRect& aRect) const 
	{
    IRLOG_DEBUG( "CIRAdvertisingListBox::Draw - Entering" );
	CAknDoubleLargeStyleListBox::Draw(aRect);
	
    TInt count = Model()->NumberOfItems();
    CIRAdvertisingListBoxData* irListBoxData = 
        static_cast<CIRAdvertisingListBoxData*>( ItemDrawer()->FormattedCellData() );
	if(irListBoxData->GetControlFlag())
		{
		if(GetActiveView())
			{	
			if(GetFavouritesCount() != 0)
				{
				if(count == 0 && !GetLastPlayed())
					{
					TRAP_IGNORE(View()->SetListEmptyTextL(*iNoMatchesTextResource));
					}
				else if(count == 1 && GetLastPlayed())
					{
					TRAP_IGNORE(irListBoxData->DrawEmptyListL(*iGc,*iNoMatchesTextResource,Rect()));	
					}
				}
			else
				{
				if(GetLastPlayed())
					{
					TRAP_IGNORE(irListBoxData->DrawEmptyListL(*iGc,*iFindStationsTextResource,Rect()));	
					}
				else
					{
					TRAP_IGNORE(View()->SetListEmptyTextL(*iFindStationsTextResource));	
					}
				}
			}
		else
			{
			if(count == 1 && irListBoxData->AdvertisementIcon())
				{
				TRAP_IGNORE(irListBoxData->DrawEmptyListL(*iGc,*iNoMatchesTextResource,Rect()));	
				}
			else
				{
				TRAP_IGNORE(View()->SetListEmptyTextL(*iNoMatchesTextResource));
				}
			}
		irListBoxData->SetControlFlag(EFalse);
		}

    IRLOG_DEBUG( "CIRAdvertisingListBox::Draw - Exiting" );
    }
// ---------------------------------------------------------------------------
// CIRAdvertisingListBox::~CIRAdvertisingListBox
// ---------------------------------------------------------------------------
//
CIRAdvertisingListBox::~CIRAdvertisingListBox()
	{
	IRLOG_DEBUG( "CIRAdvertisingListBox::~CIRAdvertisingListBox - Entering" );
	if(iFindStationsTextResource)
		{
		delete iFindStationsTextResource;
		iFindStationsTextResource = NULL;
		}
	if(iNoMatchesTextResource)
		{
		delete iNoMatchesTextResource;
		iNoMatchesTextResource = NULL;	
		}
	IRLOG_DEBUG( "CIRAdvertisingListBox::~CIRAdvertisingListBox - Exiting" );
	}

// ---------------------------------------------------------------------------
// CIRAdvertisingListBox::SetListItemFormat
// ---------------------------------------------------------------------------
//
void CIRAdvertisingListBox::SetListItemFormat(  HBufC* aItemFormat)
    {
    IRLOG_DEBUG( "CIRAdvertisingListBox::SetListItemFormat - Entering" );
	iItemFormat = aItemFormat;
    }

// ---------------------------------------------------------------------------
// CIRAdvertisingListBox::SetAdvertisementIconL
// ---------------------------------------------------------------------------
//
void CIRAdvertisingListBox::SetAdvertisementIconL( CGulIcon* aIcon,TBool aMainView )
    {
    IRLOG_DEBUG( "CIRAdvertisingListBox::SetAdvertisementIconL - Entering" );
    
    CIRAdvertisingListBoxData* irListBoxData = 
        static_cast<CIRAdvertisingListBoxData*>( ItemDrawer()->FormattedCellData() );
    
    // add listitem only, if it doesn't exist yet.
    if ( !aMainView && !irListBoxData->AdvertisementIcon() )
        {
        TInt currentItemIndex = CurrentItemIndex();
        TInt topItemIndex = TopItemIndex();

        
        CAknFilteredTextListBoxModel* listBoxModel = static_cast<CAknFilteredTextListBoxModel*>
        												( Model() );
        CDesCArraySeg* items = static_cast<CDesCArraySeg*>( listBoxModel->ItemTextArray() );
        items->InsertL( 0, *iItemFormat );
        
        HandleItemAdditionL();
        if ( currentItemIndex >= 0 )
            {
            SetCurrentItemIndex( currentItemIndex + 1 );
            }
        if ( topItemIndex > 0 )
            {
            SetTopItemIndex( topItemIndex + 1 );
            }
        }
    // always replace the existing image.
    irListBoxData->SetAdvertisementIcon( aIcon );
    
    DrawDeferred();     
    IRLOG_DEBUG( "CIRAdvertisingListBox::SetAdvertisementIconL - Exiting" );
    }

// ---------------------------------------------------------------------------
// CIRAdvertisingListBox::ClearAdvertisementIcon
// ---------------------------------------------------------------------------
//
void CIRAdvertisingListBox::ClearAdvertisementIcon()
    {
    IRLOG_DEBUG( "CIRAdvertisingListBox::ClearAdvertisementIcon - Entering" );
   CIRAdvertisingListBoxData* irListBoxData = 
        static_cast<CIRAdvertisingListBoxData*>( ItemDrawer()->FormattedCellData() );
    irListBoxData->SetAdvertisementIcon( NULL );
    IRLOG_DEBUG( "CIRAdvertisingListBox::ClearAdvertisementIcon - Exiting" );
    }

// ---------------------------------------------------------------------------
// CIRAdvertisingListBox::AdvertisementIcon
// ---------------------------------------------------------------------------
//
CGulIcon* CIRAdvertisingListBox::AdvertisementIcon()
    {
    IRLOG_DEBUG( "CIRAdvertisingListBox::AdvertisementIcon - Entering" );
  	CIRAdvertisingListBoxData* irListBoxData = 
        static_cast<CIRAdvertisingListBoxData*>( ItemDrawer()->FormattedCellData() );
    IRLOG_DEBUG( "CIRAdvertisingListBox::AdvertisementIcon - Exiting" );
    return irListBoxData->AdvertisementIcon();
    }

// ---------------------------------------------------------------------------
// CIRAdvertisingListBox::CreateItemDrawerL
// ---------------------------------------------------------------------------
//
void CIRAdvertisingListBox::CreateItemDrawerL()
    {
    IRLOG_DEBUG( "CIRAdvertisingListBox::CreateItemDrawerL - Entering" );
    CIRAdvertisingListBoxData* formattedCellListBoxData = CIRAdvertisingListBoxData::NewL();
    CleanupStack::PushL( formattedCellListBoxData );
    const CFont* font = AknLayoutUtils::FontFromId( EAknLogicalFontPrimaryFont );
    
    iItemDrawer = new (ELeave) CIRAdvertisingListBoxDrawer( Model(), font,
                                                            formattedCellListBoxData,this, NULL );
    CleanupStack::Pop( formattedCellListBoxData );
    IRLOG_DEBUG( "CIRAdvertisingListBox::CreateItemDrawerL - Exiting" );
    }
// --------------------------------------------------------------------------
// CIRAdvertisingListBox::ConstructL()
// 
// --------------------------------------------------------------------------
void CIRAdvertisingListBox::ConstructL(const CCoeControl* aParent, 
                    TInt aFlags,CAknFilteredTextListBoxModel* aFilteredmodel)
    {
    IRLOG_DEBUG( "CIRAdvertisingListBox::ConstructL - Entering" );
    iModel=aFilteredmodel;
    CreateItemDrawerL();

    EnableExtendedDrawingL();
    iItemDrawer->SetDrawMark(EFalse);
    
	if(iFindStationsTextResource)
		{
		delete iFindStationsTextResource;
		iFindStationsTextResource = NULL;
		}
	HBufC* findStationsTextResource = StringLoader::LoadLC(R_IRAPP_FAVOURITES_LIST_EMPTY);
	iFindStationsTextResource = HBufC::NewL(findStationsTextResource->Length());
	iFindStationsTextResource->Des().Append(findStationsTextResource->Des());
	CleanupStack::PopAndDestroy( findStationsTextResource );
	
	if(iNoMatchesTextResource)
		{
		delete iNoMatchesTextResource;
		iNoMatchesTextResource = NULL;	
		}
	HBufC* noMatchesTextResource = StringLoader::LoadLC(R_IRAPP_STATIONLIST_NOMATCHES);
	iNoMatchesTextResource = HBufC::NewL(noMatchesTextResource->Length());
	iNoMatchesTextResource->Des().Append(noMatchesTextResource->Des());
	CleanupStack::PopAndDestroy( noMatchesTextResource );

    CEikListBox::ConstructL(aParent,aFlags);
    IRLOG_DEBUG( "CIRAdvertisingListBox::ConstructL - Exiting" );
    }
// --------------------------------------------------------------------------
// CIRAdvertisingListBox::SetLastPlayed()
// sets the status of lastplayed
// --------------------------------------------------------------------------
void CIRAdvertisingListBox::SetLastPlayed(TBool aLastPlayed)
	{
    IRLOG_DEBUG( "CIRAdvertisingListBox::SetLastPlayed " );
	iLastPlayed = aLastPlayed;	
	}

// --------------------------------------------------------------------------
// CIRAdvertisingListBox::GetLastPlayed()
// return the status of lastplayed
// --------------------------------------------------------------------------
TBool  CIRAdvertisingListBox::GetLastPlayed() const
	{
    IRLOG_DEBUG( "CIRAdvertisingListBox::GetLastPlayed " );
	return iLastPlayed;	
	}
// --------------------------------------------------------------------------
// CIRAdvertisingListBox::GetFavouritesCount()
// returns the number of favourates present.
// --------------------------------------------------------------------------
TInt CIRAdvertisingListBox::GetFavouritesCount() const
	{
    IRLOG_DEBUG( "CIRAdvertisingListBox::GetFavouritesCount " );
	CIRUi* appUi = static_cast<CIRUi*>( iCoeEnv->AppUi() );
	TInt favCount = appUi->iFavPresets->iFavPresetList.Count();
    IRLOG_DEBUG( "CIRAdvertisingListBox::GetFavouritesCount - Exiting" );
    return favCount;
	}
// --------------------------------------------------------------------------
// CIRAdvertisingListBox::GetFavouritesCount()
// returns the number of favourates present.
// --------------------------------------------------------------------------
TBool CIRAdvertisingListBox::GetFilteredFlag() const
	{
    IRLOG_DEBUG( "CIRAdvertisingListBox::GetFavouritesCount " );
	CIRUi* appUi = static_cast<CIRUi*>( iCoeEnv->AppUi() );
	TBool flag = appUi->iMainView->GetMainContainer()->GetFilteredFlag();
    IRLOG_DEBUG( "CIRAdvertisingListBox::GetFavouritesCount - Exiting" );
    return flag;
	}
// --------------------------------------------------------------------------
// CIRAdvertisingListBox::GetActiveView()
// returns whether the active view is mainView or not.
// --------------------------------------------------------------------------
TBool CIRAdvertisingListBox::GetActiveView() const
	{
    IRLOG_DEBUG( "CIRAdvertisingListBox::GetActiveView " );
	CIRUi* appUi = static_cast<CIRUi*>( iCoeEnv->AppUi() );
    IRLOG_DEBUG( "CIRAdvertisingListBox::GetActiveView - Exiting" );
	if(appUi->iMainView->GetMainContainer())
		{
		return ETrue;	
		}
	else
		{
		return EFalse;	
		}
	}
/******************************Advertisement Listbox for Category View************/


// ---------------------------------------------------------------------------
// CIRCategoryAdvertisingListBox::CIRCategoryAdvertisingListBox
// ---------------------------------------------------------------------------
//
CIRCategoryAdvertisingListBox::CIRCategoryAdvertisingListBox()
    {
    }

// ---------------------------------------------------------------------------
// CIRCategoryAdvertisingListBox::SetGC
// ---------------------------------------------------------------------------
//
void CIRCategoryAdvertisingListBox::SetGC(CWindowGc& aGc)
	{
	iGc = &aGc;	
	}
// ---------------------------------------------------------------------------
// CIRCategoryAdvertisingListBox::SetControlFlag
// ---------------------------------------------------------------------------
//
void CIRCategoryAdvertisingListBox::SetControlFlag(TBool aControlFlag)
	{
    CIRAdvertisingListBoxData* irListBoxData = 
        static_cast<CIRAdvertisingListBoxData*>( ItemDrawer()->FormattedCellData() );
	irListBoxData->SetControlFlag(aControlFlag);	
	}
// ---------------------------------------------------------------------------
// CIRCategoryAdvertisingListBox::Draw
// ---------------------------------------------------------------------------
//
void CIRCategoryAdvertisingListBox::Draw(const TRect& aRect) const 
	{
    IRLOG_DEBUG( "CIRCategoryAdvertisingListBox::Draw - Entering" );
	CAknDoubleStyleListBox::Draw(aRect);

    TInt count = Model()->NumberOfItems();
    CIRAdvertisingListBoxData* irListBoxData = 
        static_cast<CIRAdvertisingListBoxData*>( ItemDrawer()->FormattedCellData() );
    if(irListBoxData->GetControlFlag())
	    {
	    if(count == 1 && irListBoxData->AdvertisementIcon())
		    {
			TRAP_IGNORE(irListBoxData->DrawEmptyListL(*iGc,*iTextResource,Rect()));	
			}
	    else if(count == 0)
		    {
			TRAP_IGNORE(View()->SetListEmptyTextL(*iTextResource));
		    }
		irListBoxData->SetControlFlag(EFalse);
	    }
    IRLOG_DEBUG( "CIRCategoryAdvertisingListBox::Draw - Exiting" );
    }
// ---------------------------------------------------------------------------
// CIRCategoryAdvertisingListBox::~CIRCategoryAdvertisingListBox
// ---------------------------------------------------------------------------
//
CIRCategoryAdvertisingListBox::~CIRCategoryAdvertisingListBox()
	{
	IRLOG_DEBUG( "CIRCategoryAdvertisingListBox::~CIRCategoryAdvertisingListBox - Entering" );
	if(iTextResource)
		{
		delete iTextResource;
		iTextResource = NULL;
		}
	IRLOG_DEBUG( "CIRCategoryAdvertisingListBox::~CIRCategoryAdvertisingListBox - Exiting" );
	}

// ---------------------------------------------------------------------------
// CIRCategoryAdvertisingListBox::SetListItemFormat
// ---------------------------------------------------------------------------
//
void CIRCategoryAdvertisingListBox::SetListItemFormat(  HBufC* aItemFormat )
    {
    IRLOG_DEBUG( "CIRCategoryAdvertisingListBox::SetListItemFormat - Entering" );
	__ASSERT_ALWAYS( !iItemFormat, User::Panic( KNullDesC, KErrCorrupt ) );
    iItemFormat = aItemFormat;
    }

// ---------------------------------------------------------------------------
// CIRCategoryAdvertisingListBox::SetAdvertisementIconL
// ---------------------------------------------------------------------------
//
void CIRCategoryAdvertisingListBox::SetAdvertisementIconL( CGulIcon* aIcon )
    {
    IRLOG_DEBUG( "CIRCategoryAdvertisingListBox::SetAdvertisementIconL - Entering" );
	__ASSERT_ALWAYS( iItemFormat, User::Panic( KNullDesC, KErrCorrupt  ) );
    
    CIRAdvertisingListBoxData* irListBoxData = 
        static_cast<CIRAdvertisingListBoxData*>( ItemDrawer()->FormattedCellData() );
    
    // add listitem only, if it doesn't exist yet.
    if ( !irListBoxData->AdvertisementIcon() )
        {
        TInt currentItemIndex = CurrentItemIndex();
        TInt topItemIndex = TopItemIndex();

     
        CAknFilteredTextListBoxModel* listBoxModel = static_cast<CAknFilteredTextListBoxModel*>
        											( Model() );
        CDesCArraySeg* items = static_cast<CDesCArraySeg*>( listBoxModel->ItemTextArray() );
        items->InsertL( 0, *iItemFormat );
        
        HandleItemAdditionL();
        if ( currentItemIndex >= 0 )
            {
            SetCurrentItemIndex( currentItemIndex + 1 );
            }
        if ( topItemIndex > 0 )
            {
            SetTopItemIndex( topItemIndex + 1 );
            }
        }
    // always replace the existing image.
    irListBoxData->SetAdvertisementIcon( aIcon );
    
    DrawDeferred();     
    IRLOG_DEBUG( "CIRCategoryAdvertisingListBox::SetAdvertisementIconL - Exiting" );
    }

// ---------------------------------------------------------------------------
// CIRCategoryAdvertisingListBox::ClearAdvertisementIcon
// ---------------------------------------------------------------------------
//
void CIRCategoryAdvertisingListBox::ClearAdvertisementIcon()
    {
    IRLOG_DEBUG( "CIRCategoryAdvertisingListBox::ClearAdvertisementIcon - Entering" );
   CIRAdvertisingListBoxData* irListBoxData = 
        static_cast<CIRAdvertisingListBoxData*>( ItemDrawer()->FormattedCellData() );
    irListBoxData->SetAdvertisementIcon( NULL );
    IRLOG_DEBUG( "CIRCategoryAdvertisingListBox::ClearAdvertisementIcon - Exiting" );
    }

// ---------------------------------------------------------------------------
// CIRCategoryAdvertisingListBox::AdvertisementIcon
// ---------------------------------------------------------------------------
//
CGulIcon* CIRCategoryAdvertisingListBox::AdvertisementIcon()
    {
     IRLOG_DEBUG( "CIRCategoryAdvertisingListBox::AdvertisementIcon - Entering" );
  CIRAdvertisingListBoxData* irListBoxData = 
        static_cast<CIRAdvertisingListBoxData*>( ItemDrawer()->FormattedCellData() );
    IRLOG_DEBUG( "CIRCategoryAdvertisingListBox::AdvertisementIcon - Exiting" );
    return irListBoxData->AdvertisementIcon();
    }

// ---------------------------------------------------------------------------
// CIRCategoryAdvertisingListBox::CreateItemDrawerL
// ---------------------------------------------------------------------------
//
void CIRCategoryAdvertisingListBox::CreateItemDrawerL()
    {
    IRLOG_DEBUG( "CIRCategoryAdvertisingListBox::CreateItemDrawerL - Entering" );
    CIRAdvertisingListBoxData* formattedCellListBoxData = CIRAdvertisingListBoxData::NewL();
    CleanupStack::PushL( formattedCellListBoxData );
    const CFont* font = AknLayoutUtils::FontFromId( EAknLogicalFontPrimaryFont );
    
    iItemDrawer = new (ELeave) CIRAdvertisingListBoxDrawer( Model(), font,
                                                            formattedCellListBoxData,NULL, this );
    CleanupStack::Pop( formattedCellListBoxData );
    IRLOG_DEBUG( "CIRCategoryAdvertisingListBox::CreateItemDrawerL - Exiting" );
    }
// --------------------------------------------------------------------------
// CIRCategoryAdvertisingListBox::ConstructL()
// 
// --------------------------------------------------------------------------
void CIRCategoryAdvertisingListBox::ConstructL(const CCoeControl* aParent, 
                    TInt aFlags,CAknFilteredTextListBoxModel* aFilteredmodel)
    {
    IRLOG_DEBUG( "CIRCategoryAdvertisingListBox::ConstructL - Entering" );
    iModel=aFilteredmodel;
    CreateItemDrawerL();

    EnableExtendedDrawingL();
    iItemDrawer->SetDrawMark(EFalse);

	if(iTextResource)
		{
		delete iTextResource;
		iTextResource = NULL;
		}
	HBufC* textResource = StringLoader::LoadLC(R_IRAPP_STATIONLIST_NOMATCHES);
	iTextResource = HBufC::NewL(textResource->Length());
	iTextResource->Des().Append(textResource->Des());
	CleanupStack::PopAndDestroy( textResource );

    CEikListBox::ConstructL(aParent,aFlags);
    IRLOG_DEBUG( "CIRCategoryAdvertisingListBox::ConstructL - Exiting" );
    }