xref: /trunk/main/bean/native/win32/com_sun_star_comp_beans_LocalOfficeWindow.c (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 #if defined _MSC_VER
29 #pragma warning(push, 1)
30 #endif
31 #include <windows.h>
32 #if defined _MSC_VER
33 #pragma warning(pop)
34 #endif
35 
36 #include "jawt.h"
37 
38 #if defined _MSC_VER
39 #pragma warning(push, 1)
40 #endif
41 #include "jawt_md.h"
42 #if defined _MSC_VER
43 #pragma warning(pop)
44 #endif
45 
46 #define SYSTEM_WIN32   1
47 #define SYSTEM_WIN16   2
48 #define SYSTEM_JAVA    3
49 #define SYSTEM_OS2     4
50 #define SYSTEM_MAC     5
51 #define SYSTEM_XWINDOW 6
52 
53 #define OLD_PROC_KEY "oldwindowproc"
54 
55 static LRESULT APIENTRY OpenOfficeWndProc( HWND , UINT , WPARAM , LPARAM );
56 
57 
58 
59 /* type must be something like java/lang/RuntimeException
60  */
61 static void ThrowException(JNIEnv * env, char const * type, char const * msg) {
62     jclass c;
63     (*env)->ExceptionClear(env);
64     c = (*env)->FindClass(env, type);
65     if (c == NULL) {
66         (*env)->ExceptionClear(env);
67         (*env)->FatalError(
68             env, "JNI FindClass failed");
69     }
70     if ((*env)->ThrowNew(env, c, msg) != 0) {
71         (*env)->ExceptionClear(env);
72         (*env)->FatalError(env, "JNI ThrowNew failed");
73     }
74 }
75 
76 
77 /*****************************************************************************/
78 /*
79  * Class:     com_sun_star_comp_beans_LocalOfficeWindow
80  * Method:    getNativeWindowSystemType
81  * Signature: ()I
82  */
83 JNIEXPORT jint JNICALL Java_com_sun_star_comp_beans_LocalOfficeWindow_getNativeWindowSystemType
84   (JNIEnv * env, jobject obj_this)
85 {
86     (void) env; // unused
87     (void) obj_this; // unused
88     return (SYSTEM_WIN32);
89 }
90 
91 
92 /*****************************************************************************/
93 /*
94  * Class:     com_sun_star_comp_beans_LocalOfficeWindow
95  * Method:    getNativeWindow
96  * Signature: ()J
97  */
98 JNIEXPORT jlong JNICALL Java_com_sun_star_comp_beans_LocalOfficeWindow_getNativeWindow
99   (JNIEnv * env, jobject obj_this)
100 {
101     jboolean result;
102     jint lock;
103 
104     JAWT awt;
105     JAWT_DrawingSurface* ds;
106     JAWT_DrawingSurfaceInfo* dsi;
107     JAWT_Win32DrawingSurfaceInfo* dsi_win;
108     HDC hdc;
109     HWND hWnd;
110     LONG hFuncPtr;
111 
112     /* Get the AWT */
113     awt.version = JAWT_VERSION_1_3;
114     result = JAWT_GetAWT(env, &awt);
115     if (result == JNI_FALSE)
116         ThrowException(env, "java/lang/RuntimeException", "JAWT_GetAWT failed");
117 
118                                 /* Get the drawing surface */
119     if ((ds = awt.GetDrawingSurface(env, obj_this)) == NULL)
120         return 0L;
121 
122     /* Lock the drawing surface */
123     lock = ds->Lock(ds);
124     if ( (lock & JAWT_LOCK_ERROR) != 0)
125         ThrowException(env, "java/lang/RuntimeException",
126                        "Could not get AWT drawing surface.");
127 
128     /* Get the drawing surface info */
129     dsi = ds->GetDrawingSurfaceInfo(ds);
130 
131     /* Get the platform-specific drawing info */
132     dsi_win = (JAWT_Win32DrawingSurfaceInfo*)dsi->platformInfo;
133 
134     hdc = dsi_win->hdc;
135 
136     hWnd = dsi_win->hwnd;
137 
138     /* Free the drawing surface info */
139     ds->FreeDrawingSurfaceInfo(dsi);
140     /* Unlock the drawing surface */
141     ds->Unlock(ds);
142     /* Free the drawing surface */
143     awt.FreeDrawingSurface(ds);
144 
145     /* Register own window procedure
146        Do it one times only! Otherwhise
147        multiple instances will be registered
148        and calls on such construct produce
149        a stack overflow.
150      */
151     if (GetProp( hWnd, OLD_PROC_KEY )==0)
152     {
153         hFuncPtr = SetWindowLong( hWnd, GWL_WNDPROC, (DWORD)OpenOfficeWndProc );
154         SetProp( hWnd, OLD_PROC_KEY, (HANDLE)hFuncPtr );
155     }
156 
157     return ((jlong)hWnd);
158 }
159 
160 
161 static LRESULT APIENTRY OpenOfficeWndProc(
162     HWND hWnd,
163     UINT uMsg,
164     WPARAM wParam,
165     LPARAM lParam)
166 {
167     switch(uMsg)
168     {
169         case WM_PARENTNOTIFY: {
170             if (wParam == WM_CREATE) {
171                 RECT rect;
172                 HWND hChild = (HWND) lParam;
173 
174                 GetClientRect(hWnd, &rect);
175 
176                 SetWindowPos(hChild,
177                              NULL,
178                              rect.left,
179                              rect.top,
180                              rect.right - rect.left,
181                              rect.bottom - rect.top,
182                              SWP_NOZORDER);
183             }
184             break;
185         }
186         case WM_SIZE: {
187             WORD newHeight = HIWORD(lParam);
188             WORD newWidth = LOWORD(lParam);
189             HWND hChild = GetWindow(hWnd, GW_CHILD);
190 
191             if (hChild != NULL) {
192                 SetWindowPos(hChild, NULL, 0, 0, newWidth, newHeight, SWP_NOZORDER);
193             }
194             break;
195         }
196     }
197 
198 #if defined _MSC_VER
199 #pragma warning(push)
200 #pragma warning(disable: 4152) /* function/data pointer conversion: */
201 #endif
202     return CallWindowProc(GetProp(hWnd, OLD_PROC_KEY),
203                           hWnd, uMsg, wParam, lParam);
204 #if defined _MSC_VER
205 #pragma warning(pop)
206 #endif
207 }
208 
209 
210 
211 
212 
213 
214 
215 
216 
217 
218