source: trunk/dll/mainwnd2.c@ 1131

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

Some additional toolbar enhancements and fixes (tickets 273, 274, 275)

  • 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 1131 2008-08-30 00:19:21Z 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
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 + 51) {
695 if (!qtloaded)
696 load_quicktools();
697 if (quicktool[SHORT1FROMMP(mp1) - IDM_QUICKTOOLSTART - 1]) {
698 if (fToolsChanged)
699 save_tools(NULL);
700 if (!load_tools(quicktool[SHORT1FROMMP(mp1) - IDM_QUICKTOOLSTART - 1]))
701 load_tools(NULL);
702 else {
703 strcpy(lasttoolbar,
704 quicktool[SHORT1FROMMP(mp1) - IDM_QUICKTOOLSTART - 1]);
705 PrfWriteProfileString(fmprof, appname, "LastToolbar", lasttoolbar);
706 }
707 PostMsg(hwndToolback, UM_SETUP2, MPVOID, MPVOID);
708 }
709 }
710 else {
711
712 HWND hwndActive;
713
714 hwndActive = TopWindow(hwnd, (HWND) 0);
715 if (hwndActive)
716 PostMsg(WinWindowFromID(hwndActive, FID_CLIENT), msg, mp1, mp2);
717 }
718 break;
719 }
720 return 0;
721}
722
723static MRESULT EXPENTRY MainWMOnce2(HWND hwnd, ULONG msg, MPARAM mp1,
724 MPARAM mp2)
725{
726 PERSON1DATA *pd;
727
728 switch (msg) {
729 case WM_CREATE:
730 {
731 TID tid;
732
733 WinQueryWindowProcess(hwnd, &mypid, &tid);
734 }
735 hwndMain = hwnd;
736 WinSetWindowUShort(hwnd, QWL_USER + 8, 0);
737 WinSetWindowUShort(hwnd, QWL_USER + 10, 0);
738 WinSetWindowUShort(hwnd, QWL_USER + 12, 0);
739 WinSetWindowUShort(hwnd, QWL_USER + 16, 0);
740 if (_beginthread(MakeMainObjWin, NULL, 245760, MPVOID) == -1) {
741 Runtime_Error(pszSrcFile, __LINE__,
742 GetPString(IDS_COULDNTSTARTTHREADTEXT));
743 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
744 return 0;
745 }
746 else
747 DosSleep(32);//05 Aug 07 GKY 64
748
749 pd = xmallocz(sizeof(PERSON1DATA), pszSrcFile, __LINE__);
750 if (!pd)
751 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
752 else {
753 pd->size = sizeof(PERSON1DATA);
754 WinSetWindowPtr(hwnd, QWL_USER + 4, (PVOID) pd);
755 }
756 {
757 SWP swp;
758 PFNWP oldproc;
759
760 /*
761 * create frame children (not client children, frame children)
762 */
763 DosSleep(1);
764 WinQueryWindowPos(WinQueryWindow(hwnd, QW_PARENT), &swp);
765 oldproc = WinSubclassWindow(WinQueryWindow(hwnd, QW_PARENT),
766 (PFNWP) MainFrameWndProc2);
767 if (oldproc)
768 WinSetWindowPtr(WinQueryWindow(hwnd, QW_PARENT), QWL_USER, (PVOID) oldproc);
769 CommonCreateMainChildren(hwnd, &swp);
770
771 {
772 HWND hwndMenu;
773
774 hwndMenu = WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT), FID_MENU);
775 WinSetWindowULong(hwnd, QWL_USER, hwndMenu);
776 CfgMenuInit(hwndMenu, FALSE); // 14 Feb 08 SHL
777 SetConditionalCascade(hwndMenu, IDM_COMMANDLINESUBMENU, IDM_COMMANDLINE);
778 SetConditionalCascade(hwndMenu, IDM_COMMANDSMENU, IDM_DOITYOURSELF);
779 SetConditionalCascade(hwndMenu, IDM_TOOLSUBMENU, IDM_TOOLBAR);
780 }
781 }
782 WinSetWindowText(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
783 FID_TITLEBAR), "FM/2 Lite");
784 FixSwitchList(WinQueryWindow(hwnd, QW_PARENT), NULL);
785 SetSysMenu(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT), FID_SYSMENU));
786 break;
787
788 case UM_SETUP:
789 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
790 if (pd) {
791
792 CHAR s[CCHMAXPATH];
793 ULONG size;
794 DIRCNRDATA *dcd;
795 HWND hwndC;
796 BOOL dummy = TRUE;
797
798 size = sizeof(BOOL);
799 PrfQueryProfileData(fmprof,
800 realappname, "FM/4 TreeUp", (PVOID) & dummy, &size);
801 if (dummy) {
802 size = sizeof(ULONG);
803 hwndTree = StartTreeCnr(hwnd, 3);
804 PrfQueryProfileData(fmprof,
805 realappname,
806 "FM/4 TreeWidth", (PVOID) & TreeWidth, &size);
807 TreeWidth = max(TreeWidth, 80);
808 }
809 size = sizeof(BOOL);
810 if (PrfQueryProfileData(fmprof,
811 FM3Str,
812 "Toolbar", &dummy, &size) && size && !dummy)
813 WinSendMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_TOOLBAR, 0), MPVOID);
814
815 size = sizeof(s);
816 *s = 0;
817 if (PrfQueryProfileData(fmprof,
818 realappname, "FM/4 Dir1", s, &size) && *s)
819 MakeValidDir(s);
820 else
821 save_dir(s);
822 pd->hwndLastDir = pd->hwndCurr = pd->hwndDir1 =
823 StartDirCnr(hwnd, s, (HWND) 0, 3);
824 size = sizeof(s);
825 *s = 0;
826 if (PrfQueryProfileData(fmprof,
827 realappname, "FM/4 Dir2", s, &size) && *s)
828 MakeValidDir(s);
829 else
830 save_dir(s);
831 pd->hwndDir2 = StartDirCnr(hwnd, s, (HWND) 0, 3);
832 WinSetFocus(HWND_DESKTOP, pd->hwndCurr);
833
834 hwndC = WinWindowFromID(pd->hwndDir1, FID_CLIENT);
835 if (hwndC) {
836 dcd = WinQueryWindowPtr(WinWindowFromID(hwndC, DIR_CNR), QWL_USER);
837 if (dcd) {
838 size = sizeof(INT);
839 if (PrfQueryProfileData(fmprof,
840 realappname,
841 "FM/4 Dir1.Sort",
842 (PVOID) & dcd->sortFlags,
843 &size) && size == sizeof(INT)) {
844 if (!dcd->sortFlags)
845 dcd->sortFlags = SORT_PATHNAME;
846 }
847 size = sizeof(MASK);
848 if (PrfQueryProfileData(fmprof,
849 realappname,
850 "FM/4 Dir1.Filter",
851 (PVOID) & dcd->mask, &size) && size) {
852 if (*dcd->mask.szMask)
853 WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
854 UM_FILTER, MPFROMP(dcd->mask.szMask), MPVOID);
855 }
856 *(dcd->mask.prompt) = 0;
857 size = sizeof(ULONG);
858 if (PrfQueryProfileData(fmprof,
859 realappname,
860 "FM/4 Dir1.View",
861 (PVOID) & dcd->flWindowAttr,
862 &size) && size == sizeof(ULONG)) {
863
864 CNRINFO cnri;
865
866 memset(&cnri, 0, sizeof(CNRINFO));
867 cnri.cb = sizeof(CNRINFO);
868 if (WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
869 CM_QUERYCNRINFO,
870 MPFROMP(&cnri), MPFROMLONG(sizeof(CNRINFO)))) {
871 cnri.flWindowAttr = dcd->flWindowAttr;
872 WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
873 CM_SETCNRINFO,
874 MPFROMP(&cnri), MPFROMLONG(CMA_FLWINDOWATTR));
875 }
876 }
877 }
878 }
879
880 hwndC = WinWindowFromID(pd->hwndDir2, FID_CLIENT);
881 if (hwndC) {
882 dcd = WinQueryWindowPtr(WinWindowFromID(hwndC, DIR_CNR), QWL_USER);
883 if (dcd) {
884 size = sizeof(INT);
885 if (PrfQueryProfileData(fmprof,
886 realappname,
887 "FM/4 Dir2.Sort",
888 (PVOID) & dcd->sortFlags,
889 &size) && size == sizeof(INT)) {
890 if (!dcd->sortFlags)
891 dcd->sortFlags = SORT_PATHNAME;
892 }
893 size = sizeof(MASK);
894 if (PrfQueryProfileData(fmprof,
895 realappname,
896 "FM/4 Dir2.Filter",
897 (PVOID) & dcd->mask, &size) && size) {
898 if (*dcd->mask.szMask)
899 WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
900 UM_FILTER, MPFROMP(dcd->mask.szMask), MPVOID);
901 }
902 *(dcd->mask.prompt) = 0;
903 size = sizeof(ULONG);
904 if (PrfQueryProfileData(fmprof,
905 realappname,
906 "FM/4 Dir2.View",
907 (PVOID) & dcd->flWindowAttr,
908 &size) && size == sizeof(ULONG)) {
909
910 CNRINFO cnri;
911
912 memset(&cnri, 0, sizeof(CNRINFO));
913 cnri.cb = sizeof(CNRINFO);
914 if (WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
915 CM_QUERYCNRINFO,
916 MPFROMP(&cnri), MPFROMLONG(sizeof(CNRINFO)))) {
917 cnri.flWindowAttr = dcd->flWindowAttr;
918 WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
919 CM_SETCNRINFO,
920 MPFROMP(&cnri), MPFROMLONG(CMA_FLWINDOWATTR));
921 }
922 }
923 }
924 }
925 }
926 {
927 ULONG which = 0, size = sizeof(ULONG);
928
929 if (PrfQueryProfileData(fmprof,
930 realappname,
931 "FM/4 Max",
932 (PVOID) & which,
933 &size) && size == sizeof(ULONG) && which) {
934 PostMsg(hwnd,
935 UM_MAXIMIZE,
936 MPFROMLONG(((which == 1) ?
937 pd->hwndDir1 : pd->hwndDir2)), MPVOID);
938 }
939 }
940 PostMsg(hwnd, UM_SIZE, MPVOID, MPVOID);
941 if (!hwndTree)
942 PostMsg(hwnd, UM_BUILDDRIVEBAR, MPVOID, MPVOID);
943 load_tools(NULL);
944 PostMsg(hwndToolback, UM_SETUP2, MPVOID, MPVOID);
945 fRunning = TRUE;
946 return 0;
947
948 case WM_SAVEAPPLICATION:
949 WinStoreWindowPos(FM2Str,
950 "MainWindowPos2", WinQueryWindow(hwnd, QW_PARENT));
951 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
952 if (pd) {
953
954 CHAR s[CCHMAXPATH];
955 HWND hwndC;
956 DIRCNRDATA *dcd;
957 ULONG flWindowAttr;
958
959 *s = 0;
960 WinSendMsg(pd->hwndDir1, UM_CONTAINERDIR, MPFROMP(s), MPVOID);
961 if (*s) {
962 MakeValidDir(s);
963 PrfWriteProfileString(fmprof, realappname, "FM/4 Dir1", s);
964 }
965 *s = 0;
966 WinSendMsg(pd->hwndDir2, UM_CONTAINERDIR, MPFROMP(s), MPVOID);
967 if (*s) {
968 MakeValidDir(s);
969 PrfWriteProfileString(fmprof, realappname, "FM/4 Dir2", s);
970 }
971 flWindowAttr = (pd->hwndMax == pd->hwndDir1) ?
972 1 : (pd->hwndMax == pd->hwndDir2) ? 2 : 0;
973 PrfWriteProfileData(fmprof,
974 realappname,
975 "FM/4 Max", &flWindowAttr, sizeof(flWindowAttr));
976 hwndC = WinWindowFromID(pd->hwndDir1, FID_CLIENT);
977 if (hwndC) {
978 dcd = WinQueryWindowPtr(WinWindowFromID(hwndC, DIR_CNR), QWL_USER);
979 if (dcd) {
980 flWindowAttr = dcd->flWindowAttr;
981 if (!fLeaveTree && (flWindowAttr & CV_TREE)) {
982 flWindowAttr &= (~(CV_TREE | CV_ICON | CV_DETAIL | CV_TEXT));
983 if (dcd->lastattr) {
984 if (dcd->lastattr & CV_TEXT)
985 flWindowAttr |= CV_TEXT;
986 else if (dcd->lastattr & CV_DETAIL)
987 flWindowAttr |= CV_DETAIL;
988 else if (dcd->lastattr & CV_ICON)
989 flWindowAttr |= CV_ICON;
990 else
991 flWindowAttr |= CV_NAME;
992 }
993 else
994 flWindowAttr |= CV_NAME;
995 }
996 PrfWriteProfileData(fmprof,
997 realappname,
998 "FM/4 Dir1.Sort",
999 (PVOID) & dcd->sortFlags, sizeof(INT));
1000 PrfWriteProfileData(fmprof,
1001 realappname,
1002 "FM/4 Dir1.Filter",
1003 (PVOID) & dcd->mask, sizeof(MASK));
1004 PrfWriteProfileData(fmprof,
1005 realappname,
1006 "FM/4 Dir1.View",
1007 (PVOID) & flWindowAttr, sizeof(ULONG));
1008 }
1009 }
1010
1011 hwndC = WinWindowFromID(pd->hwndDir2, FID_CLIENT);
1012 if (hwndC) {
1013 dcd = WinQueryWindowPtr(WinWindowFromID(hwndC, DIR_CNR), QWL_USER);
1014 if (dcd) {
1015 flWindowAttr = dcd->flWindowAttr;
1016 if (!fLeaveTree && (flWindowAttr & CV_TREE)) {
1017 flWindowAttr &= (~(CV_TREE | CV_ICON | CV_DETAIL | CV_TEXT));
1018 if (dcd->lastattr) {
1019 if (dcd->lastattr & CV_TEXT)
1020 flWindowAttr |= CV_TEXT;
1021 else if (dcd->lastattr & CV_DETAIL)
1022 flWindowAttr |= CV_DETAIL;
1023 else if (dcd->lastattr & CV_ICON)
1024 flWindowAttr |= CV_ICON;
1025 else
1026 flWindowAttr |= CV_NAME;
1027 }
1028 else
1029 flWindowAttr |= CV_NAME;
1030 }
1031 PrfWriteProfileData(fmprof,
1032 realappname,
1033 "FM/4 Dir2.Sort",
1034 (PVOID) & dcd->sortFlags, sizeof(INT));
1035 PrfWriteProfileData(fmprof,
1036 realappname,
1037 "FM/4 Dir2.Filter",
1038 (PVOID) & dcd->mask, sizeof(MASK));
1039 PrfWriteProfileData(fmprof,
1040 realappname,
1041 "FM/4 Dir2.View",
1042 (PVOID) & flWindowAttr, sizeof(ULONG));
1043 }
1044 }
1045 }
1046 break;
1047 }
1048 return WinDefWindowProc(hwnd, msg, mp1, mp2);
1049}
1050
1051MRESULT EXPENTRY MainWndProc2(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
1052{
1053 PERSON1DATA *pd;
1054
1055 switch (msg) {
1056 case WM_SAVEAPPLICATION:
1057 case UM_SETUP:
1058 case WM_CREATE:
1059 return MainWMOnce2(hwnd, msg, mp1, mp2);
1060
1061 case UM_THREADUSE:
1062 case UM_LOADFILE:
1063 case UM_BUILDDRIVEBAR:
1064 return CommonMainWndProc(hwnd, msg, mp1, mp2);
1065
1066 case UM_SETUP2:
1067 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
1068 if (pd) {
1069 if (mp1) {
1070 if (pd->hwndDir1 && (!pd->hwndMax || pd->hwndMax == pd->hwndDir1))
1071 BoxWindow(pd->hwndDir1, (HPS) 0, CLR_PALEGRAY);
1072 if (pd->hwndDir2 && (!pd->hwndMax || pd->hwndMax == pd->hwndDir2))
1073 BoxWindow(pd->hwndDir2, (HPS) 0, CLR_PALEGRAY);
1074 if (hwndTree)
1075 BoxWindow(hwndTree, (HPS) 0, CLR_PALEGRAY);
1076 }
1077 else {
1078 if (hwndTree)
1079 BoxWindow(hwndTree,
1080 (HPS) 0,
1081 (pd->hwndCurr == hwndTree) ? CLR_RED : CLR_WHITE);
1082 if (!pd->hwndMax || pd->hwndMax == pd->hwndDir1)
1083 BoxWindow(pd->hwndDir1,
1084 (HPS) 0,
1085 (pd->hwndDir1 == pd->hwndCurr) ?
1086 CLR_RED :
1087 (pd->hwndDir1 == pd->hwndLastDir) ?
1088 CLR_DARKRED : CLR_PALEGRAY);
1089 if (!pd->hwndMax || pd->hwndMax == pd->hwndDir2)
1090 BoxWindow(pd->hwndDir2,
1091 (HPS) 0,
1092 (pd->hwndDir2 == pd->hwndCurr) ?
1093 CLR_RED :
1094 (pd->hwndDir2 == pd->hwndLastDir) ?
1095 CLR_DARKRED : CLR_PALEGRAY);
1096 }
1097 }
1098 return 0;
1099
1100 case WM_BUTTON1DOWN:
1101 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
1102 if (hwndTree) {
1103
1104 SWP swp;
1105
1106 WinQueryWindowPos(hwndTree, &swp);
1107 if (SHORT1FROMMP(mp1) > (swp.x + swp.cx) - 3 &&
1108 SHORT1FROMMP(mp1) < (swp.x + swp.cx) + 3) {
1109
1110 SWP swpC;
1111 TRACKINFO track;
1112
1113 WinQueryWindowPos(hwnd, &swpC);
1114 track.cxBorder = 4;
1115 track.cyBorder = 4;
1116 track.cxGrid = 1;
1117 track.cyGrid = 1;
1118 track.cxKeyboard = 8;
1119 track.cyKeyboard = 8;
1120 track.rclTrack.yBottom = 2;
1121 track.rclTrack.yTop = swpC.cy - 4;
1122 track.rclTrack.xLeft = 2;
1123 track.rclTrack.xRight = swp.x + swp.cx + 2;
1124 track.rclBoundary = track.rclTrack;
1125 track.rclBoundary.xRight = swpC.cx - 80;
1126 track.ptlMinTrackSize.x = 80;
1127 track.ptlMinTrackSize.y = swpC.cy - 4;
1128 track.ptlMaxTrackSize.x = swpC.cx - 80;
1129 track.ptlMaxTrackSize.y = swpC.cy - 4;
1130 track.fs = TF_RIGHT;
1131 if (WinTrackRect(hwnd, (HPS) 0, &track)) {
1132 TreeWidth = track.rclTrack.xRight - track.rclTrack.xLeft;
1133 PrfWriteProfileData(fmprof,
1134 realappname,
1135 "FM/4 TreeWidth", &TreeWidth, sizeof(ULONG));
1136 WinSendMsg(hwnd, UM_SETUP2, MPFROMLONG(1), MPVOID);
1137 PostMsg(hwnd, UM_SIZE, MPVOID, MPVOID);
1138 }
1139 return (MRESULT) TRUE;
1140 }
1141 }
1142 break;
1143
1144 case WM_MOUSEMOVE:
1145 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
1146 if (hwndTree) {
1147
1148 SWP swp;
1149
1150 if (WinQueryWindowPos(hwndTree, &swp)) {
1151 if (SHORT1FROMMP(mp1) > (swp.x + swp.cx) - 3 &&
1152 SHORT1FROMMP(mp1) < (swp.x + swp.cx) + 3)
1153 WinSetPointer(HWND_DESKTOP, hptrEW);
1154 else
1155 WinSetPointer(HWND_DESKTOP, hptrArrow);
1156 }
1157 else
1158 WinSetPointer(HWND_DESKTOP, hptrArrow);
1159 }
1160 return (MRESULT) TRUE;
1161
1162 case WM_BUTTON1UP:
1163 case WM_BUTTON2UP:
1164 case WM_BUTTON3UP:
1165 case WM_CHAR:
1166 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
1167 break;
1168
1169 case UM_ADVISEFOCUS:
1170 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
1171 if (mp1 && pd && (HWND) mp1 != pd->hwndCurr) {
1172 if ((HWND) mp1 != hwndTree)
1173 pd->hwndLastDir = (HWND) mp1;
1174 pd->hwndCurr = (HWND) mp1;
1175 WinSendMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
1176 }
1177 return 0;
1178
1179 case UM_MAXIMIZE:
1180 if (mp1) {
1181 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
1182 if (pd) {
1183 WinSendMsg(hwnd, UM_SETUP2, MPFROMLONG(1), MPVOID);
1184 if (pd->hwndMax != (HWND) mp1) {
1185 pd->hwndMax = (HWND) mp1;
1186 WinSetFocus(HWND_DESKTOP, pd->hwndMax);
1187 }
1188 else
1189 pd->hwndMax = (HWND) 0;
1190 PostMsg(hwnd, UM_SIZE, MPVOID, MPVOID);
1191 }
1192 }
1193 return 0;
1194
1195 case WM_INITMENU:
1196 switch (SHORT1FROMMP(mp1)) {
1197 case IDM_FILESMENU:
1198 case IDM_VIEWSMENU:
1199 case IDM_DETAILSSETUP:
1200 case IDM_COMMANDSMENU:
1201 case IDM_SORTSUBMENU:
1202 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
1203 if (pd)
1204 WinSendMsg(pd->hwndCurr, UM_INITMENU, mp1, mp2);
1205 break;
1206 case IDM_CONFIGMENU:
1207 WinCheckMenuItem((HWND) mp2, IDM_TOOLSUBMENU, fToolbar);
1208 WinCheckMenuItem((HWND) mp2, IDM_AUTOVIEW, fAutoView);
1209 break;
1210 case IDM_TOOLSUBMENU:
1211 WinCheckMenuItem((HWND) mp2, IDM_TOOLBAR, fToolbar);
1212 WinCheckMenuItem((HWND) mp2, IDM_TEXTTOOLS, fTextTools);
1213 WinCheckMenuItem((HWND) mp2, IDM_TOOLTITLES, fToolTitles);
1214 break;
1215 case IDM_WINDOWSMENU:
1216 WinCheckMenuItem((HWND) mp2, IDM_VTREE, (hwndTree != (HWND) 0));
1217 WinCheckMenuItem((HWND) mp2, IDM_TILEBACKWARDS, fTileBackwards);
1218 SetupWinList((HWND) mp2, hwnd, WinQueryWindow(hwnd, QW_PARENT));
1219 break;
1220 }
1221 break;
1222
1223 case WM_SETFOCUS:
1224 if (mp2)
1225 PostMsg(hwnd, UM_FOCUSME, MPVOID, MPVOID);
1226 break;
1227
1228 case UM_FOCUSME:
1229 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
1230 if (pd)
1231 WinSetFocus(HWND_DESKTOP, pd->hwndCurr);
1232 return 0;
1233
1234 case UM_RESCAN:
1235 return 0;
1236
1237 case UM_SIZE:
1238 {
1239 SWP swp;
1240
1241 if (WinQueryWindowPos(hwnd, &swp)) {
1242 mp1 = MPFROM2SHORT(swp.cx, swp.cy);
1243 mp2 = MPFROM2SHORT(swp.cx, swp.cy);
1244 }
1245 else
1246 return 0;
1247 }
1248 /* intentional fallthru */
1249 case WM_SIZE:
1250 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
1251 if (mp1 && mp2 && pd && pd->hwndDir1 && pd->hwndDir2) {
1252 if (hwndTree)
1253 WinSetWindowPos(hwndTree,
1254 HWND_TOP,
1255 2,
1256 2,
1257 TreeWidth - 4,
1258 SHORT2FROMMP(mp2) - 4,
1259 SWP_SHOW | SWP_MOVE | SWP_SIZE);
1260 else
1261 TreeWidth = 0;
1262 if (!pd->hwndMax) {
1263 if (fTileBackwards) {
1264 WinSetWindowPos(pd->hwndDir1, HWND_TOP,
1265 (((SHORT1FROMMP(mp2) - TreeWidth) / 2) +
1266 TreeWidth) + 2,
1267 2,
1268 ((SHORT1FROMMP(mp2) - TreeWidth) / 2) - 4,
1269 SHORT2FROMMP(mp2) - 4,
1270 SWP_SHOW | SWP_MOVE | SWP_SIZE);
1271 WinSetWindowPos(pd->hwndDir2, HWND_TOP,
1272 TreeWidth + 2,
1273 2,
1274 ((SHORT1FROMMP(mp2) - TreeWidth) / 2) - 4,
1275 SHORT2FROMMP(mp2) - 4,
1276 SWP_SHOW | SWP_MOVE | SWP_SIZE);
1277 }
1278 else {
1279 WinSetWindowPos(pd->hwndDir1, HWND_TOP,
1280 TreeWidth + 2,
1281 2,
1282 (SHORT1FROMMP(mp2) - TreeWidth) - 4,
1283 (SHORT2FROMMP(mp2) / 2) - 4,
1284 SWP_SHOW | SWP_MOVE | SWP_SIZE);
1285 WinSetWindowPos(pd->hwndDir2, HWND_TOP,
1286 TreeWidth + 2,
1287 (SHORT2FROMMP(mp2) / 2) + 2,
1288 (SHORT1FROMMP(mp2) - TreeWidth) - 4,
1289 (SHORT2FROMMP(mp2) / 2) - 4,
1290 SWP_SHOW | SWP_MOVE | SWP_SIZE);
1291 }
1292 }
1293 else {
1294
1295 HWND hwndOther;
1296
1297 WinSetWindowPos(pd->hwndMax, HWND_TOP,
1298 TreeWidth + 2,
1299 2,
1300 (SHORT1FROMMP(mp2) - TreeWidth) - 4,
1301 SHORT2FROMMP(mp2) - 4,
1302 SWP_SHOW | SWP_MOVE | SWP_SIZE);
1303 hwndOther = (pd->hwndMax == pd->hwndDir1) ?
1304 pd->hwndDir2 : pd->hwndDir1;
1305 WinSetWindowPos(hwndOther, HWND_BOTTOM, 0, 0, 0, 0, SWP_HIDE);
1306 }
1307 WinSendMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
1308 }
1309 if (msg == UM_SIZE)
1310 return 0;
1311 break;
1312
1313 case WM_ERASEBACKGROUND:
1314 WinFillRect((HPS) mp1, (PRECTL) mp2, 0x00d0d0d0);
1315 return 0;
1316
1317 case WM_PAINT:
1318 {
1319 HPS hps;
1320 RECTL rcl;
1321
1322 hps = WinBeginPaint(hwnd, NULLHANDLE, NULL);
1323 if (hps) {
1324 WinQueryWindowRect(hwnd, &rcl);
1325 WinFillRect(hps, (PRECTL) & rcl, CLR_PALEGRAY);
1326 WinEndPaint(hps);
1327 WinSendMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
1328 }
1329 }
1330 break;
1331
1332 case UM_COMMAND:
1333 case WM_COMMAND:
1334 return MainWMCommand2(hwnd, msg, mp1, mp2);
1335
1336 case WM_CLOSE:
1337 fAmClosing = TRUE;
1338 WinSendMsg(hwnd, WM_SAVEAPPLICATION, MPVOID, MPVOID);
1339 CloseChildren(hwnd);
1340 PostMsg(hwnd, UM_CLOSE, MPVOID, MPVOID);
1341 DosSleep(1);
1342 return 0;
1343
1344 case UM_CLOSE:
1345 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
1346 return 0;
1347
1348 case WM_DESTROY:
1349 hwndMain = (HWND) 0;
1350 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
1351 xfree(pd, pszSrcFile, __LINE__);
1352 if (!PostMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID))
1353 WinSendMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID);
1354 break;
1355 }
1356 return WinDefWindowProc(hwnd, msg, mp1, mp2);
1357}
1358
1359HWND StartFM32(HAB hab, INT argc, CHAR ** argv)
1360{
1361 HWND hwndFrame, hwndClient;
1362 ULONG FrameFlags = FCF_TITLEBAR | FCF_SYSMENU |
1363 FCF_SIZEBORDER | FCF_MINMAX |
1364 FCF_ACCELTABLE | FCF_MENU | FCF_ICON | FCF_TASKLIST | FCF_NOBYTEALIGN;
1365
1366 {
1367 INT x;
1368
1369 for (x = 1; x < argc; x++) {
1370 if (*argv[x] == '+' && !argv[x][1])
1371 fLogFile = TRUE;
1372 if (*argv[x] == '-') {
1373 if (argv[x][1])
1374 strcpy(profile, &argv[x][1]);
1375 }
1376 }
1377 }
1378 {
1379 CHAR inipath[CCHMAXPATH], fullpath[CCHMAXPATH];
1380 FILESTATUS3 fsa;
1381
1382 if (PrfQueryProfileString(HINI_USERPROFILE,
1383 FM2Str,
1384 "Home", NULL, inipath, sizeof(inipath))) {
1385 if (!DosQueryPathInfo(inipath, FIL_STANDARD, &fsa, sizeof(fsa))) {
1386 if (fsa.attrFile & FILE_DIRECTORY) {
1387 if (DosQueryPathInfo(inipath,
1388 FIL_QUERYFULLNAME, fullpath, sizeof(fullpath)))
1389 strcpy(fullpath, inipath);
1390 switch_to(fullpath);
1391 }
1392 }
1393 }
1394 }
1395
1396 hwndFrame = WinCreateStdWindow(HWND_DESKTOP,
1397 WS_VISIBLE,
1398 &FrameFlags,
1399 WC_MAINWND2,
1400 NULL,
1401 WS_VISIBLE | WS_ANIMATE,
1402 FM3ModHandle, MAIN2_FRAME, &hwndClient);
1403 if (hwndFrame) {
1404 hwndMainMenu = WinWindowFromID(hwndFrame, FID_MENU);
1405 if (!WinRestoreWindowPos(FM2Str, "MainWindowPos2", hwndFrame)) {
1406
1407 ULONG fl = SWP_MOVE | SWP_SIZE;
1408 RECTL rcl;
1409 ULONG icz = WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 3L;
1410 ULONG bsz = WinQuerySysValue(HWND_DESKTOP, SV_CYSIZEBORDER);
1411
1412 WinQueryWindowRect(HWND_DESKTOP, &rcl);
1413 rcl.yBottom += icz;
1414 rcl.yTop -= bsz;
1415 rcl.xLeft += bsz;
1416 rcl.xRight -= bsz;
1417 WinSetWindowPos(hwndFrame,
1418 HWND_TOP,
1419 rcl.xLeft,
1420 rcl.yBottom,
1421 rcl.xRight - rcl.xLeft, rcl.yTop - rcl.yBottom, fl);
1422 }
1423 if (fLogFile)
1424 LogFileHandle = _fsopen("FM2.LOG", "a+", SH_DENYWR);
1425 if (hwndHelp)
1426 WinAssociateHelpInstance(hwndHelp, hwndFrame);
1427 PostMsg(hwndClient, UM_SETUP, MPFROMLONG(argc), MPFROMP(argv));
1428 }
1429 return hwndFrame;
1430}
1431
1432#pragma alloc_text(PERSON11,MainFrameWndProc2,MainWndProc2)
1433#pragma alloc_text(PERSON12,StartFM32,MainWMOnce2)
1434#pragma alloc_text(PERSON13,MainWMCommand2)
Note: See TracBrowser for help on using the repository browser.