xref: /AOO41X/main/qadevOOo/runner/util/AccessibilityTools.java (revision ef39d40d3f5e66cf3f035b3e93783012b340500d)
1*ef39d40dSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*ef39d40dSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*ef39d40dSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*ef39d40dSAndrew Rist  * distributed with this work for additional information
6*ef39d40dSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*ef39d40dSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*ef39d40dSAndrew Rist  * "License"); you may not use this file except in compliance
9*ef39d40dSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*ef39d40dSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*ef39d40dSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*ef39d40dSAndrew Rist  * software distributed under the License is distributed on an
15*ef39d40dSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*ef39d40dSAndrew Rist  * KIND, either express or implied.  See the License for the
17*ef39d40dSAndrew Rist  * specific language governing permissions and limitations
18*ef39d40dSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*ef39d40dSAndrew Rist  *************************************************************/
21*ef39d40dSAndrew Rist 
22*ef39d40dSAndrew Rist 
23cdf0e10cSrcweir package util;
24cdf0e10cSrcweir 
25cdf0e10cSrcweir import com.sun.star.accessibility.XAccessible;
26cdf0e10cSrcweir import com.sun.star.accessibility.XAccessibleComponent;
27cdf0e10cSrcweir import com.sun.star.accessibility.XAccessibleContext;
28cdf0e10cSrcweir import com.sun.star.awt.XWindow;
29cdf0e10cSrcweir import com.sun.star.frame.XController;
30cdf0e10cSrcweir import com.sun.star.frame.XFrame;
31cdf0e10cSrcweir import com.sun.star.frame.XModel;
32cdf0e10cSrcweir import com.sun.star.lang.XMultiServiceFactory;
33cdf0e10cSrcweir import com.sun.star.uno.UnoRuntime;
34cdf0e10cSrcweir import com.sun.star.uno.XInterface;
35cdf0e10cSrcweir 
36cdf0e10cSrcweir import java.io.PrintWriter;
37cdf0e10cSrcweir 
38cdf0e10cSrcweir 
39cdf0e10cSrcweir public class AccessibilityTools {
40cdf0e10cSrcweir     public static XAccessibleContext SearchedContext = null;
41cdf0e10cSrcweir     public static XAccessible SearchedAccessible = null;
42cdf0e10cSrcweir     private static boolean debug = false;
43cdf0e10cSrcweir 
AccessibilityTools()44cdf0e10cSrcweir     public AccessibilityTools() {
45cdf0e10cSrcweir         //done = false;
46cdf0e10cSrcweir         SearchedContext = null;
47cdf0e10cSrcweir     }
48cdf0e10cSrcweir 
getAccessibleObject(XInterface xObject)49cdf0e10cSrcweir     public static XAccessible getAccessibleObject(XInterface xObject) {
50cdf0e10cSrcweir         return UnoRuntime.queryInterface(XAccessible.class, xObject);
51cdf0e10cSrcweir     }
52cdf0e10cSrcweir 
getCurrentContainerWindow(XMultiServiceFactory msf, XModel xModel)53cdf0e10cSrcweir     public static XWindow getCurrentContainerWindow(XMultiServiceFactory msf,
54cdf0e10cSrcweir         XModel xModel) {
55cdf0e10cSrcweir         return getWindow(msf, xModel, true);
56cdf0e10cSrcweir     }
57cdf0e10cSrcweir 
getCurrentWindow(XMultiServiceFactory msf, XModel xModel)58cdf0e10cSrcweir     public static XWindow getCurrentWindow(XMultiServiceFactory msf,
59cdf0e10cSrcweir         XModel xModel) {
60cdf0e10cSrcweir         return getWindow(msf, xModel, false);
61cdf0e10cSrcweir     }
62cdf0e10cSrcweir 
getWindow(XMultiServiceFactory msf, XModel xModel, boolean containerWindow)63cdf0e10cSrcweir     private static XWindow getWindow(XMultiServiceFactory msf, XModel xModel,
64cdf0e10cSrcweir         boolean containerWindow) {
65cdf0e10cSrcweir         XWindow xWindow = null;
66cdf0e10cSrcweir 
67cdf0e10cSrcweir         try {
68cdf0e10cSrcweir             if (xModel == null) {
69cdf0e10cSrcweir                 System.out.println("invalid model (==null)");
70cdf0e10cSrcweir             }
71cdf0e10cSrcweir 
72cdf0e10cSrcweir             XController xController = xModel.getCurrentController();
73cdf0e10cSrcweir 
74cdf0e10cSrcweir             if (xController == null) {
75cdf0e10cSrcweir                 System.out.println("can't get controller from model");
76cdf0e10cSrcweir             }
77cdf0e10cSrcweir 
78cdf0e10cSrcweir             XFrame xFrame = xController.getFrame();
79cdf0e10cSrcweir 
80cdf0e10cSrcweir             if (xFrame == null) {
81cdf0e10cSrcweir                 System.out.println("can't get frame from controller");
82cdf0e10cSrcweir             }
83cdf0e10cSrcweir 
84cdf0e10cSrcweir             if (containerWindow)
85cdf0e10cSrcweir                 xWindow = xFrame.getContainerWindow();
86cdf0e10cSrcweir             else
87cdf0e10cSrcweir                 xWindow = xFrame.getComponentWindow();
88cdf0e10cSrcweir 
89cdf0e10cSrcweir             if (xWindow == null) {
90cdf0e10cSrcweir                 System.out.println("can't get window from frame");
91cdf0e10cSrcweir             }
92cdf0e10cSrcweir         } catch (Exception e) {
93cdf0e10cSrcweir             System.out.println("caught exception while getting current window" + e);
94cdf0e10cSrcweir         }
95cdf0e10cSrcweir 
96cdf0e10cSrcweir         return xWindow;
97cdf0e10cSrcweir     }
98cdf0e10cSrcweir 
getAccessibleObjectForRole(XAccessible xacc, short role)99cdf0e10cSrcweir     public static XAccessibleContext getAccessibleObjectForRole(XAccessible xacc,
100cdf0e10cSrcweir         short role) {
101cdf0e10cSrcweir         SearchedContext = null;
102cdf0e10cSrcweir         SearchedAccessible = null;
103cdf0e10cSrcweir         getAccessibleObjectForRole_(xacc, role);
104cdf0e10cSrcweir 
105cdf0e10cSrcweir         return SearchedContext;
106cdf0e10cSrcweir     }
107cdf0e10cSrcweir 
getAccessibleObjectForRole(XAccessible xacc, short role, boolean ignoreShowing)108cdf0e10cSrcweir     public static XAccessibleContext getAccessibleObjectForRole(XAccessible xacc,
109cdf0e10cSrcweir         short role,
110cdf0e10cSrcweir         boolean ignoreShowing) {
111cdf0e10cSrcweir         SearchedContext = null;
112cdf0e10cSrcweir         SearchedAccessible = null;
113cdf0e10cSrcweir 
114cdf0e10cSrcweir         if (ignoreShowing) {
115cdf0e10cSrcweir             getAccessibleObjectForRoleIgnoreShowing_(xacc, role);
116cdf0e10cSrcweir         } else {
117cdf0e10cSrcweir             getAccessibleObjectForRole_(xacc, role);
118cdf0e10cSrcweir         }
119cdf0e10cSrcweir 
120cdf0e10cSrcweir         return SearchedContext;
121cdf0e10cSrcweir     }
122cdf0e10cSrcweir 
getAccessibleObjectForRoleIgnoreShowing_(XAccessible xacc, short role)123cdf0e10cSrcweir     public static void getAccessibleObjectForRoleIgnoreShowing_(XAccessible xacc,
124cdf0e10cSrcweir         short role) {
125cdf0e10cSrcweir         XAccessibleContext ac = xacc.getAccessibleContext();
126cdf0e10cSrcweir 
127cdf0e10cSrcweir         if (ac.getAccessibleRole() == role) {
128cdf0e10cSrcweir             SearchedContext = ac;
129cdf0e10cSrcweir             SearchedAccessible = xacc;
130cdf0e10cSrcweir         } else {
131cdf0e10cSrcweir             int k = ac.getAccessibleChildCount();
132cdf0e10cSrcweir 
133cdf0e10cSrcweir             if (ac.getAccessibleChildCount() > 100) {
134cdf0e10cSrcweir                 k = 50;
135cdf0e10cSrcweir             }
136cdf0e10cSrcweir 
137cdf0e10cSrcweir             for (int i = 0; i < k; i++) {
138cdf0e10cSrcweir                 try {
139cdf0e10cSrcweir                     getAccessibleObjectForRoleIgnoreShowing_(
140cdf0e10cSrcweir                         ac.getAccessibleChild(i), role);
141cdf0e10cSrcweir 
142cdf0e10cSrcweir                     if (SearchedContext != null) {
143cdf0e10cSrcweir                         return;
144cdf0e10cSrcweir                     }
145cdf0e10cSrcweir                 } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
146cdf0e10cSrcweir                     System.out.println("Couldn't get Child");
147cdf0e10cSrcweir                 }
148cdf0e10cSrcweir             }
149cdf0e10cSrcweir         }
150cdf0e10cSrcweir     }
151cdf0e10cSrcweir 
getAccessibleObjectForRole_(XAccessible xacc, short role)152cdf0e10cSrcweir     public static void getAccessibleObjectForRole_(XAccessible xacc,
153cdf0e10cSrcweir         short role) {
154cdf0e10cSrcweir         XAccessibleContext ac = xacc.getAccessibleContext();
155cdf0e10cSrcweir         boolean isShowing = ac.getAccessibleStateSet()
156cdf0e10cSrcweir         .contains(com.sun.star.accessibility.AccessibleStateType.SHOWING);
157cdf0e10cSrcweir 
158cdf0e10cSrcweir         if ((ac.getAccessibleRole() == role) && isShowing) {
159cdf0e10cSrcweir             SearchedContext = ac;
160cdf0e10cSrcweir             SearchedAccessible = xacc;
161cdf0e10cSrcweir         } else {
162cdf0e10cSrcweir             int k = ac.getAccessibleChildCount();
163cdf0e10cSrcweir 
164cdf0e10cSrcweir             if (ac.getAccessibleChildCount() > 100) {
165cdf0e10cSrcweir                 k = 50;
166cdf0e10cSrcweir             }
167cdf0e10cSrcweir 
168cdf0e10cSrcweir             for (int i = 0; i < k; i++) {
169cdf0e10cSrcweir                 try {
170cdf0e10cSrcweir                     getAccessibleObjectForRole_(ac.getAccessibleChild(i), role);
171cdf0e10cSrcweir 
172cdf0e10cSrcweir                     if (SearchedContext != null) {
173cdf0e10cSrcweir                         return;
174cdf0e10cSrcweir                     }
175cdf0e10cSrcweir                 } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
176cdf0e10cSrcweir                     System.out.println("Couldn't get Child");
177cdf0e10cSrcweir                 }
178cdf0e10cSrcweir             }
179cdf0e10cSrcweir         }
180cdf0e10cSrcweir     }
181cdf0e10cSrcweir 
getAccessibleObjectForRole(XAccessible xacc, short role, String name)182cdf0e10cSrcweir     public static XAccessibleContext getAccessibleObjectForRole(XAccessible xacc,
183cdf0e10cSrcweir         short role,
184cdf0e10cSrcweir         String name) {
185cdf0e10cSrcweir         return getAccessibleObjectForRole(xacc, role, name, "");
186cdf0e10cSrcweir     }
187cdf0e10cSrcweir 
getAccessibleObjectForRole(XAccessible xacc, short role, String name, boolean ignoreShowing)188cdf0e10cSrcweir     public static XAccessibleContext getAccessibleObjectForRole(XAccessible xacc,
189cdf0e10cSrcweir         short role,
190cdf0e10cSrcweir         String name,
191cdf0e10cSrcweir         boolean ignoreShowing) {
192cdf0e10cSrcweir         if (ignoreShowing) {
193cdf0e10cSrcweir             return getAccessibleObjectForRoleIgnoreShowing(xacc, role, name,
194cdf0e10cSrcweir                 "");
195cdf0e10cSrcweir         } else {
196cdf0e10cSrcweir             return getAccessibleObjectForRole(xacc, role, name, "");
197cdf0e10cSrcweir         }
198cdf0e10cSrcweir     }
199cdf0e10cSrcweir 
getAccessibleObjectForRoleIgnoreShowing(XAccessible xacc, short role, String name, String implName)200cdf0e10cSrcweir     public static XAccessibleContext getAccessibleObjectForRoleIgnoreShowing(XAccessible xacc,
201cdf0e10cSrcweir         short role,
202cdf0e10cSrcweir         String name,
203cdf0e10cSrcweir         String implName) {
204cdf0e10cSrcweir         XAccessibleContext ac = xacc.getAccessibleContext();
205cdf0e10cSrcweir         if ((ac.getAccessibleRole() == role) &&
206cdf0e10cSrcweir             (ac.getAccessibleName().indexOf(name) > -1) &&
207cdf0e10cSrcweir             (utils.getImplName(ac).indexOf(implName) > -1)) {
208cdf0e10cSrcweir             SearchedAccessible = xacc;
209cdf0e10cSrcweir 
210cdf0e10cSrcweir             //System.out.println("FOUND the desired component -- "+ ac.getAccessibleName() +isShowing);
211cdf0e10cSrcweir             return ac;
212cdf0e10cSrcweir         } else {
213cdf0e10cSrcweir             int k = ac.getAccessibleChildCount();
214cdf0e10cSrcweir 
215cdf0e10cSrcweir             if (ac.getAccessibleChildCount() > 100) {
216cdf0e10cSrcweir                 k = 50;
217cdf0e10cSrcweir             }
218cdf0e10cSrcweir 
219cdf0e10cSrcweir             for (int i = 0; i < k; i++) {
220cdf0e10cSrcweir                 try {
221cdf0e10cSrcweir                     XAccessibleContext ac1 = getAccessibleObjectForRoleIgnoreShowing(
222cdf0e10cSrcweir                         ac.getAccessibleChild(i),
223cdf0e10cSrcweir                         role, name, implName);
224cdf0e10cSrcweir 
225cdf0e10cSrcweir                     if (ac1 != null) {
226cdf0e10cSrcweir                         return ac1;
227cdf0e10cSrcweir                     }
228cdf0e10cSrcweir                 } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
229cdf0e10cSrcweir                     System.out.println("Couldn't get Child");
230cdf0e10cSrcweir                 }
231cdf0e10cSrcweir             }
232cdf0e10cSrcweir         }
233cdf0e10cSrcweir 
234cdf0e10cSrcweir         return null;
235cdf0e10cSrcweir     }
236cdf0e10cSrcweir 
getAccessibleObjectForRole(XAccessible xacc, short role, String name, String implName)237cdf0e10cSrcweir     public static XAccessibleContext getAccessibleObjectForRole(XAccessible xacc,
238cdf0e10cSrcweir         short role,
239cdf0e10cSrcweir         String name,
240cdf0e10cSrcweir         String implName) {
241cdf0e10cSrcweir         XAccessibleContext ac = xacc.getAccessibleContext();
242cdf0e10cSrcweir         boolean isShowing = ac.getAccessibleStateSet()
243cdf0e10cSrcweir         .contains(com.sun.star.accessibility.AccessibleStateType.SHOWING);
244cdf0e10cSrcweir 
245cdf0e10cSrcweir         // hotfix for i91828:
246cdf0e10cSrcweir         // if role to serach is 0 then ignore the role.
247cdf0e10cSrcweir         if ( (role == 0 || ac.getAccessibleRole() == role) &&
248cdf0e10cSrcweir             (ac.getAccessibleName().indexOf(name) > -1) &&
249cdf0e10cSrcweir             (utils.getImplName(ac).indexOf(implName) > -1) &&
250cdf0e10cSrcweir             isShowing) {
251cdf0e10cSrcweir             SearchedAccessible = xacc;
252cdf0e10cSrcweir             //System.out.println("FOUND the desired component -- "+ ac.getAccessibleName() +isShowing);
253cdf0e10cSrcweir             return ac;
254cdf0e10cSrcweir         } else {
255cdf0e10cSrcweir             int k = ac.getAccessibleChildCount();
256cdf0e10cSrcweir 
257cdf0e10cSrcweir             if (ac.getAccessibleChildCount() > 100) {
258cdf0e10cSrcweir                 k = 50;
259cdf0e10cSrcweir             }
260cdf0e10cSrcweir 
261cdf0e10cSrcweir             for (int i = 0; i < k; i++) {
262cdf0e10cSrcweir                 try {
263cdf0e10cSrcweir                     XAccessibleContext ac1 = getAccessibleObjectForRole(
264cdf0e10cSrcweir                         ac.getAccessibleChild(i),
265cdf0e10cSrcweir                         role, name, implName);
266cdf0e10cSrcweir 
267cdf0e10cSrcweir                     if (ac1 != null) {
268cdf0e10cSrcweir                         return ac1;
269cdf0e10cSrcweir                     }
270cdf0e10cSrcweir                 } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
271cdf0e10cSrcweir                     System.out.println("Couldn't get Child");
272cdf0e10cSrcweir                 }
273cdf0e10cSrcweir             }
274cdf0e10cSrcweir         }
275cdf0e10cSrcweir 
276cdf0e10cSrcweir         return null;
277cdf0e10cSrcweir     }
278cdf0e10cSrcweir 
279cdf0e10cSrcweir     /**
280cdf0e10cSrcweir      * This methods retunrs the <CODE>XAccessibleContext</CODE> of a named Sheet-Cell like "G5".<p>
281cdf0e10cSrcweir      * @param xSheetAcc The <CODE>XAccessibleContext</CODE> of a Sheet
282cdf0e10cSrcweir      * @param cellName The name of a cell like "A5"
283cdf0e10cSrcweir      * @return the <CODE>XAccessiblecontext</CODE> of the named cell
284cdf0e10cSrcweir      */
getSheetCell(XAccessibleContext xSheetAcc, String cellName)285cdf0e10cSrcweir     public static XAccessibleContext getSheetCell(XAccessibleContext xSheetAcc, String cellName){
286cdf0e10cSrcweir 
287cdf0e10cSrcweir         int cellIndex = 0;
288cdf0e10cSrcweir         int column =0;
289cdf0e10cSrcweir         int charMem = 0;
290cdf0e10cSrcweir         for (int n=0; n<cellName.length(); n++){
291cdf0e10cSrcweir             String cha = cellName.substring(n,n+1);
292cdf0e10cSrcweir             System.out.println("char: " + cha + " ");
293cdf0e10cSrcweir 
294cdf0e10cSrcweir             byte[] bytes = cha.getBytes();
295cdf0e10cSrcweir 
296cdf0e10cSrcweir             if ((bytes[0] >= 'A') && (bytes[0] <= 'Z')){
297cdf0e10cSrcweir                 charMem = bytes[0]-64;
298cdf0e10cSrcweir                 column++;
299cdf0e10cSrcweir                 if ( column == 2 ){
300cdf0e10cSrcweir                     cellIndex += charMem * 26;
301cdf0e10cSrcweir                 }
302cdf0e10cSrcweir                 cellIndex= cellIndex+ (bytes[0]-65);
303cdf0e10cSrcweir             } else {
304cdf0e10cSrcweir                 String sNumb = cellName.substring(n, cellName.length());
305cdf0e10cSrcweir                 int iNumb = new Integer(0).valueOf(sNumb).intValue();
306cdf0e10cSrcweir                 cellIndex += (iNumb-1) * 256;
307cdf0e10cSrcweir                 System.out.println("numb:" + (iNumb-1) * 256);
308cdf0e10cSrcweir             }
309cdf0e10cSrcweir 
310cdf0e10cSrcweir         }
311cdf0e10cSrcweir 
312cdf0e10cSrcweir         //System.out.println("cellName:  " + cellName + " cellIndex: " + cellIndex);
313cdf0e10cSrcweir 
314cdf0e10cSrcweir         try {
315cdf0e10cSrcweir             XAccessibleContext ac = xSheetAcc.getAccessibleChild(cellIndex).getAccessibleContext();
316cdf0e10cSrcweir             System.out.println(ac.getAccessibleRole() + "," +
317cdf0e10cSrcweir                 ac.getAccessibleName() + "(" +
318cdf0e10cSrcweir                 ac.getAccessibleDescription() + "):" +
319cdf0e10cSrcweir                 utils.getImplName(ac));
320cdf0e10cSrcweir 
321cdf0e10cSrcweir             return ac;
322cdf0e10cSrcweir         } catch (com.sun.star.lang.IndexOutOfBoundsException ex) {
323cdf0e10cSrcweir             System.out.println("ERROR: could not get child at index " + cellIndex +"': " + ex.toString());
324cdf0e10cSrcweir             return null;
325cdf0e10cSrcweir         }
326cdf0e10cSrcweir     }
327cdf0e10cSrcweir 
printAccessibleTree(PrintWriter log, XAccessible xacc, boolean debugIsActive)328cdf0e10cSrcweir     public static void printAccessibleTree(PrintWriter log, XAccessible xacc, boolean debugIsActive) {
329cdf0e10cSrcweir         debug = debugIsActive;
330cdf0e10cSrcweir         if (debug) printAccessibleTree(log, xacc, "");
331cdf0e10cSrcweir     }
332cdf0e10cSrcweir 
printAccessibleTree(PrintWriter log, XAccessible xacc)333cdf0e10cSrcweir     public static void printAccessibleTree(PrintWriter log, XAccessible xacc) {
334cdf0e10cSrcweir         printAccessibleTree(log, xacc, "");
335cdf0e10cSrcweir     }
336cdf0e10cSrcweir 
printAccessibleTree(PrintWriter log, XAccessible xacc, String indent)337cdf0e10cSrcweir     protected static void printAccessibleTree(PrintWriter log,
338cdf0e10cSrcweir         XAccessible xacc, String indent) {
339cdf0e10cSrcweir 
340cdf0e10cSrcweir         XAccessibleContext ac = xacc.getAccessibleContext();
341cdf0e10cSrcweir 
342cdf0e10cSrcweir         logging(log,indent + ac.getAccessibleRole() + "," +
343cdf0e10cSrcweir             ac.getAccessibleName() + "(" +
344cdf0e10cSrcweir             ac.getAccessibleDescription() + "):" +
345cdf0e10cSrcweir             utils.getImplName(ac));
346cdf0e10cSrcweir 
347cdf0e10cSrcweir         XAccessibleComponent aComp = (XAccessibleComponent) UnoRuntime.queryInterface(
348cdf0e10cSrcweir             XAccessibleComponent.class, xacc);
349cdf0e10cSrcweir 
350cdf0e10cSrcweir         if (aComp != null) {
351cdf0e10cSrcweir             String bounds = "(" + aComp.getBounds().X + "," +
352cdf0e10cSrcweir                 aComp.getBounds().Y + ")" + " (" +
353cdf0e10cSrcweir                 aComp.getBounds().Width + "," +
354cdf0e10cSrcweir                 aComp.getBounds().Height + ")";
355cdf0e10cSrcweir             bounds = "The boundary Rectangle is " + bounds;
356cdf0e10cSrcweir             logging(log,indent + indent + bounds);
357cdf0e10cSrcweir         }
358cdf0e10cSrcweir 
359cdf0e10cSrcweir         boolean isShowing = ac.getAccessibleStateSet()
360cdf0e10cSrcweir         .contains(com.sun.star.accessibility.AccessibleStateType.SHOWING);
361cdf0e10cSrcweir         logging(log,indent + indent + "StateType contains SHOWING: " +
362cdf0e10cSrcweir             isShowing);
363cdf0e10cSrcweir 
364cdf0e10cSrcweir         int k = ac.getAccessibleChildCount();
365cdf0e10cSrcweir 
366cdf0e10cSrcweir         if (ac.getAccessibleChildCount() > 100) {
367cdf0e10cSrcweir             k = 50;
368cdf0e10cSrcweir         }
369cdf0e10cSrcweir 
370cdf0e10cSrcweir         for (int i = 0; i < k; i++) {
371cdf0e10cSrcweir             try {
372cdf0e10cSrcweir                 printAccessibleTree(log, ac.getAccessibleChild(i),
373cdf0e10cSrcweir                     indent + "  ");
374cdf0e10cSrcweir             } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
375cdf0e10cSrcweir                 System.out.println("Couldn't get Child");
376cdf0e10cSrcweir             }
377cdf0e10cSrcweir         }
378cdf0e10cSrcweir 
379cdf0e10cSrcweir         if (ac.getAccessibleChildCount() > 100) {
380cdf0e10cSrcweir             k = ac.getAccessibleChildCount();
381cdf0e10cSrcweir 
382cdf0e10cSrcweir             int st = ac.getAccessibleChildCount() - 50;
383cdf0e10cSrcweir             logging(log,indent + "  " + " ...... [skipped] ......");
384cdf0e10cSrcweir 
385cdf0e10cSrcweir             for (int i = st; i < k; i++) {
386cdf0e10cSrcweir                 try {
387cdf0e10cSrcweir                     printAccessibleTree(log, ac.getAccessibleChild(i),
388cdf0e10cSrcweir                         indent + "  ");
389cdf0e10cSrcweir                 } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
390cdf0e10cSrcweir                     System.out.println("Couldn't get Child");
391cdf0e10cSrcweir                 }
392cdf0e10cSrcweir             }
393cdf0e10cSrcweir         }
394cdf0e10cSrcweir     }
395cdf0e10cSrcweir 
accessibleToString(Object AC)396cdf0e10cSrcweir     public static String accessibleToString(Object AC) {
397cdf0e10cSrcweir         XAccessibleContext xAC = (XAccessibleContext) UnoRuntime.queryInterface(
398cdf0e10cSrcweir             XAccessibleContext.class, AC);
399cdf0e10cSrcweir 
400cdf0e10cSrcweir         if (xAC != null) {
401cdf0e10cSrcweir             return "" + xAC.getAccessibleRole() + "," +
402cdf0e10cSrcweir                 xAC.getAccessibleName() + "(" +
403cdf0e10cSrcweir                 xAC.getAccessibleDescription() + "):";
404cdf0e10cSrcweir         }
405cdf0e10cSrcweir 
406cdf0e10cSrcweir         XAccessible xA = (XAccessible) UnoRuntime.queryInterface(
407cdf0e10cSrcweir             XAccessible.class, AC);
408cdf0e10cSrcweir 
409cdf0e10cSrcweir         if (xA == null) {
410cdf0e10cSrcweir             return "(Not supported)";
411cdf0e10cSrcweir         }
412cdf0e10cSrcweir 
413cdf0e10cSrcweir         xAC = xA.getAccessibleContext();
414cdf0e10cSrcweir 
415cdf0e10cSrcweir         return "" + xAC.getAccessibleRole() + "," + xAC.getAccessibleName() +
416cdf0e10cSrcweir             "(" + xAC.getAccessibleDescription() + ")";
417cdf0e10cSrcweir     }
418cdf0e10cSrcweir 
equals(XAccessible c1, XAccessible c2)419cdf0e10cSrcweir     public static boolean equals(XAccessible c1, XAccessible c2) {
420cdf0e10cSrcweir         if ((c1 == null) || (c2 == null)) {
421cdf0e10cSrcweir             return c1 == c2;
422cdf0e10cSrcweir         }
423cdf0e10cSrcweir 
424cdf0e10cSrcweir         return AccessibilityTools.equals(c1.getAccessibleContext(),
425cdf0e10cSrcweir             c2.getAccessibleContext());
426cdf0e10cSrcweir     }
427cdf0e10cSrcweir 
equals(XAccessibleContext c1, XAccessibleContext c2)428cdf0e10cSrcweir     public static boolean equals(XAccessibleContext c1, XAccessibleContext c2) {
429cdf0e10cSrcweir         if ((c1 == null) || (c2 == null)) {
430cdf0e10cSrcweir             return c1 == c2;
431cdf0e10cSrcweir         }
432cdf0e10cSrcweir 
433cdf0e10cSrcweir         if (c1.getAccessibleRole() != c2.getAccessibleRole()) {
434cdf0e10cSrcweir             return false;
435cdf0e10cSrcweir         }
436cdf0e10cSrcweir 
437cdf0e10cSrcweir         if (!c1.getAccessibleName().equals(c2.getAccessibleName())) {
438cdf0e10cSrcweir             return false;
439cdf0e10cSrcweir         }
440cdf0e10cSrcweir 
441cdf0e10cSrcweir         if (!c1.getAccessibleDescription()
442cdf0e10cSrcweir         .equals(c2.getAccessibleDescription())) {
443cdf0e10cSrcweir             return false;
444cdf0e10cSrcweir         }
445cdf0e10cSrcweir 
446cdf0e10cSrcweir         if (c1.getAccessibleChildCount() != c2.getAccessibleChildCount()) {
447cdf0e10cSrcweir             return false;
448cdf0e10cSrcweir         }
449cdf0e10cSrcweir 
450cdf0e10cSrcweir         return AccessibilityTools.equals(c1.getAccessibleParent(),
451cdf0e10cSrcweir             c2.getAccessibleParent());
452cdf0e10cSrcweir     }
453cdf0e10cSrcweir 
logging(PrintWriter log, String content)454cdf0e10cSrcweir     private static void logging(PrintWriter log, String content){
455cdf0e10cSrcweir         if (debug) log.println(content);
456cdf0e10cSrcweir     }
457cdf0e10cSrcweir }