source: trunk/dll/mainwnd2.c@ 1161

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

Ticket 187: Draft 1: Functions only

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