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