1*cdf0e10cSrcweir import java.lang.Thread;
2*cdf0e10cSrcweir 
3*cdf0e10cSrcweir import com.sun.star.awt.Rectangle;
4*cdf0e10cSrcweir import com.sun.star.awt.XWindow;
5*cdf0e10cSrcweir 
6*cdf0e10cSrcweir import com.sun.star.beans.PropertyValue;
7*cdf0e10cSrcweir import com.sun.star.beans.XPropertySet;
8*cdf0e10cSrcweir 
9*cdf0e10cSrcweir import com.sun.star.container.XIndexAccess;
10*cdf0e10cSrcweir import com.sun.star.container.XChild;
11*cdf0e10cSrcweir import com.sun.star.container.XEnumerationAccess;
12*cdf0e10cSrcweir import com.sun.star.container.XEnumeration;
13*cdf0e10cSrcweir 
14*cdf0e10cSrcweir import com.sun.star.frame.XComponentLoader;
15*cdf0e10cSrcweir import com.sun.star.frame.XController;
16*cdf0e10cSrcweir import com.sun.star.frame.XDesktop;
17*cdf0e10cSrcweir import com.sun.star.frame.XFrame;
18*cdf0e10cSrcweir import com.sun.star.frame.XModel;
19*cdf0e10cSrcweir import com.sun.star.frame.XTasksSupplier;
20*cdf0e10cSrcweir import com.sun.star.frame.XTask;
21*cdf0e10cSrcweir 
22*cdf0e10cSrcweir import com.sun.star.lang.XComponent;
23*cdf0e10cSrcweir import com.sun.star.lang.XMultiServiceFactory;
24*cdf0e10cSrcweir import com.sun.star.lang.XServiceInfo;
25*cdf0e10cSrcweir import com.sun.star.lang.XServiceName;
26*cdf0e10cSrcweir import com.sun.star.lang.XTypeProvider;
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir import com.sun.star.uno.UnoRuntime;
29*cdf0e10cSrcweir import com.sun.star.uno.XInterface;
30*cdf0e10cSrcweir import com.sun.star.uno.Type;
31*cdf0e10cSrcweir 
32*cdf0e10cSrcweir import com.sun.star.drawing.XDrawView;
33*cdf0e10cSrcweir import com.sun.star.drawing.XDrawPage;
34*cdf0e10cSrcweir import com.sun.star.drawing.XShapes;
35*cdf0e10cSrcweir import com.sun.star.drawing.XShape;
36*cdf0e10cSrcweir import com.sun.star.drawing.XShapeDescriptor;
37*cdf0e10cSrcweir 
38*cdf0e10cSrcweir import com.sun.star.accessibility.XAccessible;
39*cdf0e10cSrcweir import com.sun.star.accessibility.XAccessibleContext;
40*cdf0e10cSrcweir import com.sun.star.accessibility.XAccessibleComponent;
41*cdf0e10cSrcweir import com.sun.star.accessibility.XAccessibleRelationSet;
42*cdf0e10cSrcweir import com.sun.star.accessibility.XAccessibleStateSet;
43*cdf0e10cSrcweir 
44*cdf0e10cSrcweir import com.sun.star.awt.XExtendedToolkit;
45*cdf0e10cSrcweir 
46*cdf0e10cSrcweir 
47*cdf0e10cSrcweir /** This class tries to simplify some tasks like loading a document or
48*cdf0e10cSrcweir     getting various objects.
49*cdf0e10cSrcweir */
50*cdf0e10cSrcweir public class SimpleOffice
51*cdf0e10cSrcweir {
52*cdf0e10cSrcweir     XDesktop mxDesktop = null;
53*cdf0e10cSrcweir     OfficeConnection aConnection;
54*cdf0e10cSrcweir     int mnPortNumber;
55*cdf0e10cSrcweir 
56*cdf0e10cSrcweir     public SimpleOffice (int nPortNumber)
57*cdf0e10cSrcweir     {
58*cdf0e10cSrcweir         mnPortNumber = nPortNumber;
59*cdf0e10cSrcweir         connect ();
60*cdf0e10cSrcweir         getDesktop ();
61*cdf0e10cSrcweir     }
62*cdf0e10cSrcweir 
63*cdf0e10cSrcweir     public void connect ()
64*cdf0e10cSrcweir     {
65*cdf0e10cSrcweir         aConnection = new OfficeConnection (mnPortNumber);
66*cdf0e10cSrcweir         mxDesktop = null;
67*cdf0e10cSrcweir         getDesktop ();
68*cdf0e10cSrcweir     }
69*cdf0e10cSrcweir 
70*cdf0e10cSrcweir     public XModel loadDocument (String URL)
71*cdf0e10cSrcweir     {
72*cdf0e10cSrcweir         XModel xModel = null;
73*cdf0e10cSrcweir         try
74*cdf0e10cSrcweir         {
75*cdf0e10cSrcweir             //  Load the document from the specified URL.
76*cdf0e10cSrcweir             XComponentLoader xLoader =
77*cdf0e10cSrcweir                 (XComponentLoader)UnoRuntime.queryInterface(
78*cdf0e10cSrcweir                     XComponentLoader.class, mxDesktop);
79*cdf0e10cSrcweir 
80*cdf0e10cSrcweir             XComponent xComponent = xLoader.loadComponentFromURL (
81*cdf0e10cSrcweir                 URL,
82*cdf0e10cSrcweir                 "_blank",
83*cdf0e10cSrcweir                 0,
84*cdf0e10cSrcweir                 new PropertyValue[0]
85*cdf0e10cSrcweir                 );
86*cdf0e10cSrcweir 
87*cdf0e10cSrcweir             xModel = (XModel) UnoRuntime.queryInterface(
88*cdf0e10cSrcweir                 XModel.class, xComponent);
89*cdf0e10cSrcweir         }
90*cdf0e10cSrcweir         catch (java.lang.NullPointerException e)
91*cdf0e10cSrcweir         {
92*cdf0e10cSrcweir             MessageArea.println ("caught exception while loading "
93*cdf0e10cSrcweir                 + URL + " : " + e);
94*cdf0e10cSrcweir         }
95*cdf0e10cSrcweir         catch (Exception e)
96*cdf0e10cSrcweir         {
97*cdf0e10cSrcweir             MessageArea.println ("caught exception while loading "
98*cdf0e10cSrcweir                 + URL + " : " + e);
99*cdf0e10cSrcweir         }
100*cdf0e10cSrcweir         return xModel;
101*cdf0e10cSrcweir     }
102*cdf0e10cSrcweir 
103*cdf0e10cSrcweir 
104*cdf0e10cSrcweir 
105*cdf0e10cSrcweir 
106*cdf0e10cSrcweir     public XModel getModel (String name)
107*cdf0e10cSrcweir     {
108*cdf0e10cSrcweir         XModel xModel = null;
109*cdf0e10cSrcweir         try
110*cdf0e10cSrcweir         {
111*cdf0e10cSrcweir             XTasksSupplier xTasksSupplier =
112*cdf0e10cSrcweir                 (XTasksSupplier) UnoRuntime.queryInterface(
113*cdf0e10cSrcweir                     XTasksSupplier.class, mxDesktop);
114*cdf0e10cSrcweir             XEnumerationAccess xEA = xTasksSupplier.getTasks();
115*cdf0e10cSrcweir             XEnumeration xE = xEA.createEnumeration();
116*cdf0e10cSrcweir             while (xE.hasMoreElements())
117*cdf0e10cSrcweir             {
118*cdf0e10cSrcweir                 XTask xTask = (XTask) UnoRuntime.queryInterface(
119*cdf0e10cSrcweir                     XTask.class, xE.nextElement());
120*cdf0e10cSrcweir                 MessageArea.print (xTask.getName());
121*cdf0e10cSrcweir             }
122*cdf0e10cSrcweir         }
123*cdf0e10cSrcweir         catch (Exception e)
124*cdf0e10cSrcweir         {
125*cdf0e10cSrcweir             MessageArea.println ("caught exception while getting Model " + name
126*cdf0e10cSrcweir                 + ": " + e);
127*cdf0e10cSrcweir         }
128*cdf0e10cSrcweir         return xModel;
129*cdf0e10cSrcweir     }
130*cdf0e10cSrcweir 
131*cdf0e10cSrcweir 
132*cdf0e10cSrcweir     public XModel getModel (XDrawView xView)
133*cdf0e10cSrcweir     {
134*cdf0e10cSrcweir         XController xController = (XController) UnoRuntime.queryInterface(
135*cdf0e10cSrcweir             XController.class, xView);
136*cdf0e10cSrcweir         if (xController != null)
137*cdf0e10cSrcweir             return xController.getModel();
138*cdf0e10cSrcweir         else
139*cdf0e10cSrcweir         {
140*cdf0e10cSrcweir             MessageArea.println ("can't cast view to controller");
141*cdf0e10cSrcweir             return null;
142*cdf0e10cSrcweir         }
143*cdf0e10cSrcweir     }
144*cdf0e10cSrcweir 
145*cdf0e10cSrcweir     public  XDesktop getDesktop ()
146*cdf0e10cSrcweir     {
147*cdf0e10cSrcweir         if (mxDesktop != null)
148*cdf0e10cSrcweir             return mxDesktop;
149*cdf0e10cSrcweir         try
150*cdf0e10cSrcweir         {
151*cdf0e10cSrcweir             //  Get the factory of the connected office.
152*cdf0e10cSrcweir             XMultiServiceFactory xMSF = aConnection.getServiceManager ();
153*cdf0e10cSrcweir             if (xMSF == null)
154*cdf0e10cSrcweir             {
155*cdf0e10cSrcweir                 MessageArea.println ("can't connect to office");
156*cdf0e10cSrcweir                 return null;
157*cdf0e10cSrcweir             }
158*cdf0e10cSrcweir             else
159*cdf0e10cSrcweir                 MessageArea.println ("Connected successfully.");
160*cdf0e10cSrcweir 
161*cdf0e10cSrcweir             //  Create a new desktop.
162*cdf0e10cSrcweir             mxDesktop = (XDesktop) UnoRuntime.queryInterface(
163*cdf0e10cSrcweir                 XDesktop.class,
164*cdf0e10cSrcweir                 xMSF.createInstance ("com.sun.star.frame.Desktop")
165*cdf0e10cSrcweir                 );
166*cdf0e10cSrcweir         }
167*cdf0e10cSrcweir         catch (Exception e)
168*cdf0e10cSrcweir         {
169*cdf0e10cSrcweir             MessageArea.println ("caught exception while creating desktop: "
170*cdf0e10cSrcweir                 + e);
171*cdf0e10cSrcweir         }
172*cdf0e10cSrcweir 
173*cdf0e10cSrcweir         return mxDesktop;
174*cdf0e10cSrcweir     }
175*cdf0e10cSrcweir 
176*cdf0e10cSrcweir 
177*cdf0e10cSrcweir     /** Return a reference to the extended toolkit which is a broadcaster of
178*cdf0e10cSrcweir         top window, key, and focus events.
179*cdf0e10cSrcweir     */
180*cdf0e10cSrcweir     public XExtendedToolkit getExtendedToolkit ()
181*cdf0e10cSrcweir     {
182*cdf0e10cSrcweir         XExtendedToolkit xToolkit = null;
183*cdf0e10cSrcweir         try
184*cdf0e10cSrcweir         {
185*cdf0e10cSrcweir             //  Get the factory of the connected office.
186*cdf0e10cSrcweir             XMultiServiceFactory xMSF = aConnection.getServiceManager ();
187*cdf0e10cSrcweir             if (xMSF != null)
188*cdf0e10cSrcweir             {
189*cdf0e10cSrcweir                 xToolkit = (XExtendedToolkit) UnoRuntime.queryInterface(
190*cdf0e10cSrcweir                     XExtendedToolkit.class,
191*cdf0e10cSrcweir                     xMSF.createInstance ("stardiv.Toolkit.VCLXToolkit")
192*cdf0e10cSrcweir                     );
193*cdf0e10cSrcweir             }
194*cdf0e10cSrcweir         }
195*cdf0e10cSrcweir         catch (Exception e)
196*cdf0e10cSrcweir         {
197*cdf0e10cSrcweir             MessageArea.println ("caught exception while creating extended toolkit: " + e);
198*cdf0e10cSrcweir         }
199*cdf0e10cSrcweir 
200*cdf0e10cSrcweir         return xToolkit;
201*cdf0e10cSrcweir     }
202*cdf0e10cSrcweir 
203*cdf0e10cSrcweir 
204*cdf0e10cSrcweir 
205*cdf0e10cSrcweir     public XAccessible getAccessibleObject (XInterface xObject)
206*cdf0e10cSrcweir     {
207*cdf0e10cSrcweir         XAccessible xAccessible = null;
208*cdf0e10cSrcweir         try
209*cdf0e10cSrcweir         {
210*cdf0e10cSrcweir             xAccessible = (XAccessible) UnoRuntime.queryInterface(
211*cdf0e10cSrcweir                 XAccessible.class, xObject);
212*cdf0e10cSrcweir         }
213*cdf0e10cSrcweir         catch (Exception e)
214*cdf0e10cSrcweir         {
215*cdf0e10cSrcweir             MessageArea.println (
216*cdf0e10cSrcweir                 "caught exception while getting accessible object" + e);
217*cdf0e10cSrcweir             e.printStackTrace();
218*cdf0e10cSrcweir         }
219*cdf0e10cSrcweir         return xAccessible;
220*cdf0e10cSrcweir     }
221*cdf0e10cSrcweir 
222*cdf0e10cSrcweir     /** Return the root object of the accessibility hierarchy.
223*cdf0e10cSrcweir     */
224*cdf0e10cSrcweir     public XAccessible getAccessibleRoot (XAccessible xAccessible)
225*cdf0e10cSrcweir     {
226*cdf0e10cSrcweir         try
227*cdf0e10cSrcweir         {
228*cdf0e10cSrcweir             XAccessible xParent = null;
229*cdf0e10cSrcweir             do
230*cdf0e10cSrcweir             {
231*cdf0e10cSrcweir                 XAccessibleContext xContext = xAccessible.getAccessibleContext();
232*cdf0e10cSrcweir                 if (xContext != null)
233*cdf0e10cSrcweir                     xParent = xContext.getAccessibleParent();
234*cdf0e10cSrcweir                 if (xParent != null)
235*cdf0e10cSrcweir                     xAccessible = xParent;
236*cdf0e10cSrcweir             }
237*cdf0e10cSrcweir             while (xParent != null);
238*cdf0e10cSrcweir         }
239*cdf0e10cSrcweir         catch (Exception e)
240*cdf0e10cSrcweir         {
241*cdf0e10cSrcweir             MessageArea.println (
242*cdf0e10cSrcweir                 "caught exception while getting accessible root" + e);
243*cdf0e10cSrcweir             e.printStackTrace();
244*cdf0e10cSrcweir         }
245*cdf0e10cSrcweir         return xAccessible;
246*cdf0e10cSrcweir     }
247*cdf0e10cSrcweir 
248*cdf0e10cSrcweir 
249*cdf0e10cSrcweir 
250*cdf0e10cSrcweir 
251*cdf0e10cSrcweir     /** @descr Return the current window associated with the given
252*cdf0e10cSrcweir                 model.
253*cdf0e10cSrcweir     */
254*cdf0e10cSrcweir     public XWindow getCurrentWindow ()
255*cdf0e10cSrcweir     {
256*cdf0e10cSrcweir         return getCurrentWindow ((XModel) UnoRuntime.queryInterface(
257*cdf0e10cSrcweir                 XModel.class, getDesktop()));
258*cdf0e10cSrcweir     }
259*cdf0e10cSrcweir 
260*cdf0e10cSrcweir 
261*cdf0e10cSrcweir 
262*cdf0e10cSrcweir 
263*cdf0e10cSrcweir 
264*cdf0e10cSrcweir     public XWindow getCurrentWindow (XModel xModel)
265*cdf0e10cSrcweir     {
266*cdf0e10cSrcweir         XWindow xWindow = null;
267*cdf0e10cSrcweir         try
268*cdf0e10cSrcweir         {
269*cdf0e10cSrcweir             if (xModel == null)
270*cdf0e10cSrcweir                 MessageArea.println ("invalid model (==null)");
271*cdf0e10cSrcweir             XController xController = xModel.getCurrentController();
272*cdf0e10cSrcweir             if (xController == null)
273*cdf0e10cSrcweir                 MessageArea.println ("can't get controller from model");
274*cdf0e10cSrcweir             XFrame xFrame = xController.getFrame();
275*cdf0e10cSrcweir             if (xFrame == null)
276*cdf0e10cSrcweir                 MessageArea.println ("can't get frame from controller");
277*cdf0e10cSrcweir             xWindow = xFrame.getComponentWindow ();
278*cdf0e10cSrcweir             if (xWindow == null)
279*cdf0e10cSrcweir                 MessageArea.println ("can't get window from frame");
280*cdf0e10cSrcweir         }
281*cdf0e10cSrcweir         catch (Exception e)
282*cdf0e10cSrcweir         {
283*cdf0e10cSrcweir             MessageArea.println ("caught exception while getting current window" + e);
284*cdf0e10cSrcweir         }
285*cdf0e10cSrcweir 
286*cdf0e10cSrcweir         return xWindow;
287*cdf0e10cSrcweir     }
288*cdf0e10cSrcweir 
289*cdf0e10cSrcweir 
290*cdf0e10cSrcweir     /** @descr Return the current draw page of the given desktop.
291*cdf0e10cSrcweir     */
292*cdf0e10cSrcweir     public XDrawPage getCurrentDrawPage ()
293*cdf0e10cSrcweir     {
294*cdf0e10cSrcweir         return getCurrentDrawPage ((XDrawView) UnoRuntime.queryInterface(
295*cdf0e10cSrcweir                 XDrawView.class, getCurrentView()));
296*cdf0e10cSrcweir     }
297*cdf0e10cSrcweir 
298*cdf0e10cSrcweir 
299*cdf0e10cSrcweir 
300*cdf0e10cSrcweir 
301*cdf0e10cSrcweir     public XDrawPage getCurrentDrawPage (XDrawView xView)
302*cdf0e10cSrcweir     {
303*cdf0e10cSrcweir         XDrawPage xPage = null;
304*cdf0e10cSrcweir         try
305*cdf0e10cSrcweir         {
306*cdf0e10cSrcweir             if (xView == null)
307*cdf0e10cSrcweir                 MessageArea.println ("can't get current draw page from null view");
308*cdf0e10cSrcweir             else
309*cdf0e10cSrcweir                 xPage = xView.getCurrentPage();
310*cdf0e10cSrcweir         }
311*cdf0e10cSrcweir         catch (Exception e)
312*cdf0e10cSrcweir         {
313*cdf0e10cSrcweir             MessageArea.println ("caught exception while getting current draw page : " + e);
314*cdf0e10cSrcweir         }
315*cdf0e10cSrcweir 
316*cdf0e10cSrcweir         return xPage;
317*cdf0e10cSrcweir     }
318*cdf0e10cSrcweir 
319*cdf0e10cSrcweir 
320*cdf0e10cSrcweir 
321*cdf0e10cSrcweir 
322*cdf0e10cSrcweir     /** @descr Return the current view of the given desktop.
323*cdf0e10cSrcweir     */
324*cdf0e10cSrcweir     public XDrawView getCurrentView ()
325*cdf0e10cSrcweir     {
326*cdf0e10cSrcweir         return getCurrentView (getDesktop());
327*cdf0e10cSrcweir     }
328*cdf0e10cSrcweir 
329*cdf0e10cSrcweir     public XDrawView getCurrentView (XDesktop xDesktop)
330*cdf0e10cSrcweir     {
331*cdf0e10cSrcweir         if (xDesktop == null)
332*cdf0e10cSrcweir             MessageArea.println ("can't get desktop to retrieve current view");
333*cdf0e10cSrcweir 
334*cdf0e10cSrcweir         XDrawView xView = null;
335*cdf0e10cSrcweir         try
336*cdf0e10cSrcweir         {
337*cdf0e10cSrcweir             XComponent xComponent = xDesktop.getCurrentComponent();
338*cdf0e10cSrcweir             if (xComponent == null)
339*cdf0e10cSrcweir                 MessageArea.println ("can't get component to retrieve current view");
340*cdf0e10cSrcweir 
341*cdf0e10cSrcweir             XFrame xFrame = xDesktop.getCurrentFrame();
342*cdf0e10cSrcweir             if (xFrame == null)
343*cdf0e10cSrcweir                 MessageArea.println ("can't get frame to retrieve current view");
344*cdf0e10cSrcweir 
345*cdf0e10cSrcweir             XController xController = xFrame.getController();
346*cdf0e10cSrcweir             if (xController == null)
347*cdf0e10cSrcweir                 MessageArea.println ("can't get controller to retrieve current view");
348*cdf0e10cSrcweir 
349*cdf0e10cSrcweir             xView = (XDrawView) UnoRuntime.queryInterface(
350*cdf0e10cSrcweir                 XDrawView.class, xController);
351*cdf0e10cSrcweir             if (xView == null)
352*cdf0e10cSrcweir                 MessageArea.println ("could not cast controller into view");
353*cdf0e10cSrcweir         }
354*cdf0e10cSrcweir         catch (Exception e)
355*cdf0e10cSrcweir         {
356*cdf0e10cSrcweir             MessageArea.println ("caught exception while getting current view : " + e);
357*cdf0e10cSrcweir         }
358*cdf0e10cSrcweir 
359*cdf0e10cSrcweir         return xView;
360*cdf0e10cSrcweir     }
361*cdf0e10cSrcweir 
362*cdf0e10cSrcweir 
363*cdf0e10cSrcweir 
364*cdf0e10cSrcweir 
365*cdf0e10cSrcweir     //  Return the accessible object of the document window.
366*cdf0e10cSrcweir     public static XAccessible getAccessibleDocumentWindow (XDrawPage xPage)
367*cdf0e10cSrcweir     {
368*cdf0e10cSrcweir         XIndexAccess xShapeList = (XIndexAccess) UnoRuntime.queryInterface(
369*cdf0e10cSrcweir             XIndexAccess.class, xPage);
370*cdf0e10cSrcweir         if (xShapeList.getCount() > 0)
371*cdf0e10cSrcweir         {
372*cdf0e10cSrcweir             // All shapes return as accessible object the document window's
373*cdf0e10cSrcweir             // accessible object.  This is, of course, a hack and will be
374*cdf0e10cSrcweir             // removed as soon as the missing infrastructure for obtaining
375*cdf0e10cSrcweir             // the object directly is implemented.
376*cdf0e10cSrcweir             XShape xShape = null;
377*cdf0e10cSrcweir             try{
378*cdf0e10cSrcweir                 xShape = (XShape) UnoRuntime.queryInterface(
379*cdf0e10cSrcweir                     XShape.class, xShapeList.getByIndex (0));
380*cdf0e10cSrcweir             } catch (Exception e)
381*cdf0e10cSrcweir             {}
382*cdf0e10cSrcweir             XAccessible xAccessible = (XAccessible) UnoRuntime.queryInterface (
383*cdf0e10cSrcweir                 XAccessible.class, xShape);
384*cdf0e10cSrcweir             return xAccessible;
385*cdf0e10cSrcweir         }
386*cdf0e10cSrcweir         else
387*cdf0e10cSrcweir             return null;
388*cdf0e10cSrcweir     }
389*cdf0e10cSrcweir }
390