source: trunk/dll/mainwnd2.c@ 1129

Last change on this file since 1129 was 1128, checked in by John Small, 17 years ago

Ticket 259: 1) Support save/restore of target dir with states (except FM2Shutdown)

2) Added separate toolbar setting for FM/2 Lite
3) Improved earlier changes for this ticket

  • 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 1128 2008-08-29 14:03:23Z jbs $
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
28***********************************************************************/
29
30#include <stdlib.h>
31#include <string.h>
32#include <share.h>
33#include <process.h> // _beginthread
34
35#define INCL_DOS
36#define INCL_WIN
37#define INCL_GPI
38#define INCL_LONGLONG
39
40#include "fm3dlg.h"
41#include "fm3str.h"
42#include "tools.h"
43#include "datamin.h"
44#include "comp.h" // COMPARE
45#include "pathutil.h" // BldQuotedFileName
46#include "errutil.h" // Dos_Error...
47#include "strutil.h" // GetPString
48#include "notebook.h" // CfgDlgProc
49#include "command.h" // RunCommand
50#include "fm3dll.h"
51#include "fortify.h"
52
53typedef struct
54{
55 USHORT size;
56 USHORT dummy;
57 HWND hwndDir1;
58 HWND hwndDir2;
59 HWND hwndCurr;
60 HWND hwndLastDir;
61 HWND hwndMax;
62}
63PERSON1DATA;
64
65static PSZ pszSrcFile = __FILE__;
66
67static MRESULT EXPENTRY MainFrameWndProc2(HWND hwnd, ULONG msg, MPARAM mp1,
68 MPARAM mp2)
69{
70 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
71
72 switch (msg) {
73 case WM_ADJUSTWINDOWPOS:
74 {
75 SWP *pswp;
76
77 pswp = (SWP *) mp1;
78 if (pswp->fl & (SWP_SHOW | SWP_RESTORE))
79 PostMsg(WinWindowFromID(hwnd, FID_CLIENT), UM_SIZE, MPVOID, MPVOID);
80 if (fDataMin && !fAmClosing) {
81 if (pswp->fl & (SWP_HIDE | SWP_MINIMIZE)) {
82
83 SWP swp;
84
85 WinQueryWindowPos(hwnd, &swp);
86 PostMsg(hwnd, UM_FOCUSME, MPFROMLONG(swp.fl), MPVOID);
87 HideNote();
88 }
89 else if (pswp->fl & (SWP_SHOW | SWP_RESTORE)) {
90 if (DataHwnd)
91 PostMsg(DataHwnd, WM_CLOSE, MPVOID, MPVOID);
92 }
93 }
94 if (!fAmClosing) {
95 if (pswp->fl & (SWP_HIDE | SWP_MINIMIZE))
96 HideNote();
97 }
98 }
99 break;
100
101 case UM_FOCUSME:
102 CreateDataBar(HWND_DESKTOP, (ULONG) mp1);
103 return 0;
104
105 case WM_BUTTON1UP:
106 case WM_BUTTON2UP:
107 case WM_BUTTON3UP:
108 case WM_MOUSEMOVE:
109 case WM_CHORD:
110 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
111 break;
112
113 case WM_CHAR:
114 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
115 break;
116
117 case WM_CONTROL:
118 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), UM_CONTROL, mp1,
119 mp2);
120
121 case WM_COMMAND:
122 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
123
124 case WM_CALCFRAMERECT:
125 {
126 MRESULT mr;
127 PRECTL prectl;
128 LONG sheight = 20, bheight = 20;
129
130 mr = (oldproc) ? oldproc(hwnd, msg, mp1, mp2) :
131 PFNWPFrame(hwnd, msg, mp1, mp2);
132
133 /*
134 * Calculate the position of the client rectangle.
135 * Otherwise, we'll see a lot of redraw when we move the
136 * client during WM_FORMATFRAME.
137 */
138
139 if (mr && mp2) {
140 prectl = (PRECTL) mp1;
141 if (prectl->yBottom != prectl->yTop) {
142 {
143 HPS hps;
144 POINTL aptl[TXTBOX_COUNT];
145
146 hps = WinGetPS(hwndStatus);
147 GpiQueryTextBox(hps, 6, "$`WjgT", TXTBOX_COUNT, aptl);
148 WinReleasePS(hps);
149 sheight = aptl[TXTBOX_TOPLEFT].y + 6;
150 hps = WinGetPS(hwndName);
151 GpiQueryTextBox(hps, 6, "$`WjgT", TXTBOX_COUNT, aptl);
152 WinReleasePS(hps);
153 bheight = aptl[TXTBOX_TOPLEFT].y + 6;
154 }
155 prectl->yBottom += (sheight + 4);
156 prectl->yTop -= (sheight + 4);
157 prectl->yBottom += (bheight + 4);
158 prectl->yTop -= (bheight + 4);
159 if (fToolbar) {
160 if (!fTextTools)
161 prectl->yTop -= ((fToolTitles) ? 50 : 40);
162 else
163 prectl->yTop -= 32;
164 }
165 ResizeDrives(WinWindowFromID(hwnd, MAIN_DRIVES),
166 ((prectl->xRight -
167 (WinQuerySysValue(HWND_DESKTOP,
168 SV_CYSIZEBORDER) * 2)) - 4));
169 prectl->yTop -= (16 * (DriveLines * 18));
170 prectl->yTop -= 2;
171 if (fAutoView) {
172 AutoviewHeight = min(AutoviewHeight,
173 (prectl->yTop - prectl->yBottom) - 116);
174 AutoviewHeight = max(AutoviewHeight, 36);
175 prectl->yBottom += (AutoviewHeight + 6);
176 }
177 }
178 }
179 return mr;
180 }
181
182 case WM_FORMATFRAME:
183 {
184 SHORT sCount, soldCount;
185 PSWP pswp, pswpClient, pswpNew;
186 SWP swpClient;
187 ULONG theight = 48L, dheight = 20, bheight = 20, sheight = 20;
188 LONG width, lastx;
189
190 sCount = (SHORT) ((oldproc) ? oldproc(hwnd, msg, mp1, mp2) :
191 PFNWPFrame(hwnd, msg, mp1, mp2));
192 soldCount = sCount;
193 /*
194 * Reformat the frame to "squeeze" the client
195 * and make room for status window sibling beneath
196 * and toolbar above (if toolbar's on) and userlists
197 * (if userlists are on).
198 */
199
200 pswp = (PSWP) mp1;
201 {
202 SHORT x;
203
204 for (x = 0; x < sCount; x++) {
205 if (WinQueryWindowUShort(pswp->hwnd, QWS_ID) == FID_CLIENT) {
206 pswpClient = pswp;
207 break;
208 }
209 pswp++;
210 }
211 }
212
213 {
214 HPS hps;
215 POINTL aptl[TXTBOX_COUNT];
216
217 hps = WinGetPS(hwndStatus);
218 GpiQueryTextBox(hps, 6, "$`WjgT", TXTBOX_COUNT, aptl);
219 WinReleasePS(hps);
220 bheight = sheight = aptl[TXTBOX_TOPLEFT].y + 6;
221 hps = WinGetPS(hwndName);
222 GpiQueryTextBox(hps, 6, "$`WjgT", TXTBOX_COUNT, aptl);
223 WinReleasePS(hps);
224 bheight = aptl[TXTBOX_TOPLEFT].y + 6;
225 }
226
227 pswpNew = (PSWP) mp1 + soldCount;
228 *pswpNew = *pswpClient;
229 swpClient = *pswpClient;
230 pswpNew->hwnd = hwndStatus;
231 pswpNew->x = swpClient.x + 3;
232 pswpNew->y = swpClient.y + 2;
233 width = (swpClient.cx / 2) - 6;
234 width = max(width, 10);
235 pswpNew->cx = width - 6;
236 pswpNew->cy = sheight;
237 pswpClient->y = pswpNew->y + pswpNew->cy + 3;
238 pswpClient->cy = (swpClient.cy - pswpNew->cy) - 3;
239 sCount++;
240
241 pswpNew = (PSWP) mp1 + (soldCount + 1);
242 *pswpNew = *pswpClient;
243 pswpNew->hwnd = hwndStatus2;
244 pswpNew->x = width + 8;
245 pswpNew->y = swpClient.y + 2;
246 pswpNew->cx = width - 6;
247 pswpNew->cy = sheight;
248 sCount++;
249
250 if (fToolbar) {
251 if (fTextTools)
252 theight = 32L;
253 else if (!fToolTitles)
254 theight = 40L;
255 pswpNew = (PSWP) mp1 + (soldCount + 2);
256 *pswpNew = *pswpClient;
257 pswpNew->hwnd = WinWindowFromID(hwnd, MAIN_TOOLS);
258 pswpNew->x = swpClient.x + 2;
259 pswpNew->y = (swpClient.y + swpClient.cy) - (theight - 2);
260 pswpNew->cx = swpClient.cx - 4;
261 pswpNew->cy = theight - 4;
262 pswpClient->cy -= theight;
263 sCount++;
264 }
265 else
266 WinShowWindow(WinWindowFromID(hwnd, MAIN_TOOLS), FALSE);
267
268 ResizeDrives(WinWindowFromID(hwnd, MAIN_DRIVES), pswpClient->cx - 4);
269 pswpNew = (PSWP) mp1 + (soldCount + 2 + (fToolbar != FALSE));
270 *pswpNew = *pswpClient;
271 pswpNew->hwnd = WinWindowFromID(hwnd, MAIN_DRIVES);
272 pswpNew->x = swpClient.x + 2;
273 dheight += ((dheight - 2) * DriveLines);
274 pswpNew->y = (swpClient.y + swpClient.cy) - (dheight - 2);
275 if (fToolbar)
276 pswpNew->y -= theight;
277 pswpNew->cx = swpClient.cx - 4;
278 pswpNew->cy = dheight - 4;
279 pswpClient->cy -= dheight;
280 pswpClient->cy -= 2;
281 sCount++;
282
283 if (fAutoView) {
284 pswpNew = (PSWP) mp1 + (soldCount + 3 + (fToolbar != FALSE));
285 *pswpNew = *pswpClient;
286 pswpNew->hwnd = (fComments) ? hwndAutoMLE : hwndAutoview;
287 pswpNew->x = pswpClient->x + 3;
288 pswpNew->y = pswpClient->y + 3;
289 if (fMoreButtons)
290 pswpNew->y += (bheight + 4);
291 pswpNew->cx = pswpClient->cx - 6;
292 AutoviewHeight = min(AutoviewHeight, pswpClient->cy - 116);
293 AutoviewHeight = max(AutoviewHeight, 36);
294 pswpNew->cy = AutoviewHeight;
295 pswpClient->y += (AutoviewHeight + 6);
296 pswpClient->cy -= (AutoviewHeight + 6);
297 sCount++;
298 WinShowWindow((fComments) ? hwndAutoview : hwndAutoMLE, FALSE);
299 }
300 else {
301 WinShowWindow(hwndAutoview, FALSE);
302 WinShowWindow(hwndAutoMLE, FALSE);
303 }
304
305 pswpNew = (PSWP) mp1 + (soldCount + 3 + (fToolbar != FALSE) +
306 (fAutoView != FALSE));
307 *pswpNew = *pswpClient;
308 pswpNew->hwnd = WinWindowFromID(hwnd, MAIN_LED);
309 pswpNew->x = (swpClient.x + swpClient.cx) - 12;
310 pswpNew->y = swpClient.y;
311 pswpNew->cx = 12;
312 pswpNew->cy = 12;
313 sCount++;
314
315 pswpNew = (PSWP) mp1 + (soldCount + 4 + (fToolbar != FALSE) +
316 (fAutoView != FALSE));
317 *pswpNew = *pswpClient;
318 pswpNew->hwnd = WinWindowFromID(hwnd, MAIN_LEDHDR);
319 pswpNew->x = (swpClient.x + swpClient.cx) - 12;
320 pswpNew->y = swpClient.y + 12;
321 pswpNew->cx = 12;
322 pswpNew->cy = sheight - 8;
323 sCount++;
324
325 pswpNew = (PSWP) mp1 + (soldCount + 5 + (fToolbar != FALSE) +
326 (fAutoView != FALSE));
327 *pswpNew = *pswpClient;
328 pswpNew->hwnd = hwndName;
329 pswpNew->x = swpClient.x + 3;
330 pswpNew->y = swpClient.y + (sheight + 6);
331 pswpNew->cx = ((swpClient.cx / 2) + (swpClient.cx / 5)) - 3;
332 lastx = pswpNew->x + pswpNew->cx;
333 pswpNew->cy = bheight;
334 pswpClient->y += (bheight + 4);
335 pswpClient->cy -= (bheight + 4);
336 sCount++;
337
338 pswpNew = (PSWP) mp1 + (soldCount + 6 + (fToolbar != FALSE) +
339 (fAutoView != FALSE));
340 *pswpNew = *pswpClient;
341 pswpNew->hwnd = hwndDate;
342 pswpNew->x = lastx + 3;
343 pswpNew->y = swpClient.y + (sheight + 6);
344 pswpNew->cx = (swpClient.cx / 6) + (swpClient.cx / 16) - 3;
345 lastx = pswpNew->x + pswpNew->cx;
346 pswpNew->cy = bheight;
347 sCount++;
348
349 pswpNew = (PSWP) mp1 + (soldCount + 7 + (fToolbar != FALSE) +
350 (fAutoView != FALSE));
351 *pswpNew = *pswpClient;
352 pswpNew->hwnd = hwndAttr;
353 pswpNew->x = lastx + 3;
354 pswpNew->y = swpClient.y + (sheight + 6);
355 pswpNew->cx = (swpClient.cx - pswpNew->x) - 1;
356 pswpNew->cy = bheight;
357 sCount++;
358
359 return MRFROMSHORT(sCount);
360 }
361
362 case WM_QUERYFRAMECTLCOUNT:
363 {
364 SHORT sCount;
365
366 sCount = (SHORT) ((oldproc) ? oldproc(hwnd, msg, mp1, mp2) :
367 PFNWPFrame(hwnd, msg, mp1, mp2));
368 sCount += 8;
369 if (fToolbar)
370 sCount++;
371 if (fAutoView)
372 sCount++;
373 return MRFROMSHORT(sCount);
374 }
375
376 case WM_CLOSE:
377 WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
378 return 0;
379 }
380 return (oldproc) ? oldproc(hwnd, msg, mp1, mp2) :
381 PFNWPFrame(hwnd, msg, mp1, mp2);
382}
383
384static MRESULT EXPENTRY MainWMCommand2(HWND hwnd, ULONG msg, MPARAM mp1,
385 MPARAM mp2)
386{
387 PERSON1DATA *pd;
388
389 SetShiftState();
390 switch (SHORT1FROMMP(mp1)) {
391 case IDM_TOAUTOMLE:
392 case IDM_CLI:
393 case IDM_CREATETOOL:
394 case IDM_ABOUT:
395 case IDM_WINFULLSCREEN:
396 case IDM_DOSCOMMANDLINE:
397 case IDM_INIVIEWER:
398 case IDM_EDITASSOC:
399 case IDM_COMMANDLINE:
400 case IDM_KILLPROC:
401 case IDM_TOOLBAR:
402 case IDM_TEXTTOOLS:
403 case IDM_TOOLTITLES:
404 case IDM_TOOLLEFT:
405 case IDM_TOOLRIGHT:
406 case IDM_AUTOVIEWCOMMENTS:
407 case IDM_AUTOVIEWFILE:
408 case IDM_AUTOVIEW:
409// case IDM_SYSINFO:
410 case IDM_HIDENOTEWND:
411 case IDM_SHOWNOTEWND:
412 case IDM_INSTANT:
413 case IDM_HELPCONTEXT:
414 case IDM_HELPHINTS:
415 case IDM_HELPPIX:
416 case IDM_KILLME:
417 case IDM_EXIT:
418 case IDM_HELPTUTOR:
419 case IDM_HELPCONTENTS:
420 case IDM_HELPGENERAL:
421 case IDM_HELPKEYS:
422 case IDM_HELPMOUSE:
423 case IDM_HELP:
424 return MainWMCommand(hwnd, msg, mp1, mp2);
425
426 case IDM_REMAP:
427 WinDlgBox(HWND_DESKTOP,
428 hwnd, RemapDlgProc, FM3ModHandle, MAP_FRAME, NULL);
429 break;
430
431 case IDM_TWODIRS: // Menu action
432 case IDM_WINDOWDLG: // Toolbar action
433 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
434 if (pd) {
435
436 WALK2 wa;
437
438 memset(&wa, 0, sizeof(wa));
439 wa.size = sizeof(wa);
440 *wa.szCurrentPath1 = 0;
441 WinSendMsg(pd->hwndDir1,
442 UM_CONTAINERDIR, MPFROMP(wa.szCurrentPath1), MPVOID);
443 MakeValidDir(wa.szCurrentPath1);
444 *wa.szCurrentPath2 = 0;
445 WinSendMsg(pd->hwndDir2,
446 UM_CONTAINERDIR, MPFROMP(wa.szCurrentPath2), MPVOID);
447 MakeValidDir(wa.szCurrentPath2);
448 if (WinDlgBox(HWND_DESKTOP,
449 hwnd,
450 WalkTwoSetDlgProc,
451 FM3ModHandle,
452 WALK2_FRAME,
453 MPFROMP(&wa)) &&
454 (IsRoot(wa.szCurrentPath1) ||
455 !IsFile(wa.szCurrentPath1)) &&
456 (IsRoot(wa.szCurrentPath2) || !IsFile(wa.szCurrentPath2))) {
457 WinSendMsg(WinWindowFromID(WinWindowFromID(pd->hwndDir1,
458 FID_CLIENT), DIR_CNR),
459 UM_SETDIR, MPFROMP(wa.szCurrentPath1), MPVOID);
460 WinSendMsg(WinWindowFromID(WinWindowFromID(pd->hwndDir2,
461 FID_CLIENT), DIR_CNR),
462 UM_SETDIR, MPFROMP(wa.szCurrentPath2), MPVOID);
463 }
464 }
465 break;
466
467 case IDM_COMPARE:
468 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
469 if (pd) {
470
471 WALK2 wa;
472
473 memset(&wa, 0, sizeof(wa));
474 wa.size = sizeof(wa);
475 *wa.szCurrentPath1 = 0;
476 WinSendMsg(pd->hwndDir1,
477 UM_CONTAINERDIR, MPFROMP(wa.szCurrentPath1), MPVOID);
478 MakeValidDir(wa.szCurrentPath1);
479 *wa.szCurrentPath2 = 0;
480 WinSendMsg(pd->hwndDir2,
481 UM_CONTAINERDIR, MPFROMP(wa.szCurrentPath2), MPVOID);
482 MakeValidDir(wa.szCurrentPath2);
483 if (WinDlgBox(HWND_DESKTOP,
484 hwnd,
485 WalkTwoCmpDlgProc,
486 FM3ModHandle,
487 WALK2_FRAME,
488 MPFROMP(&wa)) &&
489 (IsRoot(wa.szCurrentPath1) ||
490 !IsFile(wa.szCurrentPath1)) &&
491 (IsRoot(wa.szCurrentPath2) || !IsFile(wa.szCurrentPath2))) {
492 if (!*dircompare) {
493
494 COMPARE *cmp;
495
496 cmp = xmallocz(sizeof(COMPARE), pszSrcFile, __LINE__);
497 if (cmp) {
498 cmp->size = sizeof(COMPARE);
499 strcpy(cmp->leftdir, wa.szCurrentPath1);
500 strcpy(cmp->rightdir, wa.szCurrentPath2);
501 cmp->hwndParent = hwnd;
502 cmp->dcd.hwndParent = hwnd;
503 WinDlgBox(HWND_DESKTOP,
504 HWND_DESKTOP,
505 CompareDlgProc, FM3ModHandle, COMP_FRAME, MPFROMP(cmp));
506 }
507 }
508 else {
509 CHAR szPath1[CCHMAXPATH];
510 CHAR szPath2[CCHMAXPATH];
511 runemf2(SEPARATE,
512 HWND_DESKTOP, pszSrcFile, __LINE__,
513 NULL, NULL,
514 "%s %s %s",
515 dircompare,
516 BldQuotedFileName(szPath1, wa.szCurrentPath1),
517 BldQuotedFileName(szPath2, wa.szCurrentPath2));
518 }
519 }
520 }
521 break;
522
523 case IDM_VTREE:
524 WinSendMsg(hwnd, UM_SETUP2, MPFROMLONG(1), MPVOID);
525 if (hwndTree) {
526 WinShowWindow(hwndTree, FALSE);
527 PostMsg(hwndTree, WM_CLOSE, MPVOID, MPVOID);
528 hwndTree = (HWND) 0;
529 }
530 else {
531
532 ULONG size = sizeof(ULONG);
533
534 hwndTree = StartTreeCnr(hwnd, 3);
535 PrfQueryProfileData(fmprof,
536 realappname,
537 "FM/4 TreeWidth", (PVOID) & TreeWidth, &size);
538 TreeWidth = max(TreeWidth, 80);
539 }
540 {
541 BOOL dummy = (hwndTree != (HWND) 0);
542
543 PrfWriteProfileData(fmprof,
544 realappname,
545 "FM/4 TreeUp", (PVOID) & dummy, sizeof(dummy));
546 }
547 PostMsg(hwnd, UM_SIZE, MPVOID, MPVOID);
548 break;
549
550 case IDM_TILEBACKWARDS:
551 WinSendMsg(hwnd, UM_SETUP2, MPFROMLONG(1), MPVOID);
552 fTileBackwards = (fTileBackwards) ? FALSE : TRUE;
553 PrfWriteProfileData(fmprof,
554 FM3Str,
555 "TileBackwards",
556 (PVOID) & fTileBackwards, sizeof(BOOL));
557 PostMsg(hwnd, UM_SIZE, MPVOID, MPVOID);
558 break;
559
560 case IDM_NEXTWINDOW:
561 case IDM_PREVWINDOW:
562 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
563 if (pd) {
564
565 HWND hwndFocus;
566
567 if (hwndTree) {
568 if (pd->hwndMax) {
569 if (hwndTree == pd->hwndCurr)
570 hwndFocus = pd->hwndMax;
571 else
572 hwndFocus = hwndTree;
573 }
574 else {
575 if (hwndTree == pd->hwndCurr)
576 hwndFocus = (SHORT1FROMMP(mp1) == IDM_PREVWINDOW) ?
577 pd->hwndDir1 : pd->hwndDir2;
578 else if (pd->hwndDir1 == pd->hwndCurr)
579 hwndFocus = (SHORT1FROMMP(mp1) == IDM_PREVWINDOW) ?
580 pd->hwndDir2 : hwndTree;
581 else
582 hwndFocus = (SHORT1FROMMP(mp1) == IDM_PREVWINDOW) ?
583 hwndTree : pd->hwndDir1;
584 }
585 }
586 else {
587 if (pd->hwndMax)
588 hwndFocus = pd->hwndMax;
589 else
590 hwndFocus = pd->hwndCurr == pd->hwndDir1 ?
591 pd->hwndDir2 : pd->hwndDir1;
592 }
593 WinSetFocus(HWND_DESKTOP, hwndFocus);
594 }
595 break;
596
597 case IDM_NOTEBOOK:
598 case IDM_DIRCNRSETTINGS:
599 case IDM_DIRVIEWSETTINGS:
600 case IDM_DIRSORTSETTINGS:
601 case IDM_COLLECTORVIEWSETTINGS:
602 case IDM_COLLECTORSORTSETTINGS:
603 case IDM_ARCHIVERSETTINGS:
604 case IDM_TREECNRVIEWSETTINGS:
605 case IDM_TREECNRSORTSETTINGS:
606 case IDM_VIEWERSETTINGS:
607 case IDM_VIEWERSETTINGS2:
608 case IDM_COMPARESETTINGS:
609 case IDM_MONOLITHICSETTINGS:
610 case IDM_GENERALSETTINGS:
611 case IDM_SCANSETTINGS:
612 case IDM_BUBBLESSETTINGS:
613 WinDlgBox(HWND_DESKTOP,
614 hwnd,
615 CfgDlgProc,
616 FM3ModHandle,
617 CFG_FRAME,
618 MPFROMLONG(mp1)); // 15 Feb 08 SHL
619 PostMsg(hwnd, UM_SIZE, MPVOID, MPVOID);
620 break;
621
622 case IDM_SEEALL:
623 case IDM_GREP:
624 case IDM_COLLECTOR:
625 {
626 HWND hwndC;
627
628 hwndC = StartCollector(HWND_DESKTOP, 4);
629 if (hwndC) {
630 WinSetWindowPos(hwndC,
631 HWND_TOP,
632 0, 0, 0, 0, SWP_SHOW | SWP_RESTORE | SWP_ACTIVATE);
633 if (SHORT1FROMMP(mp1) == IDM_GREP)
634 PostMsg(WinWindowFromID(hwndC, FID_CLIENT),
635 WM_COMMAND, MPFROM2SHORT(IDM_GREP, 0), MPVOID);
636 if (SHORT1FROMMP(mp1) == IDM_SEEALL)
637 PostMsg(WinWindowFromID(hwndC, FID_CLIENT),
638 WM_COMMAND, MPFROM2SHORT(IDM_SEEALL, 0), MPVOID);
639 }
640 }
641 break;
642
643 case IDM_EDITCOMMANDS:
644 EditCommands(hwnd);
645 break;
646
647 default:
648 if (SHORT1FROMMP(mp1) >= IDM_SWITCHSTART &&
649 SHORT1FROMMP(mp1) < IDM_SWITCHSTART + 499) {
650 if (SHORT1FROMMP(mp1) - IDM_SWITCHSTART < numswitches)
651 WinSwitchToProgram(switches[SHORT1FROMMP(mp1) - IDM_SWITCHSTART]);
652 break;
653 }
654 else if (SHORT1FROMMP(mp1) >= IDM_COMMANDSTART &&
655 SHORT1FROMMP(mp1) < IDM_QUICKTOOLSTART) {
656
657 INT x;
658 HWND hwndCnr;
659
660 if (!cmdloaded)
661 load_commands();
662 hwndCnr = TopWindow(hwnd, (HWND) 0);
663 hwndCnr = (HWND) WinSendMsg(WinWindowFromID(hwndCnr, FID_CLIENT),
664 UM_CONTAINERHWND, MPVOID, MPVOID);
665 if (!hwndCnr) {
666 Runtime_Error2(pszSrcFile, __LINE__, IDS_NOWINDOWTEXT);
667 break;
668 }
669 x = SHORT1FROMMP(mp1) - IDM_COMMANDSTART;
670 if (x >= 0) {
671 x++;
672 RunCommand(hwndCnr, x);
673 if (fUnHilite) {
674
675 PCNRITEM pci;
676 DIRCNRDATA *dcd = NULL;
677
678 if (WinQueryWindowUShort(hwndCnr, QWS_ID) != TREE_CNR)
679 dcd = INSTDATA(hwndCnr);
680 pci = (PCNRITEM) WinSendMsg(hwndCnr,
681 CM_QUERYRECORDEMPHASIS,
682 MPFROMLONG(CMA_FIRST),
683 MPFROMSHORT(CRA_CURSORED));
684 if (pci && (INT) pci != -1 && (pci->rc.flRecordAttr & CRA_SELECTED)) {
685 UnHilite(hwnd,
686 TRUE,
687 dcd ? &dcd->lastselection : NULL,
688 dcd ? dcd->ulItemsToUnHilite : 0);
689 }
690 }
691 }
692 }
693 else if (SHORT1FROMMP(mp1) >= IDM_QUICKTOOLSTART &&
694 SHORT1FROMMP(mp1) < IDM_QUICKTOOLSTART + 50) {
695 if (!qtloaded)
696 load_quicktools();
697 if (quicktool[SHORT1FROMMP(mp1) - IDM_QUICKTOOLSTART]) {
698 if (fToolsChanged)
699 save_tools(NULL);
700 if (!load_tools(quicktool[SHORT1FROMMP(mp1) - IDM_QUICKTOOLSTART]))
701 load_tools(NULL);
702 else {
703 strcpy(lasttoolbar,
704 quicktool[SHORT1FROMMP(mp1) - IDM_QUICKTOOLSTART]);
705// PrfWriteProfileString(fmprof, FM3Str, "LastToolbar", lasttoolbar);
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.