os/graphics/windowing/windowserver/test/tman/TMPOINTR.CPP
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200 (2012-06-15)
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
// Test pointer event handling
sl@0
    15
// 
sl@0
    16
//
sl@0
    17
sl@0
    18
#include <e32std.h>
sl@0
    19
#include <hal.h>
sl@0
    20
#include "W32STD.H"
sl@0
    21
#include "../tlib/testbase.h"
sl@0
    22
#include "TMAN.H"
sl@0
    23
sl@0
    24
class CTPointerTest;
sl@0
    25
class CGrabWindow;
sl@0
    26
sl@0
    27
class CPointerWindow : public CTWin
sl@0
    28
	{
sl@0
    29
	enum {KRepeatMargin=200000};	// 0.2 Seconds
sl@0
    30
	enum {KRepeatCount=4};
sl@0
    31
	enum {KRepeatIntervalIncrements=100000};
sl@0
    32
	enum {KRepeatRectXExtra=50};
sl@0
    33
	enum {KRepeatRectYExtra=50};
sl@0
    34
	enum {KStateWaitingForTest1,KStateFailed,KStateTesting1,
sl@0
    35
			KStateWaitingForTest2,KStateTesting2,
sl@0
    36
			KStateWaitingForTest3,KStateTesting3,
sl@0
    37
			KStateWaitingForTest4,KStateTesting4,
sl@0
    38
			KStateWaitingForTest5,KStateTesting5,
sl@0
    39
			KStateWaitingForTest6,KStateTesting6,
sl@0
    40
			KStateWaitingForTest8,KStateTesting8,
sl@0
    41
			KStateWaitingForTest7,KStateTesting7,
sl@0
    42
			KStateFinished};
sl@0
    43
public:
sl@0
    44
	CPointerWindow(CTPointerTest *aTest);
sl@0
    45
	void SetUpLD(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc);
sl@0
    46
	void Draw();
sl@0
    47
	void StartNextRepeatTest();
sl@0
    48
	void QueueNextRepeat();
sl@0
    49
	void PointerL(const TPointerEvent &aPointer,const TTime&);
sl@0
    50
	void WinKeyL(const TKeyEvent &aKey,const TTime &aTime);
sl@0
    51
private:
sl@0
    52
	void SwitchOn(const TTime &);
sl@0
    53
	void ResetTest(TInt aState);
sl@0
    54
	void SetState(TInt aState);
sl@0
    55
	void FinishedTests();
sl@0
    56
	void TestFailed();
sl@0
    57
private:
sl@0
    58
	CTPointerTest *iTest;
sl@0
    59
	TInt iRepeatCount;
sl@0
    60
	TInt iState;
sl@0
    61
	TTimeIntervalMicroSeconds32 iInterval;
sl@0
    62
	TTime iPrevTime;
sl@0
    63
	TRect iRepeatRect;
sl@0
    64
	};
sl@0
    65
sl@0
    66
class CGrabWindow2 : public CTWin
sl@0
    67
	{
sl@0
    68
public:
sl@0
    69
	CGrabWindow2(CGrabWindow *aWindow);
sl@0
    70
	void SetUpLD(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc);
sl@0
    71
private:
sl@0
    72
	void Draw();
sl@0
    73
	void PointerL(const TPointerEvent &aPointer,const TTime&);
sl@0
    74
private:
sl@0
    75
	CGrabWindow *iGrabWindow;
sl@0
    76
	};
sl@0
    77
sl@0
    78
class CGrabWindow : public CTWin
sl@0
    79
	{
sl@0
    80
	enum {KGrabStateWaitingForDown,KGrabStateWaitingForDragOut,KGrabStateWaitingForUp,KGrabStateFinished,
sl@0
    81
		KGrabStateWaitingForDown2,KGrabStateWaitingForUp2a,KGrabStateWaitingForDrag2,KGrabStateWaitingForUp2b,
sl@0
    82
		KGrabStateWaitingForDown3,KGrabStateWaitingForUp3a,KGrabStateWaitingForUp3b,
sl@0
    83
		KGrabStateWaitingForDown4,KGrabStateWaitingForUp4,
sl@0
    84
		KGrabStateWaitingForDown5,KGrabStateWaitingForUp5,KGrabStateWaitingForDrag5,
sl@0
    85
		KStateFailed};
sl@0
    86
public:
sl@0
    87
	CGrabWindow(CTPointerTest *aTest);
sl@0
    88
	void Pointer2(const TPointerEvent &aPointer);
sl@0
    89
	void SetUpLD(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc);
sl@0
    90
	void WinKeyL(const TKeyEvent &aKey,const TTime &aTime);
sl@0
    91
private:
sl@0
    92
	void Draw();
sl@0
    93
	void SetState(TInt aState);
sl@0
    94
	void ResetTest();
sl@0
    95
	void PointerL(const TPointerEvent &aPointer,const TTime&);
sl@0
    96
	void TestFailed();
sl@0
    97
	void FinishedTests();
sl@0
    98
private:
sl@0
    99
	TInt iState;
sl@0
   100
	CTPointerTest *iTest;
sl@0
   101
	};
sl@0
   102
sl@0
   103
class CTPointerTest : public CTestBase
sl@0
   104
	{
sl@0
   105
public:
sl@0
   106
	CTPointerTest();
sl@0
   107
	~CTPointerTest();
sl@0
   108
	TBool TestFailed();
sl@0
   109
	TestState DoTestL();
sl@0
   110
	void StartGrabTestL();
sl@0
   111
	void ConstructL();
sl@0
   112
	CGrabWindow2 *GrabWin2() const;
sl@0
   113
	inline TBool Digitiser() const {return !iNoDigitiser;}
sl@0
   114
private:
sl@0
   115
	TInt doTestFailedL();
sl@0
   116
private:
sl@0
   117
	CPointerWindow *iRepeatWin;
sl@0
   118
	CGrabWindow *iGrabWin;
sl@0
   119
	CGrabWindow2 *iGrabWin2;
sl@0
   120
	TSize iWinSize;
sl@0
   121
	TInt iState;
sl@0
   122
	TBool iOldPointerState;
sl@0
   123
	TBool iNoDigitiser;
sl@0
   124
	};
sl@0
   125
sl@0
   126
GLDEF_C CTestBase *CreatePointerTest()
sl@0
   127
	{
sl@0
   128
	return(new(ELeave) CTPointerTest());
sl@0
   129
	}
sl@0
   130
sl@0
   131
CPointerWindow::CPointerWindow(CTPointerTest *aTest) : CTWin(), iTest(aTest)
sl@0
   132
	{}
sl@0
   133
sl@0
   134
void CPointerWindow::SetState(TInt aState)
sl@0
   135
	{
sl@0
   136
	iState=aState;
sl@0
   137
	iWin.Invalidate();
sl@0
   138
	switch(aState)
sl@0
   139
		{
sl@0
   140
		case KStateWaitingForTest1:
sl@0
   141
		case KStateWaitingForTest2:
sl@0
   142
		case KStateWaitingForTest3:
sl@0
   143
		case KStateWaitingForTest4:
sl@0
   144
		case KStateWaitingForTest5:
sl@0
   145
		case KStateWaitingForTest6:
sl@0
   146
		case KStateWaitingForTest8:
sl@0
   147
		case KStateWaitingForTest7:
sl@0
   148
			iRepeatRect=TRect();
sl@0
   149
			break;
sl@0
   150
		case KStateTesting8:
sl@0
   151
			iWin.Close();
sl@0
   152
			Client()->iWs.Flush();
sl@0
   153
			User::After(500000);
sl@0
   154
			FinishedTests();
sl@0
   155
			break;
sl@0
   156
		}
sl@0
   157
	}
sl@0
   158
sl@0
   159
void CPointerWindow::ResetTest(TInt aState)
sl@0
   160
	{
sl@0
   161
	TInt newState=KStateFinished;
sl@0
   162
	switch(aState)
sl@0
   163
		{
sl@0
   164
		case KStateTesting1:
sl@0
   165
			newState=KStateWaitingForTest1;
sl@0
   166
			break;
sl@0
   167
		case KStateTesting2:
sl@0
   168
			newState=KStateWaitingForTest2;
sl@0
   169
			break;
sl@0
   170
		case KStateTesting3:
sl@0
   171
			newState=KStateWaitingForTest3;
sl@0
   172
			break;
sl@0
   173
		case KStateTesting4:
sl@0
   174
			newState=KStateWaitingForTest4;
sl@0
   175
			break;
sl@0
   176
		case KStateTesting5:
sl@0
   177
			newState=KStateWaitingForTest5;
sl@0
   178
			break;
sl@0
   179
		case KStateTesting6:
sl@0
   180
			newState=KStateWaitingForTest6;
sl@0
   181
			break;
sl@0
   182
		case KStateTesting8:
sl@0
   183
			newState=KStateWaitingForTest8;
sl@0
   184
			break;
sl@0
   185
		case KStateTesting7:
sl@0
   186
			newState=KStateWaitingForTest7;
sl@0
   187
			break;
sl@0
   188
		}
sl@0
   189
	SetState(newState);
sl@0
   190
	}
sl@0
   191
sl@0
   192
void CPointerWindow::SetUpLD(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc)
sl@0
   193
	{
sl@0
   194
	ConstructExtLD(*parent,pos,size);
sl@0
   195
	Activate();
sl@0
   196
	AssignGC(aGc);
sl@0
   197
	//SetState(KStateWaitingForTest1);
sl@0
   198
	SetState(KStateWaitingForTest7);		//Only unconverted test
sl@0
   199
	BaseWin()->EnableOnEvents();
sl@0
   200
	}
sl@0
   201
sl@0
   202
void CPointerWindow::Draw()
sl@0
   203
	{
sl@0
   204
	iGc->Clear();
sl@0
   205
	iGc->DrawRect(Size());
sl@0
   206
	iGc->DrawRect(iRepeatRect);
sl@0
   207
	TBuf<0x80> buf;
sl@0
   208
	TBuf<0x80> buf2;
sl@0
   209
	switch(iState)
sl@0
   210
		{
sl@0
   211
		case KStateWaitingForTest1:
sl@0
   212
			buf.Format(_L("Click anywhere in the window and hold the pointer steady"));
sl@0
   213
			break;
sl@0
   214
		case KStateTesting1:
sl@0
   215
			buf.Format(_L("Hold pointer inside the box"));
sl@0
   216
			break;
sl@0
   217
		case KStateWaitingForTest2:
sl@0
   218
			buf.Format(_L("Release the pointer then click in the window and hold the pointer steady"));
sl@0
   219
			break;
sl@0
   220
		case KStateTesting2:
sl@0
   221
			buf.Format(_L("Drag the pointer outside the box"));
sl@0
   222
			break;
sl@0
   223
		case KStateWaitingForTest3:
sl@0
   224
			buf.Format(_L("Release the pointer then click in the window and hold the pointer steady"));
sl@0
   225
			break;
sl@0
   226
		case KStateTesting3:
sl@0
   227
			buf.Format(_L("Release the pointer"));
sl@0
   228
			break;
sl@0
   229
		case KStateWaitingForTest4:
sl@0
   230
			buf.Format(_L("Click anywhere in the window and move the pointer slightly"));
sl@0
   231
			break;
sl@0
   232
		case KStateTesting4:
sl@0
   233
			buf.Format(_L("Release the pointer"));
sl@0
   234
			break;
sl@0
   235
		case KStateWaitingForTest5:
sl@0
   236
			buf.Format(_L("Click anywhere in the window and move the pointer slightly"));
sl@0
   237
			break;
sl@0
   238
		case KStateTesting5:
sl@0
   239
			buf.Format(_L("Release the pointer"));
sl@0
   240
			break;
sl@0
   241
		case KStateWaitingForTest6:
sl@0
   242
			buf.Format(_L("Click anywhere in the window"));
sl@0
   243
			break;
sl@0
   244
		case KStateTesting6:
sl@0
   245
			buf.Format(_L("Move the pointer"));
sl@0
   246
			break;
sl@0
   247
		case KStateWaitingForTest8:
sl@0
   248
			buf.Format(_L("Click anywhere in the window, and keep the pointer pressed"));
sl@0
   249
			break;
sl@0
   250
		case KStateTesting8:
sl@0
   251
			buf.Format(_L(""));
sl@0
   252
			break;
sl@0
   253
		case KStateWaitingForTest7:
sl@0
   254
			buf.Format(_L("Switch off and touch the center of the screen"));
sl@0
   255
			break;
sl@0
   256
		case KStateTesting7:
sl@0
   257
			buf.Format(_L(""));
sl@0
   258
			break;
sl@0
   259
		}
sl@0
   260
	switch(iState)
sl@0
   261
		{
sl@0
   262
		case KStateTesting1:
sl@0
   263
			buf2.Format(TRefByValue<const TDesC>(_L("Repeat (%d/%d), interval=%d.%d")),iRepeatCount,KRepeatCount,iInterval.Int()/1000000,(iInterval.Int()%1000000)/100000);
sl@0
   264
			break;
sl@0
   265
		case KStateTesting2:
sl@0
   266
		case KStateTesting3:
sl@0
   267
			buf2.Format(TRefByValue<const TDesC>(_L("Repeat (%d), interval=%d.%d")),iRepeatCount,iInterval.Int()/1000000,(iInterval.Int()%1000000)/100000);
sl@0
   268
			break;
sl@0
   269
		}
sl@0
   270
	iGc->DrawText(buf,TPoint(10,20));
sl@0
   271
	iGc->DrawText(buf2,TPoint(10,40));
sl@0
   272
	}
sl@0
   273
sl@0
   274
void CPointerWindow::FinishedTests()
sl@0
   275
	{
sl@0
   276
	iState=KStateFinished;
sl@0
   277
	iTest->Request();
sl@0
   278
	}
sl@0
   279
sl@0
   280
void CPointerWindow::StartNextRepeatTest()
sl@0
   281
	{
sl@0
   282
	iInterval=0;
sl@0
   283
	iRepeatCount=0;
sl@0
   284
	if (iState==KStateWaitingForTest4)
sl@0
   285
		User::After(TTimeIntervalMicroSeconds32(1000000));
sl@0
   286
	else if (iState==KStateWaitingForTest5)
sl@0
   287
		User::After(TTimeIntervalMicroSeconds32(1000000));
sl@0
   288
	QueueNextRepeat();
sl@0
   289
	switch(iState)
sl@0
   290
		{
sl@0
   291
		case KStateWaitingForTest1:
sl@0
   292
			SetState(KStateTesting1);
sl@0
   293
			break;
sl@0
   294
		case KStateWaitingForTest2:
sl@0
   295
			SetState(KStateTesting2);
sl@0
   296
			break;
sl@0
   297
		case KStateWaitingForTest3:
sl@0
   298
			SetState(KStateTesting3);
sl@0
   299
			break;
sl@0
   300
		case KStateWaitingForTest4:
sl@0
   301
			SetState(KStateTesting4);
sl@0
   302
			break;
sl@0
   303
		case KStateWaitingForTest5:
sl@0
   304
			SetState(KStateTesting5);
sl@0
   305
			break;
sl@0
   306
		case KStateWaitingForTest6:
sl@0
   307
			SetState(KStateTesting6);
sl@0
   308
			break;
sl@0
   309
		case KStateWaitingForTest8:
sl@0
   310
			SetState(KStateTesting8);
sl@0
   311
			break;
sl@0
   312
		case KStateWaitingForTest7:
sl@0
   313
			SetState(KStateTesting7);
sl@0
   314
			break;
sl@0
   315
		}
sl@0
   316
	}
sl@0
   317
sl@0
   318
void CPointerWindow::QueueNextRepeat()
sl@0
   319
	{
sl@0
   320
	iInterval=iInterval.Int()+KRepeatIntervalIncrements;
sl@0
   321
	iWin.RequestPointerRepeatEvent(TTimeIntervalMicroSeconds32(iInterval),TRect(iRepeatRect));
sl@0
   322
	iPrevTime.HomeTime();
sl@0
   323
	iWin.Invalidate();
sl@0
   324
	}
sl@0
   325
sl@0
   326
void CPointerWindow::PointerL(const TPointerEvent &aPointer,const TTime &aTime)
sl@0
   327
	{
sl@0
   328
	if (aPointer.iType==TPointerEvent::EButtonRepeat)
sl@0
   329
		{
sl@0
   330
		if (iState!=KStateTesting1 && iState!=KStateTesting2 && iState!=KStateTesting3 && iState!=KStateTesting4)
sl@0
   331
			TestFailed();
sl@0
   332
		else
sl@0
   333
			{
sl@0
   334
			TTimeIntervalMicroSeconds32 interval(I64LOW(aTime.MicroSecondsFrom(iPrevTime).Int64()));
sl@0
   335
			if (interval.Int()<(iInterval.Int()-KRepeatMargin) || interval.Int()>(iInterval.Int()+KRepeatMargin))
sl@0
   336
				TestFailed();
sl@0
   337
			else
sl@0
   338
				{
sl@0
   339
				if (!iRepeatRect.Contains(aPointer.iPosition) ||
sl@0
   340
					aPointer.iParentPosition!=(aPointer.iPosition+iWin.InquireOffset(*Parent()->WinTreeNode())))
sl@0
   341
					TestFailed();
sl@0
   342
				else
sl@0
   343
					{
sl@0
   344
					iRepeatCount++;
sl@0
   345
					if (iState==KStateTesting1 && iRepeatCount==KRepeatCount)
sl@0
   346
						{
sl@0
   347
						QueueNextRepeat();
sl@0
   348
						Client()->iWs.Flush();
sl@0
   349
						User::After(TTimeIntervalMicroSeconds32(iRepeatCount*KRepeatIntervalIncrements));
sl@0
   350
						iWin.CancelPointerRepeatEventRequest();
sl@0
   351
						SetState(KStateWaitingForTest2);
sl@0
   352
						}
sl@0
   353
					else
sl@0
   354
						QueueNextRepeat();
sl@0
   355
					}
sl@0
   356
				}
sl@0
   357
			}
sl@0
   358
		}
sl@0
   359
	else switch(iState)
sl@0
   360
		{
sl@0
   361
		case KStateWaitingForTest1:
sl@0
   362
		case KStateWaitingForTest2:
sl@0
   363
		case KStateWaitingForTest3:
sl@0
   364
		case KStateWaitingForTest4:
sl@0
   365
		case KStateWaitingForTest8:
sl@0
   366
			if (aPointer.iType==TPointerEvent::EButton1Down)
sl@0
   367
				{
sl@0
   368
				iRepeatRect.iTl=aPointer.iPosition-TPoint(KRepeatRectXExtra,KRepeatRectYExtra);
sl@0
   369
				iRepeatRect.iBr=aPointer.iPosition+TPoint(KRepeatRectXExtra,KRepeatRectYExtra);
sl@0
   370
				StartNextRepeatTest();
sl@0
   371
				}
sl@0
   372
			break;
sl@0
   373
		case KStateWaitingForTest5:
sl@0
   374
			if (aPointer.iType==TPointerEvent::EButton1Down)
sl@0
   375
				{
sl@0
   376
				iRepeatRect.iTl=aPointer.iPosition;
sl@0
   377
				iRepeatRect.iBr=aPointer.iPosition+TPoint(1,1);
sl@0
   378
				StartNextRepeatTest();
sl@0
   379
				}
sl@0
   380
			break;
sl@0
   381
		case KStateWaitingForTest6:
sl@0
   382
			if (aPointer.iType==TPointerEvent::EButton1Down)
sl@0
   383
				{
sl@0
   384
				iRepeatRect.iTl=aPointer.iPosition+TPoint(KRepeatRectXExtra,KRepeatRectYExtra);
sl@0
   385
				iRepeatRect.iBr=aPointer.iPosition+TPoint(2*KRepeatRectXExtra,2*KRepeatRectYExtra);
sl@0
   386
				StartNextRepeatTest();
sl@0
   387
				}
sl@0
   388
			break;
sl@0
   389
		case KStateTesting1:
sl@0
   390
			TestFailed();
sl@0
   391
			break;
sl@0
   392
		case KStateTesting2:
sl@0
   393
			if (aPointer.iType==TPointerEvent::EDrag)
sl@0
   394
				SetState(KStateWaitingForTest3);
sl@0
   395
			else
sl@0
   396
				TestFailed();
sl@0
   397
			break;
sl@0
   398
		case KStateTesting3:
sl@0
   399
			if (aPointer.iType==TPointerEvent::EButton1Up)
sl@0
   400
				SetState(KStateWaitingForTest4);
sl@0
   401
			else
sl@0
   402
				TestFailed();
sl@0
   403
			break;
sl@0
   404
		case KStateTesting4:
sl@0
   405
			if (aPointer.iType==TPointerEvent::EButton1Up)
sl@0
   406
				SetState(KStateWaitingForTest5);
sl@0
   407
			else
sl@0
   408
				TestFailed();
sl@0
   409
			break;
sl@0
   410
		case KStateTesting5:
sl@0
   411
			if (aPointer.iType==TPointerEvent::EButton1Up)
sl@0
   412
				SetState(KStateWaitingForTest6);
sl@0
   413
			else if (aPointer.iType!=TPointerEvent::EDrag)
sl@0
   414
				TestFailed();
sl@0
   415
			break;
sl@0
   416
		case KStateTesting6:
sl@0
   417
			if (aPointer.iType==TPointerEvent::EDrag)
sl@0
   418
				{
sl@0
   419
		#if !defined(__WINS__)	// Can't emulate touching dig when switched off under WINS
sl@0
   420
				if (iTest->Digitiser())
sl@0
   421
					SetState(KStateWaitingForTest7);
sl@0
   422
				else
sl@0
   423
		#endif
sl@0
   424
					SetState(KStateWaitingForTest8);
sl@0
   425
				}
sl@0
   426
			else
sl@0
   427
				TestFailed();
sl@0
   428
			break;
sl@0
   429
		case KStateWaitingForTest7:
sl@0
   430
			if (aPointer.iType==TPointerEvent::EButton1Down || aPointer.iType==TPointerEvent::ESwitchOn)
sl@0
   431
				TestFailed();
sl@0
   432
			break;
sl@0
   433
		case KStateTesting7:
sl@0
   434
			if (aPointer.iType!=TPointerEvent::ESwitchOn)
sl@0
   435
				TestFailed();
sl@0
   436
			else
sl@0
   437
				SetState(KStateTesting8);		//Jump straight to end as this is only unconverted test.
sl@0
   438
				//SetState(KStateWaitingForTest8);
sl@0
   439
			break;
sl@0
   440
		case KStateTesting8:
sl@0
   441
			break;
sl@0
   442
		}
sl@0
   443
	}
sl@0
   444
sl@0
   445
void CPointerWindow::TestFailed()
sl@0
   446
	{
sl@0
   447
	if (iState!=KStateFailed)
sl@0
   448
		{
sl@0
   449
		TInt oldState=iState;
sl@0
   450
		iState=KStateFailed;
sl@0
   451
		if (iTest->TestFailed())
sl@0
   452
			ResetTest(oldState);
sl@0
   453
		}
sl@0
   454
	}
sl@0
   455
sl@0
   456
void CPointerWindow::WinKeyL(const TKeyEvent &aKey,const TTime &)
sl@0
   457
	{
sl@0
   458
	if (aKey.iCode==EKeyEscape)
sl@0
   459
		FinishedTests();	// Simply skip this test if the Escape key is pressed
sl@0
   460
	}
sl@0
   461
sl@0
   462
void CPointerWindow::SwitchOn(const TTime &)
sl@0
   463
	{
sl@0
   464
	if (iState==KStateWaitingForTest7)
sl@0
   465
		SetState(KStateTesting7);
sl@0
   466
	else
sl@0
   467
		TestFailed();
sl@0
   468
	}
sl@0
   469
sl@0
   470
//
sl@0
   471
// CGrabWindow //
sl@0
   472
//
sl@0
   473
sl@0
   474
CGrabWindow::CGrabWindow(CTPointerTest *aTest) : iTest(aTest)
sl@0
   475
	{
sl@0
   476
	}
sl@0
   477
sl@0
   478
void CGrabWindow::SetUpLD(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc)
sl@0
   479
	{
sl@0
   480
	ConstructExtLD(*parent,pos,size);
sl@0
   481
	Activate();
sl@0
   482
	AssignGC(aGc);
sl@0
   483
	SetState(KGrabStateWaitingForDown);
sl@0
   484
	}
sl@0
   485
sl@0
   486
void CGrabWindow::Draw()
sl@0
   487
	{
sl@0
   488
	iGc->Clear();
sl@0
   489
	iGc->DrawRect(Size());
sl@0
   490
	TBuf<0x80> buf;
sl@0
   491
	switch(iState)
sl@0
   492
		{
sl@0
   493
		case KGrabStateWaitingForDown:
sl@0
   494
		case KGrabStateWaitingForDown2:
sl@0
   495
		case KGrabStateWaitingForDown5:
sl@0
   496
			buf.Copy(_L("Press the pointer inside the window"));
sl@0
   497
			break;
sl@0
   498
		case KGrabStateWaitingForDown3:
sl@0
   499
		case KGrabStateWaitingForUp3a:
sl@0
   500
			buf.Copy(_L("Press and release the pointer inside the window"));
sl@0
   501
			break;
sl@0
   502
		case KGrabStateWaitingForDragOut:
sl@0
   503
			buf.Copy(_L("Drag the pointer outside into the outside window"));
sl@0
   504
			break;
sl@0
   505
		case KGrabStateWaitingForDrag2:
sl@0
   506
			buf.Copy(_L("Drag the pointer outside outside both windows"));
sl@0
   507
			break;
sl@0
   508
		case KGrabStateWaitingForUp:
sl@0
   509
		case KGrabStateWaitingForUp2b:
sl@0
   510
		case KGrabStateWaitingForUp5:
sl@0
   511
			buf.Copy(_L("Release the pointer"));
sl@0
   512
			break;
sl@0
   513
		case KGrabStateWaitingForDown4:
sl@0
   514
			buf.Copy(_L("Press then release the pointer"));
sl@0
   515
			break;
sl@0
   516
		default:;
sl@0
   517
		}
sl@0
   518
	iGc->DrawText(buf,TPoint(10,20));
sl@0
   519
	}
sl@0
   520
sl@0
   521
void CGrabWindow::PointerL(const TPointerEvent &aPointer,const TTime&)
sl@0
   522
	{
sl@0
   523
	switch(iState)
sl@0
   524
		{
sl@0
   525
		case KGrabStateWaitingForDown:
sl@0
   526
			if (aPointer.iType==TPointerEvent::EButton1Down)
sl@0
   527
				SetState(KGrabStateWaitingForDragOut);
sl@0
   528
			break;
sl@0
   529
		case KGrabStateWaitingForDragOut:
sl@0
   530
			if (aPointer.iType!=TPointerEvent::EDrag)
sl@0
   531
				TestFailed();
sl@0
   532
			else
sl@0
   533
				{
sl@0
   534
				if (!TRect(Size()).Contains(aPointer.iPosition))
sl@0
   535
					SetState(KGrabStateWaitingForUp);
sl@0
   536
				}
sl@0
   537
			break;
sl@0
   538
		case KGrabStateWaitingForUp:
sl@0
   539
			if (aPointer.iType==TPointerEvent::EDrag)
sl@0
   540
				break;
sl@0
   541
			if (aPointer.iType==TPointerEvent::EButton1Up)
sl@0
   542
				SetState(KGrabStateWaitingForDown2);
sl@0
   543
			else
sl@0
   544
				TestFailed();
sl@0
   545
			break;
sl@0
   546
		case KGrabStateWaitingForDown2:
sl@0
   547
			if (aPointer.iType!=TPointerEvent::EButton1Down)
sl@0
   548
				TestFailed();
sl@0
   549
			else
sl@0
   550
				{
sl@0
   551
				iTest->GrabWin2()->BaseWin()->ClaimPointerGrab();
sl@0
   552
				iTest->GrabWin2()->BaseWin()->ClaimPointerGrab();	// Call twice to check it's harmless
sl@0
   553
				SetState(KGrabStateWaitingForUp2a);
sl@0
   554
				}
sl@0
   555
			break;
sl@0
   556
		case KGrabStateWaitingForUp2a:
sl@0
   557
			SetState(KGrabStateWaitingForDrag2);
sl@0
   558
			break;
sl@0
   559
		case KGrabStateWaitingForDrag2:
sl@0
   560
			break;
sl@0
   561
		case KGrabStateWaitingForUp2b:
sl@0
   562
			TestFailed();
sl@0
   563
			break;
sl@0
   564
		case KGrabStateWaitingForDown3:
sl@0
   565
			if (aPointer.iType!=TPointerEvent::EButton1Down)
sl@0
   566
				TestFailed();
sl@0
   567
			else
sl@0
   568
				SetState(KGrabStateWaitingForUp3a);
sl@0
   569
			break;
sl@0
   570
		case KGrabStateWaitingForUp3a:
sl@0
   571
			if (aPointer.iType==TPointerEvent::EButton1Up)
sl@0
   572
				{
sl@0
   573
				iTest->GrabWin2()->BaseWin()->ClaimPointerGrab();
sl@0
   574
				SetState(KGrabStateWaitingForUp3b);
sl@0
   575
				}
sl@0
   576
			break;
sl@0
   577
		case KGrabStateWaitingForUp3b:
sl@0
   578
			TestFailed();
sl@0
   579
			break;
sl@0
   580
		case KGrabStateWaitingForDown5:
sl@0
   581
			if (aPointer.iType!=TPointerEvent::EButton1Down)
sl@0
   582
				TestFailed();
sl@0
   583
			else
sl@0
   584
				{
sl@0
   585
				iTest->GrabWin2()->BaseWin()->ClaimPointerGrab(EFalse);
sl@0
   586
				SetState(KGrabStateWaitingForDrag5);
sl@0
   587
				}
sl@0
   588
			break;
sl@0
   589
		case KGrabStateWaitingForDrag5:
sl@0
   590
			if (aPointer.iType==TPointerEvent::EButton1Up)
sl@0
   591
				TestFailed();
sl@0
   592
			break;
sl@0
   593
		case KGrabStateWaitingForUp5:
sl@0
   594
			TestFailed();
sl@0
   595
			break;
sl@0
   596
		case KGrabStateWaitingForDown4:
sl@0
   597
			SetState(KGrabStateWaitingForUp4);
sl@0
   598
			iWin.Close();	// Close the window with the grab captured in it
sl@0
   599
			break;
sl@0
   600
		case KGrabStateFinished:
sl@0
   601
			break;
sl@0
   602
		}
sl@0
   603
	}
sl@0
   604
sl@0
   605
void CGrabWindow::ResetTest()
sl@0
   606
	{
sl@0
   607
	SetState(KGrabStateWaitingForDown);
sl@0
   608
	}
sl@0
   609
sl@0
   610
void CGrabWindow::Pointer2(const TPointerEvent &aPointer)
sl@0
   611
	{
sl@0
   612
	switch(iState)
sl@0
   613
		{
sl@0
   614
		case KGrabStateWaitingForDrag2:
sl@0
   615
			{
sl@0
   616
			if (aPointer.iType==TPointerEvent::EDrag)
sl@0
   617
				{
sl@0
   618
				SetState(KGrabStateWaitingForUp2b);
sl@0
   619
				}
sl@0
   620
			else
sl@0
   621
				{
sl@0
   622
				if (iTest->TestFailed())
sl@0
   623
					ResetTest();
sl@0
   624
				}
sl@0
   625
			break;
sl@0
   626
			}
sl@0
   627
		case KGrabStateWaitingForUp2b:
sl@0
   628
			if (aPointer.iType==TPointerEvent::EDrag)	// Harmless
sl@0
   629
				break;
sl@0
   630
			if (aPointer.iType==TPointerEvent::EButton1Up)
sl@0
   631
				SetState(KGrabStateWaitingForDown3);
sl@0
   632
			else
sl@0
   633
				TestFailed();
sl@0
   634
			break;
sl@0
   635
		case KGrabStateWaitingForUp3b:
sl@0
   636
			if (aPointer.iType==TPointerEvent::EButton1Up)
sl@0
   637
				SetState(KGrabStateWaitingForDown5);
sl@0
   638
			else
sl@0
   639
				TestFailed();
sl@0
   640
			break;
sl@0
   641
		case KGrabStateWaitingForUp4:
sl@0
   642
			FinishedTests();
sl@0
   643
			break;
sl@0
   644
		case KGrabStateWaitingForDrag5:
sl@0
   645
			{
sl@0
   646
			if (aPointer.iType==TPointerEvent::EDrag)
sl@0
   647
				SetState(KGrabStateWaitingForUp5);
sl@0
   648
			else if (iTest->TestFailed())
sl@0
   649
				ResetTest();
sl@0
   650
			break;
sl@0
   651
			}
sl@0
   652
		case KGrabStateWaitingForUp5:
sl@0
   653
			if (aPointer.iType==TPointerEvent::EDrag)	// Harmless
sl@0
   654
				break;
sl@0
   655
			if (aPointer.iType==TPointerEvent::EButton1Up)
sl@0
   656
				SetState(KGrabStateWaitingForDown4);
sl@0
   657
			else
sl@0
   658
				TestFailed();
sl@0
   659
			break;
sl@0
   660
		default:;
sl@0
   661
		}
sl@0
   662
	}
sl@0
   663
sl@0
   664
void CGrabWindow::SetState(TInt aState)
sl@0
   665
	{
sl@0
   666
	iState=aState;
sl@0
   667
	iWin.Invalidate();
sl@0
   668
	}
sl@0
   669
sl@0
   670
void CGrabWindow::TestFailed()
sl@0
   671
	{
sl@0
   672
	if (iState!=KStateFailed)
sl@0
   673
		{
sl@0
   674
		iState=KStateFailed;
sl@0
   675
		if (iTest->TestFailed())
sl@0
   676
			ResetTest();
sl@0
   677
		}
sl@0
   678
	}
sl@0
   679
sl@0
   680
void CGrabWindow::FinishedTests()
sl@0
   681
	{
sl@0
   682
	iState=KGrabStateFinished;
sl@0
   683
	iTest->Request();
sl@0
   684
	}
sl@0
   685
sl@0
   686
void CGrabWindow::WinKeyL(const TKeyEvent &aKey,const TTime &)
sl@0
   687
	{
sl@0
   688
	if (aKey.iCode==EKeyEscape)
sl@0
   689
		FinishedTests();	// Simply skip this test if the Escape key is pressed
sl@0
   690
	}
sl@0
   691
sl@0
   692
//
sl@0
   693
// CGrabWindow2, used as part of grab tests //
sl@0
   694
//
sl@0
   695
sl@0
   696
CGrabWindow2::CGrabWindow2(CGrabWindow *aWindow) : iGrabWindow(aWindow)
sl@0
   697
	{
sl@0
   698
	}
sl@0
   699
sl@0
   700
void CGrabWindow2::Draw()
sl@0
   701
	{
sl@0
   702
	iGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
sl@0
   703
	iGc->SetBrushColor(TRgb::Gray4(2));
sl@0
   704
	iGc->DrawRect(Size());
sl@0
   705
	}
sl@0
   706
sl@0
   707
void CGrabWindow2::PointerL(const TPointerEvent &aPointer,const TTime&)
sl@0
   708
	{
sl@0
   709
	iGrabWindow->Pointer2(aPointer);
sl@0
   710
	}
sl@0
   711
sl@0
   712
//
sl@0
   713
// CTPointTest //
sl@0
   714
//
sl@0
   715
sl@0
   716
CTPointerTest::CTPointerTest() : CTestBase(_L("CTPointerTest"))
sl@0
   717
	{}
sl@0
   718
sl@0
   719
CTPointerTest::~CTPointerTest()
sl@0
   720
	{
sl@0
   721
	HAL::Set(HALData::EPenDisplayOn,iOldPointerState);
sl@0
   722
	delete iRepeatWin;
sl@0
   723
	delete iGrabWin;
sl@0
   724
	delete iGrabWin2;
sl@0
   725
	Client()->ResetFocus();
sl@0
   726
	}
sl@0
   727
sl@0
   728
void CTPointerTest::ConstructL()
sl@0
   729
	{
sl@0
   730
	iRepeatWin=new(ELeave) CPointerWindow(this);
sl@0
   731
	TSize screenSize(Client()->iScreen->SizeInPixels());
sl@0
   732
	iRepeatWin->SetUpLD(TPoint(screenSize.iWidth/8,screenSize.iHeight/8),TSize(screenSize.iWidth*3/4,screenSize.iHeight*3/4),Client()->iGroup,*Client()->iGc);
sl@0
   733
	Client()->iGroup->SetCurrentWindow(iRepeatWin);
sl@0
   734
	iNoDigitiser=EFalse;
sl@0
   735
	TInt err=HAL::Get(HALData::EPenDisplayOn,iOldPointerState);
sl@0
   736
	if (err==KErrNotSupported)
sl@0
   737
		iNoDigitiser=ETrue;
sl@0
   738
	else if (err==KErrNone)
sl@0
   739
		err=HAL::Set(HALData::EPenDisplayOn,ETrue);
sl@0
   740
	if (err==KErrNotSupported)
sl@0
   741
		iNoDigitiser=(!iOldPointerState);
sl@0
   742
	else
sl@0
   743
		TestL(err==KErrNone);
sl@0
   744
	}
sl@0
   745
sl@0
   746
TBool CTPointerTest::TestFailed()
sl@0
   747
	{
sl@0
   748
	TInt ret=1;
sl@0
   749
	TRAP_IGNORE(ret=doTestFailedL());
sl@0
   750
	switch(ret)
sl@0
   751
		{
sl@0
   752
		case 0:
sl@0
   753
			return(ETrue);	// Re-try test
sl@0
   754
		case 1:
sl@0
   755
			Request();
sl@0
   756
			break;
sl@0
   757
		}
sl@0
   758
	return(EFalse);
sl@0
   759
	}
sl@0
   760
sl@0
   761
TInt CTPointerTest::doTestFailedL()
sl@0
   762
	{
sl@0
   763
	CTDialog *dialog=new(ELeave) CTDialog();
sl@0
   764
	dialog->SetTitle(_L("Pointer repeat test failed"));
sl@0
   765
	dialog->SetNumButtons(2);
sl@0
   766
	dialog->SetButtonText(0,_L("Retest"));
sl@0
   767
	dialog->SetButtonText(1,_L("Fail"));
sl@0
   768
	dialog->ConstructLD(*Client()->iGroup,*Client()->iGc);
sl@0
   769
	return dialog->Display();
sl@0
   770
	}
sl@0
   771
sl@0
   772
CGrabWindow2 *CTPointerTest::GrabWin2() const
sl@0
   773
	{
sl@0
   774
	return(iGrabWin2);
sl@0
   775
	}
sl@0
   776
sl@0
   777
void CTPointerTest::StartGrabTestL()
sl@0
   778
	{
sl@0
   779
	iGrabWin=new(ELeave) CGrabWindow(this);
sl@0
   780
	iGrabWin2=new(ELeave) CGrabWindow2(iGrabWin);
sl@0
   781
//
sl@0
   782
	TSize screenSize(Client()->iScreen->SizeInPixels());
sl@0
   783
	iGrabWin2->SetUpL(TPoint(screenSize.iWidth/8,screenSize.iHeight/8),TSize(screenSize.iWidth*3/4,screenSize.iHeight*3/4),Client()->iGroup,*Client()->iGc);
sl@0
   784
	Client()->iGroup->SetCurrentWindow(iGrabWin2);
sl@0
   785
//
sl@0
   786
	iGrabWin->SetUpLD(TPoint(screenSize.iWidth/4,screenSize.iHeight/4),TSize(screenSize.iWidth/2,screenSize.iHeight/2),Client()->iGroup,*Client()->iGc);
sl@0
   787
	Client()->iGroup->SetCurrentWindow(iGrabWin);
sl@0
   788
//
sl@0
   789
	}
sl@0
   790
sl@0
   791
#pragma warning( disable : 4065 )	//switch statement contains 'default' but no 'case' labels
sl@0
   792
TestState CTPointerTest::DoTestL()
sl@0
   793
	{
sl@0
   794
	switch(iState)
sl@0
   795
		{
sl@0
   796
	#if !defined(__WINS__)		//Only unconverted test is MARM only
sl@0
   797
		case 0:
sl@0
   798
			LogSubTest(_L("Repeat tests"),1);
sl@0
   799
			iState++;
sl@0
   800
			return(EContinue);
sl@0
   801
	#endif
sl@0
   802
		
sl@0
   803
		default:
sl@0
   804
			return(EFinished);
sl@0
   805
		}
sl@0
   806
	}
sl@0
   807
#pragma warning( default : 4065 )
sl@0
   808