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