source: trunk/dll/mainwnd2.c@ 304

Last change on this file since 304 was 299, checked in by root, 19 years ago

Use QWL_USER more
Map IDM_WINDOWDLG to match IBM_TWODIRS

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