uifw/EikStd/coctlsrc/eiklbd.cpp
changeset 0 2f259fa3e83a
--- /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;
+	}