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