Namespaces

Variants
Actions

Please note that as of October 24, 2014, the Nokia Developer Wiki will no longer be accepting user contributions, including new entries, edits and comments, as we begin transitioning to our new home, in the Windows Phone Development Wiki. We plan to move over the majority of the existing entries over the next few weeks. Thanks for all your past and future contributions.

How to customize a listbox

From Wiki
Jump to: navigation, search
Article Metadata
Article
Created: eswar_illuri (07 May 2007)
Last edited: hamishwillee (26 Jul 2012)

Developers may want to customize a list box according to their requirements. An example of such customization would be to remove the dotted column line from a double style list box.


Solution

Override the existing list box and item drawer methods by providing a custom implementation.

Below is a simplified example for customizing a double number style list box.

Header File

class CDSListItemDrawer : public CFormattedCellListBoxItemDrawer
 
{
 
public:
 
CDSListItemDrawer( MTextListBoxModel* aTextListBoxModel,
 
const CFont* aFont,
 
CFormattedCellListBoxData* aFormattedCellData );
 
void DrawItemText( TInt aItemIndex, const TRect &aActualItemRect,
 
TBool aItemIsCurrent, TBool aViewIsEmphasized,
 
TBool aItemIsSelected) const;
 
void SetColour( const TRgb& aTextForeground,
 
const TRgb& aTextBackground,
 
const TRgb& aHighlightForeground,
 
const TRgb& aHighlightBackground );
 
private: // data
 
TRgb iTextForegroundColour;
 
TRgb iTextBackgroundColour;
 
TRgb iHighlightForegroundColour;
 
TRgb iHighlightBackgroundColour;
 
const CFont* iPersistentFont;
 
CFormattedCellListBoxData* iCellData;
 
TInt iScrollOffset;
 
};
class CDSListBox : public CAknDoubleNumberStyleListBox
 
{
 
public:
 
CDSListBox( const CFont* aFont,
 
CFormattedCellListBoxData* aFormattedCellListBoxData );
 
 
 
void SetScrollFrame();
 
void FindCellSize();
 
protected:
 
virtual void CreateItemDrawerL();
 
virtual CListBoxView* MakeViewClassInstanceL();
 
private:
 
const CFont* iFont;
 
CFormattedCellListBoxData* iFormattedCellListBoxData;
 
};

Source File

CDSListItemDrawer::CDSListItemDrawer( MTextListBoxModel* aTextListBoxModel, 
 
const CFont* aFont,
 
CFormattedCellListBoxData* aFormatedCellData )
 
: CFormattedCellListBoxItemDrawer( aTextListBoxModel, aFont, aFormatedCellData ),
 
iPersistentFont( aFont )
 
{
 
}
 
void CDSListItemDrawer::DrawItemText( TInt aItemIndex,
 
const TRect &aItemTextRect,
 
TBool aItemIsCurrent,
 
TBool aViewIsEmphasized,
 
TBool aItemIsSelected) const
 
{
 
Gc()->SetBrushStyle( CGraphicsContext::ESolidBrush );
 
Gc()->SetBrushColor( KRgbWhite );
 
Gc()->Clear( aItemTextRect );
 
TPtrC itemText = iModel->ItemText( aItemIndex );
 
TInt textLength = itemText.Length();
 
TInt tabPosition1 = itemText.Locate( '\t' );
 
TInt tabPosition2 = itemText.Mid(tabPosition1+1).Locate( '\t' );
 
const CFont* font = Font( aItemIndex );
 
Gc()->SetPenStyle( CGraphicsContext::ESolidPen );
 
Gc()->SetBrushStyle( CGraphicsContext::ESolidBrush );
 
TRgb textColour;
 
TRgb bgColour;
 
if ( aItemIsCurrent )
 
{
 
textColour = iHighlightForegroundColour;
 
bgColour = iHighlightBackgroundColour;
 
}
 
else
 
{
 
textColour = iTextForegroundColour;
 
bgColour = iTextBackgroundColour;
 
}
 
Gc()->UseFont( iPersistentFont );
 
// Set the item's background.
 
Gc()->SetBrushStyle( CGraphicsContext::ESolidBrush );
 
Gc()->SetBrushColor( bgColour );
 
Gc()->SetPenColor( textColour );
 
TRect textRect( TPoint( aItemTextRect.iTl.iX, (aItemTextRect.iTl.iY-10) ),
 
aItemTextRect.iBr );
 
textRect.iBr.iY -= aItemTextRect.Height() / 2;
 
if ( !font )
 
{
 
font = CEikonEnv::Static()->LegendFont();
 
}
 
Gc()->UseFont(font);
 
TInt baseline = ( textRect.iBr.iY
 
- textRect.iTl.iY
 
- font->HeightInPixels() ) / 2 + font->AscentInPixels();
 
Gc()->DrawText( itemText.Mid( 0,tabPosition1 ),
 
textRect, baseline-20, CGraphicsContext::ELeft);
 
Gc()->DrawText( itemText.Mid( tabPosition1+1, tabPosition2 - tabPosition1 ),
 
textRect, baseline, CGraphicsContext::ELeft, 0);
 
font = CCoeEnv::Static()->NormalFont();
 
Gc()->UseFont(font);
 
textRect.Move( 0, aItemTextRect.Height() / 2 );
 
baseline = ( textRect.iBr.iY
 
- textRect.iTl.iY
 
- font->HeightInPixels() ) / 2 + font->AscentInPixels();
 
Gc()->DrawText( itemText.Mid( tabPosition2,textLength-tabPosition2 ),
 
textRect, baseline, CGraphicsContext::ELeft, 1);
 
}
 
void CDSListItemDrawer::SetColour( const TRgb& aTextForeground,
 
const TRgb& aTextBackground,
 
const TRgb& aHighlightForeground,
 
const TRgb& aHighlightBackground)
 
{
 
iTextForegroundColour = aTextForeground;
 
iTextBackgroundColour = aTextBackground;
 
iHighlightForegroundColour = aHighlightForeground;
 
iHighlightBackgroundColour = aHighlightBackground;
 
iBackColor = iTextBackgroundColour;
 
}
 
CDSListBox::CDSListBox( const CFont* aFont,
 
CFormattedCellListBoxData* aFormattedCellListBoxData )
 
{
 
iFont = aFont;
 
iFormattedCellListBoxData=aFormattedCellListBoxData;
 
}
 
void CDSListBox::CreateItemDrawerL()
 
{
 
iItemDrawer = new (ELeave) CDSListItemDrawer(
 
Model(),
 
iFont,
 
iFormattedCellListBoxData );
 
}
 
CListBoxView* CDSListBox::MakeViewClassInstanceL()
 
{
 
return new (ELeave) CListBoxView();
 
}
 
void CDSListBox::SetScrollFrame()
 
{
 
}
 
void CDSListBox::FindCellSize()
 
{
 
}

The calling function from a CCoeControl should contain:

SetExtentToWholeScreen();     // Drawing it to the whole screen
 
iTextForegroundColour = KRgbGreen;
 
iTextBackgroundColour = KRgbRed;
 
iHighlightForegroundColour = KRgbWhite;
 
iHighlightBackgroundColour = KRgbBlue;
 
iListItems = new (ELeave) CDesC16ArrayFlat( 2 );
 
const CFont *font;
 
_LIT( KTextFont, "LatinBold13" );
 
CFont* myFont;
 
CFormattedCellListBoxData* myFormattedCellListBoxData;
 
CGraphicsDevice* screenDevice = CEikonEnv::Static()->ScreenDevice();
 
TFontSpec textFontSpec( KTextFont, 200 );
 
screenDevice->GetNearestFontInTwips( myFont,textFontSpec );
 
myFormattedCellListBoxData = CFormattedCellListBoxData::NewL();
 
iListBox1 = new (ELeave) CDSListBox( myFont, myFormattedCellListBoxData );
 
iListBox1->ConstructL( this, 0 );
 
iListBox1->SetRect( TRect( 0, 0, 3000, 3000 ) );
 
CDSListItemDrawer* drawer = (CDSListItemDrawer*) iListBox1->View()->ItemDrawer();
 
drawer->SetColour( iTextForegroundColour,
 
iTextBackgroundColour,
 
iHighlightForegroundColour,
 
iHighlightBackgroundColour );
 
CColumnListBoxData* columnData=CColumnListBoxData::NewL();
 
columnData->SetControl( iListBox1 );
 
TInt columnSize;
 
columnData->ColumnWidthPixel( columnSize );
 
_LIT( KListItemFormat, "%d\t%S\t%S" );
 
_LIT( KName1, "Name11" );
 
_LIT( KContactNo,"123" );
 
_LIT( KName2,"Name22" );
 
_LIT( KContactNo2,"789" );
 
TBuf<40> item;
 
MDesCArray* itemList = iListBox1->Model()->ItemTextArray();
 
CDesCArray* itemArray = (CDesCArray*) itemList;
 
TBuf<30> NameBuf;
 
TBuf<30> ConBuf;
 
// add first item in the array
 
NameBuf.Copy( KName1 );
 
ConBuf.Copy( KContactNo );
 
TInt id = 1;
 
item.Format( KListItemFormat, id, &NameBuf, &ConBuf );
 
itemArray->AppendL( item );
 
// add second item in the array
 
NameBuf.Zero();
 
ConBuf.Zero();
 
NameBuf.Copy( KName2 );
 
ConBuf.Copy( KContactNo2 );
 
item.Format( KListItemFormat, id, &NameBuf, &ConBuf );
 
itemArray->AppendL( item );
 
NameBuf.Zero();
 
ConBuf.Zero();
 
iListBox1->SetRect( TRect( TPoint( 0,0 ),
 
TPoint( 20000, 20000 )) );
 
iListBox1->ActivateL();
 
iListBox1->HandleItemAdditionL();
 
DrawNow();
This page was last modified on 26 July 2012, at 02:42.
32 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×