xref: /AOO41X/main/bean/com/sun/star/comp/beans/OOoBean.java (revision d4cc1e8c350bb591a80bbabe126ff6af34c125a2)
1*d4cc1e8cSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*d4cc1e8cSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*d4cc1e8cSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*d4cc1e8cSAndrew Rist  * distributed with this work for additional information
6*d4cc1e8cSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*d4cc1e8cSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*d4cc1e8cSAndrew Rist  * "License"); you may not use this file except in compliance
9*d4cc1e8cSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*d4cc1e8cSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*d4cc1e8cSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*d4cc1e8cSAndrew Rist  * software distributed under the License is distributed on an
15*d4cc1e8cSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*d4cc1e8cSAndrew Rist  * KIND, either express or implied.  See the License for the
17*d4cc1e8cSAndrew Rist  * specific language governing permissions and limitations
18*d4cc1e8cSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*d4cc1e8cSAndrew Rist  *************************************************************/
21*d4cc1e8cSAndrew Rist 
22*d4cc1e8cSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir package com.sun.star.comp.beans;
25cdf0e10cSrcweir 
26cdf0e10cSrcweir import com.sun.star.uno.UnoRuntime;
27cdf0e10cSrcweir 
28cdf0e10cSrcweir // @requirement FUNC.PERF.LRN/0.6
29cdf0e10cSrcweir // @requirement FUNC.PERF.LOC/0.6
30cdf0e10cSrcweir // @requirement FUNC.PERF.FIX/0.6
31cdf0e10cSrcweir /** This is the basic JavaBean for all OOo application modules.
32cdf0e10cSrcweir 
33cdf0e10cSrcweir     @requirement FUNC.RES.OTH/0.2
34cdf0e10cSrcweir         No other resources are needed yet.
35cdf0e10cSrcweir 
36cdf0e10cSrcweir     @since OOo 2.0.0
37cdf0e10cSrcweir  */
38cdf0e10cSrcweir public class OOoBean
39cdf0e10cSrcweir 
40cdf0e10cSrcweir     // @requirement FUNC.BEAN.VIEW/0.4
41cdf0e10cSrcweir     extends java.awt.Container
42cdf0e10cSrcweir 
43cdf0e10cSrcweir     implements
44cdf0e10cSrcweir         // @requirement FUNC.PER/0.2
45cdf0e10cSrcweir         java.io.Externalizable
46cdf0e10cSrcweir {
47cdf0e10cSrcweir     // timeout values (milli secs)
48cdf0e10cSrcweir     int nOOoStartTimeOut = 60000;
49cdf0e10cSrcweir     int nOOoCallTimeOut =   3000;
50cdf0e10cSrcweir     int nOOoCheckCycle =    1000;
51cdf0e10cSrcweir 
52cdf0e10cSrcweir     // This member contains the connection to an OOo instance if established.
53cdf0e10cSrcweir     private transient OfficeConnection      iConnection;
54cdf0e10cSrcweir     private transient EventListener         xConnectionListener;
55cdf0e10cSrcweir 
56cdf0e10cSrcweir     // @requirement FUNC.BEAN.VIEW/0.4
57cdf0e10cSrcweir     // @requirement FUNC.BEAN.EDIT/0.4
58cdf0e10cSrcweir     // This member contains the OOo window
59cdf0e10cSrcweir     // if a connection is established.
60cdf0e10cSrcweir     // It is a child of the OOoBean canvas.
61cdf0e10cSrcweir     private OfficeWindow xFrameWindow;
62cdf0e10cSrcweir 
63cdf0e10cSrcweir     // application environment
64cdf0e10cSrcweir     private transient com.sun.star.lang.XMultiServiceFactory xServiceFactory;
65cdf0e10cSrcweir     private transient com.sun.star.frame.XDesktop xDesktop;
66cdf0e10cSrcweir 
67cdf0e10cSrcweir     // document and frame
68cdf0e10cSrcweir     private transient Frame aFrame;
69cdf0e10cSrcweir     private transient Controller aController;
70cdf0e10cSrcweir     private transient OfficeDocument aDocument;
71cdf0e10cSrcweir 
72cdf0e10cSrcweir     // slot command execution environment
73cdf0e10cSrcweir     private transient com.sun.star.frame.XDispatchProvider xDispatcher;
74cdf0e10cSrcweir     private transient com.sun.star.util.XURLTransformer xURLTransformer;
75cdf0e10cSrcweir 
76cdf0e10cSrcweir     // properties
77cdf0e10cSrcweir     private boolean bIgnoreVisibility = false; // to show even if already visible
78cdf0e10cSrcweir     private boolean bMenuBarVisible = true;
79cdf0e10cSrcweir     private boolean bStandardBarVisible = true;
80cdf0e10cSrcweir     private boolean bToolBarVisible = true;
81cdf0e10cSrcweir     private boolean bStatusBarVisible = true;
82cdf0e10cSrcweir 
83cdf0e10cSrcweir 
84cdf0e10cSrcweir     // debugging method
dbgPrint( String aMessage )85cdf0e10cSrcweir     private void dbgPrint( String aMessage )
86cdf0e10cSrcweir     {
87cdf0e10cSrcweir         // System.err.println( "OOoBean: " + aMessage );
88cdf0e10cSrcweir     }
89cdf0e10cSrcweir 
90cdf0e10cSrcweir     // @requirement FUNC.PER/0.2
91cdf0e10cSrcweir     /** @internal
92cdf0e10cSrcweir      *  @deprecated
93cdf0e10cSrcweir      */
writeExternal( java.io.ObjectOutput aObjOut )94cdf0e10cSrcweir     public void writeExternal( java.io.ObjectOutput aObjOut )
95cdf0e10cSrcweir     {
96cdf0e10cSrcweir         // TBD
97cdf0e10cSrcweir     }
98cdf0e10cSrcweir 
99cdf0e10cSrcweir     // @requirement FUNC.PER/0.2
100cdf0e10cSrcweir     /** @internal
101cdf0e10cSrcweir      *  @deprecated
102cdf0e10cSrcweir      */
readExternal( java.io.ObjectInput aObjIn )103cdf0e10cSrcweir     public void readExternal( java.io.ObjectInput aObjIn )
104cdf0e10cSrcweir     {
105cdf0e10cSrcweir         // TBD
106cdf0e10cSrcweir     }
107cdf0e10cSrcweir 
108cdf0e10cSrcweir     /** Generic constructor of the OOoBean.
109cdf0e10cSrcweir 
110cdf0e10cSrcweir         Neither a connection is established nor any document loaded.
111cdf0e10cSrcweir      */
OOoBean()112cdf0e10cSrcweir     public OOoBean()
113cdf0e10cSrcweir     {}
114cdf0e10cSrcweir 
115cdf0e10cSrcweir     // @requirement FUNC.CON.MULT/0.3
116cdf0e10cSrcweir     /** Constructor for an OOoBean which uses a specific office connection.
117cdf0e10cSrcweir 
118cdf0e10cSrcweir         The connection must be established but no document is loaded.
119cdf0e10cSrcweir 
120cdf0e10cSrcweir         @throws NoConnectionException
121cdf0e10cSrcweir             if the connection is not established.
122cdf0e10cSrcweir 
123cdf0e10cSrcweir         @deprecated Clients could use the getOOoConnection to obtain an OfficeConnection
124cdf0e10cSrcweir         and use it as argument in a constructor for another OOoBean instance. Calling
125cdf0e10cSrcweir         the dispose method of the OfficeConnection or the OOoBean's stopOOoConnection
126cdf0e10cSrcweir         method would make all instances of OOoBean stop working.
127cdf0e10cSrcweir      */
OOoBean( OfficeConnection iConnection )128cdf0e10cSrcweir     public OOoBean( OfficeConnection iConnection )
129cdf0e10cSrcweir         throws NoConnectionException
130cdf0e10cSrcweir     {
131cdf0e10cSrcweir         try { setOOoConnection( iConnection ); }
132cdf0e10cSrcweir         catch ( HasConnectionException aExc )
133cdf0e10cSrcweir         { /* impossible here */ }
134cdf0e10cSrcweir     }
135cdf0e10cSrcweir 
136cdf0e10cSrcweir     /** Sets the timeout for methods which launch OOo in milli seconds.
137cdf0e10cSrcweir 
138cdf0e10cSrcweir         This method does not need a connection to an OOo instance.
139cdf0e10cSrcweir      */
setOOoStartTimeOut( int nMilliSecs )140cdf0e10cSrcweir     public void setOOoStartTimeOut( int nMilliSecs )
141cdf0e10cSrcweir     {
142cdf0e10cSrcweir         nOOoStartTimeOut = nMilliSecs;
143cdf0e10cSrcweir     }
144cdf0e10cSrcweir 
145cdf0e10cSrcweir     /** Sets the timeout for normal OOO methods calls in milli seconds.
146cdf0e10cSrcweir 
147cdf0e10cSrcweir         This method does not need a connection to an OOo instance.
148cdf0e10cSrcweir      */
setOOoCallTimeOut( int nMilliSecs )149cdf0e10cSrcweir     public void setOOoCallTimeOut( int nMilliSecs )
150cdf0e10cSrcweir     {
151cdf0e10cSrcweir         nOOoCallTimeOut = nMilliSecs;
152cdf0e10cSrcweir     }
153cdf0e10cSrcweir 
154cdf0e10cSrcweir     /** Sets the period length in milli seconds to check the OOo connection.
155cdf0e10cSrcweir 
156cdf0e10cSrcweir         This method does not need a connection to an OOo instance.
157cdf0e10cSrcweir      */
setOOoCheckCycle( int nMilliSecs )158cdf0e10cSrcweir     public void setOOoCheckCycle( int nMilliSecs )
159cdf0e10cSrcweir     {
160cdf0e10cSrcweir         nOOoCheckCycle = nMilliSecs;
161cdf0e10cSrcweir     }
162cdf0e10cSrcweir 
163cdf0e10cSrcweir     /** Sets the a connection to an OOo instance.
164cdf0e10cSrcweir 
165cdf0e10cSrcweir         @internal
166cdf0e10cSrcweir      */
setOOoConnection( OfficeConnection iNewConnection )167cdf0e10cSrcweir     private synchronized void setOOoConnection( OfficeConnection iNewConnection )
168cdf0e10cSrcweir         throws  HasConnectionException, NoConnectionException
169cdf0e10cSrcweir     {
170cdf0e10cSrcweir         // the connection cannot be exchanged
171cdf0e10cSrcweir         if ( iConnection != null )
172cdf0e10cSrcweir             throw new HasConnectionException();
173cdf0e10cSrcweir 
174cdf0e10cSrcweir         // is there a real connection, not just the proxy?
175cdf0e10cSrcweir         com.sun.star.uno.XComponentContext xComponentContext = null;
176cdf0e10cSrcweir         try { xComponentContext = iNewConnection.getComponentContext(); }
177cdf0e10cSrcweir         catch ( java.lang.Throwable aExc )
178cdf0e10cSrcweir         { throw new NoConnectionException(); }
179cdf0e10cSrcweir         if ( xComponentContext == null )
180cdf0e10cSrcweir             throw new NoConnectionException();
181cdf0e10cSrcweir 
182cdf0e10cSrcweir         // set the connection
183cdf0e10cSrcweir         iConnection = iNewConnection;
184cdf0e10cSrcweir 
185cdf0e10cSrcweir         // get notified when connection dies
186cdf0e10cSrcweir         if ( xConnectionListener != null )
187cdf0e10cSrcweir             xConnectionListener.end();
188cdf0e10cSrcweir         xConnectionListener = this.new EventListener("setOOoConnection");
189cdf0e10cSrcweir     }
190cdf0e10cSrcweir 
191cdf0e10cSrcweir     // @requirement FUNC.CON.STRT/0.4
192cdf0e10cSrcweir     /** Starts a connection to an OOo instance which is lauched if not running.
193cdf0e10cSrcweir 
194cdf0e10cSrcweir         @throws HasConnectionException
195cdf0e10cSrcweir             if a connection was already established.
196cdf0e10cSrcweir 
197cdf0e10cSrcweir         @throws NoConnectionException
198cdf0e10cSrcweir             if the specified connection cannot be established
199cdf0e10cSrcweir      */
startOOoConnection( String aConnectionURL )200cdf0e10cSrcweir     public void startOOoConnection( String aConnectionURL )
201cdf0e10cSrcweir         throws  java.net.MalformedURLException,
202cdf0e10cSrcweir             HasConnectionException,
203cdf0e10cSrcweir             NoConnectionException
204cdf0e10cSrcweir     {
205cdf0e10cSrcweir         // create a new connection from the given connection URL
206cdf0e10cSrcweir         LocalOfficeConnection aConnection = new LocalOfficeConnection();
207cdf0e10cSrcweir         aConnection.setUnoUrl( aConnectionURL );
208cdf0e10cSrcweir         setOOoConnection( aConnection );
209cdf0e10cSrcweir     }
210cdf0e10cSrcweir 
211cdf0e10cSrcweir     // @requirement FUNC.CON.CHK/0.7
212cdf0e10cSrcweir     /** Returns true if this OOoBean is connected to an OOo instance,
213cdf0e10cSrcweir         false otherwise.
214cdf0e10cSrcweir 
215cdf0e10cSrcweir         @deprecated This method is not useful in a multithreaded environment. Then
216cdf0e10cSrcweir         all threads accessing the instance would have to be synchronized in order to
217cdf0e10cSrcweir         make is method work. It is better
218cdf0e10cSrcweir         to call OOoBean's methods and be prepared to catch a NoConnectionException.
219cdf0e10cSrcweir      */
isOOoConnected()220cdf0e10cSrcweir     public boolean isOOoConnected()
221cdf0e10cSrcweir     {
222cdf0e10cSrcweir         return iConnection != null;
223cdf0e10cSrcweir     }
224cdf0e10cSrcweir 
225cdf0e10cSrcweir     // @requirement FUNC.CON.STOP/0.4
226cdf0e10cSrcweir     /** Disconnects from the connected OOo instance.
227cdf0e10cSrcweir 
228cdf0e10cSrcweir         If there was no connection yet or anymore, this method can be called
229cdf0e10cSrcweir         anyway.
230cdf0e10cSrcweir 
231cdf0e10cSrcweir         When the OOoBean is displayed in an applet by a web browser, then this
232cdf0e10cSrcweir         method must be called from within java.applet.Applet.stop.
233cdf0e10cSrcweir      */
stopOOoConnection()234cdf0e10cSrcweir     public synchronized void stopOOoConnection()
235cdf0e10cSrcweir     {
236cdf0e10cSrcweir         // clear OOo document, frame etc.
237cdf0e10cSrcweir         clear();
238cdf0e10cSrcweir 
239cdf0e10cSrcweir         // cut the connection
240cdf0e10cSrcweir         OfficeConnection iExConnection = iConnection;
241cdf0e10cSrcweir         if ( iConnection != null )
242cdf0e10cSrcweir         {
243cdf0e10cSrcweir             if ( xConnectionListener != null )
244cdf0e10cSrcweir             {
245cdf0e10cSrcweir                 xConnectionListener.end();
246cdf0e10cSrcweir             }
247cdf0e10cSrcweir             iConnection = null;
248cdf0e10cSrcweir             iExConnection.dispose();
249cdf0e10cSrcweir         }
250cdf0e10cSrcweir 
251cdf0e10cSrcweir     }
252cdf0e10cSrcweir 
253cdf0e10cSrcweir     // @requirement FUNC.CON.STOP/0.4 (via XComponent.dispose())
254cdf0e10cSrcweir     // @requirement FUNC.CON.NTFY/0.4 (via XComponent.addEventListener())
255cdf0e10cSrcweir     /** Returns the a connection to an OOo instance.
256cdf0e10cSrcweir 
257cdf0e10cSrcweir         If no connection exists, a default connection will be created. An OfficeConnection
258cdf0e10cSrcweir         can be used to register listeners of type com.sun.star.lang.EventListener,
259cdf0e10cSrcweir         which are notified when the connection to the
260cdf0e10cSrcweir         office dies. One should not call the dispose method, because this may result
261cdf0e10cSrcweir         in receiving com.sun.star.lang.DisposedExceptions when calling
262cdf0e10cSrcweir         {@link #stopOOoConnection stopOOoConnection} or other API methods. If other instances share the
263cdf0e10cSrcweir         same connection then they will stop function properly, because they loose their
264cdf0e10cSrcweir         connection as well. The recommended way to end the connection is
265cdf0e10cSrcweir         calling {@link #stopOOoConnection stopOOoConnection}.
266cdf0e10cSrcweir 
267cdf0e10cSrcweir         @throws NoConnectionException
268cdf0e10cSrcweir             if no connection can be established
269cdf0e10cSrcweir 
270cdf0e10cSrcweir      */
getOOoConnection()271cdf0e10cSrcweir     public synchronized OfficeConnection getOOoConnection()
272cdf0e10cSrcweir         throws NoConnectionException
273cdf0e10cSrcweir     {
274cdf0e10cSrcweir         if ( iConnection == null )
275cdf0e10cSrcweir         {
276cdf0e10cSrcweir             try { setOOoConnection( new LocalOfficeConnection() ); }
277cdf0e10cSrcweir             catch ( HasConnectionException aExc )
278cdf0e10cSrcweir             { /* impossible here */ }
279cdf0e10cSrcweir         }
280cdf0e10cSrcweir         if ( iConnection.getComponentContext() == null )
281cdf0e10cSrcweir             throw new NoConnectionException();
282cdf0e10cSrcweir         return iConnection;
283cdf0e10cSrcweir     }
284cdf0e10cSrcweir 
285cdf0e10cSrcweir     /** Returns the service factory used by this OOoBean instance.
286cdf0e10cSrcweir 
287cdf0e10cSrcweir         @throws NoConnectionException
288cdf0e10cSrcweir             if no connection is established and no default connection can be established.
289cdf0e10cSrcweir      */
getMultiServiceFactory()290cdf0e10cSrcweir     public synchronized com.sun.star.lang.XMultiServiceFactory getMultiServiceFactory()
291cdf0e10cSrcweir         throws NoConnectionException
292cdf0e10cSrcweir     {
293cdf0e10cSrcweir         if ( xServiceFactory == null )
294cdf0e10cSrcweir         {
295cdf0e10cSrcweir             // avoid concurrent access from multiple threads
296cdf0e10cSrcweir             final OfficeConnection iConn = getOOoConnection();
297cdf0e10cSrcweir 
298cdf0e10cSrcweir             Thread aConnectorThread = new Thread() {
299cdf0e10cSrcweir                 public void run()
300cdf0e10cSrcweir                 {
301cdf0e10cSrcweir                     com.sun.star.lang.XMultiComponentFactory aFactory =
302cdf0e10cSrcweir                         iConn.getComponentContext().getServiceManager();
303cdf0e10cSrcweir                     xServiceFactory = (com.sun.star.lang.XMultiServiceFactory)
304cdf0e10cSrcweir                         UnoRuntime.queryInterface(
305cdf0e10cSrcweir                             com.sun.star.lang.XMultiServiceFactory.class, aFactory );
306cdf0e10cSrcweir                 }
307cdf0e10cSrcweir             };
308cdf0e10cSrcweir             aConnectorThread.start();
309cdf0e10cSrcweir             try { aConnectorThread.join(nOOoStartTimeOut); }
310cdf0e10cSrcweir             catch ( java.lang.InterruptedException aExc )
311cdf0e10cSrcweir             { throw new NoConnectionException(); }
312cdf0e10cSrcweir             if ( xServiceFactory == null )
313cdf0e10cSrcweir                 throw new NoConnectionException();
314cdf0e10cSrcweir         }
315cdf0e10cSrcweir 
316cdf0e10cSrcweir         return xServiceFactory;
317cdf0e10cSrcweir     }
318cdf0e10cSrcweir 
319cdf0e10cSrcweir     /** Returns the XDesktop interface of the OOo instance used by this OOoBean.
320cdf0e10cSrcweir 
321cdf0e10cSrcweir         @throws NoConnectionException
322cdf0e10cSrcweir             if no connection is established and no default connection can be established.
323cdf0e10cSrcweir      */
getOOoDesktop()324cdf0e10cSrcweir     public synchronized com.sun.star.frame.XDesktop getOOoDesktop()
325cdf0e10cSrcweir         throws NoConnectionException
326cdf0e10cSrcweir     {
327cdf0e10cSrcweir         if ( xDesktop == null )
328cdf0e10cSrcweir         {
329cdf0e10cSrcweir             try
330cdf0e10cSrcweir             {
331cdf0e10cSrcweir                 Object aObject = getMultiServiceFactory().createInstance( "com.sun.star.frame.Desktop");
332cdf0e10cSrcweir                 xDesktop = (com.sun.star.frame.XDesktop) UnoRuntime.queryInterface(
333cdf0e10cSrcweir                         com.sun.star.frame.XDesktop.class, aObject );
334cdf0e10cSrcweir             }
335cdf0e10cSrcweir             catch ( com.sun.star.uno.Exception aExc )
336cdf0e10cSrcweir             {} // TBD: what if no connection exists?
337cdf0e10cSrcweir         }
338cdf0e10cSrcweir 
339cdf0e10cSrcweir         return xDesktop;
340cdf0e10cSrcweir     }
341cdf0e10cSrcweir 
342cdf0e10cSrcweir     /** Resets this bean to an empty document.
343cdf0e10cSrcweir 
344cdf0e10cSrcweir        If a document is loaded and the content modified,
345cdf0e10cSrcweir        the changes are dismissed.  Otherwise nothing happens.
346cdf0e10cSrcweir 
347cdf0e10cSrcweir        This method is intended to be overridden in derived classes.
348cdf0e10cSrcweir        This implementation simply calls clear.
349cdf0e10cSrcweir 
350cdf0e10cSrcweir        @param bClearStateToo
351cdf0e10cSrcweir         Not only the document content but also the state of the bean,
352cdf0e10cSrcweir         like visibility of child components is cleared.
353cdf0e10cSrcweir 
354cdf0e10cSrcweir         @deprecated There is currently no way to dismiss changes, except for loading
355cdf0e10cSrcweir         of the unchanged initial document. Furthermore it is unclear how derived classes
356cdf0e10cSrcweir         handle this and what exactly their state is (e.g. what members make up their state).
357cdf0e10cSrcweir         Calling this method on a derived class requires knowledge about their implementation.
358cdf0e10cSrcweir         Therefore a deriving class should declare their own clearDocument if needed. Clients
359cdf0e10cSrcweir         should call the clearDocument of the deriving class or {@link #clear} which discards
360cdf0e10cSrcweir         the currently displayed document.
361cdf0e10cSrcweir      */
clearDocument( boolean bClearStateToo )362cdf0e10cSrcweir     public synchronized void clearDocument( boolean bClearStateToo )
363cdf0e10cSrcweir         throws
364cdf0e10cSrcweir             com.sun.star.util.CloseVetoException,
365cdf0e10cSrcweir             NoConnectionException
366cdf0e10cSrcweir     {
367cdf0e10cSrcweir         // TBD
368cdf0e10cSrcweir         clear();
369cdf0e10cSrcweir     }
370cdf0e10cSrcweir 
371cdf0e10cSrcweir     /** Resets the OOoBean to an empty status.
372cdf0e10cSrcweir 
373cdf0e10cSrcweir         Any loaded document is unloaded, no matter whether it is modified or not.
374cdf0e10cSrcweir         After calling this method, the OOoBean has no office document and no frame
375cdf0e10cSrcweir         anymore.  The connection will stay, though.
376cdf0e10cSrcweir 
377cdf0e10cSrcweir         This method works with or without an established connection.
378cdf0e10cSrcweir      */
clear()379cdf0e10cSrcweir     public synchronized void clear()
380cdf0e10cSrcweir     {
381cdf0e10cSrcweir         dbgPrint( "clear()" );
382cdf0e10cSrcweir 
383cdf0e10cSrcweir         try
384cdf0e10cSrcweir         {
385cdf0e10cSrcweir             CallWatchThread aCallWatchThread =
386cdf0e10cSrcweir                 new CallWatchThread( nOOoCallTimeOut, "clear" );
387cdf0e10cSrcweir             //By closing the frame we avoid that dialogs are displayed, for example when
388cdf0e10cSrcweir             //the document is modified.
389cdf0e10cSrcweir             com.sun.star.util.XCloseable xCloseable = (com.sun.star.util.XCloseable)
390cdf0e10cSrcweir                 UnoRuntime.queryInterface( com.sun.star.util.XCloseable.class, aFrame );
391cdf0e10cSrcweir             if ( xCloseable != null )
392cdf0e10cSrcweir             {
393cdf0e10cSrcweir                 try
394cdf0e10cSrcweir                 {
395cdf0e10cSrcweir                     xCloseable.close(true);
396cdf0e10cSrcweir                 }
397cdf0e10cSrcweir                 catch (com.sun.star.util.CloseVetoException exc)
398cdf0e10cSrcweir                 { // a print job may be running
399cdf0e10cSrcweir                 }
400cdf0e10cSrcweir             }
401cdf0e10cSrcweir 
402cdf0e10cSrcweir             aDocument = null;
403cdf0e10cSrcweir             xDispatcher = null;
404cdf0e10cSrcweir             aFrame = null;
405cdf0e10cSrcweir 
406cdf0e10cSrcweir             // clear xFrameWindow
407cdf0e10cSrcweir             if ( xFrameWindow != null )
408cdf0e10cSrcweir             {
409cdf0e10cSrcweir                 try { releaseSystemWindow(); }
410cdf0e10cSrcweir                 catch ( NoConnectionException aExc )
411cdf0e10cSrcweir                 {} // ignore
412cdf0e10cSrcweir                 catch ( SystemWindowException aExc )
413cdf0e10cSrcweir                 {} // ignore
414cdf0e10cSrcweir                 remove( xFrameWindow.getAWTComponent() );
415cdf0e10cSrcweir                 xFrameWindow = null;
416cdf0e10cSrcweir             }
417cdf0e10cSrcweir 
418cdf0e10cSrcweir             // clear xURTTransformer
419cdf0e10cSrcweir             if ( xURLTransformer != null )
420cdf0e10cSrcweir             {
421cdf0e10cSrcweir                 try
422cdf0e10cSrcweir                 {
423cdf0e10cSrcweir                     com.sun.star.lang.XComponent xComp = (com.sun.star.lang.XComponent)
424cdf0e10cSrcweir                         UnoRuntime.queryInterface(
425cdf0e10cSrcweir                             com.sun.star.lang.XComponent.class, xURLTransformer );
426cdf0e10cSrcweir                     if ( xComp != null )
427cdf0e10cSrcweir                         xComp.dispose();
428cdf0e10cSrcweir                 }
429cdf0e10cSrcweir                 catch ( java.lang.Throwable aExc )
430cdf0e10cSrcweir                 {} // ignore
431cdf0e10cSrcweir                 xURLTransformer = null;
432cdf0e10cSrcweir             }
433cdf0e10cSrcweir 
434cdf0e10cSrcweir             xDesktop = null;
435cdf0e10cSrcweir             xServiceFactory = null;
436cdf0e10cSrcweir 
437cdf0e10cSrcweir             aCallWatchThread.cancel();
438cdf0e10cSrcweir         }
439cdf0e10cSrcweir         catch ( java.lang.InterruptedException aExc )
440cdf0e10cSrcweir         { /* can be ignored */ }
441cdf0e10cSrcweir     }
442cdf0e10cSrcweir 
443cdf0e10cSrcweir     // @requirement FUNC.PAR.LWP/0.4
444cdf0e10cSrcweir     /** This method causes the office window to be displayed.
445cdf0e10cSrcweir 
446cdf0e10cSrcweir         If no document is loaded and the instance is added to a Java container that
447cdf0e10cSrcweir         is showing, then this method needs not to be called. If later one of the methods
448cdf0e10cSrcweir         {@link #loadFromURL loadFromURL}, {@link #loadFromStream loadFromStream1},
449cdf0e10cSrcweir         or {@link #loadFromByteArray loadFromByteArray}
450cdf0e10cSrcweir         is called, then the document is automatically displayed.
451cdf0e10cSrcweir 
452cdf0e10cSrcweir         Should one of the load methods have been called before the Java container
453cdf0e10cSrcweir         was showing, then this method needs to be called after the container window
454cdf0e10cSrcweir         was made visible (java.lang.Component.setVisible(true)).
455cdf0e10cSrcweir         <p>
456cdf0e10cSrcweir         Another scenario is that a OOoBean contains a document and is removed
457cdf0e10cSrcweir         from a Java container and later added again. Then aquireSystemWindow needs
458cdf0e10cSrcweir         to be called after the container window is displayed.
459cdf0e10cSrcweir 
460cdf0e10cSrcweir         @throws SystemWindowException
461cdf0e10cSrcweir             if no system window can be aquired.
462cdf0e10cSrcweir 
463cdf0e10cSrcweir         @throws NoConnectionException
464cdf0e10cSrcweir             if the connection is not established.
465cdf0e10cSrcweir      */
aquireSystemWindow()466cdf0e10cSrcweir     public synchronized void aquireSystemWindow()
467cdf0e10cSrcweir         throws
468cdf0e10cSrcweir             SystemWindowException,
469cdf0e10cSrcweir 
470cdf0e10cSrcweir             // @requirement FUNC.CON.LOST/0.2
471cdf0e10cSrcweir             NoConnectionException
472cdf0e10cSrcweir     {
473cdf0e10cSrcweir         if ( iConnection == null )
474cdf0e10cSrcweir             throw new NoConnectionException();
475cdf0e10cSrcweir         if ( !isShowing() )
476cdf0e10cSrcweir             throw new SystemWindowException();
477cdf0e10cSrcweir 
478cdf0e10cSrcweir         if ( xFrameWindow != null )
479cdf0e10cSrcweir             xFrameWindow.getAWTComponent().setVisible(true);
480cdf0e10cSrcweir         doLayout();
481cdf0e10cSrcweir     }
482cdf0e10cSrcweir 
483cdf0e10cSrcweir     // @requirement FUNC.PAR.RWL/0.4
484cdf0e10cSrcweir     // @estimation 16h
485cdf0e10cSrcweir     /** This method must be called when the OOoBean before the
486cdf0e10cSrcweir         sytem window may be released by it's parent AWT/Swing component.
487cdf0e10cSrcweir 
488cdf0e10cSrcweir         This is the case when java.awt.Component.isDisplayable() returns
489cdf0e10cSrcweir         true.  This is definitely the case when the OOoBean is removed
490cdf0e10cSrcweir         from it's parent container.
491cdf0e10cSrcweir 
492cdf0e10cSrcweir         @throws SystemWindowException
493cdf0e10cSrcweir             if system window is not aquired.
494cdf0e10cSrcweir 
495cdf0e10cSrcweir         @throws NoConnectionException
496cdf0e10cSrcweir             if the connection is not established.
497cdf0e10cSrcweir 
498cdf0e10cSrcweir         @deprecated When Component.removeNotify of the parent window of the actual
499cdf0e10cSrcweir         office window is called, then the actions are performed for which this method
500cdf0e10cSrcweir         needed to be called previously.
501cdf0e10cSrcweir      */
releaseSystemWindow()502cdf0e10cSrcweir     public synchronized void releaseSystemWindow()
503cdf0e10cSrcweir         throws
504cdf0e10cSrcweir             SystemWindowException,
505cdf0e10cSrcweir 
506cdf0e10cSrcweir             // @requirement FUNC.CON.LOST/0.2
507cdf0e10cSrcweir             NoConnectionException
508cdf0e10cSrcweir     {
509cdf0e10cSrcweir         if ( iConnection == null )
510cdf0e10cSrcweir             throw new NoConnectionException();
511cdf0e10cSrcweir 
512cdf0e10cSrcweir         try { xFrameWindow.getAWTComponent().setVisible(false); }
513cdf0e10cSrcweir         catch ( com.sun.star.lang.DisposedException aExc )
514cdf0e10cSrcweir         { throw new NoConnectionException(); }
515cdf0e10cSrcweir     }
516cdf0e10cSrcweir 
517cdf0e10cSrcweir     // @requirement FUNC.BEAN.LOAD/0.4
518cdf0e10cSrcweir     // @requirement FUNC.CON.AUTO/0.3
519cdf0e10cSrcweir     /** Loads the bean from the given URL.
520cdf0e10cSrcweir 
521cdf0e10cSrcweir         If a document is already loaded and the content modified,
522cdf0e10cSrcweir         the changes are dismissed.
523cdf0e10cSrcweir 
524cdf0e10cSrcweir         If no connection exists, a default connection is established.
525cdf0e10cSrcweir 
526cdf0e10cSrcweir         @throws IllegalArgumentException
527cdf0e10cSrcweir             if either of the arguments is out of the specified range.
528cdf0e10cSrcweir 
529cdf0e10cSrcweir         @throws java.io.IOException
530cdf0e10cSrcweir             if an IO error occurs reading the ressource specified by the URL.
531cdf0e10cSrcweir 
532cdf0e10cSrcweir         @throws com.sun.star.lang.NoConnectionException
533cdf0e10cSrcweir             if no connection can be established.
534cdf0e10cSrcweir 
535cdf0e10cSrcweir         @throws com.sun.star.util.CloseVetoException
536cdf0e10cSrcweir             if the currently displayed document cannot be closed because it is
537cdf0e10cSrcweir             still be used, for example it is printed.
538cdf0e10cSrcweir      */
loadFromURL( final String aURL, final com.sun.star.beans.PropertyValue aArguments[] )539cdf0e10cSrcweir     public void loadFromURL(
540cdf0e10cSrcweir             final String aURL,
541cdf0e10cSrcweir             final com.sun.star.beans.PropertyValue aArguments[] )
542cdf0e10cSrcweir         throws
543cdf0e10cSrcweir             // @requirement FUNC.CON.LOST/0.2
544cdf0e10cSrcweir             NoConnectionException,
545cdf0e10cSrcweir             java.io.IOException,
546cdf0e10cSrcweir             com.sun.star.lang.IllegalArgumentException,
547cdf0e10cSrcweir             com.sun.star.util.CloseVetoException
548cdf0e10cSrcweir     {
549cdf0e10cSrcweir         dbgPrint( "loadFromURL()" );
550cdf0e10cSrcweir         // try loading
551cdf0e10cSrcweir         try
552cdf0e10cSrcweir         {
553cdf0e10cSrcweir             boolean bLoaded = false;
554cdf0e10cSrcweir             while ( !bLoaded )
555cdf0e10cSrcweir             {
556cdf0e10cSrcweir                 // watch loading in a thread with a timeout (if OOo hangs)
557cdf0e10cSrcweir                 CallWatchThread aCallWatchThread =
558cdf0e10cSrcweir                     new CallWatchThread( nOOoStartTimeOut, "loadFromURL" );
559cdf0e10cSrcweir 
560cdf0e10cSrcweir                 try
561cdf0e10cSrcweir                 {
562cdf0e10cSrcweir                     // get window from OOo on demand
563cdf0e10cSrcweir                     if ( xFrameWindow == null )
564cdf0e10cSrcweir                     {
565cdf0e10cSrcweir                         // Establish the connection by request of the ServiceFactory.
566cdf0e10cSrcweir                         getMultiServiceFactory();
567cdf0e10cSrcweir 
568cdf0e10cSrcweir                         // remove existing child windows
569cdf0e10cSrcweir                         removeAll();
570cdf0e10cSrcweir 
571cdf0e10cSrcweir                         // Create the OfficeWindow.
572cdf0e10cSrcweir                         xFrameWindow = getOOoConnection().createOfficeWindow(OOoBean.this);
573cdf0e10cSrcweir                         add( xFrameWindow.getAWTComponent() );
574cdf0e10cSrcweir                     }
575cdf0e10cSrcweir 
576cdf0e10cSrcweir                     // create the document frame from UNO window.
577cdf0e10cSrcweir                     if ( aFrame == null )
578cdf0e10cSrcweir                     {
579cdf0e10cSrcweir                         // create the frame
580cdf0e10cSrcweir                         com.sun.star.awt.XWindow xWindow =
581cdf0e10cSrcweir                             (com.sun.star.awt.XWindow) UnoRuntime.queryInterface(
582cdf0e10cSrcweir                             com.sun.star.awt.XWindow.class, xFrameWindow.getUNOWindowPeer());
583cdf0e10cSrcweir                         Object xFrame = xServiceFactory.createInstance( "com.sun.star.frame.Frame");
584cdf0e10cSrcweir                         aFrame = new Frame( (com.sun.star.frame.XFrame)UnoRuntime.queryInterface(
585cdf0e10cSrcweir                                 com.sun.star.frame.XFrame.class, xFrame ) );
586cdf0e10cSrcweir                         aFrame.initialize( xWindow );
587cdf0e10cSrcweir                         aFrame.setName( aFrame.toString() );
588cdf0e10cSrcweir 
589cdf0e10cSrcweir                         // register the frame at the desktop
590cdf0e10cSrcweir                         com.sun.star.frame.XFrames xFrames =
591cdf0e10cSrcweir                                 ( (com.sun.star.frame.XFramesSupplier)UnoRuntime.queryInterface(
592cdf0e10cSrcweir                                 com.sun.star.frame.XFramesSupplier.class, getOOoDesktop() ) ).getFrames();
593cdf0e10cSrcweir                         xFrames.append( aFrame );
594cdf0e10cSrcweir                     }
595cdf0e10cSrcweir 
596cdf0e10cSrcweir                     // Initializes the slot command execution environment.
597cdf0e10cSrcweir                     xURLTransformer = (com.sun.star.util.XURLTransformer) UnoRuntime.queryInterface(
598cdf0e10cSrcweir                         com.sun.star.util.XURLTransformer.class,
599cdf0e10cSrcweir                         xServiceFactory.createInstance( "com.sun.star.util.URLTransformer") );
600cdf0e10cSrcweir 
601cdf0e10cSrcweir                                         try
602cdf0e10cSrcweir                                         {
603cdf0e10cSrcweir                                             xDispatcher = UnoRuntime.queryInterface(com.sun.star.frame.XDispatchProvider.class, aFrame);
604cdf0e10cSrcweir                                         }
605cdf0e10cSrcweir                                         catch (Exception e)
606cdf0e10cSrcweir                                         {
607cdf0e10cSrcweir                                             /*ignore!*/
608cdf0e10cSrcweir                                         }
609cdf0e10cSrcweir 
610cdf0e10cSrcweir                     // get XComponentLoader from frame
611cdf0e10cSrcweir                     com.sun.star.frame.XComponentLoader xLoader = (com.sun.star.frame.XComponentLoader)
612cdf0e10cSrcweir                         UnoRuntime.queryInterface( com.sun.star.frame.XComponentLoader.class, aFrame );
613cdf0e10cSrcweir                     if ( xLoader == null )
614cdf0e10cSrcweir                     {
615cdf0e10cSrcweir                         throw new java.lang.RuntimeException(
616cdf0e10cSrcweir                             "com.sun.star.frame.Frame(" + aFrame +
617cdf0e10cSrcweir                                 ") without com.sun.star.frame.XComponentLoader" );
618cdf0e10cSrcweir                     }
619cdf0e10cSrcweir 
620cdf0e10cSrcweir                     // Avoid Dialog 'Document changed' while reloading
621cdf0e10cSrcweir                     if ( aDocument != null )
622cdf0e10cSrcweir                     {
623cdf0e10cSrcweir                         try {
624cdf0e10cSrcweir                             aDocument.setModified(false);
625cdf0e10cSrcweir                         } catch (com.sun.star.beans.PropertyVetoException ep) {
626cdf0e10cSrcweir                             //it dosn't make sense to throw the exception here. The interface does not
627cdf0e10cSrcweir                             //offer a way to add/remove respective listeners.
628cdf0e10cSrcweir                         } catch (com.sun.star.lang.DisposedException ed) {
629cdf0e10cSrcweir                             // can be disposed if user closed document via UI
630cdf0e10cSrcweir                         }
631cdf0e10cSrcweir 
632cdf0e10cSrcweir                         com.sun.star.frame.XController xOldController = null;
633cdf0e10cSrcweir                         if ( aFrame != null )
634cdf0e10cSrcweir                             xOldController = aFrame.getController();
635cdf0e10cSrcweir 
636cdf0e10cSrcweir                         try
637cdf0e10cSrcweir                         {
638cdf0e10cSrcweir 
639cdf0e10cSrcweir                             if ( aFrame != null && xOldController != null )
640cdf0e10cSrcweir                                 if (xOldController.suspend(true) == false)
641cdf0e10cSrcweir                                     throw new com.sun.star.util.CloseVetoException(
642cdf0e10cSrcweir                                             "Dokument is still being used and cannot be closed.", this);
643cdf0e10cSrcweir 
644cdf0e10cSrcweir                         }
645cdf0e10cSrcweir                         catch (java.lang.IllegalStateException exp)
646cdf0e10cSrcweir                         {}
647cdf0e10cSrcweir                     }
648cdf0e10cSrcweir 
649cdf0e10cSrcweir                     // load the document.
650cdf0e10cSrcweir                     com.sun.star.beans.PropertyValue aArgs[] =
651cdf0e10cSrcweir                         addArgument( aArguments, new com.sun.star.beans.PropertyValue(
652cdf0e10cSrcweir                             "MacroExecutionMode", -1,
653cdf0e10cSrcweir                             new Short( com.sun.star.document.MacroExecMode.USE_CONFIG ),
654cdf0e10cSrcweir                             com.sun.star.beans.PropertyState.DIRECT_VALUE ) );
655cdf0e10cSrcweir                                     //String fn = aFRame.getName();
656cdf0e10cSrcweir 
657cdf0e10cSrcweir                     com.sun.star.lang.XComponent xComponent = xLoader.loadComponentFromURL(
658cdf0e10cSrcweir                         aURL, /*aFrame.getName()*/"_self", 0, aArgs );
659cdf0e10cSrcweir 
660cdf0e10cSrcweir                     // nothing loaded?
661cdf0e10cSrcweir                     if ( xComponent == null && aDocument != null )
662cdf0e10cSrcweir                     {
663cdf0e10cSrcweir                         // reactivate old document
664cdf0e10cSrcweir                         if ( aFrame != null && aFrame.getController() != null )
665cdf0e10cSrcweir                             aFrame.getController().suspend(false);
666cdf0e10cSrcweir                         aDocument.setModified(true);
667cdf0e10cSrcweir 
668cdf0e10cSrcweir                         // throw exception
669cdf0e10cSrcweir                         throw new java.io.IOException(
670cdf0e10cSrcweir                             "Can not load a document: \"" + aURL + "\"");
671cdf0e10cSrcweir                     }
672cdf0e10cSrcweir                     // mDocumentURL = aURL; TBD: still needed?
673cdf0e10cSrcweir 
674cdf0e10cSrcweir                     // Get document's XModifiable interface if any.
675cdf0e10cSrcweir                     aDocument = new OfficeDocument(
676cdf0e10cSrcweir                         (com.sun.star.frame.XModel) UnoRuntime.queryInterface(
677cdf0e10cSrcweir                         com.sun.star.frame.XModel.class, xComponent ) );
678cdf0e10cSrcweir                     bLoaded = true;
679cdf0e10cSrcweir                 }
680cdf0e10cSrcweir                 catch ( NoConnectionException aExc )
681cdf0e10cSrcweir                 {
682cdf0e10cSrcweir                     // stop, clear and retry
683cdf0e10cSrcweir                     stopOOoConnection();
684cdf0e10cSrcweir                 }
685cdf0e10cSrcweir                 catch ( com.sun.star.lang.DisposedException aExc )
686cdf0e10cSrcweir                 {
687cdf0e10cSrcweir                     // stop, clear and retry
688cdf0e10cSrcweir                     stopOOoConnection();
689cdf0e10cSrcweir                 }
690cdf0e10cSrcweir                 catch ( com.sun.star.uno.Exception aExc )
691cdf0e10cSrcweir                 {
692cdf0e10cSrcweir                     // TDB: handling failure in createInstance
693cdf0e10cSrcweir                     aExc.printStackTrace();
694cdf0e10cSrcweir                     throw new java.io.IOException();
695cdf0e10cSrcweir                 }
696cdf0e10cSrcweir 
697cdf0e10cSrcweir                 aCallWatchThread.cancel();
698cdf0e10cSrcweir                 if ( xServiceFactory == null )
699cdf0e10cSrcweir                     throw new NoConnectionException();
700cdf0e10cSrcweir             }
701cdf0e10cSrcweir             if ( iConnection == null )
702cdf0e10cSrcweir             {
703cdf0e10cSrcweir                 throw new NoConnectionException();
704cdf0e10cSrcweir             }
705cdf0e10cSrcweir 
706cdf0e10cSrcweir             applyToolVisibilities();
707cdf0e10cSrcweir         }
708cdf0e10cSrcweir         catch ( java.lang.InterruptedException aExc )
709cdf0e10cSrcweir         {
710cdf0e10cSrcweir             throw new NoConnectionException();
711cdf0e10cSrcweir         }
712cdf0e10cSrcweir     }
713cdf0e10cSrcweir 
714cdf0e10cSrcweir     /** Loads a document from a Java stream.
715cdf0e10cSrcweir 
716cdf0e10cSrcweir         See loadFromURL() for further information.
717cdf0e10cSrcweir      */
loadFromStream( final java.io.InputStream iInStream, final com.sun.star.beans.PropertyValue aArguments[] )718cdf0e10cSrcweir     public void loadFromStream(
719cdf0e10cSrcweir             final java.io.InputStream iInStream,
720cdf0e10cSrcweir             final com.sun.star.beans.PropertyValue aArguments[] )
721cdf0e10cSrcweir         throws
722cdf0e10cSrcweir             // @requirement FUNC.CON.LOST/0.2
723cdf0e10cSrcweir             NoConnectionException,
724cdf0e10cSrcweir             java.io.IOException,
725cdf0e10cSrcweir             com.sun.star.lang.IllegalArgumentException,
726cdf0e10cSrcweir             com.sun.star.util.CloseVetoException
727cdf0e10cSrcweir     {
728cdf0e10cSrcweir         // wrap Java stream into UNO stream
729cdf0e10cSrcweir                 /*
730cdf0e10cSrcweir         com.sun.star.io.XInputStream xStream =
731cdf0e10cSrcweir                 new com.sun.star.lib.uno.adapter.InputStreamToXInputStreamAdapter(
732cdf0e10cSrcweir                     iInStream );
733cdf0e10cSrcweir                  */
734cdf0e10cSrcweir                  // copy stream....
735cdf0e10cSrcweir 
736cdf0e10cSrcweir                  int s = 4096;
737cdf0e10cSrcweir                  int r=0 ,n = 0;
738cdf0e10cSrcweir                  byte[] buffer = new byte[s];
739cdf0e10cSrcweir                  byte[] newBuffer = null;
740cdf0e10cSrcweir                  while ((r = iInStream.read(buffer, n, buffer.length-n))>0) {
741cdf0e10cSrcweir                      n += r;
742cdf0e10cSrcweir                      if (iInStream.available() > buffer.length - n) {
743cdf0e10cSrcweir                          newBuffer = new byte[buffer.length*2];
744cdf0e10cSrcweir                          System.arraycopy(buffer, 0, newBuffer, 0, n);
745cdf0e10cSrcweir                          buffer = newBuffer;
746cdf0e10cSrcweir                      }
747cdf0e10cSrcweir                 }
748cdf0e10cSrcweir                 if (buffer.length != n) {
749cdf0e10cSrcweir                     newBuffer = new byte[n];
750cdf0e10cSrcweir                     System.arraycopy(buffer, 0, newBuffer, 0, n);
751cdf0e10cSrcweir                     buffer = newBuffer;
752cdf0e10cSrcweir                 }
753cdf0e10cSrcweir                 com.sun.star.io.XInputStream xStream =
754cdf0e10cSrcweir                     new com.sun.star.lib.uno.adapter.ByteArrayToXInputStreamAdapter(buffer);
755cdf0e10cSrcweir 
756cdf0e10cSrcweir         // add stream to arguments
757cdf0e10cSrcweir         com.sun.star.beans.PropertyValue[] aExtendedArguments =
758cdf0e10cSrcweir             addArgument( aArguments, new com.sun.star.beans.PropertyValue(
759cdf0e10cSrcweir                 "InputStream", -1, xStream, com.sun.star.beans.PropertyState.DIRECT_VALUE ) );
760cdf0e10cSrcweir 
761cdf0e10cSrcweir         // call normal load method
762cdf0e10cSrcweir         loadFromURL( "private:stream", aExtendedArguments );
763cdf0e10cSrcweir     }
764cdf0e10cSrcweir 
765cdf0e10cSrcweir     /** Loads a document from a byte array.
766cdf0e10cSrcweir 
767cdf0e10cSrcweir         See loadFromURL() for further information.
768cdf0e10cSrcweir      */
loadFromByteArray( final byte aInBuffer[], final com.sun.star.beans.PropertyValue aArguments[] )769cdf0e10cSrcweir     public void loadFromByteArray(
770cdf0e10cSrcweir             final byte aInBuffer[],
771cdf0e10cSrcweir             final com.sun.star.beans.PropertyValue aArguments[] )
772cdf0e10cSrcweir         throws
773cdf0e10cSrcweir             // @requirement FUNC.CON.LOST/0.2
774cdf0e10cSrcweir             NoConnectionException,
775cdf0e10cSrcweir             java.io.IOException,
776cdf0e10cSrcweir             com.sun.star.lang.IllegalArgumentException,
777cdf0e10cSrcweir             com.sun.star.util.CloseVetoException
778cdf0e10cSrcweir     {
779cdf0e10cSrcweir         // wrap byte arrray into UNO stream
780cdf0e10cSrcweir         com.sun.star.io.XInputStream xStream =
781cdf0e10cSrcweir                 new com.sun.star.lib.uno.adapter.ByteArrayToXInputStreamAdapter(
782cdf0e10cSrcweir                     aInBuffer );
783cdf0e10cSrcweir 
784cdf0e10cSrcweir         // add stream to arguments
785cdf0e10cSrcweir         com.sun.star.beans.PropertyValue[] aExtendedArguments =
786cdf0e10cSrcweir             addArgument( aArguments, new com.sun.star.beans.PropertyValue(
787cdf0e10cSrcweir                 "InputStream", -1, xStream, com.sun.star.beans.PropertyState.DIRECT_VALUE ) );
788cdf0e10cSrcweir 
789cdf0e10cSrcweir         // call normal load method
790cdf0e10cSrcweir         loadFromURL( "private:stream", aExtendedArguments );
791cdf0e10cSrcweir     }
792cdf0e10cSrcweir 
793cdf0e10cSrcweir     /** Stores a document to the given URL.
794cdf0e10cSrcweir         <p>
795cdf0e10cSrcweir         Due due a bug (50651) calling this method may cause the office to crash,
796cdf0e10cSrcweir         when at the same time the office writes a backup of the document. This bug
797cdf0e10cSrcweir         also affects {@link #storeToByteArray storeToByteArray} and
798cdf0e10cSrcweir         {@link #storeToStream storeToStream}. The workaround
799cdf0e10cSrcweir         is to start the office with the option -norestore, which disables the automatic
800cdf0e10cSrcweir         backup and recovery mechanism. OOoBean offers currently no supported way of providing
801cdf0e10cSrcweir         startup options for OOo. But it is possible to set a Java property when starting
802cdf0e10cSrcweir         Java, which is examined by OOoBean:
803cdf0e10cSrcweir         <pre>
804cdf0e10cSrcweir             java -Dcom.sun.star.officebean.Options=-norestore  ...
805cdf0e10cSrcweir         </pre>
806cdf0e10cSrcweir         It is planned to offer a way of specifying startup options in a future version.
807cdf0e10cSrcweir         The property can be used until then. When using this property only one option
808cdf0e10cSrcweir         can be provided.
809cdf0e10cSrcweir 
810cdf0e10cSrcweir         @throws IllegalArgumentException
811cdf0e10cSrcweir             if either of the arguments is out of the specified range.
812cdf0e10cSrcweir 
813cdf0e10cSrcweir         @throws java.io.IOException
814cdf0e10cSrcweir             if an IO error occurs reading the ressource specified by the URL.
815cdf0e10cSrcweir 
816cdf0e10cSrcweir         @throws com.sun.star.lang.NoConnectionException
817cdf0e10cSrcweir             if no connection is established.
818cdf0e10cSrcweir 
819cdf0e10cSrcweir         @throws NoDocumentException
820cdf0e10cSrcweir             if no document is loaded
821cdf0e10cSrcweir      */
storeToURL( final String aURL, final com.sun.star.beans.PropertyValue aArguments[] )822cdf0e10cSrcweir     public void storeToURL(
823cdf0e10cSrcweir             final String aURL,
824cdf0e10cSrcweir             final com.sun.star.beans.PropertyValue aArguments[] )
825cdf0e10cSrcweir         throws
826cdf0e10cSrcweir             // @requirement FUNC.CON.LOST/0.2
827cdf0e10cSrcweir             NoConnectionException,
828cdf0e10cSrcweir             java.io.IOException,
829cdf0e10cSrcweir             com.sun.star.lang.IllegalArgumentException,
830cdf0e10cSrcweir             NoDocumentException
831cdf0e10cSrcweir     {
832cdf0e10cSrcweir         // no document available?
833cdf0e10cSrcweir         if ( aDocument == null )
834cdf0e10cSrcweir             throw new NoDocumentException();
835cdf0e10cSrcweir 
836cdf0e10cSrcweir         try
837cdf0e10cSrcweir         {
838cdf0e10cSrcweir             // start runtime timeout
839cdf0e10cSrcweir             CallWatchThread aCallWatchThread =
840cdf0e10cSrcweir                 new CallWatchThread( nOOoCallTimeOut, "storeToURL" );
841cdf0e10cSrcweir 
842cdf0e10cSrcweir             // store the document
843cdf0e10cSrcweir             try { aDocument.storeToURL( aURL, aArguments ); }
844cdf0e10cSrcweir             catch ( com.sun.star.io.IOException aExc )
845cdf0e10cSrcweir             { throw new java.io.IOException(); }
846cdf0e10cSrcweir 
847cdf0e10cSrcweir             // end runtime timeout
848cdf0e10cSrcweir             aCallWatchThread.cancel();
849cdf0e10cSrcweir         }
850cdf0e10cSrcweir         catch ( java.lang.InterruptedException aExc )
851cdf0e10cSrcweir         { throw new NoConnectionException(); }
852cdf0e10cSrcweir     }
853cdf0e10cSrcweir 
854cdf0e10cSrcweir     /** Stores a document to a stream.
855cdf0e10cSrcweir 
856cdf0e10cSrcweir         See {@link #storeToURL storeToURL} for further information.
857cdf0e10cSrcweir         @see #storeToURL storeToURL
858cdf0e10cSrcweir      */
storeToStream( java.io.OutputStream aOutStream, final com.sun.star.beans.PropertyValue aArguments[] )859cdf0e10cSrcweir     public java.io.OutputStream storeToStream(
860cdf0e10cSrcweir             java.io.OutputStream aOutStream,
861cdf0e10cSrcweir             final com.sun.star.beans.PropertyValue aArguments[] )
862cdf0e10cSrcweir         throws
863cdf0e10cSrcweir             // @requirement FUNC.CON.LOST/0.2
864cdf0e10cSrcweir             NoConnectionException,
865cdf0e10cSrcweir             NoDocumentException,
866cdf0e10cSrcweir             java.io.IOException,
867cdf0e10cSrcweir             com.sun.star.lang.IllegalArgumentException
868cdf0e10cSrcweir 
869cdf0e10cSrcweir     {
870cdf0e10cSrcweir         // wrap Java stream into UNO stream
871cdf0e10cSrcweir         com.sun.star.lib.uno.adapter.OutputStreamToXOutputStreamAdapter aStream =
872cdf0e10cSrcweir                 new com.sun.star.lib.uno.adapter.OutputStreamToXOutputStreamAdapter(
873cdf0e10cSrcweir                     aOutStream );
874cdf0e10cSrcweir 
875cdf0e10cSrcweir         // add stream to arguments
876cdf0e10cSrcweir         com.sun.star.beans.PropertyValue[] aExtendedArguments =
877cdf0e10cSrcweir             addArgument( aArguments, new com.sun.star.beans.PropertyValue(
878cdf0e10cSrcweir                 "OutputStream", -1, aStream, com.sun.star.beans.PropertyState.DIRECT_VALUE ) );
879cdf0e10cSrcweir 
880cdf0e10cSrcweir         // call normal store method
881cdf0e10cSrcweir         storeToURL( "private:stream", aExtendedArguments );
882cdf0e10cSrcweir 
883cdf0e10cSrcweir         // get byte array from document stream
884cdf0e10cSrcweir         try { aStream.closeOutput(); }
885cdf0e10cSrcweir         catch ( com.sun.star.io.NotConnectedException aExc )
886cdf0e10cSrcweir         { /* TDB */ }
887cdf0e10cSrcweir         catch ( com.sun.star.io.BufferSizeExceededException aExc )
888cdf0e10cSrcweir         { /* TDB */ }
889cdf0e10cSrcweir         catch ( com.sun.star.io.IOException aExc )
890cdf0e10cSrcweir         { throw new java.io.IOException(); }
891cdf0e10cSrcweir         return aOutStream;
892cdf0e10cSrcweir     }
893cdf0e10cSrcweir 
894cdf0e10cSrcweir     /** Stores a document to a byte array.
895cdf0e10cSrcweir 
896cdf0e10cSrcweir         See {@link #storeToURL storeToURL} for further information.
897cdf0e10cSrcweir         @see #storeToURL storeToURL
898cdf0e10cSrcweir      */
storeToByteArray( byte aOutBuffer[], final com.sun.star.beans.PropertyValue aArguments[] )899cdf0e10cSrcweir     public byte[] storeToByteArray(
900cdf0e10cSrcweir             byte aOutBuffer[],
901cdf0e10cSrcweir             final com.sun.star.beans.PropertyValue aArguments[] )
902cdf0e10cSrcweir         throws
903cdf0e10cSrcweir             // @requirement FUNC.CON.LOST/0.2
904cdf0e10cSrcweir             NoConnectionException,
905cdf0e10cSrcweir             NoDocumentException,
906cdf0e10cSrcweir             java.io.IOException,
907cdf0e10cSrcweir             com.sun.star.lang.IllegalArgumentException
908cdf0e10cSrcweir     {
909cdf0e10cSrcweir         // wrap byte arrray into UNO stream
910cdf0e10cSrcweir         com.sun.star.lib.uno.adapter.XOutputStreamToByteArrayAdapter aStream =
911cdf0e10cSrcweir                 new com.sun.star.lib.uno.adapter.XOutputStreamToByteArrayAdapter(
912cdf0e10cSrcweir                     aOutBuffer );
913cdf0e10cSrcweir 
914cdf0e10cSrcweir         // add stream to arguments
915cdf0e10cSrcweir         com.sun.star.beans.PropertyValue[] aExtendedArguments =
916cdf0e10cSrcweir             addArgument( aArguments, new com.sun.star.beans.PropertyValue(
917cdf0e10cSrcweir                 "OutputStream", -1, aStream, com.sun.star.beans.PropertyState.DIRECT_VALUE ) );
918cdf0e10cSrcweir 
919cdf0e10cSrcweir         // call normal store method
920cdf0e10cSrcweir         storeToURL( "private:stream", aExtendedArguments );
921cdf0e10cSrcweir 
922cdf0e10cSrcweir         // get byte array from document stream
923cdf0e10cSrcweir         try { aStream.closeOutput(); }
924cdf0e10cSrcweir         catch ( com.sun.star.io.NotConnectedException aExc )
925cdf0e10cSrcweir         { /* TDB */ }
926cdf0e10cSrcweir         catch ( com.sun.star.io.BufferSizeExceededException aExc )
927cdf0e10cSrcweir         { /* TDB */ }
928cdf0e10cSrcweir         catch ( com.sun.star.io.IOException aExc )
929cdf0e10cSrcweir         { throw new java.io.IOException(); }
930cdf0e10cSrcweir         return aStream.getBuffer();
931cdf0e10cSrcweir     }
932cdf0e10cSrcweir 
933cdf0e10cSrcweir     // @requirement FUNC.BEAN.PROG/0.5
934cdf0e10cSrcweir     // @requirement API.SIM.SEAP/0.2
935cdf0e10cSrcweir     /** returns the <type scope="com::sun::star::frame">Frame</a>
936cdf0e10cSrcweir         of the bean.
937cdf0e10cSrcweir 
938cdf0e10cSrcweir         @returns
939cdf0e10cSrcweir             a Java class which implements all interfaces which the service
940cdf0e10cSrcweir         <type scope="com::sun::star::frame">Frame</a> implements.
941cdf0e10cSrcweir         Thus, methods can be called directly without queryInterface.
942cdf0e10cSrcweir         This feature might be implemented by UNO or explicitely coded.
943cdf0e10cSrcweir 
944cdf0e10cSrcweir         @throws NoConnectionException
945cdf0e10cSrcweir             if the connection is not established.
946cdf0e10cSrcweir 
947cdf0e10cSrcweir         @throws NotDocumentException
948cdf0e10cSrcweir             if no document is loaded an thus no frame is available.
949cdf0e10cSrcweir      */
getFrame()950cdf0e10cSrcweir     public Frame getFrame()
951cdf0e10cSrcweir 
952cdf0e10cSrcweir         throws
953cdf0e10cSrcweir             NoConnectionException // @requirement FUNC.CON.LOST/0.2
954cdf0e10cSrcweir     {
955cdf0e10cSrcweir         if ( iConnection == null )
956cdf0e10cSrcweir             throw new NoConnectionException();
957cdf0e10cSrcweir         return aFrame;
958cdf0e10cSrcweir     }
959cdf0e10cSrcweir 
960cdf0e10cSrcweir     // @requirement FUNC.BEAN.PROG/0.5
961cdf0e10cSrcweir     // @requirement API.SIM.SEAP/0.2
962cdf0e10cSrcweir     /** returns the <type scope="com::sun::star::frame::Controller"> of the bean.
963cdf0e10cSrcweir 
964cdf0e10cSrcweir         @returns
965cdf0e10cSrcweir             a Java class which implements all interfaces which the service
966cdf0e10cSrcweir         <type scope="com::sun::star::frame">Controller</a> implements.
967cdf0e10cSrcweir         Thus, methods can be called directly without queryInterface.
968cdf0e10cSrcweir         This feature might be implemented by UNO or explicitely coded.
969cdf0e10cSrcweir 
970cdf0e10cSrcweir         @throws NoConnectionException
971cdf0e10cSrcweir             if the connection is not established.
972cdf0e10cSrcweir      */
getController()973cdf0e10cSrcweir     public Controller getController()
974cdf0e10cSrcweir 
975cdf0e10cSrcweir         // @requirement FUNC.CON.LOST/0.2
976cdf0e10cSrcweir         throws NoConnectionException
977cdf0e10cSrcweir     {
978cdf0e10cSrcweir         if ( iConnection == null )
979cdf0e10cSrcweir             throw new NoConnectionException();
980cdf0e10cSrcweir         if ( aController == null )
981cdf0e10cSrcweir             aController = new Controller( aFrame.getController() );
982cdf0e10cSrcweir         return aController;
983cdf0e10cSrcweir     }
984cdf0e10cSrcweir 
985cdf0e10cSrcweir     // @requirement FUNC.BEAN.PROG/0.5
986cdf0e10cSrcweir     // @requirement FUNC.BEAN.STOR/0.4
987cdf0e10cSrcweir     // @requirement FUNC.BEAN.PRNT/0.4
988cdf0e10cSrcweir     // @requirement API.SIM.SEAP/0.2
989cdf0e10cSrcweir     /** returns the <type scope="com::sun::star::document::OfficeDocument">
990cdf0e10cSrcweir         of the bean.
991cdf0e10cSrcweir 
992cdf0e10cSrcweir         @returns
993cdf0e10cSrcweir             a Java class which implements all interfaces which the service
994cdf0e10cSrcweir         <type scope="com::sun::star::document">OfficeDocument</a>
995cdf0e10cSrcweir         implements.
996cdf0e10cSrcweir         Thus, methods can be called directly without queryInterface.
997cdf0e10cSrcweir         This feature might be implemented by UNO or explicitely coded.
998cdf0e10cSrcweir 
999cdf0e10cSrcweir         @throws NoConnectionException
1000cdf0e10cSrcweir             if the connection is not established.
1001cdf0e10cSrcweir      */
getDocument()1002cdf0e10cSrcweir     public OfficeDocument getDocument()
1003cdf0e10cSrcweir 
1004cdf0e10cSrcweir         // @requirement FUNC.CON.LOST/0.2
1005cdf0e10cSrcweir         throws NoConnectionException
1006cdf0e10cSrcweir     {
1007cdf0e10cSrcweir         if ( iConnection == null )
1008cdf0e10cSrcweir             throw new NoConnectionException();
1009cdf0e10cSrcweir         return aDocument;
1010cdf0e10cSrcweir     }
1011cdf0e10cSrcweir 
1012cdf0e10cSrcweir     /** Sets visibility of all tool bars known by this OOoBean version.
1013cdf0e10cSrcweir 
1014cdf0e10cSrcweir         Initially all tool bars are visible.  By hiding all tool bars
1015cdf0e10cSrcweir         utilizing this method, it is possible to turn just a subset of
1016cdf0e10cSrcweir         tool bars on afterwards, no matter whether all available tool
1017cdf0e10cSrcweir         bars are known or not.
1018cdf0e10cSrcweir         <p>
1019cdf0e10cSrcweir         If an older OOoBean instance is used with a newer OOo instance,
1020cdf0e10cSrcweir         some tool bars might not be affected by this method.
1021cdf0e10cSrcweir         <p>
1022cdf0e10cSrcweir         If no connection is established or no document is loaded,
1023cdf0e10cSrcweir         the setting is memorized until a document is loaded.  Same
1024cdf0e10cSrcweir         is valid when the connection dies within this function call.
1025cdf0e10cSrcweir 
1026cdf0e10cSrcweir         @deprecated Clients should use the service com.sun.star.frame.LayoutManager,
1027cdf0e10cSrcweir         which can be obtained from a frame, to control toolbars. For example:
1028cdf0e10cSrcweir         <pre>
1029cdf0e10cSrcweir com.sun.star.beans.XPropertySet xPropSet =
1030cdf0e10cSrcweir   (com.sun.star.beans.XPropertySet) UnoRuntime.queryInterface(
1031cdf0e10cSrcweir     com.sun.star.beans.XPropertySet.class, aFrame );
1032cdf0e10cSrcweir com.sun.star.frame.XLayoutManager xLayoutManager =
1033cdf0e10cSrcweir   (com.sun.star.frame.XLayoutManager) UnoRuntime.queryInterface(
1034cdf0e10cSrcweir     com.sun.star.frame.XLayoutManager.class,
1035cdf0e10cSrcweir     xPropSet.getPropertyValue( "LayoutManager" ) );
1036cdf0e10cSrcweir xLayoutManager.showElement("private:resource/menubar/menubar");
1037cdf0e10cSrcweir         </pre>
1038cdf0e10cSrcweir      */
setAllBarsVisible( boolean bVisible )1039cdf0e10cSrcweir     public void setAllBarsVisible( boolean bVisible )
1040cdf0e10cSrcweir     {
1041cdf0e10cSrcweir         bIgnoreVisibility = true;
1042cdf0e10cSrcweir         setMenuBarVisible( bVisible );
1043cdf0e10cSrcweir         setStandardBarVisible( bVisible );
1044cdf0e10cSrcweir         setToolBarVisible( bVisible );
1045cdf0e10cSrcweir         setStatusBarVisible( bVisible );
1046cdf0e10cSrcweir         bIgnoreVisibility = false;
1047cdf0e10cSrcweir     }
1048cdf0e10cSrcweir 
1049cdf0e10cSrcweir     //--------------------------------------------------------------------------
1050cdf0e10cSrcweir     /** Applies all tool visiblities to the real thing.
1051cdf0e10cSrcweir 
1052cdf0e10cSrcweir         @deprecated Clients should use the service com.sun.star.frame.LayoutManager,
1053cdf0e10cSrcweir         which can be obtained from a frame, to control toolbars. See also
1054cdf0e10cSrcweir         {@link #setAllBarsVisible setAllBarsVisible}.
1055cdf0e10cSrcweir      */
applyToolVisibilities()1056cdf0e10cSrcweir     protected void applyToolVisibilities()
1057cdf0e10cSrcweir         throws
1058cdf0e10cSrcweir             java.lang.InterruptedException
1059cdf0e10cSrcweir     {
1060cdf0e10cSrcweir         bIgnoreVisibility = true;
1061cdf0e10cSrcweir         setMenuBarVisible( bMenuBarVisible );
1062cdf0e10cSrcweir         setStandardBarVisible( bStandardBarVisible );
1063cdf0e10cSrcweir         setToolBarVisible( bToolBarVisible );
1064cdf0e10cSrcweir         setStatusBarVisible( bStatusBarVisible );
1065cdf0e10cSrcweir         bIgnoreVisibility = false;
1066cdf0e10cSrcweir     }
1067cdf0e10cSrcweir 
1068cdf0e10cSrcweir     /** Helper method to set tool bar visibilty.
1069cdf0e10cSrcweir 
1070cdf0e10cSrcweir         @param bnewValue
1071cdf0e10cSrcweir             If false, the tool bar is disabled,
1072cdf0e10cSrcweir             If true, the tool bar is visible.
1073cdf0e10cSrcweir 
1074cdf0e10cSrcweir         @deprecated Clients should use the service com.sun.star.frame.LayoutManager,
1075cdf0e10cSrcweir         which can be obtained from a frame, to control toolbars. See also
1076cdf0e10cSrcweir         {@link #setAllBarsVisible}.
1077cdf0e10cSrcweir      */
setToolVisible( String aProperty, String aResourceURL, boolean bOldValue, boolean bNewValue )1078cdf0e10cSrcweir     protected boolean setToolVisible( String aProperty, String aResourceURL,
1079cdf0e10cSrcweir         boolean bOldValue, boolean bNewValue )
1080cdf0e10cSrcweir 
1081cdf0e10cSrcweir         throws
1082cdf0e10cSrcweir             java.lang.InterruptedException
1083cdf0e10cSrcweir     {
1084cdf0e10cSrcweir         // start runtime timeout
1085cdf0e10cSrcweir         CallWatchThread aCallWatchThread =
1086cdf0e10cSrcweir             new CallWatchThread( nOOoCallTimeOut, "setToolVisible" );
1087cdf0e10cSrcweir 
1088cdf0e10cSrcweir         // Does a frame exist?
1089cdf0e10cSrcweir         if ( aFrame != null )
1090cdf0e10cSrcweir         {
1091cdf0e10cSrcweir             if ( bIgnoreVisibility || bOldValue != bNewValue )
1092cdf0e10cSrcweir             {
1093cdf0e10cSrcweir                 try
1094cdf0e10cSrcweir                 {
1095cdf0e10cSrcweir                     com.sun.star.beans.XPropertySet xPropSet =
1096cdf0e10cSrcweir                             (com.sun.star.beans.XPropertySet) UnoRuntime.queryInterface(
1097cdf0e10cSrcweir                             com.sun.star.beans.XPropertySet.class, aFrame );
1098cdf0e10cSrcweir                     com.sun.star.frame.XLayoutManager xLayoutManager =
1099cdf0e10cSrcweir                             (com.sun.star.frame.XLayoutManager) UnoRuntime.queryInterface(
1100cdf0e10cSrcweir                             com.sun.star.frame.XLayoutManager.class,
1101cdf0e10cSrcweir                             xPropSet.getPropertyValue( "LayoutManager" ) );
1102cdf0e10cSrcweir                     if ( bNewValue )
1103cdf0e10cSrcweir                         xLayoutManager.showElement( aResourceURL );
1104cdf0e10cSrcweir                     else
1105cdf0e10cSrcweir                         xLayoutManager.hideElement( aResourceURL );
1106cdf0e10cSrcweir                 }
1107cdf0e10cSrcweir                 catch (  com.sun.star.beans.UnknownPropertyException aExc )
1108cdf0e10cSrcweir                 {
1109cdf0e10cSrcweir                     throw new RuntimeException( "not layout manager found" );
1110cdf0e10cSrcweir                 }
1111cdf0e10cSrcweir                 catch (  com.sun.star.lang.WrappedTargetException aExc )
1112cdf0e10cSrcweir                 {
1113cdf0e10cSrcweir                     throw new RuntimeException( "not layout manager found" );
1114cdf0e10cSrcweir                 }
1115cdf0e10cSrcweir 
1116cdf0e10cSrcweir                 // notify change
1117cdf0e10cSrcweir                 firePropertyChange( aProperty, new Boolean(bOldValue), new Boolean(bNewValue) );
1118cdf0e10cSrcweir            }
1119cdf0e10cSrcweir         }
1120cdf0e10cSrcweir 
1121cdf0e10cSrcweir         // end runtime timeout
1122cdf0e10cSrcweir         aCallWatchThread.cancel();
1123cdf0e10cSrcweir 
1124cdf0e10cSrcweir         // the new value will be stored by caller
1125cdf0e10cSrcweir         return bNewValue;
1126cdf0e10cSrcweir     }
1127cdf0e10cSrcweir 
1128cdf0e10cSrcweir     /** Sets the visibility of the menu bar.
1129cdf0e10cSrcweir 
1130cdf0e10cSrcweir         Initially the menu bar is visible.
1131cdf0e10cSrcweir         <p>
1132cdf0e10cSrcweir         If not connected or no document loaded, the value is stored
1133cdf0e10cSrcweir         and automatically applied to the document after it is loaded.
1134cdf0e10cSrcweir         Same is valid when the connection dies within this function call.
1135cdf0e10cSrcweir 
1136cdf0e10cSrcweir         @param bVisible
1137cdf0e10cSrcweir             If false, the menu bar is disabled,
1138cdf0e10cSrcweir             If true, the menu bar is visible.
1139cdf0e10cSrcweir 
1140cdf0e10cSrcweir         @deprecated Clients should use the service com.sun.star.frame.LayoutManager,
1141cdf0e10cSrcweir         which can be obtained from a frame, to control toolbars. See also
1142cdf0e10cSrcweir         {@link #setAllBarsVisible}.
1143cdf0e10cSrcweir      */
setMenuBarVisible(boolean bVisible)1144cdf0e10cSrcweir     public void setMenuBarVisible(boolean bVisible)
1145cdf0e10cSrcweir     {
1146cdf0e10cSrcweir         try
1147cdf0e10cSrcweir         {
1148cdf0e10cSrcweir             bMenuBarVisible = setToolVisible( "MenuBarVisible",
1149cdf0e10cSrcweir                     "private:resource/menubar/menubar", bMenuBarVisible, bVisible );
1150cdf0e10cSrcweir         }
1151cdf0e10cSrcweir         catch ( java.lang.InterruptedException aExc )
1152cdf0e10cSrcweir         {
1153cdf0e10cSrcweir             bMenuBarVisible = bVisible;
1154cdf0e10cSrcweir         }
1155cdf0e10cSrcweir     }
1156cdf0e10cSrcweir 
1157cdf0e10cSrcweir     /** Returns the visibility of the menu bar.
1158cdf0e10cSrcweir 
1159cdf0e10cSrcweir         This method works independently from a connetion or loaded document.
1160cdf0e10cSrcweir         If no connection is established or no document is loaded,
1161cdf0e10cSrcweir         this method just returns a memorized status.
1162cdf0e10cSrcweir 
1163cdf0e10cSrcweir         @return
1164cdf0e10cSrcweir             True if the menu bar is visible,
1165cdf0e10cSrcweir             false if the menu bar is hidden.
1166cdf0e10cSrcweir 
1167cdf0e10cSrcweir         @deprecated Clients should use the service com.sun.star.frame.LayoutManager,
1168cdf0e10cSrcweir         which can be obtained from a frame, to control toolbars. See also
1169cdf0e10cSrcweir         {@link #setAllBarsVisible}.
1170cdf0e10cSrcweir      */
isMenuBarVisible()1171cdf0e10cSrcweir     public boolean isMenuBarVisible()
1172cdf0e10cSrcweir     {
1173cdf0e10cSrcweir         return bMenuBarVisible;
1174cdf0e10cSrcweir     }
1175cdf0e10cSrcweir 
1176cdf0e10cSrcweir     /** Sets the main function bar visibilty.
1177cdf0e10cSrcweir 
1178cdf0e10cSrcweir         Initially the standard bar is visible.
1179cdf0e10cSrcweir 
1180cdf0e10cSrcweir         If not connected or no document loaded, the value is stored
1181cdf0e10cSrcweir         and automatically applied to the document after it is loaded.
1182cdf0e10cSrcweir         Same is valid when the connection dies within this function call.
1183cdf0e10cSrcweir 
1184cdf0e10cSrcweir         @param bVisible
1185cdf0e10cSrcweir             If false, the main function bar is disabled,
1186cdf0e10cSrcweir             If true, the main function bar is visible.
1187cdf0e10cSrcweir 
1188cdf0e10cSrcweir         @deprecated Clients should use the service com.sun.star.frame.LayoutManager,
1189cdf0e10cSrcweir         which can be obtained from a frame, to control toolbars. See also
1190cdf0e10cSrcweir         {@link #setAllBarsVisible}.
1191cdf0e10cSrcweir      */
setStandardBarVisible(boolean bVisible)1192cdf0e10cSrcweir     public void setStandardBarVisible(boolean bVisible)
1193cdf0e10cSrcweir     {
1194cdf0e10cSrcweir         try
1195cdf0e10cSrcweir         {
1196cdf0e10cSrcweir             bStandardBarVisible = setToolVisible( "StandardBarVisible",
1197cdf0e10cSrcweir                     "private:resource/toolbar/standardbar", bStandardBarVisible, bVisible );
1198cdf0e10cSrcweir         }
1199cdf0e10cSrcweir         catch ( java.lang.InterruptedException aExc )
1200cdf0e10cSrcweir         {
1201cdf0e10cSrcweir             bMenuBarVisible = bVisible;
1202cdf0e10cSrcweir         }
1203cdf0e10cSrcweir     }
1204cdf0e10cSrcweir 
1205cdf0e10cSrcweir     /** Returns the visibility of the main function bar.
1206cdf0e10cSrcweir 
1207cdf0e10cSrcweir         This method works independently from a connetion or loaded document.
1208cdf0e10cSrcweir         If no connection is established or no document is loaded,
1209cdf0e10cSrcweir         this method just returns a memorized status.
1210cdf0e10cSrcweir 
1211cdf0e10cSrcweir         @return
1212cdf0e10cSrcweir             True if the main function bar is visible,
1213cdf0e10cSrcweir             false if the main function bar is hidden.
1214cdf0e10cSrcweir 
1215cdf0e10cSrcweir         @deprecated Clients should use the service com.sun.star.frame.LayoutManager,
1216cdf0e10cSrcweir         which can be obtained from a frame, to control toolbars. See also
1217cdf0e10cSrcweir         {@link #setAllBarsVisible}.
1218cdf0e10cSrcweir     */
isStandardBarVisible()1219cdf0e10cSrcweir     public boolean isStandardBarVisible()
1220cdf0e10cSrcweir     {
1221cdf0e10cSrcweir         return bStandardBarVisible;
1222cdf0e10cSrcweir     }
1223cdf0e10cSrcweir 
1224cdf0e10cSrcweir     /** Sets the tool function bar visibilty.
1225cdf0e10cSrcweir 
1226cdf0e10cSrcweir         Initially the tool bar is visible.
1227cdf0e10cSrcweir 
1228cdf0e10cSrcweir         If not connected or no document loaded, the value is stored
1229cdf0e10cSrcweir         and automatically applied to the document after it is loaded.
1230cdf0e10cSrcweir         Same is valid when the connection dies within this function call.
1231cdf0e10cSrcweir 
1232cdf0e10cSrcweir         @param bVisible
1233cdf0e10cSrcweir             If false, the tool function bar is disabled,
1234cdf0e10cSrcweir             If true, the tool function bar is visible.
1235cdf0e10cSrcweir 
1236cdf0e10cSrcweir         @deprecated Clients should use the service com.sun.star.frame.LayoutManager,
1237cdf0e10cSrcweir         which can be obtained from a frame, to control toolbars. See also
1238cdf0e10cSrcweir         {@link #setAllBarsVisible}.
1239cdf0e10cSrcweir      */
setToolBarVisible(boolean bVisible)1240cdf0e10cSrcweir     public void setToolBarVisible(boolean bVisible)
1241cdf0e10cSrcweir     {
1242cdf0e10cSrcweir         try
1243cdf0e10cSrcweir         {
1244cdf0e10cSrcweir             bToolBarVisible = setToolVisible( "ToolBarVisible",
1245cdf0e10cSrcweir                     "private:resource/toolbar/toolbar", bToolBarVisible, bVisible );
1246cdf0e10cSrcweir         }
1247cdf0e10cSrcweir         catch ( java.lang.InterruptedException aExc )
1248cdf0e10cSrcweir         {
1249cdf0e10cSrcweir             bMenuBarVisible = bVisible;
1250cdf0e10cSrcweir         }
1251cdf0e10cSrcweir     }
1252cdf0e10cSrcweir 
1253cdf0e10cSrcweir     /** Returns the visibility of the tool function bar.
1254cdf0e10cSrcweir 
1255cdf0e10cSrcweir         This method works independently from a connetion or loaded document.
1256cdf0e10cSrcweir         If no connection is established or no document is loaded,
1257cdf0e10cSrcweir         this method just returns a memorized status.
1258cdf0e10cSrcweir 
1259cdf0e10cSrcweir         @return
1260cdf0e10cSrcweir             True if the tool function bar is visible,
1261cdf0e10cSrcweir             false if the tool function bar is hidden.
1262cdf0e10cSrcweir 
1263cdf0e10cSrcweir         @deprecated Clients should use the service com.sun.star.frame.LayoutManager,
1264cdf0e10cSrcweir         which can be obtained from a frame, to control toolbars. See also
1265cdf0e10cSrcweir         {@link #setAllBarsVisible}.
1266cdf0e10cSrcweir      */
isToolBarVisible()1267cdf0e10cSrcweir     public boolean isToolBarVisible()
1268cdf0e10cSrcweir     {
1269cdf0e10cSrcweir         return bToolBarVisible;
1270cdf0e10cSrcweir     }
1271cdf0e10cSrcweir 
1272cdf0e10cSrcweir     /** Sets the status function bar visibilty.
1273cdf0e10cSrcweir 
1274cdf0e10cSrcweir         Initially the status bar is visible.
1275cdf0e10cSrcweir 
1276cdf0e10cSrcweir         If not connected or no document loaded, the value is stored
1277cdf0e10cSrcweir         and automatically applied to the document after it is loaded.
1278cdf0e10cSrcweir         Same is valid when the connection dies within this function call.
1279cdf0e10cSrcweir 
1280cdf0e10cSrcweir         @param bVisible
1281cdf0e10cSrcweir             If false, the status function bar is disabled,
1282cdf0e10cSrcweir             If true, the status function bar is visible.
1283cdf0e10cSrcweir 
1284cdf0e10cSrcweir         @deprecated Clients should use the service com.sun.star.frame.LayoutManager,
1285cdf0e10cSrcweir         which can be obtained from a frame, to control toolbars. See also
1286cdf0e10cSrcweir         {@link #setAllBarsVisible}.
1287cdf0e10cSrcweir      */
setStatusBarVisible(boolean bVisible)1288cdf0e10cSrcweir     public void setStatusBarVisible(boolean bVisible)
1289cdf0e10cSrcweir     {
1290cdf0e10cSrcweir         try
1291cdf0e10cSrcweir         {
1292cdf0e10cSrcweir             bStatusBarVisible = setToolVisible( "StatusBarVisible",
1293cdf0e10cSrcweir                     "private:resource/statusbar/statusbar", bStatusBarVisible, bVisible );
1294cdf0e10cSrcweir         }
1295cdf0e10cSrcweir         catch ( java.lang.InterruptedException aExc )
1296cdf0e10cSrcweir         {
1297cdf0e10cSrcweir             bMenuBarVisible = bVisible;
1298cdf0e10cSrcweir         }
1299cdf0e10cSrcweir     }
1300cdf0e10cSrcweir 
1301cdf0e10cSrcweir     /** Returns the visibility of the status function bar.
1302cdf0e10cSrcweir 
1303cdf0e10cSrcweir         This method works independently from a connetion or loaded document.
1304cdf0e10cSrcweir         If no connection is established or no document is loaded,
1305cdf0e10cSrcweir         this method just returns a memorized status.
1306cdf0e10cSrcweir 
1307cdf0e10cSrcweir         @return
1308cdf0e10cSrcweir             True if the status function bar is visible,
1309cdf0e10cSrcweir             false if the status function bar is hidden.
1310cdf0e10cSrcweir 
1311cdf0e10cSrcweir         @deprecated Clients should use the service com.sun.star.frame.LayoutManager,
1312cdf0e10cSrcweir         which can be obtained from a frame, to control toolbars. See also
1313cdf0e10cSrcweir         {@link #setAllBarsVisible}.
1314cdf0e10cSrcweir      */
isStatusBarVisible()1315cdf0e10cSrcweir     public boolean isStatusBarVisible()
1316cdf0e10cSrcweir     {
1317cdf0e10cSrcweir         return bStatusBarVisible;
1318cdf0e10cSrcweir     }
1319cdf0e10cSrcweir 
1320cdf0e10cSrcweir     //===========================================================================
1321cdf0e10cSrcweir     // Helper Methods / Internal Methods
1322cdf0e10cSrcweir     //---------------------------------------------------------------------------
1323cdf0e10cSrcweir 
1324cdf0e10cSrcweir     // general instance intializer
1325cdf0e10cSrcweir     {
setLayout(new java.awt.BorderLayout())1326cdf0e10cSrcweir         setLayout(new java.awt.BorderLayout());
1327cdf0e10cSrcweir     }
1328cdf0e10cSrcweir 
1329cdf0e10cSrcweir     /**
1330cdf0e10cSrcweir         @deprecated
1331cdf0e10cSrcweir      */
paint( java.awt.Graphics aGraphics )1332cdf0e10cSrcweir     public void paint( java.awt.Graphics aGraphics )
1333cdf0e10cSrcweir     {
1334cdf0e10cSrcweir     }
1335cdf0e10cSrcweir 
1336cdf0e10cSrcweir     /** Adds a single argument to an array of arguments.
1337cdf0e10cSrcweir 
1338cdf0e10cSrcweir         If the argument by its name is already in aArguments
1339cdf0e10cSrcweir         it is exchanged and aArguments is returned.
1340cdf0e10cSrcweir         <p>
1341cdf0e10cSrcweir         If the argument by its name is not yet in aArguments,
1342cdf0e10cSrcweir         a new array is created, aArgument added and the new
1343cdf0e10cSrcweir         array returned.
1344cdf0e10cSrcweir     */
addArgument( com.sun.star.beans.PropertyValue aArguments[], final com.sun.star.beans.PropertyValue aArgument )1345cdf0e10cSrcweir     protected com.sun.star.beans.PropertyValue[] addArgument(
1346cdf0e10cSrcweir                 com.sun.star.beans.PropertyValue aArguments[],
1347cdf0e10cSrcweir                 final com.sun.star.beans.PropertyValue aArgument )
1348cdf0e10cSrcweir     {
1349cdf0e10cSrcweir         // get number of current arguments
1350cdf0e10cSrcweir         int nNumArgs = 0;
1351cdf0e10cSrcweir         if ( aArguments != null )
1352cdf0e10cSrcweir             nNumArgs = aArguments.length;
1353cdf0e10cSrcweir 
1354cdf0e10cSrcweir         // is new argument already set?
1355cdf0e10cSrcweir         for ( int n = 0; n < nNumArgs; ++n )
1356cdf0e10cSrcweir         {
1357cdf0e10cSrcweir             if ( aArguments[n].Name == aArgument.Name )
1358cdf0e10cSrcweir             {
1359cdf0e10cSrcweir                 // substitute this argument
1360cdf0e10cSrcweir                 aArguments[n] = aArgument;
1361cdf0e10cSrcweir 
1362cdf0e10cSrcweir                 // return current array
1363cdf0e10cSrcweir                 return aArguments;
1364cdf0e10cSrcweir             }
1365cdf0e10cSrcweir         }
1366cdf0e10cSrcweir 
1367cdf0e10cSrcweir         // create extended arguments
1368cdf0e10cSrcweir         com.sun.star.beans.PropertyValue[] aExtendedArguments =
1369cdf0e10cSrcweir             new com.sun.star.beans.PropertyValue[ nNumArgs + 1 ];
1370cdf0e10cSrcweir 
1371cdf0e10cSrcweir         // copy current arguments
1372cdf0e10cSrcweir         for ( int n = 0; n < nNumArgs; ++n )
1373cdf0e10cSrcweir             aExtendedArguments[n] = aArguments[n];
1374cdf0e10cSrcweir 
1375cdf0e10cSrcweir         // add new argument
1376cdf0e10cSrcweir         aExtendedArguments[ nNumArgs ] = aArgument;
1377cdf0e10cSrcweir 
1378cdf0e10cSrcweir         // return new arguments
1379cdf0e10cSrcweir         return aExtendedArguments;
1380cdf0e10cSrcweir     }
1381cdf0e10cSrcweir 
1382cdf0e10cSrcweir     //===========================================================================
1383cdf0e10cSrcweir     // Helper Classes
1384cdf0e10cSrcweir     //---------------------------------------------------------------------------
1385cdf0e10cSrcweir 
1386cdf0e10cSrcweir     /** Helper class to listen on the connection to learn when it dies.
1387cdf0e10cSrcweir 
1388cdf0e10cSrcweir         @internal
1389cdf0e10cSrcweir      */
1390cdf0e10cSrcweir     private class EventListener
1391cdf0e10cSrcweir         extends Thread
1392cdf0e10cSrcweir         implements
1393cdf0e10cSrcweir             com.sun.star.lang.XEventListener,
1394cdf0e10cSrcweir             com.sun.star.frame.XTerminateListener
1395cdf0e10cSrcweir     {
1396cdf0e10cSrcweir         String aTag;
1397cdf0e10cSrcweir 
EventListener( String aTag )1398cdf0e10cSrcweir         EventListener( String aTag )
1399cdf0e10cSrcweir             throws NoConnectionException
1400cdf0e10cSrcweir         {
1401cdf0e10cSrcweir             // init members
1402cdf0e10cSrcweir             this.aTag = aTag;
1403cdf0e10cSrcweir 
1404cdf0e10cSrcweir             // listen on a dying connection
1405cdf0e10cSrcweir             iConnection.addEventListener( this );
1406cdf0e10cSrcweir 
1407cdf0e10cSrcweir             // listen on a terminating OOo
1408cdf0e10cSrcweir             getOOoDesktop().addTerminateListener( this );
1409cdf0e10cSrcweir 
1410cdf0e10cSrcweir             // start this thread as a daemon
1411cdf0e10cSrcweir             setDaemon( true );
1412cdf0e10cSrcweir             start();
1413cdf0e10cSrcweir         }
1414cdf0e10cSrcweir 
end()1415cdf0e10cSrcweir         public void end()
1416cdf0e10cSrcweir         {
1417cdf0e10cSrcweir             // do not listen on a dying connection anymore
1418cdf0e10cSrcweir             try {
1419cdf0e10cSrcweir                 iConnection.removeEventListener( this );
1420cdf0e10cSrcweir             }
1421cdf0e10cSrcweir             catch ( Throwable aExc ) {};
1422cdf0e10cSrcweir 
1423cdf0e10cSrcweir             // do not listen on a terminating OOo anymore
1424cdf0e10cSrcweir             try {
1425cdf0e10cSrcweir                 getOOoDesktop().removeTerminateListener( this );
1426cdf0e10cSrcweir             }
1427cdf0e10cSrcweir             catch ( Throwable aExc ) {};
1428cdf0e10cSrcweir 
1429cdf0e10cSrcweir             // stop thread
1430cdf0e10cSrcweir             this.interrupt();
1431cdf0e10cSrcweir         }
1432cdf0e10cSrcweir 
1433cdf0e10cSrcweir         /// gets called when the connection dies
disposing( com.sun.star.lang.EventObject Source )1434cdf0e10cSrcweir         public void disposing( /*IN*/ com.sun.star.lang.EventObject Source )
1435cdf0e10cSrcweir         {
1436cdf0e10cSrcweir             // empty the OOoBean and cut the connection
1437cdf0e10cSrcweir             stopOOoConnection();
1438cdf0e10cSrcweir         }
1439cdf0e10cSrcweir 
1440cdf0e10cSrcweir         /// gets called when the user wants to terminate OOo
queryTermination( com.sun.star.lang.EventObject Event )1441cdf0e10cSrcweir         public void queryTermination( /*IN*/ com.sun.star.lang.EventObject Event )
1442cdf0e10cSrcweir             throws com.sun.star.frame.TerminationVetoException
1443cdf0e10cSrcweir         {
1444cdf0e10cSrcweir             // disallow termination of OOo while a OOoBean exists
1445cdf0e10cSrcweir             throw new com.sun.star.frame.TerminationVetoException();
1446cdf0e10cSrcweir         }
1447cdf0e10cSrcweir 
1448cdf0e10cSrcweir         /// gets called when OOo terminates
notifyTermination( com.sun.star.lang.EventObject Event )1449cdf0e10cSrcweir         public void notifyTermination( /*IN*/ com.sun.star.lang.EventObject Event )
1450cdf0e10cSrcweir         {
1451cdf0e10cSrcweir             // empty the OOoBean and cut the connection
1452cdf0e10cSrcweir             stopOOoConnection();
1453cdf0e10cSrcweir         }
1454cdf0e10cSrcweir 
1455cdf0e10cSrcweir         /// watching the connection
run()1456cdf0e10cSrcweir         public void run()
1457cdf0e10cSrcweir         {
1458cdf0e10cSrcweir             dbgPrint( "EventListener(" + aTag + ").run()" );
1459cdf0e10cSrcweir 
1460cdf0e10cSrcweir             // remote call might hang => watch try
1461cdf0e10cSrcweir             CallWatchThread aCallWatchThread =
1462cdf0e10cSrcweir                 new CallWatchThread( nOOoCallTimeOut, "EventListener(" + aTag + ")" );
1463cdf0e10cSrcweir 
1464cdf0e10cSrcweir             // continue to trying to connect the OOo instance
1465cdf0e10cSrcweir             long n = 0;
1466cdf0e10cSrcweir             while ( isInterrupted() == false
1467cdf0e10cSrcweir                     && iConnection != null
1468cdf0e10cSrcweir                     && iConnection.getComponentContext() != null )
1469cdf0e10cSrcweir             {
1470cdf0e10cSrcweir                 dbgPrint( "EventListener(" + aTag + ").running() #" + ++n );
1471cdf0e10cSrcweir 
1472cdf0e10cSrcweir                 // still alive?
1473cdf0e10cSrcweir                 com.sun.star.lang.XMultiComponentFactory xServiceManager = null;
1474cdf0e10cSrcweir                 try
1475cdf0e10cSrcweir                 {
1476cdf0e10cSrcweir                     // an arbitrary (but cheap) call into OOo
1477cdf0e10cSrcweir                     xServiceManager = iConnection.getComponentContext().getServiceManager();
1478cdf0e10cSrcweir 
1479cdf0e10cSrcweir                     // call successfully performed, restart watch for next loop
1480cdf0e10cSrcweir                     try
1481cdf0e10cSrcweir                     {
1482cdf0e10cSrcweir                         aCallWatchThread.restart();
1483cdf0e10cSrcweir                     }
1484cdf0e10cSrcweir                     catch ( java.lang.InterruptedException aExc )
1485cdf0e10cSrcweir                     {
1486cdf0e10cSrcweir                         // ignore late interrupt
1487cdf0e10cSrcweir                     }
1488cdf0e10cSrcweir                 }
1489cdf0e10cSrcweir                 catch ( java.lang.RuntimeException aExc )
1490cdf0e10cSrcweir                 {
1491cdf0e10cSrcweir                     // hung
1492cdf0e10cSrcweir                     OfficeConnection iDeadConn = iConnection;
1493cdf0e10cSrcweir                     iConnection = null;
1494cdf0e10cSrcweir                     iDeadConn.dispose();
1495cdf0e10cSrcweir                 }
1496cdf0e10cSrcweir 
1497cdf0e10cSrcweir                 // sleep
1498cdf0e10cSrcweir                 try {
1499cdf0e10cSrcweir                         sleep(nOOoCheckCycle);
1500cdf0e10cSrcweir                 }
1501cdf0e10cSrcweir                 catch ( java.lang.InterruptedException aExc )
1502cdf0e10cSrcweir                 {
1503cdf0e10cSrcweir                     dbgPrint("EventListener(" + aTag + ") interupted.");
1504cdf0e10cSrcweir                     //thread can be ended by EvendListener.end();
1505cdf0e10cSrcweir                     break;
1506cdf0e10cSrcweir                 }
1507cdf0e10cSrcweir             }
1508cdf0e10cSrcweir         }
1509cdf0e10cSrcweir     }
1510cdf0e10cSrcweir 
1511cdf0e10cSrcweir }
1512cdf0e10cSrcweir 
1513cdf0e10cSrcweir 
1514cdf0e10cSrcweir 
1515