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