author | Gareth Stockwell <gareth.stockwell@accenture.com> |
Fri, 22 Oct 2010 11:38:29 +0100 | |
branch | bug235_bringup_0 |
changeset 206 | c170e304623f |
parent 0 | 5d03bc08d59c |
permissions | -rw-r--r-- |
// Copyright (c) 1996-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: // Test Pointer move/drag buffer // // #include <e32std.h> #include "W32STD.H" #include "../tlib/testbase.h" #include "TMAN.H" class CTPntBufTest; class CPntBufWindow : public CTBackedUpWin { private: enum {KPointerMoveBufferSize=32}; public: CPntBufWindow(CTPntBufTest *aTest); ~CPntBufWindow(); void SetUpLD(TPoint pos,TSize size,CTWinBase *parent); void PointerBufferReady(const TTime &aTime); void PointerL(const TPointerEvent &pointer,const TTime &aTime); void SetUpState(); void NextTest(); void WinKeyL(const TKeyEvent &aKey,const TTime &aTime); void ErrorL(); private: //Virtual functions from CTWinBase void PointerEnter(const TTime&); void PointerExit(const TTime&); private: CTPntBufTest *iTest; TBool iDragging; TBool iErrorNest; TBool iDisabled; TBool iDiscard; TInt iMode; TBool iIgnorNextPoint; }; class CTPntBufTest : public CTestBase { public: CTPntBufTest(); ~CTPntBufTest(); TestState DoTestL(); void FinishedTests(); void ConstructL(); private: CPntBufWindow *iWin; TSize iWinSize; TInt iState; }; GLDEF_C CTestBase *CreatePointerBufferTest() { return(new(ELeave) CTPntBufTest()); } CPntBufWindow::CPntBufWindow(CTPntBufTest *aTest) : CTBackedUpWin(EGray4), iTest(aTest) {} CPntBufWindow::~CPntBufWindow() { delete iGc; } void CPntBufWindow::SetUpLD(TPoint pos,TSize size,CTWinBase *parent) { ConstructExtLD(*parent,pos,size); User::LeaveIfError(iWin.AllocPointerMoveBuffer(KPointerMoveBufferSize,0)); iWin.SetPointerGrab(ETrue); iWin.PointerFilter(EPointerFilterEnterExit,0); Activate(); User::LeaveIfError(Client()->iScreen->CreateContext(iGc)); iGc->Activate(iWin); SetUpState(); } void CPntBufWindow::PointerBufferReady(const TTime &) { if (iDiscard) iWin.DiscardPointerMoveBuffer(); iGc->SetPenColor(iDragging ? TRgb::Gray4(0) : TRgb::Gray4(1)); iGc->SetPenSize(iDragging ? TSize(2,2) : TSize(1,1)); TPoint pnts[KPointerMoveBufferSize]; TPtr8 ptr((TUint8 *)&pnts,sizeof(pnts)); TInt numPnts=iWin.RetrievePointerMoveBuffer(ptr); TInt index=0; if (iIgnorNextPoint) { iGc->MoveTo(pnts[index]); index=1; iIgnorNextPoint=EFalse; } for(;index<numPnts;index++) iGc->DrawLineTo(pnts[index]); } void CPntBufWindow::ErrorL() { if (!iErrorNest) { iErrorNest=ETrue; iTest->TestL(EFalse); } } void CPntBufWindow::PointerL(const TPointerEvent &pointer,const TTime &) { switch(pointer.iType) { case TPointerEvent::EButton1Down: iDragging=ETrue; iGc->MoveTo(pointer.iPosition); if (iMode==2) { if (pointer.iModifiers&EModifierShift) { iDisabled=ETrue; iWin.DisablePointerMoveBuffer(); } else if (pointer.iModifiers&EModifierCtrl) iDiscard=ETrue; } break; case TPointerEvent::EButton1Up: if (iDisabled) { iDisabled=EFalse; iWin.EnablePointerMoveBuffer(); } iDiscard=EFalse; iGc->MoveTo(pointer.iPosition); iDragging=EFalse; break; case TPointerEvent::EDrag: if (iDragging && !iDisabled) ErrorL(); break; case TPointerEvent::EMove: if (iDragging && !iDisabled) ErrorL(); break; default:; } } void CPntBufWindow::SetUpState() { iGc->Reset(); iGc->UseFont((CFont *)iFont); iGc->Clear(); switch(iMode) { case 0: iWin.PointerFilter(EPointerFilterMove,EPointerFilterMove); iGc->DrawText(_L("Drag the pointer around the window and check"), TPoint(10,20)); iGc->DrawText(_L("a line is drawn following the pointer when"), TPoint(10,40)); iGc->DrawText(_L("dragging but not when moving"), TPoint(10,60)); iGc->DrawText(_L("Press <Space> when checked"), TPoint(10,90)); break; case 1: iWin.PointerFilter(EPointerFilterMove|EPointerFilterDrag,EPointerFilterDrag); iGc->DrawText(_L("If pointer moves are supported move the pointer around the "), TPoint(10,20)); iGc->DrawText(_L("window and check a line is drawn following the pointer"), TPoint(10,40)); iGc->DrawText(_L("when it is up, and no lines are drawn when dragging"), TPoint(10,60)); iGc->DrawText(_L("Press <Esc> if moves not supported or <Space> when checked"), TPoint(10,90)); break; case 2: iWin.PointerFilter(EPointerFilterMove|EPointerFilterDrag,0); iGc->DrawText(_L("Drag and move the pointer around the window and check a"), TPoint(10,20)); iGc->DrawText(_L("line is drawn following the pointer during both dragging and"), TPoint(10,40)); iGc->DrawText(_L("moving, also check drag with the shift or control key down doesn't draw"), TPoint(10,60)); iGc->DrawText(_L("Press <Space> when checked"), TPoint(10,90)); break; } } void CPntBufWindow::NextTest() { if (iMode++==2) iTest->FinishedTests(); else SetUpState(); } void CPntBufWindow::WinKeyL(const TKeyEvent &aKey,const TTime &) { switch(aKey.iCode) { case ' ': NextTest(); break; case EKeyEscape: iTest->FinishedTests(); break; case '0': SetUpState(); break; case '1': case '2': case '3': { TInt mode=aKey.iCode-'1'; if (mode!=iMode) { iMode=mode; SetUpState(); } } break; } } void CPntBufWindow::PointerEnter(const TTime&) { if (iMode==0) iDragging=ETrue; else if (iMode==1) iDragging=EFalse; iIgnorNextPoint=ETrue; } void CPntBufWindow::PointerExit(const TTime&) {} /*CTPntBufTest*/ CTPntBufTest::CTPntBufTest() : CTestBase(_L("Scale")) {} CTPntBufTest::~CTPntBufTest() { #if defined(__WINS__) Client()->iWs.SimulateXyInputType(EXYInputPointer); #endif CTWin::Delete(iWin); } void CTPntBufTest::FinishedTests() { Request(); } void CTPntBufTest::ConstructL() { CPntBufWindow *win=new(ELeave) CPntBufWindow(this); win->SetUpLD(TPoint(0,0),Client()->iScreen->SizeInPixels(),Client()->iGroup); iWin=win; Client()->iGroup->SetCurrentWindow(iWin); #if defined(__WINS__) Client()->iWs.SimulateXyInputType(EXYInputMouse); #endif } TestState CTPntBufTest::DoTestL() { switch(iState) { case 0: LogSubTest(_L("Scale 1"),1); iState++; return(EContinue); default: return(EFinished); } // return(ENext); }