source: trunk/dll/mainwnd2.c@ 985

Last change on this file since 985 was 985, checked in by Gregg Young, 18 years ago

Update sizes dialog (ticket 44); Make max command line length user settable (ticket 199); use xfree for free in most cases (ticket 212); initial code to check for valid ini file (ticket 102); Some additional refactoring and structure rework; Some documentation updates;

  • 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 985 2008-03-01 01:37:14Z 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***********************************************************************/
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 "arccnrs.h" // BldQuotedFileName
45#include "errutil.h" // Dos_Error...
46#include "strutil.h" // GetPString
47#include "notebook.h" // CfgDlgProc
48#include "fm3dll.h"
49
50typedef struct
51{
52 USHORT size;
53 USHORT dummy;
54 HWND hwndDir1;
55 HWND hwndDir2;
56 HWND hwndCurr;
57 HWND hwndLastDir;
58 HWND hwndMax;
59}
60PERSON1DATA;
61
62static PSZ pszSrcFile = __FILE__;
63
64static MRESULT EXPENTRY MainFrameWndProc2(HWND hwnd, ULONG msg, MPARAM mp1,
65 MPARAM mp2)
66{
67 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
68
69 switch (msg) {
70 case WM_ADJUSTWINDOWPOS:
71 {
72 SWP *pswp;
73
74 pswp = (SWP *) mp1;
75 if (pswp->fl & (SWP_SHOW | SWP_RESTORE))
76 PostMsg(WinWindowFromID(hwnd, FID_CLIENT), UM_SIZE, MPVOID, MPVOID);
77 if (fDataMin && !fAmClosing) {
78 if (pswp->fl & (SWP_HIDE | SWP_MINIMIZE)) {
79
80 SWP swp;
81
82 WinQueryWindowPos(hwnd, &swp);
83 PostMsg(hwnd, UM_FOCUSME, MPFROMLONG(swp.fl), MPVOID);
84 HideNote();
85 }
86 else if (pswp->fl & (SWP_SHOW | SWP_RESTORE)) {
87 if (DataHwnd)
88 PostMsg(DataHwnd, WM_CLOSE, MPVOID, MPVOID);
89 }
90 }
91 if (!fAmClosing) {
92 if (pswp->fl & (SWP_HIDE | SWP_MINIMIZE))
93 HideNote();
94 }
95 }
96 break;
97
98 case UM_FOCUSME:
99 CreateDataBar(HWND_DESKTOP, (ULONG) mp1);
100 return 0;
101
102 case WM_BUTTON1UP:
103 case WM_BUTTON2UP:
104 case WM_BUTTON3UP:
105 case WM_MOUSEMOVE:
106 case WM_CHORD:
107 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
108 break;
109
110 case WM_CHAR:
111 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
112 break;
113
114 case WM_CONTROL:
115 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), UM_CONTROL, mp1,
116 mp2);
117
118 case WM_COMMAND:
119 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
120
121 case WM_CALCFRAMERECT:
122 {
123 MRESULT mr;
124 PRECTL prectl;
125 LONG sheight = 20, bheight = 20;
126
127 mr = (oldproc) ? oldproc(hwnd, msg, mp1, mp2) :
128 PFNWPFrame(hwnd, msg, mp1, mp2);
129
130 /*
131 * Calculate the position of the client rectangle.
132 * Otherwise, we'll see a lot of redraw when we move the
133 * client during WM_FORMATFRAME.
134 */
135
136 if (mr && mp2) {
137 prectl = (PRECTL) mp1;
138 if (prectl->yBottom != prectl->yTop) {
139 {
140 HPS hps;
141 POINTL aptl[TXTBOX_COUNT];
142
143 hps = WinGetPS(hwndStatus);
144 GpiQueryTextBox(hps, 6, "$`WjgT", TXTBOX_COUNT, aptl);
145 WinReleasePS(hps);
146 sheight = aptl[TXTBOX_TOPLEFT].y + 6;
147 hps = WinGetPS(hwndName);
148 GpiQueryTextBox(hps, 6, "$`WjgT", TXTBOX_COUNT, aptl);
149 WinReleasePS(hps);
150 bheight = aptl[TXTBOX_TOPLEFT].y + 6;
151 }
152 prectl->yBottom += (sheight + 4);
153 prectl->yTop -= (sheight + 4);
154 prectl->yBottom += (bheight + 4);
155 prectl->yTop -= (bheight + 4);
156 if (fToolbar) {
157 if (!fTextTools)
158 prectl->yTop -= ((fToolTitles) ? 50 : 40);
159 else
160 prectl->yTop -= 32;
161 }
162 ResizeDrives(WinWindowFromID(hwnd, MAIN_DRIVES),
163 ((prectl->xRight -
164 (WinQuerySysValue(HWND_DESKTOP,
165 SV_CYSIZEBORDER) * 2)) - 4));
166 prectl->yTop -= (16 * (DriveLines * 18));
167 prectl->yTop -= 2;
168 if (fAutoView) {
169 AutoviewHeight = min(AutoviewHeight,
170 (prectl->yTop - prectl->yBottom) - 116);
171 AutoviewHeight = max(AutoviewHeight, 36);
172 prectl->yBottom += (AutoviewHeight + 6);
173 }
174 }
175 }
176 return mr;
177 }
178
179 case WM_FORMATFRAME:
180 {
181 SHORT sCount, soldCount;
182 PSWP pswp, pswpClient, pswpNew;
183 SWP swpClient;
184 ULONG theight = 48L, dheight = 20, bheight = 20, sheight = 20;
185 LONG width, lastx;
186
187 sCount = (SHORT) ((oldproc) ? oldproc(hwnd, msg, mp1, mp2) :
188 PFNWPFrame(hwnd, msg, mp1, mp2));
189 soldCount = sCount;
190 /*
191 * Reformat the frame to "squeeze" the client
192 * and make room for status window sibling beneath
193 * and toolbar above (if toolbar's on) and userlists
194 * (if userlists are on).
195 */
196
197 pswp = (PSWP) mp1;
198 {
199 SHORT x;
200
201 for (x = 0; x < sCount; x++) {
202 if (WinQueryWindowUShort(pswp->hwnd, QWS_ID) == FID_CLIENT) {
203 pswpClient = pswp;
204 break;
205 }
206 pswp++;
207 }
208 }
209
210 {
211 HPS hps;
212 POINTL aptl[TXTBOX_COUNT];
213
214 hps = WinGetPS(hwndStatus);
215 GpiQueryTextBox(hps, 6, "$`WjgT", TXTBOX_COUNT, aptl);
216 WinReleasePS(hps);
217 bheight = sheight = aptl[TXTBOX_TOPLEFT].y + 6;
218 hps = WinGetPS(hwndName);
219 GpiQueryTextBox(hps, 6, "$`WjgT", TXTBOX_COUNT, aptl);
220 WinReleasePS(hps);
221 bheight = aptl[TXTBOX_TOPLEFT].y + 6;
222 }
223
224 pswpNew = (PSWP) mp1 + soldCount;
225 *pswpNew = *pswpClient;
226 swpClient = *pswpClient;
227 pswpNew->hwnd = hwndStatus;
228 pswpNew->x = swpClient.x + 3;
229 pswpNew->y = swpClient.y + 2;
230 width = (swpClient.cx / 2) - 6;
231 width = max(width, 10);
232 pswpNew->cx = width - 6;
233 pswpNew->cy = sheight;
234 pswpClient->y = pswpNew->y + pswpNew->cy + 3;
235 pswpClient->cy = (swpClient.cy - pswpNew->cy) - 3;
236 sCount++;
237
238 pswpNew = (PSWP) mp1 + (soldCount + 1);
239 *pswpNew = *pswpClient;
240 pswpNew->hwnd = hwndStatus2;
241 pswpNew->x = width + 8;
242 pswpNew->y = swpClient.y + 2;
243 pswpNew->cx = width - 6;
244 pswpNew->cy = sheight;
245 sCount++;
246
247 if (fToolbar) {
248 if (fTextTools)
249 theight = 32L;
250 else if (!fToolTitles)
251 theight = 40L;
252 pswpNew = (PSWP) mp1 + (soldCount + 2);
253 *pswpNew = *pswpClient;
254 pswpNew->hwnd = WinWindowFromID(hwnd, MAIN_TOOLS);
255 pswpNew->x = swpClient.x + 2;
256 pswpNew->y = (swpClient.y + swpClient.cy) - (theight - 2);
257 pswpNew->cx = swpClient.cx - 4;
258 pswpNew->cy = theight - 4;
259 pswpClient->cy -= theight;
260 sCount++;
261 }
262 else
263 WinShowWindow(WinWindowFromID(hwnd, MAIN_TOOLS), FALSE);
264
265 ResizeDrives(WinWindowFromID(hwnd, MAIN_DRIVES), pswpClient->cx - 4);
266 pswpNew = (PSWP) mp1 + (soldCount + 2 + (fToolbar != FALSE));
267 *pswpNew = *pswpClient;
268 pswpNew->hwnd = WinWindowFromID(hwnd, MAIN_DRIVES);
269 pswpNew->x = swpClient.x + 2;
270 dheight += ((dheight - 2) * DriveLines);
271 pswpNew->y = (swpClient.y + swpClient.cy) - (dheight - 2);
272 if (fToolbar)
273 pswpNew->y -= theight;
274 pswpNew->cx = swpClient.cx - 4;
275 pswpNew->cy = dheight - 4;
276 pswpClient->cy -= dheight;
277 pswpClient->cy -= 2;
278 sCount++;
279
280 if (fAutoView) {
281 pswpNew = (PSWP) mp1 + (soldCount + 3 + (fToolbar != FALSE));
282 *pswpNew = *pswpClient;
283 pswpNew->hwnd = (fComments) ? hwndAutoMLE : hwndAutoview;
284 pswpNew->x = pswpClient->x + 3;
285 pswpNew->y = pswpClient->y + 3;
286 if (fMoreButtons)
287 pswpNew->y += (bheight + 4);
288 pswpNew->cx = pswpClient->cx - 6;
289 AutoviewHeight = min(AutoviewHeight, pswpClient->cy - 116);
290 AutoviewHeight = max(AutoviewHeight, 36);
291 pswpNew->cy = AutoviewHeight;
292 pswpClient->y += (AutoviewHeight + 6);
293 pswpClient->cy -= (AutoviewHeight + 6);
294 sCount++;
295 WinShowWindow((fComments) ? hwndAutoview : hwndAutoMLE, FALSE);
296 }
297 else {
298 WinShowWindow(hwndAutoview, FALSE);
299 WinShowWindow(hwndAutoMLE, FALSE);
300 }
301
302 pswpNew = (PSWP) mp1 + (soldCount + 3 + (fToolbar != FALSE) +
303 (fAutoView != FALSE));
304 *pswpNew = *pswpClient;
305 pswpNew->hwnd = WinWindowFromID(hwnd, MAIN_LED);
306 pswpNew->x = (swpClient.x + swpClient.cx) - 12;
307 pswpNew->y = swpClient.y;
308 pswpNew->cx = 12;
309 pswpNew->cy = 12;
310 sCount++;
311
312 pswpNew = (PSWP) mp1 + (soldCount + 4 + (fToolbar != FALSE) +
313 (fAutoView != FALSE));
314 *pswpNew = *pswpClient;
315 pswpNew->hwnd = WinWindowFromID(hwnd, MAIN_LEDHDR);
316 pswpNew->x = (swpClient.x + swpClient.cx) - 12;
317 pswpNew->y = swpClient.y + 12;
318 pswpNew->cx = 12;
319 pswpNew->cy = sheight - 8;
320 sCount++;
321
322 pswpNew = (PSWP) mp1 + (soldCount + 5 + (fToolbar != FALSE) +
323 (fAutoView != FALSE));
324 *pswpNew = *pswpClient;
325 pswpNew->hwnd = hwndName;
326 pswpNew->x = swpClient.x + 3;
327 pswpNew->y = swpClient.y + (sheight + 6);
328 pswpNew->cx = ((swpClient.cx / 2) + (swpClient.cx / 5)) - 3;
329 lastx = pswpNew->x + pswpNew->cx;
330 pswpNew->cy = bheight;
331 pswpClient->y += (bheight + 4);
332 pswpClient->cy -= (bheight + 4);
333 sCount++;
334
335 pswpNew = (PSWP) mp1 + (soldCount + 6 + (fToolbar != FALSE) +
336 (fAutoView != FALSE));
337 *pswpNew = *pswpClient;
338 pswpNew->hwnd = hwndDate;
339 pswpNew->x = lastx + 3;
340 pswpNew->y = swpClient.y + (sheight + 6);
341 pswpNew->cx = (swpClient.cx / 6) + (swpClient.cx / 16) - 3;
342 lastx = pswpNew->x + pswpNew->cx;
343 pswpNew->cy = bheight;
344 sCount++;
345
346 pswpNew = (PSWP) mp1 + (soldCount + 7 + (fToolbar != FALSE) +
347 (fAutoView != FALSE));
348 *pswpNew = *pswpClient;
349 pswpNew->hwnd = hwndAttr;
350 pswpNew->x = lastx + 3;
351 pswpNew->y = swpClient.y + (sheight + 6);
352 pswpNew->cx = (swpClient.cx - pswpNew->x) - 1;
353 pswpNew->cy = bheight;
354 sCount++;
355
356 return MRFROMSHORT(sCount);
357 }
358
359 case WM_QUERYFRAMECTLCOUNT:
360 {
361 SHORT sCount;
362
363 sCount = (SHORT) ((oldproc) ? oldproc(hwnd, msg, mp1, mp2) :
364 PFNWPFrame(hwnd, msg, mp1, mp2));
365 sCount += 8;
366 if (fToolbar)
367 sCount++;
368 if (fAutoView)
369 sCount++;
370 return MRFROMSHORT(sCount);
371 }
372
373 case WM_CLOSE:
374 WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
375 return 0;
376 }
377 return (oldproc) ? oldproc(hwnd, msg, mp1, mp2) :
378 PFNWPFrame(hwnd, msg, mp1, mp2);
379}
380
381static MRESULT EXPENTRY MainWMCommand2(HWND hwnd, ULONG msg, MPARAM mp1,
382 MPARAM mp2)
383{
384 PERSON1DATA *pd;
385
386 SetShiftState();
387 switch (SHORT1FROMMP(mp1)) {
388 case IDM_TOAUTOMLE:
389 case IDM_CLI:
390 case IDM_CREATETOOL:
391 case IDM_ABOUT:
392 case IDM_WINFULLSCREEN:
393 case IDM_DOSCOMMANDLINE:
394 case IDM_INIVIEWER:
395 case IDM_EDITASSOC:
396 case IDM_COMMANDLINE:
397 case IDM_KILLPROC:
398 case IDM_TOOLBAR:
399 case IDM_TEXTTOOLS:
400 case IDM_TOOLTITLES:
401 case IDM_TOOLLEFT:
402 case IDM_TOOLRIGHT:
403 case IDM_AUTOVIEWCOMMENTS:
404 case IDM_AUTOVIEWFILE:
405 case IDM_AUTOVIEW:
406// case IDM_SYSINFO:
407 case IDM_HIDENOTEWND:
408 case IDM_SHOWNOTEWND:
409 case IDM_INSTANT:
410 case IDM_HELPCONTEXT:
411 case IDM_HELPHINTS:
412 case IDM_HELPPIX:
413 case IDM_KILLME:
414 case IDM_EXIT:
415 case IDM_HELPTUTOR:
416 case IDM_HELPCONTENTS:
417 case IDM_HELPGENERAL:
418 case IDM_HELPKEYS:
419 case IDM_HELPMOUSE:
420 case IDM_HELP:
421 return MainWMCommand(hwnd, msg, mp1, mp2);
422
423 case IDM_REMAP:
424 WinDlgBox(HWND_DESKTOP,
425 hwnd, RemapDlgProc, FM3ModHandle, MAP_FRAME, NULL);
426 break;
427
428 case IDM_TWODIRS: // Menu action
429 case IDM_WINDOWDLG: // Toolbar action
430 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
431 if (pd) {
432
433 WALK2 wa;
434
435 memset(&wa, 0, sizeof(wa));
436 wa.size = sizeof(wa);
437 *wa.szCurrentPath1 = 0;
438 WinSendMsg(pd->hwndDir1,
439 UM_CONTAINERDIR, MPFROMP(wa.szCurrentPath1), MPVOID);
440 MakeValidDir(wa.szCurrentPath1);
441 *wa.szCurrentPath2 = 0;
442 WinSendMsg(pd->hwndDir2,
443 UM_CONTAINERDIR, MPFROMP(wa.szCurrentPath2), MPVOID);
444 MakeValidDir(wa.szCurrentPath2);
445 if (WinDlgBox(HWND_DESKTOP,
446 hwnd,
447 WalkTwoSetDlgProc,
448 FM3ModHandle,
449 WALK2_FRAME,
450 MPFROMP(&wa)) &&
451 (IsRoot(wa.szCurrentPath1) ||
452 !IsFile(wa.szCurrentPath1)) &&
453 (IsRoot(wa.szCurrentPath2) || !IsFile(wa.szCurrentPath2))) {
454 WinSendMsg(WinWindowFromID(WinWindowFromID(pd->hwndDir1,
455 FID_CLIENT), DIR_CNR),
456 UM_SETDIR, MPFROMP(wa.szCurrentPath1), MPVOID);
457 WinSendMsg(WinWindowFromID(WinWindowFromID(pd->hwndDir2,
458 FID_CLIENT), DIR_CNR),
459 UM_SETDIR, MPFROMP(wa.szCurrentPath2), MPVOID);
460 }
461 }
462 break;
463
464 case IDM_COMPARE:
465 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
466 if (pd) {
467
468 WALK2 wa;
469
470 memset(&wa, 0, sizeof(wa));
471 wa.size = sizeof(wa);
472 *wa.szCurrentPath1 = 0;
473 WinSendMsg(pd->hwndDir1,
474 UM_CONTAINERDIR, MPFROMP(wa.szCurrentPath1), MPVOID);
475 MakeValidDir(wa.szCurrentPath1);
476 *wa.szCurrentPath2 = 0;
477 WinSendMsg(pd->hwndDir2,
478 UM_CONTAINERDIR, MPFROMP(wa.szCurrentPath2), MPVOID);
479 MakeValidDir(wa.szCurrentPath2);
480 if (WinDlgBox(HWND_DESKTOP,
481 hwnd,
482 WalkTwoCmpDlgProc,
483 FM3ModHandle,
484 WALK2_FRAME,
485 MPFROMP(&wa)) &&
486 (IsRoot(wa.szCurrentPath1) ||
487 !IsFile(wa.szCurrentPath1)) &&
488 (IsRoot(wa.szCurrentPath2) || !IsFile(wa.szCurrentPath2))) {
489 if (!*dircompare) {
490
491 COMPARE *cmp;
492
493 cmp = xmallocz(sizeof(COMPARE), pszSrcFile, __LINE__);
494 if (cmp) {
495 cmp->size = sizeof(COMPARE);
496 strcpy(cmp->leftdir, wa.szCurrentPath1);
497 strcpy(cmp->rightdir, wa.szCurrentPath2);
498 cmp->hwndParent = hwnd;
499 cmp->dcd.hwndParent = hwnd;
500 WinDlgBox(HWND_DESKTOP,
501 HWND_DESKTOP,
502 CompareDlgProc, FM3ModHandle, COMP_FRAME, MPFROMP(cmp));
503 }
504 }
505 else {
506 CHAR szPath1[CCHMAXPATH];
507 CHAR szPath2[CCHMAXPATH];
508 runemf2(SEPARATE,
509 HWND_DESKTOP, pszSrcFile, __LINE__,
510 NULL, NULL,
511 "%s %s %s",
512 dircompare,
513 BldQuotedFileName(szPath1, wa.szCurrentPath1),
514 BldQuotedFileName(szPath2, wa.szCurrentPath2));
515 }
516 }
517 }
518 break;
519
520 case IDM_VTREE:
521 WinSendMsg(hwnd, UM_SETUP2, MPFROMLONG(1), MPVOID);
522 if (hwndTree) {
523 WinShowWindow(hwndTree, FALSE);
524 PostMsg(hwndTree, WM_CLOSE, MPVOID, MPVOID);
525 hwndTree = (HWND) 0;
526 }
527 else {
528
529 ULONG size = sizeof(ULONG);
530
531 hwndTree = StartTreeCnr(hwnd, 3);
532 PrfQueryProfileData(fmprof,
533 realappname,
534 "FM/4 TreeWidth", (PVOID) & TreeWidth, &size);
535 TreeWidth = max(TreeWidth, 80);
536 }
537 {
538 BOOL dummy = (hwndTree != (HWND) 0);
539
540 PrfWriteProfileData(fmprof,
541 realappname,
542 "FM/4 TreeUp", (PVOID) & dummy, sizeof(dummy));
543 }
544 PostMsg(hwnd, UM_SIZE, MPVOID, MPVOID);
545 break;
546
547 case IDM_TILEBACKWARDS:
548 WinSendMsg(hwnd, UM_SETUP2, MPFROMLONG(1), MPVOID);
549 fTileBackwards = (fTileBackwards) ? FALSE : TRUE;
550 PrfWriteProfileData(fmprof,
551 FM3Str,
552 "TileBackwards",
553 (PVOID) & fTileBackwards, sizeof(BOOL));
554 PostMsg(hwnd, UM_SIZE, MPVOID, MPVOID);
555 break;
556
557 case IDM_NEXTWINDOW:
558 case IDM_PREVWINDOW:
559 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
560 if (pd) {
561
562 HWND hwndFocus;
563
564 if (hwndTree) {
565 if (pd->hwndMax) {
566 if (hwndTree == pd->hwndCurr)
567 hwndFocus = pd->hwndMax;
568 else
569 hwndFocus = hwndTree;
570 }
571 else {
572 if (hwndTree == pd->hwndCurr)
573 hwndFocus = (SHORT1FROMMP(mp1) == IDM_PREVWINDOW) ?
574 pd->hwndDir1 : pd->hwndDir2;
575 else if (pd->hwndDir1 == pd->hwndCurr)
576 hwndFocus = (SHORT1FROMMP(mp1) == IDM_PREVWINDOW) ?
577 pd->hwndDir2 : hwndTree;
578 else
579 hwndFocus = (SHORT1FROMMP(mp1) == IDM_PREVWINDOW) ?
580 hwndTree : pd->hwndDir1;
581 }
582 }
583 else {
584 if (pd->hwndMax)
585 hwndFocus = pd->hwndMax;
586 else
587 hwndFocus = pd->hwndCurr == pd->hwndDir1 ?
588 pd->hwndDir2 : pd->hwndDir1;
589 }
590 WinSetFocus(HWND_DESKTOP, hwndFocus);
591 }
592 break;
593
594 case IDM_NOTEBOOK:
595 case IDM_DIRCNRSETTINGS:
596 case IDM_DIRVIEWSETTINGS:
597 case IDM_DIRSORTSETTINGS:
598 case IDM_COLLECTORVIEWSETTINGS:
599 case IDM_COLLECTORSORTSETTINGS:
600 case IDM_ARCHIVERSETTINGS:
601 case IDM_TREECNRVIEWSETTINGS:
602 case IDM_TREECNRSORTSETTINGS:
603 case IDM_VIEWERSETTINGS:
604 case IDM_VIEWERSETTINGS2:
605 case IDM_COMPARESETTINGS:
606 case IDM_MONOLITHICSETTINGS:
607 case IDM_GENERALSETTINGS:
608 case IDM_SCANSETTINGS:
609 case IDM_BUBBLESSETTINGS:
610 WinDlgBox(HWND_DESKTOP,
611 hwnd,
612 CfgDlgProc,
613 FM3ModHandle,
614 CFG_FRAME,
615 MPFROMLONG(mp1)); // 15 Feb 08 SHL
616 PostMsg(hwnd, UM_SIZE, MPVOID, MPVOID);
617 break;
618
619 case IDM_SEEALL:
620 case IDM_GREP:
621 case IDM_COLLECTOR:
622 {
623 HWND hwndC;
624
625 hwndC = StartCollector(HWND_DESKTOP, 4);
626 if (hwndC) {
627 WinSetWindowPos(hwndC,
628 HWND_TOP,
629 0, 0, 0, 0, SWP_SHOW | SWP_RESTORE | SWP_ACTIVATE);
630 if (SHORT1FROMMP(mp1) == IDM_GREP)
631 PostMsg(WinWindowFromID(hwndC, FID_CLIENT),
632 WM_COMMAND, MPFROM2SHORT(IDM_GREP, 0), MPVOID);
633 if (SHORT1FROMMP(mp1) == IDM_SEEALL)
634 PostMsg(WinWindowFromID(hwndC, FID_CLIENT),
635 WM_COMMAND, MPFROM2SHORT(IDM_SEEALL, 0), MPVOID);
636 }
637 }
638 break;
639
640 case IDM_EDITCOMMANDS:
641 EditCommands(hwnd);
642 break;
643
644 default:
645 if (SHORT1FROMMP(mp1) >= IDM_SWITCHSTART &&
646 SHORT1FROMMP(mp1) < IDM_SWITCHSTART + 499) {
647 if (SHORT1FROMMP(mp1) - IDM_SWITCHSTART < numswitches)
648 WinSwitchToProgram(switches[SHORT1FROMMP(mp1) - IDM_SWITCHSTART]);
649 break;
650 }
651 else if (SHORT1FROMMP(mp1) >= IDM_COMMANDSTART &&
652 SHORT1FROMMP(mp1) < IDM_QUICKTOOLSTART) {
653
654 INT x;
655 HWND hwndCnr;
656
657 if (!cmdloaded)
658 load_commands();
659 hwndCnr = TopWindow(hwnd, (HWND) 0);
660 hwndCnr = (HWND) WinSendMsg(WinWindowFromID(hwndCnr, FID_CLIENT),
661 UM_CONTAINERHWND, MPVOID, MPVOID);
662 if (!hwndCnr) {
663 Runtime_Error2(pszSrcFile, __LINE__, IDS_NOWINDOWTEXT);
664 break;
665 }
666 x = SHORT1FROMMP(mp1) - IDM_COMMANDSTART;
667 if (x >= 0) {
668 x++;
669 RunCommand(hwndCnr, x);
670 if (fUnHilite) {
671
672 PCNRITEM pci;
673 DIRCNRDATA *dcd = NULL;
674
675 if (WinQueryWindowUShort(hwndCnr, QWS_ID) != TREE_CNR)
676 dcd = INSTDATA(hwndCnr);
677 pci = (PCNRITEM) WinSendMsg(hwndCnr,
678 CM_QUERYRECORDEMPHASIS,
679 MPFROMLONG(CMA_FIRST),
680 MPFROMSHORT(CRA_CURSORED));
681 if (pci && (INT) pci != -1 && (pci->rc.flRecordAttr & CRA_SELECTED)) {
682 UnHilite(hwnd,
683 TRUE,
684 dcd ? &dcd->lastselection : NULL,
685 dcd ? dcd->ulItemsToUnHilite : 0);
686 }
687 }
688 }
689 }
690 else if (SHORT1FROMMP(mp1) >= IDM_QUICKTOOLSTART &&
691 SHORT1FROMMP(mp1) < IDM_QUICKTOOLSTART + 50) {
692 if (!qtloaded)
693 load_quicktools();
694 if (quicktool[SHORT1FROMMP(mp1) - IDM_QUICKTOOLSTART]) {
695 if (fToolsChanged)
696 save_tools(NULL);
697 if (!load_tools(quicktool[SHORT1FROMMP(mp1) - IDM_QUICKTOOLSTART]))
698 load_tools(NULL);
699 else {
700 strcpy(lasttoolbox,
701 quicktool[SHORT1FROMMP(mp1) - IDM_QUICKTOOLSTART]);
702 PrfWriteProfileString(fmprof, FM3Str, "LastToolBox", lasttoolbox);
703 }
704 BuildTools(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
705 MAIN_TOOLS), TRUE);
706 }
707 }
708 else {
709
710 HWND hwndActive;
711
712 hwndActive = TopWindow(hwnd, (HWND) 0);
713 if (hwndActive)
714 PostMsg(WinWindowFromID(hwndActive, FID_CLIENT), msg, mp1, mp2);
715 }
716 break;
717 }
718 return 0;
719}
720
721static MRESULT EXPENTRY MainWMOnce2(HWND hwnd, ULONG msg, MPARAM mp1,
722 MPARAM mp2)
723{
724 PERSON1DATA *pd;
725
726 switch (msg) {
727 case WM_CREATE:
728 {
729 TID tid;
730
731 WinQueryWindowProcess(hwnd, &mypid, &tid);
732 }
733 hwndMain = hwnd;
734 WinSetWindowUShort(hwnd, QWL_USER + 8, 0);
735 WinSetWindowUShort(hwnd, QWL_USER + 10, 0);
736 WinSetWindowUShort(hwnd, QWL_USER + 12, 0);
737 WinSetWindowUShort(hwnd, QWL_USER + 16, 0);
738 if (_beginthread(MakeMainObjWin, NULL, 245760, MPVOID) == -1) {
739 Runtime_Error(pszSrcFile, __LINE__,
740 GetPString(IDS_COULDNTSTARTTHREADTEXT));
741 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
742 return 0;
743 }
744 else
745 DosSleep(32);//05 Aug 07 GKY 64
746
747 pd = xmallocz(sizeof(PERSON1DATA), pszSrcFile, __LINE__);
748 if (!pd)
749 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
750 else {
751 pd->size = sizeof(PERSON1DATA);
752 WinSetWindowPtr(hwnd, QWL_USER + 4, (PVOID) pd);
753 }
754 {
755 SWP swp;
756 PFNWP oldproc;
757
758 /*
759 * create frame children (not client children, frame children)
760 */
761 DosSleep(1);
762 WinQueryWindowPos(WinQueryWindow(hwnd, QW_PARENT), &swp);
763 oldproc = WinSubclassWindow(WinQueryWindow(hwnd, QW_PARENT),
764 (PFNWP) MainFrameWndProc2);
765 if (oldproc)
766 WinSetWindowPtr(WinQueryWindow(hwnd, QW_PARENT), QWL_USER, (PVOID) oldproc);
767 CommonCreateMainChildren(hwnd, &swp);
768
769 {
770 HWND hwndMenu;
771
772 hwndMenu = WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT), FID_MENU);
773 WinSetWindowULong(hwnd, QWL_USER, hwndMenu);
774 CfgMenuInit(hwndMenu, FALSE); // 14 Feb 08 SHL
775 SetConditionalCascade(hwndMenu, IDM_COMMANDLINESUBMENU, IDM_COMMANDLINE);
776 SetConditionalCascade(hwndMenu, IDM_COMMANDSMENU, IDM_DOITYOURSELF);
777 SetConditionalCascade(hwndMenu, IDM_TOOLSUBMENU, IDM_TOOLBAR);
778 }
779 }
780 WinSetWindowText(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
781 FID_TITLEBAR), "FM/2 Lite");
782 FixSwitchList(WinQueryWindow(hwnd, QW_PARENT), NULL);
783 SetSysMenu(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT), FID_SYSMENU));
784 break;
785
786 case UM_SETUP:
787 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
788 if (pd) {
789
790 CHAR s[CCHMAXPATH];
791 ULONG size;
792 DIRCNRDATA *dcd;
793 HWND hwndC;
794 BOOL dummy = TRUE;
795
796 size = sizeof(BOOL);
797 PrfQueryProfileData(fmprof,
798 realappname, "FM/4 TreeUp", (PVOID) & dummy, &size);
799 if (dummy) {
800 size = sizeof(ULONG);
801 hwndTree = StartTreeCnr(hwnd, 3);
802 PrfQueryProfileData(fmprof,
803 realappname,
804 "FM/4 TreeWidth", (PVOID) & TreeWidth, &size);
805 TreeWidth = max(TreeWidth, 80);
806 }
807 size = sizeof(BOOL);
808 if (PrfQueryProfileData(fmprof,
809 FM3Str,
810 "Toolbar", &dummy, &size) && size && !dummy)
811 WinSendMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_TOOLBAR, 0), MPVOID);
812
813 size = sizeof(s);
814 *s = 0;
815 if (PrfQueryProfileData(fmprof,
816 realappname, "FM/4 Dir1", s, &size) && *s)
817 MakeValidDir(s);
818 else
819 save_dir(s);
820 pd->hwndLastDir = pd->hwndCurr = pd->hwndDir1 =
821 StartDirCnr(hwnd, s, (HWND) 0, 3);
822 size = sizeof(s);
823 *s = 0;
824 if (PrfQueryProfileData(fmprof,
825 realappname, "FM/4 Dir2", s, &size) && *s)
826 MakeValidDir(s);
827 else
828 save_dir(s);
829 pd->hwndDir2 = StartDirCnr(hwnd, s, (HWND) 0, 3);
830 WinSetFocus(HWND_DESKTOP, pd->hwndCurr);
831
832 hwndC = WinWindowFromID(pd->hwndDir1, FID_CLIENT);
833 if (hwndC) {
834 dcd = WinQueryWindowPtr(WinWindowFromID(hwndC, DIR_CNR), QWL_USER);
835 if (dcd) {
836 size = sizeof(INT);
837 if (PrfQueryProfileData(fmprof,
838 realappname,
839 "FM/4 Dir1.Sort",
840 (PVOID) & dcd->sortFlags,
841 &size) && size == sizeof(INT)) {
842 if (!dcd->sortFlags)
843 dcd->sortFlags = SORT_PATHNAME;
844 }
845 size = sizeof(MASK);
846 if (PrfQueryProfileData(fmprof,
847 realappname,
848 "FM/4 Dir1.Filter",
849 (PVOID) & dcd->mask, &size) && size) {
850 if (*dcd->mask.szMask)
851 WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
852 UM_FILTER, MPFROMP(dcd->mask.szMask), MPVOID);
853 }
854 *(dcd->mask.prompt) = 0;
855 size = sizeof(ULONG);
856 if (PrfQueryProfileData(fmprof,
857 realappname,
858 "FM/4 Dir1.View",
859 (PVOID) & dcd->flWindowAttr,
860 &size) && size == sizeof(ULONG)) {
861
862 CNRINFO cnri;
863
864 memset(&cnri, 0, sizeof(CNRINFO));
865 cnri.cb = sizeof(CNRINFO);
866 if (WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
867 CM_QUERYCNRINFO,
868 MPFROMP(&cnri), MPFROMLONG(sizeof(CNRINFO)))) {
869 cnri.flWindowAttr = dcd->flWindowAttr;
870 WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
871 CM_SETCNRINFO,
872 MPFROMP(&cnri), MPFROMLONG(CMA_FLWINDOWATTR));
873 }
874 }
875 }
876 }
877
878 hwndC = WinWindowFromID(pd->hwndDir2, FID_CLIENT);
879 if (hwndC) {
880 dcd = WinQueryWindowPtr(WinWindowFromID(hwndC, DIR_CNR), QWL_USER);
881 if (dcd) {
882 size = sizeof(INT);
883 if (PrfQueryProfileData(fmprof,
884 realappname,
885 "FM/4 Dir2.Sort",
886 (PVOID) & dcd->sortFlags,
887 &size) && size == sizeof(INT)) {
888 if (!dcd->sortFlags)
889 dcd->sortFlags = SORT_PATHNAME;
890 }
891 size = sizeof(MASK);
892 if (PrfQueryProfileData(fmprof,
893 realappname,
894 "FM/4 Dir2.Filter",
895 (PVOID) & dcd->mask, &size) && size) {
896 if (*dcd->mask.szMask)
897 WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
898 UM_FILTER, MPFROMP(dcd->mask.szMask), MPVOID);
899 }
900 *(dcd->mask.prompt) = 0;
901 size = sizeof(ULONG);
902 if (PrfQueryProfileData(fmprof,
903 realappname,
904 "FM/4 Dir2.View",
905 (PVOID) & dcd->flWindowAttr,
906 &size) && size == sizeof(ULONG)) {
907
908 CNRINFO cnri;
909
910 memset(&cnri, 0, sizeof(CNRINFO));
911 cnri.cb = sizeof(CNRINFO);
912 if (WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
913 CM_QUERYCNRINFO,
914 MPFROMP(&cnri), MPFROMLONG(sizeof(CNRINFO)))) {
915 cnri.flWindowAttr = dcd->flWindowAttr;
916 WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
917 CM_SETCNRINFO,
918 MPFROMP(&cnri), MPFROMLONG(CMA_FLWINDOWATTR));
919 }
920 }
921 }
922 }
923 }
924 {
925 ULONG which = 0, size = sizeof(ULONG);
926
927 if (PrfQueryProfileData(fmprof,
928 realappname,
929 "FM/4 Max",
930 (PVOID) & which,
931 &size) && size == sizeof(ULONG) && which) {
932 PostMsg(hwnd,
933 UM_MAXIMIZE,
934 MPFROMLONG(((which == 1) ?
935 pd->hwndDir1 : pd->hwndDir2)), MPVOID);
936 }
937 }
938 PostMsg(hwnd, UM_SIZE, MPVOID, MPVOID);
939 if (!hwndTree)
940 PostMsg(hwnd, UM_BUILDDRIVEBAR, MPVOID, MPVOID);
941 load_tools(NULL);
942 BuildTools(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
943 MAIN_TOOLS), TRUE);
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);
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.