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 #if defined _MSC_VER
25 #pragma warning(push, 1)
26 #endif
27 #include <windows.h>
28 #if defined _MSC_VER
29 #pragma warning(pop)
30 #endif
31 
32 #include "jawt.h"
33 
34 #if defined _MSC_VER
35 #pragma warning(push, 1)
36 #endif
37 #include "jawt_md.h"
38 #if defined _MSC_VER
39 #pragma warning(pop)
40 #endif
41 
42 #define SYSTEM_WIN32   1
43 #define SYSTEM_WIN16   2
44 #define SYSTEM_JAVA    3
45 #define SYSTEM_OS2     4
46 #define SYSTEM_MAC     5
47 #define SYSTEM_XWINDOW 6
48 
49 #define OLD_PROC_KEY "oldwindowproc"
50 
51 static LRESULT APIENTRY OpenOfficeWndProc( HWND , UINT , WPARAM , LPARAM );
52 
53 
54 
55 /* type must be something like java/lang/RuntimeException
56  */
ThrowException(JNIEnv * env,char const * type,char const * msg)57 static void ThrowException(JNIEnv * env, char const * type, char const * msg) {
58     jclass c;
59     (*env)->ExceptionClear(env);
60     c = (*env)->FindClass(env, type);
61     if (c == NULL) {
62         (*env)->ExceptionClear(env);
63         (*env)->FatalError(
64             env, "JNI FindClass failed");
65     }
66     if ((*env)->ThrowNew(env, c, msg) != 0) {
67         (*env)->ExceptionClear(env);
68         (*env)->FatalError(env, "JNI ThrowNew failed");
69     }
70 }
71 
72 
73 /*****************************************************************************/
74 /*
75  * Class:     com_sun_star_comp_beans_LocalOfficeWindow
76  * Method:    getNativeWindowSystemType
77  * Signature: ()I
78  */
Java_com_sun_star_comp_beans_LocalOfficeWindow_getNativeWindowSystemType(JNIEnv * env,jobject obj_this)79 JNIEXPORT jint JNICALL Java_com_sun_star_comp_beans_LocalOfficeWindow_getNativeWindowSystemType
80   (JNIEnv * env, jobject obj_this)
81 {
82     (void) env; // unused
83     (void) obj_this; // unused
84     return (SYSTEM_WIN32);
85 }
86 
87 
88 /*****************************************************************************/
89 /*
90  * Class:     com_sun_star_comp_beans_LocalOfficeWindow
91  * Method:    getNativeWindow
92  * Signature: ()J
93  */
Java_com_sun_star_comp_beans_LocalOfficeWindow_getNativeWindow(JNIEnv * env,jobject obj_this)94 JNIEXPORT jlong JNICALL Java_com_sun_star_comp_beans_LocalOfficeWindow_getNativeWindow
95   (JNIEnv * env, jobject obj_this)
96 {
97 	jboolean result;
98 	jint lock;
99 
100 	JAWT awt;
101 	JAWT_DrawingSurface* ds;
102 	JAWT_DrawingSurfaceInfo* dsi;
103 	JAWT_Win32DrawingSurfaceInfo* dsi_win;
104 	HDC hdc;
105 	HWND hWnd;
106     LONG hFuncPtr;
107 
108 	/* Get the AWT */
109 	awt.version = JAWT_VERSION_1_3;
110 	result = JAWT_GetAWT(env, &awt);
111 	if (result == JNI_FALSE)
112         ThrowException(env, "java/lang/RuntimeException", "JAWT_GetAWT failed");
113 
114 								/* Get the drawing surface */
115 	if ((ds = awt.GetDrawingSurface(env, obj_this)) == NULL)
116 		return 0L;
117 
118 	/* Lock the drawing surface */
119 	lock = ds->Lock(ds);
120 	if ( (lock & JAWT_LOCK_ERROR) != 0)
121         ThrowException(env, "java/lang/RuntimeException",
122                        "Could not get AWT drawing surface.");
123 
124 	/* Get the drawing surface info */
125 	dsi = ds->GetDrawingSurfaceInfo(ds);
126 
127 	/* Get the platform-specific drawing info */
128 	dsi_win = (JAWT_Win32DrawingSurfaceInfo*)dsi->platformInfo;
129 
130 	hdc = dsi_win->hdc;
131 
132 	hWnd = dsi_win->hwnd;
133 
134 	/* Free the drawing surface info */
135 	ds->FreeDrawingSurfaceInfo(dsi);
136 	/* Unlock the drawing surface */
137 	ds->Unlock(ds);
138 	/* Free the drawing surface */
139 	awt.FreeDrawingSurface(ds);
140 
141     /* Register own window procedure
142        Do it one times only! Otherwhise
143        multiple instances will be registered
144        and calls on such construct produce
145        a stack overflow.
146      */
147     if (GetProp( hWnd, OLD_PROC_KEY )==0)
148     {
149         hFuncPtr = SetWindowLong( hWnd, GWL_WNDPROC, (DWORD)OpenOfficeWndProc );
150         SetProp( hWnd, OLD_PROC_KEY, (HANDLE)hFuncPtr );
151     }
152 
153 	return ((jlong)hWnd);
154 }
155 
156 
OpenOfficeWndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)157 static LRESULT APIENTRY OpenOfficeWndProc(
158 	HWND hWnd,
159 	UINT uMsg,
160 	WPARAM wParam,
161 	LPARAM lParam)
162 {
163     switch(uMsg)
164     {
165 		case WM_PARENTNOTIFY: {
166 			if (wParam == WM_CREATE) {
167 				RECT rect;
168 				HWND hChild = (HWND) lParam;
169 
170 				GetClientRect(hWnd, &rect);
171 
172 				SetWindowPos(hChild,
173 							 NULL,
174 							 rect.left,
175 							 rect.top,
176 							 rect.right - rect.left,
177 							 rect.bottom - rect.top,
178 							 SWP_NOZORDER);
179 			}
180 			break;
181 		}
182 		case WM_SIZE: {
183 			WORD newHeight = HIWORD(lParam);
184 			WORD newWidth = LOWORD(lParam);
185 			HWND hChild = GetWindow(hWnd, GW_CHILD);
186 
187 			if (hChild != NULL) {
188 				SetWindowPos(hChild, NULL, 0, 0, newWidth, newHeight, SWP_NOZORDER);
189 			}
190 			break;
191 		}
192     }
193 
194 #if defined _MSC_VER
195 #pragma warning(push)
196 #pragma warning(disable: 4152) /* function/data pointer conversion: */
197 #endif
198 	return CallWindowProc(GetProp(hWnd, OLD_PROC_KEY),
199 						  hWnd, uMsg, wParam, lParam);
200 #if defined _MSC_VER
201 #pragma warning(pop)
202 #endif
203 }
204 
205 
206 
207 
208 
209 
210 
211 
212 
213 
214