sl@0: // Copyright (c) 1996-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: // Test pointer event handling 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 CTPointerTest; sl@0: class CGrabWindow; sl@0: sl@0: class CPointerWindow : public CTWin sl@0: { sl@0: enum {KRepeatMargin=200000}; // 0.2 Seconds sl@0: enum {KRepeatCount=4}; sl@0: enum {KRepeatIntervalIncrements=100000}; sl@0: enum {KRepeatRectXExtra=50}; sl@0: enum {KRepeatRectYExtra=50}; sl@0: enum {KStateWaitingForTest1,KStateFailed,KStateTesting1, sl@0: KStateWaitingForTest2,KStateTesting2, sl@0: KStateWaitingForTest3,KStateTesting3, sl@0: KStateWaitingForTest4,KStateTesting4, sl@0: KStateWaitingForTest5,KStateTesting5, sl@0: KStateWaitingForTest6,KStateTesting6, sl@0: KStateWaitingForTest8,KStateTesting8, sl@0: KStateWaitingForTest7,KStateTesting7, sl@0: KStateFinished}; sl@0: public: sl@0: CPointerWindow(CTPointerTest *aTest); sl@0: void SetUpLD(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc); sl@0: void Draw(); sl@0: void StartNextRepeatTest(); sl@0: void QueueNextRepeat(); sl@0: void PointerL(const TPointerEvent &aPointer,const TTime&); sl@0: void WinKeyL(const TKeyEvent &aKey,const TTime &aTime); sl@0: private: sl@0: void SwitchOn(const TTime &); sl@0: void ResetTest(TInt aState); sl@0: void SetState(TInt aState); sl@0: void FinishedTests(); sl@0: void TestFailed(); sl@0: private: sl@0: CTPointerTest *iTest; sl@0: TInt iRepeatCount; sl@0: TInt iState; sl@0: TTimeIntervalMicroSeconds32 iInterval; sl@0: TTime iPrevTime; sl@0: TRect iRepeatRect; sl@0: }; sl@0: sl@0: class CGrabWindow2 : public CTWin sl@0: { sl@0: public: sl@0: CGrabWindow2(CGrabWindow *aWindow); sl@0: void SetUpLD(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc); sl@0: private: sl@0: void Draw(); sl@0: void PointerL(const TPointerEvent &aPointer,const TTime&); sl@0: private: sl@0: CGrabWindow *iGrabWindow; sl@0: }; sl@0: sl@0: class CGrabWindow : public CTWin sl@0: { sl@0: enum {KGrabStateWaitingForDown,KGrabStateWaitingForDragOut,KGrabStateWaitingForUp,KGrabStateFinished, sl@0: KGrabStateWaitingForDown2,KGrabStateWaitingForUp2a,KGrabStateWaitingForDrag2,KGrabStateWaitingForUp2b, sl@0: KGrabStateWaitingForDown3,KGrabStateWaitingForUp3a,KGrabStateWaitingForUp3b, sl@0: KGrabStateWaitingForDown4,KGrabStateWaitingForUp4, sl@0: KGrabStateWaitingForDown5,KGrabStateWaitingForUp5,KGrabStateWaitingForDrag5, sl@0: KStateFailed}; sl@0: public: sl@0: CGrabWindow(CTPointerTest *aTest); sl@0: void Pointer2(const TPointerEvent &aPointer); sl@0: void SetUpLD(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc); sl@0: void WinKeyL(const TKeyEvent &aKey,const TTime &aTime); sl@0: private: sl@0: void Draw(); sl@0: void SetState(TInt aState); sl@0: void ResetTest(); sl@0: void PointerL(const TPointerEvent &aPointer,const TTime&); sl@0: void TestFailed(); sl@0: void FinishedTests(); sl@0: private: sl@0: TInt iState; sl@0: CTPointerTest *iTest; sl@0: }; sl@0: sl@0: class CTPointerTest : public CTestBase sl@0: { sl@0: public: sl@0: CTPointerTest(); sl@0: ~CTPointerTest(); sl@0: TBool TestFailed(); sl@0: TestState DoTestL(); sl@0: void StartGrabTestL(); sl@0: void ConstructL(); sl@0: CGrabWindow2 *GrabWin2() const; sl@0: inline TBool Digitiser() const {return !iNoDigitiser;} sl@0: private: sl@0: TInt doTestFailedL(); sl@0: private: sl@0: CPointerWindow *iRepeatWin; sl@0: CGrabWindow *iGrabWin; sl@0: CGrabWindow2 *iGrabWin2; sl@0: TSize iWinSize; sl@0: TInt iState; sl@0: TBool iOldPointerState; sl@0: TBool iNoDigitiser; sl@0: }; sl@0: sl@0: GLDEF_C CTestBase *CreatePointerTest() sl@0: { sl@0: return(new(ELeave) CTPointerTest()); sl@0: } sl@0: sl@0: CPointerWindow::CPointerWindow(CTPointerTest *aTest) : CTWin(), iTest(aTest) sl@0: {} sl@0: sl@0: void CPointerWindow::SetState(TInt aState) sl@0: { sl@0: iState=aState; sl@0: iWin.Invalidate(); sl@0: switch(aState) sl@0: { sl@0: case KStateWaitingForTest1: sl@0: case KStateWaitingForTest2: sl@0: case KStateWaitingForTest3: sl@0: case KStateWaitingForTest4: sl@0: case KStateWaitingForTest5: sl@0: case KStateWaitingForTest6: sl@0: case KStateWaitingForTest8: sl@0: case KStateWaitingForTest7: sl@0: iRepeatRect=TRect(); sl@0: break; sl@0: case KStateTesting8: sl@0: iWin.Close(); sl@0: Client()->iWs.Flush(); sl@0: User::After(500000); sl@0: FinishedTests(); sl@0: break; sl@0: } sl@0: } sl@0: sl@0: void CPointerWindow::ResetTest(TInt aState) sl@0: { sl@0: TInt newState=KStateFinished; sl@0: switch(aState) sl@0: { sl@0: case KStateTesting1: sl@0: newState=KStateWaitingForTest1; sl@0: break; sl@0: case KStateTesting2: sl@0: newState=KStateWaitingForTest2; sl@0: break; sl@0: case KStateTesting3: sl@0: newState=KStateWaitingForTest3; sl@0: break; sl@0: case KStateTesting4: sl@0: newState=KStateWaitingForTest4; sl@0: break; sl@0: case KStateTesting5: sl@0: newState=KStateWaitingForTest5; sl@0: break; sl@0: case KStateTesting6: sl@0: newState=KStateWaitingForTest6; sl@0: break; sl@0: case KStateTesting8: sl@0: newState=KStateWaitingForTest8; sl@0: break; sl@0: case KStateTesting7: sl@0: newState=KStateWaitingForTest7; sl@0: break; sl@0: } sl@0: SetState(newState); sl@0: } sl@0: sl@0: void CPointerWindow::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: //SetState(KStateWaitingForTest1); sl@0: SetState(KStateWaitingForTest7); //Only unconverted test sl@0: BaseWin()->EnableOnEvents(); sl@0: } sl@0: sl@0: void CPointerWindow::Draw() sl@0: { sl@0: iGc->Clear(); sl@0: iGc->DrawRect(Size()); sl@0: iGc->DrawRect(iRepeatRect); sl@0: TBuf<0x80> buf; sl@0: TBuf<0x80> buf2; sl@0: switch(iState) sl@0: { sl@0: case KStateWaitingForTest1: sl@0: buf.Format(_L("Click anywhere in the window and hold the pointer steady")); sl@0: break; sl@0: case KStateTesting1: sl@0: buf.Format(_L("Hold pointer inside the box")); sl@0: break; sl@0: case KStateWaitingForTest2: sl@0: buf.Format(_L("Release the pointer then click in the window and hold the pointer steady")); sl@0: break; sl@0: case KStateTesting2: sl@0: buf.Format(_L("Drag the pointer outside the box")); sl@0: break; sl@0: case KStateWaitingForTest3: sl@0: buf.Format(_L("Release the pointer then click in the window and hold the pointer steady")); sl@0: break; sl@0: case KStateTesting3: sl@0: buf.Format(_L("Release the pointer")); sl@0: break; sl@0: case KStateWaitingForTest4: sl@0: buf.Format(_L("Click anywhere in the window and move the pointer slightly")); sl@0: break; sl@0: case KStateTesting4: sl@0: buf.Format(_L("Release the pointer")); sl@0: break; sl@0: case KStateWaitingForTest5: sl@0: buf.Format(_L("Click anywhere in the window and move the pointer slightly")); sl@0: break; sl@0: case KStateTesting5: sl@0: buf.Format(_L("Release the pointer")); sl@0: break; sl@0: case KStateWaitingForTest6: sl@0: buf.Format(_L("Click anywhere in the window")); sl@0: break; sl@0: case KStateTesting6: sl@0: buf.Format(_L("Move the pointer")); sl@0: break; sl@0: case KStateWaitingForTest8: sl@0: buf.Format(_L("Click anywhere in the window, and keep the pointer pressed")); sl@0: break; sl@0: case KStateTesting8: sl@0: buf.Format(_L("")); sl@0: break; sl@0: case KStateWaitingForTest7: sl@0: buf.Format(_L("Switch off and touch the center of the screen")); sl@0: break; sl@0: case KStateTesting7: sl@0: buf.Format(_L("")); sl@0: break; sl@0: } sl@0: switch(iState) sl@0: { sl@0: case KStateTesting1: sl@0: buf2.Format(TRefByValue(_L("Repeat (%d/%d), interval=%d.%d")),iRepeatCount,KRepeatCount,iInterval.Int()/1000000,(iInterval.Int()%1000000)/100000); sl@0: break; sl@0: case KStateTesting2: sl@0: case KStateTesting3: sl@0: buf2.Format(TRefByValue(_L("Repeat (%d), interval=%d.%d")),iRepeatCount,iInterval.Int()/1000000,(iInterval.Int()%1000000)/100000); sl@0: break; sl@0: } sl@0: iGc->DrawText(buf,TPoint(10,20)); sl@0: iGc->DrawText(buf2,TPoint(10,40)); sl@0: } sl@0: sl@0: void CPointerWindow::FinishedTests() sl@0: { sl@0: iState=KStateFinished; sl@0: iTest->Request(); sl@0: } sl@0: sl@0: void CPointerWindow::StartNextRepeatTest() sl@0: { sl@0: iInterval=0; sl@0: iRepeatCount=0; sl@0: if (iState==KStateWaitingForTest4) sl@0: User::After(TTimeIntervalMicroSeconds32(1000000)); sl@0: else if (iState==KStateWaitingForTest5) sl@0: User::After(TTimeIntervalMicroSeconds32(1000000)); sl@0: QueueNextRepeat(); sl@0: switch(iState) sl@0: { sl@0: case KStateWaitingForTest1: sl@0: SetState(KStateTesting1); sl@0: break; sl@0: case KStateWaitingForTest2: sl@0: SetState(KStateTesting2); sl@0: break; sl@0: case KStateWaitingForTest3: sl@0: SetState(KStateTesting3); sl@0: break; sl@0: case KStateWaitingForTest4: sl@0: SetState(KStateTesting4); sl@0: break; sl@0: case KStateWaitingForTest5: sl@0: SetState(KStateTesting5); sl@0: break; sl@0: case KStateWaitingForTest6: sl@0: SetState(KStateTesting6); sl@0: break; sl@0: case KStateWaitingForTest8: sl@0: SetState(KStateTesting8); sl@0: break; sl@0: case KStateWaitingForTest7: sl@0: SetState(KStateTesting7); sl@0: break; sl@0: } sl@0: } sl@0: sl@0: void CPointerWindow::QueueNextRepeat() sl@0: { sl@0: iInterval=iInterval.Int()+KRepeatIntervalIncrements; sl@0: iWin.RequestPointerRepeatEvent(TTimeIntervalMicroSeconds32(iInterval),TRect(iRepeatRect)); sl@0: iPrevTime.HomeTime(); sl@0: iWin.Invalidate(); sl@0: } sl@0: sl@0: void CPointerWindow::PointerL(const TPointerEvent &aPointer,const TTime &aTime) sl@0: { sl@0: if (aPointer.iType==TPointerEvent::EButtonRepeat) sl@0: { sl@0: if (iState!=KStateTesting1 && iState!=KStateTesting2 && iState!=KStateTesting3 && iState!=KStateTesting4) sl@0: TestFailed(); sl@0: else sl@0: { sl@0: TTimeIntervalMicroSeconds32 interval(I64LOW(aTime.MicroSecondsFrom(iPrevTime).Int64())); sl@0: if (interval.Int()<(iInterval.Int()-KRepeatMargin) || interval.Int()>(iInterval.Int()+KRepeatMargin)) sl@0: TestFailed(); sl@0: else sl@0: { sl@0: if (!iRepeatRect.Contains(aPointer.iPosition) || sl@0: aPointer.iParentPosition!=(aPointer.iPosition+iWin.InquireOffset(*Parent()->WinTreeNode()))) sl@0: TestFailed(); sl@0: else sl@0: { sl@0: iRepeatCount++; sl@0: if (iState==KStateTesting1 && iRepeatCount==KRepeatCount) sl@0: { sl@0: QueueNextRepeat(); sl@0: Client()->iWs.Flush(); sl@0: User::After(TTimeIntervalMicroSeconds32(iRepeatCount*KRepeatIntervalIncrements)); sl@0: iWin.CancelPointerRepeatEventRequest(); sl@0: SetState(KStateWaitingForTest2); sl@0: } sl@0: else sl@0: QueueNextRepeat(); sl@0: } sl@0: } sl@0: } sl@0: } sl@0: else switch(iState) sl@0: { sl@0: case KStateWaitingForTest1: sl@0: case KStateWaitingForTest2: sl@0: case KStateWaitingForTest3: sl@0: case KStateWaitingForTest4: sl@0: case KStateWaitingForTest8: sl@0: if (aPointer.iType==TPointerEvent::EButton1Down) sl@0: { sl@0: iRepeatRect.iTl=aPointer.iPosition-TPoint(KRepeatRectXExtra,KRepeatRectYExtra); sl@0: iRepeatRect.iBr=aPointer.iPosition+TPoint(KRepeatRectXExtra,KRepeatRectYExtra); sl@0: StartNextRepeatTest(); sl@0: } sl@0: break; sl@0: case KStateWaitingForTest5: sl@0: if (aPointer.iType==TPointerEvent::EButton1Down) sl@0: { sl@0: iRepeatRect.iTl=aPointer.iPosition; sl@0: iRepeatRect.iBr=aPointer.iPosition+TPoint(1,1); sl@0: StartNextRepeatTest(); sl@0: } sl@0: break; sl@0: case KStateWaitingForTest6: sl@0: if (aPointer.iType==TPointerEvent::EButton1Down) sl@0: { sl@0: iRepeatRect.iTl=aPointer.iPosition+TPoint(KRepeatRectXExtra,KRepeatRectYExtra); sl@0: iRepeatRect.iBr=aPointer.iPosition+TPoint(2*KRepeatRectXExtra,2*KRepeatRectYExtra); sl@0: StartNextRepeatTest(); sl@0: } sl@0: break; sl@0: case KStateTesting1: sl@0: TestFailed(); sl@0: break; sl@0: case KStateTesting2: sl@0: if (aPointer.iType==TPointerEvent::EDrag) sl@0: SetState(KStateWaitingForTest3); sl@0: else sl@0: TestFailed(); sl@0: break; sl@0: case KStateTesting3: sl@0: if (aPointer.iType==TPointerEvent::EButton1Up) sl@0: SetState(KStateWaitingForTest4); sl@0: else sl@0: TestFailed(); sl@0: break; sl@0: case KStateTesting4: sl@0: if (aPointer.iType==TPointerEvent::EButton1Up) sl@0: SetState(KStateWaitingForTest5); sl@0: else sl@0: TestFailed(); sl@0: break; sl@0: case KStateTesting5: sl@0: if (aPointer.iType==TPointerEvent::EButton1Up) sl@0: SetState(KStateWaitingForTest6); sl@0: else if (aPointer.iType!=TPointerEvent::EDrag) sl@0: TestFailed(); sl@0: break; sl@0: case KStateTesting6: sl@0: if (aPointer.iType==TPointerEvent::EDrag) sl@0: { sl@0: #if !defined(__WINS__) // Can't emulate touching dig when switched off under WINS sl@0: if (iTest->Digitiser()) sl@0: SetState(KStateWaitingForTest7); sl@0: else sl@0: #endif sl@0: SetState(KStateWaitingForTest8); sl@0: } sl@0: else sl@0: TestFailed(); sl@0: break; sl@0: case KStateWaitingForTest7: sl@0: if (aPointer.iType==TPointerEvent::EButton1Down || aPointer.iType==TPointerEvent::ESwitchOn) sl@0: TestFailed(); sl@0: break; sl@0: case KStateTesting7: sl@0: if (aPointer.iType!=TPointerEvent::ESwitchOn) sl@0: TestFailed(); sl@0: else sl@0: SetState(KStateTesting8); //Jump straight to end as this is only unconverted test. sl@0: //SetState(KStateWaitingForTest8); sl@0: break; sl@0: case KStateTesting8: sl@0: break; sl@0: } sl@0: } sl@0: sl@0: void CPointerWindow::TestFailed() sl@0: { sl@0: if (iState!=KStateFailed) sl@0: { sl@0: TInt oldState=iState; sl@0: iState=KStateFailed; sl@0: if (iTest->TestFailed()) sl@0: ResetTest(oldState); sl@0: } sl@0: } sl@0: sl@0: void CPointerWindow::WinKeyL(const TKeyEvent &aKey,const TTime &) sl@0: { sl@0: if (aKey.iCode==EKeyEscape) sl@0: FinishedTests(); // Simply skip this test if the Escape key is pressed sl@0: } sl@0: sl@0: void CPointerWindow::SwitchOn(const TTime &) sl@0: { sl@0: if (iState==KStateWaitingForTest7) sl@0: SetState(KStateTesting7); sl@0: else sl@0: TestFailed(); sl@0: } sl@0: sl@0: // sl@0: // CGrabWindow // sl@0: // sl@0: sl@0: CGrabWindow::CGrabWindow(CTPointerTest *aTest) : iTest(aTest) sl@0: { sl@0: } sl@0: sl@0: void CGrabWindow::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: SetState(KGrabStateWaitingForDown); sl@0: } sl@0: sl@0: void CGrabWindow::Draw() sl@0: { sl@0: iGc->Clear(); sl@0: iGc->DrawRect(Size()); sl@0: TBuf<0x80> buf; sl@0: switch(iState) sl@0: { sl@0: case KGrabStateWaitingForDown: sl@0: case KGrabStateWaitingForDown2: sl@0: case KGrabStateWaitingForDown5: sl@0: buf.Copy(_L("Press the pointer inside the window")); sl@0: break; sl@0: case KGrabStateWaitingForDown3: sl@0: case KGrabStateWaitingForUp3a: sl@0: buf.Copy(_L("Press and release the pointer inside the window")); sl@0: break; sl@0: case KGrabStateWaitingForDragOut: sl@0: buf.Copy(_L("Drag the pointer outside into the outside window")); sl@0: break; sl@0: case KGrabStateWaitingForDrag2: sl@0: buf.Copy(_L("Drag the pointer outside outside both windows")); sl@0: break; sl@0: case KGrabStateWaitingForUp: sl@0: case KGrabStateWaitingForUp2b: sl@0: case KGrabStateWaitingForUp5: sl@0: buf.Copy(_L("Release the pointer")); sl@0: break; sl@0: case KGrabStateWaitingForDown4: sl@0: buf.Copy(_L("Press then release the pointer")); sl@0: break; sl@0: default:; sl@0: } sl@0: iGc->DrawText(buf,TPoint(10,20)); sl@0: } sl@0: sl@0: void CGrabWindow::PointerL(const TPointerEvent &aPointer,const TTime&) sl@0: { sl@0: switch(iState) sl@0: { sl@0: case KGrabStateWaitingForDown: sl@0: if (aPointer.iType==TPointerEvent::EButton1Down) sl@0: SetState(KGrabStateWaitingForDragOut); sl@0: break; sl@0: case KGrabStateWaitingForDragOut: sl@0: if (aPointer.iType!=TPointerEvent::EDrag) sl@0: TestFailed(); sl@0: else sl@0: { sl@0: if (!TRect(Size()).Contains(aPointer.iPosition)) sl@0: SetState(KGrabStateWaitingForUp); sl@0: } sl@0: break; sl@0: case KGrabStateWaitingForUp: sl@0: if (aPointer.iType==TPointerEvent::EDrag) sl@0: break; sl@0: if (aPointer.iType==TPointerEvent::EButton1Up) sl@0: SetState(KGrabStateWaitingForDown2); sl@0: else sl@0: TestFailed(); sl@0: break; sl@0: case KGrabStateWaitingForDown2: sl@0: if (aPointer.iType!=TPointerEvent::EButton1Down) sl@0: TestFailed(); sl@0: else sl@0: { sl@0: iTest->GrabWin2()->BaseWin()->ClaimPointerGrab(); sl@0: iTest->GrabWin2()->BaseWin()->ClaimPointerGrab(); // Call twice to check it's harmless sl@0: SetState(KGrabStateWaitingForUp2a); sl@0: } sl@0: break; sl@0: case KGrabStateWaitingForUp2a: sl@0: SetState(KGrabStateWaitingForDrag2); sl@0: break; sl@0: case KGrabStateWaitingForDrag2: sl@0: break; sl@0: case KGrabStateWaitingForUp2b: sl@0: TestFailed(); sl@0: break; sl@0: case KGrabStateWaitingForDown3: sl@0: if (aPointer.iType!=TPointerEvent::EButton1Down) sl@0: TestFailed(); sl@0: else sl@0: SetState(KGrabStateWaitingForUp3a); sl@0: break; sl@0: case KGrabStateWaitingForUp3a: sl@0: if (aPointer.iType==TPointerEvent::EButton1Up) sl@0: { sl@0: iTest->GrabWin2()->BaseWin()->ClaimPointerGrab(); sl@0: SetState(KGrabStateWaitingForUp3b); sl@0: } sl@0: break; sl@0: case KGrabStateWaitingForUp3b: sl@0: TestFailed(); sl@0: break; sl@0: case KGrabStateWaitingForDown5: sl@0: if (aPointer.iType!=TPointerEvent::EButton1Down) sl@0: TestFailed(); sl@0: else sl@0: { sl@0: iTest->GrabWin2()->BaseWin()->ClaimPointerGrab(EFalse); sl@0: SetState(KGrabStateWaitingForDrag5); sl@0: } sl@0: break; sl@0: case KGrabStateWaitingForDrag5: sl@0: if (aPointer.iType==TPointerEvent::EButton1Up) sl@0: TestFailed(); sl@0: break; sl@0: case KGrabStateWaitingForUp5: sl@0: TestFailed(); sl@0: break; sl@0: case KGrabStateWaitingForDown4: sl@0: SetState(KGrabStateWaitingForUp4); sl@0: iWin.Close(); // Close the window with the grab captured in it sl@0: break; sl@0: case KGrabStateFinished: sl@0: break; sl@0: } sl@0: } sl@0: sl@0: void CGrabWindow::ResetTest() sl@0: { sl@0: SetState(KGrabStateWaitingForDown); sl@0: } sl@0: sl@0: void CGrabWindow::Pointer2(const TPointerEvent &aPointer) sl@0: { sl@0: switch(iState) sl@0: { sl@0: case KGrabStateWaitingForDrag2: sl@0: { sl@0: if (aPointer.iType==TPointerEvent::EDrag) sl@0: { sl@0: SetState(KGrabStateWaitingForUp2b); sl@0: } sl@0: else sl@0: { sl@0: if (iTest->TestFailed()) sl@0: ResetTest(); sl@0: } sl@0: break; sl@0: } sl@0: case KGrabStateWaitingForUp2b: sl@0: if (aPointer.iType==TPointerEvent::EDrag) // Harmless sl@0: break; sl@0: if (aPointer.iType==TPointerEvent::EButton1Up) sl@0: SetState(KGrabStateWaitingForDown3); sl@0: else sl@0: TestFailed(); sl@0: break; sl@0: case KGrabStateWaitingForUp3b: sl@0: if (aPointer.iType==TPointerEvent::EButton1Up) sl@0: SetState(KGrabStateWaitingForDown5); sl@0: else sl@0: TestFailed(); sl@0: break; sl@0: case KGrabStateWaitingForUp4: sl@0: FinishedTests(); sl@0: break; sl@0: case KGrabStateWaitingForDrag5: sl@0: { sl@0: if (aPointer.iType==TPointerEvent::EDrag) sl@0: SetState(KGrabStateWaitingForUp5); sl@0: else if (iTest->TestFailed()) sl@0: ResetTest(); sl@0: break; sl@0: } sl@0: case KGrabStateWaitingForUp5: sl@0: if (aPointer.iType==TPointerEvent::EDrag) // Harmless sl@0: break; sl@0: if (aPointer.iType==TPointerEvent::EButton1Up) sl@0: SetState(KGrabStateWaitingForDown4); sl@0: else sl@0: TestFailed(); sl@0: break; sl@0: default:; sl@0: } sl@0: } sl@0: sl@0: void CGrabWindow::SetState(TInt aState) sl@0: { sl@0: iState=aState; sl@0: iWin.Invalidate(); sl@0: } sl@0: sl@0: void CGrabWindow::TestFailed() sl@0: { sl@0: if (iState!=KStateFailed) sl@0: { sl@0: iState=KStateFailed; sl@0: if (iTest->TestFailed()) sl@0: ResetTest(); sl@0: } sl@0: } sl@0: sl@0: void CGrabWindow::FinishedTests() sl@0: { sl@0: iState=KGrabStateFinished; sl@0: iTest->Request(); sl@0: } sl@0: sl@0: void CGrabWindow::WinKeyL(const TKeyEvent &aKey,const TTime &) sl@0: { sl@0: if (aKey.iCode==EKeyEscape) sl@0: FinishedTests(); // Simply skip this test if the Escape key is pressed sl@0: } sl@0: sl@0: // sl@0: // CGrabWindow2, used as part of grab tests // sl@0: // sl@0: sl@0: CGrabWindow2::CGrabWindow2(CGrabWindow *aWindow) : iGrabWindow(aWindow) sl@0: { sl@0: } sl@0: sl@0: void CGrabWindow2::Draw() sl@0: { sl@0: iGc->SetBrushStyle(CGraphicsContext::ESolidBrush); sl@0: iGc->SetBrushColor(TRgb::Gray4(2)); sl@0: iGc->DrawRect(Size()); sl@0: } sl@0: sl@0: void CGrabWindow2::PointerL(const TPointerEvent &aPointer,const TTime&) sl@0: { sl@0: iGrabWindow->Pointer2(aPointer); sl@0: } sl@0: sl@0: // sl@0: // CTPointTest // sl@0: // sl@0: sl@0: CTPointerTest::CTPointerTest() : CTestBase(_L("CTPointerTest")) sl@0: {} sl@0: sl@0: CTPointerTest::~CTPointerTest() sl@0: { sl@0: HAL::Set(HALData::EPenDisplayOn,iOldPointerState); sl@0: delete iRepeatWin; sl@0: delete iGrabWin; sl@0: delete iGrabWin2; sl@0: Client()->ResetFocus(); sl@0: } sl@0: sl@0: void CTPointerTest::ConstructL() sl@0: { sl@0: iRepeatWin=new(ELeave) CPointerWindow(this); sl@0: TSize screenSize(Client()->iScreen->SizeInPixels()); sl@0: iRepeatWin->SetUpLD(TPoint(screenSize.iWidth/8,screenSize.iHeight/8),TSize(screenSize.iWidth*3/4,screenSize.iHeight*3/4),Client()->iGroup,*Client()->iGc); sl@0: Client()->iGroup->SetCurrentWindow(iRepeatWin); sl@0: iNoDigitiser=EFalse; sl@0: TInt err=HAL::Get(HALData::EPenDisplayOn,iOldPointerState); sl@0: if (err==KErrNotSupported) sl@0: iNoDigitiser=ETrue; sl@0: else if (err==KErrNone) sl@0: err=HAL::Set(HALData::EPenDisplayOn,ETrue); sl@0: if (err==KErrNotSupported) sl@0: iNoDigitiser=(!iOldPointerState); sl@0: else sl@0: TestL(err==KErrNone); sl@0: } sl@0: sl@0: TBool CTPointerTest::TestFailed() sl@0: { sl@0: TInt ret=1; sl@0: TRAP_IGNORE(ret=doTestFailedL()); sl@0: switch(ret) sl@0: { sl@0: case 0: sl@0: return(ETrue); // Re-try test sl@0: case 1: sl@0: Request(); sl@0: break; sl@0: } sl@0: return(EFalse); sl@0: } sl@0: sl@0: TInt CTPointerTest::doTestFailedL() sl@0: { sl@0: CTDialog *dialog=new(ELeave) CTDialog(); sl@0: dialog->SetTitle(_L("Pointer repeat test failed")); sl@0: dialog->SetNumButtons(2); sl@0: dialog->SetButtonText(0,_L("Retest")); sl@0: dialog->SetButtonText(1,_L("Fail")); sl@0: dialog->ConstructLD(*Client()->iGroup,*Client()->iGc); sl@0: return dialog->Display(); sl@0: } sl@0: sl@0: CGrabWindow2 *CTPointerTest::GrabWin2() const sl@0: { sl@0: return(iGrabWin2); sl@0: } sl@0: sl@0: void CTPointerTest::StartGrabTestL() sl@0: { sl@0: iGrabWin=new(ELeave) CGrabWindow(this); sl@0: iGrabWin2=new(ELeave) CGrabWindow2(iGrabWin); sl@0: // sl@0: TSize screenSize(Client()->iScreen->SizeInPixels()); sl@0: iGrabWin2->SetUpL(TPoint(screenSize.iWidth/8,screenSize.iHeight/8),TSize(screenSize.iWidth*3/4,screenSize.iHeight*3/4),Client()->iGroup,*Client()->iGc); sl@0: Client()->iGroup->SetCurrentWindow(iGrabWin2); sl@0: // sl@0: iGrabWin->SetUpLD(TPoint(screenSize.iWidth/4,screenSize.iHeight/4),TSize(screenSize.iWidth/2,screenSize.iHeight/2),Client()->iGroup,*Client()->iGc); sl@0: Client()->iGroup->SetCurrentWindow(iGrabWin); sl@0: // sl@0: } sl@0: sl@0: #pragma warning( disable : 4065 ) //switch statement contains 'default' but no 'case' labels sl@0: TestState CTPointerTest::DoTestL() sl@0: { sl@0: switch(iState) sl@0: { sl@0: #if !defined(__WINS__) //Only unconverted test is MARM only sl@0: case 0: sl@0: LogSubTest(_L("Repeat tests"),1); sl@0: iState++; sl@0: return(EContinue); sl@0: #endif sl@0: sl@0: default: sl@0: return(EFinished); sl@0: } sl@0: } sl@0: #pragma warning( default : 4065 ) sl@0: