[SERVICES]
[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 if (1) {
108 switch(message) {
109 case WM_CREATE:
110 return 0;
111
112 case WM_MDIACTIVATE: // set an alternate menu here
113 if (lParam == (LPARAM)hWnd) {
114 } else {
115 }
116 DrawMenuBar(hFrameWnd);
117 // return 0;
118 break;
119
120 case WM_PAINT:
121 OnPaint(hWnd, pChildWnd);
122 return 0;
123
124 case WM_NCDESTROY:
125 //SetWindowLong(hWnd, GWL_USERDATA, 0);
126 break;
127
128 case WM_SETCURSOR:
129 if (LOWORD(lParam) == HTCLIENT) {
130 POINT pt;
131 GetCursorPos(&pt);
132 ScreenToClient(hWnd, &pt);
133
134 if (pt.x>=pChildWnd->nSplitPos-SPLIT_WIDTH/2 && pt.x<pChildWnd->nSplitPos+SPLIT_WIDTH/2+1) {
135 SetCursor(LoadCursor(0, IDC_SIZEWE));
136 return TRUE;
137 }
138 }
139 //goto def;
140 break;
141
142 case WM_LBUTTONDOWN: {
143 RECT rt;
144 int x = LOWORD(lParam);
145 GetClientRect(hWnd, &rt);
146 if (x>=pChildWnd->nSplitPos-SPLIT_WIDTH/2 && x<pChildWnd->nSplitPos+SPLIT_WIDTH/2+1) {
147 last_split = pChildWnd->nSplitPos;
148 #ifdef _NO_EXTENSIONS
149 draw_splitbar(hWnd, last_split);
150 #endif
151 SetCapture(hWnd);
152 }
153 break;}
154
155 case WM_LBUTTONUP:
156 if (GetCapture() == hWnd) {
157 #ifdef _NO_EXTENSIONS
158 RECT rt;
159 int x = LOWORD(lParam);
160 draw_splitbar(hWnd, last_split);
161 last_split = -1;
162 GetClientRect(hWnd, &rt);
163 pChildWnd->nSplitPos = x;
164 //resize_tree(pChildWnd, rt.right, rt.bottom);
165 #endif
166 ReleaseCapture();
167 }
168 break;
169
170 #ifdef _NO_EXTENSIONS
171 case WM_CAPTURECHANGED:
172 if (GetCapture()==hWnd && last_split>=0)
173 draw_splitbar(hWnd, last_split);
174 break;
175 #endif
176 case WM_KEYDOWN:
177 if (wParam == VK_ESCAPE)
178 if (GetCapture() == hWnd) {
179 RECT rt;
180 #ifdef _NO_EXTENSIONS
181 draw_splitbar(hWnd, last_split);
182 #else
183 pChildWnd->nSplitPos = last_split;
184 #endif
185 GetClientRect(hWnd, &rt);
186 //resize_tree(pChildWnd, rt.right, rt.bottom);
187 last_split = -1;
188 ReleaseCapture();
189 SetCursor(LoadCursor(0, IDC_ARROW));
190 }
191 break;
192
193 case WM_MOUSEMOVE:
194 if (GetCapture() == hWnd) {
195 RECT rt;
196 int x = LOWORD(lParam);
197 #ifdef _NO_EXTENSIONS
198 HDC hdc = GetDC(hWnd);
199 GetClientRect(hWnd, &rt);
200 rt.left = last_split-SPLIT_WIDTH/2;
201 rt.right = last_split+SPLIT_WIDTH/2+1;
202 InvertRect(hdc, &rt);
203 last_split = x;
204 rt.left = x-SPLIT_WIDTH/2;
205 rt.right = x+SPLIT_WIDTH/2+1;
206 InvertRect(hdc, &rt);
207 ReleaseDC(hWnd, hdc);
208 #else
209 GetClientRect(hWnd, &rt);
210 if (x>=0 && x<rt.right) {
211 pChildWnd->nSplitPos = x;
212 resize_tree(pChildWnd, rt.right, rt.bottom);
213 rt.left = x-SPLIT_WIDTH/2;
214 rt.right = x+SPLIT_WIDTH/2+1;
215 InvalidateRect(hWnd, &rt, FALSE);
216 UpdateWindow(pChildWnd->left.hWnd);
217 UpdateWindow(hWnd);
218 UpdateWindow(pChildWnd->right.hWnd);
219 }
220 #endif
221 }
222 break;
223
224 #ifndef _NO_EXTENSIONS
225 case WM_GETMINMAXINFO:
226 DefMDIChildProc(hWnd, message, wParam, lParam);
227 {LPMINMAXINFO lpmmi = (LPMINMAXINFO)lParam;
228 lpmmi->ptMaxTrackSize.x <<= 1;//2*GetSystemMetrics(SM_CXSCREEN) / SM_CXVIRTUALSCREEN
229 lpmmi->ptMaxTrackSize.y <<= 1;//2*GetSystemMetrics(SM_CYSCREEN) / SM_CYVIRTUALSCREEN
230 break;}
231 #endif
232
233 case WM_SETFOCUS:
234 SetCurrentDirectory(pChildWnd->szPath);
235 SetFocus(pChildWnd->nFocusPanel? pChildWnd->hRightWnd: pChildWnd->hLeftWnd);
236 break;
237 /*
238 case WM_COMMAND:
239 pane = GetFocus()==pChildWnd->left.hWnd? &pChildWnd->left: &pChildWnd->right;
240 switch(LOWORD(wParam)) {
241 case ID_WINDOW_NEW_WINDOW:
242 return 0;
243 default:
244 return pane_command(pane, LOWORD(wParam));
245 break;
246 }
247 break;
248 */
249 case WM_SIZE:
250 if (wParam != SIZE_MINIMIZED) {
251 OnSize(pChildWnd, wParam, lParam);
252 }
253 // fall through
254 default: def:
255 return DefMDIChildProc(hWnd, message, wParam, lParam);
256 }
257 return DefMDIChildProc(hWnd, message, wParam, lParam);
258 }