xref: /AOO41X/main/bean/native/win32/com_sun_star_comp_beans_LocalOfficeWindow.c (revision 9478c1a8c809f638c9fa3416d5dd33249e1ccdce)
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