diff options
Diffstat (limited to 'framework/qa/complex/XUserInputInterception/EventTest.java')
-rw-r--r-- | framework/qa/complex/XUserInputInterception/EventTest.java | 594 |
1 files changed, 594 insertions, 0 deletions
diff --git a/framework/qa/complex/XUserInputInterception/EventTest.java b/framework/qa/complex/XUserInputInterception/EventTest.java new file mode 100644 index 000000000000..a54f9daaa932 --- /dev/null +++ b/framework/qa/complex/XUserInputInterception/EventTest.java @@ -0,0 +1,594 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +package complex.XUserInputInterception; + +import com.sun.star.accessibility.AccessibleRole; +import com.sun.star.accessibility.XAccessible; +import com.sun.star.accessibility.XAccessibleComponent; +import com.sun.star.accessibility.XAccessibleContext; +import com.sun.star.awt.KeyEvent; +import com.sun.star.awt.MouseEvent; +import com.sun.star.awt.Point; +import com.sun.star.awt.Rectangle; +import com.sun.star.awt.XKeyHandler; +import com.sun.star.awt.XMouseClickHandler; +import com.sun.star.awt.XUserInputInterception; +import com.sun.star.awt.XWindow; +import com.sun.star.chart.XChartDocument; +import com.sun.star.frame.*; +import com.sun.star.lang.*; +import com.sun.star.lang.EventObject; +import com.sun.star.sheet.XSpreadsheetDocument; +import com.sun.star.text.XTextDocument; +import com.sun.star.util.*; +import com.sun.star.uno.*; +import java.awt.Robot; +import java.awt.event.InputEvent; + +import complexlib.ComplexTestCase; +import util.AccessibilityTools; +import util.SOfficeFactory; + +//----------------------------------------------- +/** + * This <CODE>ComplexTest</CODE> checks the interface + * <CODE>XUserInputInterception</CODE>. Therefore it creates a document, + * adds a mouse and a key listener onto the interface and fire the + * correspond events. If all listener works as expected the test resluts in + * <CODE>OK</CODE> status. + * @short Check the interface XUserInputIntercaption + * @descr checks is a simple way the interface XUserInputInteraction + */ +public class EventTest extends ComplexTestCase { + //------------------------------------------- + // some const + + //------------------------------------------- + // member + + /** points to the global uno service manager. */ + private XMultiServiceFactory m_xMSF = null; + + /** indicates if the mousePressed event was called*/ + private boolean m_mousePressed = false; + /** indicates if the mouseReleased event was called*/ + private boolean m_mouseReleased = false; + + /** indicates if the mousePressed event was called*/ + private boolean m_keyPressed = false; + /** indicates if the mouseReleased event was called*/ + private boolean m_keyReleased = false; + + /** points to a global StarOffice factory */ + private SOfficeFactory m_SOF = null; + + /** + * define the miliseconds to wait until a <CODE>EventTrigger</CODE> thread should + * be finished with its work + */ + final int m_threadWait = 3000; + + //------------------------------------------- + // test environment + + //------------------------------------------- + /** + * The test methods are: + * <ul> + * <li><CODE>checkTextDocument</CODE></LI> + * <li><CODE>checkCalcDocument</CODE></LI> + * <li><CODE>checkDrawDocument</CODE></LI> + * <li><CODE>checkImpressDocument</CODE></LI> + * <li><CODE>checkChartDocument</CODE></LI> + * <li><CODE>checkMathDocument</CODE></li> + * </ul> + * @short A function to tell the framework, + * which test functions are available. + * @return All test methods. + * @todo Think about selection of tests from outside ... + */ + public String[] getTestMethodNames() { + return new String[] + { "checkTextDocument", + "checkCalcDocument", + "checkDrawDocument", + "checkImpressDocument", + "checkChartDocument", + "checkMathDocument", + }; + } + + //------------------------------------------- + /** + * creates the mebmer <CODE>m_xMSF</CODE> and <CODE>m_SOF</CODE> + * @short Create the environment for following tests. + * @descr create an empty test frame, where we can load + * different components inside. + */ + public void before() { + // get uno service manager from global test environment + m_xMSF = (XMultiServiceFactory)param.getMSF(); + + // create frame instance + try { + // get a soffice factory object + m_SOF = SOfficeFactory.getFactory((XMultiServiceFactory) param.getMSF()); + + } catch(java.lang.Throwable ex) { + failed("Could not create the XUserInputInterception instance."); + } + } + + //------------------------------------------- + /** + * closes the document + * @short close the document. + * @param xDoc the document to close + */ + public void closeDoc(XInterface xDoc) { + XCloseable xClose = (XCloseable)UnoRuntime.queryInterface( + XCloseable.class, xDoc); + try { + xClose.close(false); + } catch(com.sun.star.util.CloseVetoException exVeto) { + log.println("document couldn't be closed successfully."); + } + } + + /** + * creates a text document and check the <CODE>XMouseClickHandler</CODE> and + * <CODE>XKeyHandler</CODE> + * @see com.sun.star.awt.XKeyHandler + * @see com.sun.star.awt.XMouseClickHandler + */ + public void checkTextDocument(){ + + XTextDocument xDoc = null; + + try{ + xDoc = m_SOF.createTextDoc("WriterTest"); + } catch (com.sun.star.uno.Exception e){ + failed("Could not create a text document: " +e.toString()); + } + + checkListener(xDoc); + + closeDoc(xDoc); + } + + /** + * creates an impress document and check the <CODE>XMouseClickHandler</CODE> and + * <CODE>XKeyHandler</CODE> + * @see com.sun.star.awt.XKeyHandler + * @see com.sun.star.awt.XMouseClickHandler + */ + public void checkImpressDocument(){ + + XComponent xDoc = null; + + try{ + xDoc = m_SOF.createImpressDoc("ImpressTest"); + } catch (com.sun.star.uno.Exception e){ + failed("Could not create an impress document: " +e.toString()); + } + + checkListener(xDoc); + + closeDoc(xDoc); + } + + /** + * creates a chart document and check the <CODE>XMouseClickHandler</CODE> and + * <CODE>XKeyHandler</CODE> + * @see com.sun.star.awt.XKeyHandler + * @see com.sun.star.awt.XMouseClickHandler + */ + public void checkChartDocument(){ + + XChartDocument xDoc = null; + + try{ + xDoc = m_SOF.createChartDoc("ChartTest"); + } catch (com.sun.star.uno.Exception e){ + failed("Could not create a chart document: " +e.toString()); + } + + checkListener(xDoc); + + closeDoc(xDoc); + } + + /** + * creates a math document and check the <CODE>XMouseClickHandler</CODE> and + * <CODE>XKeyHandler</CODE> + * @see com.sun.star.awt.XKeyHandler + * @see com.sun.star.awt.XMouseClickHandler + */ + public void checkMathDocument(){ + + XComponent xDoc = null; + + try{ + xDoc = m_SOF.createMathDoc("MathTest"); + } catch (com.sun.star.uno.Exception e){ + failed("Could not create a math document: " +e.toString()); + } + + checkListener(xDoc); + + closeDoc(xDoc); + } + + /** + * creates a draw document and check the <CODE>XMouseClickHandler</CODE> and + * <CODE>XKeyHandler</CODE> + * @see com.sun.star.awt.XKeyHandler + * @see com.sun.star.awt.XMouseClickHandler + */ + public void checkDrawDocument(){ + + XComponent xDoc = null; + + try{ + xDoc = m_SOF.createDrawDoc("DrawTest"); + } catch (com.sun.star.uno.Exception e){ + failed("Could not create a draw document: " +e.toString()); + } + + checkListener(xDoc); + + closeDoc(xDoc); + } + + /** + * creates a calc document and check the <CODE>XMouseClickHandler</CODE> and + * <CODE>XKeyHandler</CODE> + * @see com.sun.star.awt.XKeyHandler + * @see com.sun.star.awt.XMouseClickHandler + */ + public void checkCalcDocument(){ + + XSpreadsheetDocument xDoc = null; + + try{ + xDoc = m_SOF.createCalcDoc("CalcTest"); + } catch (com.sun.star.uno.Exception e){ + failed("Could not create a calc document: " +e.toString()); + } + + checkListener(xDoc); + closeDoc(xDoc); + } + + /** + * This is the central test method. It is called by ceck[DOCTYPE]Document. It + * creates the <CODE>XUserInputInterception</CODE> from the document and call the + * <CODE>checkMouseListener</CODE> test and the <CODE>checkKeyListener</CODE> test + * @param xDoc the document to test + */ + private void checkListener(XInterface xDoc){ + + XModel xModel = (XModel) UnoRuntime.queryInterface(XModel.class, xDoc); + + XUserInputInterception xUII = getUII(xModel); + + checkMouseListener(xUII, xModel); + checkKeyListener(xUII, xModel); + } + + /** + * Creates a <CODE>MyKeyHandler</CODE> and adds it to the + * <CODE>XUserInputInterception</CODE>. Then an <CODE>EventTrigger</CODE> thread + * was created and started. + * Has <CODE>OK</CODE> if the members <CODE>m_keyPressed</CODE> and + * <CODE>m_keyReleased</CODE> are <CODE>TRUE</CODE> + * @param xUII the XUserInputInterception + * @param xModel the XModel of a document + * @see EventTest.MyKeyHander + * @see EventTest.EventTrigger + */ + private void checkKeyListener(XUserInputInterception xUII, XModel xModel) { + m_keyPressed = false; + m_keyReleased = false; + + MyKeyHandler keyListener = new MyKeyHandler(); + + xUII.addKeyHandler(keyListener); + + log.println("starting thread to check the key listener..."); + EventTrigger et = new EventTrigger(xModel, EventTriggerType.KEY_TEXT_INTO_DOC); + + et.run(); + + util.utils.shortWait(m_threadWait); + log.println("key listener thread should be finished."); + + assure("key event does not work!", m_keyPressed && m_keyReleased); + xUII.removeKeyHandler(keyListener); + + } + + /** + * Creates a <CODE>MyMouseClickHandler</CODE> and adds it to the + * <CODE>XUserInputInterception</CODE>. Then an <CODE>EventTrigger</CODE> thread + * was created and started. + * Has <CODE>OK</CODE> if the members <CODE>m_mousePressed</CODE> and + * <CODE>m_mouseReleased</CODE> are <CODE>TRUE</CODE> + * @param xUII the XUserInputInterception + * @param xModel the XModel of a document + * @see EventTest.MyMouseClickHander + * @see EventTest.EventTrigger + */ + + private void checkMouseListener(XUserInputInterception xUII, XModel xModel) { + + m_mousePressed = false; + m_mouseReleased = false; + + MyMouseClickHandler mouseListener = new MyMouseClickHandler(); + + xUII.addMouseClickHandler(mouseListener); + + log.println("starting thread to check the mouse listener..."); + EventTrigger et = new EventTrigger(xModel, EventTriggerType.MOUSE_KLICK_INTO_DOC); + + et.run(); + + util.utils.shortWait(m_threadWait); + log.println("mouse listener thread should be finished."); + + assure("mouse event does not work!", m_mousePressed && m_mouseReleased); + xUII.removeMouseClickHandler(mouseListener); + } + + /** + * returns the <CODE>XUserInputInterception</CODE> from the <CODE>XMdoel</CODE> + * @param xModel the XModel of a document + * @return the <CODE>XUserInputInterception</CODE> of the document + */ + private XUserInputInterception getUII(XModel xModel){ + + XController xController = xModel.getCurrentController(); + + XUserInputInterception xUII = (XUserInputInterception) UnoRuntime.queryInterface( + XUserInputInterception.class, xController); + if (xUII == null) { + failed("could not get XUserInputInterception from XContoller", true); + } + return xUII; + } + + /** + * Listener which added and its method must be called + * on <code>keyPressed</code> and <code>keyReleased</code> call. + */ + public class MyKeyHandler implements XKeyHandler { + /** + * This event sets the member <code>m_keyPressed</coed> to + * <code>true</code> + * @param oEvent The key event informs about the pressed key. + * @return returns <CODE>TRUE</CODE> in erery case + */ + public boolean keyPressed( KeyEvent oEvent ){ + log.println("XKeyHandler: keyPressed-Event"); + m_keyPressed = true; + return true; + } + /** + * This event sets the member <code>m_keyReleased</coed> to + * <code>true</code> + * @param oEvent The key event informs about the pressed key. + * @return returns <CODE>TRUE</CODE> in erery case + */ + public boolean keyReleased( KeyEvent oEvent ){ + log.println("XKeyHandler: keyReleased-Event"); + m_keyReleased = true; + return true; + } + /** + * This event does nothing usefull + * @param oEvent refers to the object that fired the event. + */ + public void disposing( EventObject oEvent ){ + log.println("XKeyHandler: disposing-Event"); + } + } + + /** + * Listener which added and its method must be called + * on <code>mousePressed</code> and <code>mouseReleased</code> call. + */ + public class MyMouseClickHandler implements XMouseClickHandler { + /** + * This event sets the member <code>m_mousePressed</coed> to + * <code>true</code> + * @param oEvent The mouse event informs about the kind of mouse event. + * @return returns <CODE>TRUE</CODE> in erery case + */ + public boolean mousePressed( MouseEvent oEvent ){ + log.println("XMouseClickHandler: mousePressed-Event"); + m_mousePressed = true; + return true; + } + /** + * This event sets the member <code>m_mouseReleased</coed> to + * <code>true</code> + * @param oEvent The mouse event informs about the kind of mouse event. + * @return returns <CODE>TRUE</CODE> in erery case + */ + public boolean mouseReleased( MouseEvent oEvent ){ + log.println("XMouseClickHandler: mouseReleased-Event"); + m_mouseReleased = true; + return true; + } + /** + * This event does nothing usefull + * @param oEvent refers to the object that fired the event. + */ + public void disposing( EventObject oEvent ){ + log.println("XMouseClickHandler: disposing-Event"); + } + }; + + /** + * To check the events this class is a thread which click a mouse button and + * press a key with the <CODE>Robot</CODE> class + * @see java.awt.Robot + */ + private class EventTrigger extends Thread{ + + /** + * represents a <CODE>AccessibilityTools</CODE> + */ + private final AccessibilityTools at = new AccessibilityTools(); + /** + * represents an <CODE>EventType</CODE> + * @see EventTest.EventTriggerType + */ + private int eventType = 0; + /** + * represents a <CODE>XModel</CODE> of a document + */ + private XModel xModel = null; + + /** + * Creates an instacne of this class. The parameter <CODE>eType</CODE> represents + * the kind of event wich will be triggert at <CODE>run()</CODE> + * @param model the model of a document + * @param eType the kind of event which should be trigger + */ + public EventTrigger(XModel model, int eType) + { + this.xModel = model; + this.eventType = eType; + } + + /** + * Triggers the event wich is represented by <CODE>eventType</CODE> + * The scenarios are: + * <ul> + * <li>EventTest.EventTriggerType.MOUSE_KLICK_INTO_DOC + * which calls + * <li><CODE>clickIntoDoc</CODE></LI> + * </LI> + * <li>EventTest.EventTriggerType.KEY_TEXT_INTO_DOC + * which calls + * <li><CODE>clickIntodoc</CODE></LI> + * <li><CODE>keyIntoDoc</CODE></LI> + * </LI> + * </UL> + */ + public void run(){ + + switch (this.eventType){ + + case EventTriggerType.MOUSE_KLICK_INTO_DOC: + clickIntoDoc(); + break; + case EventTriggerType.KEY_TEXT_INTO_DOC: + clickIntoDoc(); + keyIntoDoc(); + break; + + } + } + /** + * This method cklicks into the middel of a document. It uses Accessibility + * to get the document and query for its position and its range to calculate + * the middle. This values was used for <CODE>Robot</CODE> Class. This + * Robot class is able to move the mouse and to cklick a mouse button + * @see java.awt.Robot + */ + private void clickIntoDoc(){ + try{ + // get the position and the range of a scroll bar + + XWindow xWindow = at.getCurrentWindow( + (XMultiServiceFactory) param.getMSF(), + xModel); + + XAccessible xRoot = at.getAccessibleObject(xWindow); + + + + XAccessibleContext xPanel = at.getAccessibleObjectForRole(xRoot, AccessibleRole.PANEL); + XAccessibleComponent xPanelCont = (XAccessibleComponent) UnoRuntime.queryInterface(XAccessibleComponent.class, xPanel); + + // the position of the panel + Point point = xPanelCont.getLocationOnScreen(); + + // the range of the panel + Rectangle rect = xPanelCont.getBounds(); + + try { + Robot rob = new Robot(); + int x = point.X + (rect.Width / 2); + int y = point.Y + (rect.Height / 2); + log.println("try to klick into the middle of the document"); + rob.mouseMove(x, y); + rob.mousePress(InputEvent.BUTTON1_MASK); + rob.mouseRelease(InputEvent.BUTTON1_MASK); + } catch (java.awt.AWTException e) { + log.println("couldn't press mouse button"); + } + } catch (java.lang.Exception e){ + log.println("could not click into the scroll bar: " + e.toString()); + } + } + + /** + * This method press the "A" key. Therefore it uses the <CODE>Robot</CODE> + * class. + * @see java.awt.Robot + */ + private void keyIntoDoc(){ + try { + Robot rob = new Robot(); + log.println("try to press 'A'"); + rob.keyPress(java.awt.event.KeyEvent.VK_A); + rob.keyRelease(java.awt.event.KeyEvent.VK_A); + } catch (java.awt.AWTException e) { + log.println("couldn't press key"); + } + + } + } + + /** This interface represents all possible actions which could be used + * in the <CODE>EventTrigger</CODE> class. + * @see EventTest.EventTrigger + */ + private interface EventTriggerType{ + + /** klick the mouse into the scroll bar*/ + final public static int MOUSE_KLICK_INTO_DOC = 1; + + /** write some text into a spread sheet*/ + final public static int KEY_TEXT_INTO_DOC = 2; + } +}
\ No newline at end of file |