/************************************************************** * * 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. * *************************************************************/ import java.awt.event.ActionListener; import javax.swing.*; import java.awt.*; import java.util.*; import com.sun.star.awt.XTopWindowListener; import com.sun.star.uno.UnoRuntime; import com.sun.star.bridge.XUnoUrlResolver; import com.sun.star.lang.XMultiServiceFactory; import com.sun.star.accessibility.*; import com.sun.star.awt.XExtendedToolkit; /** This class is used as a thread and registers or unregsiters a listener given the constructor at all nodes of a tree of accessibility objects. */ public class RegistrationThread implements Runnable { /** Start a new thread that adds or removes the given listener at all accessible objects in the sub-tree rooted in the given accessible object. @param aListener The listener that is added or removed. @param xRoot The root of the sub-tree of accessibility objects. @param bRegister This flag decides whether to add or remove the listener. */ public RegistrationThread ( EventListenerProxy aListener, XAccessibleContext xRoot, boolean bRegister, boolean bShowMessages) { maListener = aListener; mxRoot = xRoot; mbRegister = bRegister; mbShowMessages = bShowMessages; if (mxRoot != null) { if (mbShowMessages) MessageArea.println ("starting to register at " + mxRoot.getAccessibleName()); new Thread (this, "RegistrationThread").start(); } } public void run () { System.out.println ("starting registration"); long nNodeCount = traverseTree (mxRoot); System.out.println ("ending registration"); if (mbShowMessages) { if ( ! mbRegister) MessageArea.print ("un"); MessageArea.println ("registered at " + nNodeCount + " objects in accessibility tree of " + mxRoot.getAccessibleName()); } } /** Register this object as listener for accessibility events at all nodes of the given tree. @param xRoot The root node of the tree at which to register. */ public long traverseTree (XAccessibleContext xRoot) { long nNodeCount = 0; if (xRoot != null) { // Register the root node. XAccessibleEventBroadcaster xBroadcaster = (XAccessibleEventBroadcaster) UnoRuntime.queryInterface ( XAccessibleEventBroadcaster.class, xRoot); if (xBroadcaster != null) { if (mbRegister) xBroadcaster.addEventListener (maListener); else xBroadcaster.removeEventListener (maListener); nNodeCount += 1; } // Call this method recursively to register all sub-trees. try { int nChildCount = xRoot.getAccessibleChildCount(); for (int i=0; i