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*)GetWindowLongPtr(hWnd, GWLP_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         // SetWindowLongPtr(hWnd, GWLP_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 }
258