1*34dd1e25SAndrew Rist /**************************************************************
2*34dd1e25SAndrew Rist  *
3*34dd1e25SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*34dd1e25SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*34dd1e25SAndrew Rist  * distributed with this work for additional information
6*34dd1e25SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*34dd1e25SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*34dd1e25SAndrew Rist  * "License"); you may not use this file except in compliance
9*34dd1e25SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*34dd1e25SAndrew Rist  *
11*34dd1e25SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*34dd1e25SAndrew Rist  *
13*34dd1e25SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*34dd1e25SAndrew Rist  * software distributed under the License is distributed on an
15*34dd1e25SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*34dd1e25SAndrew Rist  * KIND, either express or implied.  See the License for the
17*34dd1e25SAndrew Rist  * specific language governing permissions and limitations
18*34dd1e25SAndrew Rist  * under the License.
19*34dd1e25SAndrew Rist  *
20*34dd1e25SAndrew Rist  *************************************************************/
21*34dd1e25SAndrew Rist 
22*34dd1e25SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir import java.awt.event.ActionListener;
25cdf0e10cSrcweir import javax.swing.*;
26cdf0e10cSrcweir import java.awt.*;
27cdf0e10cSrcweir import java.util.*;
28cdf0e10cSrcweir 
29cdf0e10cSrcweir import com.sun.star.awt.XFocusListener;
30cdf0e10cSrcweir import com.sun.star.uno.UnoRuntime;
31cdf0e10cSrcweir import com.sun.star.bridge.XUnoUrlResolver;
32cdf0e10cSrcweir import com.sun.star.lang.XMultiServiceFactory;
33cdf0e10cSrcweir import com.sun.star.accessibility.*;
34cdf0e10cSrcweir import com.sun.star.awt.XExtendedToolkit;
35cdf0e10cSrcweir 
36cdf0e10cSrcweir 
37cdf0e10cSrcweir /** This timer task tries to connect to a running Office application in regular
38cdf0e10cSrcweir     intervals until a connection can be successfully established.
39cdf0e10cSrcweir */
40cdf0e10cSrcweir class ConnectionTask
41cdf0e10cSrcweir     extends TimerTask
42cdf0e10cSrcweir {
ConnectionTask(EventListenerProxy xListener)43cdf0e10cSrcweir     public ConnectionTask (EventListenerProxy xListener)
44cdf0e10cSrcweir     {
45cdf0e10cSrcweir         Init (xListener);
46cdf0e10cSrcweir     }
47cdf0e10cSrcweir 
Init(EventListenerProxy xListener)48cdf0e10cSrcweir     private void Init (EventListenerProxy xListener)
49cdf0e10cSrcweir     {
50cdf0e10cSrcweir         mxListener = xListener;
51cdf0e10cSrcweir         mbInitialized = false;
52cdf0e10cSrcweir 
53cdf0e10cSrcweir         maTimer = new java.util.Timer ();
54cdf0e10cSrcweir         maTimer.schedule (this, 0, mnPeriod);
55cdf0e10cSrcweir     }
56cdf0e10cSrcweir 
57cdf0e10cSrcweir 
58cdf0e10cSrcweir     /** This method is run every time the task is executed.  It tries to
59cdf0e10cSrcweir         connect to and register the listener at an Office application.  If it
60cdf0e10cSrcweir         can establish a connection it terminates the timer task.  Otherwise it
61cdf0e10cSrcweir         waits until the next activation.
62cdf0e10cSrcweir     */
run()63cdf0e10cSrcweir     public void run ()
64cdf0e10cSrcweir     {
65cdf0e10cSrcweir         if (registerListeners())
66cdf0e10cSrcweir         {
67cdf0e10cSrcweir             // Focus listener was successfully registered so we can cancel this task.
68cdf0e10cSrcweir             MessageArea.println ("\nconnected successfully to office");
69cdf0e10cSrcweir             cancel ();
70cdf0e10cSrcweir             maTimer = null;
71cdf0e10cSrcweir         }
72cdf0e10cSrcweir     }
73cdf0e10cSrcweir 
74cdf0e10cSrcweir 
75cdf0e10cSrcweir 
76cdf0e10cSrcweir 
77cdf0e10cSrcweir     /** Try to register the listener.
78cdf0e10cSrcweir     */
registerListeners()79cdf0e10cSrcweir     private boolean registerListeners ()
80cdf0e10cSrcweir     {
81cdf0e10cSrcweir         // Get toolkit.
82cdf0e10cSrcweir         XExtendedToolkit xToolkit = getToolkit ();
83cdf0e10cSrcweir 
84cdf0e10cSrcweir         // Register at toolkit as focus event listener.
85cdf0e10cSrcweir         if (xToolkit != null)
86cdf0e10cSrcweir         {
87cdf0e10cSrcweir             xToolkit.addTopWindowListener (mxListener);
88cdf0e10cSrcweir             int nTopWindowCount = xToolkit.getTopWindowCount();
89cdf0e10cSrcweir             try
90cdf0e10cSrcweir             {
91cdf0e10cSrcweir                 com.sun.star.lang.EventObject aEvent = new com.sun.star.lang.EventObject();
92cdf0e10cSrcweir                 for (int i=0; i<nTopWindowCount; i++)
93cdf0e10cSrcweir                 {
94cdf0e10cSrcweir                     XAccessible xAccessible = (XAccessible) UnoRuntime.queryInterface(
95cdf0e10cSrcweir                         XAccessible.class,
96cdf0e10cSrcweir                         xToolkit.getTopWindow(i));
97cdf0e10cSrcweir                     XAccessibleContext xContext = xAccessible.getAccessibleContext();
98cdf0e10cSrcweir                     if (xContext.getAccessibleName().length() > 0)
99cdf0e10cSrcweir                     {
100cdf0e10cSrcweir                         // Simulate an event that leads to registration the
101cdf0e10cSrcweir                         // listener at the window.
102cdf0e10cSrcweir                         aEvent.Source = xToolkit.getTopWindow(i);
103cdf0e10cSrcweir                         mxListener.windowOpened (aEvent);
104cdf0e10cSrcweir                     }
105cdf0e10cSrcweir                 }
106cdf0e10cSrcweir             }
107cdf0e10cSrcweir 
108cdf0e10cSrcweir             catch (com.sun.star.lang.IndexOutOfBoundsException aException)
109cdf0e10cSrcweir             {
110cdf0e10cSrcweir                 // This exception signals that the number of top windows has
111cdf0e10cSrcweir                 // changed since our last call to getTopWindowCount().
112cdf0e10cSrcweir             }
113cdf0e10cSrcweir             return true;
114cdf0e10cSrcweir         }
115cdf0e10cSrcweir         else
116cdf0e10cSrcweir             return false;
117cdf0e10cSrcweir     }
118cdf0e10cSrcweir 
119cdf0e10cSrcweir 
120cdf0e10cSrcweir 
121cdf0e10cSrcweir 
122cdf0e10cSrcweir     /** Get the toolkit from an Office which can then be used to register
123cdf0e10cSrcweir         the listener.
124cdf0e10cSrcweir     */
getToolkit()125cdf0e10cSrcweir     private XExtendedToolkit getToolkit ()
126cdf0e10cSrcweir     {
127cdf0e10cSrcweir         XMultiServiceFactory xFactory = connectToOffice();
128cdf0e10cSrcweir 
129cdf0e10cSrcweir         // Get toolkit.
130cdf0e10cSrcweir         XExtendedToolkit xToolkit = null;
131cdf0e10cSrcweir         try
132cdf0e10cSrcweir         {
133cdf0e10cSrcweir             if (xFactory != null)
134cdf0e10cSrcweir             {
135cdf0e10cSrcweir                 xToolkit = (XExtendedToolkit) UnoRuntime.queryInterface(
136cdf0e10cSrcweir                     XExtendedToolkit.class,
137cdf0e10cSrcweir                     xFactory.createInstance ("stardiv.Toolkit.VCLXToolkit"));
138cdf0e10cSrcweir             }
139cdf0e10cSrcweir         }
140cdf0e10cSrcweir         catch (com.sun.star.uno.Exception aException)
141cdf0e10cSrcweir         {
142cdf0e10cSrcweir             MessageArea.println ("caught exception while creating extended toolkit");
143cdf0e10cSrcweir             // Ignored.
144cdf0e10cSrcweir         }
145cdf0e10cSrcweir 
146cdf0e10cSrcweir         return xToolkit;
147cdf0e10cSrcweir     }
148cdf0e10cSrcweir 
149cdf0e10cSrcweir 
150cdf0e10cSrcweir 
151cdf0e10cSrcweir 
152cdf0e10cSrcweir     /** Connect to a running (Star|Open)Office application
153cdf0e10cSrcweir     */
connectToOffice()154cdf0e10cSrcweir     private XMultiServiceFactory connectToOffice ()
155cdf0e10cSrcweir     {
156cdf0e10cSrcweir         // connect to a running office and get the ServiceManager
157cdf0e10cSrcweir         try
158cdf0e10cSrcweir         {
159cdf0e10cSrcweir             com.sun.star.uno.XComponentContext xCmpContext = null;
160cdf0e10cSrcweir 
161cdf0e10cSrcweir             // get the remote office component context
162cdf0e10cSrcweir             xCmpContext = com.sun.star.comp.helper.Bootstrap.bootstrap();
163cdf0e10cSrcweir             if( xCmpContext != null )
164cdf0e10cSrcweir                 System.out.println("Connected to a running office ...");
165cdf0e10cSrcweir 
166cdf0e10cSrcweir             // get the remote office service manager
167cdf0e10cSrcweir             com.sun.star.lang.XMultiComponentFactory xMCF =
168cdf0e10cSrcweir                 xCmpContext.getServiceManager();
169cdf0e10cSrcweir 
170cdf0e10cSrcweir             return (XMultiServiceFactory) UnoRuntime.queryInterface (
171cdf0e10cSrcweir                 XMultiServiceFactory.class, xMCF);
172cdf0e10cSrcweir         }
173cdf0e10cSrcweir 
174cdf0e10cSrcweir         catch (Exception e)
175cdf0e10cSrcweir         {
176cdf0e10cSrcweir             if ( ! mbInitialized)
177cdf0e10cSrcweir                 MessageArea.println ("Could not connect to office");
178cdf0e10cSrcweir             else
179cdf0e10cSrcweir                 MessageArea.print (".");
180cdf0e10cSrcweir         }
181cdf0e10cSrcweir         mbInitialized = true;
182cdf0e10cSrcweir         return null;
183cdf0e10cSrcweir     }
184cdf0e10cSrcweir 
185cdf0e10cSrcweir     /** Time in milliseconds between two attempts to connect to an Office
186cdf0e10cSrcweir          application.
187cdf0e10cSrcweir     */
188cdf0e10cSrcweir     private int mnPeriod = 1000;
189cdf0e10cSrcweir 
190cdf0e10cSrcweir     private EventListenerProxy mxListener;
191cdf0e10cSrcweir     private boolean mbInitialized;
192cdf0e10cSrcweir 
193cdf0e10cSrcweir     /** This timer is used for the registration loop to retry to connect to
194cdf0e10cSrcweir         the Office until a connection can be established.
195cdf0e10cSrcweir     */
196cdf0e10cSrcweir     private java.util.Timer maTimer;
197cdf0e10cSrcweir }
198