Files
libreoffice/odk/examples/DevelopersGuide/Accessibility/RegistrationThread.java
Thorsten Behrens 70626249cd API CHANGE a11y unpublishing and add/removeListener rename.
The a11y API has never really been picked up by tools vendors, let's
not tie ourselves up here for no good reason.

This unpublishes all css::accessibility, and dependend API.

With that, we can change the rather unfortunately-named add/
removeEventListener to be add/removeAccessibleEventListener, thus
not conflicting with the XComponent methods of the same name.

Change-Id: I595598c3a8e46415f80b2780f333333174865fe4
2012-11-29 16:58:16 +01:00

148 lines
5.6 KiB
Java

/*************************************************************************
*
* The Contents of this file are made available subject to the terms of
* the BSD license.
*
* Copyright 2000, 2010 Oracle and/or its affiliates.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of Sun Microsystems, Inc. nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*************************************************************************/
import com.sun.star.uno.UnoRuntime;
import com.sun.star.accessibility.*;
/** 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.addAccessibleEventListener (maListener);
else
xBroadcaster.removeAccessibleEventListener (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;
}