windowing/windowserver/test/tlib/TLDIALOG.CPP
changeset 103 2717213c588a
parent 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/test/tlib/TLDIALOG.CPP	Tue Jun 22 15:21:29 2010 +0300
@@ -0,0 +1,463 @@
+// Copyright (c) 1994-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:
+// Base classes used for building window server test code
+// 
+//
+
+#include <e32std.h>
+#include <w32std.h>
+#include <e32svr.h>
+#include <e32def_private.h>
+#include "TLIB.H"
+
+const TInt ButtonGap=20;
+const TInt ButtonBorderGap=10;
+const TInt ButtonBorderMargin=3;
+const TInt TextMargin=5;
+const TInt KAutoDelaySeconds=60; 
+
+NONSHARABLE_CLASS(CTAutoKey): public CActive
+	{
+public:
+	static CTAutoKey* NewL(RWsSession& aWs);
+	~CTAutoKey();
+	void Activate(TInt aDelay);
+	
+	void RunL();
+	void DoCancel();
+	
+private:
+	CTAutoKey(RWsSession& aWs);
+	void ConstructL();	
+	
+	RTimer iTimer;
+	TInt iDelay;
+	RWsSession& iWs;
+	};
+
+EXPORT_C CTDialog::CTDialog() : CTTitledWindow(), iNumButtons(1)
+	{
+	iButton[0].Copy(_L("Continue"));	// Default button
+	}
+
+EXPORT_C CTDialog::~CTDialog()
+	{
+	if (iIsActive)
+		CActiveScheduler::Stop();
+	delete iAutoKey;
+	}
+
+EXPORT_C void CTDialog::ConstructLD(CTWinBase &aParent,CWindowGc &aGc)
+	{
+	iOldFocus=aParent.Group()->CurWin();
+	TRAPD(err,CTTitledWindow::ConstructL(aParent));
+	if (err!=KErrNone)
+		{
+		delete this;
+		User::Leave(err);
+		}
+	iActivated=ETrue;
+	iWin.SetBackgroundColor(TRgb::Gray256(238));	// Light gray
+	AssignGC(aGc);
+	iWin.SetPointerCapture(ETrue);
+	Group()->SetCurrentWindow(this, ETrue);
+	iAutoKey=CTAutoKey::NewL(Client()->iWs);
+	}
+
+EXPORT_C void CTDialog::RelinquishFocus()
+	{
+	Group()->SetCurrentWindow(iOldFocus);
+	}
+
+EXPORT_C TInt CTDialog::Display()
+	{
+	TInt result;
+
+	SetWindowSize();
+	if (iWinActive)
+		BaseWin()->SetVisible(ETrue);
+	else
+		{
+		Activate();
+		iWinActive=ETrue;
+		}
+	if (iTakeFocus)
+		Group()->SetCurrentWindow(this);
+	Group()->GroupWin()->SetOrdinalPosition(0);
+	iResultPtr=&result;
+	CTClient *client=Client();
+	if (client->QueueRead())
+		{
+		client->iWs.Flush();
+		client=NULL;
+		}
+	iIsActive=ETrue;
+	iAutoKey->Activate(KAutoDelaySeconds);
+	CActiveScheduler::Start();
+	if (client)
+		client->CancelRead();
+	return(result);
+	}
+
+EXPORT_C void CTDialog::SetFlags(TUint aFlags)
+	{
+	iFlags=aFlags;
+	}
+
+void CTDialog::SetMaxWid(TInt &aMax, TInt aWid)
+	{
+	if (aWid>aMax)
+		aMax=aWid;
+	}
+
+EXPORT_C void CTDialog::SetWindowSize()
+	{
+	if (iActivated)
+		{
+		TInt max=0;
+		SetMaxWid(max,iFont->TextWidthInPixels(iTitle));
+		SetMaxWid(max,iFont->TextWidthInPixels(iLine1));
+		SetMaxWid(max,iFont->TextWidthInPixels(iLine2));
+		max+=TextMargin*2;
+		iButWid=0;
+		if (iNumButtons>0)
+			{
+			for(TInt index=0;index<iNumButtons;index++)
+				SetMaxWid(iButWid,iFont->TextWidthInPixels(iButton[index]));
+			iButWid+=ButtonBorderMargin*2;
+			SetMaxWid(max,iButWid*iNumButtons+ButtonGap*(iNumButtons-1)+ButtonBorderGap*2);
+			}
+		TSize parSize=Parent()->Size();
+		TSize size(max,iFont->HeightInPixels()*8);
+		TPoint pos((parSize.iWidth-size.iWidth)/2,(parSize.iHeight-size.iHeight)/2);
+		if (iFlags&EDialogDisplayAtBottom)
+			pos.iY*=2;
+		if (iFlags&EDialogDisplayAtLeft)
+			pos.iX=0;
+		SetExt(pos,size);
+		Invalidate();
+		}
+	}
+
+EXPORT_C void CTDialog::SetLine1(const TDesC &aLine1)
+	{
+	iLine1.Copy(aLine1);
+	}
+
+EXPORT_C void CTDialog::SetLine2(const TDesC &aLine2)
+	{
+	iLine2.Copy(aLine2);
+	}
+
+EXPORT_C void CTDialog::SetNumButtons(TInt aNum)
+	{
+	if ((TUint)aNum>3)
+		TbPanic(EDialogButtonCount);
+	iNumButtons=aNum;
+	}
+
+EXPORT_C void CTDialog::SetButtonText(TInt aNum,const TDesC &aButton)
+	{
+	if ((TUint)aNum>(TUint)iNumButtons)
+		TbPanic(EDialogButtonIndex);
+	iButton[aNum].Copy(aButton);
+	}
+
+TRect CTDialog::ButtonRect(TInt aIndex) const
+	{
+	TInt chunk=(iSize.iWidth-ButtonBorderMargin*2)/iNumButtons;
+	TInt midPos=ButtonBorderMargin+chunk*aIndex+chunk/2;
+	return(TRect(midPos-iButWid/2,iFont->HeightInPixels()*6,midPos+iButWid/2,iFont->HeightInPixels()*7+ButtonBorderMargin*2));
+	}
+
+EXPORT_C void CTDialog::Draw()
+	{
+	CTTitledWindow::Draw();
+	iGc->SetPenColor(TRgb::Gray16(0));
+	iGc->DrawText(iLine1, TPoint((iSize.iWidth-iFont->TextWidthInPixels(iLine1))/2,iFont->HeightInPixels()*3));
+	iGc->DrawText(iLine2, TPoint((iSize.iWidth-iFont->TextWidthInPixels(iLine2))/2,iFont->HeightInPixels()*4+2));
+	if (iNumButtons!=0)
+		{
+		for(TInt index=0;index<iNumButtons;index++)
+			{
+			TRect rect=ButtonRect(index);
+			iGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
+			iGc->SetBrushColor(TRgb::Gray256(255));
+			iGc->DrawRect(rect);
+			iGc->DrawRect(rect);
+			iGc->SetBrushStyle(CGraphicsContext::ENullBrush);
+			TInt midPos=(rect.iTl.iX+rect.iBr.iX)/2;
+			iGc->DrawText(iButton[index], TPoint((midPos-iFont->TextWidthInPixels(iButton[index])/2),
+									iFont->HeightInPixels()*6+iFont->AscentInPixels()+ButtonBorderMargin));
+			}
+		}
+	}
+
+EXPORT_C void CTDialog::WinKeyL(const TKeyEvent &aKey,const TTime&)
+	{
+	switch(aKey.iCode)
+		{
+		case EKeyEscape:
+		case '0':
+			ButtonPressL(0);
+			break;
+		case EKeyEnter:
+		case '1':
+			ButtonPressL(iNumButtons>1 ? 1 : 0);	// Same as ESC on a single button dialog
+			break;
+		case ' ':
+		case '2':
+			ButtonPressL(2);
+			break;
+		}
+	}
+
+EXPORT_C void CTDialog::PointerL(const TPointerEvent &aPointer,const TTime &aTime)
+	{
+	if (aPointer.iType==TPointerEvent::EButton1Up)
+		{
+		if (iButtonClickOn>0)
+			{
+			ButtonPressL(iButtonClickOn-1);
+			return;
+			}
+		}
+	else if (aPointer.iType==TPointerEvent::EButton1Down)
+		{
+		for(TInt index=0;index<iNumButtons;index++)
+			if (ButtonRect(index).Contains(aPointer.iPosition))
+				{
+				if (iFlags&EDialogWaitForButtonUp)
+					iButtonClickOn=index+1;
+				else
+					{
+					ButtonPressL(index);
+					return;
+					}
+				}
+		}
+	CTTitledWindow::PointerL(aPointer, aTime);
+	}
+
+EXPORT_C void CTDialog::ButtonPressL(TInt aButton)
+	{
+	if (aButton<iNumButtons)
+		{
+		SetResult(aButton);
+		CTTitledWindow::Delete(this);
+		}
+	}
+
+void CTDialog::SetResult(TInt aButton)
+	{
+	if (iResultPtr)
+		*iResultPtr=aButton;
+	}
+
+// Simple display dialog //
+
+class CDisplayDialog : public CTDialog
+	{		  
+public:
+	CDisplayDialog(CTWindowGroup *aGroupWin,CWindowGc *aGc);
+	void ConstructLD();
+private:
+	CTWindowGroup *iGroupWin;
+	CWindowGc *iGc;
+	};
+
+CDisplayDialog::CDisplayDialog(CTWindowGroup *aGroupWin,CWindowGc *aGc) : CTDialog(),
+	iGroupWin(aGroupWin),
+	iGc(aGc)
+	{
+	}
+
+void CDisplayDialog::ConstructLD()
+	{
+	CTDialog::ConstructLD(*iGroupWin, *iGc);
+	}
+
+EXPORT_C void DisplayDialog(CTClient *aClient, const TWindowTitle &aTitle, const TDesC &aLine1, const TDesC &aLine2)
+	{
+	CDisplayDialog *dialog=NULL;
+	dialog=new(ELeave) CDisplayDialog(aClient->iGroup, aClient->iGc);
+	TRAPD(err,dialog->ConstructLD());
+	if (err==KErrNone)
+		{
+		dialog->SetTitle(aTitle);
+		dialog->SetLine1(aLine1);
+		dialog->SetLine2(aLine2);
+		dialog->SetNumButtons(1);
+		dialog->SetButtonText(0,_L("Okay"));
+		if (dialog->Display()!=0)		// delete dialog
+			TbPanic(EDialogDisplay);
+		}
+	}
+
+void doDisplayDialog(TInt aScreenNumber,const TWindowTitle &aTitle, const TDesC &aLine1, const TDesC &aLine2, CTClient *&aClient, const RWindowGroup *aGroup)
+	{
+	aClient=new(ELeave) CTClient();
+	aClient->SetScreenNumber(aScreenNumber);
+	aClient->ConstructL();
+//
+	aClient->iGroup=new(ELeave) CTWindowGroup(aClient);
+	aClient->iGroup->ConstructL();
+	aClient->iGroup->GroupWin()->SetOrdinalPosition(0,10);
+	if (aGroup)
+		aClient->iGroup->GroupWin()->SetOwningWindowGroup(aGroup->Identifier());
+//
+	TRAP_IGNORE(DisplayDialog(aClient, aTitle, aLine1, aLine2));
+	}
+
+void doDisplayDialog(const TWindowTitle &aTitle, const TDesC &aLine1, const TDesC &aLine2, CTClient *&aClient, const RWindowGroup *aGroup)
+	{
+	doDisplayDialog(KDefaultScreen,aTitle,aLine1,aLine2,aClient,aGroup);
+	}
+
+EXPORT_C void DisplayDialog(TInt aScreenNumber,const TWindowTitle &aTitle, const TDesC &aLine1, const TDesC &aLine2, const RWindowGroup *aGroup)
+	{
+	CTClient *client=NULL;
+	TRAP_IGNORE(doDisplayDialog(aScreenNumber,aTitle,aLine1,aLine2,client,aGroup));
+	delete client;
+	}
+
+EXPORT_C void DisplayDialog(const TWindowTitle &aTitle, const TDesC &aLine1, const TDesC &aLine2, const RWindowGroup *aGroup)
+	{
+	DisplayDialog(KDefaultScreen,aTitle,aLine1,aLine2,aGroup);
+	}
+
+
+
+//CInfoDialog
+
+EXPORT_C CInfoDialog::CInfoDialog(CTWindowGroup *aGroupWin,CWindowGc *aGc) :CTDialog(), iGroupWin(aGroupWin), iGc(aGc)
+	{}
+
+EXPORT_C void CInfoDialog::ButtonPressL(TInt aButton)
+	{
+	if (aButton==0)
+		{
+		SetResult(0);
+		BaseWin()->SetVisible(EFalse);
+		CActiveScheduler::Stop();
+		}
+	}
+
+EXPORT_C void CInfoDialog::ConstructLD()
+	{
+	_LIT(OK,"Okay");
+	CTDialog::ConstructLD(*iGroupWin, *iGc);
+	SetNumButtons(1);
+	SetButtonText(0,OK);
+	SetTakeFocus();
+	}
+
+EXPORT_C void CInfoDialog::TimerResults()
+	{
+	TProfile profile[eTimes];
+	// TProfile only has default constructor -
+	// constructor of TProfile does not initialize its members
+	for (TInt jj=0; jj<eTimes; jj++)
+		{
+		profile[jj].iTime=0;
+		profile[jj].iCount=0;
+		}
+	__PROFILE_DISPLAY(eTimes)
+	TBuf<64> times;
+	TBuf<32> counts;
+	TInt ii=1;
+	FOREVER
+		{
+		AppendProfileTime(times,profile[ii].iTime);
+		AppendProfileCount(counts,profile[ii].iCount);
+		if (++ii==eTimes)
+			break;
+		AddComma(times);
+		AddComma(counts);
+		}
+	SetLine1(times);
+	SetLine2(counts);
+	times.Zero();
+	AppendProfileTime(times,profile[0].iTime);
+	SetTitle(times);
+	}
+
+void CInfoDialog::AppendProfileTime(TDes &aDes, TInt aNum)
+	{
+	_LIT(ThreeDP,"%d.%03d");
+	aDes.AppendFormat(ThreeDP,aNum/eSeconds,(aNum%eSeconds)/1000);
+	}
+
+void CInfoDialog::AppendProfileCount(TDes &aDes, TInt aNum)
+	{
+	_LIT(Int,"%d");
+	aDes.AppendFormat(Int,aNum);
+	}
+
+void CInfoDialog::AddComma(TDes &aDes)
+	{
+	_LIT(Comma,", ");
+	aDes.Append(Comma);
+	}
+
+CTAutoKey::CTAutoKey(RWsSession& aWs): CActive(0), iWs(aWs)
+	{
+	CActiveScheduler::Add(this);
+	}
+	
+CTAutoKey::~CTAutoKey()
+	{
+	Cancel();
+	iTimer.Close();
+	}
+	
+void CTAutoKey::ConstructL()
+	{
+	User::LeaveIfError(iTimer.CreateLocal());
+	}
+	
+CTAutoKey* CTAutoKey::NewL(RWsSession& aWs)
+	{
+	CTAutoKey* self=new(ELeave) CTAutoKey(aWs);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop();
+	return self;
+	}
+	
+void CTAutoKey::Activate(TInt aDelay)
+	{
+	if (IsActive())
+		Cancel();
+	
+	iDelay=aDelay*1000000;
+	iTimer.After(iStatus,iDelay);
+	SetActive();
+	}
+void CTAutoKey::RunL()
+	{
+	// simulate key event, only needed to run once
+	TKeyEvent keyEvent;
+	keyEvent.iCode=EKeyEnter;
+	keyEvent.iScanCode=EKeyEnter;
+	keyEvent.iModifiers=0;
+	keyEvent.iRepeats=0;
+	iWs.SimulateKeyEvent(keyEvent);
+	iWs.Flush();
+	}
+	
+void CTAutoKey::DoCancel()
+	{
+	iTimer.Cancel();
+	}