source: trunk/dll/mainwnd2.c@ 1125

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

Ticket 259: Support saving and restoring a toolbar with DirCnr states.

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