windowing/windowserver/tman/TTEXT.CPP
author Faisal Memon <faisal.memon@nokia.com>
Fri, 25 Jun 2010 17:49:58 +0100
branchEGL_MERGE
changeset 105 158b2308cc08
parent 0 5d03bc08d59c
permissions -rw-r--r--
Fix def files so that the implementation agnostic interface definition has no non-standards defined entry points, and change the eglrefimpl specific implementation to place its private entry points high up in the ordinal order space in the implementation region, not the standards based entrypoints region.

// Copyright (c) 1995-2009 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:
// Print some text, to be checked by eye
// 
//

#include <e32std.h>
#include <e32svr.h>
#include "W32STD.H"
#include "../tlib/testbase.h"
#include "TMAN.H"

class TTextTest;

enum {EDrawModeFonts,EDrawModeCharJust,EDrawModeWordJust};

_LIT(KTestFontTypefaceName,"DejaVu Sans Condensed");

class CTextWindow : public CTWin
	{
public:
	CTextWindow(TTextTest *aTest);
	void SetUpLD(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc);
	void Draw();
	void WinKeyL(const TKeyEvent &aKey,const TTime &aTime);
	void ResetPrintLine();
	void Print(const CFont *aFont, const TDesC &aText);
	void PrintLine(const CFont *aFont, const TDesC &aText);
	void PrintDivider();
	void PrintStylesL(const TDesC &aText, TFontSpec &aFontSpec, const TFontStyle &aFontStyle);
	void DrawCharJustified(const TDesC &aText);
	void DrawWordJustified(const TDesC &aText);
	TBool NextPage();
	void SetDrawMode(TInt aMode);
private:
	TInt iDrawMode;
	TTextTest *iTest;
	CFbsFont *iTmpFont;
	TInt iNumTypeFaces;
	TInt iTypeFaceIndex;
	TInt iXStartPos;
	TInt iYpos;
	TInt iXpos;
	};

class TTextTest : public CTestBase
	{
public:
	TTextTest();
	~TTextTest();
	TestState DoTestL();
	void ConstructL();
private:
	CTextWindow *iWin;
	TSize iWinSize;
	TInt iState;
	};

GLDEF_C CTestBase *CreateTextTest()
	{
	return(new(ELeave) TTextTest());
	}

CTextWindow::CTextWindow(TTextTest *aTest) : CTWin(), iDrawMode(EDrawModeWordJust), iTest(aTest)
	{}

void CTextWindow::SetUpLD(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc)
	{
	ConstructExtLD(*parent,pos,size);
	Activate();
	AssignGC(aGc);
	iNumTypeFaces=Client()->iScreen->NumTypefaces();
	}

void CTextWindow::ResetPrintLine()
	{
	iXpos=iXStartPos=5;
	iYpos=2;
	}

void CTextWindow::PrintDivider()
	{
	iGc->DrawLine(TPoint(0,iYpos+5),TPoint(Size().iWidth,iYpos+5));
	iYpos+=10;
	}

void CTextWindow::Print(const CFont *aFont, const TDesC &aText)
	{
	iGc->DrawText(aText, TPoint(iXpos, iYpos+aFont->AscentInPixels()));
	iXpos+=aFont->TextWidthInPixels(aText);
	}

void CTextWindow::PrintLine(const CFont *aFont, const TDesC &aText)
	{
	iGc->DrawText(aText, TPoint(iXpos, iYpos+aFont->AscentInPixels()));
	iXpos=iXStartPos;
	iYpos+=aFont->HeightInPixels()+2;
	}

TBool CTextWindow::NextPage()
	{
	if (iTypeFaceIndex==(iNumTypeFaces-1))
		return(ETrue);
	++iTypeFaceIndex;
	return(EFalse);
	}

void CTextWindow::PrintStylesL(const TDesC &aText, TFontSpec &aFontSpec, const TFontStyle &aFontStyle)
	{
	aFontSpec.iFontStyle=aFontStyle;
	User::LeaveIfError(Client()->iScreen->GetNearestFontToDesignHeightInTwips((CFont *&)iTmpFont, aFontSpec));
	iGc->UseFont(iTmpFont);
	Print(iTmpFont,aText);
	iGc->SetUnderlineStyle(EUnderlineOn);
	Print(iTmpFont,_L("Underline, "));
	iGc->SetStrikethroughStyle(EStrikethroughOn);
	Print(iTmpFont,_L("Strikethrough/underline, "));
	iGc->SetUnderlineStyle(EUnderlineOff);
	PrintLine(iTmpFont,_L("Strikethrough"));
	iGc->SetStrikethroughStyle(EStrikethroughOff);
	Client()->iScreen->ReleaseFont(iTmpFont);
	iTmpFont=NULL;
	}

void CTextWindow::DrawCharJustified(const TDesC &aText)
	{
	iGc->SetCharJustification(Size().iWidth-10-iTmpFont->TextWidthInPixels(aText),aText.Length()-1);
	PrintLine(iTmpFont, aText);
	}

void CTextWindow::DrawWordJustified(const TDesC &aText)
	{
	TInt count=0;
	for(TInt index=0;index<aText.Length();index++)
		if (aText[index]==' ')
			count++;
	iGc->SetWordJustification(Size().iWidth-10-iTmpFont->TextWidthInPixels(aText),count);
	PrintLine(iTmpFont, aText);
	}

void CTextWindow::Draw()
//This function is virtual and so cannot have an 'L' at the end of it's name
	{
	iGc->Clear();
	ResetPrintLine();
	switch(iDrawMode)
		{
	case EDrawModeWordJust:
		User::LeaveIfError(Client()->iScreen->GetNearestFontToDesignHeightInTwips((CFont *&)iTmpFont, TFontSpec(KTestFontTypefaceName,200)));
		iGc->UseFont(iTmpFont);
		DrawWordJustified(_L("Hello World"));
		DrawWordJustified(_L("One Two Three Four Five Six Seven"));
		DrawWordJustified(_L("AA    B        CC D"));
		DrawWordJustified(_L("ONEWORD"));
		iGc->DiscardFont();
		Client()->iScreen->ReleaseFont(iTmpFont);
		iTmpFont=NULL;
		break;
	case EDrawModeCharJust:
		User::LeaveIfError(Client()->iScreen->GetNearestFontToDesignHeightInTwips((CFont *&)iTmpFont, TFontSpec(KTestFontTypefaceName,200)));
		iGc->UseFont(iTmpFont);
		DrawCharJustified(_L("Hello World"));
		DrawCharJustified(_L("One Two Three Four Five Six Seven"));
		DrawCharJustified(_L("AA    B        CC D"));
		DrawCharJustified(_L("ONEWORD"));
		iGc->DiscardFont();
		Client()->iScreen->ReleaseFont(iTmpFont);
		iTmpFont=NULL;
		break;
	case EDrawModeFonts:
		{
		TTypefaceSupport typefaceSupport;
		Client()->iScreen->TypefaceSupport(typefaceSupport,iTypeFaceIndex);
		TBuf<0x40> title;
		TBuf16<KMaxTypefaceNameLength> tmpBuf;
		tmpBuf.Copy(typefaceSupport.iTypeface.iName);
		title.Append(tmpBuf);
		title.AppendFormat(TRefByValue<const TDesC>(_L(", Heights (Min=%d, Max=%d, Num=%d)")),typefaceSupport.iMinHeightInTwips,typefaceSupport.iMaxHeightInTwips,typefaceSupport.iNumHeights);
		PrintLine(iFont,title);
		PrintDivider();
		for (TInt tfHeight=0;tfHeight<typefaceSupport.iNumHeights;tfHeight++)
			{
			TFontSpec fspec(typefaceSupport.iTypeface.iName,Client()->iScreen->FontHeightInTwips(iTypeFaceIndex,tfHeight));
			PrintStylesL(_L("Normal, "), fspec, TFontStyle());
			PrintStylesL(_L("Bold, "), fspec, TFontStyle(EPostureUpright,EStrokeWeightBold,EPrintPosNormal));
			PrintStylesL(_L("Italic, "), fspec, TFontStyle(EPostureItalic,EStrokeWeightNormal,EPrintPosNormal));
			PrintStylesL(_L("Bold/italic, "), fspec, TFontStyle(EPostureItalic,EStrokeWeightBold,EPrintPosNormal));
			if (iYpos>Size().iHeight)
				break;
			}
		}
		break;
		}
	}

void CTextWindow::WinKeyL(const TKeyEvent &aKey,const TTime &)
	{
	if (iDrawMode!=EDrawModeFonts || (aKey.iCode==EKeyEscape || NextPage()))
		CActiveScheduler::Stop();
	else
		iWin.Invalidate();
	}

void CTextWindow::SetDrawMode(TInt aDrawMode)
	{
	iDrawMode=aDrawMode;
	iWin.Invalidate();
	}

TTextTest::TTextTest() : CTestBase(_L("Text"))
	{}

TTextTest::~TTextTest()
	{
	CTWin::Delete(iWin);
	}

void TTextTest::ConstructL()
	{
	CTextWindow *win=new(ELeave) CTextWindow(this);
	win->SetUpLD(TPoint(0,0),Client()->iScreen->SizeInPixels(),Client()->iGroup,*Client()->iGc);
	iWin=win;
	Client()->iGroup->SetCurrentWindow(iWin);
	Client()->iGroup->GroupWin()->SetOrdinalPosition(0);
	}

TestState TTextTest::DoTestL()
	{
	switch(iState)
		{
		case 0:
			LogSubTest(_L("SetWordJustification"),1);
			iWin->SetDrawMode(EDrawModeWordJust);
 			CActiveScheduler::Start();
			iState++;
			break;
		case 1:
			LogSubTest(_L("SetCharJustification"),2);
			iWin->SetDrawMode(EDrawModeCharJust);
			CActiveScheduler::Start();
			iState++;
			break;
		case 2:
			LogSubTest(_L("Text 1"),3);
			iWin->SetDrawMode(EDrawModeFonts);
			CActiveScheduler::Start();
			iState++;
			break;
		default:
			return(EFinished);
		}
	return(ENext);
	}