--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/EikStd/coctlsrc/eiklbd.cpp Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,321 @@
+/*
+* Copyright (c) 1998 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:
+*
+*/
+
+
+
+#include <eiklbx.h> // to call static function ListBoxLaf()
+#include <eiklbd.h>
+#include <gdi.h>
+#include <coemain.h>
+#include <eikenv.h>
+#include <eiklbi.h>
+#include "laflbd.h"
+
+#include "akntrace.h"
+
+class MAknsControlContext;
+//
+// class CListBoxDataExtension
+// (private class -- put all interface to CListBoxData instead)
+//
+
+NONSHARABLE_CLASS(CListBoxDataExtension) : public CBase
+ {
+public:
+ void ConstructL();
+ ~CListBoxDataExtension();
+public:
+ MAknsControlContext* iSkinControlContext;
+ TBool iSkinEnabled;
+ };
+
+void CListBoxDataExtension::ConstructL()
+ {
+ }
+CListBoxDataExtension::~CListBoxDataExtension()
+ {
+ }
+
+
+///
+/// class TListBoxBoundValues
+///
+
+EXPORT_C TListFontBoundValues::TListFontBoundValues()
+ : iMaxNormalCharWidthInPixels(0), iHeightInPixels(0)
+ {
+ }
+
+///
+/// class CListBoxData
+///
+
+EXPORT_C CListBoxData::CListBoxData()
+ : iAlign(CGraphicsContext::ELeft)
+ {}
+
+EXPORT_C CListBoxData::~CListBoxData()
+ {
+ delete iSearchString;
+ delete iLBDExtension;
+ }
+
+EXPORT_C MAknsControlContext *CListBoxData::SkinBackgroundControlContext() const
+ {
+ if (iLBDExtension && iLBDExtension->iSkinEnabled)
+ return iLBDExtension->iSkinControlContext;
+ return NULL;
+ }
+
+EXPORT_C void CListBoxData::SetSkinBackgroundControlContextL(MAknsControlContext *aContext)
+ {
+ if (iLBDExtension)
+ iLBDExtension->iSkinControlContext = aContext;
+ }
+
+EXPORT_C void CListBoxData::SetSkinEnabledL(TBool aEnabled)
+ {
+ if (iLBDExtension)
+ iLBDExtension->iSkinEnabled = aEnabled;
+ }
+
+EXPORT_C void CListBoxData::ConstructL(const CFont* /* aBaseFont */)
+ {
+ iLBDExtension = new(ELeave)CListBoxDataExtension;
+ iLBDExtension->ConstructL();
+ }
+
+EXPORT_C CFont* CListBoxData::Font(const TListItemProperties& aItemProperties) const
+ {
+ CArrayPtr<CFont>* fonts=NULL;
+ if ((aItemProperties.IsBold()) && (aItemProperties.IsItalics()))
+ {
+ fonts=iBoldItalicFont.iFonts;
+ }
+ else if (aItemProperties.IsBold())
+ {
+ fonts=iBoldFont.iFonts;
+ }
+ else if (aItemProperties.IsItalics())
+ {
+ fonts=iItalicFont.iFonts;
+ }
+ else
+ fonts=iNormalFont.iFonts;
+ if (!fonts || fonts->Count()==0)
+ return NULL;
+ return fonts->At(0);
+ }
+
+EXPORT_C
+void CListBoxData::SetupGc( const TListItemProperties& aItemProperties,
+ CWindowGc& aGc) const
+ {
+ aGc.SetUnderlineStyle(aItemProperties.IsUnderlined() ? EUnderlineOn : EUnderlineOff);
+ aGc.SetPenColor(aItemProperties.Color());
+ CFont *font=Font(aItemProperties);
+ if(font)
+ {
+ aGc.UseFont(font);
+ }
+ }
+
+EXPORT_C const TListFontBoundValues& CListBoxData::FontBoundValues() const
+ {
+ return iFontBoundValues;
+ }
+
+EXPORT_C TInt CListBoxData::SetFontHeight(TInt aFontHeightInTwips)
+ {
+ TListFontBoundValues newValues;
+ iFontBoundValues=newValues;
+ TInt retVal = KErrNone;
+ retVal = RegenerateFonts(iNormalFont, aFontHeightInTwips);
+ if(retVal!=KErrNone)
+ return retVal;
+ retVal = RegenerateFonts(iBoldFont, aFontHeightInTwips);
+ if(retVal!=KErrNone)
+ return retVal;
+ retVal = RegenerateFonts(iItalicFont, aFontHeightInTwips);
+ if(retVal!=KErrNone)
+ return retVal;
+ retVal = RegenerateFonts(iBoldItalicFont, aFontHeightInTwips);
+ return retVal;
+ }
+
+EXPORT_C TInt CListBoxData::RegenerateFonts(CFontsWithStyle& aFonts, TInt aFontHeightInTwips)
+ {
+ TInt retVal=KErrNone;
+ if (aFonts.iFonts)
+ {
+ CGraphicsDevice* screenDevice=CCoeEnv::Static()->ScreenDevice();
+ for (TInt ii=0 ; ii < aFonts.iFonts->Count(); ii++)
+ {
+ CFont* prevFont=aFonts.iFonts->At(ii);
+ TFontSpec fontSpec=prevFont->FontSpecInTwips();
+ fontSpec.iFontStyle=aFonts.FontStyle();
+ fontSpec.iHeight=aFontHeightInTwips;
+ CFont* font;
+ retVal=screenDevice->GetNearestFontInTwips(font,fontSpec);
+ if(retVal!=KErrNone)
+ break;
+ screenDevice->ReleaseFont(prevFont);
+ aFonts.iFonts->At(ii)=font;
+ UpdateFontBoundValues(*font);
+ }
+ }
+ return retVal;
+ }
+
+EXPORT_C void CListBoxData::ConstructFontL(const CFont* aBaseFont, TFontStyle aFontStyle, CFontsWithStyle& aFonts)
+ {
+ // Notice! CColumnListBoxData::AddActualFontL function assumes, that
+ // this function can leave only in the creation of an array or
+ // in appending an item into array.If this fact changes. AddActualFontL
+ // has to be rewritten.
+ if (!aFonts.iFonts)
+ {
+ aFonts.iFonts=new (ELeave) CArrayPtrFlat<CFont> (1);
+ }
+ CFont* font;
+ TFontSpec fontSpec=aBaseFont->FontSpecInTwips();
+ fontSpec.iFontStyle=aFontStyle;
+ User::LeaveIfError(CCoeEnv::Static()->ScreenDevice()->GetNearestFontInTwips(font,fontSpec));
+ UpdateFontBoundValues(*font);
+ aFonts.iFonts->AppendL(font);
+ aFonts.SetFontStyle(aFontStyle);
+ }
+
+EXPORT_C void CListBoxData::UpdateFontBoundValues(const CFont& aFont)
+ {
+ if (iFontBoundValues.iMaxNormalCharWidthInPixels<aFont.MaxNormalCharWidthInPixels())
+ {
+ iFontBoundValues.iMaxNormalCharWidthInPixels=aFont.MaxNormalCharWidthInPixels();
+ }
+ if (iFontBoundValues.iHeightInPixels<aFont.HeightInPixels())
+ {
+ iFontBoundValues.iHeightInPixels=aFont.HeightInPixels();
+ }
+ }
+
+EXPORT_C void CListBoxData::Reserved_1()
+ {
+ }
+
+EXPORT_C void CListBoxData::Reserved_2()
+ {
+ }
+
+//
+// Class CListBoxData::CFontsWithStyle
+//
+
+CListBoxData::CFontsWithStyle::CFontsWithStyle()
+ : iFonts (NULL)
+ {
+ }
+
+CListBoxData::CFontsWithStyle::~CFontsWithStyle()
+ {
+ ReleaseFonts();
+ delete iFonts;
+ }
+
+EXPORT_C void CListBoxData::CFontsWithStyle::ReleaseFonts()
+ {
+ if (iFonts)
+ {
+ for (TInt ii=0 ; ii < iFonts->Count(); ii++)
+ {
+ CCoeEnv::Static()->ScreenDevice()->ReleaseFont(iFonts->At(ii));
+ }
+ }
+ }
+
+EXPORT_C TFontStyle CListBoxData::CFontsWithStyle::FontStyle()
+ {
+ return iFontStyle;
+ }
+
+
+EXPORT_C void CListBoxData::CFontsWithStyle::SetFontStyle(TFontStyle aFontStyle)
+ {
+ iFontStyle=aFontStyle;
+ }
+
+/**
+ * Set search string for search result viewing.
+ */
+EXPORT_C void CListBoxData::SetSearchStringL(const TDesC* aSearchString)
+ {
+ _AKNTRACE_FUNC_ENTER;
+ if (aSearchString==NULL)
+ {
+ delete iSearchString;
+ iSearchString = NULL;
+ _AKNTRACE_FUNC_EXIT;
+ return;
+ }
+ TInt length = aSearchString->Length();
+ if (iSearchString)
+ {
+ if (length>iSearchString->Length())
+ {
+ iSearchString = iSearchString->ReAllocL(length);
+ }
+ }
+ else
+ {
+ iSearchString = HBufC::NewL(length);
+ }
+ *iSearchString = *aSearchString;
+ _AKNTRACE_FUNC_EXIT;
+ }
+
+/**
+ * Returns ETrue if a search string with a non-zero length has been set for this list box.
+ */
+EXPORT_C TBool CListBoxData::IsSearchString() const
+ {
+ return (iSearchString && iSearchString->Length());
+ }
+
+
+/**
+ * Font Draws list item text so that search string is drawed as bold underlined.
+ */
+EXPORT_C void CListBoxData::DrawItem(CWindowGc& aGc, const TRect& aItemTextRect,const TDesC& aItemText,
+ const CFont& aItemFont,const TInt aBaseLineOffset,const CGraphicsContext::TTextAlign aAlign) const
+ {
+ _AKNTRACE_FUNC_ENTER;
+ const TInt strPos=aItemText.FindF(*iSearchString);
+ const TInt strLen = iSearchString->Length();
+
+ if (strPos==KErrNotFound) // if there's no search string treat as normal
+ {
+ /*Call to the laf code which is responsible for drawing a normal text string in a rectangle*/
+ LafTextListItemDrawer::DrawNormalText(aItemText,aItemFont,aGc,aItemTextRect,aBaseLineOffset,aAlign);
+ }
+ else
+ {
+ const CFont& boldFont=iBoldFont.iFonts?*(iBoldFont.iFonts->At(0)):aItemFont;
+ /*Call to the laf code which is responsible for drawing a search text string in a rectangle*/
+ LafListBoxData::DrawSearchText(aItemTextRect,aGc,aItemFont,boldFont,
+ aItemText,strPos,strLen,aBaseLineOffset,aAlign);
+ }
+ _AKNTRACE_FUNC_EXIT;
+ }