--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/tman/TMPNTCAP.CPP Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,856 @@
+// 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 capture
+//
+//
+
+#include <e32std.h>
+#include <e32svr.h>
+#include "W32STD.H"
+#include "../tlib/testbase.h"
+#include "TMAN.H"
+
+enum TTestState
+ {
+ ECaptureDisabled,
+ ENormalCapture,
+ ECaptureAllGroups,
+ EDragDropCapture,
+ EDragDropCaptureAllGroups,
+ ENormalCaptureWithoutFocus,
+ };
+
+enum TTestSubState
+ {
+ EMainWindow,
+ EChildWindow,
+ EOtherGroup,
+ EOtherSession,
+ ERootWindow,
+ };
+
+enum TPointerCheckRet
+ {
+ EFailed,
+ EOkay,
+ ENeedsDDEvent,
+ };
+
+const TInt ESubStates1=2;
+const TInt ESubStates2=5;
+const TInt ESubStates3=5;
+const TInt ESubStates4=5;
+const TInt ESubStates5=5;
+const TInt ESubStates6=5;
+
+const TInt EWinBorderSize=10;
+
+class CPcWindowBase;
+class TPointerCaptureTest;
+
+class CPcConnection : public CTClient
+ {
+public:
+ CPcConnection(TPointerCaptureTest *aTest);
+ ~CPcConnection();
+ virtual void ConstructL();
+protected:
+ TPointerCaptureTest *iTest;
+ };
+
+class CPcWindowBase : public CTWin
+ {
+public:
+ CPcWindowBase(TPointerCaptureTest *aTest);
+ void SetUpL(TPoint pos,TSize size,CTWinBase *parent);
+ void SetUpL(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc);
+ void Draw(TDesC &aBuf);
+ void PointerL(const TPointerEvent &pointer,const TTime &);
+ void DragDropL(const TPointerEvent &pointer,const TTime &);
+ virtual TPointerCheckRet PointerDown()=0;
+ virtual TPointerCheckRet DragDrop()=0;
+ virtual void SubStateChanged();
+protected:
+ TPointerCaptureTest *iTest;
+ TRgb iBack;
+ };
+
+class CPcWindowChild : public CPcWindowBase
+ {
+public:
+ CPcWindowChild(TPointerCaptureTest *aTest);
+ void Draw();
+ TPointerCheckRet PointerDown();
+ TPointerCheckRet DragDrop();
+ };
+
+class CPcWindowMain : public CPcWindowBase
+ {
+public:
+ CPcWindowMain(TPointerCaptureTest *aTest);
+ void Draw();
+ TPointerCheckRet PointerDown();
+ TPointerCheckRet DragDrop();
+ void WinKeyL(const TKeyEvent &aKey,const TTime &aTime);
+ };
+
+class CPcWindowAltGroup : public CPcWindowBase
+ {
+public:
+ CPcWindowAltGroup(TPointerCaptureTest *aTest);
+ void Draw();
+ TPointerCheckRet PointerDown();
+ TPointerCheckRet DragDrop();
+ };
+
+class CPcWindowNickFocusGroup : public CTWindowGroup
+ {
+public:
+ CPcWindowNickFocusGroup(TPointerCaptureTest *aTest, CTClient *aClient);
+ void KeyL(const TKeyEvent &aKey,const TTime &aTime);
+private:
+ TPointerCaptureTest *iTest;
+ };
+
+class CPcWindowAltConnection : public CPcWindowBase
+ {
+public:
+ CPcWindowAltConnection(TPointerCaptureTest *aTest);
+ void Draw();
+ TPointerCheckRet PointerDown();
+ TPointerCheckRet DragDrop();
+ };
+
+class TPointerCaptureTest : public CTestBase
+ {
+private:
+ enum TDState {DDStateNull, DDStateGot, DDStateWaiting};
+public:
+ TPointerCaptureTest();
+ ~TPointerCaptureTest();
+ TestState DoTestL();
+ void ConstructL();
+ void NextTest();
+ void AbortTests();
+ TInt State() const;
+ TInt SubState() const;
+ void doIncSubState();
+ void IncSubState(TBool aNeedsDD=EFalse);
+ void GotDD();
+ void StateChanged();
+ void TestFailed();
+ void NickFocusL();
+ void SetCapture(TInt aCaptureFlags);
+ void RestartTest();
+private:
+ TInt doTestFailedL();
+private:
+ CPcConnection *iAltConnection;
+ CTWindowGroup *iMainGroup;
+ CTWindowGroup *iAltGroup;
+ CPcWindowChild *iChildWin;
+ CPcWindowMain *iMainWin;
+ CPcWindowAltGroup *iAltGroupWin;
+ CPcWindowAltConnection *iAltConnectionWin;
+ CPcWindowNickFocusGroup *iNickFocusGroup;
+ CTBlankWindow *iNickFocusBlankWin;
+ TInt iState;
+ TInt iSubState;
+ TDState iDDState;
+public:
+ TBool iFailed;
+ };
+
+GLDEF_C CTestBase *CreatePointerCaptureTest()
+ {
+ return(new(ELeave) TPointerCaptureTest());
+ }
+
+//
+// CMcConnection
+
+CPcConnection::CPcConnection(TPointerCaptureTest *aTest) : iTest(aTest)
+ {
+ }
+
+CPcConnection::~CPcConnection()
+ {
+ }
+
+void CPcConnection::ConstructL()
+ {
+ CTClient::ConstructL();
+ iGroup=new(ELeave) CTWindowGroup(this);
+ iGroup->ConstructL();
+ iGroup->GroupWin()->SetOrdinalPosition(0,1);
+ iGroup->GroupWin()->EnableReceiptOfFocus(EFalse);
+ iWs.Flush();
+ }
+
+//
+// CPcWindow, base class //
+//
+
+CPcWindowBase::CPcWindowBase(TPointerCaptureTest *aTest) : CTWin(), iTest(aTest)
+ {
+ }
+
+void CPcWindowBase::SetUpL(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc)
+ {
+ ConstructExtLD(*parent,pos,size);
+ iWin.SetBackgroundColor(iBack);
+ Activate();
+ AssignGC(aGc);
+ }
+
+void CPcWindowBase::SetUpL(TPoint pos,TSize size,CTWinBase *parent)
+ {
+ SetUpL(pos,size,parent,*iTest->Client()->iGc);
+ }
+
+void CPcWindowBase::SubStateChanged()
+ {
+ iWin.Invalidate();
+ Client()->iWs.Flush();
+ }
+
+void CPcWindowBase::Draw(TDesC &aBuf)
+ {
+ iGc->Clear();
+ iGc->SetPenColor(iBack.Gray4()>1 ? TRgb(0,0,0) : TRgb(255,255,255));
+ iGc->DrawText(aBuf, TPoint(10,20));
+ }
+
+void CPcWindowBase::PointerL(const TPointerEvent &pointer,const TTime &)
+ {
+ if (pointer.iType==TPointerEvent::EButton1Down && !iTest->iFailed)
+ {
+ if (iTest->SubState()==ERootWindow) // Root window click, must not be inside this window
+ {
+ if (TRect(Size()).Contains(pointer.iPosition))
+ {
+ iTest->TestFailed();
+ return;
+ }
+ }
+ TInt ret;
+ if ((ret=PointerDown())==EFailed)
+ iTest->TestFailed();
+ else
+ iTest->IncSubState(ret==ENeedsDDEvent);
+ }
+ }
+
+void CPcWindowBase::DragDropL(const TPointerEvent &pointer,const TTime &)
+ {
+ switch(iTest->State())
+ {
+ case ECaptureDisabled:
+ case ENormalCapture:
+ case ECaptureAllGroups:
+ case ENormalCaptureWithoutFocus:
+ iTest->TestFailed();
+ break;
+ }
+ if (pointer.iType==TPointerEvent::EButton1Down && !iTest->iFailed)
+ {
+ if (DragDrop()==EFailed)
+ iTest->TestFailed();
+ else
+ iTest->GotDD();
+ }
+ }
+//
+
+CPcWindowMain::CPcWindowMain(TPointerCaptureTest *aTest) : CPcWindowBase(aTest)
+ {
+ iBack=TRgb::Gray256(236);
+ }
+
+TPointerCheckRet CPcWindowMain::PointerDown()
+ {
+ switch(iTest->State())
+ {
+ case ECaptureDisabled:
+ if (iTest->SubState()==EMainWindow)
+ return(EOkay);
+ break;
+ case ENormalCapture:
+ switch(iTest->SubState())
+ {
+ case EMainWindow:
+ case ERootWindow:
+ return(EOkay);
+ default:
+ break;
+ }
+ break;
+ case ECaptureAllGroups:
+ switch(iTest->SubState())
+ {
+ case EMainWindow:
+ case EOtherGroup:
+ case EOtherSession:
+ case ERootWindow:
+ return(EOkay);
+ default:
+ break;
+ }
+ break;
+ case EDragDropCapture:
+ switch(iTest->SubState())
+ {
+ case EMainWindow:
+ return(ENeedsDDEvent);
+ case ERootWindow:
+ return(EOkay);
+ default:
+ break;
+ }
+ break;
+ case EDragDropCaptureAllGroups:
+ switch(iTest->SubState())
+ {
+ case EMainWindow:
+ case EOtherGroup:
+ case EOtherSession:
+ return(ENeedsDDEvent);
+ case ERootWindow:
+ return(EOkay);
+ default:
+ break;
+ }
+ break;
+ case ENormalCaptureWithoutFocus:
+ switch(iTest->SubState())
+ {
+ case EMainWindow:
+ return(EOkay);
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ return(EFailed);
+ }
+
+TPointerCheckRet CPcWindowMain::DragDrop()
+ {
+ switch(iTest->State())
+ {
+ case EDragDropCapture:
+ case EDragDropCaptureAllGroups:
+ switch(iTest->SubState())
+ {
+ case EMainWindow:
+ return(EOkay);
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ return(EFailed);
+ }
+
+void CPcWindowMain::Draw()
+ {
+ TBuf<0x40> buf;
+ if (iTest->State()==ECaptureDisabled)
+ {
+ switch(iTest->SubState())
+ {
+ case EMainWindow:
+ buf.Copy(_L("Click on me"));
+ break;
+ }
+ }
+ else
+ {
+ switch(iTest->SubState())
+ {
+ case EMainWindow:
+ buf.Copy(_L("Click on me"));
+ break;
+ case EChildWindow:
+ case EOtherGroup:
+ case EOtherSession:
+ break;
+ case ERootWindow:
+ if (iTest->State()==ENormalCaptureWithoutFocus)
+ buf.Copy(_L("Click on the root window, then press <Escape>"));
+ else
+ buf.Copy(_L("Click on the root window"));
+ break;
+ }
+ }
+ CPcWindowBase::Draw(buf);
+ }
+
+void CPcWindowMain::WinKeyL(const TKeyEvent &aKey,const TTime &)
+ {
+ switch(aKey.iCode)
+ {
+ case EKeyEscape:
+ iTest->AbortTests();
+ break;
+ }
+ }
+
+//
+
+CPcWindowChild::CPcWindowChild(TPointerCaptureTest *aTest) : CPcWindowBase(aTest)
+ {
+ iBack=TRgb::Gray256(85);
+ }
+
+TPointerCheckRet CPcWindowChild::PointerDown()
+ {
+ switch(iTest->State())
+ {
+ case ECaptureDisabled:
+ break;
+ default:
+ switch(iTest->SubState())
+ {
+ case EChildWindow:
+ return(EOkay);
+ default:
+ break;
+ }
+ break;
+ }
+ return(EFailed);
+ }
+
+TPointerCheckRet CPcWindowChild::DragDrop()
+ {
+ switch(iTest->State())
+ {
+ case EDragDropCapture:
+ case EDragDropCaptureAllGroups:
+ switch(iTest->SubState())
+ {
+ case EChildWindow:
+ return(EOkay);
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ return(EFailed);
+ }
+
+void CPcWindowChild::Draw()
+ {
+ TBuf<0x40> buf;
+ if (iTest->State()!=ECaptureDisabled)
+ {
+ switch(iTest->SubState())
+ {
+ case EChildWindow:
+ buf.Copy(_L("Click on me"));
+ break;
+ default:
+ break;
+ }
+ }
+ CPcWindowBase::Draw(buf);
+ }
+
+//
+
+CPcWindowNickFocusGroup::CPcWindowNickFocusGroup(TPointerCaptureTest *aTest, CTClient *aClient) : CTWindowGroup(aClient), iTest(aTest)
+ {
+ }
+
+void CPcWindowNickFocusGroup::KeyL(const TKeyEvent &aKey,const TTime &)
+ {
+ if (aKey.iCode==EKeyEscape)
+ iTest->IncSubState(EFalse);
+ }
+
+//
+
+CPcWindowAltGroup::CPcWindowAltGroup(TPointerCaptureTest *aTest) : CPcWindowBase(aTest)
+ {
+ iBack=TRgb::Gray256(236);
+ }
+
+TPointerCheckRet CPcWindowAltGroup::PointerDown()
+ {
+ switch(iTest->State())
+ {
+ case ECaptureDisabled:
+ if (iTest->SubState()==EChildWindow)
+ return(EOkay);
+ break;
+ case ENormalCapture:
+ case EDragDropCapture:
+ case ENormalCaptureWithoutFocus:
+ switch(iTest->SubState())
+ {
+ case EOtherGroup:
+ return(EOkay);
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ return(EFailed);
+ }
+
+TPointerCheckRet CPcWindowAltGroup::DragDrop()
+ {
+ switch(iTest->State())
+ {
+ case EDragDropCapture:
+ case EDragDropCaptureAllGroups:
+ switch(iTest->SubState())
+ {
+ case EOtherGroup:
+ return(EOkay);
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ return(EFailed);
+ }
+
+void CPcWindowAltGroup::Draw()
+ {
+ TBuf<0x40> buf;
+ if (iTest->State()==ECaptureDisabled)
+ {
+ switch(iTest->SubState())
+ {
+ case EMainWindow:
+ break;
+ case EChildWindow:
+ buf.Copy(_L("Click on me"));
+ break;
+ }
+ }
+ else
+ {
+ switch(iTest->SubState())
+ {
+ case EOtherGroup:
+ buf.Copy(_L("Click on me"));
+ break;
+ default:
+ break;
+ }
+ }
+ CPcWindowBase::Draw(buf);
+ }
+
+//
+
+CPcWindowAltConnection::CPcWindowAltConnection(TPointerCaptureTest *aTest) : CPcWindowBase(aTest)
+ {
+ iBack=TRgb::Gray256(236);
+ }
+
+TPointerCheckRet CPcWindowAltConnection::PointerDown()
+ {
+ switch(iTest->State())
+ {
+ case ECaptureDisabled:
+ if (iTest->SubState()==EChildWindow)
+ return(EOkay);
+ break;
+ case ENormalCapture:
+ case EDragDropCapture:
+ case ENormalCaptureWithoutFocus:
+ switch(iTest->SubState())
+ {
+ case EOtherSession:
+ return(EOkay);
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ return(EFailed);
+ }
+
+TPointerCheckRet CPcWindowAltConnection::DragDrop()
+ {
+ switch(iTest->State())
+ {
+ case EDragDropCapture:
+ case EDragDropCaptureAllGroups:
+ switch(iTest->SubState())
+ {
+ case EOtherSession:
+ return(EOkay);
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ return(EFailed);
+ }
+
+void CPcWindowAltConnection::Draw()
+ {
+ TBuf<0x40> buf;
+ if (iTest->State()!=ECaptureDisabled)
+ {
+ switch(iTest->SubState())
+ {
+ case EOtherSession:
+ buf.Copy(_L("Click on me"));
+ break;
+ default:
+ break;
+ }
+ }
+ CPcWindowBase::Draw(buf);
+ }
+
+//
+
+TPointerCaptureTest::TPointerCaptureTest() : CTestBase(_L("Pointer Capture"))
+ {}
+
+TPointerCaptureTest::~TPointerCaptureTest()
+ {
+ delete iNickFocusBlankWin;
+ delete iNickFocusGroup;
+ delete iAltConnectionWin;
+ delete iAltConnection;
+ delete iChildWin;
+ delete iMainWin;
+ delete iMainGroup;
+ delete iAltGroupWin;
+ delete iAltGroup;
+ }
+
+void TPointerCaptureTest::TestFailed()
+ {
+ __ASSERT_DEBUG(iFailed==EFalse,TManPanic(ETManPanicPcFailed));
+ iFailed=ETrue;
+ Client()->iGroup->GroupWin()->SetOrdinalPosition(0,10); // Put error dialog on top of test windows
+ TInt dRet=1;
+ TRAPD(err,dRet=doTestFailedL());
+ Client()->iGroup->GroupWin()->SetOrdinalPosition(0,0);
+ switch(dRet)
+ {
+ case 0:
+ RestartTest();
+ break;
+ case 1:
+ TRAP(err,TestL(EFalse));
+ break;
+ }
+ }
+
+TInt TPointerCaptureTest::doTestFailedL()
+ {
+ CTDialog *dialog=new(ELeave) CTDialog();
+ dialog->SetTitle(_L("Pointer capture test failed"));
+ dialog->SetNumButtons(2);
+ dialog->SetButtonText(0,_L("Retest"));
+ dialog->SetButtonText(1,_L("Fail"));
+ dialog->ConstructLD(*Client()->iGroup,*Client()->iGc);
+ return dialog->Display();
+ }
+
+TInt TPointerCaptureTest::State() const
+ {
+ return(iState);
+ }
+
+TInt TPointerCaptureTest::SubState() const
+ {
+ return(iSubState);
+ }
+
+void TPointerCaptureTest::doIncSubState()
+ {
+ iSubState++;
+ TInt max=0;
+ switch(iState)
+ {
+ case ECaptureDisabled:
+ max=ESubStates1;
+ break;
+ case ENormalCapture:
+ max=ESubStates2;
+ break;
+ case ECaptureAllGroups:
+ max=ESubStates3;
+ break;
+ case EDragDropCapture:
+ max=ESubStates4;
+ break;
+ case EDragDropCaptureAllGroups:
+ max=ESubStates5;
+ break;
+ case ENormalCaptureWithoutFocus:
+ max=ESubStates6;
+ break;
+ }
+ if (iSubState==max)
+ NextTest();
+ StateChanged();
+ }
+
+void TPointerCaptureTest::GotDD()
+ {
+ if (iDDState==DDStateWaiting)
+ doIncSubState();
+ else
+ iDDState=DDStateGot;
+ }
+
+void TPointerCaptureTest::IncSubState(TBool aNeedsDD)
+ {
+ if (!aNeedsDD)
+ {
+ if (iDDState!=DDStateNull)
+ TestFailed();
+ else
+ doIncSubState();
+ }
+ else if (iDDState==DDStateGot)
+ doIncSubState();
+ else
+ iDDState=DDStateWaiting;
+ }
+
+void TPointerCaptureTest::StateChanged()
+ {
+ iDDState=DDStateNull;
+ iChildWin->SubStateChanged();
+ iMainWin->SubStateChanged();
+ iAltGroupWin->SubStateChanged();
+ iAltConnectionWin->SubStateChanged();
+ }
+
+void TPointerCaptureTest::AbortTests()
+ {
+ iState=99;
+ Request();
+ }
+
+void TPointerCaptureTest::NextTest()
+ {
+ iState++;
+ Request();
+ }
+
+void TPointerCaptureTest::RestartTest()
+ {
+ Request();
+ }
+
+void TPointerCaptureTest::ConstructL()
+ {
+ TSize size(Client()->iGroup->Size());
+ TInt winWidth2=size.iWidth/2-EWinBorderSize*2;
+ TInt winWidth4=size.iWidth/4-EWinBorderSize*2;
+ TInt winHeight=size.iHeight/2-EWinBorderSize*2;
+//
+ iMainGroup=new(ELeave) CTWindowGroup(Client());
+ iMainGroup->ConstructL();
+ iMainGroup->GroupWin()->SetOrdinalPosition(0,1);
+ iMainWin=new(ELeave) CPcWindowMain(this);
+ iMainWin->SetUpL(TPoint(EWinBorderSize,EWinBorderSize) ,TSize(winWidth2,winHeight) ,iMainGroup);
+ iMainGroup->SetCurrentWindow(iMainWin);
+ iChildWin=new(ELeave) CPcWindowChild(this);
+ iChildWin->SetUpL(TPoint(0,winHeight/2) ,TSize(winWidth2,winHeight/2) ,iMainWin);
+//
+ iAltGroup=new(ELeave) CTWindowGroup(Client());
+ iAltGroup->ConstructL();
+ iAltGroup->GroupWin()->SetOrdinalPosition(0,1);
+ iAltGroup->GroupWin()->EnableReceiptOfFocus(EFalse);
+ iAltGroupWin=new(ELeave) CPcWindowAltGroup(this);
+ iAltGroupWin->SetUpL(TPoint(size.iWidth/2+EWinBorderSize,EWinBorderSize) ,TSize(winWidth4,winHeight) ,iAltGroup);
+//
+ iAltConnection=new(ELeave) CPcConnection(this);
+ iAltConnection->ConstructL();
+ iAltConnectionWin=new(ELeave) CPcWindowAltConnection(this);
+ iAltConnectionWin->SetUpL(TPoint(size.iWidth/4*3+EWinBorderSize,EWinBorderSize) ,TSize(winWidth4,winHeight),iAltConnection->iGroup,*iAltConnection->iGc);
+ }
+
+void TPointerCaptureTest::NickFocusL()
+ {
+ iNickFocusGroup=new(ELeave) CPcWindowNickFocusGroup(this,Client());
+ iNickFocusGroup->ConstructL();
+ iNickFocusGroup->GroupWin()->SetOrdinalPosition(0,2);
+ iNickFocusBlankWin=new(ELeave) CTBlankWindow();
+ iNickFocusBlankWin->ConstructL(*iNickFocusGroup);
+ iNickFocusBlankWin->SetSize(TSize(1,1));
+ iNickFocusBlankWin->Activate();
+ }
+
+void TPointerCaptureTest::SetCapture(TInt aCaptureFlags)
+ {
+ iMainWin->Win()->SetPointerCapture(aCaptureFlags);
+ }
+
+TestState TPointerCaptureTest::DoTestL()
+ {
+ iSubState=0;
+ iFailed=EFalse;
+ StateChanged();
+ switch(iState)
+ {
+ case ECaptureDisabled:
+ LogSubTest(_L("No capture"),1);
+ SetCapture(RWindowBase::TCaptureDisabled);
+ break;
+ case ENormalCapture:
+ LogSubTest(_L("Normal capture"),1);
+ SetCapture(RWindowBase::TCaptureEnabled);
+ break;
+ case ECaptureAllGroups:
+ LogSubTest(_L("All groups"),1);
+ SetCapture(RWindowBase::TCaptureEnabled|RWindowBase::TCaptureFlagAllGroups);
+ break;
+ case EDragDropCapture:
+ LogSubTest(_L("Drag & Drop"),1);
+ SetCapture(RWindowBase::TCaptureDragDrop&~RWindowBase::TCaptureFlagAllGroups);
+ break;
+ case EDragDropCaptureAllGroups:
+ LogSubTest(_L("Drag & Drop All groups"),1);
+ SetCapture(RWindowBase::TCaptureDragDrop);
+ break;
+ case ENormalCaptureWithoutFocus:
+ LogSubTest(_L("Without focus"),1);
+ NickFocusL();
+ SetCapture(RWindowBase::TCaptureEnabled);
+ break;
+ default:
+ return(EFinished);
+ }
+ return(EContinue);
+ }