/************************************************************************* * * 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 * * for a copy of the LGPLv3 License. * ************************************************************************/ package ifc.accessibility; import java.util.Vector; import lib.MultiMethodTest; import com.sun.star.accessibility.XAccessible; import com.sun.star.accessibility.XAccessibleComponent; import com.sun.star.accessibility.XAccessibleContext; import com.sun.star.awt.Point; import com.sun.star.awt.Rectangle; import com.sun.star.awt.Size; import com.sun.star.uno.UnoRuntime; /** * Testing com.sun.star.accessibility.XAccessibleComponent * interface methods : *

* * @see com.sun.star.accessibility.XAccessibleComponent */ public class _XAccessibleComponent extends MultiMethodTest { public XAccessibleComponent oObj = null; private Rectangle bounds = null; private Vector KnownBounds = new Vector(); /** * First checks 4 inner bounds (upper, lower, left and right) * of component bounding box to contain * at least one point of the component. Second 4 outer bounds * are checked to not contain any component points.

* * Has OK status if inner bounds contain component points * and outer bounds don't contain any component points.

* * The following method tests are to be completed successfully before : *

*/ public void _containsPoint() { requiredMethod("getBounds()"); boolean result = true; int curX = 0; //while (!oObj.containsPoint(new Point(curX, bounds.Y)) && curX < bounds.Width+bounds.X) { while (!oObj.containsPoint(new Point(curX, 0)) && (curX < bounds.Width)) { curX++; } ; //if ((bounds.X <= curX) && (curX < bounds.Width+bounds.X)) { if (curX < bounds.Width) { log.println("Upper bound of box containsPoint point (" + curX + ",0) - OK"); } else { log.println( "Upper bound of box containsPoint no component points - FAILED"); result = false; } curX = 0; //while (!oObj.containsPoint(new Point(curX, bounds.Y+bounds.Height - 1)) while (!oObj.containsPoint(new Point(curX, bounds.Height - 1)) && (curX < bounds.Width)) { log.println("containsPoint returns false for (" + curX + "," + bounds.Height + ")"); curX++; } ; //if ((bounds.X <= curX) && (curX < bounds.Width+bounds.X)) { if (curX < bounds.Width) { log.println("Lower bound of box containsPoint point (" + curX + "," + (bounds.Height - 1) + ") - OK"); } else { log.println( "Lower bound of box containsPoint no component points - FAILED"); result = false; } int curY = 0; //while (!oObj.containsPoint(new Point(bounds.X, curY)) && curY < bounds.Height+bounds.Y) { while (!oObj.containsPoint(new Point(0, curY)) && (curY < bounds.Height)) { curY++; } ; //if ((bounds.Y <= curY) && (curY < bounds.Height+bounds.Y)) { if (curY < bounds.Height) { log.println("Left bound of box containsPoint point (0," + curY + ") - OK"); } else { log.println( "Left bound of box containsPoint no component points - FAILED"); result = false; } curY = 0; //while (!oObj.containsPoint(new Point(bounds.X+bounds.Width - 1, curY)) // && curY < bounds.Height+bounds.Y) { while (!oObj.containsPoint(new Point(bounds.Width - 1, curY)) && (curY < bounds.Height)) { curY++; } ; //if ((bounds.Y <= curY) && (curY < bounds.Height + bounds.Y)) { if (curY < bounds.Height) { log.println("Right bound of box containsPoint point (" + (bounds.Width - 1) + "," + curY + ") - OK"); } else { log.println( "Right bound of box containsPoint no component points - FAILED"); result = false; } boolean locRes = true; for (int x = -1; x <= bounds.Width; x++) { if (oObj.containsPoint(new Point(x, -1))) { log.println( "Outer upper and lower bounds CONTAIN some component point" + " (" + x + ", -1) - FAILED"); locRes = false; break; } if (oObj.containsPoint(new Point(x, bounds.Height + bounds.Y))) { log.println( "Outer upper and lower bounds CONTAIN some component point" + " (" + x + ", " + bounds.Height + bounds.Y + ") - FAILED"); locRes = false; break; } } if (locRes) { log.println("Outer upper and lower bounds contain no component " + "points - OK"); } else { result = false; } locRes = true; for (int y = -1; y <= bounds.Height; y++) { if (oObj.containsPoint(new Point(-1, y))) { log.println( "Outer left and right bounds CONTAIN some component point" + " (-1, " + y + ") - FAILED"); locRes = false; break; } if (oObj.containsPoint(new Point(bounds.X + bounds.Width, y))) { log.println( "Outer left and right bounds CONTAIN some component point" + " (" + bounds.X + bounds.Width + ", " + y + ") - FAILED"); locRes = false; break; } } if (locRes) { log.println("Outer left and right bounds contain no component " + "points - OK"); } else { result = false; } tRes.tested("containsPoint()", result); } /** * Iterates through all children which implement * XAccessibleComponent (if they exist) determines their * boundaries and tries to get each child by getAccessibleAtPoint * passing point which belongs to the child. * Also the point is checked which doesn't belong to child boundary * box.

* * Has OK status if in the first cases the right children * are returned, and in the second null or * another child is returned. */ public void _getAccessibleAtPoint() { boolean result = true; XAccessibleComponent[] children = getChildrenComponents(); if (children.length > 0) { for (int i = 0; i < children.length; i++) { Rectangle chBnd = children[i].getBounds(); if (chBnd.X == -1) { continue; } log.println("Checking child with bounds " + "(" + chBnd.X + "," + chBnd.Y + "),(" + chBnd.Width + "," + chBnd.Height + "): " + util.AccessibilityTools.accessibleToString( children[i])); XAccessibleContext xAc = (XAccessibleContext) UnoRuntime.queryInterface( XAccessibleContext.class, children[i]); boolean MightBeCovered = false; boolean isShowing = xAc.getAccessibleStateSet() .contains(com.sun.star.accessibility.AccessibleStateType.SHOWING); log.println("\tStateType containsPoint SHOWING: " + isShowing); if (!isShowing) { log.println("Child is invisible - OK"); continue; } log.println("finding the point which lies on the component"); int curX = chBnd.Width / 2; int curY = chBnd.Height / 2; while (!children[i].containsPoint(new Point(curX, curY)) && (curX > 0) && (curY > 0)) { curX--; curY--; } ; if ((curX == chBnd.Width) && isShowing) { log.println("Couldn't find a point with containsPoint"); continue; } // trying the point laying on child XAccessible xAcc = oObj.getAccessibleAtPoint( new Point(chBnd.X + curX, chBnd.Y + curY)); Point p = new Point(chBnd.X + curX,chBnd.X + curX); if (isCovered(p) && isShowing) { log.println( "Child might be covered by another and can't be reached"); MightBeCovered = true; } KnownBounds.add(chBnd); if (xAcc == null) { log.println("The child not found at point (" + (chBnd.X + curX) + "," + (chBnd.Y + curY) + ") - FAILED"); if (isShowing) { result = false; } else { result &= true; } } else { XAccessible xAccCh = (XAccessible) UnoRuntime.queryInterface( XAccessible.class, children[i]); XAccessibleContext xAccC = (XAccessibleContext) UnoRuntime.queryInterface( XAccessibleContext.class, children[i]); log.println("Child found at point (" + (chBnd.X + curX) + "," + (chBnd.Y + curY) + ") - OK"); boolean res = false; int expIndex; String expName; String expDesc; if (xAccCh != null) { res = util.AccessibilityTools.equals(xAccCh, xAcc); expIndex = xAccCh.getAccessibleContext() .getAccessibleIndexInParent(); expName = xAccCh.getAccessibleContext() .getAccessibleName(); expDesc = xAccCh.getAccessibleContext() .getAccessibleDescription(); } else { res = xAccC.getAccessibleName() .equals(xAcc.getAccessibleContext() .getAccessibleName()); expIndex = xAccC.getAccessibleIndexInParent(); expName = xAccC.getAccessibleName(); expDesc = xAccC.getAccessibleDescription(); } if (!res) { int gotIndex = xAcc.getAccessibleContext() .getAccessibleIndexInParent(); if (expIndex < gotIndex) { log.println("The children found is not the same"); log.println("The expected child " + expName); log.print("is hidden behind the found Child "); log.println(xAcc.getAccessibleContext() .getAccessibleName() + " - OK"); } else { log.println( "The children found is not the same"); log.println("Expected: " + expName); log.println("Description: " + expDesc); log.println("Found: " + xAcc.getAccessibleContext() .getAccessibleName()); log.println("Description: " + xAcc.getAccessibleContext() .getAccessibleDescription()); if (MightBeCovered) { log.println("... Child is covered by another - OK"); } else { log.println("... FAILED"); result = false; } } } } // trying the point NOT laying on child xAcc = oObj.getAccessibleAtPoint( new Point(chBnd.X - 1, chBnd.Y - 1)); if (xAcc == null) { log.println("No children found at point (" + (chBnd.X - 1) + "," + (chBnd.Y - 1) + ") - OK"); result &= true; } else { XAccessible xAccCh = (XAccessible) UnoRuntime.queryInterface( XAccessible.class, children[i]); boolean res = util.AccessibilityTools.equals(xAccCh, xAcc); if (res) { log.println("The same child found outside " + "its bounds at (" + (chBnd.X - 1) + "," + (chBnd.Y - 1) + ") - FAILED"); result = false; } } } } else { log.println("There are no children supporting " + "XAccessibleComponent"); } tRes.tested("getAccessibleAtPoint()", result); } /** * Retrieves the component bounds and stores it.

* * Has OK status if boundary position (x,y) is not negative * and size (Width, Height) is greater than 0. */ public void _getBounds() { boolean result = true; bounds = oObj.getBounds(); result &= ((bounds != null) && (bounds.X >= 0) && (bounds.Y >= 0) && (bounds.Width > 0) && (bounds.Height > 0)); log.println("Bounds = " + ((bounds != null) ? ("(" + bounds.X + "," + bounds.Y + "),(" + bounds.Width + "," + bounds.Height + ")") : "null")); tRes.tested("getBounds()", result); } /** * Gets the location.

* * Has OK status if the location is the same as location * of boundary obtained by getBounds() method. * * The following method tests are to be completed successfully before : *

*/ public void _getLocation() { requiredMethod("getBounds()"); boolean result = true; Point loc = oObj.getLocation(); result &= ((loc.X == bounds.X) && (loc.Y == bounds.Y)); tRes.tested("getLocation()", result); } /** * Get the screen location of the component and its parent * (if it exists and supports XAccessibleComponent).

* * Has OK status if component screen location equals * to screen location of its parent plus location of the component * relative to the parent.

* * The following method tests are to be completed successfully before : *

*/ public void _getLocationOnScreen() { requiredMethod("getBounds()"); XAccessibleComponent parent = getParentComponent(); boolean result = true; Point loc = oObj.getLocationOnScreen(); log.println("Location is (" + loc.X + "," + loc.Y + ")"); if (parent != null) { Point parLoc = parent.getLocationOnScreen(); log.println("Parent location is (" + parLoc.X + "," + parLoc.Y + ")"); result &= ((parLoc.X + bounds.X) == loc.X); result &= ((parLoc.Y + bounds.Y) == loc.Y); } tRes.tested("getLocationOnScreen()", result); } /** * Obtains the size of the component.

* * Has OK status if the size is the same as in bounds.

* * The following method tests are to be completed successfully before : *

*/ public void _getSize() { requiredMethod("getBounds()"); boolean result = true; Size size = oObj.getSize(); result &= (size.Width == bounds.Width); result &= (size.Height == bounds.Height); tRes.tested("getSize()", result); } /** * Just calls the method.

* * Has OK status if no runtime exceptions occured. */ public void _grabFocus() { boolean result = true; oObj.grabFocus(); tRes.tested("grabFocus()", result); } /** * Retrieves all children (not more than 50) of the current * component which support XAccessibleComponent. * * @return The array of children. Empty array returned if * such children were not found or some error occured. */ private XAccessibleComponent[] getChildrenComponents() { XAccessible xAcc = (XAccessible) UnoRuntime.queryInterface( XAccessible.class, oObj); if (xAcc == null) { log.println("Component doesn't support XAccessible."); return new XAccessibleComponent[0]; } XAccessibleContext xAccCon = xAcc.getAccessibleContext(); int cnt = xAccCon.getAccessibleChildCount(); // for cases when too many children exist checking only first 50 if (cnt > 50) { cnt = 50; } Vector childComp = new Vector(); for (int i = 0; i < cnt; i++) { try { XAccessible child = xAccCon.getAccessibleChild(i); XAccessibleContext xAccConCh = child.getAccessibleContext(); XAccessibleComponent xChAccComp = (XAccessibleComponent) UnoRuntime.queryInterface( XAccessibleComponent.class, xAccConCh); if (xChAccComp != null) { childComp.add(xChAccComp); } } catch (com.sun.star.lang.IndexOutOfBoundsException e) { } } return (XAccessibleComponent[]) childComp.toArray( new XAccessibleComponent[childComp.size()]); } /** * Gets the parent of the current component which support * XAccessibleComponent. * * @return The parent or null if the component * has no parent or some errors occured. */ private XAccessibleComponent getParentComponent() { XAccessible xAcc = (XAccessible) UnoRuntime.queryInterface( XAccessible.class, oObj); if (xAcc == null) { log.println("Component doesn't support XAccessible."); return null; } XAccessibleContext xAccCon = xAcc.getAccessibleContext(); XAccessible xAccPar = xAccCon.getAccessibleParent(); if (xAccPar == null) { log.println("Component has no accessible parent."); return null; } XAccessibleContext xAccConPar = xAccPar.getAccessibleContext(); XAccessibleComponent parent = (XAccessibleComponent) UnoRuntime.queryInterface( XAccessibleComponent.class, xAccConPar); if (parent == null) { log.println( "Accessible parent doesn't support XAccessibleComponent"); return null; } return parent; } /** * Just calls the method. */ public void _getForeground() { int forColor = oObj.getForeground(); log.println("getForeground(): " + forColor); tRes.tested("getForeground()", true); } /** * Just calls the method. */ public void _getBackground() { int backColor = oObj.getBackground(); log.println("getBackground(): " + backColor); tRes.tested("getBackground()", true); } /** * Restores initial component text. */ protected void after() { if (tEnv.getObjRelation("Destroy") != null) { disposeEnvironment(); } } private boolean isCovered(Point p) { int elements = KnownBounds.size(); boolean Covered = false; for (int k=0;k