source: trunk/dll/mainwnd2.c@ 1140

Last change on this file since 1140 was 1140, checked in by Gregg Young, 17 years ago

Comments added for recent changes

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 38.3 KB
Line 
1
2/***********************************************************************
3
4 $Id: mainwnd2.c 1140 2008-09-01 19:52:06Z gyoung $
5
6 fm/4 main window
7
8 Copyright (c) 1993-98 M. Kimes
9 Copyright (c) 2005, 2008 Steven H. Levine
10
11 23 May 05 SHL Use datamin.h
12 26 May 05 SHL Comments and localize code
13 06 Aug 05 SHL Renames
14 02 Jan 06 SHL Use QWL_USER more
15 02 Jan 06 SHL Map IDM_WINDOWDLG to match IBM_TWODIRS
16 17 Jul 06 SHL Use Runtime_Error
17 30 Mar 07 GKY Remove GetPString for window class names
18 12 May 07 SHL Pass ulItemsToUnHilite to UnHilite
19 06 Aug 07 GKY Reduce DosSleep times (ticket 148)
20 07 Aug 07 SHL Use BldQuotedFileName
21 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
22 10 Jan 08 SHL Sync with CfgDlgProc mods
23 19 Jan 08 GKY Rework Utilities menu
24 14 Feb 08 SHL Rework to support settings menu conditional cascade
25 29 Feb 08 GKY Use xfree where appropriate
26 27 Aug 08 JBS Ticket 259: Support saving/restoring toolbars with states
27 01 Sep 08 GKY Add bmps for default toolbars
28
29***********************************************************************/
30
31#include <stdlib.h>
32#include <string.h>
33#include <share.h>
34#include <process.h> // _beginthread
35
36#define INCL_DOS
37#define INCL_WIN
38#define INCL_GPI
39#define INCL_LONGLONG
40
41#include "fm3dlg.h"
42#include "fm3str.h"
43#include "tools.h"
44#include "datamin.h"
45#include "comp.h" // COMPARE
46#include "pathutil.h" // BldQuotedFileName
47#include "errutil.h" // Dos_Error...
48#include "strutil.h" // GetPString
49#include "notebook.h" // CfgDlgProc
50#include "command.h" // RunCommand
51#include "fm3dll.h"
52#include "fortify.h"
53
54typedef struct
55{
56 USHORT size;
57 USHORT dummy;
58 HWND hwndDir1;
59 HWND hwndDir2;
60 HWND hwndCurr;
61 HWND hwndLastDir;
62 HWND hwndMax;
63}
64PERSON1DATA;
65
66static PSZ pszSrcFile = __FILE__;
67
68static MRESULT EXPENTRY MainFrameWndProc2(HWND hwnd, ULONG msg, MPARAM mp1,
69 MPARAM mp2)
70{
71 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
72
73 switch (msg) {
74 case WM_ADJUSTWINDOWPOS:
75 {
76 SWP *pswp;
77
78 pswp = (SWP *) mp1;
79 if (pswp->fl & (SWP_SHOW | SWP_RESTORE))
80 PostMsg(WinWindowFromID(hwnd, FID_CLIENT), UM_SIZE, MPVOID, MPVOID);
81 if (fDataMin && !fAmClosing) {
82 if (pswp->fl & (SWP_HIDE | SWP_MINIMIZE)) {
83
84 SWP swp;
85
86 WinQueryWindowPos(hwnd, &swp);
87 PostMsg(hwnd, UM_FOCUSME, MPFROMLONG(swp.fl), MPVOID);
88 HideNote();
89 }
90 else if (pswp->fl & (SWP_SHOW | SWP_RESTORE)) {
91 if (DataHwnd)
92 PostMsg(DataHwnd, WM_CLOSE, MPVOID, MPVOID);
93 }
94 }
95 if (!fAmClosing) {
96 if (pswp->fl & (SWP_HIDE | SWP_MINIMIZE))
97 HideNote();
98 }
99 }
100 break;
101
102 case UM_FOCUSME:
103 CreateDataBar(HWND_DESKTOP, (ULONG) mp1);
104 return 0;
105
106 case WM_BUTTON1UP:
107 case WM_BUTTON2UP:
108 case WM_BUTTON3UP:
109 case WM_MOUSEMOVE:
110 case WM_CHORD:
111 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
112 break;
113
114 case WM_CHAR:
115 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
116 break;
117
118 case WM_CONTROL:
119 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), UM_CONTROL, mp1,
120 mp2);
121
122 case WM_COMMAND:
123 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
124
125 case WM_CALCFRAMERECT:
126 {
127 MRESULT mr;
128 PRECTL prectl;
129 LONG sheight = 20, bheight = 20;
130
131 mr = (oldproc) ? oldproc(hwnd, msg, mp1, mp2) :
132 PFNWPFrame(hwnd, msg, mp1, mp2);
133
134 /*
135 * Calculate the position of the client rectangle.
136 * Otherwise, we'll see a lot of redraw when we move the
137 * client during WM_FORMATFRAME.
138 */
139
140 if (mr && mp2) {
141 prectl = (PRECTL) mp1;
142 if (prectl->yBottom != prectl->yTop) {
143 {
144 HPS hps;
145 POINTL aptl[TXTBOX_COUNT];
146
147 hps = WinGetPS(hwndStatus);
148 GpiQueryTextBox(hps, 6, "$`WjgT", TXTBOX_COUNT, aptl);
149 WinReleasePS(hps);
150 sheight = aptl[TXTBOX_TOPLEFT].y + 6;
151 hps = WinGetPS(hwndName);
152 GpiQueryTextBox(hps, 6, "$`WjgT", TXTBOX_COUNT, aptl);
153 WinReleasePS(hps);
154 bheight = aptl[TXTBOX_TOPLEFT].y + 6;
155 }
156 prectl->yBottom += (sheight + 4);
157 prectl->yTop -= (sheight + 4);
158 prectl->yBottom += (bheight + 4);
159 prectl->yTop -= (bheight + 4);
160 if (fToolbar) {
161 if (!fTextTools)
162 prectl->yTop -= ((fToolTitles) ? 50 : 40);
163 else
164 prectl->yTop -= 32;
165 }
166 ResizeDrives(WinWindowFromID(hwnd, MAIN_DRIVES),
167 ((prectl->xRight -
168 (WinQuerySysValue(HWND_DESKTOP,
169 SV_CYSIZEBORDER) * 2)) - 4));
170 prectl->yTop -= (16 * (DriveLines * 18));
171 prectl->yTop -= 2;
172 if (fAutoView) {
173 AutoviewHeight = min(AutoviewHeight,
174 (prectl->yTop - prectl->yBottom) - 116);
175 AutoviewHeight = max(AutoviewHeight, 36);
176 prectl->yBottom += (AutoviewHeight + 6);
177 }
178 }
179 }
180 return mr;
181 }
182
183 case WM_FORMATFRAME:
184 {
185 SHORT sCount, soldCount;
186 PSWP pswp, pswpClient, pswpNew;
187 SWP swpClient;
188 ULONG theight = 48L, dheight = 20, bheight = 20, sheight = 20;
189 LONG width, lastx;
190
191 sCount = (SHORT) ((oldproc) ? oldproc(hwnd, msg, mp1, mp2) :
192 PFNWPFrame(hwnd, msg, mp1, mp2));
193 soldCount = sCount;
194 /*
195 * Reformat the frame to "squeeze" the client
196 * and make room for status window sibling beneath
197 * and toolbar above (if toolbar's on) and userlists
198 * (if userlists are on).
199 */
200
201 pswp = (PSWP) mp1;
202 {
203 SHORT x;
204
205 for (x = 0; x < sCount; x++) {
206 if (WinQueryWindowUShort(pswp->hwnd, QWS_ID) == FID_CLIENT) {
207 pswpClient = pswp;
208 break;
209 }
210 pswp++;
211 }
212 }
213
214 {
215 HPS hps;
216 POINTL aptl[TXTBOX_COUNT];
217
218 hps = WinGetPS(hwndStatus);
219 GpiQueryTextBox(hps, 6, "$`WjgT", TXTBOX_COUNT, aptl);
220 WinReleasePS(hps);
221 bheight = sheight = aptl[TXTBOX_TOPLEFT].y + 6;
222 hps = WinGetPS(hwndName);
223 GpiQueryTextBox(hps, 6, "$`WjgT", TXTBOX_COUNT, aptl);
224 WinReleasePS(hps);
225 bheight = aptl[TXTBOX_TOPLEFT].y + 6;
226 }
227
228 pswpNew = (PSWP) mp1 + soldCount;
229 *pswpNew = *pswpClient;
230 swpClient = *pswpClient;
231 pswpNew->hwnd = hwndStatus;
232 pswpNew->x = swpClient.x + 3;
233 pswpNew->y = swpClient.y + 2;
234 width = (swpClient.cx / 2) - 6;
235 width = max(width, 10);
236 pswpNew->cx = width - 6;
237 pswpNew->cy = sheight;
238 pswpClient->y = pswpNew->y + pswpNew->cy + 3;
239 pswpClient->cy = (swpClient.cy - pswpNew->cy) - 3;
240 sCount++;
241
242 pswpNew = (PSWP) mp1 + (soldCount + 1);
243 *pswpNew = *pswpClient;
244 pswpNew->hwnd = hwndStatus2;
245 pswpNew->x = width + 8;
246 pswpNew->y = swpClient.y + 2;
247 pswpNew->cx = width - 6;
248 pswpNew->cy = sheight;
249 sCount++;
250
251 if (fToolbar) {
252 if (fTextTools)
253 theight = 32L;
254 else if (!fToolTitles)
255 theight = 40L;
256 pswpNew = (PSWP) mp1 + (soldCount + 2);
257 *pswpNew = *pswpClient;
258 pswpNew->hwnd = WinWindowFromID(hwnd, MAIN_TOOLS);
259 pswpNew->x = swpClient.x + 2;
260 pswpNew->y = (swpClient.y + swpClient.cy) - (theight - 2);
261 pswpNew->cx = swpClient.cx - 4;
262 pswpNew->cy = theight - 4;
263 pswpClient->cy -= theight;
264 sCount++;
265 }
266 else
267 WinShowWindow(WinWindowFromID(hwnd, MAIN_TOOLS), FALSE);
268
269 ResizeDrives(WinWindowFromID(hwnd, MAIN_DRIVES), pswpClient->cx - 4);
270 pswpNew = (PSWP) mp1 + (soldCount + 2 + (fToolbar != FALSE));
271 *pswpNew = *pswpClient;
272 pswpNew->hwnd = WinWindowFromID(hwnd, MAIN_DRIVES);
273 pswpNew->x = swpClient.x + 2;
274 dheight += ((dheight - 2) * DriveLines);
275 pswpNew->y = (swpClient.y + swpClient.cy) - (dheight - 2);
276 if (fToolbar)
277 pswpNew->y -= theight;
278 pswpNew->cx = swpClient.cx - 4;
279 pswpNew->cy = dheight - 4;
280 pswpClient->cy -= dheight;
281 pswpClient->cy -= 2;
282 sCount++;
283
284 if (fAutoView) {
285 pswpNew = (PSWP) mp1 + (soldCount + 3 + (fToolbar != FALSE));
286 *pswpNew = *pswpClient;
287 pswpNew->hwnd = (fComments) ? hwndAutoMLE : hwndAutoview;
288 pswpNew->x = pswpClient->x + 3;
289 pswpNew->y = pswpClient->y + 3;
290 if (fMoreButtons)
291 pswpNew->y += (bheight + 4);
292 pswpNew->cx = pswpClient->cx - 6;
293 AutoviewHeight = min(AutoviewHeight, pswpClient->cy - 116);
294 AutoviewHeight = max(AutoviewHeight, 36);
295 pswpNew->cy = AutoviewHeight;
296 pswpClient->y += (AutoviewHeight + 6);
297 pswpClient->cy -= (AutoviewHeight + 6);
298 sCount++;
299 WinShowWindow((fComments) ? hwndAutoview : hwndAutoMLE, FALSE);
300 }
301 else {
302 WinShowWindow(hwndAutoview, FALSE);
303 WinShowWindow(hwndAutoMLE, FALSE);
304 }
305
306 pswpNew = (PSWP) mp1 + (soldCount + 3 + (fToolbar != FALSE) +
307 (fAutoView != FALSE));
308 *pswpNew = *pswpClient;
309 pswpNew->hwnd = WinWindowFromID(hwnd, MAIN_LED);
310 pswpNew->x = (swpClient.x + swpClient.cx) - 12;
311 pswpNew->y = swpClient.y;
312 pswpNew->cx = 12;
313 pswpNew->cy = 12;
314 sCount++;
315
316 pswpNew = (PSWP) mp1 + (soldCount + 4 + (fToolbar != FALSE) +
317 (fAutoView != FALSE));
318 *pswpNew = *pswpClient;
319 pswpNew->hwnd = WinWindowFromID(hwnd, MAIN_LEDHDR);
320 pswpNew->x = (swpClient.x + swpClient.cx) - 12;
321 pswpNew->y = swpClient.y + 12;
322 pswpNew->cx = 12;
323 pswpNew->cy = sheight - 8;
324 sCount++;
325
326 pswpNew = (PSWP) mp1 + (soldCount + 5 + (fToolbar != FALSE) +
327 (fAutoView != FALSE));
328 *pswpNew = *pswpClient;
329 pswpNew->hwnd = hwndName;
330 pswpNew->x = swpClient.x + 3;
331 pswpNew->y = swpClient.y + (sheight + 6);
332 pswpNew->cx = ((swpClient.cx / 2) + (swpClient.cx / 5)) - 3;
333 lastx = pswpNew->x + pswpNew->cx;
334 pswpNew->cy = bheight;
335 pswpClient->y += (bheight + 4);
336 pswpClient->cy -= (bheight + 4);
337 sCount++;
338
339 pswpNew = (PSWP) mp1 + (soldCount + 6 + (fToolbar != FALSE) +
340 (fAutoView != FALSE));
341 *pswpNew = *pswpClient;
342 pswpNew->hwnd = hwndDate;
343 pswpNew->x = lastx + 3;
344 pswpNew->y = swpClient.y + (sheight + 6);
345 pswpNew->cx = (swpClient.cx / 6) + (swpClient.cx / 16) - 3;
346 lastx = pswpNew->x + pswpNew->cx;
347 pswpNew->cy = bheight;
348 sCount++;
349
350 pswpNew = (PSWP) mp1 + (soldCount + 7 + (fToolbar != FALSE) +
351 (fAutoView != FALSE));
352 *pswpNew = *pswpClient;
353 pswpNew->hwnd = hwndAttr;
354 pswpNew->x = lastx + 3;
355 pswpNew->y = swpClient.y + (sheight + 6);
356 pswpNew->cx = (swpClient.cx - pswpNew->x) - 1;
357 pswpNew->cy = bheight;
358 sCount++;
359
360 return MRFROMSHORT(sCount);
361 }
362
363 case WM_QUERYFRAMECTLCOUNT:
364 {
365 SHORT sCount;
366
367 sCount = (SHORT) ((oldproc) ? oldproc(hwnd, msg, mp1, mp2) :
368 PFNWPFrame(hwnd, msg, mp1, mp2));
369 sCount += 8;
370 if (fToolbar)
371 sCount++;
372 if (fAutoView)
373 sCount++;
374 return MRFROMSHORT(sCount);
375 }
376
377 case WM_CLOSE:
378 WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
379 return 0;
380 }
381 return (oldproc) ? oldproc(hwnd, msg, mp1, mp2) :
382 PFNWPFrame(hwnd, msg, mp1, mp2);
383}
384
385static MRESULT EXPENTRY MainWMCommand2(HWND hwnd, ULONG msg, MPARAM mp1,
386 MPARAM mp2)
387{
388 PERSON1DATA *pd;
389
390 SetShiftState();
391 switch (SHORT1FROMMP(mp1)) {
392 case IDM_TOAUTOMLE:
393 case IDM_CLI:
394 case IDM_CREATETOOL:
395 case IDM_ABOUT:
396 case IDM_WINFULLSCREEN:
397 case IDM_DOSCOMMANDLINE:
398 case IDM_INIVIEWER:
399 case IDM_EDITASSOC:
400 case IDM_COMMANDLINE:
401 case IDM_KILLPROC:
402 case IDM_TOOLBAR:
403 case IDM_TEXTTOOLS:
404 case IDM_TOOLTITLES:
405 case IDM_TOOLLEFT:
406 case IDM_TOOLRIGHT:
407 case IDM_AUTOVIEWCOMMENTS:
408 case IDM_AUTOVIEWFILE:
409 case IDM_AUTOVIEW:
410// case IDM_SYSINFO:
411 case IDM_HIDENOTEWND:
412 case IDM_SHOWNOTEWND:
413 case IDM_INSTANT:
414 case IDM_HELPCONTEXT:
415 case IDM_HELPHINTS:
416 case IDM_HELPPIX:
417 case IDM_KILLME:
418 case IDM_EXIT:
419 case IDM_HELPTUTOR:
420 case IDM_HELPCONTENTS:
421 case IDM_HELPGENERAL:
422 case IDM_HELPKEYS:
423 case IDM_HELPMOUSE:
424 case IDM_HELP:
425 return MainWMCommand(hwnd, msg, mp1, mp2);
426
427 case IDM_REMAP:
428 WinDlgBox(HWND_DESKTOP,
429 hwnd, RemapDlgProc, FM3ModHandle, MAP_FRAME, NULL);
430 break;
431
432 case IDM_TWODIRS: // Menu action
433 case IDM_WINDOWDLG: // Toolbar action
434 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
435 if (pd) {
436
437 WALK2 wa;
438
439 memset(&wa, 0, sizeof(wa));
440 wa.size = sizeof(wa);
441 *wa.szCurrentPath1 = 0;
442 WinSendMsg(pd->hwndDir1,
443 UM_CONTAINERDIR, MPFROMP(wa.szCurrentPath1), MPVOID);
444 MakeValidDir(wa.szCurrentPath1);
445 *wa.szCurrentPath2 = 0;
446 WinSendMsg(pd->hwndDir2,
447 UM_CONTAINERDIR, MPFROMP(wa.szCurrentPath2), MPVOID);
448 MakeValidDir(wa.szCurrentPath2);
449 if (WinDlgBox(HWND_DESKTOP,
450 hwnd,
451 WalkTwoSetDlgProc,
452 FM3ModHandle,
453 WALK2_FRAME,
454 MPFROMP(&wa)) &&
455 (IsRoot(wa.szCurrentPath1) ||
456 !IsFile(wa.szCurrentPath1)) &&
457 (IsRoot(wa.szCurrentPath2) || !IsFile(wa.szCurrentPath2))) {
458 WinSendMsg(WinWindowFromID(WinWindowFromID(pd->hwndDir1,
459 FID_CLIENT), DIR_CNR),
460 UM_SETDIR, MPFROMP(wa.szCurrentPath1), MPVOID);
461 WinSendMsg(WinWindowFromID(WinWindowFromID(pd->hwndDir2,
462 FID_CLIENT), DIR_CNR),
463 UM_SETDIR, MPFROMP(wa.szCurrentPath2), MPVOID);
464 }
465 }
466 break;
467
468 case IDM_COMPARE:
469 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
470 if (pd) {
471
472 WALK2 wa;
473
474 memset(&wa, 0, sizeof(wa));
475 wa.size = sizeof(wa);
476 *wa.szCurrentPath1 = 0;
477 WinSendMsg(pd->hwndDir1,
478 UM_CONTAINERDIR, MPFROMP(wa.szCurrentPath1), MPVOID);
479 MakeValidDir(wa.szCurrentPath1);
480 *wa.szCurrentPath2 = 0;
481 WinSendMsg(pd->hwndDir2,
482 UM_CONTAINERDIR, MPFROMP(wa.szCurrentPath2), MPVOID);
483 MakeValidDir(wa.szCurrentPath2);
484 if (WinDlgBox(HWND_DESKTOP,
485 hwnd,
486 WalkTwoCmpDlgProc,
487 FM3ModHandle,
488 WALK2_FRAME,
489 MPFROMP(&wa)) &&
490 (IsRoot(wa.szCurrentPath1) ||
491 !IsFile(wa.szCurrentPath1)) &&
492 (IsRoot(wa.szCurrentPath2) || !IsFile(wa.szCurrentPath2))) {
493 if (!*dircompare) {
494
495 COMPARE *cmp;
496
497 cmp = xmallocz(sizeof(COMPARE), pszSrcFile, __LINE__);
498 if (cmp) {
499 cmp->size = sizeof(COMPARE);
500 strcpy(cmp->leftdir, wa.szCurrentPath1);
501 strcpy(cmp->rightdir, wa.szCurrentPath2);
502 cmp->hwndParent = hwnd;
503 cmp->dcd.hwndParent = hwnd;
504 WinDlgBox(HWND_DESKTOP,
505 HWND_DESKTOP,
506 CompareDlgProc, FM3ModHandle, COMP_FRAME, MPFROMP(cmp));
507 }
508 }
509 else {
510 CHAR szPath1[CCHMAXPATH];
511 CHAR szPath2[CCHMAXPATH];
512 runemf2(SEPARATE,
513 HWND_DESKTOP, pszSrcFile, __LINE__,
514 NULL, NULL,
515 "%s %s %s",
516 dircompare,
517 BldQuotedFileName(szPath1, wa.szCurrentPath1),
518 BldQuotedFileName(szPath2, wa.szCurrentPath2));
519 }
520 }
521 }
522 break;
523
524 case IDM_VTREE:
525 WinSendMsg(hwnd, UM_SETUP2, MPFROMLONG(1), MPVOID);
526 if (hwndTree) {
527 WinShowWindow(hwndTree, FALSE);
528 PostMsg(hwndTree, WM_CLOSE, MPVOID, MPVOID);
529 hwndTree = (HWND) 0;
530 }
531 else {
532
533 ULONG size = sizeof(ULONG);
534
535 hwndTree = StartTreeCnr(hwnd, 3);
536 PrfQueryProfileData(fmprof,
537 realappname,
538 "FM/4 TreeWidth", (PVOID) & TreeWidth, &size);
539 TreeWidth = max(TreeWidth, 80);
540 }
541 {
542 BOOL dummy = (hwndTree != (HWND) 0);
543
544 PrfWriteProfileData(fmprof,
545 realappname,
546 "FM/4 TreeUp", (PVOID) & dummy, sizeof(dummy));
547 }
548 PostMsg(hwnd, UM_SIZE, MPVOID, MPVOID);
549 break;
550
551 case IDM_TILEBACKWARDS:
552 WinSendMsg(hwnd, UM_SETUP2, MPFROMLONG(1), MPVOID);
553 fTileBackwards = (fTileBackwards) ? FALSE : TRUE;
554 PrfWriteProfileData(fmprof,
555 FM3Str,
556 "TileBackwards",
557 (PVOID) & fTileBackwards, sizeof(BOOL));
558 PostMsg(hwnd, UM_SIZE, MPVOID, MPVOID);
559 break;
560
561 case IDM_NEXTWINDOW:
562 case IDM_PREVWINDOW:
563 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
564 if (pd) {
565
566 HWND hwndFocus;
567
568 if (hwndTree) {
569 if (pd->hwndMax) {
570 if (hwndTree == pd->hwndCurr)
571 hwndFocus = pd->hwndMax;
572 else
573 hwndFocus = hwndTree;
574 }
575 else {
576 if (hwndTree == pd->hwndCurr)
577 hwndFocus = (SHORT1FROMMP(mp1) == IDM_PREVWINDOW) ?
578 pd->hwndDir1 : pd->hwndDir2;
579 else if (pd->hwndDir1 == pd->hwndCurr)
580 hwndFocus = (SHORT1FROMMP(mp1) == IDM_PREVWINDOW) ?
581 pd->hwndDir2 : hwndTree;
582 else
583 hwndFocus = (SHORT1FROMMP(mp1) == IDM_PREVWINDOW) ?
584 hwndTree : pd->hwndDir1;
585 }
586 }
587 else {
588 if (pd->hwndMax)
589 hwndFocus = pd->hwndMax;
590 else
591 hwndFocus = pd->hwndCurr == pd->hwndDir1 ?
592 pd->hwndDir2 : pd->hwndDir1;
593 }
594 WinSetFocus(HWND_DESKTOP, hwndFocus);
595 }
596 break;
597
598 case IDM_NOTEBOOK:
599 case IDM_DIRCNRSETTINGS:
600 case IDM_DIRVIEWSETTINGS:
601 case IDM_DIRSORTSETTINGS:
602 case IDM_COLLECTORVIEWSETTINGS:
603 case IDM_COLLECTORSORTSETTINGS:
604 case IDM_ARCHIVERSETTINGS:
605 case IDM_TREECNRVIEWSETTINGS:
606 case IDM_TREECNRSORTSETTINGS:
607 case IDM_VIEWERSETTINGS:
608 case IDM_VIEWERSETTINGS2:
609 case IDM_COMPARESETTINGS:
610 case IDM_MONOLITHICSETTINGS:
611 case IDM_GENERALSETTINGS:
612 case IDM_SCANSETTINGS:
613 case IDM_BUBBLESSETTINGS:
614 WinDlgBox(HWND_DESKTOP,
615 hwnd,
616 CfgDlgProc,
617 FM3ModHandle,
618 CFG_FRAME,
619 MPFROMLONG(mp1)); // 15 Feb 08 SHL
620 PostMsg(hwnd, UM_SIZE, MPVOID, MPVOID);
621 break;
622
623 case IDM_SEEALL:
624 case IDM_GREP:
625 case IDM_COLLECTOR:
626 {
627 HWND hwndC;
628
629 hwndC = StartCollector(HWND_DESKTOP, 4);
630 if (hwndC) {
631 WinSetWindowPos(hwndC,
632 HWND_TOP,
633 0, 0, 0, 0, SWP_SHOW | SWP_RESTORE | SWP_ACTIVATE);
634 if (SHORT1FROMMP(mp1) == IDM_GREP)
635 PostMsg(WinWindowFromID(hwndC, FID_CLIENT),
636 WM_COMMAND, MPFROM2SHORT(IDM_GREP, 0), MPVOID);
637 if (SHORT1FROMMP(mp1) == IDM_SEEALL)
638 PostMsg(WinWindowFromID(hwndC, FID_CLIENT),
639 WM_COMMAND, MPFROM2SHORT(IDM_SEEALL, 0), MPVOID);
640 }
641 }
642 break;
643
644 case IDM_EDITCOMMANDS:
645 EditCommands(hwnd);
646 break;
647
648 default:
649 if (SHORT1FROMMP(mp1) >= IDM_SWITCHSTART &&
650 SHORT1FROMMP(mp1) < IDM_SWITCHSTART + 499) {
651 if (SHORT1FROMMP(mp1) - IDM_SWITCHSTART < numswitches)
652 WinSwitchToProgram(switches[SHORT1FROMMP(mp1) - IDM_SWITCHSTART]);
653 break;
654 }
655 else if (SHORT1FROMMP(mp1) >= IDM_COMMANDSTART &&
656 SHORT1FROMMP(mp1) < IDM_QUICKTOOLSTART) {
657
658 INT x;
659 HWND hwndCnr;
660
661 if (!cmdloaded)
662 load_commands();
663 hwndCnr = TopWindow(hwnd, (HWND) 0);
664 hwndCnr = (HWND) WinSendMsg(WinWindowFromID(hwndCnr, FID_CLIENT),
665 UM_CONTAINERHWND, MPVOID, MPVOID);
666 if (!hwndCnr) {
667 Runtime_Error2(pszSrcFile, __LINE__, IDS_NOWINDOWTEXT);
668 break;
669 }
670 x = SHORT1FROMMP(mp1) - IDM_COMMANDSTART;
671 if (x >= 0) {
672 x++;
673 RunCommand(hwndCnr, x);
674 if (fUnHilite) {
675
676 PCNRITEM pci;
677 DIRCNRDATA *dcd = NULL;
678
679 if (WinQueryWindowUShort(hwndCnr, QWS_ID) != TREE_CNR)
680 dcd = INSTDATA(hwndCnr);
681 pci = (PCNRITEM) WinSendMsg(hwndCnr,
682 CM_QUERYRECORDEMPHASIS,
683 MPFROMLONG(CMA_FIRST),
684 MPFROMSHORT(CRA_CURSORED));
685 if (pci && (INT) pci != -1 && (pci->rc.flRecordAttr & CRA_SELECTED)) {
686 UnHilite(hwnd,
687 TRUE,
688 dcd ? &dcd->lastselection : NULL,
689 dcd ? dcd->ulItemsToUnHilite : 0);
690 }
691 }
692 }
693 }
694 else if (SHORT1FROMMP(mp1) >= IDM_QUICKTOOLSTART &&
695 SHORT1FROMMP(mp1) < IDM_QUICKTOOLSTART + 51) {
696 if (!qtloaded)
697 load_quicktools();
698 if (quicktool[SHORT1FROMMP(mp1) - IDM_QUICKTOOLSTART - 1]) {
699 if (fToolsChanged)
700 save_tools(NULL);
701 if (!load_tools(quicktool[SHORT1FROMMP(mp1) - IDM_QUICKTOOLSTART - 1]))
702 load_tools(NULL);
703 else {
704 strcpy(lasttoolbar,
705 quicktool[SHORT1FROMMP(mp1) - IDM_QUICKTOOLSTART - 1]);
706 PrfWriteProfileString(fmprof, appname, "LastToolbar", lasttoolbar);
707 }
708 PostMsg(hwndToolback, UM_SETUP2, MPVOID, MPVOID);
709 }
710 }
711 else {
712
713 HWND hwndActive;
714
715 hwndActive = TopWindow(hwnd, (HWND) 0);
716 if (hwndActive)
717 PostMsg(WinWindowFromID(hwndActive, FID_CLIENT), msg, mp1, mp2);
718 }
719 break;
720 }
721 return 0;
722}
723
724static MRESULT EXPENTRY MainWMOnce2(HWND hwnd, ULONG msg, MPARAM mp1,
725 MPARAM mp2)
726{
727 PERSON1DATA *pd;
728
729 switch (msg) {
730 case WM_CREATE:
731 {
732 TID tid;
733
734 WinQueryWindowProcess(hwnd, &mypid, &tid);
735 }
736 hwndMain = hwnd;
737 WinSetWindowUShort(hwnd, QWL_USER + 8, 0);
738 WinSetWindowUShort(hwnd, QWL_USER + 10, 0);
739 WinSetWindowUShort(hwnd, QWL_USER + 12, 0);
740 WinSetWindowUShort(hwnd, QWL_USER + 16, 0);
741 if (_beginthread(MakeMainObjWin, NULL, 245760, MPVOID) == -1) {
742 Runtime_Error(pszSrcFile, __LINE__,
743 GetPString(IDS_COULDNTSTARTTHREADTEXT));
744 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
745 return 0;
746 }
747 else
748 DosSleep(32);//05 Aug 07 GKY 64
749
750 pd = xmallocz(sizeof(PERSON1DATA), pszSrcFile, __LINE__);
751 if (!pd)
752 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
753 else {
754 pd->size = sizeof(PERSON1DATA);
755 WinSetWindowPtr(hwnd, QWL_USER + 4, (PVOID) pd);
756 }
757 {
758 SWP swp;
759 PFNWP oldproc;
760
761 /*
762 * create frame children (not client children, frame children)
763 */
764 DosSleep(1);
765 WinQueryWindowPos(WinQueryWindow(hwnd, QW_PARENT), &swp);
766 oldproc = WinSubclassWindow(WinQueryWindow(hwnd, QW_PARENT),
767 (PFNWP) MainFrameWndProc2);
768 if (oldproc)
769 WinSetWindowPtr(WinQueryWindow(hwnd, QW_PARENT), QWL_USER, (PVOID) oldproc);
770 CommonCreateMainChildren(hwnd, &swp);
771
772 {
773 HWND hwndMenu;
774
775 hwndMenu = WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT), FID_MENU);
776 WinSetWindowULong(hwnd, QWL_USER, hwndMenu);
777 CfgMenuInit(hwndMenu, FALSE); // 14 Feb 08 SHL
778 SetConditionalCascade(hwndMenu, IDM_COMMANDLINESUBMENU, IDM_COMMANDLINE);
779 SetConditionalCascade(hwndMenu, IDM_COMMANDSMENU, IDM_DOITYOURSELF);
780 SetConditionalCascade(hwndMenu, IDM_TOOLSUBMENU, IDM_TOOLBAR);
781 }
782 }
783 WinSetWindowText(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
784 FID_TITLEBAR), "FM/2 Lite");
785 FixSwitchList(WinQueryWindow(hwnd, QW_PARENT), NULL);
786 SetSysMenu(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT), FID_SYSMENU));
787 break;
788
789 case UM_SETUP:
790 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
791 if (pd) {
792
793 CHAR s[CCHMAXPATH];
794 ULONG size;
795 DIRCNRDATA *dcd;
796 HWND hwndC;
797 BOOL dummy = TRUE;
798
799 size = sizeof(BOOL);
800 PrfQueryProfileData(fmprof,
801 realappname, "FM/4 TreeUp", (PVOID) & dummy, &size);
802 if (dummy) {
803 size = sizeof(ULONG);
804 hwndTree = StartTreeCnr(hwnd, 3);
805 PrfQueryProfileData(fmprof,
806 realappname,
807 "FM/4 TreeWidth", (PVOID) & TreeWidth, &size);
808 TreeWidth = max(TreeWidth, 80);
809 }
810 size = sizeof(BOOL);
811 if (PrfQueryProfileData(fmprof,
812 FM3Str,
813 "Toolbar", &dummy, &size) && size && !dummy)
814 WinSendMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_TOOLBAR, 0), MPVOID);
815
816 size = sizeof(s);
817 *s = 0;
818 if (PrfQueryProfileData(fmprof,
819 realappname, "FM/4 Dir1", s, &size) && *s)
820 MakeValidDir(s);
821 else
822 save_dir(s);
823 pd->hwndLastDir = pd->hwndCurr = pd->hwndDir1 =
824 StartDirCnr(hwnd, s, (HWND) 0, 3);
825 size = sizeof(s);
826 *s = 0;
827 if (PrfQueryProfileData(fmprof,
828 realappname, "FM/4 Dir2", s, &size) && *s)
829 MakeValidDir(s);
830 else
831 save_dir(s);
832 pd->hwndDir2 = StartDirCnr(hwnd, s, (HWND) 0, 3);
833 WinSetFocus(HWND_DESKTOP, pd->hwndCurr);
834
835 hwndC = WinWindowFromID(pd->hwndDir1, FID_CLIENT);
836 if (hwndC) {
837 dcd = WinQueryWindowPtr(WinWindowFromID(hwndC, DIR_CNR), QWL_USER);
838 if (dcd) {
839 size = sizeof(INT);
840 if (PrfQueryProfileData(fmprof,
841 realappname,
842 "FM/4 Dir1.Sort",
843 (PVOID) & dcd->sortFlags,
844 &size) && size == sizeof(INT)) {
845 if (!dcd->sortFlags)
846 dcd->sortFlags = SORT_PATHNAME;
847 }
848 size = sizeof(MASK);
849 if (PrfQueryProfileData(fmprof,
850 realappname,
851 "FM/4 Dir1.Filter",
852 (PVOID) & dcd->mask, &size) && size) {
853 if (*dcd->mask.szMask)
854 WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
855 UM_FILTER, MPFROMP(dcd->mask.szMask), MPVOID);
856 }
857 *(dcd->mask.prompt) = 0;
858 size = sizeof(ULONG);
859 if (PrfQueryProfileData(fmprof,
860 realappname,
861 "FM/4 Dir1.View",
862 (PVOID) & dcd->flWindowAttr,
863 &size) && size == sizeof(ULONG)) {
864
865 CNRINFO cnri;
866
867 memset(&cnri, 0, sizeof(CNRINFO));
868 cnri.cb = sizeof(CNRINFO);
869 if (WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
870 CM_QUERYCNRINFO,
871 MPFROMP(&cnri), MPFROMLONG(sizeof(CNRINFO)))) {
872 cnri.flWindowAttr = dcd->flWindowAttr;
873 WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
874 CM_SETCNRINFO,
875 MPFROMP(&cnri), MPFROMLONG(CMA_FLWINDOWATTR));
876 }
877 }
878 }
879 }
880
881 hwndC = WinWindowFromID(pd->hwndDir2, FID_CLIENT);
882 if (hwndC) {
883 dcd = WinQueryWindowPtr(WinWindowFromID(hwndC, DIR_CNR), QWL_USER);
884 if (dcd) {
885 size = sizeof(INT);
886 if (PrfQueryProfileData(fmprof,
887 realappname,
888 "FM/4 Dir2.Sort",
889 (PVOID) & dcd->sortFlags,
890 &size) && size == sizeof(INT)) {
891 if (!dcd->sortFlags)
892 dcd->sortFlags = SORT_PATHNAME;
893 }
894 size = sizeof(MASK);
895 if (PrfQueryProfileData(fmprof,
896 realappname,
897 "FM/4 Dir2.Filter",
898 (PVOID) & dcd->mask, &size) && size) {
899 if (*dcd->mask.szMask)
900 WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
901 UM_FILTER, MPFROMP(dcd->mask.szMask), MPVOID);
902 }
903 *(dcd->mask.prompt) = 0;
904 size = sizeof(ULONG);
905 if (PrfQueryProfileData(fmprof,
906 realappname,
907 "FM/4 Dir2.View",
908 (PVOID) & dcd->flWindowAttr,
909 &size) && size == sizeof(ULONG)) {
910
911 CNRINFO cnri;
912
913 memset(&cnri, 0, sizeof(CNRINFO));
914 cnri.cb = sizeof(CNRINFO);
915 if (WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
916 CM_QUERYCNRINFO,
917 MPFROMP(&cnri), MPFROMLONG(sizeof(CNRINFO)))) {
918 cnri.flWindowAttr = dcd->flWindowAttr;
919 WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
920 CM_SETCNRINFO,
921 MPFROMP(&cnri), MPFROMLONG(CMA_FLWINDOWATTR));
922 }
923 }
924 }
925 }
926 }
927 {
928 ULONG which = 0, size = sizeof(ULONG);
929
930 if (PrfQueryProfileData(fmprof,
931 realappname,
932 "FM/4 Max",
933 (PVOID) & which,
934 &size) && size == sizeof(ULONG) && which) {
935 PostMsg(hwnd,
936 UM_MAXIMIZE,
937 MPFROMLONG(((which == 1) ?
938 pd->hwndDir1 : pd->hwndDir2)), MPVOID);
939 }
940 }
941 PostMsg(hwnd, UM_SIZE, MPVOID, MPVOID);
942 if (!hwndTree)
943 PostMsg(hwnd, UM_BUILDDRIVEBAR, MPVOID, MPVOID);
944 load_tools(NULL);
945 PostMsg(hwndToolback, UM_SETUP2, MPVOID, MPVOID);
946 fRunning = TRUE;
947 return 0;
948
949 case WM_SAVEAPPLICATION:
950 WinStoreWindowPos(FM2Str,
951 "MainWindowPos2", WinQueryWindow(hwnd, QW_PARENT));
952 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
953 if (pd) {
954
955 CHAR s[CCHMAXPATH];
956 HWND hwndC;
957 DIRCNRDATA *dcd;
958 ULONG flWindowAttr;
959
960 *s = 0;
961 WinSendMsg(pd->hwndDir1, UM_CONTAINERDIR, MPFROMP(s), MPVOID);
962 if (*s) {
963 MakeValidDir(s);
964 PrfWriteProfileString(fmprof, realappname, "FM/4 Dir1", s);
965 }
966 *s = 0;
967 WinSendMsg(pd->hwndDir2, UM_CONTAINERDIR, MPFROMP(s), MPVOID);
968 if (*s) {
969 MakeValidDir(s);
970 PrfWriteProfileString(fmprof, realappname, "FM/4 Dir2", s);
971 }
972 flWindowAttr = (pd->hwndMax == pd->hwndDir1) ?
973 1 : (pd->hwndMax == pd->hwndDir2) ? 2 : 0;
974 PrfWriteProfileData(fmprof,
975 realappname,
976 "FM/4 Max", &flWindowAttr, sizeof(flWindowAttr));
977 hwndC = WinWindowFromID(pd->hwndDir1, FID_CLIENT);
978 if (hwndC) {
979 dcd = WinQueryWindowPtr(WinWindowFromID(hwndC, DIR_CNR), QWL_USER);
980 if (dcd) {
981 flWindowAttr = dcd->flWindowAttr;
982 if (!fLeaveTree && (flWindowAttr & CV_TREE)) {
983 flWindowAttr &= (~(CV_TREE | CV_ICON | CV_DETAIL | CV_TEXT));
984 if (dcd->lastattr) {
985 if (dcd->lastattr & CV_TEXT)
986 flWindowAttr |= CV_TEXT;
987 else if (dcd->lastattr & CV_DETAIL)
988 flWindowAttr |= CV_DETAIL;
989 else if (dcd->lastattr & CV_ICON)
990 flWindowAttr |= CV_ICON;
991 else
992 flWindowAttr |= CV_NAME;
993 }
994 else
995 flWindowAttr |= CV_NAME;
996 }
997 PrfWriteProfileData(fmprof,
998 realappname,
999 "FM/4 Dir1.Sort",
1000 (PVOID) & dcd->sortFlags, sizeof(INT));
1001 PrfWriteProfileData(fmprof,
1002 realappname,
1003 "FM/4 Dir1.Filter",
1004 (PVOID) & dcd->mask, sizeof(MASK));
1005 PrfWriteProfileData(fmprof,
1006 realappname,
1007 "FM/4 Dir1.View",
1008 (PVOID) & flWindowAttr, sizeof(ULONG));
1009 }
1010 }
1011
1012 hwndC = WinWindowFromID(pd->hwndDir2, FID_CLIENT);
1013 if (hwndC) {
1014 dcd = WinQueryWindowPtr(WinWindowFromID(hwndC, DIR_CNR), QWL_USER);
1015 if (dcd) {
1016 flWindowAttr = dcd->flWindowAttr;
1017 if (!fLeaveTree && (flWindowAttr & CV_TREE)) {
1018 flWindowAttr &= (~(CV_TREE | CV_ICON | CV_DETAIL | CV_TEXT));
1019 if (dcd->lastattr) {
1020 if (dcd->lastattr & CV_TEXT)
1021 flWindowAttr |= CV_TEXT;
1022 else if (dcd->lastattr & CV_DETAIL)
1023 flWindowAttr |= CV_DETAIL;
1024 else if (dcd->lastattr & CV_ICON)
1025 flWindowAttr |= CV_ICON;
1026 else
1027 flWindowAttr |= CV_NAME;
1028 }
1029 else
1030 flWindowAttr |= CV_NAME;
1031 }
1032 PrfWriteProfileData(fmprof,
1033 realappname,
1034 "FM/4 Dir2.Sort",
1035 (PVOID) & dcd->sortFlags, sizeof(INT));
1036 PrfWriteProfileData(fmprof,
1037 realappname,
1038 "FM/4 Dir2.Filter",
1039 (PVOID) & dcd->mask, sizeof(MASK));
1040 PrfWriteProfileData(fmprof,
1041 realappname,
1042 "FM/4 Dir2.View",
1043 (PVOID) & flWindowAttr, sizeof(ULONG));
1044 }
1045 }
1046 }
1047 break;
1048 }
1049 return WinDefWindowProc(hwnd, msg, mp1, mp2);
1050}
1051
1052MRESULT EXPENTRY MainWndProc2(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
1053{
1054 PERSON1DATA *pd;
1055
1056 switch (msg) {
1057 case WM_SAVEAPPLICATION:
1058 case UM_SETUP:
1059 case WM_CREATE:
1060 return MainWMOnce2(hwnd, msg, mp1, mp2);
1061
1062 case UM_THREADUSE:
1063 case UM_LOADFILE:
1064 case UM_BUILDDRIVEBAR:
1065 return CommonMainWndProc(hwnd, msg, mp1, mp2);
1066
1067 case UM_SETUP2:
1068 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
1069 if (pd) {
1070 if (mp1) {
1071 if (pd->hwndDir1 && (!pd->hwndMax || pd->hwndMax == pd->hwndDir1))
1072 BoxWindow(pd->hwndDir1, (HPS) 0, CLR_PALEGRAY);
1073 if (pd->hwndDir2 && (!pd->hwndMax || pd->hwndMax == pd->hwndDir2))
1074 BoxWindow(pd->hwndDir2, (HPS) 0, CLR_PALEGRAY);
1075 if (hwndTree)
1076 BoxWindow(hwndTree, (HPS) 0, CLR_PALEGRAY);
1077 }
1078 else {
1079 if (hwndTree)
1080 BoxWindow(hwndTree,
1081 (HPS) 0,
1082 (pd->hwndCurr == hwndTree) ? CLR_RED : CLR_WHITE);
1083 if (!pd->hwndMax || pd->hwndMax == pd->hwndDir1)
1084 BoxWindow(pd->hwndDir1,
1085 (HPS) 0,
1086 (pd->hwndDir1 == pd->hwndCurr) ?
1087 CLR_RED :
1088 (pd->hwndDir1 == pd->hwndLastDir) ?
1089 CLR_DARKRED : CLR_PALEGRAY);
1090 if (!pd->hwndMax || pd->hwndMax == pd->hwndDir2)
1091 BoxWindow(pd->hwndDir2,
1092 (HPS) 0,
1093 (pd->hwndDir2 == pd->hwndCurr) ?
1094 CLR_RED :
1095 (pd->hwndDir2 == pd->hwndLastDir) ?
1096 CLR_DARKRED : CLR_PALEGRAY);
1097 }
1098 }
1099 return 0;
1100
1101 case WM_BUTTON1DOWN:
1102 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
1103 if (hwndTree) {
1104
1105 SWP swp;
1106
1107 WinQueryWindowPos(hwndTree, &swp);
1108 if (SHORT1FROMMP(mp1) > (swp.x + swp.cx) - 3 &&
1109 SHORT1FROMMP(mp1) < (swp.x + swp.cx) + 3) {
1110
1111 SWP swpC;
1112 TRACKINFO track;
1113
1114 WinQueryWindowPos(hwnd, &swpC);
1115 track.cxBorder = 4;
1116 track.cyBorder = 4;
1117 track.cxGrid = 1;
1118 track.cyGrid = 1;
1119 track.cxKeyboard = 8;
1120 track.cyKeyboard = 8;
1121 track.rclTrack.yBottom = 2;
1122 track.rclTrack.yTop = swpC.cy - 4;
1123 track.rclTrack.xLeft = 2;
1124 track.rclTrack.xRight = swp.x + swp.cx + 2;
1125 track.rclBoundary = track.rclTrack;
1126 track.rclBoundary.xRight = swpC.cx - 80;
1127 track.ptlMinTrackSize.x = 80;
1128 track.ptlMinTrackSize.y = swpC.cy - 4;
1129 track.ptlMaxTrackSize.x = swpC.cx - 80;
1130 track.ptlMaxTrackSize.y = swpC.cy - 4;
1131 track.fs = TF_RIGHT;
1132 if (WinTrackRect(hwnd, (HPS) 0, &track)) {
1133 TreeWidth = track.rclTrack.xRight - track.rclTrack.xLeft;
1134 PrfWriteProfileData(fmprof,
1135 realappname,
1136 "FM/4 TreeWidth", &TreeWidth, sizeof(ULONG));
1137 WinSendMsg(hwnd, UM_SETUP2, MPFROMLONG(1), MPVOID);
1138 PostMsg(hwnd, UM_SIZE, MPVOID, MPVOID);
1139 }
1140 return (MRESULT) TRUE;
1141 }
1142 }
1143 break;
1144
1145 case WM_MOUSEMOVE:
1146 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
1147 if (hwndTree) {
1148
1149 SWP swp;
1150
1151 if (WinQueryWindowPos(hwndTree, &swp)) {
1152 if (SHORT1FROMMP(mp1) > (swp.x + swp.cx) - 3 &&
1153 SHORT1FROMMP(mp1) < (swp.x + swp.cx) + 3)
1154 WinSetPointer(HWND_DESKTOP, hptrEW);
1155 else
1156 WinSetPointer(HWND_DESKTOP, hptrArrow);
1157 }
1158 else
1159 WinSetPointer(HWND_DESKTOP, hptrArrow);
1160 }
1161 return (MRESULT) TRUE;
1162
1163 case WM_BUTTON1UP:
1164 case WM_BUTTON2UP:
1165 case WM_BUTTON3UP:
1166 case WM_CHAR:
1167 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
1168 break;
1169
1170 case UM_ADVISEFOCUS:
1171 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
1172 if (mp1 && pd && (HWND) mp1 != pd->hwndCurr) {
1173 if ((HWND) mp1 != hwndTree)
1174 pd->hwndLastDir = (HWND) mp1;
1175 pd->hwndCurr = (HWND) mp1;
1176 WinSendMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
1177 }
1178 return 0;
1179
1180 case UM_MAXIMIZE:
1181 if (mp1) {
1182 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
1183 if (pd) {
1184 WinSendMsg(hwnd, UM_SETUP2, MPFROMLONG(1), MPVOID);
1185 if (pd->hwndMax != (HWND) mp1) {
1186 pd->hwndMax = (HWND) mp1;
1187 WinSetFocus(HWND_DESKTOP, pd->hwndMax);
1188 }
1189 else
1190 pd->hwndMax = (HWND) 0;
1191 PostMsg(hwnd, UM_SIZE, MPVOID, MPVOID);
1192 }
1193 }
1194 return 0;
1195
1196 case WM_INITMENU:
1197 switch (SHORT1FROMMP(mp1)) {
1198 case IDM_FILESMENU:
1199 case IDM_VIEWSMENU:
1200 case IDM_DETAILSSETUP:
1201 case IDM_COMMANDSMENU:
1202 case IDM_SORTSUBMENU:
1203 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
1204 if (pd)
1205 WinSendMsg(pd->hwndCurr, UM_INITMENU, mp1, mp2);
1206 break;
1207 case IDM_CONFIGMENU:
1208 WinCheckMenuItem((HWND) mp2, IDM_TOOLSUBMENU, fToolbar);
1209 WinCheckMenuItem((HWND) mp2, IDM_AUTOVIEW, fAutoView);
1210 break;
1211 case IDM_TOOLSUBMENU:
1212 WinCheckMenuItem((HWND) mp2, IDM_TOOLBAR, fToolbar);
1213 WinCheckMenuItem((HWND) mp2, IDM_TEXTTOOLS, fTextTools);
1214 WinCheckMenuItem((HWND) mp2, IDM_TOOLTITLES, fToolTitles);
1215 break;
1216 case IDM_WINDOWSMENU:
1217 WinCheckMenuItem((HWND) mp2, IDM_VTREE, (hwndTree != (HWND) 0));
1218 WinCheckMenuItem((HWND) mp2, IDM_TILEBACKWARDS, fTileBackwards);
1219 SetupWinList((HWND) mp2, hwnd, WinQueryWindow(hwnd, QW_PARENT));
1220 break;
1221 }
1222 break;
1223
1224 case WM_SETFOCUS:
1225 if (mp2)
1226 PostMsg(hwnd, UM_FOCUSME, MPVOID, MPVOID);
1227 break;
1228
1229 case UM_FOCUSME:
1230 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
1231 if (pd)
1232 WinSetFocus(HWND_DESKTOP, pd->hwndCurr);
1233 return 0;
1234
1235 case UM_RESCAN:
1236 return 0;
1237
1238 case UM_SIZE:
1239 {
1240 SWP swp;
1241
1242 if (WinQueryWindowPos(hwnd, &swp)) {
1243 mp1 = MPFROM2SHORT(swp.cx, swp.cy);
1244 mp2 = MPFROM2SHORT(swp.cx, swp.cy);
1245 }
1246 else
1247 return 0;
1248 }
1249 /* intentional fallthru */
1250 case WM_SIZE:
1251 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
1252 if (mp1 && mp2 && pd && pd->hwndDir1 && pd->hwndDir2) {
1253 if (hwndTree)
1254 WinSetWindowPos(hwndTree,
1255 HWND_TOP,
1256 2,
1257 2,
1258 TreeWidth - 4,
1259 SHORT2FROMMP(mp2) - 4,
1260 SWP_SHOW | SWP_MOVE | SWP_SIZE);
1261 else
1262 TreeWidth = 0;
1263 if (!pd->hwndMax) {
1264 if (fTileBackwards) {
1265 WinSetWindowPos(pd->hwndDir1, HWND_TOP,
1266 (((SHORT1FROMMP(mp2) - TreeWidth) / 2) +
1267 TreeWidth) + 2,
1268 2,
1269 ((SHORT1FROMMP(mp2) - TreeWidth) / 2) - 4,
1270 SHORT2FROMMP(mp2) - 4,
1271 SWP_SHOW | SWP_MOVE | SWP_SIZE);
1272 WinSetWindowPos(pd->hwndDir2, HWND_TOP,
1273 TreeWidth + 2,
1274 2,
1275 ((SHORT1FROMMP(mp2) - TreeWidth) / 2) - 4,
1276 SHORT2FROMMP(mp2) - 4,
1277 SWP_SHOW | SWP_MOVE | SWP_SIZE);
1278 }
1279 else {
1280 WinSetWindowPos(pd->hwndDir1, HWND_TOP,
1281 TreeWidth + 2,
1282 2,
1283 (SHORT1FROMMP(mp2) - TreeWidth) - 4,
1284 (SHORT2FROMMP(mp2) / 2) - 4,
1285 SWP_SHOW | SWP_MOVE | SWP_SIZE);
1286 WinSetWindowPos(pd->hwndDir2, HWND_TOP,
1287 TreeWidth + 2,
1288 (SHORT2FROMMP(mp2) / 2) + 2,
1289 (SHORT1FROMMP(mp2) - TreeWidth) - 4,
1290 (SHORT2FROMMP(mp2) / 2) - 4,
1291 SWP_SHOW | SWP_MOVE | SWP_SIZE);
1292 }
1293 }
1294 else {
1295
1296 HWND hwndOther;
1297
1298 WinSetWindowPos(pd->hwndMax, HWND_TOP,
1299 TreeWidth + 2,
1300 2,
1301 (SHORT1FROMMP(mp2) - TreeWidth) - 4,
1302 SHORT2FROMMP(mp2) - 4,
1303 SWP_SHOW | SWP_MOVE | SWP_SIZE);
1304 hwndOther = (pd->hwndMax == pd->hwndDir1) ?
1305 pd->hwndDir2 : pd->hwndDir1;
1306 WinSetWindowPos(hwndOther, HWND_BOTTOM, 0, 0, 0, 0, SWP_HIDE);
1307 }
1308 WinSendMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
1309 }
1310 if (msg == UM_SIZE)
1311 return 0;
1312 break;
1313
1314 case WM_ERASEBACKGROUND:
1315 WinFillRect((HPS) mp1, (PRECTL) mp2, 0x00d0d0d0);
1316 return 0;
1317
1318 case WM_PAINT:
1319 {
1320 HPS hps;
1321 RECTL rcl;
1322
1323 hps = WinBeginPaint(hwnd, NULLHANDLE, NULL);
1324 if (hps) {
1325 WinQueryWindowRect(hwnd, &rcl);
1326 WinFillRect(hps, (PRECTL) & rcl, CLR_PALEGRAY);
1327 WinEndPaint(hps);
1328 WinSendMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
1329 }
1330 }
1331 break;
1332
1333 case UM_COMMAND:
1334 case WM_COMMAND:
1335 return MainWMCommand2(hwnd, msg, mp1, mp2);
1336
1337 case WM_CLOSE:
1338 fAmClosing = TRUE;
1339 WinSendMsg(hwnd, WM_SAVEAPPLICATION, MPVOID, MPVOID);
1340 CloseChildren(hwnd);
1341 PostMsg(hwnd, UM_CLOSE, MPVOID, MPVOID);
1342 DosSleep(1);
1343 return 0;
1344
1345 case UM_CLOSE:
1346 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
1347 return 0;
1348
1349 case WM_DESTROY:
1350 hwndMain = (HWND) 0;
1351 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
1352 xfree(pd, pszSrcFile, __LINE__);
1353 if (!PostMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID))
1354 WinSendMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID);
1355 break;
1356 }
1357 return WinDefWindowProc(hwnd, msg, mp1, mp2);
1358}
1359
1360HWND StartFM32(HAB hab, INT argc, CHAR ** argv)
1361{
1362 HWND hwndFrame, hwndClient;
1363 ULONG FrameFlags = FCF_TITLEBAR | FCF_SYSMENU |
1364 FCF_SIZEBORDER | FCF_MINMAX |
1365 FCF_ACCELTABLE | FCF_MENU | FCF_ICON | FCF_TASKLIST | FCF_NOBYTEALIGN;
1366
1367 {
1368 INT x;
1369
1370 for (x = 1; x < argc; x++) {
1371 if (*argv[x] == '+' && !argv[x][1])
1372 fLogFile = TRUE;
1373 if (*argv[x] == '-') {
1374 if (argv[x][1])
1375 strcpy(profile, &argv[x][1]);
1376 }
1377 }
1378 }
1379 {
1380 CHAR inipath[CCHMAXPATH], fullpath[CCHMAXPATH];
1381 FILESTATUS3 fsa;
1382
1383 if (PrfQueryProfileString(HINI_USERPROFILE,
1384 FM2Str,
1385 "Home", NULL, inipath, sizeof(inipath))) {
1386 if (!DosQueryPathInfo(inipath, FIL_STANDARD, &fsa, sizeof(fsa))) {
1387 if (fsa.attrFile & FILE_DIRECTORY) {
1388 if (DosQueryPathInfo(inipath,
1389 FIL_QUERYFULLNAME, fullpath, sizeof(fullpath)))
1390 strcpy(fullpath, inipath);
1391 switch_to(fullpath);
1392 }
1393 }
1394 }
1395 }
1396
1397 hwndFrame = WinCreateStdWindow(HWND_DESKTOP,
1398 WS_VISIBLE,
1399 &FrameFlags,
1400 WC_MAINWND2,
1401 NULL,
1402 WS_VISIBLE | WS_ANIMATE,
1403 FM3ModHandle, MAIN2_FRAME, &hwndClient);
1404 if (hwndFrame) {
1405 hwndMainMenu = WinWindowFromID(hwndFrame, FID_MENU);
1406 if (!WinRestoreWindowPos(FM2Str, "MainWindowPos2", hwndFrame)) {
1407
1408 ULONG fl = SWP_MOVE | SWP_SIZE;
1409 RECTL rcl;
1410 ULONG icz = WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 3L;
1411 ULONG bsz = WinQuerySysValue(HWND_DESKTOP, SV_CYSIZEBORDER);
1412
1413 WinQueryWindowRect(HWND_DESKTOP, &rcl);
1414 rcl.yBottom += icz;
1415 rcl.yTop -= bsz;
1416 rcl.xLeft += bsz;
1417 rcl.xRight -= bsz;
1418 WinSetWindowPos(hwndFrame,
1419 HWND_TOP,
1420 rcl.xLeft,
1421 rcl.yBottom,
1422 rcl.xRight - rcl.xLeft, rcl.yTop - rcl.yBottom, fl);
1423 }
1424 if (fLogFile)
1425 LogFileHandle = _fsopen("FM2.LOG", "a+", SH_DENYWR);
1426 if (hwndHelp)
1427 WinAssociateHelpInstance(hwndHelp, hwndFrame);
1428 PostMsg(hwndClient, UM_SETUP, MPFROMLONG(argc), MPFROMP(argv));
1429 }
1430 return hwndFrame;
1431}
1432
1433#pragma alloc_text(PERSON11,MainFrameWndProc2,MainWndProc2)
1434#pragma alloc_text(PERSON12,StartFM32,MainWMOnce2)
1435#pragma alloc_text(PERSON13,MainWMCommand2)
Note: See TracBrowser for help on using the repository browser.