diff options
Diffstat (limited to 'accessibility')
6 files changed, 139 insertions, 158 deletions
diff --git a/accessibility/bridge/org/openoffice/accessibility/AccessBridge.java b/accessibility/bridge/org/openoffice/accessibility/AccessBridge.java index f89e1080aede..681cde0053ca 100755 --- a/accessibility/bridge/org/openoffice/accessibility/AccessBridge.java +++ b/accessibility/bridge/org/openoffice/accessibility/AccessBridge.java @@ -2,9 +2,9 @@ * * $RCSfile: AccessBridge.java,v $ * - * $Revision: 1.8 $ + * $Revision: 1.9 $ * - * last change: $Author: obr $ $Date: 2002-10-02 16:14:59 $ + * last change: $Author: obr $ $Date: 2002-10-08 06:50:15 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -143,13 +143,12 @@ public class AccessBridge { // Needed to attach C++ accessibility event monitor. This is extremly important to avoid // deadlocks with frames that are not created in the VCL main thread, because they use a // synchronous SendMessage call with acquired SolarMutex !!! - if( xTopWindowListener != null ) { - xTopWindow.addTopWindowListener(xTopWindowListener); - } +// if( xTopWindowListener != null ) { +// xTopWindow.addTopWindowListener(xTopWindowListener); +// } // Add the window fake object as top window listener to receive activate/deactivate events -// frameMap.put(handle, new WindowFake(xAccessible, xTopWindow, true)); - frameMap.put(handle, new WindowFake(xAccessible, xTopWindow, false)); + frameMap.put(handle, new WindowFake(xAccessible, xTopWindow)); } } @@ -192,13 +191,6 @@ public class AccessBridge { if(bridge != null) { registerVirtualFrame = bridge.getMethod("registerVirtualFrame", parameterTypes); revokeVirtualFrame = bridge.getMethod("revokeVirtualFrame", parameterTypes); -/* - if( Build.DEBUG ) { - Class[] debugTypes = { String.class }; - org.openoffice.java.accessibility.AccessibleObject.debugOut = - bridge.getMethod("sendDebugString", debugTypes); - } -*/ } } @@ -221,24 +213,6 @@ public class AccessBridge { // Forward this exception to UNO to indicate that the service will not work correctly. throw new com.sun.star.uno.RuntimeException("ClassNotFound exception caught: " + e.getMessage()); } - - // Redirect output to log file on Windows for stdout / stderr are not visible - if( Build.DEBUG && System.getProperty("AccessBridge.LogPath") != null ) { -// if( Build.DEBUG ) { - try { - java.io.PrintStream log = new java.io.PrintStream( - new java.io.FileOutputStream( System.getProperty("AccessBridge.LogPath") + - java.io.File.pathSeparator + "AccessBridge.log") -// new java.io.FileOutputStream("AccessBridge.log") - ); - - System.setOut(log); - System.setErr(log); - } - - catch(java.io.FileNotFoundException e) { - } - } } // Registers the native frame at the Windows access bridge @@ -298,9 +272,10 @@ public class AccessBridge { // synchronous SendMessage call with acquired SolarMutex !!! if( xTopWindowListener != null ) { xTopWindow.addTopWindowListener(xTopWindowListener); + AccessibleObjectFactory.autoPopulate = false; } - WindowFake w = new WindowFake(xAccessible, xTopWindow, false); + WindowFake w = new WindowFake(xAccessible, xTopWindow); if( Build.DEBUG ) { System.out.println("register native frame: " + handle); } @@ -348,6 +323,8 @@ public class AccessBridge { // Initialize toolkit to register at Java <-> Windows access bridge java.awt.Toolkit tk = java.awt.Toolkit.getDefaultToolkit(); + String logPath = null; + try { XInterface instance = (XInterface) multiFactory.createInstance( "org.openoffice.accessibility.internal.RemoteAccessBridge" @@ -359,6 +336,9 @@ public class AccessBridge { if(infoProvider != null) { AccessibleObjectFactory.getDefault().setInformationProvider(infoProvider); + if( Build.DEBUG ) { + logPath = infoProvider.getEnvironment("ACCESSBRIDGE_LOGPATH"); + } } else { System.err.println("InfoProvider does not implement XAccessibleInformationProvider."); } @@ -367,7 +347,6 @@ public class AccessBridge { if( xTopWindowListener == null ) { System.err.println("InfoProvider does not implement XTopWindowListener."); } - } else { System.err.println("InfoProvider service not found."); throw new com.sun.star.uno.RuntimeException("RemoteAccessBridge service not found.\n"); @@ -379,6 +358,21 @@ public class AccessBridge { throw new com.sun.star.uno.RuntimeException(e.getMessage()); } + // Redirect output to log file if ACCESSBRIDGE_LOGPATH environment variable is set. + if( logPath != null && logPath.length() > 0 ) { + try { + java.io.PrintStream log = new java.io.PrintStream( + new java.io.FileOutputStream( logPath + java.io.File.separator + "AccessBridge.log") + ); + + System.setOut(log); + System.setErr(log); + } + + catch(java.io.FileNotFoundException e) { + } + } + Class serviceClass; String os = (String) System.getProperty("os.name"); if(os.startsWith("Windows")) { diff --git a/accessibility/bridge/org/openoffice/accessibility/KeyHandler.java b/accessibility/bridge/org/openoffice/accessibility/KeyHandler.java index 91c50e68643f..ad3fc3f67a39 100755 --- a/accessibility/bridge/org/openoffice/accessibility/KeyHandler.java +++ b/accessibility/bridge/org/openoffice/accessibility/KeyHandler.java @@ -2,9 +2,9 @@ * * $RCSfile: KeyHandler.java,v $ * - * $Revision: 1.2 $ + * $Revision: 1.3 $ * - * last change: $Author: obr $ $Date: 2002-08-30 06:13:27 $ + * last change: $Author: obr $ $Date: 2002-10-08 06:50:15 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -137,7 +137,7 @@ public class KeyHandler extends Component implements XKeyHandler { public boolean keyPressed(com.sun.star.awt.KeyEvent event) { if( Build.DEBUG ) { - System.err.println("retrieved key pressed event: " + event.KeyChar ); +// System.err.println("retrieved key pressed event: " + event.KeyChar ); } eventQueue.postEvent(new VCLKeyEvent(KeyEvent.KEY_PRESSED, event)); @@ -154,7 +154,7 @@ public class KeyHandler extends Component implements XKeyHandler { /** Handler for KeyReleased events */ public boolean keyReleased(com.sun.star.awt.KeyEvent event) { if( Build.DEBUG ) { - System.err.println("retrieved key released event\n"); +// System.err.println("retrieved key released event\n"); } eventQueue.postEvent(new VCLKeyEvent(KeyEvent.KEY_RELEASED, event)); diff --git a/accessibility/bridge/org/openoffice/java/accessibility/AccessibleKeyBinding.java b/accessibility/bridge/org/openoffice/java/accessibility/AccessibleKeyBinding.java index b799c07a7329..c1f27eb86df0 100644 --- a/accessibility/bridge/org/openoffice/java/accessibility/AccessibleKeyBinding.java +++ b/accessibility/bridge/org/openoffice/java/accessibility/AccessibleKeyBinding.java @@ -2,9 +2,9 @@ * * $RCSfile: AccessibleKeyBinding.java,v $ * - * $Revision: 1.2 $ + * $Revision: 1.3 $ * - * last change: $Author: obr $ $Date: 2002-08-23 09:29:13 $ + * last change: $Author: obr $ $Date: 2002-10-08 06:48:01 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -72,8 +72,7 @@ public class AccessibleKeyBinding extends Object implements javax.accessibility. public AccessibleKeyBinding(KeyStroke[] keys) { data = new javax.swing.KeyStroke[keys.length]; - - for(int i=0; i<keys.length; i++) { + for(int i=0; i < keys.length; i++) { data[i] = javax.swing.KeyStroke.getKeyStroke( convertKeyCode(keys[i].KeyCode), convertModifiers(keys[i].Modifiers) diff --git a/accessibility/bridge/org/openoffice/java/accessibility/AccessibleObjectFactory.java b/accessibility/bridge/org/openoffice/java/accessibility/AccessibleObjectFactory.java index 9aa8525b1f70..0def6dba3f22 100644 --- a/accessibility/bridge/org/openoffice/java/accessibility/AccessibleObjectFactory.java +++ b/accessibility/bridge/org/openoffice/java/accessibility/AccessibleObjectFactory.java @@ -2,9 +2,9 @@ * * $RCSfile: AccessibleObjectFactory.java,v $ * - * $Revision: 1.8 $ + * $Revision: 1.9 $ * - * last change: $Author: obr $ $Date: 2002-10-02 16:07:52 $ + * last change: $Author: obr $ $Date: 2002-10-08 06:48:02 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -80,6 +80,7 @@ public class AccessibleObjectFactory implements XGlobalFocusListener { // This type is needed for conversions from/to uno Any public static final Type XAccessibleType = new Type(XAccessible.class); + public static boolean autoPopulate = true; java.util.Hashtable objectList = new java.util.Hashtable(); XAccessibilityInformationProvider infoProvider; @@ -91,27 +92,6 @@ public class AccessibleObjectFactory implements XGlobalFocusListener { // infoProvider = provider; } - public class GenericAccessibleParent extends Object implements javax.accessibility.Accessible { - XAccessibleContext unoObject; - AccessibleObject wrapperObject; - - public GenericAccessibleParent(AccessibleObject o, XAccessibleContext ac) { - unoObject = ac; - wrapperObject = o; - } - - public javax.accessibility.AccessibleContext getAccessibleContext() { - XAccessible xAccessible = unoObject.getAccessibleParent(); - if( xAccessible != null ) { - AccessibleObject o = AccessibleObjectFactory.this.getAccessibleObject(xAccessible, true, null); - wrapperObject.setAccessibleParent(o); - return o; - } - - return null; - } - } - /** Returns the default accessible object factory */ public static AccessibleObjectFactory getDefault() { return defaultFactory; @@ -120,7 +100,7 @@ public class AccessibleObjectFactory implements XGlobalFocusListener { /** Sets a new AccessibleInformationProvider to be used by this factory object */ public void setInformationProvider(XAccessibilityInformationProvider provider) { infoProvider = provider; - provider.setGlobalFocusListener(this); +// provider.setGlobalFocusListener(this); } /** Returns the AccessibleInformationProvider currently used by this factory object */ @@ -129,63 +109,62 @@ public class AccessibleObjectFactory implements XGlobalFocusListener { } public AccessibleObject getAccessibleObject(XAccessible xAccessible, boolean create, Accessible parent) { - XAccessibleContext xAccessibleContext = null; + AccessibleObject o = null; if(xAccessible != null) { - // Save the round trip to C++ UNO if possible - if(xAccessible instanceof XAccessibleContext) { - xAccessibleContext = (XAccessibleContext) xAccessible; - } else { - xAccessibleContext = xAccessible.getAccessibleContext(); + // Retrieve unique id for the original UNO object to be used as a hash key + String oid = UnoRuntime.generateOid(xAccessible); + + // Check if we already have a wrapper object for this context + synchronized (objectList) { + WeakReference r = (WeakReference) objectList.get(oid); + if(r != null) { + o = (AccessibleObject) r.get(); + } } - } - return getAccessibleObject(xAccessibleContext, create, parent); - } + if( o == null && create ) { + o = new AccessibleObject(xAccessible, parent); - public AccessibleObject getAccessibleObject(XAccessibleContext xAccessibleContext, boolean create, Accessible parent) { - // Ensure that we really got an UNO accessible context - if(xAccessibleContext == null) { - if( Build.DEBUG ) { - System.err.println("No accessible context"); + // Add the newly created object to the cache list + synchronized (objectList) { + objectList.put(oid, new WeakReference(o)); + if( Build.DEBUG ) { +// System.out.println("Object cache now contains " + objectList.size() + " objects."); + } + } } - return null; } - // Retrieve unique id for the original UNO object to be used as a hash key - String oid = UnoRuntime.generateOid(xAccessibleContext); - AccessibleObject o = null; + return o; + } - // Check if we already have a wrapper object for this context - synchronized (objectList) { - WeakReference r = (WeakReference) objectList.get(oid); - if(r != null) { - o = (AccessibleObject) r.get(); - } - } + public AccessibleUNOComponent createAccessibleContext(XAccessibleContext xAccessibleContext) { + AccessibleUNOComponent ac = null; - if( o == null && create ) { + // Ensure that we really got an UNO accessible context + if( xAccessibleContext != null ) { try { short role = xAccessibleContext.getAccessibleRole(); XAccessibleStateSet xStateSet = null; switch(role) { case AccessibleRole.CHECKBOX: - o = new AccessibleButton( + ac = new AccessibleButton( javax.accessibility.AccessibleRole.CHECK_BOX, javax.accessibility.AccessibleState.CHECKED, xAccessibleContext ); break; case AccessibleRole.COMBOBOX: - o = new AccessibleComboBox(xAccessibleContext); + ac = new AccessibleComboBox(xAccessibleContext); break; case AccessibleRole.LIST: - o = new AccessibleList(xAccessibleContext); + ac = new AccessibleList(xAccessibleContext); break; case AccessibleRole.MENUBAR: case AccessibleRole.POPUPMENU: - o = new AccessibleContainer( + ac = new AccessibleContainer( AccessibleRoleMap.toAccessibleRole(role), xAccessibleContext ); @@ -194,14 +173,24 @@ public class AccessibleObjectFactory implements XGlobalFocusListener { case AccessibleRole.TABLE_CELL: xStateSet = xAccessibleContext.getAccessibleStateSet(); if( xStateSet != null && ! xStateSet.contains(AccessibleStateType.TRANSIENT)) { - o = new AccessibleLabel(xAccessibleContext); + ac = new AccessibleLabel(xAccessibleContext); } else { - o = new AccessibleFixedText(xAccessibleContext); + ac = new AccessibleFixedText( + javax.accessibility.AccessibleRole.LABEL, + xAccessibleContext + ); } break; + case AccessibleRole.COLUMNHEADER: + case AccessibleRole.ROWHEADER: + ac = new AccessibleFixedText( + AccessibleRoleMap.toAccessibleRole(role), + xAccessibleContext + ); + break; case AccessibleRole.DIALOG: case AccessibleRole.FRAME: - o = new AccessibleFrame( + ac = new AccessibleFrame( AccessibleRoleMap.toAccessibleRole(role), xAccessibleContext ); @@ -210,53 +199,53 @@ public class AccessibleObjectFactory implements XGlobalFocusListener { case AccessibleRole.GRAPHIC: case AccessibleRole.SHAPE: case AccessibleRole.EMBEDDED_OBJECT: - o = new AccessibleImage(xAccessibleContext); + ac = new AccessibleImage(xAccessibleContext); break; case AccessibleRole.LISTITEM: - o = new AccessibleListItem(xAccessibleContext); + ac = new AccessibleListItem(xAccessibleContext); break; case AccessibleRole.MENU: - o = new AccessibleMenu(xAccessibleContext); + ac = new AccessibleMenu(xAccessibleContext); break; case AccessibleRole.MENUITEM: - o = new AccessibleMenuItem(xAccessibleContext); + ac = new AccessibleMenuItem(xAccessibleContext); break; case AccessibleRole.PARAGRAPH: - o = new AccessibleParagraph(xAccessibleContext); + ac = new AccessibleParagraph(xAccessibleContext); break; case AccessibleRole.PUSHBUTTON: - o = new AccessibleButton( + ac = new AccessibleButton( javax.accessibility.AccessibleRole.PUSH_BUTTON, javax.accessibility.AccessibleState.SELECTED, xAccessibleContext ); break; case AccessibleRole.RADIOBUTTON: - o = new AccessibleButton( + ac = new AccessibleButton( javax.accessibility.AccessibleRole.RADIO_BUTTON, javax.accessibility.AccessibleState.CHECKED, xAccessibleContext ); break; case AccessibleRole.SCROLLBAR: - o = new AccessibleScrollBar(xAccessibleContext); + ac = new AccessibleScrollBar(xAccessibleContext); break; case AccessibleRole.SEPARATOR: - o = new AccessibleSeparator(xAccessibleContext); + ac = new AccessibleSeparator(xAccessibleContext); break; case AccessibleRole.TABLE: xStateSet = xAccessibleContext.getAccessibleStateSet(); if(xStateSet != null && ! xStateSet.contains(AccessibleStateType.CHILDREN_TRANSIENT)) { - o = new AccessibleTextTable(xAccessibleContext); + ac = new AccessibleTextTable(xAccessibleContext); } else { - o = new AccessibleSpreadsheet(xAccessibleContext); + ac = new AccessibleSpreadsheet(xAccessibleContext); } break; case AccessibleRole.TEXT: - o = new AccessibleEditLine(xAccessibleContext); + ac = new AccessibleEditLine(xAccessibleContext); break; case AccessibleRole.TREE: - o = new AccessibleTreeList(xAccessibleContext); + ac = new AccessibleTreeList(xAccessibleContext); break; case AccessibleRole.CANVAS: case AccessibleRole.DOCUMENT: @@ -268,6 +257,7 @@ public class AccessibleObjectFactory implements XGlobalFocusListener { case AccessibleRole.LAYEREDPANE: case AccessibleRole.OPTIONPANE: case AccessibleRole.PAGETAB: + case AccessibleRole.PAGETABLIST: case AccessibleRole.PANEL: case AccessibleRole.ROOTPANE: case AccessibleRole.SCROLLPANE: @@ -275,7 +265,7 @@ public class AccessibleObjectFactory implements XGlobalFocusListener { case AccessibleRole.STATUSBAR: case AccessibleRole.TOOLBAR: case AccessibleRole.WINDOW: - o = new AccessibleWindow( + ac = new AccessibleWindow( AccessibleRoleMap.toAccessibleRole(role), xAccessibleContext ); @@ -285,58 +275,34 @@ public class AccessibleObjectFactory implements XGlobalFocusListener { System.out.println("Unmapped role: " + AccessibleRoleMap.toAccessibleRole(role) + " (id = " + role + ")"); } - o = new AccessibleWindow( + ac = new AccessibleWindow( AccessibleRoleMap.toAccessibleRole(role), xAccessibleContext ); break; } - // Add the newly created object to the cache list - synchronized (objectList) { - objectList.put(oid, new WeakReference(o)); - if( Build.DEBUG ) { - // System.out.println("Object cache now contains " + objectList.size() + " objects."); - } - } - // Register as event listener if possible AccessibleEventListener listener = null; - if( o instanceof AccessibleEventListener ) { - listener = (AccessibleEventListener) o; + if( ac instanceof AccessibleEventListener ) { + listener = (AccessibleEventListener) ac; } /* The accessible event broadcaster will never be removed by a removeEventListener * call. This requires that the UNO accessibility objects get activly destructed * using dispose(). */ - o.initialize(infoProvider.getAccessibleContextInfo(xAccessibleContext, listener)); - - // Create generic parent if parent is null - if( parent == null && o.getAccessibleIndexInParent() != -1 ) { - parent = new GenericAccessibleParent(o, xAccessibleContext); - } - - // Finaly set accessible parent object - if( parent != null ) { - o.setAccessibleParent(parent); - } - - // Add the child to the internal list if parent is AccessibleWindow - if( parent instanceof AccessibleWindow ) { - AccessibleWindow w = (AccessibleWindow) parent; - w.addAccessibleChild(o); - } + ac.initialize(infoProvider.getAccessibleContextInfo(xAccessibleContext, listener)); } catch(com.sun.star.uno.RuntimeException e) { } } - if(Build.DEBUG && o == null) { + if( Build.DEBUG && ac == null ) { System.out.println("AccessibleObjectFactory: returning null object"); } - return o; + return ac; } /* public AccessibleObject removeAccessibleObject(XAccessible xAccessible) { @@ -424,28 +390,49 @@ public class AccessibleObjectFactory implements XGlobalFocusListener { public void releaseAccessibleObject(AccessibleObject o) { synchronized (objectList) { - objectList.remove(o.getObjectId()); + objectList.remove(o.toString()); if( Build.DEBUG ) { System.out.println("Object cache now contains " + objectList.size() + " objects."); } } } + // Traverses the accessibility hierarchy to ensure global focus event notifications + public static void populate(javax.accessibility.AccessibleContext ac) { + // ignore objects that have transient state + if( ac != null ) { + AccessibleStateSet as = ac.getAccessibleStateSet(); + if( null != as && + !as.contains(javax.accessibility.AccessibleState.TRANSIENT) && + !as.contains(AccessibleStateTypeMap.get(AccessibleStateType.CHILDREN_TRANSIENT)) + ) + { + int n = ac.getAccessibleChildrenCount(); + for( int i = 0; i < n; i++ ) { + Accessible a = ac.getAccessibleChild(i); + if( a != null ) { + populate(a.getAccessibleContext()); + } + } + } + } + } + /* * XGlobalFocusListener */ - public void focusGained(XAccessibleContext context) { - AccessibleObject ao = getAccessibleObject(context, true, null); + public void focusGained(XAccessible xAccessible) { + AccessibleObject ao = getAccessibleObject(xAccessible, true, null); if( ao != null ) { - ao.getEventProxy().processFocusGained(); + ao.processFocusGained(); } } - public void focusLost(XAccessibleContext context) { - AccessibleObject ao = getAccessibleObject(context, false, null); + public void focusLost(XAccessible xAccessible) { + AccessibleObject ao = getAccessibleObject(xAccessible, false, null); if( ao != null ) { - ao.getEventProxy().processFocusLost(); + ao.processFocusLost(); } } } diff --git a/accessibility/bridge/org/openoffice/java/accessibility/AccessibleTextImpl.java b/accessibility/bridge/org/openoffice/java/accessibility/AccessibleTextImpl.java index d3afce7c0cd0..47ff94a607d9 100644 --- a/accessibility/bridge/org/openoffice/java/accessibility/AccessibleTextImpl.java +++ b/accessibility/bridge/org/openoffice/java/accessibility/AccessibleTextImpl.java @@ -2,9 +2,9 @@ * * $RCSfile: AccessibleTextImpl.java,v $ * - * $Revision: 1.2 $ + * $Revision: 1.3 $ * - * last change: $Author: obr $ $Date: 2002-10-02 07:05:28 $ + * last change: $Author: obr $ $Date: 2002-10-08 06:48:02 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -205,15 +205,15 @@ public class AccessibleTextImpl implements javax.accessibility.AccessibleText { catch(com.sun.star.uno.RuntimeException e) { if( Build.DEBUG ) { - AccessibleObject.printDebugString("Exception caught for getIndexAtPoint(" + point.x + ", " + point.y + ")"); - AccessibleObject.printDebugString(e.getMessage()); + System.err.println("Exception caught for getIndexAtPoint(" + point.x + ", " + point.y + ")"); + System.err.println(e.getMessage()); } } catch(Exception e) { if( Build.DEBUG ) { - AccessibleObject.printDebugString("Exception caught for getIndexAtPoint(" + point.x + ", " + point.y + ")"); - AccessibleObject.printDebugString(e.getMessage()); + System.err.println("Exception caught for getIndexAtPoint(" + point.x + ", " + point.y + ")"); + System.err.println(e.getMessage()); } } diff --git a/accessibility/bridge/org/openoffice/java/accessibility/makefile.mk b/accessibility/bridge/org/openoffice/java/accessibility/makefile.mk index 2f6734e7e20f..f4bbbeda478a 100755 --- a/accessibility/bridge/org/openoffice/java/accessibility/makefile.mk +++ b/accessibility/bridge/org/openoffice/java/accessibility/makefile.mk @@ -2,9 +2,9 @@ # # $RCSfile: makefile.mk,v $ # -# $Revision: 1.7 $ +# $Revision: 1.8 $ # -# last change: $Author: obr $ $Date: 2002-10-01 07:16:40 $ +# last change: $Author: obr $ $Date: 2002-10-08 06:48:04 $ # # The Contents of this file are made available subject to the terms of # either of the following licenses @@ -102,6 +102,7 @@ JAVAFILES = \ AccessibleTextImpl.java \ AccessibleTextTable.java \ AccessibleTreeList.java \ + AccessibleUNOComponent.java \ AccessibleWindow.java \ GenericAccessibleEditableText.java \ GenericAccessibleExtendedTable.java \ |