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
RevLine 
[133]1
2/***********************************************************************
3
4 $Id: mainwnd2.c 396 2006-07-28 18:42:35Z root $
5
[178]6 fm/4 main window
[133]7
8 Copyright (c) 1993-98 M. Kimes
[299]9 Copyright (c) 2005, 2006 Steven H. Levine
[133]10
11 23 May 05 SHL Use datamin.h
[178]12 26 May 05 SHL Comments and localize code
[246]13 06 Aug 05 SHL Renames
[299]14 02 Jan 06 SHL Use QWL_USER more
15 02 Jan 06 SHL Map IDM_WINDOWDLG to match IBM_TWODIRS
[352]16 17 Jul 06 SHL Use Runtime_Error
[133]17
18***********************************************************************/
19
[2]20#define INCL_DOS
21#define INCL_WIN
22#define INCL_GPI
[352]23#include <os2.h>
[2]24
25#include <stdlib.h>
26#include <stdio.h>
27#include <string.h>
28#include <ctype.h>
29#include <share.h>
[133]30
[2]31#include "fm3dll.h"
32#include "fm3dlg.h"
33#include "fm3str.h"
34#include "tools.h"
[133]35#include "datamin.h"
[2]36
[133]37typedef struct
38{
39 USHORT size;
40 USHORT dummy;
41 HWND hwndDir1;
42 HWND hwndDir2;
43 HWND hwndCurr;
44 HWND hwndLastDir;
45 HWND hwndMax;
[178]46} PERSON1DATA;
[2]47
[352]48static PSZ pszSrcFile = __FILE__;
49
[2]50#pragma alloc_text(PERSON11,MainFrameWndProc2,MainWndProc2)
51#pragma alloc_text(PERSON12,StartFM32,MainWMOnce2)
52#pragma alloc_text(PERSON13,MainWMCommand2)
53
[178]54static MRESULT EXPENTRY MainFrameWndProc2(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[133]55{
[299]56 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
[2]57
[133]58 switch (msg)
59 {
60 case WM_ADJUSTWINDOWPOS:
61 {
62 SWP *pswp;
[2]63
[133]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)
[2]68 {
[133]69 if (pswp -> fl & (SWP_HIDE | SWP_MINIMIZE))
70 {
[2]71
[133]72 SWP swp;
[2]73
[133]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 }
[2]83 }
[133]84 if (!fAmClosing)
85 {
86 if (pswp -> fl & (SWP_HIDE | SWP_MINIMIZE))
87 HideNote();
88 }
89 }
90 break;
[2]91
[133]92 case UM_FOCUSME:
93 CreateDataBar(HWND_DESKTOP, (ULONG) mp1);
94 return 0;
[2]95
[133]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;
[2]103
[133]104 case WM_CHAR:
105 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
106 break;
[2]107
[133]108 case WM_CONTROL:
109 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), UM_CONTROL, mp1, mp2);
[2]110
[133]111 case WM_COMMAND:
112 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
[2]113
[133]114 case WM_CALCFRAMERECT:
115 {
116 MRESULT mr;
117 PRECTL prectl;
118 LONG sheight = 20, bheight = 20;
[2]119
[133]120 mr = (oldproc) ? oldproc(hwnd, msg, mp1, mp2) :
121 PFNWPFrame(hwnd, msg, mp1, mp2);
[2]122
[133]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 */
[2]128
[133]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];
[2]137
[133]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 }
[2]172 }
[133]173 return mr;
174 }
[2]175
[133]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;
[2]183
[133]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 */
[2]193
[133]194 pswp = (PSWP) mp1;
195 {
196 SHORT x;
[2]197
[133]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 }
[2]208
[133]209 {
210 HPS hps;
211 POINTL aptl[TXTBOX_COUNT];
[2]212
[133]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 }
[2]222
[133]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++;
[2]236
[133]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++;
[2]245
[133]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);
[2]264
[133]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++;
[2]280
[133]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 }
[2]305
[133]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++;
[2]315
[133]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++;
[2]325
[133]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++;
[2]338
[133]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++;
[2]349
[133]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++;
[2]359
[133]360 return MRFROMSHORT(sCount);
361 }
[2]362
[133]363 case WM_QUERYFRAMECTLCOUNT:
364 {
365 SHORT sCount;
[2]366
[133]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 }
[2]376
[133]377 case WM_CLOSE:
378 WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
379 return 0;
[2]380 }
[133]381 return (oldproc) ? oldproc(hwnd, msg, mp1, mp2) :
382 PFNWPFrame(hwnd, msg, mp1, mp2);
[2]383}
384
[178]385static MRESULT EXPENTRY MainWMCommand2(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[133]386{
[2]387 PERSON1DATA *pd;
388
389 SetShiftState();
[133]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:
[2]410// case IDM_SYSINFO:
[133]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);
[2]426
[133]427 case IDM_REMAP:
428 WinDlgBox(HWND_DESKTOP,
429 hwnd,
430 RemapDlgProc,
431 FM3ModHandle,
432 MAP_FRAME,
433 NULL);
434 break;
[2]435
[299]436 case IDM_TWODIRS: // Menu action
437 case IDM_WINDOWDLG: // Toolbar action
438 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
[133]439 if (pd)
440 {
[2]441
[133]442 WALK2 wa;
[2]443
[133]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);
[2]479 }
[133]480 }
481 break;
[2]482
[133]483 case IDM_COMPARE:
[299]484 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
[133]485 if (pd)
486 {
[2]487
[133]488 WALK2 wa;
[2]489
[133]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 {
[2]517
[133]518 COMPARE *cmp;
[2]519
[352]520 cmp = xmallocz(sizeof(COMPARE),pszSrcFile,__LINE__);
521 if (cmp) {
[133]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 {
[2]537
[133]538 CHAR *d1 = "\"", *d2 = "\"";
[2]539
[133]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 }
[2]557 }
[133]558 }
559 break;
[2]560
[133]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);
[396]573 hwndTree = (HWND)0;
[133]574 }
575 else
576 {
[2]577
[133]578 ULONG size = sizeof(ULONG);
[2]579
[133]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 {
[396]589 BOOL dummy = (hwndTree != (HWND)0);
[2]590
591 PrfWriteProfileData(fmprof,
[133]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;
[2]602
[133]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;
[2]619
[133]620 case IDM_NEXTWINDOW:
621 case IDM_PREVWINDOW:
[299]622 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
[133]623 if (pd)
624 {
[2]625
[133]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 }
[2]649 }
[133]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;
[2]661
[133]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;
[2]674
[133]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)
[2]683 {
[133]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);
[2]701 }
[133]702 }
703 break;
[2]704
[133]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]);
[2]716 break;
[133]717 }
718 else if (SHORT1FROMMP(mp1) >= IDM_COMMANDSTART &&
719 SHORT1FROMMP(mp1) < IDM_QUICKTOOLSTART)
720 {
[2]721
[133]722 INT x;
723 HWND hwndCnr;
724
725 if (!cmdloaded)
726 load_commands();
[396]727 hwndCnr = TopWindow(hwnd, (HWND)0);
728 hwndCnr = (HWND)WinSendMsg(WinWindowFromID(hwndCnr, FID_CLIENT),
[133]729 UM_CONTAINERHWND,
730 MPVOID,
731 MPVOID);
732 if (!hwndCnr)
733 {
[382]734 Runtime_Error2(pszSrcFile, __LINE__, IDS_NOWINDOWTEXT);
[133]735 break;
[2]736 }
[133]737 x = SHORT1FROMMP(mp1) - IDM_COMMANDSTART;
738 if (x >= 0)
739 {
740 x++;
741 RunCommand(hwndCnr, x);
742 if (fUnHilite)
743 {
[2]744
[133]745 PCNRITEM pci;
746 DIRCNRDATA *dcd = NULL;
[2]747
[133]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 }
[2]760 }
[133]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);
[2]784 }
[133]785 }
786 else
787 {
[2]788
[133]789 HWND hwndActive;
[2]790
[396]791 hwndActive = TopWindow(hwnd, (HWND)0);
[133]792 if (hwndActive)
793 PostMsg(WinWindowFromID(hwndActive, FID_CLIENT),
794 msg,
795 mp1,
796 mp2);
797 }
798 break;
[2]799 }
800 return 0;
801}
802
[178]803static MRESULT EXPENTRY MainWMOnce2(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[133]804{
[2]805 PERSON1DATA *pd;
806
[133]807 switch (msg)
808 {
809 case WM_CREATE:
810 {
811 TID tid;
[2]812
[133]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);
[352]820 if (_beginthread(MakeMainObjWin,NULL,245760,MPVOID) == -1) {
821 Runtime_Error(pszSrcFile, __LINE__, GetPString(IDS_COULDNTSTARTTHREADTEXT));
822 PostMsg(hwnd,WM_CLOSE,MPVOID,MPVOID);
[133]823 return 0;
824 }
825 else
826 DosSleep(64);
[2]827
[352]828 pd = xmallocz(sizeof(PERSON1DATA),pszSrcFile,__LINE__);
[133]829 if (!pd)
830 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
[352]831 else {
[133]832 pd -> size = sizeof(PERSON1DATA);
[299]833 WinSetWindowPtr(hwnd, QWL_USER + 4, (PVOID)pd);
[133]834 }
835 {
836 SWP swp;
837 PFNWP oldproc;
[2]838
[133]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);
[2]851
[133]852 {
853 HWND hwndMenu;
[2]854
[133]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);
[2]866 }
[133]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;
[2]876
[133]877 case UM_SETUP:
[299]878 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
[133]879 if (pd)
880 {
[2]881
[133]882 CHAR s[CCHMAXPATH];
883 ULONG size;
884 DIRCNRDATA *dcd;
885 HWND hwndC;
886 BOOL dummy = TRUE;
[2]887
[133]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);
[2]916
[133]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 =
[396]929 StartDirCnr(hwnd, s, (HWND)0, 3);
[133]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);
[396]941 pd -> hwndDir2 = StartDirCnr(hwnd, s, (HWND)0, 3);
[133]942 WinSetFocus(HWND_DESKTOP,
943 pd -> hwndCurr);
[2]944
[133]945 hwndC = WinWindowFromID(pd -> hwndDir1, FID_CLIENT);
946 if (hwndC)
947 {
[299]948 dcd = WinQueryWindowPtr(WinWindowFromID(hwndC, DIR_CNR), QWL_USER);
[133]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 {
[2]985
[133]986 CNRINFO cnri;
[2]987
[133]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 }
[2]1004
[133]1005 hwndC = WinWindowFromID(pd -> hwndDir2, FID_CLIENT);
1006 if (hwndC)
1007 {
[299]1008 dcd = WinQueryWindowPtr(WinWindowFromID(hwndC, DIR_CNR), QWL_USER);
[133]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 {
[2]1045
[133]1046 CNRINFO cnri;
[2]1047
[133]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 }
[2]1063 }
[133]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)
[2]1075 {
[133]1076 PostMsg(hwnd,
1077 UM_MAXIMIZE,
1078 MPFROMLONG(((which == 1) ?
1079 pd -> hwndDir1 :
1080 pd -> hwndDir2)),
1081 MPVOID);
[2]1082 }
[133]1083 }
1084 PostMsg(hwnd,
1085 UM_SIZE,
1086 MPVOID,
1087 MPVOID);
1088 if (!hwndTree)
[2]1089 PostMsg(hwnd,
[246]1090 UM_BUILDDRIVEBAR,
[133]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;
[2]1099
[133]1100 case WM_SAVEAPPLICATION:
1101 WinStoreWindowPos(FM2Str,
1102 "MainWindowPos2",
1103 WinQueryWindow(hwnd, QW_PARENT));
[299]1104 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
[133]1105 if (pd)
1106 {
[2]1107
[133]1108 CHAR s[CCHMAXPATH];
1109 HWND hwndC;
1110 DIRCNRDATA *dcd;
1111 ULONG flWindowAttr;
[2]1112
[133]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 {
[299]1152 dcd = WinQueryWindowPtr(WinWindowFromID(hwndC, DIR_CNR), QWL_USER);
[133]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 }
[2]1190
[133]1191 hwndC = WinWindowFromID(pd -> hwndDir2, FID_CLIENT);
1192 if (hwndC)
1193 {
[299]1194 dcd = WinQueryWindowPtr(WinWindowFromID(hwndC, DIR_CNR), QWL_USER);
[133]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 }
[2]1231 }
[133]1232 }
1233 break;
[2]1234 }
[133]1235 return WinDefWindowProc(hwnd, msg, mp1, mp2);
[2]1236}
1237
[133]1238MRESULT EXPENTRY MainWndProc2(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
1239{
[2]1240 PERSON1DATA *pd;
1241
[133]1242 switch (msg)
1243 {
1244 case WM_SAVEAPPLICATION:
1245 case UM_SETUP:
1246 case WM_CREATE:
1247 return MainWMOnce2(hwnd, msg, mp1, mp2);
[2]1248
[133]1249 case UM_THREADUSE:
1250 case UM_LOADFILE:
[246]1251 case UM_BUILDDRIVEBAR:
[133]1252 return CommonMainWndProc(hwnd, msg, mp1, mp2);
[2]1253
[133]1254 case UM_SETUP2:
[299]1255 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
[133]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);
[2]1274 }
[133]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;
[2]1304
[133]1305 case WM_BUTTON1DOWN:
1306 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
1307 if (hwndTree)
1308 {
[2]1309
[133]1310 SWP swp;
[2]1311
[133]1312 WinQueryWindowPos(hwndTree, &swp);
1313 if (SHORT1FROMMP(mp1) > (swp.x + swp.cx) - 3 &&
1314 SHORT1FROMMP(mp1) < (swp.x + swp.cx) + 3)
1315 {
[2]1316
[133]1317 SWP swpC;
1318 TRACKINFO track;
[2]1319
[133]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;
[2]1356 }
[133]1357 }
1358 break;
[2]1359
[133]1360 case WM_MOUSEMOVE:
1361 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
1362 if (hwndTree)
1363 {
[2]1364
[133]1365 SWP swp;
[2]1366
[133]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);
[2]1374 }
[133]1375 else
1376 WinSetPointer(HWND_DESKTOP, hptrArrow);
1377 }
1378 return (MRESULT) TRUE;
[2]1379
[133]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;
[2]1386
[133]1387 case UM_ADVISEFOCUS:
[299]1388 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
[133]1389 if (mp1 &&
1390 pd &&
[396]1391 (HWND)mp1 != pd -> hwndCurr)
[133]1392 {
[396]1393 if ((HWND)mp1 != hwndTree)
1394 pd -> hwndLastDir = (HWND)mp1;
1395 pd -> hwndCurr = (HWND)mp1;
[133]1396 WinSendMsg(hwnd,
1397 UM_SETUP2,
1398 MPVOID,
1399 MPVOID);
1400 }
1401 return 0;
[2]1402
[133]1403 case UM_MAXIMIZE:
1404 if (mp1)
1405 {
[299]1406 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
[133]1407 if (pd)
1408 {
1409 WinSendMsg(hwnd,
1410 UM_SETUP2,
1411 MPFROMLONG(1),
1412 MPVOID);
[396]1413 if (pd -> hwndMax != (HWND)mp1)
[133]1414 {
[396]1415 pd -> hwndMax = (HWND)mp1;
[133]1416 WinSetFocus(HWND_DESKTOP,
1417 pd -> hwndMax);
1418 }
1419 else
[396]1420 pd -> hwndMax = (HWND)0;
[133]1421 PostMsg(hwnd,
1422 UM_SIZE,
1423 MPVOID,
1424 MPVOID);
[2]1425 }
[133]1426 }
1427 return 0;
[2]1428
[133]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:
[299]1437 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
[133]1438 if (pd)
1439 WinSendMsg(pd -> hwndCurr,
1440 UM_INITMENU,
1441 mp1,
1442 mp2);
[2]1443 break;
[133]1444 case IDM_CONFIGMENU:
[396]1445 WinCheckMenuItem((HWND)mp2,
[133]1446 IDM_TOOLSUBMENU,
1447 fToolbar);
[396]1448 WinCheckMenuItem((HWND)mp2,
[133]1449 IDM_AUTOVIEW,
1450 fAutoView);
[2]1451 break;
[133]1452 case IDM_TOOLSUBMENU:
[396]1453 WinCheckMenuItem((HWND)mp2,
[133]1454 IDM_TOOLBAR,
1455 fToolbar);
[396]1456 WinCheckMenuItem((HWND)mp2,
[133]1457 IDM_TEXTTOOLS,
1458 fTextTools);
[396]1459 WinCheckMenuItem((HWND)mp2,
[133]1460 IDM_TOOLTITLES,
1461 fToolTitles);
1462 break;
1463 case IDM_WINDOWSMENU:
[396]1464 WinCheckMenuItem((HWND)mp2,
[133]1465 IDM_VTREE,
[396]1466 (hwndTree != (HWND)0));
1467 WinCheckMenuItem((HWND)mp2,
[133]1468 IDM_TILEBACKWARDS,
1469 fTileBackwards);
[396]1470 SetupWinList((HWND)mp2,
[133]1471 hwnd,
1472 WinQueryWindow(hwnd, QW_PARENT));
1473 break;
1474 }
1475 break;
[2]1476
[133]1477 case WM_SETFOCUS:
1478 if (mp2)
1479 PostMsg(hwnd,
1480 UM_FOCUSME,
1481 MPVOID,
1482 MPVOID);
1483 break;
[2]1484
[133]1485 case UM_FOCUSME:
[299]1486 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
[133]1487 if (pd)
1488 WinSetFocus(HWND_DESKTOP,
1489 pd -> hwndCurr);
1490 return 0;
[2]1491
[133]1492 case UM_RESCAN:
1493 return 0;
1494
1495 case UM_SIZE:
1496 {
1497 SWP swp;
1498
1499 if (WinQueryWindowPos(hwnd, &swp))
[2]1500 {
[133]1501 mp1 = MPFROM2SHORT(swp.cx, swp.cy);
1502 mp2 = MPFROM2SHORT(swp.cx, swp.cy);
[2]1503 }
[133]1504 else
1505 return 0;
1506 }
1507 /* intentional fallthru */
1508 case WM_SIZE:
[299]1509 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
[133]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 {
[2]1562
[133]1563 HWND hwndOther;
[2]1564
[133]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);
[2]1574 }
[133]1575 WinSendMsg(hwnd,
1576 UM_SETUP2,
1577 MPVOID,
1578 MPVOID);
1579 }
1580 if (msg == UM_SIZE)
[2]1581 return 0;
[133]1582 break;
[2]1583
[133]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)
[2]1599 {
[133]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);
[2]1609 }
[133]1610 }
1611 break;
[2]1612
[133]1613 case UM_COMMAND:
1614 case WM_COMMAND:
1615 return MainWMCommand2(hwnd, msg, mp1, mp2);
[2]1616
[133]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;
[2]1630
[133]1631 case UM_CLOSE:
1632 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
1633 return 0;
[2]1634
[133]1635 case WM_DESTROY:
[396]1636 hwndMain = (HWND)0;
[299]1637 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
[133]1638 if (pd)
1639 free(pd);
[396]1640 if (!PostMsg((HWND)0,WM_QUIT,MPVOID,MPVOID))
1641 WinSendMsg((HWND)0,WM_QUIT,MPVOID,MPVOID);
[133]1642 break;
[2]1643 }
[133]1644 return WinDefWindowProc(hwnd, msg, mp1, mp2);
[2]1645}
1646
[133]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;
[2]1655
1656 {
1657 INT x;
1658
[133]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]);
[2]1667 }
1668 }
1669 }
1670 {
[133]1671 CHAR inipath[CCHMAXPATH], fullpath[CCHMAXPATH];
[2]1672 FILESTATUS3 fsa;
1673
[133]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 }
[2]1695 }
1696 }
1697 }
1698
1699 hwndFrame = WinCreateStdWindow(HWND_DESKTOP,
[133]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 {
[2]1714
[133]1715 ULONG fl = SWP_MOVE | SWP_SIZE;
[2]1716 RECTL rcl;
[133]1717 ULONG icz = WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 3L;
1718 ULONG bsz = WinQuerySysValue(HWND_DESKTOP, SV_CYSIZEBORDER);
[2]1719
[133]1720 WinQueryWindowRect(HWND_DESKTOP, &rcl);
[2]1721 rcl.yBottom += icz;
1722 rcl.yTop -= bsz;
1723 rcl.xLeft += bsz;
1724 rcl.xRight -= bsz;
1725 WinSetWindowPos(hwndFrame,
[133]1726 HWND_TOP,
1727 rcl.xLeft,
1728 rcl.yBottom,
1729 rcl.xRight - rcl.xLeft,
1730 rcl.yTop - rcl.yBottom,
1731 fl);
[2]1732 }
[133]1733 if (fLogFile)
1734 LogFileHandle = _fsopen("FM2.LOG", "a+", SH_DENYWR);
1735 if (hwndHelp)
1736 WinAssociateHelpInstance(hwndHelp, hwndFrame);
[2]1737 PostMsg(hwndClient,
[133]1738 UM_SETUP,
1739 MPFROMLONG(argc),
1740 MPFROMP(argv));
[2]1741 }
1742 return hwndFrame;
1743}
Note: See TracBrowser for help on using the repository browser.