source: trunk/dll/mainwnd2.c@ 1330

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

Ticket 187: Moved typedef's and some #define's from fm3dll.h

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