1*cdf0e10cSrcweir import com.sun.star.awt.XWindow; 2*cdf0e10cSrcweir import com.sun.star.beans.XPropertySet; 3*cdf0e10cSrcweir import com.sun.star.beans.XPropertyChangeListener; 4*cdf0e10cSrcweir import com.sun.star.beans.PropertyChangeEvent; 5*cdf0e10cSrcweir import com.sun.star.container.XEnumerationAccess; 6*cdf0e10cSrcweir import com.sun.star.container.XEnumeration; 7*cdf0e10cSrcweir import com.sun.star.document.XEventListener; 8*cdf0e10cSrcweir import com.sun.star.drawing.XDrawPage; 9*cdf0e10cSrcweir import com.sun.star.drawing.XDrawView; 10*cdf0e10cSrcweir import com.sun.star.frame.XController; 11*cdf0e10cSrcweir import com.sun.star.frame.XFrame; 12*cdf0e10cSrcweir import com.sun.star.frame.XFrameActionListener; 13*cdf0e10cSrcweir import com.sun.star.frame.FrameActionEvent; 14*cdf0e10cSrcweir import com.sun.star.frame.FrameAction; 15*cdf0e10cSrcweir import com.sun.star.lang.XComponent; 16*cdf0e10cSrcweir import com.sun.star.lang.XMultiServiceFactory; 17*cdf0e10cSrcweir import com.sun.star.lang.XServiceInfo; 18*cdf0e10cSrcweir import com.sun.star.frame.XDesktop; 19*cdf0e10cSrcweir import com.sun.star.frame.XModel; 20*cdf0e10cSrcweir import com.sun.star.frame.XTerminateListener; 21*cdf0e10cSrcweir import com.sun.star.uno.UnoRuntime; 22*cdf0e10cSrcweir 23*cdf0e10cSrcweir import com.sun.star.accessibility.XAccessible; 24*cdf0e10cSrcweir import com.sun.star.accessibility.XAccessibleContext; 25*cdf0e10cSrcweir import com.sun.star.accessibility.XAccessibleComponent; 26*cdf0e10cSrcweir import com.sun.star.accessibility.XAccessibleExtendedComponent; 27*cdf0e10cSrcweir import com.sun.star.accessibility.XAccessibleRelationSet; 28*cdf0e10cSrcweir import com.sun.star.accessibility.XAccessibleStateSet; 29*cdf0e10cSrcweir 30*cdf0e10cSrcweir import com.sun.star.awt.XExtendedToolkit; 31*cdf0e10cSrcweir 32*cdf0e10cSrcweir import java.util.Vector; 33*cdf0e10cSrcweir import java.awt.*; 34*cdf0e10cSrcweir import java.awt.event.*; 35*cdf0e10cSrcweir import javax.swing.*; 36*cdf0e10cSrcweir import javax.swing.tree.*; 37*cdf0e10cSrcweir import javax.swing.event.TreeSelectionListener; 38*cdf0e10cSrcweir import javax.swing.event.TreeSelectionEvent; 39*cdf0e10cSrcweir import java.io.*; 40*cdf0e10cSrcweir 41*cdf0e10cSrcweir import ov.ObjectViewContainer; 42*cdf0e10cSrcweir 43*cdf0e10cSrcweir /** This class manages the GUI of the work bench. 44*cdf0e10cSrcweir @see AccessibilityTreeModel 45*cdf0e10cSrcweir for the implementation of the tree view on the left side which also 46*cdf0e10cSrcweir manages the registration of accessibility listeners. 47*cdf0e10cSrcweir @see Canvas 48*cdf0e10cSrcweir for the graphical view of the accessible objects. 49*cdf0e10cSrcweir */ 50*cdf0e10cSrcweir public class AccessibilityWorkBench 51*cdf0e10cSrcweir extends JFrame 52*cdf0e10cSrcweir implements ActionListener, XTerminateListener, TreeSelectionListener 53*cdf0e10cSrcweir 54*cdf0e10cSrcweir { 55*cdf0e10cSrcweir public static final String msVersion = "v1.7.2"; 56*cdf0e10cSrcweir public String msOptionsFileName = ".AWBrc"; 57*cdf0e10cSrcweir 58*cdf0e10cSrcweir public static void main (String args[]) 59*cdf0e10cSrcweir { 60*cdf0e10cSrcweir int nPortNumber = 5678; 61*cdf0e10cSrcweir 62*cdf0e10cSrcweir for (int i=0; i<args.length; i++) 63*cdf0e10cSrcweir { 64*cdf0e10cSrcweir if (args[i].equals ("-h") || args[i].equals ("--help") || args[i].equals ("-?")) 65*cdf0e10cSrcweir { 66*cdf0e10cSrcweir System.out.println ("usage: AccessibilityWorkBench <option>*"); 67*cdf0e10cSrcweir System.out.println ("options:"); 68*cdf0e10cSrcweir System.out.println (" -p <port-number> Port on which to connect to StarOffice."); 69*cdf0e10cSrcweir System.out.println (" Defaults to 5678."); 70*cdf0e10cSrcweir System.exit (0); 71*cdf0e10cSrcweir } 72*cdf0e10cSrcweir else if (args[i].equals ("-p")) 73*cdf0e10cSrcweir { 74*cdf0e10cSrcweir nPortNumber = Integer.parseInt (args[++i]); 75*cdf0e10cSrcweir } 76*cdf0e10cSrcweir } 77*cdf0e10cSrcweir 78*cdf0e10cSrcweir saWorkBench = new AccessibilityWorkBench (nPortNumber); 79*cdf0e10cSrcweir } 80*cdf0e10cSrcweir 81*cdf0e10cSrcweir 82*cdf0e10cSrcweir 83*cdf0e10cSrcweir 84*cdf0e10cSrcweir /** Return the one instance of the AccessibilityWorkBench 85*cdf0e10cSrcweir @return 86*cdf0e10cSrcweir Returns null when the AccessibilityWorkBench could not be 87*cdf0e10cSrcweir created successfully. 88*cdf0e10cSrcweir */ 89*cdf0e10cSrcweir public static AccessibilityWorkBench Instance () 90*cdf0e10cSrcweir { 91*cdf0e10cSrcweir return saWorkBench; 92*cdf0e10cSrcweir } 93*cdf0e10cSrcweir 94*cdf0e10cSrcweir 95*cdf0e10cSrcweir 96*cdf0e10cSrcweir /** Create an accessibility work bench that listens at the specified 97*cdf0e10cSrcweir port to Office applications. 98*cdf0e10cSrcweir */ 99*cdf0e10cSrcweir private AccessibilityWorkBench (int nPortNumber) 100*cdf0e10cSrcweir { 101*cdf0e10cSrcweir mbInitialized = false; 102*cdf0e10cSrcweir 103*cdf0e10cSrcweir Layout (); 104*cdf0e10cSrcweir 105*cdf0e10cSrcweir MessageArea.println (System.getProperty ("os.name") + " / " 106*cdf0e10cSrcweir + System.getProperty ("os.arch") + " / " 107*cdf0e10cSrcweir + System.getProperty ("os.version")); 108*cdf0e10cSrcweir MessageArea.println ("Using port " + nPortNumber); 109*cdf0e10cSrcweir office = new SimpleOffice (nPortNumber); 110*cdf0e10cSrcweir info = new InformationWriter (); 111*cdf0e10cSrcweir 112*cdf0e10cSrcweir maAccessibilityTree.getComponent().addTreeSelectionListener (this); 113*cdf0e10cSrcweir 114*cdf0e10cSrcweir addWindowListener (new WindowAdapter () 115*cdf0e10cSrcweir { public void windowClosing (WindowEvent e) 116*cdf0e10cSrcweir { System.exit(0); } 117*cdf0e10cSrcweir }); 118*cdf0e10cSrcweir 119*cdf0e10cSrcweir initialize (); 120*cdf0e10cSrcweir } 121*cdf0e10cSrcweir 122*cdf0e10cSrcweir 123*cdf0e10cSrcweir 124*cdf0e10cSrcweir 125*cdf0e10cSrcweir /** Create and arrange the widgets of the GUI. 126*cdf0e10cSrcweir */ 127*cdf0e10cSrcweir public void Layout () 128*cdf0e10cSrcweir { 129*cdf0e10cSrcweir setSize (new Dimension (8000,600)); 130*cdf0e10cSrcweir 131*cdf0e10cSrcweir JScrollPane aScrollPane; 132*cdf0e10cSrcweir GridBagConstraints constraints; 133*cdf0e10cSrcweir 134*cdf0e10cSrcweir // Create new layout. 135*cdf0e10cSrcweir GridBagLayout aLayout = new GridBagLayout (); 136*cdf0e10cSrcweir getContentPane().setLayout (aLayout); 137*cdf0e10cSrcweir 138*cdf0e10cSrcweir // Accessible Tree. 139*cdf0e10cSrcweir maAccessibilityTree = new AccessibilityTree (); 140*cdf0e10cSrcweir // maAccessibilityTree.getComponent().setMinimumSize (new Dimension (250,300)); 141*cdf0e10cSrcweir JScrollPane aTreeScrollPane = new JScrollPane( 142*cdf0e10cSrcweir maAccessibilityTree.getComponent(), 143*cdf0e10cSrcweir JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 144*cdf0e10cSrcweir JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 145*cdf0e10cSrcweir aTreeScrollPane.setPreferredSize (new Dimension (400,300)); 146*cdf0e10cSrcweir 147*cdf0e10cSrcweir // Object view shows details about the currently selected accessible 148*cdf0e10cSrcweir // object. 149*cdf0e10cSrcweir maObjectViewContainer = new ObjectViewContainer (); 150*cdf0e10cSrcweir // maObjectViewContainer.setPreferredSize (new Dimension (300,100)); 151*cdf0e10cSrcweir JScrollPane aObjectViewContainerScrollPane = new JScrollPane( 152*cdf0e10cSrcweir maObjectViewContainer, 153*cdf0e10cSrcweir JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, 154*cdf0e10cSrcweir JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 155*cdf0e10cSrcweir aObjectViewContainerScrollPane.setPreferredSize (new Dimension (400,300)); 156*cdf0e10cSrcweir 157*cdf0e10cSrcweir // Split pane for tree view and object view. 158*cdf0e10cSrcweir JSplitPane aLeftViewSplitPane = new JSplitPane ( 159*cdf0e10cSrcweir JSplitPane.VERTICAL_SPLIT, 160*cdf0e10cSrcweir aTreeScrollPane, 161*cdf0e10cSrcweir aObjectViewContainerScrollPane 162*cdf0e10cSrcweir ); 163*cdf0e10cSrcweir aLeftViewSplitPane.setDividerLocation (300); 164*cdf0e10cSrcweir 165*cdf0e10cSrcweir // Canvas. 166*cdf0e10cSrcweir maCanvas = new Canvas (); 167*cdf0e10cSrcweir maCanvas.setTree (maAccessibilityTree.getComponent()); 168*cdf0e10cSrcweir maAccessibilityTree.SetCanvas (maCanvas); 169*cdf0e10cSrcweir JScrollPane aScrolledCanvas = new JScrollPane(maCanvas, 170*cdf0e10cSrcweir JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, 171*cdf0e10cSrcweir JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 172*cdf0e10cSrcweir aScrolledCanvas.getViewport().setBackground (Color.RED); 173*cdf0e10cSrcweir aScrolledCanvas.setPreferredSize (new Dimension(600,400)); 174*cdf0e10cSrcweir 175*cdf0e10cSrcweir // Split pane for tree view and canvas. 176*cdf0e10cSrcweir JSplitPane aViewSplitPane = new JSplitPane ( 177*cdf0e10cSrcweir JSplitPane.HORIZONTAL_SPLIT, 178*cdf0e10cSrcweir aLeftViewSplitPane, 179*cdf0e10cSrcweir aScrolledCanvas 180*cdf0e10cSrcweir ); 181*cdf0e10cSrcweir aViewSplitPane.setOneTouchExpandable(true); 182*cdf0e10cSrcweir aViewSplitPane.setDividerLocation (400); 183*cdf0e10cSrcweir 184*cdf0e10cSrcweir // Text output area. 185*cdf0e10cSrcweir maMessageArea = MessageArea.Instance (); 186*cdf0e10cSrcweir // maMessageArea.setPreferredSize (new Dimension (300,50)); 187*cdf0e10cSrcweir 188*cdf0e10cSrcweir // Split pane for the two views and the message area. 189*cdf0e10cSrcweir JSplitPane aSplitPane = new JSplitPane (JSplitPane.VERTICAL_SPLIT, 190*cdf0e10cSrcweir aViewSplitPane, maMessageArea); 191*cdf0e10cSrcweir aSplitPane.setOneTouchExpandable(true); 192*cdf0e10cSrcweir addGridElement (aViewSplitPane, 0,0, 2,1, 3,3, 193*cdf0e10cSrcweir GridBagConstraints.CENTER, GridBagConstraints.BOTH); 194*cdf0e10cSrcweir 195*cdf0e10cSrcweir // Button bar. 196*cdf0e10cSrcweir maButtonBar = new JPanel(); 197*cdf0e10cSrcweir GridBagLayout aButtonLayout = new GridBagLayout (); 198*cdf0e10cSrcweir maButtonBar.setLayout (new FlowLayout()); 199*cdf0e10cSrcweir addGridElement (maButtonBar, 0,3, 2,1, 1,0, 200*cdf0e10cSrcweir GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL); 201*cdf0e10cSrcweir 202*cdf0e10cSrcweir // Buttons. 203*cdf0e10cSrcweir aConnectButton = createButton ("Connect", "connect"); 204*cdf0e10cSrcweir aUpdateButton = createButton ("Update", "update"); 205*cdf0e10cSrcweir aShapesButton = createButton ("Expand Shapes", "shapes"); 206*cdf0e10cSrcweir aExpandButton = createButton ("Expand All", "expand"); 207*cdf0e10cSrcweir aQuitButton = createButton ("Quit", "quit"); 208*cdf0e10cSrcweir UpdateButtonStates (); 209*cdf0e10cSrcweir 210*cdf0e10cSrcweir Options.Instance().Load (msOptionsFileName); 211*cdf0e10cSrcweir 212*cdf0e10cSrcweir setJMenuBar (CreateMenuBar ()); 213*cdf0e10cSrcweir 214*cdf0e10cSrcweir setTitle("Accessibility Workbench " + msVersion); 215*cdf0e10cSrcweir 216*cdf0e10cSrcweir pack (); 217*cdf0e10cSrcweir setVisible (true); 218*cdf0e10cSrcweir validate (); 219*cdf0e10cSrcweir repaint(); 220*cdf0e10cSrcweir } 221*cdf0e10cSrcweir 222*cdf0e10cSrcweir 223*cdf0e10cSrcweir 224*cdf0e10cSrcweir 225*cdf0e10cSrcweir /** Shortcut method for adding an object to a GridBagLayout. 226*cdf0e10cSrcweir */ 227*cdf0e10cSrcweir void addGridElement (JComponent object, 228*cdf0e10cSrcweir int x, int y, int width, int height, int weightx, int weighty, 229*cdf0e10cSrcweir int anchor, int fill) 230*cdf0e10cSrcweir { 231*cdf0e10cSrcweir GridBagConstraints constraints = new GridBagConstraints (); 232*cdf0e10cSrcweir constraints.gridx = x; 233*cdf0e10cSrcweir constraints.gridy = y; 234*cdf0e10cSrcweir constraints.gridwidth = width; 235*cdf0e10cSrcweir constraints.gridheight = height; 236*cdf0e10cSrcweir constraints.weightx = weightx; 237*cdf0e10cSrcweir constraints.weighty = weighty; 238*cdf0e10cSrcweir constraints.anchor = anchor; 239*cdf0e10cSrcweir constraints.fill = fill; 240*cdf0e10cSrcweir getContentPane().add (object, constraints); 241*cdf0e10cSrcweir } 242*cdf0e10cSrcweir 243*cdf0e10cSrcweir 244*cdf0e10cSrcweir 245*cdf0e10cSrcweir 246*cdf0e10cSrcweir /** Create a new button and place at the right most position into the 247*cdf0e10cSrcweir button bar. 248*cdf0e10cSrcweir */ 249*cdf0e10cSrcweir public JButton createButton (String title, String command) 250*cdf0e10cSrcweir { 251*cdf0e10cSrcweir JButton aButton = new JButton (title); 252*cdf0e10cSrcweir aButton.setEnabled (false); 253*cdf0e10cSrcweir aButton.setActionCommand (command); 254*cdf0e10cSrcweir aButton.addActionListener (this); 255*cdf0e10cSrcweir 256*cdf0e10cSrcweir maButtonBar.add (aButton); 257*cdf0e10cSrcweir return aButton; 258*cdf0e10cSrcweir } 259*cdf0e10cSrcweir 260*cdf0e10cSrcweir 261*cdf0e10cSrcweir 262*cdf0e10cSrcweir 263*cdf0e10cSrcweir /** Create a menu bar for the application. 264*cdf0e10cSrcweir @return 265*cdf0e10cSrcweir Returns the new menu bar. The returned reference is also 266*cdf0e10cSrcweir remembered in the data member <member>maMenuBar</member>. 267*cdf0e10cSrcweir */ 268*cdf0e10cSrcweir JMenuBar CreateMenuBar () 269*cdf0e10cSrcweir { 270*cdf0e10cSrcweir // Menu bar. 271*cdf0e10cSrcweir maMenuBar = new JMenuBar (); 272*cdf0e10cSrcweir 273*cdf0e10cSrcweir // File menu. 274*cdf0e10cSrcweir JMenu aFileMenu = new JMenu ("File"); 275*cdf0e10cSrcweir maMenuBar.add (aFileMenu); 276*cdf0e10cSrcweir JMenuItem aItem; 277*cdf0e10cSrcweir aItem = new JMenuItem ("Quit"); 278*cdf0e10cSrcweir aFileMenu.add (aItem); 279*cdf0e10cSrcweir aItem.addActionListener (this); 280*cdf0e10cSrcweir 281*cdf0e10cSrcweir // View menu. 282*cdf0e10cSrcweir JMenu aViewMenu = new JMenu ("View"); 283*cdf0e10cSrcweir maMenuBar.add (aViewMenu); 284*cdf0e10cSrcweir ButtonGroup aGroup = new ButtonGroup (); 285*cdf0e10cSrcweir JRadioButtonMenuItem aRadioButton = new JRadioButtonMenuItem ("Whole Screen"); 286*cdf0e10cSrcweir aGroup.add (aRadioButton); 287*cdf0e10cSrcweir aViewMenu.add (aRadioButton); 288*cdf0e10cSrcweir aRadioButton.addActionListener (this); 289*cdf0e10cSrcweir aRadioButton = new JRadioButtonMenuItem ("200%"); 290*cdf0e10cSrcweir aGroup.add (aRadioButton); 291*cdf0e10cSrcweir aViewMenu.add (aRadioButton); 292*cdf0e10cSrcweir aRadioButton.addActionListener (this); 293*cdf0e10cSrcweir aRadioButton = new JRadioButtonMenuItem ("100%"); 294*cdf0e10cSrcweir aGroup.add (aRadioButton); 295*cdf0e10cSrcweir aViewMenu.add (aRadioButton); 296*cdf0e10cSrcweir aRadioButton.addActionListener (this); 297*cdf0e10cSrcweir aRadioButton = new JRadioButtonMenuItem ("50%"); 298*cdf0e10cSrcweir aGroup.add (aRadioButton); 299*cdf0e10cSrcweir aViewMenu.add (aRadioButton); 300*cdf0e10cSrcweir aRadioButton.addActionListener (this); 301*cdf0e10cSrcweir aRadioButton = new JRadioButtonMenuItem ("25%"); 302*cdf0e10cSrcweir aGroup.add (aRadioButton); 303*cdf0e10cSrcweir aViewMenu.add (aRadioButton); 304*cdf0e10cSrcweir aRadioButton.addActionListener (this); 305*cdf0e10cSrcweir aRadioButton = new JRadioButtonMenuItem ("10%"); 306*cdf0e10cSrcweir aGroup.add (aRadioButton); 307*cdf0e10cSrcweir aViewMenu.add (aRadioButton); 308*cdf0e10cSrcweir aRadioButton.addActionListener (this); 309*cdf0e10cSrcweir 310*cdf0e10cSrcweir // Options menu. 311*cdf0e10cSrcweir JMenu aOptionsMenu = new JMenu ("Options"); 312*cdf0e10cSrcweir maMenuBar.add (aOptionsMenu); 313*cdf0e10cSrcweir JCheckBoxMenuItem aCBItem; 314*cdf0e10cSrcweir aCBItem = new JCheckBoxMenuItem ("Show Descriptions", maCanvas.getShowDescriptions()); 315*cdf0e10cSrcweir aOptionsMenu.add (aCBItem); 316*cdf0e10cSrcweir aCBItem.addActionListener (this); 317*cdf0e10cSrcweir 318*cdf0e10cSrcweir aCBItem = new JCheckBoxMenuItem ("Show Names", maCanvas.getShowNames()); 319*cdf0e10cSrcweir aOptionsMenu.add (aCBItem); 320*cdf0e10cSrcweir aCBItem.addActionListener (this); 321*cdf0e10cSrcweir 322*cdf0e10cSrcweir aCBItem = new JCheckBoxMenuItem ("Show Text", maCanvas.getShowText()); 323*cdf0e10cSrcweir aOptionsMenu.add (aCBItem); 324*cdf0e10cSrcweir aCBItem.addActionListener (this); 325*cdf0e10cSrcweir 326*cdf0e10cSrcweir aCBItem = new JCheckBoxMenuItem ("Antialiased Rendering", maCanvas.getAntialiasing()); 327*cdf0e10cSrcweir aOptionsMenu.add (aCBItem); 328*cdf0e10cSrcweir aCBItem.addActionListener (this); 329*cdf0e10cSrcweir 330*cdf0e10cSrcweir // Help menu. 331*cdf0e10cSrcweir JMenu aHelpMenu = new JMenu ("Help"); 332*cdf0e10cSrcweir maMenuBar.add (aHelpMenu); 333*cdf0e10cSrcweir 334*cdf0e10cSrcweir aItem = new JMenuItem ("Help"); 335*cdf0e10cSrcweir aHelpMenu.add (aItem); 336*cdf0e10cSrcweir aItem.addActionListener (this); 337*cdf0e10cSrcweir 338*cdf0e10cSrcweir aItem = new JMenuItem ("News"); 339*cdf0e10cSrcweir aHelpMenu.add (aItem); 340*cdf0e10cSrcweir aItem.addActionListener (this); 341*cdf0e10cSrcweir 342*cdf0e10cSrcweir aItem = new JMenuItem ("About"); 343*cdf0e10cSrcweir aHelpMenu.add (aItem); 344*cdf0e10cSrcweir aItem.addActionListener (this); 345*cdf0e10cSrcweir 346*cdf0e10cSrcweir return maMenuBar; 347*cdf0e10cSrcweir } 348*cdf0e10cSrcweir 349*cdf0e10cSrcweir 350*cdf0e10cSrcweir 351*cdf0e10cSrcweir 352*cdf0e10cSrcweir /** Initialize the AWB. This includes clearing the canvas, add 353*cdf0e10cSrcweir listeners, creation of a new tree model for the tree list box and 354*cdf0e10cSrcweir the update of the button states. 355*cdf0e10cSrcweir 356*cdf0e10cSrcweir This method may be called any number of times. Note that all 357*cdf0e10cSrcweir actions will be carried out every time. The main purpose of a 358*cdf0e10cSrcweir second call is that of a re-initialization after a reconnect. 359*cdf0e10cSrcweir */ 360*cdf0e10cSrcweir protected void initialize () 361*cdf0e10cSrcweir { 362*cdf0e10cSrcweir maCanvas.clear(); 363*cdf0e10cSrcweir 364*cdf0e10cSrcweir AccessibilityTreeModel aModel = null; 365*cdf0e10cSrcweir aModel = new AccessibilityTreeModel (createTreeModelRoot()); 366*cdf0e10cSrcweir 367*cdf0e10cSrcweir aModel.setCanvas (maCanvas); 368*cdf0e10cSrcweir maAccessibilityTree.getComponent().setModel (aModel); 369*cdf0e10cSrcweir 370*cdf0e10cSrcweir if (office != null) 371*cdf0e10cSrcweir { 372*cdf0e10cSrcweir // Add terminate listener. 373*cdf0e10cSrcweir if (office.getDesktop() != null) 374*cdf0e10cSrcweir office.getDesktop().addTerminateListener (this); 375*cdf0e10cSrcweir 376*cdf0e10cSrcweir XExtendedToolkit xToolkit = office.getExtendedToolkit(); 377*cdf0e10cSrcweir // Remove old top window listener. 378*cdf0e10cSrcweir if (maTopWindowListener != null) 379*cdf0e10cSrcweir xToolkit.removeTopWindowListener (maQueuedTopWindowListener); 380*cdf0e10cSrcweir // Add top window listener. 381*cdf0e10cSrcweir if (xToolkit != null) 382*cdf0e10cSrcweir { 383*cdf0e10cSrcweir MessageArea.println ("registering at extended toolkit"); 384*cdf0e10cSrcweir maTopWindowListener = new TopWindowListener (aModel, office); 385*cdf0e10cSrcweir maQueuedTopWindowListener = new QueuedTopWindowListener (maTopWindowListener); 386*cdf0e10cSrcweir xToolkit.addTopWindowListener (maQueuedTopWindowListener); 387*cdf0e10cSrcweir maTopWindowListener.Initialize (); 388*cdf0e10cSrcweir } 389*cdf0e10cSrcweir else 390*cdf0e10cSrcweir maTopWindowListener = null; 391*cdf0e10cSrcweir } 392*cdf0e10cSrcweir 393*cdf0e10cSrcweir mbInitialized = true; 394*cdf0e10cSrcweir UpdateButtonStates (); 395*cdf0e10cSrcweir } 396*cdf0e10cSrcweir 397*cdf0e10cSrcweir 398*cdf0e10cSrcweir 399*cdf0e10cSrcweir 400*cdf0e10cSrcweir /** Update the states of the buttons according to the internal state of 401*cdf0e10cSrcweir the AWB. 402*cdf0e10cSrcweir */ 403*cdf0e10cSrcweir protected void UpdateButtonStates () 404*cdf0e10cSrcweir { 405*cdf0e10cSrcweir aConnectButton.setEnabled (mbInitialized); 406*cdf0e10cSrcweir aQuitButton.setEnabled (mbInitialized); 407*cdf0e10cSrcweir aUpdateButton.setEnabled (mbInitialized); 408*cdf0e10cSrcweir aExpandButton.setEnabled (mbInitialized); 409*cdf0e10cSrcweir aShapesButton.setEnabled (mbInitialized); 410*cdf0e10cSrcweir } 411*cdf0e10cSrcweir 412*cdf0e10cSrcweir 413*cdf0e10cSrcweir 414*cdf0e10cSrcweir /** Callback for GUI actions from the buttons. 415*cdf0e10cSrcweir */ 416*cdf0e10cSrcweir public void actionPerformed (java.awt.event.ActionEvent e) 417*cdf0e10cSrcweir { 418*cdf0e10cSrcweir if (e.getActionCommand().equals("connect")) 419*cdf0e10cSrcweir { 420*cdf0e10cSrcweir office.connect(); 421*cdf0e10cSrcweir initialize (); 422*cdf0e10cSrcweir } 423*cdf0e10cSrcweir else if (e.getActionCommand().equals("quit")) 424*cdf0e10cSrcweir { 425*cdf0e10cSrcweir AccessibilityTreeModel aModel = (AccessibilityTreeModel)maAccessibilityTree.getComponent().getModel(); 426*cdf0e10cSrcweir aModel.clear(); 427*cdf0e10cSrcweir System.exit (0); 428*cdf0e10cSrcweir } 429*cdf0e10cSrcweir else if (e.getActionCommand().equals("update")) 430*cdf0e10cSrcweir { 431*cdf0e10cSrcweir initialize (); 432*cdf0e10cSrcweir } 433*cdf0e10cSrcweir else if (e.getActionCommand().equals("shapes")) 434*cdf0e10cSrcweir { 435*cdf0e10cSrcweir Cursor aCursor = getCursor(); 436*cdf0e10cSrcweir setCursor (new Cursor (Cursor.WAIT_CURSOR)); 437*cdf0e10cSrcweir maAccessibilityTree.expandShapes(); 438*cdf0e10cSrcweir setCursor (aCursor); 439*cdf0e10cSrcweir } 440*cdf0e10cSrcweir else if (e.getActionCommand().equals("expand")) 441*cdf0e10cSrcweir { 442*cdf0e10cSrcweir Cursor aCursor = getCursor(); 443*cdf0e10cSrcweir setCursor (new Cursor (Cursor.WAIT_CURSOR)); 444*cdf0e10cSrcweir maAccessibilityTree.expandAll(); 445*cdf0e10cSrcweir setCursor (aCursor); 446*cdf0e10cSrcweir } 447*cdf0e10cSrcweir else if (e.getActionCommand().equals ("Quit")) 448*cdf0e10cSrcweir { 449*cdf0e10cSrcweir System.out.println ("exiting"); 450*cdf0e10cSrcweir System.exit (0); 451*cdf0e10cSrcweir } 452*cdf0e10cSrcweir else if (e.getActionCommand().equals ("Show Descriptions")) 453*cdf0e10cSrcweir { 454*cdf0e10cSrcweir maCanvas.setShowDescriptions ( ! maCanvas.getShowDescriptions()); 455*cdf0e10cSrcweir Options.Instance().Save (msOptionsFileName); 456*cdf0e10cSrcweir } 457*cdf0e10cSrcweir else if (e.getActionCommand().equals ("Show Names")) 458*cdf0e10cSrcweir { 459*cdf0e10cSrcweir maCanvas.setShowNames ( ! maCanvas.getShowNames()); 460*cdf0e10cSrcweir Options.Instance().Save (msOptionsFileName); 461*cdf0e10cSrcweir } 462*cdf0e10cSrcweir else if (e.getActionCommand().equals ("Antialiased Rendering")) 463*cdf0e10cSrcweir { 464*cdf0e10cSrcweir maCanvas.setAntialiasing ( ! maCanvas.getAntialiasing()); 465*cdf0e10cSrcweir Options.Instance().Save (msOptionsFileName); 466*cdf0e10cSrcweir } 467*cdf0e10cSrcweir else if (e.getActionCommand().equals ("Help")) 468*cdf0e10cSrcweir { 469*cdf0e10cSrcweir HelpWindow.Instance().loadFile ("help.html"); 470*cdf0e10cSrcweir } 471*cdf0e10cSrcweir else if (e.getActionCommand().equals ("News")) 472*cdf0e10cSrcweir { 473*cdf0e10cSrcweir try{ 474*cdf0e10cSrcweir HelpWindow.Instance().loadFile ("news.html"); 475*cdf0e10cSrcweir } catch (Exception ex) {} 476*cdf0e10cSrcweir } 477*cdf0e10cSrcweir else if (e.getActionCommand().equals ("About")) 478*cdf0e10cSrcweir { 479*cdf0e10cSrcweir HelpWindow.Instance().loadFile ("about.html"); 480*cdf0e10cSrcweir } 481*cdf0e10cSrcweir else if (e.getActionCommand().equals ("Whole Screen")) 482*cdf0e10cSrcweir { 483*cdf0e10cSrcweir maCanvas.setZoomMode (Canvas.WHOLE_SCREEN); 484*cdf0e10cSrcweir Options.Instance().Save (msOptionsFileName); 485*cdf0e10cSrcweir } 486*cdf0e10cSrcweir else if (e.getActionCommand().equals ("200%")) 487*cdf0e10cSrcweir { 488*cdf0e10cSrcweir maCanvas.setZoomMode (200); 489*cdf0e10cSrcweir Options.Instance().Save (msOptionsFileName); 490*cdf0e10cSrcweir } 491*cdf0e10cSrcweir else if (e.getActionCommand().equals ("100%")) 492*cdf0e10cSrcweir { 493*cdf0e10cSrcweir maCanvas.setZoomMode (100); 494*cdf0e10cSrcweir Options.Instance().Save (msOptionsFileName); 495*cdf0e10cSrcweir } 496*cdf0e10cSrcweir else if (e.getActionCommand().equals ("50%")) 497*cdf0e10cSrcweir { 498*cdf0e10cSrcweir maCanvas.setZoomMode (50); 499*cdf0e10cSrcweir Options.Instance().Save (msOptionsFileName); 500*cdf0e10cSrcweir } 501*cdf0e10cSrcweir else if (e.getActionCommand().equals ("25%")) 502*cdf0e10cSrcweir { 503*cdf0e10cSrcweir maCanvas.setZoomMode (25); 504*cdf0e10cSrcweir Options.Instance().Save (msOptionsFileName); 505*cdf0e10cSrcweir } 506*cdf0e10cSrcweir else if (e.getActionCommand().equals ("10%")) 507*cdf0e10cSrcweir { 508*cdf0e10cSrcweir maCanvas.setZoomMode (10); 509*cdf0e10cSrcweir Options.Instance().Save (msOptionsFileName); 510*cdf0e10cSrcweir } 511*cdf0e10cSrcweir else 512*cdf0e10cSrcweir { 513*cdf0e10cSrcweir System.err.println("unknown command " + e.getActionCommand()); 514*cdf0e10cSrcweir } 515*cdf0e10cSrcweir } 516*cdf0e10cSrcweir 517*cdf0e10cSrcweir 518*cdf0e10cSrcweir 519*cdf0e10cSrcweir 520*cdf0e10cSrcweir /** Create an AccessibilityTreeModel root which contains the documents 521*cdf0e10cSrcweir (top windows) that are present at the moment. 522*cdf0e10cSrcweir */ 523*cdf0e10cSrcweir private AccessibleTreeNode createTreeModelRoot() 524*cdf0e10cSrcweir { 525*cdf0e10cSrcweir // create root node 526*cdf0e10cSrcweir VectorNode aRoot = new VectorNode ("Accessibility Tree", null); 527*cdf0e10cSrcweir if (maTopWindowListener != null) 528*cdf0e10cSrcweir maTopWindowListener.Initialize (); 529*cdf0e10cSrcweir return aRoot; 530*cdf0e10cSrcweir } 531*cdf0e10cSrcweir 532*cdf0e10cSrcweir 533*cdf0e10cSrcweir // TreeSelectionListener 534*cdf0e10cSrcweir public void valueChanged (TreeSelectionEvent aEvent) 535*cdf0e10cSrcweir { 536*cdf0e10cSrcweir TreePath aPath = aEvent.getPath(); 537*cdf0e10cSrcweir Object aObject = aPath.getLastPathComponent(); 538*cdf0e10cSrcweir if (aObject instanceof AccTreeNode) 539*cdf0e10cSrcweir { 540*cdf0e10cSrcweir AccTreeNode aNode = (AccTreeNode) aObject; 541*cdf0e10cSrcweir XAccessibleContext xContext = aNode.getContext(); 542*cdf0e10cSrcweir maObjectViewContainer.SetObject (xContext); 543*cdf0e10cSrcweir } 544*cdf0e10cSrcweir } 545*cdf0e10cSrcweir 546*cdf0e10cSrcweir 547*cdf0e10cSrcweir 548*cdf0e10cSrcweir 549*cdf0e10cSrcweir // XEventListener 550*cdf0e10cSrcweir public void disposing( com.sun.star.lang.EventObject aSourceObj ) 551*cdf0e10cSrcweir { 552*cdf0e10cSrcweir XFrame xFrame = (XFrame)UnoRuntime.queryInterface(XFrame.class, aSourceObj.Source); 553*cdf0e10cSrcweir 554*cdf0e10cSrcweir if( xFrame != null ) 555*cdf0e10cSrcweir System.out.println("frame disposed"); 556*cdf0e10cSrcweir else 557*cdf0e10cSrcweir System.out.println("controller disposed"); 558*cdf0e10cSrcweir } 559*cdf0e10cSrcweir 560*cdf0e10cSrcweir 561*cdf0e10cSrcweir 562*cdf0e10cSrcweir 563*cdf0e10cSrcweir // XTerminateListener 564*cdf0e10cSrcweir public void queryTermination (final com.sun.star.lang.EventObject aEvent) throws RuntimeException 565*cdf0e10cSrcweir { 566*cdf0e10cSrcweir System.out.println ("Terminate Event : " + aEvent); 567*cdf0e10cSrcweir } 568*cdf0e10cSrcweir 569*cdf0e10cSrcweir 570*cdf0e10cSrcweir 571*cdf0e10cSrcweir 572*cdf0e10cSrcweir // XTerminateListener 573*cdf0e10cSrcweir public void notifyTermination (final com.sun.star.lang.EventObject aEvent) throws RuntimeException 574*cdf0e10cSrcweir { 575*cdf0e10cSrcweir System.out.println ("Notifiy Termination Event : " + aEvent); 576*cdf0e10cSrcweir } 577*cdf0e10cSrcweir 578*cdf0e10cSrcweir 579*cdf0e10cSrcweir 580*cdf0e10cSrcweir /// The Singleton Workbench object. 581*cdf0e10cSrcweir private static AccessibilityWorkBench 582*cdf0e10cSrcweir saWorkBench = null; 583*cdf0e10cSrcweir 584*cdf0e10cSrcweir protected SimpleOffice 585*cdf0e10cSrcweir office; 586*cdf0e10cSrcweir protected InformationWriter 587*cdf0e10cSrcweir info; 588*cdf0e10cSrcweir 589*cdf0e10cSrcweir private XModel 590*cdf0e10cSrcweir mxModel; 591*cdf0e10cSrcweir private JPanel 592*cdf0e10cSrcweir maMainPanel, 593*cdf0e10cSrcweir maButtonBar; 594*cdf0e10cSrcweir private Canvas 595*cdf0e10cSrcweir maCanvas; 596*cdf0e10cSrcweir private AccessibilityTree 597*cdf0e10cSrcweir maAccessibilityTree; 598*cdf0e10cSrcweir private ObjectViewContainer 599*cdf0e10cSrcweir maObjectViewContainer; 600*cdf0e10cSrcweir private JScrollPane 601*cdf0e10cSrcweir maScrollPane; 602*cdf0e10cSrcweir private MessageArea 603*cdf0e10cSrcweir maMessageArea; 604*cdf0e10cSrcweir private JButton 605*cdf0e10cSrcweir aConnectButton, 606*cdf0e10cSrcweir aQuitButton, 607*cdf0e10cSrcweir aUpdateButton, 608*cdf0e10cSrcweir aExpandButton, 609*cdf0e10cSrcweir aShapesButton; 610*cdf0e10cSrcweir private JMenuBar 611*cdf0e10cSrcweir maMenuBar; 612*cdf0e10cSrcweir private String 613*cdf0e10cSrcweir msMessage; 614*cdf0e10cSrcweir private boolean 615*cdf0e10cSrcweir mbInitialized; 616*cdf0e10cSrcweir private TopWindowListener 617*cdf0e10cSrcweir maTopWindowListener; 618*cdf0e10cSrcweir private QueuedTopWindowListener 619*cdf0e10cSrcweir maQueuedTopWindowListener; 620*cdf0e10cSrcweir } 621