summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRĂ¼diger Timm <rt@openoffice.org>2003-06-12 06:53:56 +0000
committerRĂ¼diger Timm <rt@openoffice.org>2003-06-12 06:53:56 +0000
commitbfef56a02eae61ff689662c0d976799ead4493fb (patch)
tree9af1b6713845745285e2361adcdf91871c92e0c0
parent1a01c5e1b690733ab026c9c13f1dc3da9a2e9147 (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-xaccessibility/bridge/org/openoffice/accessibility/AccessBridge.java199
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);
- }
}