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