blob: 97f58596e14de455f649b2065d6d2627f9e2daae [file] [log] [blame]
/**************************************************************
*
* 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<nChildCount; i++)
{
XAccessible xChild = xRoot.getAccessibleChild (i);
if (xChild != null)
nNodeCount += traverseTree (xChild.getAccessibleContext());
}
}
catch (com.sun.star.lang.IndexOutOfBoundsException aException)
{
// The set of children has changed since our last call to
// getAccesibleChildCount(). Don't try any further on this
// sub-tree.
}
catch (com.sun.star.lang.DisposedException aException)
{
// The child has been destroyed since our last call to
// getAccesibleChildCount(). That is OK. Don't try any
// further on this sub-tree.
}
}
return nNodeCount;
}
private EventListenerProxy maListener;
private XAccessibleContext mxRoot;
private boolean mbRegister;
private boolean mbShowMessages;
}