[SHELL32] Update German translation
[reactos.git] / rosapps / templates / mdi / childwnd.c
1 /*
2 * ReactOS Application MDI Child Window
3 *
4 * childwnd.c
5 *
6 * Copyright (C) 2002 Robert Dickenson <robd@reactos.org>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 */
22
23 #ifdef _MSC_VER
24 #include "stdafx.h"
25 #else
26 #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
27 #include <windows.h>
28 #include <commctrl.h>
29 #include <stdlib.h>
30 #include <malloc.h>
31 #include <memory.h>
32 #include <tchar.h>
33 #include <process.h>
34 #include <stdio.h>
35 #endif
36
37 #include <assert.h>
38 #define ASSERT assert
39
40 #include "main.h"
41 #include "childwnd.h"
42
43 ////////////////////////////////////////////////////////////////////////////////
44
45 static void draw_splitbar(HWND hWnd, int x)
46 {
47 RECT rt;
48 HDC hdc = GetDC(hWnd);
49
50 GetClientRect(hWnd, &rt);
51 rt.left = x - SPLIT_WIDTH/2;
52 rt.right = x + SPLIT_WIDTH/2+1;
53 InvertRect(hdc, &rt);
54 ReleaseDC(hWnd, hdc);
55 }
56
57 static void OnPaint(HWND hWnd, ChildWnd* pChildWnd)
58 {
59 PAINTSTRUCT ps;
60 RECT rt;
61 GetClientRect(hWnd, &rt);
62 BeginPaint(hWnd, &ps);
63
64 // lastBrush = SelectObject(ps.hdc, (HBRUSH)GetStockObject(WHITE_BRUSH));
65 // Rectangle(ps.hdc, rt.left, rt.top-1, rt.right, rt.bottom+1);
66 // SelectObject(ps.hdc, lastBrush);
67 // rt.top = rt.bottom - GetSystemMetrics(SM_CYHSCROLL);
68 FillRect(ps.hdc, &rt, GetStockObject(BLACK_BRUSH));
69 /*
70 rt.left = pChildWnd->nSplitPos-SPLIT_WIDTH/2;
71 rt.right = pChildWnd->nSplitPos+SPLIT_WIDTH/2+1;
72 lastBrush = SelectBrush(ps.hdc, (HBRUSH)GetStockObject(COLOR_SPLITBAR));
73 Rectangle(ps.hdc, rt.left, rt.top-1, rt.right, rt.bottom+1);
74 SelectObject(ps.hdc, lastBrush);
75 #ifdef _NO_EXTENSIONS
76 rt.top = rt.bottom - GetSystemMetrics(SM_CYHSCROLL);
77 FillRect(ps.hdc, &rt, GetStockObject(BLACK_BRUSH));
78 #endif
79 */
80 EndPaint(hWnd, &ps);
81 }
82
83
84 static void OnSize(ChildWnd* pChildWnd, WPARAM wParam, LPARAM lParam)
85 {
86 if (wParam != SIZE_MINIMIZED) {
87 //resize_tree(pChildWnd, LOWORD(lParam), HIWORD(lParam));
88 }
89 }
90
91 //
92 // FUNCTION: ChildWndProc(HWND, unsigned, WORD, LONG)
93 //
94 // PURPOSE: Processes messages for the child windows.
95 //
96 // WM_COMMAND - process the application menu
97 // WM_PAINT - Paint the main window
98 // WM_DESTROY - post a quit message and return
99 //
100 //
101 LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
102 {
103 static int last_split;
104 ChildWnd* pChildWnd = (ChildWnd*)GetWindowLong(hWnd, GWL_USERDATA);
105 ASSERT(pChildWnd);
106
107 switch(message) {
108 case WM_CREATE:
109 return 0;
110
111 case WM_MDIACTIVATE: // set an alternate menu here
112 if (lParam == (LPARAM)hWnd) {
113 } else {
114 }
115 DrawMenuBar(hFrameWnd);
116 // return 0;
117 break;
118
119 case WM_PAINT:
120 OnPaint(hWnd, pChildWnd);
121 return 0;
122
123 case WM_NCDESTROY:
124 // SetWindowLong(hWnd, GWL_USERDATA, 0);
125 break;
126
127 case WM_SETCURSOR:
128 if (LOWORD(lParam) == HTCLIENT) {
129 POINT pt;
130 GetCursorPos(&pt);
131 ScreenToClient(hWnd, &pt);
132
133 if (pt.x>=pChildWnd->nSplitPos-SPLIT_WIDTH/2 && pt.x<pChildWnd->nSplitPos+SPLIT_WIDTH/2+1) {
134 SetCursor(LoadCursor(0, IDC_SIZEWE));
135 return TRUE;
136 }
137 }
138 //goto def;
139 break;
140
141 case WM_LBUTTONDOWN: {
142 RECT rt;
143 int x = LOWORD(lParam);
144 GetClientRect(hWnd, &rt);
145 if (x>=pChildWnd->nSplitPos-SPLIT_WIDTH/2 && x<pChildWnd->nSplitPos+SPLIT_WIDTH/2+1) {
146 last_split = pChildWnd->nSplitPos;
147 #ifdef _NO_EXTENSIONS
148 draw_splitbar(hWnd, last_split);
149 #endif
150 SetCapture(hWnd);
151 }
152 break;}
153
154 case WM_LBUTTONUP:
155 if (GetCapture() == hWnd) {
156 #ifdef _NO_EXTENSIONS
157 RECT rt;
158 int x = LOWORD(lParam);
159 draw_splitbar(hWnd, last_split);
160 last_split = -1;
161 GetClientRect(hWnd, &rt);
162 pChildWnd->nSplitPos = x;
163 //resize_tree(pChildWnd, rt.right, rt.bottom);
164 #endif
165 ReleaseCapture();
166 }
167 break;
168
169 #ifdef _NO_EXTENSIONS
170 case WM_CAPTURECHANGED:
171 if (GetCapture()==hWnd && last_split>=0)
172 draw_splitbar(hWnd, last_split);
173 break;
174 #endif
175 case WM_KEYDOWN:
176 if (wParam == VK_ESCAPE)
177 if (GetCapture() == hWnd) {
178 RECT rt;
179 #ifdef _NO_EXTENSIONS
180 draw_splitbar(hWnd, last_split);
181 #else
182 pChildWnd->nSplitPos = last_split;
183 #endif
184 GetClientRect(hWnd, &rt);
185 //resize_tree(pChildWnd, rt.right, rt.bottom);
186 last_split = -1;
187 ReleaseCapture();
188 SetCursor(LoadCursor(0, IDC_ARROW));
189 }
190 break;
191
192 case WM_MOUSEMOVE:
193 if (GetCapture() == hWnd) {
194 RECT rt;
195 int x = LOWORD(lParam);
196 #ifdef _NO_EXTENSIONS
197 HDC hdc = GetDC(hWnd);
198 GetClientRect(hWnd, &rt);
199 rt.left = last_split-SPLIT_WIDTH/2;
200 rt.right = last_split+SPLIT_WIDTH/2+1;
201 InvertRect(hdc, &rt);
202 last_split = x;
203 rt.left = x-SPLIT_WIDTH/2;
204 rt.right = x+SPLIT_WIDTH/2+1;
205 InvertRect(hdc, &rt);
206 ReleaseDC(hWnd, hdc);
207 #else
208 GetClientRect(hWnd, &rt);
209 if (x>=0 && x<rt.right) {
210 pChildWnd->nSplitPos = x;
211 resize_tree(pChildWnd, rt.right, rt.bottom);
212 rt.left = x-SPLIT_WIDTH/2;
213 rt.right = x+SPLIT_WIDTH/2+1;
214 InvalidateRect(hWnd, &rt, FALSE);
215 UpdateWindow(pChildWnd->left.hWnd);
216 UpdateWindow(hWnd);
217 UpdateWindow(pChildWnd->right.hWnd);
218 }
219 #endif
220 }
221 break;
222
223 #ifndef _NO_EXTENSIONS
224 case WM_GETMINMAXINFO:
225 DefMDIChildProc(hWnd, message, wParam, lParam);
226 {LPMINMAXINFO lpmmi = (LPMINMAXINFO)lParam;
227 lpmmi->ptMaxTrackSize.x <<= 1;//2*GetSystemMetrics(SM_CXSCREEN) / SM_CXVIRTUALSCREEN
228 lpmmi->ptMaxTrackSize.y <<= 1;//2*GetSystemMetrics(SM_CYSCREEN) / SM_CYVIRTUALSCREEN
229 break;}
230 #endif
231
232 case WM_SETFOCUS:
233 SetCurrentDirectory(pChildWnd->szPath);
234 SetFocus(pChildWnd->nFocusPanel? pChildWnd->hRightWnd: pChildWnd->hLeftWnd);
235 break;
236 /*
237 case WM_COMMAND:
238 pane = GetFocus()==pChildWnd->left.hWnd? &pChildWnd->left: &pChildWnd->right;
239 switch(LOWORD(wParam)) {
240 case ID_WINDOW_NEW_WINDOW:
241 return 0;
242 default:
243 return pane_command(pane, LOWORD(wParam));
244 break;
245 }
246 break;
247 */
248 case WM_SIZE:
249 if (wParam != SIZE_MINIMIZED) {
250 OnSize(pChildWnd, wParam, lParam);
251 }
252 // fall through
253 // default: def:
254 return DefMDIChildProc(hWnd, message, wParam, lParam);
255 }
256 return DefMDIChildProc(hWnd, message, wParam, lParam);
257 }