diff options
author | RĂ¼diger Timm <rt@openoffice.org> | 2003-06-12 06:53:56 +0000 |
---|---|---|
committer | RĂ¼diger Timm <rt@openoffice.org> | 2003-06-12 06:53:56 +0000 |
commit | bfef56a02eae61ff689662c0d976799ead4493fb (patch) | |
tree | 9af1b6713845745285e2361adcdf91871c92e0c0 | |
parent | 1a01c5e1b690733ab026c9c13f1dc3da9a2e9147 (diff) |
INTEGRATION: CWS uaa04 (1.16.2); FILE MERGED
2003/06/11 08:10:23 obr 1.16.2.2: #109943# look for the correct XAccessible on windowClosed
2003/06/05 15:17:35 obr 1.16.2.1: #109943# fixed Popup registration issues and coordinate problems
-rwxr-xr-x | accessibility/bridge/org/openoffice/accessibility/AccessBridge.java | 199 |
1 files changed, 123 insertions, 76 deletions
diff --git a/accessibility/bridge/org/openoffice/accessibility/AccessBridge.java b/accessibility/bridge/org/openoffice/accessibility/AccessBridge.java index cf4203c545ef..7576e2bf5f64 100755 --- a/accessibility/bridge/org/openoffice/accessibility/AccessBridge.java +++ b/accessibility/bridge/org/openoffice/accessibility/AccessBridge.java @@ -54,156 +54,203 @@ * * ************************************************************************/ - package org.openoffice.accessibility; +import com.sun.star.accessibility.AccessibleRole; +import com.sun.star.accessibility.XAccessible; +import com.sun.star.accessibility.XAccessibleContext; +import com.sun.star.awt.XExtendedToolkit; import com.sun.star.awt.XTopWindow; import com.sun.star.awt.XTopWindowListener; import com.sun.star.awt.XWindow; - +import com.sun.star.comp.loader.FactoryHelper; import com.sun.star.lang.XInitialization; import com.sun.star.lang.XMultiServiceFactory; import com.sun.star.lang.XSingleServiceFactory; import com.sun.star.registry.*; import com.sun.star.uno.*; -import com.sun.star.comp.loader.FactoryHelper; import org.openoffice.java.accessibility.*; -import com.sun.star.accessibility.XAccessible; -import com.sun.star.accessibility.XAccessibleContext; -import com.sun.star.awt.XExtendedToolkit; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import javax.accessibility.Accessible; -import java.lang.reflect.Method; -import java.lang.reflect.InvocationTargetException; public class AccessBridge { - // protected static java.util.Hashtable topWindowMap = new java.util.Hashtable(); + private static java.awt.Window getTopWindowImpl(XAccessible xAccessible) { + // Because it can not be garantied that + // WindowsAccessBridgeAdapter.registerTopWindow() is called + // before windowOpened(), we have to make this operation + // atomic. + synchronized (topWindowMap) { + String oid = UnoRuntime.generateOid(xAccessible); + java.awt.Window w = (java.awt.Window) topWindowMap.get(oid); + + if (w == null) { + w = AccessibleObjectFactory.getTopWindow(xAccessible); + + if (w != null) { + topWindowMap.put(oid, w); + } + } + + return w; + } + } + protected static java.awt.Window getTopWindow(XAccessible xAccessible) { if (xAccessible != null) { - // Toolkit reports the VCL peer windows as toplevels. These have an accessible parent - // which represents the native frame window XAccessibleContext xAccessibleContext = xAccessible.getAccessibleContext(); - if ((xAccessibleContext != null) && (xAccessibleContext.getAccessibleIndexInParent() != -1)) { - return getTopWindow(xAccessibleContext.getAccessibleParent()); + if (xAccessibleContext != null) { + + // Toolkit reports the VCL peer windows as toplevels. These have an + // accessible parent which represents the native frame window + switch(xAccessibleContext.getAccessibleRole()) { + case AccessibleRole.ROOT_PANE: + case AccessibleRole.POPUP_MENU: + return getTopWindow(xAccessibleContext.getAccessibleParent()); + + case AccessibleRole.WINDOW: + case AccessibleRole.FRAME: + case AccessibleRole.DIALOG: + return getTopWindowImpl(xAccessible); + + default: + break; + } } + } - // Because it can not garantied that WindowsAccessBridgeAdapter.registerTopWindow() - // is called before windowOpened(), we have to make this operation atomic. - synchronized (topWindowMap) { - String oid = UnoRuntime.generateOid(xAccessible); - java.awt.Window w = (java.awt.Window) topWindowMap.get(oid); - if (w == null) { - w = AccessibleObjectFactory.getTopWindow(xAccessible); - if (w != null) { - topWindowMap.put(oid, w); - } + return null; + } + + protected static java.awt.Window removeTopWindow(XAccessible xAccessible) { + if (xAccessible != null) { + XAccessibleContext xAccessibleContext = xAccessible.getAccessibleContext(); + if (xAccessibleContext != null) { + + // Toolkit reports the VCL peer windows as toplevels. These have an + // accessible parent which represents the native frame window + switch(xAccessibleContext.getAccessibleRole()) { + case AccessibleRole.ROOT_PANE: + case AccessibleRole.POPUP_MENU: + return removeTopWindow(xAccessibleContext.getAccessibleParent()); + + case AccessibleRole.WINDOW: + case AccessibleRole.FRAME: + case AccessibleRole.DIALOG: + return (java.awt.Window) topWindowMap.remove(UnoRuntime.generateOid(xAccessible)); + + default: + break; } - return w; } } + return null; } - static public class _AccessBridge implements XTopWindowListener, XInitialization { + public static XSingleServiceFactory __getServiceFactory(String implName, + XMultiServiceFactory multiFactory, XRegistryKey regKey) { + XSingleServiceFactory xSingleServiceFactory = null; + + if (implName.equals(AccessBridge.class.getName())) { + // Initialize toolkit to register at Java <-> Windows access bridge + java.awt.Toolkit tk = java.awt.Toolkit.getDefaultToolkit(); + + xSingleServiceFactory = FactoryHelper.getServiceFactory(_AccessBridge.class, + _AccessBridge._serviceName, multiFactory, regKey); + } + + return xSingleServiceFactory; + } + + public static boolean __writeRegistryServiceInfo(XRegistryKey regKey) { + return FactoryHelper.writeRegistryServiceInfo(AccessBridge.class.getName(), + _AccessBridge._serviceName, regKey); + } + + static public class _AccessBridge implements XTopWindowListener, + XInitialization { static final String _serviceName = "com.sun.star.accessibility.AccessBridge"; + XComponentContext xComponentContext; public _AccessBridge(XComponentContext xComponentContext) { - - // Try to initialize the WindowsAccessBridgeAdapter - String os = (String) System.getProperty("os.name"); - if(os.startsWith("Windows")) { - WindowsAccessBridgeAdapter.attach(xComponentContext); - } + this.xComponentContext = xComponentContext; } /* * XInitialization */ - public void initialize(java.lang.Object[] arguments) { try { // FIXME: Currently there is no way to determine if key event forwarding is needed or not, // so we have to do it always .. - XExtendedToolkit unoToolkit = (XExtendedToolkit) - AnyConverter.toObject(new Type(XExtendedToolkit.class), arguments[0]); + XExtendedToolkit unoToolkit = (XExtendedToolkit) AnyConverter.toObject(new Type( + XExtendedToolkit.class), arguments[0]); - if(unoToolkit != null) { + if (unoToolkit != null) { // FIXME this should be done in VCL unoToolkit.addTopWindowListener(this); - unoToolkit.addKeyHandler(new KeyHandler()); - } else if( Build.DEBUG) { - System.err.println("argument 0 is not of type XExtendedToolkit."); + + String os = (String) System.getProperty("os.name"); + + // Try to initialize the WindowsAccessBridgeAdapter + if (os.startsWith("Windows")) { + WindowsAccessBridgeAdapter.attach(xComponentContext); + } else { + unoToolkit.addKeyHandler(new KeyHandler()); + } + } else if (Build.DEBUG) { + System.err.println( + "argument 0 is not of type XExtendedToolkit."); } - } catch(com.sun.star.lang.IllegalArgumentException e) { - // FIXME: output + } catch (com.sun.star.lang.IllegalArgumentException e) { + // FIXME: output } } /* * XTopWindowListener */ - - public void windowOpened(com.sun.star.lang.EventObject event){ - XAccessible xAccessible = (XAccessible) UnoRuntime.queryInterface(XAccessible.class, event.Source); + public void windowOpened(com.sun.star.lang.EventObject event) { + XAccessible xAccessible = (XAccessible) UnoRuntime.queryInterface(XAccessible.class, + event.Source); java.awt.Window w = getTopWindow(xAccessible); } - public void windowActivated(com.sun.star.lang.EventObject event){ + public void windowActivated(com.sun.star.lang.EventObject event) { } - public void windowDeactivated(com.sun.star.lang.EventObject event){ + public void windowDeactivated(com.sun.star.lang.EventObject event) { } - public void windowMinimized(com.sun.star.lang.EventObject event){ + public void windowMinimized(com.sun.star.lang.EventObject event) { } - public void windowNormalized(com.sun.star.lang.EventObject event){ + public void windowNormalized(com.sun.star.lang.EventObject event) { } - public void windowClosing(com.sun.star.lang.EventObject event){ + public void windowClosing(com.sun.star.lang.EventObject event) { } - public void windowClosed(com.sun.star.lang.EventObject event){ - java.awt.Window w = (java.awt.Window) - topWindowMap.remove(UnoRuntime.generateOid(event.Source)); + public void windowClosed(com.sun.star.lang.EventObject event) { + XAccessible xAccessible = (XAccessible) UnoRuntime.queryInterface(XAccessible.class, + event.Source); + + java.awt.Window w = removeTopWindow(xAccessible); if (w != null) { w.dispose(); - if (Build.DEBUG) { - System.err.println("TopWindow closed"); - } } } public void disposing(com.sun.star.lang.EventObject event) { } } - - public static XSingleServiceFactory __getServiceFactory(String implName, XMultiServiceFactory multiFactory, XRegistryKey regKey) { - XSingleServiceFactory xSingleServiceFactory = null; - - if (implName.equals(AccessBridge.class.getName()) ) { - // Initialize toolkit to register at Java <-> Windows access bridge - java.awt.Toolkit tk = java.awt.Toolkit.getDefaultToolkit(); - - xSingleServiceFactory = FactoryHelper.getServiceFactory( - _AccessBridge.class, - _AccessBridge._serviceName, - multiFactory, - regKey - ); - } - - return xSingleServiceFactory; - } - - public static boolean __writeRegistryServiceInfo(XRegistryKey regKey) { - return FactoryHelper.writeRegistryServiceInfo(AccessBridge.class.getName(), _AccessBridge._serviceName, regKey); - } } |