source: trunk/dll/mainwnd2.c@ 1438

Last change on this file since 1438 was 1438, checked in by Gregg Young, 16 years ago

Improved drivebar changes; Added AddBackslashToPath() to remove repeatative code. replaced "
" with PCSZ variable; ANY_OBJ added the DosAlloc... (experimental)

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