diff options
author | Oliver Braun <obr@openoffice.org> | 2002-08-08 13:12:46 +0000 |
---|---|---|
committer | Oliver Braun <obr@openoffice.org> | 2002-08-08 13:12:46 +0000 |
commit | 64832d007ed528db12299aae6e1f2a5d7231eb73 (patch) | |
tree | 42a3d443ab468c4783f2ae691dc46a62184fcd1b /accessibility/bridge/org/openoffice/accessibility/AccessBridge.java | |
parent | 1768b6cf61ed05738b66c9fdf53077754aa44c65 (diff) |
#100467# initial release
Diffstat (limited to 'accessibility/bridge/org/openoffice/accessibility/AccessBridge.java')
-rwxr-xr-x | accessibility/bridge/org/openoffice/accessibility/AccessBridge.java | 274 |
1 files changed, 274 insertions, 0 deletions
diff --git a/accessibility/bridge/org/openoffice/accessibility/AccessBridge.java b/accessibility/bridge/org/openoffice/accessibility/AccessBridge.java new file mode 100755 index 000000000000..a661bffc93fd --- /dev/null +++ b/accessibility/bridge/org/openoffice/accessibility/AccessBridge.java @@ -0,0 +1,274 @@ +/************************************************************************* + * + * $RCSfile: AccessBridge.java,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: obr $ $Date: 2002-08-08 14:10:17 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +package org.openoffice.accessibility; + + +import com.sun.star.awt.XTopWindow; +import com.sun.star.awt.XWindow; + +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.accessibility.internal.*; + +import drafts.com.sun.star.accessibility.XAccessible; +import drafts.com.sun.star.accessibility.bridge.XAccessibleTopWindowMap; + +import javax.accessibility.Accessible; +import java.lang.reflect.Method; +import java.lang.reflect.InvocationTargetException; + + +public class AccessBridge { + + static private final boolean DEBUG = true; + + static public class _AccessBridge implements XAccessibleTopWindowMap { + + static private final String _serviceName = "drafts.com.sun.star.accessibility.bridge.AccessBridge"; + private XMultiServiceFactory _xMultiServiceFactory; + + private java.util.Hashtable frameMap = null; + private Method registerVirtualFrame = null; + private Method revokeVirtualFrame = null; + + public _AccessBridge(XMultiServiceFactory xMultiServiceFactory) { + _xMultiServiceFactory = xMultiServiceFactory; + + frameMap = new java.util.Hashtable(); + + // On Windows all native frames must be registered to the access bridge. Therefor + // the bridge exports two methods that we try to find here. + String os = (String) System.getProperty("os.name"); + if(os.startsWith("Windows")) { + try { + Class bridge = Class.forName("com.sun.java.accessibility.AccessBridge"); + Class[] parameterTypes = { javax.accessibility.Accessible.class, Integer.class }; + + if(bridge != null) { + registerVirtualFrame = bridge.getMethod("registerVirtualFrame", parameterTypes); + revokeVirtualFrame = bridge.getMethod("revokeVirtualFrame", parameterTypes); + } + } + + catch(NoSuchMethodException e) { + System.err.println("ERROR: incompatible AccessBridge found: " + e.getMessage()); + + // Forward this exception to UNO to indicate that the service will not work correctly. + throw new com.sun.star.uno.RuntimeException("incompatible AccessBridge class: " + e.getMessage()); + } + + catch(java.lang.SecurityException e) { + System.err.println("ERROR: no access to AccessBridge: " + e.getMessage()); + + // Forward this exception to UNO to indicate that the service will not work correctly. + throw new com.sun.star.uno.RuntimeException("Security exception caught: " + e.getMessage()); + } + + catch(ClassNotFoundException e) { + // This is quite normal on + } + } + } + + /* + * XAccessibleNativeFrameMap + */ + + public void registerAccessibleNativeFrame(Object any, XAccessible xAccessible, XTopWindow xTopWindow ){ + try { + Integer handle = new Integer(AnyConverter.toInt(any)); + + // Add the window fake object as top window listener to receive activate/deactivate events + WindowFake w = new WindowFake(xAccessible); + xTopWindow.addTopWindowListener(w); + + if(DEBUG) + System.out.println( "register native frame: " + handle ); + + // Remember the accessible object associated to this frame + synchronized(frameMap) { + frameMap.put(handle, w); + } + + // If running on Windows, register this frame to the access bridge + if(registerVirtualFrame != null) { + Object[] args = { w, handle}; + + try { + registerVirtualFrame.invoke(null, args); + } + + catch(IllegalAccessException e) { + System.err.println("IllegalAccessException caught: " + e.getMessage()); + } + + catch(IllegalArgumentException e) { + System.err.println("IllegalArgumentException caught: " + e.getMessage()); + } + + catch(InvocationTargetException e) { + System.err.println("InvokationTargetException caught: " + e.getMessage()); + } + } + } + + catch(com.sun.star.lang.IllegalArgumentException exception) { + System.err.println("IllegalArgumentException caught: " + exception.getMessage()); + } + } + + public void revokeAccessibleNativeFrame(Object any) { + try { + Integer handle = new Integer(AnyConverter.toInt(any)); + WindowFake w; + + // Remember the accessible object associated to this frame + synchronized(frameMap) { + w = (WindowFake) frameMap.remove(handle); + } + + if(w != null) { + if(DEBUG) + System.out.println( "revoke native frame: " + handle ); + + // If running on Windows, register this frame to the access bridge + if(revokeVirtualFrame != null) { + Object[] args = { w, handle }; + + try { + revokeVirtualFrame.invoke(null, args); + } + + catch(IllegalAccessException e) { + System.err.println("IllegalAccessException caught: " + e.getMessage()); + } + + catch(IllegalArgumentException e) { + System.err.println("IllegalArgumentException caught: " + e.getMessage()); + } + + catch(InvocationTargetException e) { + System.err.println("InvokationTargetException caught: " + e.getMessage()); + } + } + } + } + + catch(com.sun.star.lang.IllegalArgumentException exception) { + System.err.println("IllegalArgumentException caught: " + exception.getMessage()); + } + } + } + + 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(); + + if(DEBUG) { + try { + java.io.PrintStream log = new java.io.PrintStream( new java.io.FileOutputStream( "AccessBridge.log" ) ); + System.setOut( log ); + System.setErr( log ); + } + + catch(java.io.FileNotFoundException e) { + } + } + + try { + XInterface instance = (XInterface) multiFactory.createInstance("org.openoffice.accessibility.internal.RemoteAccessBridge"); + + if(instance != null) { + WindowFake.infoProvider = (XAccessibilityInformationProvider) + UnoRuntime.queryInterface(XAccessibilityInformationProvider.class, instance); + + if(WindowFake.infoProvider == null) { + System.err.println("InfoProvider does not implement XAccessibleInformationProvider."); + } + } else { + System.err.println("InfoProvider service not found."); + } + } + + catch (com.sun.star.uno.Exception e) { + System.err.println(e.getMessage()); + } + + 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); + } +} |