--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/internetradio2.0/uicontrolssrc/iradvertisinglistbox.cpp Mon Apr 19 14:01:53 2010 +0300
@@ -0,0 +1,1060 @@
+/*
+* 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" );
+ }