| /************************************************************** |
| * |
| * 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. |
| * |
| *************************************************************/ |
| |
| import com.sun.star.awt.XWindow; |
| import com.sun.star.awt.XExtendedToolkit; |
| import com.sun.star.accessibility.XAccessible; |
| import com.sun.star.accessibility.XAccessibleContext; |
| import com.sun.star.uno.XInterface; |
| import com.sun.star.uno.UnoRuntime; |
| import javax.swing.event.TreeModelEvent; |
| |
| /** Listen for top window events and create or delete children of the tree |
| model accordingly. |
| */ |
| class TopWindowListener |
| { |
| TopWindowListener (AccessibilityTreeModel aModel, SimpleOffice aOffice) |
| { |
| maModel = aModel; |
| maOffice = aOffice; |
| } |
| |
| |
| |
| |
| /** Use this function to initially fill the accessibility object tree |
| view with nodes for top level windows. |
| */ |
| public void Initialize () |
| { |
| XExtendedToolkit xToolkit = maOffice.getExtendedToolkit(); |
| if (xToolkit != null) |
| { |
| maModel.lock (); |
| int nTopWindowCount = xToolkit.getTopWindowCount(); |
| MessageArea.println ("There are " + nTopWindowCount + " top windows."); |
| for (int i=0; i<nTopWindowCount; i++) |
| { |
| try |
| { |
| XAccessible xAccessible = maOffice.getAccessibleObject( |
| xToolkit.getTopWindow (i)); |
| // Uncomment the following line to get the real root of |
| // the accessible tree that xAccessible belongs to. |
| // xAccessible = maOffice.getAccessibleRoot(xAccessible); |
| AddTopLevelNode (xAccessible); |
| } |
| catch (Exception e) |
| { |
| System.out.println ("caught exception: " + e); |
| e.printStackTrace(); |
| } |
| } |
| maModel.unlock ((AccessibleTreeNode)maModel.getRoot()); |
| } |
| } |
| |
| |
| |
| /** Add a new top level node which, to be exact, will be placed on the |
| second layer of the tree. |
| @param xNewTopLevelObject |
| The accessible object of the new top level window. |
| */ |
| private void AddTopLevelNode (XAccessible xNewTopLevelObject) |
| { |
| System.out.println ("adding top level window"); |
| if (xNewTopLevelObject != null) |
| { |
| XAccessibleContext xContext = xNewTopLevelObject.getAccessibleContext(); |
| if (xContext == null) |
| System.out.println ("top level window not accessible"); |
| else |
| { |
| if ( ! FilterTopLevelNode (xContext)) |
| { |
| Object aRootObject = maModel.getRoot(); |
| if (aRootObject instanceof VectorNode) |
| { |
| VectorNode aRoot = (VectorNode) aRootObject; |
| AccessibleTreeNode aNode = |
| NodeFactory.Instance().createDefaultNode (xNewTopLevelObject, aRoot); |
| aRoot.addChild (aNode); |
| maModel.fireTreeNodesInserted (maModel.createEvent (aRoot, aNode)); |
| } |
| } |
| } |
| } |
| } |
| |
| /** Ignore windows that have no accessible name, i.e. do not represent |
| document windows. |
| @return |
| Returns <true/> when the given object should not be displayed, |
| i.e. filtered out. |
| */ |
| private boolean FilterTopLevelNode (XAccessibleContext xContext) |
| { |
| // No filtering at the moment. |
| return false; |
| // return xContext.getAccessibleName().length() == 0; |
| } |
| |
| |
| |
| |
| /** Remove an existing top level node from the tree. |
| @param xNewTopLevelObject |
| The accessible object to remove. |
| */ |
| private void RemoveTopLevelNode (XAccessible xTopLevelObject) |
| { |
| Object aObject = maModel.getRoot(); |
| if (aObject instanceof VectorNode && xTopLevelObject != null) |
| { |
| System.out.println ("removing node " + xTopLevelObject); |
| VectorNode aRoot = (VectorNode) aObject; |
| maModel.removeNode (xTopLevelObject.getAccessibleContext()); |
| } |
| } |
| |
| |
| |
| |
| |
| /** This method exists for debugging. It prints a list of all top |
| level windows. |
| */ |
| private void ShowAllTopLevelWindows () |
| { |
| XExtendedToolkit xToolkit = maOffice.getExtendedToolkit(); |
| if (xToolkit != null) |
| { |
| int nTopWindowCount = xToolkit.getTopWindowCount(); |
| for (int i=0; i<nTopWindowCount; i++) |
| { |
| try |
| { |
| System.out.println (i + " : " + xToolkit.getTopWindow (i)); |
| } |
| catch (Exception e) |
| { |
| System.out.println ("caught exception; " + e); |
| } |
| } |
| } |
| } |
| |
| |
| |
| |
| // XTopWindowListener |
| public void windowOpened (final com.sun.star.lang.EventObject aEvent) |
| throws RuntimeException |
| { |
| if (maModel != null) |
| { |
| XWindow xWindow = (XWindow) UnoRuntime.queryInterface( |
| XWindow.class, aEvent.Source); |
| if (xWindow == null) |
| System.out.println ("event source is no XWindow"); |
| else |
| { |
| XAccessible xAccessible = maOffice.getAccessibleObject(xWindow); |
| if (xAccessible == null) |
| System.out.println ("event source is no XAccessible"); |
| else |
| AddTopLevelNode (xAccessible); |
| } |
| } |
| } |
| |
| |
| |
| |
| public void windowClosed (final com.sun.star.lang.EventObject aEvent) |
| throws RuntimeException |
| { |
| if (maModel != null) |
| { |
| XWindow xWindow = (XWindow) UnoRuntime.queryInterface( |
| XWindow.class, aEvent.Source); |
| if (xWindow == null) |
| System.out.println ("event source is no XWindow"); |
| else |
| { |
| XAccessible xAccessible = maOffice.getAccessibleObject(xWindow); |
| if (xAccessible == null) |
| System.out.println ("event source is no XAccessible"); |
| else |
| RemoveTopLevelNode (xAccessible); |
| } |
| } |
| } |
| |
| public void disposing (final com.sun.star.lang.EventObject aEvent) |
| { |
| System.out.println ("Top window disposed: " + aEvent); |
| } |
| |
| |
| |
| |
| private AccessibilityTreeModel |
| maModel; |
| private SimpleOffice |
| maOffice; |
| } |