diff -r 000000000000 -r 2f259fa3e83a lafagnosticuifoundation/cone/tef/TMENU0STEP.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lafagnosticuifoundation/cone/tef/TMENU0STEP.CPP Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,634 @@ +// Copyright (c) 2005-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: +// + +/** + @file + @internalComponent - Internal Symbian test code +*/ + + +#include +#include +#include +#include +#include +#include "TMenu0Step.h" + + + +// +// class CTestMenu +// + +/** The method is an override from CCoeControl.\n + The function is called to handle key events.\n + The only thing that is handled is if the control key\n + was pressed together with another key.\n +*/ +TKeyResponse CTestMenu::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType) + { + if (aType==EEventKey) + { + TInt modifiers=aKeyEvent.iModifiers; + TInt code=aKeyEvent.iCode; + if ((modifiers&EAllStdModifiers)==EModifierCtrl) + { + iObserver->MenuSelectionMadeL(code); + return(EKeyWasConsumed); + } + } + return(EKeyWasNotConsumed); + } + +// +// class CMessageControl +// + +/** + Second phase constructor for CMessageControl.\n + Creates a control's window.\n + The created window is the child of the application's window group.\n + Sets a Font and display a message.\n + */ +void CMessageControl::ConstructL() + { + CreateWindowL(); + SetExtent(TPoint(20,20),TSize(600,200)); + TFontSpec spec(_L("Arial"),220); + SetFontL(spec); + ActivateL(); + } + +/** + Destructor for the CMessageControl class.\n + Calls the ReleaseScreenFont API of CCoeEnv to free all resources used by the font.\n + + */ +CMessageControl::~CMessageControl() + { + iCoeEnv->ReleaseScreenFont(iFont); + } + +/** + Auxiliary Function to a set a new font.\n + */ +void CMessageControl::SetFontL(const TFontSpec& aFontSpec) + { + CFbsFont* font=iCoeEnv->CreateScreenFontL(aFontSpec); + iCoeEnv->ReleaseScreenFont(iFont); // after previous line succeeds + iFont=font; + iFontSpec=aFontSpec; + } + +/** + Auxiliary Function to change the font style.\n + */ +void CMessageControl::ToggleFontStyleL(TMessageControlFontStyle aStyleElement) + { + TFontSpec spec=iFontSpec; + TBool doSet=EFalse; + switch (aStyleElement) + { + case EStyleElementBold: + spec.iFontStyle.SetStrokeWeight(spec.iFontStyle.StrokeWeight()? EStrokeWeightNormal: EStrokeWeightBold); + doSet=ETrue; + break; + case EStyleElementItalic: + spec.iFontStyle.SetPosture(spec.iFontStyle.Posture()? EPostureUpright: EPostureItalic); + doSet=ETrue; + break; + case EStyleElementUnderline: + iFontUnderline=(iFontUnderline? EUnderlineOff: EUnderlineOn); + break; + case EStyleElementStrikethrough: + iFontStrikethrough=(iFontStrikethrough? EStrikethroughOff: EStrikethroughOn); + } + if (doSet) + SetFontL(spec); // otherwise change effective at Draw time + } + +/** + Auxiliary Function to handle Pointer events.\n + Just logs that a pointer events has happend and redraws the window.\n + */ +void CMessageControl::HandlePointerEventL(const TPointerEvent& aPointerEvent) + { + iMessage.Format(_L("Pointer event %d at (%d,%d)"),aPointerEvent.iType,aPointerEvent.iPosition.iX,aPointerEvent.iPosition.iY); + DrawMessageNow(); + } + +/** + Responds to focus change.\n + This function is called whenever a control gains or loses focus\n + as a result of a call to SetFocus().\n + */ +void CMessageControl::FocusChanged(TDrawNow aDrawNow) + { + if (aDrawNow) + { + ActivateGc(); + DrawBorder(); + DeactivateGc(); + } + } + +/** + Draws a border around the window CMessageControl owns.\n + */ +void CMessageControl::DrawBorder() const + { + CWindowGc& gc=SystemGc(); + TRect rect=Rect(); + gc.DrawRect(rect); + if (!IsFocused()) + gc.SetPenColor(KRgbWhite); + rect.Shrink(1,1); + gc.DrawRect(rect); + rect.Shrink(1,1); + gc.DrawRect(rect); + } + +/** + Draws border and display a message in the window CMessageControl owns.\n + */ +void CMessageControl::Draw(const TRect& /*aRect*/) const + { + DrawBorder(); + DrawMessage(); + } + +/** + Displays a message stored in iMessage centered both vertically and horisontally.\n + */ +void CMessageControl::DrawMessage() const + { + TRect rect=Rect(); + rect.Shrink(3,3); + TInt ascent=(rect.iBr.iY-rect.iTl.iY-iFont->HeightInPixels())/2 + iFont->AscentInPixels(); + CWindowGc& gc=SystemGc(); + gc.SetPenColor(KRgbBlack); + gc.UseFont(iFont); + if (iFontUnderline) + gc.SetUnderlineStyle(iFontUnderline); + if (iFontStrikethrough) + gc.SetStrikethroughStyle(iFontStrikethrough); + gc.SetBrushStyle(CGraphicsContext::ESolidBrush); + gc.DrawText(iMessage,rect,ascent,CGraphicsContext::ECenter); + } + +/** + Displays a message stored in iMessage, centered both vertically and horisontally.\n + Draw the message as soon as possible.\n + */ +void CMessageControl::DrawMessageNow() const + { + ActivateGc(); + DrawMessage(); + DeactivateGc(); + } + +/** + Changed the message displayed in the window.\n + */ +void CMessageControl::SetMessage(const TDesC& aMessage) + { + iMessage=aMessage; + DrawMessageNow(); + } + +/** + The method is an override from CCoeControl.\n + The function is called to handle the key events. It handles the following key events.\n + 1. Shift + KeyLeft Arrow Key Event.\n + 2. Shift + KeyRight Arrow Key Event.\n + 3. Shift + KeyDown Arrow Key Event.\n + 4. Shift + KeyUp Arrow Key Event.\n + */ +TKeyResponse CMessageControl::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType) + { + if (aType!=EEventKey) + return(EKeyWasConsumed); + TInt modifiers=aKeyEvent.iModifiers; + TInt code=aKeyEvent.iCode; + iMessage.Format(_L("Key 0x%x, modifier 0x%x"),code,modifiers); + DrawMessageNow(); + if ((modifiers&EAllStdModifiers)==(EModifierShift)) + { + TPoint pos=Position(); + switch (code) + { + case EKeyLeftArrow: + pos.iX--; + break; + case EKeyRightArrow: + pos.iX++; + break; + case EKeyUpArrow: + pos.iY--; + break; + case EKeyDownArrow: + pos.iY++; + break; + default: + break; + } + if (pos != Position()) + { + SetPosition(pos); + } + } + return(EKeyWasConsumed); + } + +// +// class CTestMenu0AppUi +// + +/** + Constructor of CTestMenu0AppUi.\n + Initializes the base constructor CTestCoeAppUi.\n + */ +CTestMenu0AppUi::CTestMenu0AppUi(CTmsTestStep* aStep) : + CTestCoeAppUi(aStep) + {} + + +/** + Destructor of CTestMenu0AppUi.\n + Removes the two controls from Cone's control stack and deletes them.\n + */ +CTestMenu0AppUi::~CTestMenu0AppUi() + { + RemoveFromStack(iMessageControl); + delete(iMessageControl); + RemoveFromStack(iMenu); + delete(iMenu); + } + +/** + @SYMTestCaseID UIF-TMenu0Step-ToggleBoldL + + @SYMPREQ PREQ0000 + + @SYMTestPriority High + + @SYMTestStatus Implemented + + @SYMTestActions Tests that it is possible to toggle text to bold. + + SYMTestExpectedResult The font toggles to bold. + + @SYMTestType CIT + + */ +void CTestMenu0AppUi::ToggleBoldL() + { + iMessageControl->ToggleFontStyleL(EStyleElementBold); + } + +/** + @SYMTestCaseID UIF-TMenu0Step-ToggleItalicL + + @SYMPREQ PREQ0000 + + @SYMTestPriority High + + @SYMTestStatus Implemented + + @SYMTestActions Tests that it is possible to toggle text to Italic. + + @SYMTestExpectedResults The font toggles to Italic. + + @SYMTestType CIT + + */ +void CTestMenu0AppUi::ToggleItalicL() + { + iMessageControl->ToggleFontStyleL(EStyleElementItalic); + } + +/** + @SYMTestCaseID UIF-TMenu0Step-ToggleUnderlineL + + @SYMPREQ PREQ0000 + + @SYMTestPriority High + + @SYMTestStatus Implemented + + @SYMTestActions Test that it is possible to make text underlined. + + @SYMTestExpectedResults The font is underlined. + + @SYMTestType CIT + + */ +void CTestMenu0AppUi::ToggleUnderlineL() + { + iMessageControl->ToggleFontStyleL(EStyleElementUnderline); + } + +/** + @SYMTestCaseID UIF-TMenu0Step-ToggleStrikethroughL + + @SYMPREQ PREQ0000 + + @SYMTestPriority High + + @SYMTestStatus Implemented + + @SYMTestActions Test that it is possible to make text striked through. + + @SYMTestExpectedResults The font becomes striked through. + + @SYMTestType CIT + + */ +void CTestMenu0AppUi::ToggleStrikethroughL() + { + iMessageControl->ToggleFontStyleL(EStyleElementStrikethrough); + } + +/** + Sends a text message to all windows in the window group TMenu1GroupName.\n + Leaves if it failes.\n + */ +void CTestMenu0AppUi::SendMessageL(const TDesC8& aTextMsg) + { + RWsSession& wsSession=iCoeEnv->WsSession(); + TInt wgId=wsSession.FindWindowGroupIdentifier(0,TMenu1GroupName,0); + if (wgId>0) + User::LeaveIfError(wsSession.SendMessageToWindowGroup(wgId,KNullUid,aTextMsg)); + else + iMessageControl->SetMessage(_L("TMenu1 is not running")); + } + +/** + Handles application specific events.\n + In this case whether it was possible or not to add/remove a window.\n + A message about the number of windows in the group is also handled.\n + + */ +void CTestMenu0AppUi::HandleApplicationSpecificEventL(TInt aType,const TWsEvent& aEvent) + { + switch (aType) + { + case EReplyWindowAdded: + iMessageControl->SetMessage(_L("Window added")); + return; + case EReplyFailedToAddWindow: + iMessageControl->SetMessage(_L("Failed to add window")); + return; + case EReplyWindowRemoved: + iMessageControl->SetMessage(_L("Window removed")); + return; + case EReplyNoWindowToRemove: + iMessageControl->SetMessage(_L("No window to remove")); + return; + case EReplyWindowsCounted: + TBuf<40> message; + message.Format(_L("Number of windows: %d"),*(TInt*)aEvent.EventData()); + iMessageControl->SetMessage(message); + break; + } + } + +/** + Sends an event to all windows in window group TMenu1GroupName\n + + */ +void CTestMenu0AppUi::SendAsiMessageL(TMenuAsiEventSend aEvent) + { + RWsSession& wsSession=iCoeEnv->WsSession(); + TInt wgId=wsSession.FindWindowGroupIdentifier(0,TMenu1GroupName); + if (wgId<=0) + { + iMessageControl->SetMessage(_L("TMenu1 is not running")); + return; + } + TWsEvent wsEvent; + wsEvent.SetType(aEvent); + *(TInt*)wsEvent.EventData()=iCoeEnv->RootWin().Identifier(); + User::LeaveIfError(wsSession.SendEventToWindowGroup(wgId,wsEvent)); + } + +/** + Simulates different menu selections.\n + + */ +void CTestMenu0AppUi::MenuSelectionMadeL(TInt aSelection) + { + switch (aSelection) + { + case CTRL('a'): + { + INFO_PRINTF1(_L("Test 1: SendAsiMessageL(ESendAddWindow)")); + TRAPD(ret, SendAsiMessageL(ESendAddWindow)); + TEST(ret == KErrNone); + return; + } + case CTRL('b'): + { + INFO_PRINTF1(_L("Test 2: ToggleBoldL")); + TRAPD(ret, ToggleBoldL()); + TEST(ret == KErrNone); + break; + } + case CTRL('c'): + { + INFO_PRINTF1(_L("Test 3: SendAsiMessageL(ESendCountWindows)")); + TRAPD(ret, SendAsiMessageL(ESendCountWindows)); + TEST(ret == KErrNone); + return; + } + case CTRL('i'): + { + INFO_PRINTF1(_L("Test 4: ToggleItalicL()")); + TRAPD(ret, ToggleItalicL()); + TEST(ret == KErrNone); + break; + } + case CTRL('m'): + { + INFO_PRINTF1(_L("Test 5: SendMessageL(_L8('Greetings from TMenu0'))")); + TRAPD(ret, SendMessageL(_L8("Greetings from TMenu0"))); + TEST(ret == KErrNone); + return; + } + case CTRL('o'): + { + INFO_PRINTF1(_L("Test 6: iCoeEnv->BringOwnerToFront()")); + TRAPD(ret, iCoeEnv->BringOwnerToFront()); + TEST(ret == KErrNone); + break; + } + case CTRL('r'): + { + INFO_PRINTF1(_L("Test 7: SendAsiMessageL(ESendRemoveWindow)")); + TRAPD(ret, SendAsiMessageL(ESendRemoveWindow)); + TEST(ret == KErrNone); + return; + } + case CTRL('s'): + { + INFO_PRINTF1(_L("Test 8: ToggleStrikethroughL()")); + TRAPD(ret, ToggleStrikethroughL()); + TEST(ret == KErrNone); + break; + } + case CTRL('u'): + { + INFO_PRINTF1(_L("Test 9: ToggleUnderlineL()")); + TRAPD(ret, ToggleUnderlineL()); + TEST(ret == KErrNone); + break; + } + default: + break; + } + TBuf<40> message; + message.Format(_L("Menu command Ctrl+%c chosen"),aSelection+'A'-1); + iMessageControl->SetMessage(message); + if (aSelection==CTRL('e')) + { + iCoeEnv->Flush(200000); + CBaActiveScheduler::Exit(); + } + } + +/** + The method is an override from CTestCoeAppUi.\n + This function is called asynchronously by RunL function of the + AutotestManager after previous test case is executed.\n + + */ +void CTestMenu0AppUi::RunTestStepL(TInt aNextStep) + { + + User::After(TTimeIntervalMicroSeconds32(1000000)); + + + switch(aNextStep) + { + case 1: + MenuSelectionMadeL(CTRL('a')); + break; + case 2: + SetTestStepID(_L("UIF-TMenu0Step-ToggleBoldL")); + MenuSelectionMadeL(CTRL('b')); + RecordTestResultL(); + break; + case 3: + MenuSelectionMadeL(CTRL('c')); + break; + case 4: + SetTestStepID(_L("UIF-TMenu0Step-ToggleItalicL")); + MenuSelectionMadeL(CTRL('i')); + RecordTestResultL(); + break; + case 5: + MenuSelectionMadeL(CTRL('m')); + break; + case 6: + MenuSelectionMadeL(CTRL('o')); + break; + case 7: + MenuSelectionMadeL(CTRL('r')); + break; + case 8: + SetTestStepID(_L("UIF-TMenu0Step-ToggleStrikethroughL")); + MenuSelectionMadeL(CTRL('s')); + RecordTestResultL(); + break; + case 9: + SetTestStepID(_L("UIF-TMenu0Step-ToggleUnderlineL")); + MenuSelectionMadeL(CTRL('u')); + RecordTestResultL(); + CloseTMSGraphicsStep(); + break; + case 10: + AutoTestManager().FinishAllTestCases(CAutoTestManager::EPass); + break; + } + } + + +/** + Second phase constructor for CTestMenu0AppUi class.\n + Calls the second phase constructor of base class CTestCoeAppUi.\n + Creates a control to handle pointer and key events (iMessageControl).\n + Creates a control to handle menu events (iMenu) which is added + to Cone's control stack.\n + */ +void CTestMenu0AppUi::ConstructL() + { + CTestCoeAppUi::ConstructL(); + iMessageControl=new(ELeave) CMessageControl; + iMessageControl->ConstructL(); + AddToStackL(iMessageControl); + iMenu=new(ELeave) CTestMenu(this); + AddToStackL(iMenu,ECoeStackPriorityMenu,ECoeStackFlagRefusesFocus); + + AutoTestManager().StartAutoTest(); + } + +// +// Main +// + +/** + Completes the construction of the Control Environment(CCoeEnv object).\n + Instantiates the CCone0TestAppUi class which serves as a AppUi class.\n + Sets the CCone0TestAppUi object as the application's user interface object.\n + Invokes the second phase constructor of the application's UI.\n + + */ +void CTMenu0Step::ConstructAppL(CCoeEnv* aCoe) + { // runs inside a TRAP harness + aCoe->ConstructL(); + CTestMenu0AppUi* appUi=new(ELeave) CTestMenu0AppUi(this); + aCoe->SetAppUi(appUi); + appUi->ConstructL(); + } + +CTMenu0Step::~CTMenu0Step() + { + } + +CTMenu0Step::CTMenu0Step() + { + SetTestStepName(KTMenu0Step); + } + +TVerdict CTMenu0Step::doTestStepL() + { + INFO_PRINTF1(_L("Test Started")); + + __UHEAP_MARK; + + CCoeEnv* coe=new CCoeEnv; + TRAPD(err,ConstructAppL(coe)); + if (!err) + coe->ExecuteD(); + + __UHEAP_MARKEND; + + INFO_PRINTF1(_L("Test Finishes")); + return TestStepResult(); + } + + + +