summaryrefslogtreecommitdiff
path: root/toolkit/test/accessibility/AccessibilityTreeModel.java
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/test/accessibility/AccessibilityTreeModel.java')
-rw-r--r--toolkit/test/accessibility/AccessibilityTreeModel.java744
1 files changed, 121 insertions, 623 deletions
diff --git a/toolkit/test/accessibility/AccessibilityTreeModel.java b/toolkit/test/accessibility/AccessibilityTreeModel.java
index 8c6fce5a4d49..fe7e545797b8 100644
--- a/toolkit/test/accessibility/AccessibilityTreeModel.java
+++ b/toolkit/test/accessibility/AccessibilityTreeModel.java
@@ -1,13 +1,11 @@
-
-import javax.swing.tree.TreeModel;
-import javax.swing.tree.TreePath;
-import javax.swing.event.TreeModelListener;
import javax.swing.event.TreeModelEvent;
+import javax.swing.event.TreeModelListener;
+import javax.swing.tree.TreePath;
+
import java.util.Vector;
import java.util.HashMap;
import java.util.Enumeration;
-import java.util.LinkedList;
import drafts.com.sun.star.accessibility.*;
@@ -19,62 +17,24 @@ import com.sun.star.lang.XServiceInfo;
import com.sun.star.lang.XServiceName;
public class AccessibilityTreeModel
- implements TreeModel, XAccessibleEventListener
+ extends AccessibilityTreeModelBase
{
- // Map to translate from accessible object to corresponding tree node.
- protected HashMap maXAccessibleToNode;
-
- // Making both of these static is clearly a hack.
- protected static MessageInterface maMessageArea;
- protected static Print maPrinter;
- protected static boolean mbVerbose = true;
-
- // If the lock count is higher then zero, then no events are processed.
- private int mnLockCount;
-
- // The list of TreeModelListener objects.
- private Vector maTMListeners;
-
- // The root node of the tree. Use setRoot to change it.
- private AccessibleTreeNode maRoot = null;
-
- // default handlers
- private static Vector aDefaultHandlers;
- private static NodeHandler maContextHandler = new AccessibleContextHandler();
- private static NodeHandler maTextHandler = new AccessibleTextHandler();
- private static NodeHandler maEditableTextHandler = new AccessibleEditableTextHandler();
- private static NodeHandler maComponentHandler = new AccessibleComponentHandler();
- private static NodeHandler maExtendedComponentHandler = new AccessibleExtendedComponentHandler();
- private static NodeHandler maActionHandler = new AccessibleActionHandler();
- private static NodeHandler maImageHandler = new AccessibleImageHandler();
- private static NodeHandler maTableHandler = new AccessibleTableHandler();
- private static NodeHandler maCellHandler = new AccessibleCellHandler();
- private static NodeHandler maHypertextHandler = new AccessibleHypertextHandler();
- private static NodeHandler maHyperlinkHandler = new AccessibleHyperlinkHandler();
- private static NodeHandler maSelectionHandler = new AccessibleSelectionHandler();
- private static NodeHandler maRelationHandler = new AccessibleRelationHandler();
- private static NodeHandler maTreeHandler = new AccessibleTreeHandler();
- private static NodeHandler maUNOHandler = new AccessibleUNOHandler();
-
- private Canvas maCanvas;
-
-
- public AccessibilityTreeModel (AccessibleTreeNode aRoot, MessageInterface aMessageArea, Print aPrinter)
+ public AccessibilityTreeModel (AccessibleTreeNode aRoot)
{
// create default node (unless we have a 'proper' node)
if( ! (aRoot instanceof AccessibleTreeNode) )
aRoot = new StringNode ("Root", null);
setRoot (aRoot);
- maMessageArea = aMessageArea;
- maPrinter = aPrinter;
- maTMListeners = new Vector();
- maXAccessibleToNode = new HashMap ();
+ maNodeMap = new NodeMap();
- // syncronous or asyncronous event delivery? (i.e. same thread
- // or in s seperate event delivery thread)
- // xListener = this; // syncronous event delivery
- xListener = new QueuedListener(); // asyncronous event delivery
+ maEventListener = new EventListener (this);
+ mxListener = new QueuedListener (maEventListener);
+ }
+
+ public void clear ()
+ {
+ maNodeMap.Clear();
}
/** Lock the tree. While the tree is locked, events from the outside are
@@ -117,117 +77,52 @@ public class AccessibilityTreeModel
- public Object getRoot()
- {
- return maRoot;
- }
public synchronized void setRoot (AccessibleTreeNode aRoot)
{
- if (maRoot == null)
- maRoot = aRoot;
+ if (getRoot() == null)
+ super.setRoot (aRoot);
else
{
lock ();
- clear ();
- maRoot = aRoot;
- unlock (maRoot);
+ maNodeMap.ForEach (new NodeMapCallback () {
+ public void Apply (AccTreeNode aNode)
+ {
+ if (maCanvas != null)
+ maCanvas.removeNode (aNode);
+ removeAccListener ((AccTreeNode)aNode);
+ }
+ });
+ maNodeMap.Clear ();
+
+ setRoot (aRoot);
+ unlock (aRoot);
}
}
- /** Clears the model. That removes all nodes from the internal structures.
- */
- public void clear ()
- {
- System.out.println ("clearing the whole tree");
- Object[] aNodes = maXAccessibleToNode.values().toArray();
- for (int i=0; i<aNodes.length; i++)
- removeNode ((AccessibleTreeNode)aNodes[i]);
- }
//
// child management:
//
- public int getChildCount(Object aParent)
- {
- return (aParent instanceof AccessibleTreeNode) ?
- ((AccessibleTreeNode)aParent).getChildCount() : 0;
- }
- public Object getChild (Object aParent, int nIndex)
- {
- Object aChild = null;
- try
- {
- if (aParent instanceof AccessibleTreeNode)
- aChild = getChild ((AccessibleTreeNode)aParent, nIndex);
- else
- System.out.println ("getChild called for unknown parent node");
- }
- catch (com.sun.star.lang.IndexOutOfBoundsException e)
- {
- aChild = ("no child " + nIndex + " from " + aParent + ": " + e);
- }
- return aChild;
- }
/** Delegate the request to the parent and then register listeners at
the child and add the child to the canvas.
*/
- public AccessibleTreeNode getChild (AccessibleTreeNode aParent, int nIndex)
- throws com.sun.star.lang.IndexOutOfBoundsException
+ public Object getChild (Object aParent, int nIndex)
{
- AccessibleTreeNode aChild = null;
- if (aParent != null)
- aChild = aParent.getChild(nIndex);
-
- // Keep translation table up-to-date.
- addNode (aChild);
+ AccessibleTreeNode aChild = (AccessibleTreeNode)super.getChild (aParent, nIndex);
if (aChild == null)
System.out.println ("getChild: child not found");
+ else
+ // Keep translation table up-to-date.
+ addNode (aChild);
return aChild;
}
- /** iterate over all children and look for child */
- public int getIndexOfChild (Object aParent, Object aChild)
- {
- int nIndex = -1;
- try
- {
- if ((aParent instanceof AccessibleTreeNode) && (aChild instanceof AccessibleTreeNode))
- {
- AccessibleTreeNode aParentNode = (AccessibleTreeNode) aParent;
- AccessibleTreeNode aChildNode = (AccessibleTreeNode) aChild;
-
- int nChildCount = aParentNode.getChildCount();
- for( int i = 0; i < nChildCount; i++ )
- {
- if (aChildNode.equals (aParentNode.getChild (i)))
- {
- nIndex = i;
- break;
- }
- }
- }
- }
- catch (com.sun.star.lang.IndexOutOfBoundsException e)
- {
- // Return -1 by falling through.
- }
-
- // not found?
- return nIndex;
- }
-
-
- public boolean isLeaf (Object aNode)
- {
- return (aNode instanceof AccessibleTreeNode) ?
- ((AccessibleTreeNode)aNode).isLeaf() : true;
- }
@@ -246,7 +141,7 @@ public class AccessibilityTreeModel
{
// depth-first removal of children
while (aNode.getChildCount() > 0)
- if ( ! removeChild (aNode.getChild (0)))
+ if ( ! removeChild (aNode.getChildNoCreate (0)))
break;
// Remove node from its parent.
@@ -257,7 +152,7 @@ public class AccessibilityTreeModel
aParent.removeChild (nIndex);
}
- removeNode (aNode);
+ maNodeMap.RemoveNode (aNode);
}
}
catch (Exception e)
@@ -270,26 +165,21 @@ public class AccessibilityTreeModel
return true;
}
- protected void removeNode (AccessibleTreeNode aNode)
+ public void removeNode (XAccessibleContext xNode)
{
- try
+ if (xNode != null)
{
- if ((aNode != null) && (aNode instanceof AccTreeNode))
- {
- // Remove node itself from internal data structures.
- removeFromCanvas ((AccTreeNode)aNode);
- removeAccListener ((AccTreeNode)aNode);
- maXAccessibleToNode.remove (((AccTreeNode)aNode).getAccessible());
- }
- }
- catch (Exception e)
- {
- System.out.println ("caught exception while removing node "
- + aNode + " : " + e);
- e.printStackTrace();
+ AccessibleTreeNode aNode = maNodeMap.GetNode (xNode);
+ AccessibleTreeNode aRootNode = (AccessibleTreeNode)getRoot();
+ TreeModelEvent aEvent = createEvent (aRootNode, aNode);
+ removeChild (aNode);
+ System.out.println (aNode);
+ fireTreeNodesRemoved (aEvent);
+ maCanvas.repaint ();
}
}
+
/** Add add a new child to a parent.
@return
Returns the new or existing representation of the specified
@@ -304,7 +194,7 @@ public class AccessibilityTreeModel
// First make sure that the accessible object does not already have
// a representation.
- aChildNode = (AccessibleTreeNode)maXAccessibleToNode.get (xNewChild);
+ aChildNode = maNodeMap.GetNode(xNewChild);
if (aChildNode == null)
aChildNode = aParentNode.addAccessibleChild (xNewChild);
else
@@ -319,6 +209,31 @@ public class AccessibilityTreeModel
return aChildNode;
}
+ public void addChild (XAccessibleContext xParent, XAccessible xChild)
+ {
+ AccessibleTreeNode aParentNode = maNodeMap.GetNode (xParent);
+ if (aParentNode instanceof AccTreeNode)
+ {
+ AccessibleTreeNode aChild = addChild ((AccTreeNode)aParentNode, xChild);
+ if (addNode (aChild))
+ {
+ if (maCanvas != null)
+ maCanvas.updateNode ((AccTreeNode)aParentNode);
+
+ // A call to fireTreeNodesInserted for xNew
+ // should be sufficient but at least the
+ // StringNode object that contains the number of
+ // children also changes and we do not know its
+ // index relative to its parent. Therefore the
+ // more expensive fireTreeStructureChanged is
+ // necessary.
+ fireTreeNodesInserted (createEvent (xParent, xChild));
+ updateNode (xParent, AccessibleTreeHandler.class);
+ }
+ maCanvas.repaint ();
+ }
+ }
+
/** Add the child node to the internal tree structure.
@param aNode
@@ -329,15 +244,16 @@ public class AccessibilityTreeModel
boolean bRet = false;
try
{
- if (aNode instanceof AccTreeNode)
+ if ( ! maNodeMap.ValueIsMember (aNode))
{
- AccTreeNode aChild = (AccTreeNode)aNode;
- XAccessible xChild = aChild.getAccessible();
- if (maXAccessibleToNode.get (xChild) == null)
+ if (aNode instanceof AccTreeNode)
{
+ AccTreeNode aChild = (AccTreeNode)aNode;
+ XAccessibleContext xChild = aChild.getContext();
registerAccListener (aChild);
- maXAccessibleToNode.put (xChild, aChild);
- addToCanvas (aChild);
+ if (maCanvas != null)
+ maCanvas.addNode (aChild);
+ maNodeMap.InsertNode (xChild, aChild);
}
bRet = true;
}
@@ -355,13 +271,6 @@ public class AccessibilityTreeModel
- /** Return the tree node that is associated with the given accessible object.
- */
- public AccessibleTreeNode getNode (XAccessible xAccessible)
- {
- return (AccessibleTreeNode)maXAccessibleToNode.get (xAccessible);
- }
-
/** create path to node, suitable for TreeModelEvent constructor
* @see javax.swing.event.TreeModelEvent#TreeModelEvent
*/
@@ -379,19 +288,8 @@ public class AccessibilityTreeModel
// tree cache, and we should get removed as soon as they are out.
//
- public void addTreeModelListener(TreeModelListener l)
- {
- maTMListeners.add(l);
- }
-
- public void removeTreeModelListener(TreeModelListener l)
- {
- maTMListeners.remove(l);
- }
-
protected void fireTreeNodesChanged(TreeModelEvent e)
{
- System.out.println("treeNodesChanges: " + e);
for(int i = 0; i < maTMListeners.size(); i++)
{
((TreeModelListener)maTMListeners.get(i)).treeNodesChanged(e);
@@ -400,7 +298,6 @@ public class AccessibilityTreeModel
protected void fireTreeNodesInserted(final TreeModelEvent e)
{
- System.out.println("treeNodesInserted: " + e);
for(int i = 0; i < maTMListeners.size(); i++)
{
((TreeModelListener)maTMListeners.get(i)).treeNodesInserted(e);
@@ -409,7 +306,6 @@ public class AccessibilityTreeModel
protected void fireTreeNodesRemoved(final TreeModelEvent e)
{
- System.out.println("treeNodesRemoved: " + e);
for(int i = 0; i < maTMListeners.size(); i++)
{
((TreeModelListener)maTMListeners.get(i)).treeNodesRemoved(e);
@@ -418,33 +314,32 @@ public class AccessibilityTreeModel
protected void fireTreeStructureChanged(final TreeModelEvent e)
{
- System.out.println("treeStructureChanged: " + e);
for(int i = 0; i < maTMListeners.size(); i++)
{
((TreeModelListener)maTMListeners.get(i)).treeStructureChanged(e);
}
}
- protected TreeModelEvent createEvent (XAccessible xParent)
+ protected TreeModelEvent createEvent (XAccessibleContext xParent)
{
- AccessibleTreeNode aParentNode = (AccessibleTreeNode)maXAccessibleToNode.get (xParent);
+ AccessibleTreeNode aParentNode = maNodeMap.GetNode (xParent);
return new TreeModelEvent (this, createPath (aParentNode));
}
/** Create a TreeModelEvent object that informs listeners that one child
has been removed from or inserted into its parent.
*/
- public TreeModelEvent createEvent (XAccessible xParent, XAccessible xChild)
+ public TreeModelEvent createEvent (XAccessibleContext xParent, XAccessible xChild)
{
- AccessibleTreeNode aParentNode = (AccessibleTreeNode)maXAccessibleToNode.get (xParent);
+ AccessibleTreeNode aParentNode = maNodeMap.GetNode (xParent);
return createEvent (aParentNode, xParent);
}
- public TreeModelEvent createEvent (AccessibleTreeNode aParentNode, XAccessible xChild)
+ public TreeModelEvent createEvent (AccessibleTreeNode aParentNode, XAccessibleContext xChild)
{
AccessibleTreeNode aChildNode = null;
if (xChild != null)
- aChildNode = (AccessibleTreeNode)maXAccessibleToNode.get (xChild);
+ aChildNode = maNodeMap.GetNode (xChild);
return createEvent (aParentNode, aChildNode);
}
@@ -515,12 +410,6 @@ public class AccessibilityTreeModel
protected void fire( TreeModelListener l) { }
}
- /** The listener to be registered with the accessible objects.
- * Could be set to 'this' for same-thread event delivery, or to an
- * instance of QueuedListener for multi-threaded delivery. May
- * not be changed, since this would trip the
- * register/removeAccListener logic. */
- private final XAccessibleEventListener xListener;
protected XAccessibleEventBroadcaster getBroadcaster (Object aObject)
@@ -539,7 +428,7 @@ public class AccessibilityTreeModel
XAccessibleEventBroadcaster xBroadcaster = getBroadcaster( aObject );
if (xBroadcaster != null)
{
- xBroadcaster.addEventListener( xListener );
+ xBroadcaster.addEventListener( mxListener );
}
}
@@ -548,458 +437,67 @@ public class AccessibilityTreeModel
XAccessibleEventBroadcaster xBroadcaster = getBroadcaster( aObject );
if (xBroadcaster != null)
{
- xBroadcaster.removeEventListener( xListener );
+ xBroadcaster.removeEventListener( mxListener );
}
}
- //
- // tree model edit
- //
- public void valueForPathChanged(TreePath path, Object newValue) { }
-
-
- //
- // static methods + members for creating default nodes
- //
-
-
-
- /** add default handlers based on the supported interfaces */
- public static void addDefaultHandlers (AccTreeNode aNode, XAccessibleContext xContext)
- {
- if (false)
- {
- // Slow but complete version: try each handler type separately.
- aNode.addHandler (maContextHandler.createHandler (xContext));
- aNode.addHandler (maTextHandler.createHandler (xContext));
- aNode.addHandler (maEditableTextHandler.createHandler (xContext));
- aNode.addHandler (maComponentHandler.createHandler (xContext));
- aNode.addHandler (maExtendedComponentHandler.createHandler (xContext));
- aNode.addHandler (maActionHandler.createHandler (xContext));
- aNode.addHandler (maImageHandler.createHandler (xContext));
- aNode.addHandler (maTableHandler.createHandler (xContext));
- aNode.addHandler (maCellHandler.createHandler (xContext));
- aNode.addHandler (maHypertextHandler.createHandler (xContext));
- aNode.addHandler (maHyperlinkHandler.createHandler (xContext));
- aNode.addHandler (maSelectionHandler.createHandler (xContext));
- aNode.addHandler (maRelationHandler.createHandler (xContext));
- aNode.addHandler (maUNOHandler.createHandler (xContext));
- aNode.addHandler (maTreeHandler.createHandler (xContext));
- }
- else
- {
- // Exploit dependencies between interfaces.
- NodeHandler aHandler;
- aNode.addHandler (maContextHandler.createHandler (xContext));
-
- aHandler = maTextHandler.createHandler (xContext);
- if (aHandler != null)
- {
- aNode.addHandler (aHandler);
- aNode.addHandler (maEditableTextHandler.createHandler (xContext));
- aNode.addHandler (maHypertextHandler.createHandler (xContext));
- aNode.addHandler (maHyperlinkHandler.createHandler (xContext));
- }
- aHandler = maComponentHandler.createHandler (xContext);
- if (aHandler != null)
- {
- aNode.addHandler (aHandler);
- aNode.addHandler (maExtendedComponentHandler.createHandler (xContext));
- }
- aNode.addHandler (maActionHandler.createHandler (xContext));
- aNode.addHandler (maImageHandler.createHandler (xContext));
- aNode.addHandler (maTableHandler.createHandler (xContext));
- aNode.addHandler (maRelationHandler.createHandler (xContext));
- aNode.addHandler (maCellHandler.createHandler (xContext));
- aNode.addHandler (maSelectionHandler.createHandler (xContext));
- aNode.addHandler (maUNOHandler.createHandler (xContext));
- aNode.addHandler (maTreeHandler.createHandler (xContext));
- }
- }
- /** create a node with the default handlers */
- public static AccTreeNode createDefaultNode (XAccessible xAccessible, AccessibleTreeNode aParent)
+ public void setCanvas( Canvas aCanvas )
{
- // default: aObject + aDisplay
- String sDisplay;
-
- // if we are accessible, we use the context + name instead
- XAccessibleContext xContext = null;
- if (xAccessible != null)
- xContext = xAccessible.getAccessibleContext();
- if (xContext != null)
- {
- sDisplay = xContext.getAccessibleName();
- if (sDisplay.length()==0)
- {
- sDisplay = "<no name> Role: "
- + AccessibleContextHandler.GetRoleName (
- xContext.getAccessibleRole());
- }
- }
- else
- sDisplay = new String ("not accessible");
-
-
- // create node, and add default handlers
- AccTreeNode aNode = new AccTreeNode (xAccessible, xContext, sDisplay, aParent);
- AccessibilityTreeModel.addDefaultHandlers (aNode, xContext);
-
- if (mbVerbose)
- maPrinter.print (". ");
-
- if (aNode == null)
- System.out.println ("createDefaultNode == null");
- return aNode;
+ maCanvas = aCanvas;
}
-
- //
- // XAccessibleEventListener interface
- //
-
- private static String objectToString(Object aObject)
+ public void updateNode (XAccessibleContext xSource, java.lang.Class class1)
{
- if (aObject == null)
- return null;
- else
- return aObject.toString();
- /*
- if( aObject instanceof Any )
- aObject = ((Any)aObject).getObject();
-
- if( aObject instanceof XInterface )
- {
- XServiceInfo xInfo =
- (XServiceInfo)UnoRuntime.queryInterface( XServiceInfo.class,
- aObject);
- aObject = (xInfo != null) ? xInfo.getImplementationName()
- : aObject.getClass().toString();
- }
-
- return (aObject != null) ? aObject.toString() : null;
- */
+ updateNode (xSource, class1,null);
}
- public void disposing( EventObject aEvent)
- {
- System.out.println("dispose: " + objectToString(aEvent.Source));
- removeChild ((AccessibleTreeNode)maXAccessibleToNode.get (aEvent.Source));
- /*
- if( knowsNode( aEvent.Source ) )
- {
- System.out.println("ERROR: Dispose for living node called! " +
- "Maybe notifications don't work?");
- removeNode( aEvent.Source );
-// fireTreeStructureChanged( createEvent( getRoot() ) );
- }
- */
- }
- private void handleEvent (XAccessible xSource, java.lang.Class class1)
- { handleEvent (xSource, class1,null); }
- private void handleEvent (XAccessible xSource, java.lang.Class class1, java.lang.Class class2)
+ /** Get a list of children of the node associated with xSource that are
+ affected by the given handlers. Fire events that these children may
+ have changed in the tree view. Update the canvas representation of
+ xSource.
+ */
+ public void updateNode (XAccessibleContext xSource,
+ java.lang.Class class1, java.lang.Class class2)
{
- AccessibleTreeNode aNode = (AccessibleTreeNode)maXAccessibleToNode.get (xSource);
+ AccessibleTreeNode aNode = maNodeMap.GetNode (xSource);
+ System.out.println ("updateing node " + xSource + " " + aNode);
if (aNode instanceof AccTreeNode)
{
- Vector aChildIndices = ((AccTreeNode)aNode).update (
+ // Get list of affected children.
+ Vector aChildIndices = ((AccTreeNode)aNode).updateChildren (
class1, class2);
+ // Fire events that these children may have changed.
fireTreeNodesChanged (
createChangeEvent ((AccTreeNode)aNode, aChildIndices));
- updateOnCanvas ((AccTreeNode)aNode);
- maCanvas.repaint ();
- }
- }
-
- static final String[] aEventNames =
- {
- "[UNKNOWN]", "ACTION", "ACTIVE_DESCENDANT", "CARET", "CHILD",
- "DESCRIPTION", "HYPERTEXT_OFFSET", "NAME", "SELECTION", "STATE",
- "TABLE_CAPTION_CHANGED", "TABLE_COLUMN_DESCRIPTION_CHANGED",
- "TABLE_COLUMN_HEADER_CHANGED", "TABLE_MODEL_CHANGED",
- "TABLE_ROW_DESCRIPTION_CHANGED", "TABLE_ROW_HEADER_CHANGED",
- "TABLE_SUMMARY_CHANGED", "TEXT", "VALUE", "VISIBLE_DATA",
- "CONTROLLED_BY_PROPERTY", "CONTROLLER_FOR_PROPERTY",
- "LABEL_FOR_PROPERTY", "LABELED_BY_PROPERTY", "MEMBER_OF_PROPERTY",
- "CONTENT_FLOWS_FROM", "CONTENT_FLOWS_TO",
- "[UNKNOWN]"
- };
-
- /** This method is called from accessible objects that broadcast
- modifications of themselves or from their children. The event is
- processed only, except printing some messages, if the tree is not
- locked. It should be locked during changes to its internal
- structure like expanding nodes.
- */
- public void notifyEvent( AccessibleEventObject aEvent )
- {
-
- int nId = aEvent.EventId;
- if( (nId < 0) || (nId >= aEventNames.length) )
- nId = 0;
-
- System.out.println( "notify: " + aEvent.EventId + " "
- + aEventNames[nId] + ": ["
- + objectToString(aEvent.Source) + "] "
- + objectToString(aEvent.OldValue) + "->"
- + objectToString(aEvent.NewValue) );
-
- if (mnLockCount > 0)
- {
- System.out.println ("ignoring event because tree is locked");
- return;
- }
-
- XAccessible xSource = (XAccessible)UnoRuntime.queryInterface(
- XAccessible.class,aEvent.Source);
-
- switch( aEvent.EventId )
- {
- case AccessibleEventId.ACCESSIBLE_CHILD_EVENT:
- // fire insertion and deletion events:
- if (aEvent.OldValue != null)
- {
- XAccessible xOld = (XAccessible)UnoRuntime.queryInterface(
- XAccessible.class,aEvent.OldValue);
- // Create event before removing the node to get the old
- // index of the node.
- TreeModelEvent aRemoveEvent = createEvent (xSource, xOld);
- removeChild ((AccessibleTreeNode)maXAccessibleToNode.get (xOld));
- fireTreeNodesRemoved (aRemoveEvent);
- handleEvent (xSource, AccessibleTreeHandler.class);
- }
- // Insertion and removal of children should be mutually
- // exclusive. But then there is this 'should' ...
- if (aEvent.NewValue != null)
- {
- XAccessible xNew = (XAccessible)UnoRuntime.queryInterface(
- XAccessible.class,aEvent.NewValue);
- // Create event after inserting it so that its new index
- // in the parent can be determined.
- AccessibleTreeNode aParentNode = getNode (xSource);
- if (aParentNode instanceof AccTreeNode)
- {
- AccessibleTreeNode aChild = addChild ((AccTreeNode)aParentNode, xNew);
- if (addNode (aChild))
- {
- // ((AccTreeNode)aParentNode).update ();
- updateOnCanvas ((AccTreeNode)aParentNode);
-
- // A call to fireTreeNodesInserted for xNew
- // should be sufficient but at least the
- // StringNode object that contains the number of
- // children also changes and we do not know its
- // index relative to its parent. Therefore the
- // more expensive fireTreeStructureChanged is
- // necessary.
- fireTreeNodesInserted (createEvent (xSource, xNew));
- handleEvent (xSource, AccessibleTreeHandler.class);
- }
- }
- }
- maCanvas.repaint ();
- break;
-
- case AccessibleEventId.ACCESSIBLE_TABLE_MODEL_EVENT:
- AccessibleTableModelChange aModelChange = (AccessibleTableModelChange)aEvent.NewValue;
- System.out.println( "Range: StartRow " + aModelChange.FirstRow +
- " StartColumn " + aModelChange.FirstColumn +
- " EndRow " + aModelChange.LastRow +
- " EndColumn " + aModelChange.LastColumn +
- " Id " + aModelChange.Type);
- break;
-
- case AccessibleEventId.ACCESSIBLE_VISIBLE_DATA_EVENT:
- handleEvent (xSource,
- AccessibleComponentHandler.class,
- AccessibleExtendedComponentHandler.class);
- break;
-
-
- case AccessibleEventId.ACCESSIBLE_NAME_EVENT:
- case AccessibleEventId.ACCESSIBLE_DESCRIPTION_EVENT:
- case AccessibleEventId.ACCESSIBLE_STATE_EVENT:
- case AccessibleEventId.CONTROLLED_BY_EVENT:
- case AccessibleEventId.CONTROLLER_FOR_EVENT:
- case AccessibleEventId.LABEL_FOR_EVENT:
- case AccessibleEventId.LABELED_BY_EVENT:
- case AccessibleEventId.MEMBER_OF_EVENT:
- case AccessibleEventId.ACCESSIBLE_SELECTION_EVENT:
- handleEvent (xSource, AccessibleContextHandler.class);
- break;
-
- case AccessibleEventId.ACCESSIBLE_TABLE_CAPTION_EVENT:
- case AccessibleEventId.ACCESSIBLE_TABLE_COLUMN_DESCRIPTION_EVENT:
- case AccessibleEventId.ACCESSIBLE_TABLE_COLUMN_HEADER_EVENT:
- case AccessibleEventId.ACCESSIBLE_TABLE_ROW_DESCRIPTION_EVENT:
- case AccessibleEventId.ACCESSIBLE_TABLE_ROW_HEADER_EVENT:
- case AccessibleEventId.ACCESSIBLE_TABLE_SUMMARY_EVENT:
- handleEvent (xSource, AccessibleTableHandler.class);
- break;
-
- case AccessibleEventId.ACCESSIBLE_ACTION_EVENT:
- handleEvent (xSource, AccessibleActionHandler.class);
- break;
-
- case AccessibleEventId.ACCESSIBLE_HYPERTEXT_EVENT:
- handleEvent (xSource, AccessibleHypertextHandler.class);
- break;
-
- case AccessibleEventId.ACCESSIBLE_ACTIVE_DESCENDANT_EVENT:
- case AccessibleEventId.ACCESSIBLE_CARET_EVENT:
- case AccessibleEventId.ACCESSIBLE_TEXT_EVENT:
- case AccessibleEventId.ACCESSIBLE_VALUE_EVENT:
- handleEvent (xSource, AccessibleTextHandler.class);
- break;
-
- default:
- break;
+ // Update the graphical representation of aNode in the Canvas.
+ if (maCanvas != null)
+ maCanvas.updateNode ((AccTreeNode)aNode);
+ maCanvas.repaint ();
}
}
+ // Making both of these static is clearly a hack.
+ protected static MessageInterface maMessageArea;
+ protected static Print maPrinter;
+ protected static boolean mbVerbose = true;
- //
- // canvas
- //
-
- public void setCanvas( Canvas aCanvas )
- {
- maCanvas = aCanvas;
- }
-
- protected void addToCanvas (AccTreeNode aNode)
- {
- if (maCanvas != null)
- maCanvas.addNode (aNode);
- }
-
- protected void removeFromCanvas (AccTreeNode aNode)
- {
- if (maCanvas != null)
- maCanvas.removeNode (aNode);
- }
-
- protected void updateOnCanvas (AccTreeNode aNode)
- {
- if (maCanvas != null)
- maCanvas.updateNode (aNode);
- }
-
-
-
-
-
- /** QueuedListener implements an AccessibleEventListener which
- * delegates all events to another such listener, but does so in a
- * seperate thread */
- class QueuedListener
- implements XAccessibleEventListener, Runnable
- {
- public QueuedListener()
- {
- System.out.println ("starting new queued listener");
-
- // initiate thread
- new Thread(this, "QueuedListener").start();
- }
-
- /** The queue of event objects, LinkedList<Runnable>
- * The queue object will also serve as lock for the
- * consumer/producer type syncronization.
- */
- protected LinkedList aQueue = new LinkedList();
-
- /// This thread's main method: deliver all events
- public void run()
- {
- // in an infinite loop, check for events to deliver, then
- // wait on lock (which will be notified when new events arrive)
- while( true )
- {
- Runnable aEvent = null;
- do
- {
- synchronized( aQueue )
- {
- aEvent = (aQueue.size() > 0) ?
- (Runnable)aQueue.removeFirst() : null;
- }
- if( aEvent != null )
- {
- System.out.println("Deliver event: " +
- aEvent.hashCode());
- try
- {
- aEvent.run();
- }
- catch( Throwable e )
- {
- System.out.println(
- "Exception during event delivery: " + e );
- e.printStackTrace();
- }
- }
- }
- while( aEvent != null );
-
- try
- {
- synchronized( aQueue )
- {
- aQueue.wait();
- }
- }
- catch( Exception e )
- {
- // can't wait? odd!
- System.err.println("Can't wait!");
- e.printStackTrace();
- }
- }
- }
+ /** The listener to be registered with the accessible objects.
+ * Could be set to 'this' for same-thread event delivery, or to an
+ * instance of QueuedListener for multi-threaded delivery. May
+ * not be changed, since this would trip the
+ * register/removeAccListener logic. */
+ private final XAccessibleEventListener mxListener;
+ // Map to translate from accessible object to corresponding tree node.
+ private NodeMap maNodeMap;
- public void disposing( final EventObject aEvent)
- {
- System.out.println( "Queue disposing: " + aEvent.hashCode() );
- synchronized( aQueue )
- {
- aQueue.addLast( new Runnable()
- {
- public void run()
- {
- AccessibilityTreeModel.this.disposing( aEvent );
- }
- public int hashCode()
- {
- return aEvent.hashCode();
- }
- } );
- aQueue.notify();
- }
- }
+ // If the lock count is higher then zero, then no events are processed.
+ private int mnLockCount;
- public void notifyEvent( final AccessibleEventObject aEvent )
- {
- System.out.println( "Queue notifyEvent: " + aEvent.hashCode() );
- synchronized( aQueue )
- {
- aQueue.addLast( new Runnable()
- {
- public void run()
- {
- AccessibilityTreeModel.this.notifyEvent( aEvent );
- }
- public int hashCode()
- {
- return aEvent.hashCode();
- }
- } );
- aQueue.notify();
- }
- }
- }
+ private Canvas maCanvas;
+ private EventListener maEventListener;
}