// 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);
}