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 modifier changed message 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 CTModifiersChangedTest; sl@0: sl@0: class CMCWindow : public CTWin sl@0: { sl@0: public: sl@0: CMCWindow(CTModifiersChangedTest *aTest); sl@0: void SetUpL(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc); sl@0: void Draw(); sl@0: void DrawModSetLine(const TDesC &aDes,TInt aModifier,TInt iSettableModifiers); sl@0: protected: sl@0: CTModifiersChangedTest *iTest; sl@0: TRgb iBack; sl@0: TInt iLineHeight; sl@0: TInt iFontAscent; sl@0: TInt iYpos; sl@0: TInt iXpos1; sl@0: TInt iXpos2; sl@0: }; sl@0: sl@0: class CTEventWindowGroup : public CTWindowGroup sl@0: { sl@0: public: sl@0: CTEventWindowGroup(CTClient *aClient, CTModifiersChangedTest *iTest); sl@0: void ConstructL(); sl@0: void ModifiersChanged(const TModifiersChangedEvent &aModifiersChanged ,const TTime &aTime); sl@0: void KeyL(const TKeyEvent &aKey,const TTime &aTime); sl@0: private: sl@0: CTModifiersChangedTest *iTest; sl@0: }; sl@0: sl@0: class CTModifiersChangedTest : public CTestBase sl@0: { sl@0: public: sl@0: CTModifiersChangedTest(); sl@0: ~CTModifiersChangedTest(); sl@0: TestState DoTestL(); sl@0: void ConstructL(); sl@0: void EndTest(); sl@0: TInt SubState() const; sl@0: void IncSubState(); sl@0: void BadParams(); sl@0: void ModifierChangedEventsL(); sl@0: void SetModifiersL(); sl@0: void CheckModifierL(TEventModifier aModifier); sl@0: public: sl@0: TBool iModSetTest; sl@0: TInt iSettable; sl@0: private: sl@0: TSize iWinSize; sl@0: TInt iState; sl@0: TInt iSubState; sl@0: CTEventWindowGroup *iEventGroup; sl@0: CMCWindow *iWin; sl@0: }; sl@0: sl@0: struct TModifierChangedTestsParams sl@0: { sl@0: TText *txt; // Text message telling user what to do sl@0: TUint changed; sl@0: TUint state; sl@0: TUint stateMask; sl@0: }; sl@0: sl@0: LOCAL_D TModifierChangedTestsParams ModifierChangedTests[]={ sl@0: #if defined(__WINS__) sl@0: {(TText *)_S("Press Caps"),EModifierCapsLock,EModifierCapsLock,EModifierCapsLock}, sl@0: {(TText *)_S("Press Caps (again)"),EModifierCapsLock,0,EModifierCapsLock}, sl@0: #endif sl@0: {(TText *)_S("Press left shift"),EModifierShift|EModifierLeftShift,EModifierShift|EModifierLeftShift,EModifierShift|EModifierLeftShift}, sl@0: {(TText *)_S("Release left shift"),EModifierShift|EModifierLeftShift,0,EModifierShift|EModifierLeftShift}, sl@0: {(TText *)_S("Press right shift"),EModifierShift|EModifierRightShift,EModifierShift|EModifierRightShift,EModifierShift|EModifierRightShift}, sl@0: {(TText *)_S("Release right shift"),EModifierShift|EModifierRightShift,0,EModifierShift|EModifierRightShift}, sl@0: {(TText *)_S("Press (left) func"),EModifierFunc|EModifierLeftFunc,EModifierFunc|EModifierLeftFunc,EModifierFunc|EModifierLeftFunc}, sl@0: {(TText *)_S("Release (left) func"),EModifierFunc|EModifierLeftFunc,0,EModifierFunc|EModifierLeftFunc}, sl@0: {(TText *)_S("Press (left) control"),EModifierCtrl|EModifierLeftCtrl,EModifierCtrl|EModifierLeftCtrl,EModifierCtrl|EModifierLeftCtrl}, sl@0: {(TText *)_S("Release (left) control"),EModifierCtrl|EModifierLeftCtrl,0,EModifierCtrl|EModifierLeftCtrl}, sl@0: }; sl@0: sl@0: const TInt numTests=sizeof(ModifierChangedTests)/sizeof(ModifierChangedTests[0]); sl@0: sl@0: GLDEF_C CTestBase *CreateModifiersChangedTest() sl@0: { sl@0: return(new(ELeave) CTModifiersChangedTest()); sl@0: } sl@0: sl@0: // sl@0: // CTEventWindowGroup class // sl@0: // sl@0: sl@0: CTEventWindowGroup::CTEventWindowGroup(CTClient *aClient, CTModifiersChangedTest *aTest) : CTWindowGroup(aClient), iTest(aTest) sl@0: {} sl@0: sl@0: void CTEventWindowGroup::ConstructL() sl@0: { sl@0: CTWindowGroup::ConstructL(); sl@0: iGroupWin.EnableModifierChangedEvents(EModifierShift|EModifierLeftShift|EModifierRightShift|EModifierCapsLock| sl@0: EModifierFunc|EModifierLeftFunc|EModifierCtrl|EModifierLeftCtrl,EEventControlAlways); sl@0: } sl@0: sl@0: void CTEventWindowGroup::ModifiersChanged(const TModifiersChangedEvent &aModifiersChanged ,const TTime &) sl@0: { sl@0: TInt ss=iTest->SubState(); sl@0: TInt getMods=Client()->iWs.GetModifierState(); // Double check the mods with get mods sl@0: if (aModifiersChanged.iChangedModifiers==ModifierChangedTests[ss].changed && sl@0: (aModifiersChanged.iModifiers&ModifierChangedTests[ss].stateMask)==ModifierChangedTests[ss].state && sl@0: (getMods&ModifierChangedTests[ss].stateMask)==ModifierChangedTests[ss].state) sl@0: iTest->IncSubState(); sl@0: } sl@0: sl@0: void CTEventWindowGroup::KeyL(const TKeyEvent &aKey,const TTime &) sl@0: { sl@0: if (aKey.iCode==EKeyEscape || (aKey.iCode==' ' && iTest->iModSetTest)) sl@0: iTest->EndTest(); sl@0: } sl@0: sl@0: // sl@0: // CMCWindow, class // sl@0: // sl@0: sl@0: CMCWindow::CMCWindow(CTModifiersChangedTest *aTest) : CTWin(), iTest(aTest) sl@0: { sl@0: iBack=TRgb::Gray256(230); sl@0: } sl@0: sl@0: void CMCWindow::SetUpL(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc) sl@0: { sl@0: ConstructExtLD(*parent,pos,size); sl@0: iWin.SetBackgroundColor(iBack); sl@0: Activate(); sl@0: AssignGC(aGc); sl@0: iLineHeight=iFont->HeightInPixels()*5/4; sl@0: iFontAscent=iFont->AscentInPixels(); sl@0: iXpos1=4; sl@0: iXpos2=iXpos1+12*iFont->TextWidthInPixels(_L("M")); sl@0: } sl@0: sl@0: void CMCWindow::DrawModSetLine(const TDesC &aDes,TInt aModifier,TInt iSettableModifiers) sl@0: { sl@0: iYpos+=iLineHeight; sl@0: iGc->DrawText(aDes, TPoint(iXpos1,iYpos)); sl@0: iGc->DrawText(aModifier&iSettableModifiers ? _L("Yes"):_L("No"), TPoint(iXpos2,iYpos)); sl@0: } sl@0: sl@0: void CMCWindow::Draw() sl@0: { sl@0: iGc->Clear(); sl@0: if (iTest->iModSetTest) sl@0: { sl@0: iYpos=iFontAscent+3; sl@0: TBuf<32> buf; sl@0: buf.Format(TRefByValue(_L("Settable? [0x%4x]")), iTest->iSettable); sl@0: iGc->DrawText(_L("Modifier"), TPoint(iXpos1,iYpos)); sl@0: iGc->DrawText(buf, TPoint(iXpos2,iYpos)); sl@0: DrawModSetLine(_L("Shift"),EModifierShift,iTest->iSettable); sl@0: DrawModSetLine(_L("Left Shift"),EModifierLeftShift,iTest->iSettable); sl@0: DrawModSetLine(_L("Func"),EModifierFunc,iTest->iSettable); sl@0: DrawModSetLine(_L("Caps"),EModifierCapsLock,iTest->iSettable); sl@0: DrawModSetLine(_L("NumLock"),EModifierNumLock,iTest->iSettable); sl@0: DrawModSetLine(_L("Double Click"),EModifierDoubleClick,iTest->iSettable); sl@0: } sl@0: else sl@0: iGc->DrawText(TPtrC(ModifierChangedTests[iTest->SubState()].txt), TPoint(10,20)); sl@0: } sl@0: sl@0: // sl@0: sl@0: CTModifiersChangedTest::CTModifiersChangedTest() : CTestBase(_L("Capture Key")) sl@0: {} sl@0: sl@0: CTModifiersChangedTest::~CTModifiersChangedTest() sl@0: { sl@0: delete iWin; sl@0: delete iEventGroup; sl@0: } sl@0: sl@0: void CTModifiersChangedTest::EndTest() sl@0: { sl@0: if (iModSetTest) sl@0: { sl@0: iModSetTest=EFalse; sl@0: iWin->Invalidate(); sl@0: } sl@0: Request(); sl@0: } sl@0: sl@0: void CTModifiersChangedTest::ConstructL() sl@0: { sl@0: iWin=new(ELeave) CMCWindow(this); sl@0: iWin->SetUpL(TPoint(10,10),TSize(240,200),Client()->iGroup, *Client()->iGc); sl@0: } sl@0: sl@0: TInt CTModifiersChangedTest::SubState() const sl@0: { sl@0: return(iSubState); sl@0: } sl@0: sl@0: void CTModifiersChangedTest::IncSubState() sl@0: { sl@0: if (iSubState==(numTests-1)) sl@0: EndTest(); sl@0: else sl@0: { sl@0: iSubState++; sl@0: iWin->Invalidate(); sl@0: } sl@0: } sl@0: sl@0: void CTModifiersChangedTest::BadParams() sl@0: { sl@0: } sl@0: sl@0: void CTModifiersChangedTest::ModifierChangedEventsL() sl@0: { sl@0: iEventGroup=new(ELeave) CTEventWindowGroup(Client(), this); sl@0: iEventGroup->ConstructL(); sl@0: } sl@0: sl@0: void CTModifiersChangedTest::CheckModifierL(TEventModifier aModifier) sl@0: { sl@0: TInt oldMods=Client()->iWs.GetModifierState(); sl@0: Client()->iWs.SetModifierState(aModifier, EToggleModifier); sl@0: TInt getMods=Client()->iWs.GetModifierState(); sl@0: if (oldMods!=getMods) sl@0: { sl@0: iSettable|=aModifier; sl@0: Client()->iWs.SetModifierState(aModifier, ETurnOffModifier); sl@0: getMods=Client()->iWs.GetModifierState(); sl@0: TestL(!(getMods&aModifier)); sl@0: Client()->iWs.SetModifierState(aModifier, ETurnOnModifier); sl@0: getMods=Client()->iWs.GetModifierState(); sl@0: TestL(getMods&aModifier); sl@0: Client()->iWs.SetModifierState(aModifier, ETurnOffModifier); sl@0: getMods=Client()->iWs.GetModifierState(); sl@0: TestL(!(getMods&aModifier)); sl@0: if (oldMods&aModifier) sl@0: Client()->iWs.SetModifierState(aModifier, ETurnOnModifier); sl@0: } sl@0: else sl@0: { sl@0: Client()->iWs.SetModifierState(aModifier, ETurnOffModifier); sl@0: TestL(oldMods==Client()->iWs.GetModifierState()); sl@0: Client()->iWs.SetModifierState(aModifier, ETurnOnModifier); sl@0: TestL(oldMods==Client()->iWs.GetModifierState()); sl@0: } sl@0: } sl@0: sl@0: void CTModifiersChangedTest::SetModifiersL() sl@0: { sl@0: iModSetTest=ETrue; sl@0: for(TInt mod=1;mod!=0;mod<<=1) sl@0: CheckModifierL((TEventModifier)mod); sl@0: iWin->Invalidate(); sl@0: Client()->iWs.Flush(); sl@0: } sl@0: sl@0: TestState CTModifiersChangedTest::DoTestL() sl@0: { sl@0: switch(iState) sl@0: { sl@0: case 0: //The first 2 tests have been converted to TAuto test code. sl@0: ModifierChangedEventsL(); sl@0: /* iState++; sl@0: return(EContinue); sl@0: case 1: sl@0: LogSubTest(_L("Errors"),1); sl@0: BadParams(); sl@0: break; sl@0: case 2:*/ sl@0: LogSubTest(_L("Set modifiers"),1); sl@0: SetModifiersL(); sl@0: iState++; sl@0: return(EContinue); sl@0: default: sl@0: return(EFinished); sl@0: } sl@0: //iState++; sl@0: //return(ENext); sl@0: }