xref: /AOO41X/main/bean/com/sun/star/beans/LocalOfficeWindow.java (revision d4cc1e8c350bb591a80bbabe126ff6af34c125a2)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 package com.sun.star.beans;
25 
26 import java.awt.Component;
27 
28 import com.sun.star.lang.EventObject;
29 import com.sun.star.lang.SystemDependent;
30 import com.sun.star.lang.XEventListener;
31 import com.sun.star.lang.XMultiServiceFactory;
32 import com.sun.star.lang.XMultiComponentFactory;
33 import com.sun.star.awt.Rectangle;
34 import com.sun.star.awt.XWindow;
35 import com.sun.star.awt.XWindowPeer;
36 import com.sun.star.awt.XVclWindowPeer;
37 import com.sun.star.awt.XToolkit;
38 import com.sun.star.awt.WindowDescriptor;
39 import com.sun.star.awt.WindowAttribute;
40 import com.sun.star.awt.WindowClass;
41 import com.sun.star.uno.UnoRuntime;
42 import com.sun.star.uno.XComponentContext;
43 
44 /**
45  * This class represents a local office window.
46  * @deprecated
47  */
48 public class LocalOfficeWindow
49     extends java.awt.Canvas
50     implements OfficeWindow, XEventListener
51 {
52     private transient OfficeConnection  mConnection;
53     private transient XWindowPeer       mParentProxy;
54     private transient XWindowPeer       mWindow;
55     private boolean             bPeer = false;
56 
57     /**
58      * Construnctor.
59      *
60      * @param connection The office connection object the window
61      *  belongs to.
62      */
LocalOfficeWindow(OfficeConnection connection)63     /* package */ LocalOfficeWindow(OfficeConnection connection)
64     {
65         mConnection = connection;
66         mConnection.addEventListener((XEventListener)this);
67     }
68 
69     /**
70      * Retrives an AWT component object associated with the OfficeWindow.
71      *
72      * @return The AWT component object associated with the OfficeWindow.
73      */
getAWTComponent()74     public Component getAWTComponent()
75     {
76         return this;
77     }
78 
79     /**
80      * Retrives an UNO XWindowPeer object associated with the OfficeWindow.
81      *
82      * @return The UNO XWindowPeer object associated with the OfficeWindow.
83      */
getUNOWindowPeer()84     public XWindowPeer getUNOWindowPeer()
85     {
86         if (mWindow == null)
87             createUNOWindowPeer();
88         return mWindow;
89     }
90 
91     /**
92      * Receives a notification about the connection has been closed.
93      * This method has to set the connection to <code>null</code>.
94      *
95      * @source The event object.
96      */
disposing(EventObject source)97     public void disposing(EventObject source)
98     {
99         // the window will be disposed by the framework
100         mWindow = null;
101         mConnection = null;
102     }
103 
104     /**
105     * Returns an AWT toolkit.
106         */
queryAWTToolkit()107        private XToolkit queryAWTToolkit()
108                throws com.sun.star.uno.Exception
109        {
110             // Create a UNO toolkit.
111             XMultiComponentFactory  compfactory;
112             XComponentContext xContext = mConnection.getComponentContext();
113             if ( xContext != null )
114             {
115                 compfactory     = mConnection.getComponentContext().getServiceManager();
116                 XMultiServiceFactory    factory;
117                 factory = (XMultiServiceFactory)UnoRuntime.queryInterface(
118                         XMultiServiceFactory.class, compfactory);
119                 Object          object  = factory.createInstance( "com.sun.star.awt.Toolkit");
120                 return (XToolkit)UnoRuntime.queryInterface(XToolkit.class, object);
121             }
122             else
123                 return null;
124        }
125 
126         /// called when system parent is available, reparents the bean window
aquireSystemWindow()127     private void aquireSystemWindow()
128     {
129         if ( !bPeer )
130         {
131             // set real parent
132             XVclWindowPeer xVclWindowPeer = (XVclWindowPeer)UnoRuntime.queryInterface(
133                                XVclWindowPeer.class, mWindow);
134             xVclWindowPeer.setProperty( "PluginParent", new Long(getNativeWindow()) );
135             bPeer = true;
136 
137                 // show document window
138             XWindow aWindow = (XWindow)UnoRuntime.queryInterface(XWindow.class, mWindow);
139             aWindow.setVisible( true );
140         }
141     }
142 
143         /// called when system parent is about to die, reparents the bean window
releaseSystemWindow()144     private void releaseSystemWindow()
145     {
146         if ( bPeer )
147         {
148                 // hide document window
149             XWindow aWindow = (XWindow)UnoRuntime.queryInterface(XWindow.class, mWindow);
150             aWindow.setVisible( false );
151 
152             // set null parent
153             XVclWindowPeer xVclWindowPeer = (XVclWindowPeer)UnoRuntime.queryInterface(
154                                XVclWindowPeer.class, mWindow);
155             xVclWindowPeer.setProperty( "PluginParent", new Long(0) );
156             bPeer = false;
157         }
158     }
159 
160        /// callback handler to get to know when we become visible
161         //@deprecated
162        class ComponentEventHandler
163                extends java.awt.event.ComponentAdapter
164        {
componentHidden( java.awt.event.ComponentEvent e)165         public void componentHidden( java.awt.event.ComponentEvent e)
166         {
167             // only when we become invisible, we might lose our system window
168             CallWatchThread aCallWatchThread = new CallWatchThread( 500 );
169             setVisible(false);
170             try { aCallWatchThread.cancel(); }
171             catch ( java.lang.InterruptedException aExc )
172             {} // ignore
173         }
174 
componentShown( java.awt.event.ComponentEvent e)175         public void componentShown( java.awt.event.ComponentEvent e)
176         {
177             // only when we become visible, we get a system window
178             aquireSystemWindow();
179         }
180     }
181 
182     /// Overriding java.awt.Component.setVisible() due to Java bug (no showing event).
setVisible( boolean b )183     public void setVisible( boolean b )
184     {
185         super.setVisible(b);
186 
187         // Java-Bug: componentShown() is never called :-(
188         // is still at least in Java 1.4.1_02
189         if ( b )
190             aquireSystemWindow();
191         else
192             releaseSystemWindow();
193     }
194 
195        /** Factory method for a UNO AWT toolkit window as a child of this Java window.
196     *
197     */
createUNOWindowPeer()198        private XWindowPeer createUNOWindowPeer()
199        {
200         try
201         {
202             // get this windows native window type
203                         int type = getNativeWindowSystemType();
204 
205                         // Java AWT windows only have a system window when showing.
206                         XWindowPeer parentPeer;
207                         if ( isShowing() )
208                         {
209                 // create direct parent relationship
210                 //setVisible( true );
211                                 parentPeer = new JavaWindowPeerFake( getNativeWindow(), type);
212                 bPeer = true;
213                         }
214                         else
215             {
216                 // no parent yet
217                 parentPeer = null;
218                 bPeer = false;
219             }
220 
221             // create native window (mWindow)
222             Rectangle aRect = new Rectangle( 0, 0, 20, 20 );
223             WindowDescriptor desc = new WindowDescriptor();
224             desc.Type = WindowClass.TOP;
225             desc.Parent = parentPeer;
226             desc.Bounds = aRect;
227             desc.WindowServiceName = "workwindow";
228             desc.WindowAttributes = (type == SystemDependent.SYSTEM_WIN32)
229                 ? WindowAttribute.SHOW : 0;
230             mWindow = queryAWTToolkit().createWindow(desc);
231 
232             // to get notified when we become visible
233             addComponentListener( new ComponentEventHandler() );
234 
235             // set initial visibility
236                         XWindow aWindow = (XWindow)UnoRuntime.queryInterface(XWindow.class, mWindow);
237             aWindow.setVisible( bPeer );
238         }
239         catch (com.sun.star.uno.Exception exp) {
240         }
241 
242         return mWindow;
243     }
244 
245     /**
246      * Retrives a platform dependant system window identifier.
247      *
248      * @return The system window identifier.
249      */
getNativeWindow()250     private native long getNativeWindow();
251 
252     /**
253      * Retrives a platform dependant system window type.
254      *
255      * @return The system window type.
256      */
getNativeWindowSystemType()257     private native int getNativeWindowSystemType();
258 
259         //---------------------------------------------------------------------------
260         /** Helper class to watch calls into OOo with a timeout.
261          * @deprecated
262          */
263         class CallWatchThread extends Thread
264         {
265                 Thread aWatchedThread;
266                 long nTimeout;
267 
CallWatchThread( long nTimeout )268                 CallWatchThread( long nTimeout )
269                 {
270                         this.aWatchedThread = Thread.currentThread();
271                         this.nTimeout = nTimeout;
272                         start();
273                 }
274 
cancel()275                 void cancel()
276                         throws java.lang.InterruptedException
277                 {
278                         Thread aThread = aWatchedThread;
279                         aWatchedThread = null;
280                         stop();
281 
282                         if ( aThread.interrupted() )
283                                 throw new InterruptedException();
284                 }
285 
run()286                 public void run()
287                 {
288                         while ( aWatchedThread != null )
289                         {
290                                 try { sleep( nTimeout ); }
291                                 catch ( java.lang.InterruptedException aExc )
292                                 {}
293 
294                                 //synchronized
295                                 {
296                                         if ( aWatchedThread != null )
297                                         {
298                                                 aWatchedThread.interrupt();
299                                         }
300                                 }
301                         }
302                 }
303         };
304 
305 }
306