diff -r 000000000000 -r 5d03bc08d59c windowing/windowserver/tlib/TLDIALOG.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/windowing/windowserver/tlib/TLDIALOG.CPP Tue Feb 02 01:47:50 2010 +0200 @@ -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 +#include +#include +#include +#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;indexTextWidthInPixels(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;indexSetBrushStyle(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;indexiGroup, 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 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(); + }