source: trunk/dll/mainwnd2.c@ 1398

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

Move embeded strings to PCSZ variables or string table; Eliminate Error2 functions Runtime_Error with NULL format string returns "No data" error. Change declares from PSZ to PCSZ in functions where the variable isn't changed. Added btm as an executable file type in several additional places. Use fProtectOnly to prevent attempt to execute Dos and Win programs on "Protect only" installs in several additional places.

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