| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| package org.openoffice.accessibility.misc; |
| |
| import java.lang.Thread; |
| |
| import com.sun.star.awt.Rectangle; |
| import com.sun.star.awt.XExtendedToolkit; |
| import com.sun.star.awt.XWindow; |
| |
| import com.sun.star.beans.PropertyValue; |
| import com.sun.star.beans.XPropertySet; |
| |
| import com.sun.star.container.XIndexAccess; |
| import com.sun.star.container.XChild; |
| import com.sun.star.container.XEnumerationAccess; |
| import com.sun.star.container.XEnumeration; |
| |
| import com.sun.star.frame.XComponentLoader; |
| import com.sun.star.frame.XController; |
| import com.sun.star.frame.XDesktop; |
| import com.sun.star.frame.XFrame; |
| import com.sun.star.frame.XModel; |
| import com.sun.star.frame.XTasksSupplier; |
| import com.sun.star.frame.XTask; |
| |
| import com.sun.star.lang.XComponent; |
| import com.sun.star.lang.XMultiServiceFactory; |
| import com.sun.star.lang.XServiceInfo; |
| import com.sun.star.lang.XServiceName; |
| import com.sun.star.lang.XTypeProvider; |
| |
| import com.sun.star.uno.UnoRuntime; |
| import com.sun.star.uno.XInterface; |
| import com.sun.star.uno.Type; |
| |
| import com.sun.star.drawing.XDrawView; |
| import com.sun.star.drawing.XDrawPage; |
| import com.sun.star.drawing.XShapes; |
| import com.sun.star.drawing.XShape; |
| import com.sun.star.drawing.XShapeDescriptor; |
| |
| import com.sun.star.accessibility.XAccessible; |
| import com.sun.star.accessibility.XAccessibleContext; |
| import com.sun.star.accessibility.XAccessibleComponent; |
| import com.sun.star.accessibility.XAccessibleRelationSet; |
| import com.sun.star.accessibility.XAccessibleStateSet; |
| |
| |
| /** This singleton class tries to simplify some tasks like loading a document |
| or getting various objects. |
| */ |
| public class SimpleOffice |
| { |
| synchronized static public SimpleOffice Instance () |
| { |
| if (saInstance == null) |
| saInstance = new SimpleOffice (); |
| |
| return saInstance; |
| } |
| |
| synchronized static public void Clear () |
| { |
| saInstance = null; |
| } |
| |
| |
| public XModel LoadDocument (String URL) |
| { |
| XModel xModel = null; |
| try |
| { |
| // Load the document from the specified URL. |
| XComponentLoader xLoader = |
| (XComponentLoader)UnoRuntime.queryInterface( |
| XComponentLoader.class, mxDesktop); |
| |
| XComponent xComponent = xLoader.loadComponentFromURL ( |
| URL, |
| "_blank", |
| 0, |
| new PropertyValue[0] |
| ); |
| |
| xModel = (XModel) UnoRuntime.queryInterface( |
| XModel.class, xComponent); |
| } |
| catch (java.lang.NullPointerException e) |
| { |
| MessageArea.println ("caught exception while loading " |
| + URL + " : " + e); |
| } |
| catch (Exception e) |
| { |
| MessageArea.println ("caught exception while loading " |
| + URL + " : " + e); |
| } |
| return xModel; |
| } |
| |
| |
| |
| |
| public XModel GetModel (String name) |
| { |
| XModel xModel = null; |
| try |
| { |
| XTasksSupplier xTasksSupplier = |
| (XTasksSupplier) UnoRuntime.queryInterface( |
| XTasksSupplier.class, mxDesktop); |
| XEnumerationAccess xEA = xTasksSupplier.getTasks(); |
| XEnumeration xE = xEA.createEnumeration(); |
| while (xE.hasMoreElements()) |
| { |
| XTask xTask = (XTask) UnoRuntime.queryInterface( |
| XTask.class, xE.nextElement()); |
| MessageArea.print (xTask.getName()); |
| } |
| } |
| catch (Exception e) |
| { |
| MessageArea.println ("caught exception while getting Model " + name |
| + ": " + e); |
| } |
| return xModel; |
| } |
| |
| |
| public XModel GetModel (XDrawView xView) |
| { |
| XController xController = (XController) UnoRuntime.queryInterface( |
| XController.class, xView); |
| if (xController != null) |
| return xController.getModel(); |
| else |
| { |
| MessageArea.println ("can't cast view to controller"); |
| return null; |
| } |
| } |
| |
| |
| |
| |
| public XDesktop GetDesktop () |
| { |
| if (mxDesktop != null) |
| return mxDesktop; |
| try |
| { |
| // Get the factory of the connected office. |
| XMultiServiceFactory xMSF = |
| OfficeConnection.Instance().GetServiceManager (); |
| if (xMSF == null) |
| { |
| MessageArea.println ("can't connect to office"); |
| return null; |
| } |
| else |
| MessageArea.println ("Connected successfully."); |
| |
| // Create a new desktop. |
| mxDesktop = (XDesktop) UnoRuntime.queryInterface( |
| XDesktop.class, |
| xMSF.createInstance ("com.sun.star.frame.Desktop") |
| ); |
| } |
| catch (Exception e) |
| { |
| MessageArea.println ("caught exception while creating desktop: " |
| + e); |
| } |
| |
| return mxDesktop; |
| } |
| |
| |
| /** Return a reference to the extended toolkit which is a broadcaster of |
| top window, key, and focus events. |
| */ |
| public XExtendedToolkit GetExtendedToolkit () |
| { |
| XExtendedToolkit xToolkit = null; |
| if (this != null) |
| try |
| { |
| // Get the factory of the connected office. |
| XMultiServiceFactory xMSF = |
| OfficeConnection.Instance().GetServiceManager (); |
| if (xMSF != null) |
| { |
| xToolkit = (XExtendedToolkit) UnoRuntime.queryInterface( |
| XExtendedToolkit.class, |
| xMSF.createInstance ("stardiv.Toolkit.VCLXToolkit") |
| ); |
| } |
| } |
| catch (Exception e) |
| { |
| MessageArea.println ( |
| "caught exception while creating extended toolkit: " + e); |
| } |
| |
| return xToolkit; |
| } |
| |
| |
| |
| static public XAccessible GetAccessibleObject (XInterface xObject) |
| { |
| XAccessible xAccessible = null; |
| try |
| { |
| xAccessible = (XAccessible) UnoRuntime.queryInterface( |
| XAccessible.class, xObject); |
| } |
| catch (Exception e) |
| { |
| System.err.println ( |
| "caught exception while getting accessible object" + e); |
| e.printStackTrace (System.err); |
| } |
| return xAccessible; |
| } |
| |
| static public XAccessibleContext GetAccessibleContext (XInterface xObject) |
| { |
| XAccessible xAccessible = GetAccessibleObject (xObject); |
| if (xAccessible != null) |
| return xAccessible.getAccessibleContext(); |
| else |
| return null; |
| } |
| |
| /** Return the root object of the accessibility hierarchy. |
| */ |
| public XAccessible GetAccessibleRoot (XAccessible xAccessible) |
| { |
| try |
| { |
| XAccessible xParent = null; |
| do |
| { |
| XAccessibleContext xContext = xAccessible.getAccessibleContext(); |
| if (xContext != null) |
| xParent = xContext.getAccessibleParent(); |
| if (xParent != null) |
| xAccessible = xParent; |
| } |
| while (xParent != null); |
| } |
| catch (Exception e) |
| { |
| MessageArea.println ( |
| "caught exception while getting accessible root" + e); |
| e.printStackTrace(); |
| } |
| return xAccessible; |
| } |
| |
| |
| |
| |
| /** @descr Return the current window associated with the given |
| model. |
| */ |
| public XWindow GetCurrentWindow () |
| { |
| return GetCurrentWindow ((XModel) UnoRuntime.queryInterface( |
| XModel.class, GetDesktop())); |
| } |
| |
| |
| |
| |
| |
| public XWindow GetCurrentWindow (XModel xModel) |
| { |
| XWindow xWindow = null; |
| try |
| { |
| if (xModel == null) |
| MessageArea.println ("invalid model (==null)"); |
| XController xController = xModel.getCurrentController(); |
| if (xController == null) |
| MessageArea.println ("can't get controller from model"); |
| XFrame xFrame = xController.getFrame(); |
| if (xFrame == null) |
| MessageArea.println ("can't get frame from controller"); |
| xWindow = xFrame.getComponentWindow (); |
| if (xWindow == null) |
| MessageArea.println ("can't get window from frame"); |
| } |
| catch (Exception e) |
| { |
| MessageArea.println ("caught exception while getting current window" + e); |
| } |
| |
| return xWindow; |
| } |
| |
| |
| /** @descr Return the current draw page of the given desktop. |
| */ |
| public XDrawPage GetCurrentDrawPage () |
| { |
| return GetCurrentDrawPage ( |
| (XDrawView) UnoRuntime.queryInterface( |
| XDrawView.class, |
| GetCurrentView())); |
| } |
| |
| |
| |
| |
| public XDrawPage GetCurrentDrawPage (XDrawView xView) |
| { |
| XDrawPage xPage = null; |
| try |
| { |
| if (xView == null) |
| MessageArea.println ("can't get current draw page from null view"); |
| else |
| xPage = xView.getCurrentPage(); |
| } |
| catch (Exception e) |
| { |
| MessageArea.println ("caught exception while getting current draw page : " + e); |
| } |
| |
| return xPage; |
| } |
| |
| |
| |
| |
| /** @descr Return the current view of the given desktop. |
| */ |
| public XDrawView GetCurrentView () |
| { |
| return GetCurrentView (GetDesktop()); |
| } |
| |
| public XDrawView GetCurrentView (XDesktop xDesktop) |
| { |
| if (xDesktop == null) |
| MessageArea.println ("can't get desktop to retrieve current view"); |
| |
| XDrawView xView = null; |
| try |
| { |
| XComponent xComponent = xDesktop.getCurrentComponent(); |
| if (xComponent == null) |
| MessageArea.println ("can't get component to retrieve current view"); |
| |
| XFrame xFrame = xDesktop.getCurrentFrame(); |
| if (xFrame == null) |
| MessageArea.println ("can't get frame to retrieve current view"); |
| |
| XController xController = xFrame.getController(); |
| if (xController == null) |
| MessageArea.println ("can't get controller to retrieve current view"); |
| |
| xView = (XDrawView) UnoRuntime.queryInterface( |
| XDrawView.class, xController); |
| if (xView == null) |
| MessageArea.println ("could not cast controller into view"); |
| } |
| catch (Exception e) |
| { |
| MessageArea.println ("caught exception while getting current view : " + e); |
| } |
| |
| return xView; |
| } |
| |
| |
| |
| |
| // Return the accessible object of the document window. |
| public static XAccessible GetAccessibleDocumentWindow (XDrawPage xPage) |
| { |
| XIndexAccess xShapeList = (XIndexAccess) UnoRuntime.queryInterface( |
| XIndexAccess.class, xPage); |
| if (xShapeList.getCount() > 0) |
| { |
| // All shapes return as accessible object the document window's |
| // accessible object. This is, of course, a hack and will be |
| // removed as soon as the missing infrastructure for obtaining |
| // the object directly is implemented. |
| XShape xShape = null; |
| try{ |
| xShape = (XShape) UnoRuntime.queryInterface( |
| XShape.class, xShapeList.getByIndex (0)); |
| } catch (Exception e) |
| {} |
| XAccessible xAccessible = (XAccessible) UnoRuntime.queryInterface ( |
| XAccessible.class, xShape); |
| return xAccessible; |
| } |
| else |
| return null; |
| } |
| |
| private SimpleOffice () |
| { |
| } |
| |
| |
| |
| private XDesktop mxDesktop; |
| private static SimpleOffice saInstance = null; |
| } |