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