source: trunk/dll/mainwnd2.c@ 433

Last change on this file since 433 was 396, checked in by root, 19 years ago

Clean

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