xref: /AOO41X/main/bean/com/sun/star/comp/beans/LocalOfficeWindow.java (revision 54628ca40d27d15cc98fe861da7fff7e60c2f7d6)
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.comp.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 import com.sun.star.uno.Any;
44 import com.sun.star.uno.Type;
45 import com.sun.star.beans.NamedValue;
46 
47 /**
48  * This class represents a local office window.
49  *
50  * @since OOo 2.0.0
51  */
52 public class LocalOfficeWindow
53     extends java.awt.Canvas
54     implements OfficeWindow, XEventListener
55 {
56     private transient OfficeConnection  mConnection;
57     private transient XWindowPeer       mParentProxy;
58     private transient XWindowPeer       mWindow;
59     private boolean             bPeer = false;
60 
61     /**
62      * Construnctor.
63      *
64      * @param connection The office connection object the window
65      *  belongs to.
66      */
67     protected LocalOfficeWindow(OfficeConnection connection)
68     {
69         mConnection = connection;
70         mConnection.addEventListener((XEventListener)this);
71     }
72 
73     /**
74      * Retrives an AWT component object associated with the OfficeWindow.
75      *
76      * @return The AWT component object associated with the OfficeWindow.
77      */
78     public Component getAWTComponent()
79     {
80         return this;
81     }
82 
83     /**
84      * Retrives an UNO XWindowPeer object associated with the OfficeWindow.
85      *
86      * @return The UNO XWindowPeer object associated with the OfficeWindow.
87      */
88     public XWindowPeer getUNOWindowPeer()
89     {
90         if (mWindow == null)
91             createUNOWindowPeer();
92         return mWindow;
93     }
94 
95     /**
96      * Receives a notification about the connection has been closed.
97      * This method has to set the connection to <code>null</code>.
98      *
99      * @source The event object.
100      */
101     public void disposing(EventObject source)
102     {
103         // the window will be disposed by the framework
104         mWindow = null;
105         mConnection = null;
106     }
107 
108     /**
109     * Returns an AWT toolkit.
110         */
111        private XToolkit queryAWTToolkit()
112                throws com.sun.star.uno.Exception
113        {
114             // Create a UNO toolkit.
115             XMultiComponentFactory  compfactory;
116             XComponentContext xContext = mConnection.getComponentContext();
117             if ( xContext != null )
118             {
119                 compfactory     = mConnection.getComponentContext().getServiceManager();
120                 XMultiServiceFactory    factory;
121                 factory = (XMultiServiceFactory)UnoRuntime.queryInterface(
122                         XMultiServiceFactory.class, compfactory);
123                 Object          object  = factory.createInstance( "com.sun.star.awt.Toolkit");
124                 return (XToolkit)UnoRuntime.queryInterface(XToolkit.class, object);
125             }
126             else
127                 return null;
128        }
129 
130         /// called when system parent is available, reparents the bean window
131     private synchronized void aquireSystemWindow()
132     {
133         if ( !bPeer )
134         {
135             // set real parent
136             XVclWindowPeer xVclWindowPeer = (XVclWindowPeer)UnoRuntime.queryInterface(
137                                XVclWindowPeer.class, mWindow);
138 
139             xVclWindowPeer.setProperty( "PluginParent", getWrappedWindowHandle());
140             bPeer = true;
141             // show document window
142             XWindow aWindow = (XWindow)UnoRuntime.queryInterface(XWindow.class, mWindow);
143             aWindow.setVisible( true );
144         }
145     }
146 
147         /// called when system parent is about to die, reparents the bean window
148     private synchronized void releaseSystemWindow()
149     {
150         if ( bPeer )
151         {
152                 // hide document window
153             XWindow aWindow = (XWindow)UnoRuntime.queryInterface(XWindow.class, mWindow);
154             aWindow.setVisible( false );
155 
156             // set null parent
157             XVclWindowPeer xVclWindowPeer = (XVclWindowPeer)UnoRuntime.queryInterface(
158                                XVclWindowPeer.class, mWindow);
159             xVclWindowPeer.setProperty( "PluginParent", new Long(0) );
160             bPeer = false;
161         }
162     }
163 
164 
165     /// Overriding java.awt.Component.setVisible() due to Java bug (no showing event).
166     public void setVisible( boolean b )
167     {
168         super.setVisible(b);
169 
170         // Java-Bug: componentShown() is never called :-(
171         // is still at least in Java 1.4.1_02
172         if ( b )
173             aquireSystemWindow();
174         else
175             releaseSystemWindow();
176     }
177 
178        /** Factory method for a UNO AWT toolkit window as a child of this Java window.
179     *
180     */
181        private synchronized XWindowPeer createUNOWindowPeer()
182        {
183         try
184         {
185             // get this windows native window type
186             int type = getNativeWindowSystemType();
187 
188             // Java AWT windows only have a system window when showing.
189             XWindowPeer parentPeer;
190             if ( isShowing() )
191             {
192                 // create direct parent relationship
193                 //setVisible( true );
194                 parentPeer = new JavaWindowPeerFake(getWrappedWindowHandle(), type);
195                 bPeer = true;
196                         }
197                         else
198             {
199                 // no parent yet
200                 parentPeer = null;
201                 bPeer = false;
202             }
203 
204             // create native window (mWindow)
205             Rectangle aRect = new Rectangle( 0, 0, 20, 20 );
206             WindowDescriptor desc = new WindowDescriptor();
207             desc.Type = WindowClass.TOP;
208             desc.Parent = parentPeer;
209             desc.Bounds = aRect;
210             desc.WindowServiceName = "workwindow";
211             desc.WindowAttributes = (type == SystemDependent.SYSTEM_WIN32)
212                 ? WindowAttribute.SHOW : 0;
213             mWindow = queryAWTToolkit().createWindow(desc);
214 
215 
216             // set initial visibility
217             XWindow aWindow = (XWindow)UnoRuntime.queryInterface(XWindow.class, mWindow);
218             aWindow.setVisible( bPeer );
219         }
220         catch (com.sun.star.uno.Exception exp) {
221         }
222 
223         return mWindow;
224     }
225     /** We make sure that the office window is notified that the parent
226      *  will be removed.
227      */
228     public void removeNotify()
229     {
230         try {
231             releaseSystemWindow();
232         } catch (java.lang.Exception e) {
233             System.err.println("LocaleOfficeWindow.removeNotify: Exception in releaseSystemWindow.");
234             System.err.println(e.getMessage());
235             e.printStackTrace(System.err);
236         }
237         super.removeNotify();
238     }
239 
240     /**
241      * Retrives a platform dependant system window identifier.
242      *
243      * @return The system window identifier.
244      */
245     private native long getNativeWindow();
246 
247     /**
248      * Retrives a platform dependant system window type.
249      *
250      * @return The system window type.
251      */
252     private native int getNativeWindowSystemType();
253 
254     /**
255     Returns an Any containing a sequences of com.sun.star.beans.NamedValue. One NamedValue
256     contains the name "WINDOW" and the value is a Long representing the window handle.
257     The second NamedValue  has the name "XEMBED" and the value is true, when the XEmbed
258     protocol shall be used fore embedding the native Window.
259     */
260     protected Any getWrappedWindowHandle()
261     {
262 
263         NamedValue window = new NamedValue(
264             "WINDOW", new Any(new Type(Long.class), new Long(getNativeWindow())));
265         NamedValue xembed = new NamedValue(
266             "XEMBED", new Any(new Type(Boolean.class), new Boolean(false)));
267 
268         if (getNativeWindowSystemType() == SystemDependent.SYSTEM_XWINDOW )
269         {
270             String vendor = System.getProperty("java.vendor");
271             if (vendor.equals("Sun Microsystems Inc.")
272                 && Boolean.valueOf(System.getProperty("sun.awt.xembedserver")).booleanValue())
273             {
274                 xembed = new NamedValue(
275                     "XEMBED",
276                     new Any(new Type(Boolean.class), new Boolean(true)));
277             }
278         }
279         return new Any(
280             new Type("[]com.sun.star.beans.NamedValue"),
281             new NamedValue[] {window, xembed});
282     }
283 
284 }
285