/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the 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 :
*
containsPoint()
getAccessibleAtPoint()
getBounds()
getLocation()
getLocationOnScreen()
getSize()
grabFocus()
getAccessibleKeyBinding()
* * @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 : *
getBounds()
: to have size of a component.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 :
*
getBounds()
: to have bounds 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 : *
getBounds()
: to have location of the component
* relative to its parent* * Has OK status if the size is the same as in bounds.
* * The following method tests are to be completed successfully before : *
getBounds()
*
* 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