diff options
Diffstat (limited to 'toolkit/test/accessibility/AccessibilityTreeModel.java')
-rw-r--r-- | toolkit/test/accessibility/AccessibilityTreeModel.java | 744 |
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; } |