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 package embeddedobj.test;
24 
25 // __________ Imports __________
26 
27 import java.awt.*;
28 import java.lang.*;
29 import java.awt.event.*;
30 
31 // __________ Implementation __________
32 
33 /**
34  * Class to pass the system window handle to the OpenOffice.org toolkit.
35  * It use special JNI methods to get the system handle of used java window.
36  *
37  * Attention!
38  * Use JNI functions on already visible canvas objects only!
39  * Otherwise they can make some trouble.
40  *
41  * @author  Andreas Schlüns
42  * @created 22.02.2002 08:47
43  */
44 
45 public class NativeView extends java.awt.Canvas
46 {
47     // ____________________
48 
49     /**
50      * ctor
51      * Does nothing realy.
52      * We can use our JNI mechanism for an already visible
53      * canvas only. So we overload the method for showing ( "setVisible()" )
54      * and make our intialization there. BUt we try to show an empty clean
55      * window till there.
56      */
NativeView()57     public NativeView()
58     {
59         maHandle = null;
60         maSystem = 0;
61         this.setBackground( Color.white );
62 	}
63 
64     // ____________________
65 
66     /**
67      * Overload this method to make neccessary initializations here.
68      * ( e.g. get the window handle and neccessary system informations )
69      *
70      * Why here?
71      * Because the handle seams to be available for already visible windows
72      * only. So it's the best place to get it. Special helper method
73      * can be called more then ones - but call native code one times only
74      * and safe the handle and the system type on our members maHandle/maSystem!
75      */
setVisible( boolean bState )76     public void setVisible( boolean bState )
77     {
78         getHWND();
79     }
80 
81     // ____________________
82 
83     /**
84      * to guarantee right resize handling inside a swing container
85      * ( e.g. JSplitPane ) we must provide some informations about our
86      * prefered/minimum and maximum size.
87      */
getPreferredSize()88     public Dimension getPreferredSize()
89     {
90         return new Dimension( 800, 600 );
91     }
92 
getMaximumSize()93     public Dimension getMaximumSize()
94     {
95         return new Dimension( 1024, 768 );
96     }
97 
getMinimumSize()98     public Dimension getMinimumSize()
99     {
100         return new Dimension( 300, 300 );
101     }
102 
103     // ____________________
104 
105     /**
106      * overload paint routine to show provide against
107      * repaint errors if no office view is realy plugged
108      * into this canvas.
109      * If handle is present - we shouldn't paint anything further.
110      * May the remote window is already plugged. In such case we
111      * shouldn't paint it over.
112      */
paint( Graphics aGraphic )113     public void paint( Graphics aGraphic )
114     {
115         if( maHandle == null )
116         {
117             Dimension aSize = getSize();
118             aGraphic.clearRect( 0, 0, aSize.width, aSize.height );
119         }
120     }
121 
122     // ____________________
123 
124     /**
125      * JNI interface of this class
126      * These two methods are implemented by using JNI mechanismen.
127      * The will be used to get the platform dependent window handle
128      * of a java awt canvas. This handle can be used to create an office
129      * window as direct child of it. So it's possible to plug Office
130      * windows in a java UI container.
131      *
132      * Note:
133      * Native code for windows register special function pointer to handle
134      * window messages ... But if it doesn't check for an already registered
135      * instance of this handler it will do it twice and produce a stack overflow
136      * because such method call herself in a never ending loop ...
137      * So we try to use the JNI code one times only and safe already getted
138      * informations inside this class.
139      */
getNativeWindowSystemType()140     public  native int  getNativeWindowSystemType();
getNativeWindow()141     private native long getNativeWindow(); // private! => use getHWND() with cache mechanism!
142 
getHWND()143     public Integer getHWND()
144     {
145         if( maHandle == null )
146         {
147             maHandle = new Integer( (int )getNativeWindow() );
148             maSystem = getNativeWindowSystemType();
149         }
150         return maHandle;
151     }
152 
153     // ____________________
154 
155     /**
156      * for using of the JNI methods it's neccessary to load
157      * system library which exports it.
158      */
159     static
160     {
161         System.loadLibrary( "nativeview" );
162     }
163 
164     // ____________________
165 
166     /**
167      * @member  maHandle    system window handle
168      * @member  maSystem    info about currently used platform
169      */
170     public Integer maHandle ;
171     public int     maSystem ;
172 }
173 
174