source: trunk/dll/mainwnd2.c@ 1120

Last change on this file since 1120 was 1039, checked in by Gregg Young, 17 years ago

Removed unnecessary xfrees and included fortify.h where needed; moved several misplaced (x)frees;

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