sl@0: // Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // Print some text, to be checked by eye sl@0: // sl@0: // sl@0: sl@0: #include sl@0: #include sl@0: #include "W32STD.H" sl@0: #include "../tlib/testbase.h" sl@0: #include "TMAN.H" sl@0: sl@0: class TTextTest; sl@0: sl@0: enum {EDrawModeFonts,EDrawModeCharJust,EDrawModeWordJust}; sl@0: sl@0: _LIT(KTestFontTypefaceName,"DejaVu Sans Condensed"); sl@0: sl@0: class CTextWindow : public CTWin sl@0: { sl@0: public: sl@0: CTextWindow(TTextTest *aTest); sl@0: void SetUpLD(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc); sl@0: void Draw(); sl@0: void WinKeyL(const TKeyEvent &aKey,const TTime &aTime); sl@0: void ResetPrintLine(); sl@0: void Print(const CFont *aFont, const TDesC &aText); sl@0: void PrintLine(const CFont *aFont, const TDesC &aText); sl@0: void PrintDivider(); sl@0: void PrintStylesL(const TDesC &aText, TFontSpec &aFontSpec, const TFontStyle &aFontStyle); sl@0: void DrawCharJustified(const TDesC &aText); sl@0: void DrawWordJustified(const TDesC &aText); sl@0: TBool NextPage(); sl@0: void SetDrawMode(TInt aMode); sl@0: private: sl@0: TInt iDrawMode; sl@0: TTextTest *iTest; sl@0: CFbsFont *iTmpFont; sl@0: TInt iNumTypeFaces; sl@0: TInt iTypeFaceIndex; sl@0: TInt iXStartPos; sl@0: TInt iYpos; sl@0: TInt iXpos; sl@0: }; sl@0: sl@0: class TTextTest : public CTestBase sl@0: { sl@0: public: sl@0: TTextTest(); sl@0: ~TTextTest(); sl@0: TestState DoTestL(); sl@0: void ConstructL(); sl@0: private: sl@0: CTextWindow *iWin; sl@0: TSize iWinSize; sl@0: TInt iState; sl@0: }; sl@0: sl@0: GLDEF_C CTestBase *CreateTextTest() sl@0: { sl@0: return(new(ELeave) TTextTest()); sl@0: } sl@0: sl@0: CTextWindow::CTextWindow(TTextTest *aTest) : CTWin(), iDrawMode(EDrawModeWordJust), iTest(aTest) sl@0: {} sl@0: sl@0: void CTextWindow::SetUpLD(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc) sl@0: { sl@0: ConstructExtLD(*parent,pos,size); sl@0: Activate(); sl@0: AssignGC(aGc); sl@0: iNumTypeFaces=Client()->iScreen->NumTypefaces(); sl@0: } sl@0: sl@0: void CTextWindow::ResetPrintLine() sl@0: { sl@0: iXpos=iXStartPos=5; sl@0: iYpos=2; sl@0: } sl@0: sl@0: void CTextWindow::PrintDivider() sl@0: { sl@0: iGc->DrawLine(TPoint(0,iYpos+5),TPoint(Size().iWidth,iYpos+5)); sl@0: iYpos+=10; sl@0: } sl@0: sl@0: void CTextWindow::Print(const CFont *aFont, const TDesC &aText) sl@0: { sl@0: iGc->DrawText(aText, TPoint(iXpos, iYpos+aFont->AscentInPixels())); sl@0: iXpos+=aFont->TextWidthInPixels(aText); sl@0: } sl@0: sl@0: void CTextWindow::PrintLine(const CFont *aFont, const TDesC &aText) sl@0: { sl@0: iGc->DrawText(aText, TPoint(iXpos, iYpos+aFont->AscentInPixels())); sl@0: iXpos=iXStartPos; sl@0: iYpos+=aFont->HeightInPixels()+2; sl@0: } sl@0: sl@0: TBool CTextWindow::NextPage() sl@0: { sl@0: if (iTypeFaceIndex==(iNumTypeFaces-1)) sl@0: return(ETrue); sl@0: ++iTypeFaceIndex; sl@0: return(EFalse); sl@0: } sl@0: sl@0: void CTextWindow::PrintStylesL(const TDesC &aText, TFontSpec &aFontSpec, const TFontStyle &aFontStyle) sl@0: { sl@0: aFontSpec.iFontStyle=aFontStyle; sl@0: User::LeaveIfError(Client()->iScreen->GetNearestFontToDesignHeightInTwips((CFont *&)iTmpFont, aFontSpec)); sl@0: iGc->UseFont(iTmpFont); sl@0: Print(iTmpFont,aText); sl@0: iGc->SetUnderlineStyle(EUnderlineOn); sl@0: Print(iTmpFont,_L("Underline, ")); sl@0: iGc->SetStrikethroughStyle(EStrikethroughOn); sl@0: Print(iTmpFont,_L("Strikethrough/underline, ")); sl@0: iGc->SetUnderlineStyle(EUnderlineOff); sl@0: PrintLine(iTmpFont,_L("Strikethrough")); sl@0: iGc->SetStrikethroughStyle(EStrikethroughOff); sl@0: Client()->iScreen->ReleaseFont(iTmpFont); sl@0: iTmpFont=NULL; sl@0: } sl@0: sl@0: void CTextWindow::DrawCharJustified(const TDesC &aText) sl@0: { sl@0: iGc->SetCharJustification(Size().iWidth-10-iTmpFont->TextWidthInPixels(aText),aText.Length()-1); sl@0: PrintLine(iTmpFont, aText); sl@0: } sl@0: sl@0: void CTextWindow::DrawWordJustified(const TDesC &aText) sl@0: { sl@0: TInt count=0; sl@0: for(TInt index=0;indexSetWordJustification(Size().iWidth-10-iTmpFont->TextWidthInPixels(aText),count); sl@0: PrintLine(iTmpFont, aText); sl@0: } sl@0: sl@0: void CTextWindow::Draw() sl@0: //This function is virtual and so cannot have an 'L' at the end of it's name sl@0: { sl@0: iGc->Clear(); sl@0: ResetPrintLine(); sl@0: switch(iDrawMode) sl@0: { sl@0: case EDrawModeWordJust: sl@0: User::LeaveIfError(Client()->iScreen->GetNearestFontToDesignHeightInTwips((CFont *&)iTmpFont, TFontSpec(KTestFontTypefaceName,200))); sl@0: iGc->UseFont(iTmpFont); sl@0: DrawWordJustified(_L("Hello World")); sl@0: DrawWordJustified(_L("One Two Three Four Five Six Seven")); sl@0: DrawWordJustified(_L("AA B CC D")); sl@0: DrawWordJustified(_L("ONEWORD")); sl@0: iGc->DiscardFont(); sl@0: Client()->iScreen->ReleaseFont(iTmpFont); sl@0: iTmpFont=NULL; sl@0: break; sl@0: case EDrawModeCharJust: sl@0: User::LeaveIfError(Client()->iScreen->GetNearestFontToDesignHeightInTwips((CFont *&)iTmpFont, TFontSpec(KTestFontTypefaceName,200))); sl@0: iGc->UseFont(iTmpFont); sl@0: DrawCharJustified(_L("Hello World")); sl@0: DrawCharJustified(_L("One Two Three Four Five Six Seven")); sl@0: DrawCharJustified(_L("AA B CC D")); sl@0: DrawCharJustified(_L("ONEWORD")); sl@0: iGc->DiscardFont(); sl@0: Client()->iScreen->ReleaseFont(iTmpFont); sl@0: iTmpFont=NULL; sl@0: break; sl@0: case EDrawModeFonts: sl@0: { sl@0: TTypefaceSupport typefaceSupport; sl@0: Client()->iScreen->TypefaceSupport(typefaceSupport,iTypeFaceIndex); sl@0: TBuf<0x40> title; sl@0: TBuf16 tmpBuf; sl@0: tmpBuf.Copy(typefaceSupport.iTypeface.iName); sl@0: title.Append(tmpBuf); sl@0: title.AppendFormat(TRefByValue(_L(", Heights (Min=%d, Max=%d, Num=%d)")),typefaceSupport.iMinHeightInTwips,typefaceSupport.iMaxHeightInTwips,typefaceSupport.iNumHeights); sl@0: PrintLine(iFont,title); sl@0: PrintDivider(); sl@0: for (TInt tfHeight=0;tfHeightiScreen->FontHeightInTwips(iTypeFaceIndex,tfHeight)); sl@0: PrintStylesL(_L("Normal, "), fspec, TFontStyle()); sl@0: PrintStylesL(_L("Bold, "), fspec, TFontStyle(EPostureUpright,EStrokeWeightBold,EPrintPosNormal)); sl@0: PrintStylesL(_L("Italic, "), fspec, TFontStyle(EPostureItalic,EStrokeWeightNormal,EPrintPosNormal)); sl@0: PrintStylesL(_L("Bold/italic, "), fspec, TFontStyle(EPostureItalic,EStrokeWeightBold,EPrintPosNormal)); sl@0: if (iYpos>Size().iHeight) sl@0: break; sl@0: } sl@0: } sl@0: break; sl@0: } sl@0: } sl@0: sl@0: void CTextWindow::WinKeyL(const TKeyEvent &aKey,const TTime &) sl@0: { sl@0: if (iDrawMode!=EDrawModeFonts || (aKey.iCode==EKeyEscape || NextPage())) sl@0: CActiveScheduler::Stop(); sl@0: else sl@0: iWin.Invalidate(); sl@0: } sl@0: sl@0: void CTextWindow::SetDrawMode(TInt aDrawMode) sl@0: { sl@0: iDrawMode=aDrawMode; sl@0: iWin.Invalidate(); sl@0: } sl@0: sl@0: TTextTest::TTextTest() : CTestBase(_L("Text")) sl@0: {} sl@0: sl@0: TTextTest::~TTextTest() sl@0: { sl@0: CTWin::Delete(iWin); sl@0: } sl@0: sl@0: void TTextTest::ConstructL() sl@0: { sl@0: CTextWindow *win=new(ELeave) CTextWindow(this); sl@0: win->SetUpLD(TPoint(0,0),Client()->iScreen->SizeInPixels(),Client()->iGroup,*Client()->iGc); sl@0: iWin=win; sl@0: Client()->iGroup->SetCurrentWindow(iWin); sl@0: Client()->iGroup->GroupWin()->SetOrdinalPosition(0); sl@0: } sl@0: sl@0: TestState TTextTest::DoTestL() sl@0: { sl@0: switch(iState) sl@0: { sl@0: case 0: sl@0: LogSubTest(_L("SetWordJustification"),1); sl@0: iWin->SetDrawMode(EDrawModeWordJust); sl@0: CActiveScheduler::Start(); sl@0: iState++; sl@0: break; sl@0: case 1: sl@0: LogSubTest(_L("SetCharJustification"),2); sl@0: iWin->SetDrawMode(EDrawModeCharJust); sl@0: CActiveScheduler::Start(); sl@0: iState++; sl@0: break; sl@0: case 2: sl@0: LogSubTest(_L("Text 1"),3); sl@0: iWin->SetDrawMode(EDrawModeFonts); sl@0: CActiveScheduler::Start(); sl@0: iState++; sl@0: break; sl@0: default: sl@0: return(EFinished); sl@0: } sl@0: return(ENext); sl@0: } sl@0: