source: trunk/dll/mainwnd2.c@ 1125

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

Ticket 259: Support saving and restoring a toolbar with DirCnr states.

  • 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 1125 2008-08-27 16:35:43Z jbs $
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 {
[1125]702 strcpy(lasttoolbar,
[551]703 quicktool[SHORT1FROMMP(mp1) - IDM_QUICKTOOLSTART]);
[1125]704 PrfWriteProfileString(fmprof, FM3Str, "LastToolbar", lasttoolbar);
[133]705 }
[1125]706 PostMsg(hwndToolback, UM_SETUP2, MPVOID, MPVOID);
[2]707 }
[133]708 }
[551]709 else {
[2]710
[133]711 HWND hwndActive;
[2]712
[551]713 hwndActive = TopWindow(hwnd, (HWND) 0);
[133]714 if (hwndActive)
[551]715 PostMsg(WinWindowFromID(hwndActive, FID_CLIENT), msg, mp1, mp2);
[133]716 }
717 break;
[2]718 }
719 return 0;
720}
721
[551]722static MRESULT EXPENTRY MainWMOnce2(HWND hwnd, ULONG msg, MPARAM mp1,
723 MPARAM mp2)
[133]724{
[2]725 PERSON1DATA *pd;
726
[551]727 switch (msg) {
[133]728 case WM_CREATE:
729 {
730 TID tid;
[2]731
[133]732 WinQueryWindowProcess(hwnd, &mypid, &tid);
733 }
734 hwndMain = hwnd;
735 WinSetWindowUShort(hwnd, QWL_USER + 8, 0);
736 WinSetWindowUShort(hwnd, QWL_USER + 10, 0);
737 WinSetWindowUShort(hwnd, QWL_USER + 12, 0);
738 WinSetWindowUShort(hwnd, QWL_USER + 16, 0);
[551]739 if (_beginthread(MakeMainObjWin, NULL, 245760, MPVOID) == -1) {
740 Runtime_Error(pszSrcFile, __LINE__,
741 GetPString(IDS_COULDNTSTARTTHREADTEXT));
742 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
[133]743 return 0;
744 }
745 else
[771]746 DosSleep(32);//05 Aug 07 GKY 64
[2]747
[551]748 pd = xmallocz(sizeof(PERSON1DATA), pszSrcFile, __LINE__);
[133]749 if (!pd)
750 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
[352]751 else {
[551]752 pd->size = sizeof(PERSON1DATA);
753 WinSetWindowPtr(hwnd, QWL_USER + 4, (PVOID) pd);
[133]754 }
755 {
756 SWP swp;
757 PFNWP oldproc;
[2]758
[133]759 /*
760 * create frame children (not client children, frame children)
761 */
[771]762 DosSleep(1);
[133]763 WinQueryWindowPos(WinQueryWindow(hwnd, QW_PARENT), &swp);
764 oldproc = WinSubclassWindow(WinQueryWindow(hwnd, QW_PARENT),
765 (PFNWP) MainFrameWndProc2);
766 if (oldproc)
[574]767 WinSetWindowPtr(WinQueryWindow(hwnd, QW_PARENT), QWL_USER, (PVOID) oldproc);
[133]768 CommonCreateMainChildren(hwnd, &swp);
[2]769
[133]770 {
771 HWND hwndMenu;
[2]772
[551]773 hwndMenu = WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT), FID_MENU);
[953]774 WinSetWindowULong(hwnd, QWL_USER, hwndMenu);
775 CfgMenuInit(hwndMenu, FALSE); // 14 Feb 08 SHL
776 SetConditionalCascade(hwndMenu, IDM_COMMANDLINESUBMENU, IDM_COMMANDLINE);
[551]777 SetConditionalCascade(hwndMenu, IDM_COMMANDSMENU, IDM_DOITYOURSELF);
778 SetConditionalCascade(hwndMenu, IDM_TOOLSUBMENU, IDM_TOOLBAR);
[2]779 }
[133]780 }
781 WinSetWindowText(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
[551]782 FID_TITLEBAR), "FM/2 Lite");
783 FixSwitchList(WinQueryWindow(hwnd, QW_PARENT), NULL);
784 SetSysMenu(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT), FID_SYSMENU));
[133]785 break;
[2]786
[133]787 case UM_SETUP:
[299]788 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
[551]789 if (pd) {
[2]790
[133]791 CHAR s[CCHMAXPATH];
792 ULONG size;
793 DIRCNRDATA *dcd;
794 HWND hwndC;
795 BOOL dummy = TRUE;
[2]796
[133]797 size = sizeof(BOOL);
798 PrfQueryProfileData(fmprof,
[551]799 realappname, "FM/4 TreeUp", (PVOID) & dummy, &size);
800 if (dummy) {
[133]801 size = sizeof(ULONG);
802 hwndTree = StartTreeCnr(hwnd, 3);
803 PrfQueryProfileData(fmprof,
804 realappname,
[551]805 "FM/4 TreeWidth", (PVOID) & TreeWidth, &size);
[133]806 TreeWidth = max(TreeWidth, 80);
807 }
808 size = sizeof(BOOL);
809 if (PrfQueryProfileData(fmprof,
810 FM3Str,
[551]811 "Toolbar", &dummy, &size) && size && !dummy)
812 WinSendMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_TOOLBAR, 0), MPVOID);
[2]813
[133]814 size = sizeof(s);
815 *s = 0;
816 if (PrfQueryProfileData(fmprof,
[551]817 realappname, "FM/4 Dir1", s, &size) && *s)
[133]818 MakeValidDir(s);
819 else
820 save_dir(s);
[551]821 pd->hwndLastDir = pd->hwndCurr = pd->hwndDir1 =
822 StartDirCnr(hwnd, s, (HWND) 0, 3);
[133]823 size = sizeof(s);
824 *s = 0;
825 if (PrfQueryProfileData(fmprof,
[551]826 realappname, "FM/4 Dir2", s, &size) && *s)
[133]827 MakeValidDir(s);
828 else
829 save_dir(s);
[551]830 pd->hwndDir2 = StartDirCnr(hwnd, s, (HWND) 0, 3);
831 WinSetFocus(HWND_DESKTOP, pd->hwndCurr);
[2]832
[551]833 hwndC = WinWindowFromID(pd->hwndDir1, FID_CLIENT);
834 if (hwndC) {
[299]835 dcd = WinQueryWindowPtr(WinWindowFromID(hwndC, DIR_CNR), QWL_USER);
[551]836 if (dcd) {
[133]837 size = sizeof(INT);
838 if (PrfQueryProfileData(fmprof,
839 realappname,
840 "FM/4 Dir1.Sort",
[551]841 (PVOID) & dcd->sortFlags,
842 &size) && size == sizeof(INT)) {
843 if (!dcd->sortFlags)
844 dcd->sortFlags = SORT_PATHNAME;
[133]845 }
846 size = sizeof(MASK);
847 if (PrfQueryProfileData(fmprof,
848 realappname,
849 "FM/4 Dir1.Filter",
[551]850 (PVOID) & dcd->mask, &size) && size) {
851 if (*dcd->mask.szMask)
[133]852 WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
[551]853 UM_FILTER, MPFROMP(dcd->mask.szMask), MPVOID);
[133]854 }
[551]855 *(dcd->mask.prompt) = 0;
[133]856 size = sizeof(ULONG);
857 if (PrfQueryProfileData(fmprof,
858 realappname,
859 "FM/4 Dir1.View",
[551]860 (PVOID) & dcd->flWindowAttr,
861 &size) && size == sizeof(ULONG)) {
[2]862
[133]863 CNRINFO cnri;
[2]864
[133]865 memset(&cnri, 0, sizeof(CNRINFO));
866 cnri.cb = sizeof(CNRINFO);
867 if (WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
868 CM_QUERYCNRINFO,
[551]869 MPFROMP(&cnri), MPFROMLONG(sizeof(CNRINFO)))) {
870 cnri.flWindowAttr = dcd->flWindowAttr;
[133]871 WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
872 CM_SETCNRINFO,
[551]873 MPFROMP(&cnri), MPFROMLONG(CMA_FLWINDOWATTR));
[133]874 }
875 }
876 }
877 }
[2]878
[551]879 hwndC = WinWindowFromID(pd->hwndDir2, FID_CLIENT);
880 if (hwndC) {
[299]881 dcd = WinQueryWindowPtr(WinWindowFromID(hwndC, DIR_CNR), QWL_USER);
[551]882 if (dcd) {
[133]883 size = sizeof(INT);
884 if (PrfQueryProfileData(fmprof,
885 realappname,
886 "FM/4 Dir2.Sort",
[551]887 (PVOID) & dcd->sortFlags,
888 &size) && size == sizeof(INT)) {
889 if (!dcd->sortFlags)
890 dcd->sortFlags = SORT_PATHNAME;
[133]891 }
892 size = sizeof(MASK);
893 if (PrfQueryProfileData(fmprof,
894 realappname,
895 "FM/4 Dir2.Filter",
[551]896 (PVOID) & dcd->mask, &size) && size) {
897 if (*dcd->mask.szMask)
[133]898 WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
[551]899 UM_FILTER, MPFROMP(dcd->mask.szMask), MPVOID);
[133]900 }
[551]901 *(dcd->mask.prompt) = 0;
[133]902 size = sizeof(ULONG);
903 if (PrfQueryProfileData(fmprof,
904 realappname,
905 "FM/4 Dir2.View",
[551]906 (PVOID) & dcd->flWindowAttr,
907 &size) && size == sizeof(ULONG)) {
[2]908
[133]909 CNRINFO cnri;
[2]910
[133]911 memset(&cnri, 0, sizeof(CNRINFO));
912 cnri.cb = sizeof(CNRINFO);
913 if (WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
914 CM_QUERYCNRINFO,
[551]915 MPFROMP(&cnri), MPFROMLONG(sizeof(CNRINFO)))) {
916 cnri.flWindowAttr = dcd->flWindowAttr;
[133]917 WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
918 CM_SETCNRINFO,
[551]919 MPFROMP(&cnri), MPFROMLONG(CMA_FLWINDOWATTR));
[133]920 }
921 }
922 }
[2]923 }
[133]924 }
925 {
926 ULONG which = 0, size = sizeof(ULONG);
927
928 if (PrfQueryProfileData(fmprof,
929 realappname,
930 "FM/4 Max",
931 (PVOID) & which,
[551]932 &size) && size == sizeof(ULONG) && which) {
[133]933 PostMsg(hwnd,
934 UM_MAXIMIZE,
935 MPFROMLONG(((which == 1) ?
[551]936 pd->hwndDir1 : pd->hwndDir2)), MPVOID);
[2]937 }
[133]938 }
[551]939 PostMsg(hwnd, UM_SIZE, MPVOID, MPVOID);
[133]940 if (!hwndTree)
[551]941 PostMsg(hwnd, UM_BUILDDRIVEBAR, MPVOID, MPVOID);
[133]942 load_tools(NULL);
[1125]943 PostMsg(hwndToolback, UM_SETUP2, MPVOID, MPVOID);
[133]944 fRunning = TRUE;
945 return 0;
[2]946
[133]947 case WM_SAVEAPPLICATION:
948 WinStoreWindowPos(FM2Str,
[551]949 "MainWindowPos2", WinQueryWindow(hwnd, QW_PARENT));
[299]950 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
[551]951 if (pd) {
[2]952
[133]953 CHAR s[CCHMAXPATH];
954 HWND hwndC;
955 DIRCNRDATA *dcd;
956 ULONG flWindowAttr;
[2]957
[133]958 *s = 0;
[551]959 WinSendMsg(pd->hwndDir1, UM_CONTAINERDIR, MPFROMP(s), MPVOID);
960 if (*s) {
[133]961 MakeValidDir(s);
[551]962 PrfWriteProfileString(fmprof, realappname, "FM/4 Dir1", s);
[133]963 }
964 *s = 0;
[551]965 WinSendMsg(pd->hwndDir2, UM_CONTAINERDIR, MPFROMP(s), MPVOID);
966 if (*s) {
[133]967 MakeValidDir(s);
[551]968 PrfWriteProfileString(fmprof, realappname, "FM/4 Dir2", s);
[133]969 }
[551]970 flWindowAttr = (pd->hwndMax == pd->hwndDir1) ?
971 1 : (pd->hwndMax == pd->hwndDir2) ? 2 : 0;
[133]972 PrfWriteProfileData(fmprof,
973 realappname,
[551]974 "FM/4 Max", &flWindowAttr, sizeof(flWindowAttr));
975 hwndC = WinWindowFromID(pd->hwndDir1, FID_CLIENT);
976 if (hwndC) {
[299]977 dcd = WinQueryWindowPtr(WinWindowFromID(hwndC, DIR_CNR), QWL_USER);
[551]978 if (dcd) {
979 flWindowAttr = dcd->flWindowAttr;
980 if (!fLeaveTree && (flWindowAttr & CV_TREE)) {
[133]981 flWindowAttr &= (~(CV_TREE | CV_ICON | CV_DETAIL | CV_TEXT));
[551]982 if (dcd->lastattr) {
983 if (dcd->lastattr & CV_TEXT)
[133]984 flWindowAttr |= CV_TEXT;
[551]985 else if (dcd->lastattr & CV_DETAIL)
[133]986 flWindowAttr |= CV_DETAIL;
[551]987 else if (dcd->lastattr & CV_ICON)
[133]988 flWindowAttr |= CV_ICON;
989 else
990 flWindowAttr |= CV_NAME;
991 }
992 else
993 flWindowAttr |= CV_NAME;
994 }
995 PrfWriteProfileData(fmprof,
996 realappname,
997 "FM/4 Dir1.Sort",
[551]998 (PVOID) & dcd->sortFlags, sizeof(INT));
[133]999 PrfWriteProfileData(fmprof,
1000 realappname,
1001 "FM/4 Dir1.Filter",
[551]1002 (PVOID) & dcd->mask, sizeof(MASK));
[133]1003 PrfWriteProfileData(fmprof,
1004 realappname,
1005 "FM/4 Dir1.View",
[551]1006 (PVOID) & flWindowAttr, sizeof(ULONG));
[133]1007 }
1008 }
[2]1009
[551]1010 hwndC = WinWindowFromID(pd->hwndDir2, FID_CLIENT);
1011 if (hwndC) {
[299]1012 dcd = WinQueryWindowPtr(WinWindowFromID(hwndC, DIR_CNR), QWL_USER);
[551]1013 if (dcd) {
1014 flWindowAttr = dcd->flWindowAttr;
1015 if (!fLeaveTree && (flWindowAttr & CV_TREE)) {
[133]1016 flWindowAttr &= (~(CV_TREE | CV_ICON | CV_DETAIL | CV_TEXT));
[551]1017 if (dcd->lastattr) {
1018 if (dcd->lastattr & CV_TEXT)
[133]1019 flWindowAttr |= CV_TEXT;
[551]1020 else if (dcd->lastattr & CV_DETAIL)
[133]1021 flWindowAttr |= CV_DETAIL;
[551]1022 else if (dcd->lastattr & CV_ICON)
[133]1023 flWindowAttr |= CV_ICON;
1024 else
1025 flWindowAttr |= CV_NAME;
1026 }
1027 else
1028 flWindowAttr |= CV_NAME;
1029 }
1030 PrfWriteProfileData(fmprof,
1031 realappname,
1032 "FM/4 Dir2.Sort",
[551]1033 (PVOID) & dcd->sortFlags, sizeof(INT));
[133]1034 PrfWriteProfileData(fmprof,
1035 realappname,
1036 "FM/4 Dir2.Filter",
[551]1037 (PVOID) & dcd->mask, sizeof(MASK));
[133]1038 PrfWriteProfileData(fmprof,
1039 realappname,
1040 "FM/4 Dir2.View",
[551]1041 (PVOID) & flWindowAttr, sizeof(ULONG));
[133]1042 }
[2]1043 }
[133]1044 }
1045 break;
[2]1046 }
[133]1047 return WinDefWindowProc(hwnd, msg, mp1, mp2);
[2]1048}
1049
[133]1050MRESULT EXPENTRY MainWndProc2(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
1051{
[2]1052 PERSON1DATA *pd;
1053
[551]1054 switch (msg) {
[133]1055 case WM_SAVEAPPLICATION:
1056 case UM_SETUP:
1057 case WM_CREATE:
1058 return MainWMOnce2(hwnd, msg, mp1, mp2);
[2]1059
[133]1060 case UM_THREADUSE:
1061 case UM_LOADFILE:
[246]1062 case UM_BUILDDRIVEBAR:
[133]1063 return CommonMainWndProc(hwnd, msg, mp1, mp2);
[2]1064
[133]1065 case UM_SETUP2:
[299]1066 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
[551]1067 if (pd) {
1068 if (mp1) {
1069 if (pd->hwndDir1 && (!pd->hwndMax || pd->hwndMax == pd->hwndDir1))
1070 BoxWindow(pd->hwndDir1, (HPS) 0, CLR_PALEGRAY);
1071 if (pd->hwndDir2 && (!pd->hwndMax || pd->hwndMax == pd->hwndDir2))
1072 BoxWindow(pd->hwndDir2, (HPS) 0, CLR_PALEGRAY);
[133]1073 if (hwndTree)
[551]1074 BoxWindow(hwndTree, (HPS) 0, CLR_PALEGRAY);
[2]1075 }
[551]1076 else {
[133]1077 if (hwndTree)
1078 BoxWindow(hwndTree,
1079 (HPS) 0,
[551]1080 (pd->hwndCurr == hwndTree) ? CLR_RED : CLR_WHITE);
1081 if (!pd->hwndMax || pd->hwndMax == pd->hwndDir1)
1082 BoxWindow(pd->hwndDir1,
[133]1083 (HPS) 0,
[551]1084 (pd->hwndDir1 == pd->hwndCurr) ?
[133]1085 CLR_RED :
[551]1086 (pd->hwndDir1 == pd->hwndLastDir) ?
1087 CLR_DARKRED : CLR_PALEGRAY);
1088 if (!pd->hwndMax || pd->hwndMax == pd->hwndDir2)
1089 BoxWindow(pd->hwndDir2,
[133]1090 (HPS) 0,
[551]1091 (pd->hwndDir2 == pd->hwndCurr) ?
[133]1092 CLR_RED :
[551]1093 (pd->hwndDir2 == pd->hwndLastDir) ?
1094 CLR_DARKRED : CLR_PALEGRAY);
[133]1095 }
1096 }
1097 return 0;
[2]1098
[133]1099 case WM_BUTTON1DOWN:
1100 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
[551]1101 if (hwndTree) {
[2]1102
[133]1103 SWP swp;
[2]1104
[133]1105 WinQueryWindowPos(hwndTree, &swp);
1106 if (SHORT1FROMMP(mp1) > (swp.x + swp.cx) - 3 &&
[551]1107 SHORT1FROMMP(mp1) < (swp.x + swp.cx) + 3) {
[2]1108
[133]1109 SWP swpC;
1110 TRACKINFO track;
[2]1111
[133]1112 WinQueryWindowPos(hwnd, &swpC);
1113 track.cxBorder = 4;
1114 track.cyBorder = 4;
1115 track.cxGrid = 1;
1116 track.cyGrid = 1;
1117 track.cxKeyboard = 8;
1118 track.cyKeyboard = 8;
1119 track.rclTrack.yBottom = 2;
1120 track.rclTrack.yTop = swpC.cy - 4;
1121 track.rclTrack.xLeft = 2;
1122 track.rclTrack.xRight = swp.x + swp.cx + 2;
1123 track.rclBoundary = track.rclTrack;
1124 track.rclBoundary.xRight = swpC.cx - 80;
1125 track.ptlMinTrackSize.x = 80;
1126 track.ptlMinTrackSize.y = swpC.cy - 4;
1127 track.ptlMaxTrackSize.x = swpC.cx - 80;
1128 track.ptlMaxTrackSize.y = swpC.cy - 4;
1129 track.fs = TF_RIGHT;
[551]1130 if (WinTrackRect(hwnd, (HPS) 0, &track)) {
[133]1131 TreeWidth = track.rclTrack.xRight - track.rclTrack.xLeft;
1132 PrfWriteProfileData(fmprof,
1133 realappname,
[551]1134 "FM/4 TreeWidth", &TreeWidth, sizeof(ULONG));
1135 WinSendMsg(hwnd, UM_SETUP2, MPFROMLONG(1), MPVOID);
1136 PostMsg(hwnd, UM_SIZE, MPVOID, MPVOID);
[133]1137 }
1138 return (MRESULT) TRUE;
[2]1139 }
[133]1140 }
1141 break;
[2]1142
[133]1143 case WM_MOUSEMOVE:
1144 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
[551]1145 if (hwndTree) {
[2]1146
[133]1147 SWP swp;
[2]1148
[551]1149 if (WinQueryWindowPos(hwndTree, &swp)) {
[133]1150 if (SHORT1FROMMP(mp1) > (swp.x + swp.cx) - 3 &&
1151 SHORT1FROMMP(mp1) < (swp.x + swp.cx) + 3)
1152 WinSetPointer(HWND_DESKTOP, hptrEW);
1153 else
1154 WinSetPointer(HWND_DESKTOP, hptrArrow);
[2]1155 }
[133]1156 else
1157 WinSetPointer(HWND_DESKTOP, hptrArrow);
1158 }
1159 return (MRESULT) TRUE;
[2]1160
[133]1161 case WM_BUTTON1UP:
1162 case WM_BUTTON2UP:
1163 case WM_BUTTON3UP:
1164 case WM_CHAR:
1165 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
1166 break;
[2]1167
[133]1168 case UM_ADVISEFOCUS:
[299]1169 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
[551]1170 if (mp1 && pd && (HWND) mp1 != pd->hwndCurr) {
1171 if ((HWND) mp1 != hwndTree)
1172 pd->hwndLastDir = (HWND) mp1;
1173 pd->hwndCurr = (HWND) mp1;
1174 WinSendMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
[133]1175 }
1176 return 0;
[2]1177
[133]1178 case UM_MAXIMIZE:
[551]1179 if (mp1) {
[299]1180 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
[551]1181 if (pd) {
1182 WinSendMsg(hwnd, UM_SETUP2, MPFROMLONG(1), MPVOID);
1183 if (pd->hwndMax != (HWND) mp1) {
1184 pd->hwndMax = (HWND) mp1;
1185 WinSetFocus(HWND_DESKTOP, pd->hwndMax);
[133]1186 }
1187 else
[551]1188 pd->hwndMax = (HWND) 0;
1189 PostMsg(hwnd, UM_SIZE, MPVOID, MPVOID);
[2]1190 }
[133]1191 }
1192 return 0;
[2]1193
[133]1194 case WM_INITMENU:
[551]1195 switch (SHORT1FROMMP(mp1)) {
[133]1196 case IDM_FILESMENU:
1197 case IDM_VIEWSMENU:
1198 case IDM_DETAILSSETUP:
1199 case IDM_COMMANDSMENU:
1200 case IDM_SORTSUBMENU:
[299]1201 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
[133]1202 if (pd)
[551]1203 WinSendMsg(pd->hwndCurr, UM_INITMENU, mp1, mp2);
[2]1204 break;
[133]1205 case IDM_CONFIGMENU:
[551]1206 WinCheckMenuItem((HWND) mp2, IDM_TOOLSUBMENU, fToolbar);
1207 WinCheckMenuItem((HWND) mp2, IDM_AUTOVIEW, fAutoView);
[2]1208 break;
[133]1209 case IDM_TOOLSUBMENU:
[551]1210 WinCheckMenuItem((HWND) mp2, IDM_TOOLBAR, fToolbar);
1211 WinCheckMenuItem((HWND) mp2, IDM_TEXTTOOLS, fTextTools);
1212 WinCheckMenuItem((HWND) mp2, IDM_TOOLTITLES, fToolTitles);
[133]1213 break;
1214 case IDM_WINDOWSMENU:
[551]1215 WinCheckMenuItem((HWND) mp2, IDM_VTREE, (hwndTree != (HWND) 0));
1216 WinCheckMenuItem((HWND) mp2, IDM_TILEBACKWARDS, fTileBackwards);
1217 SetupWinList((HWND) mp2, hwnd, WinQueryWindow(hwnd, QW_PARENT));
[133]1218 break;
1219 }
1220 break;
[2]1221
[133]1222 case WM_SETFOCUS:
1223 if (mp2)
[551]1224 PostMsg(hwnd, UM_FOCUSME, MPVOID, MPVOID);
[133]1225 break;
[2]1226
[133]1227 case UM_FOCUSME:
[299]1228 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
[133]1229 if (pd)
[551]1230 WinSetFocus(HWND_DESKTOP, pd->hwndCurr);
[133]1231 return 0;
[2]1232
[133]1233 case UM_RESCAN:
1234 return 0;
1235
1236 case UM_SIZE:
1237 {
1238 SWP swp;
1239
[551]1240 if (WinQueryWindowPos(hwnd, &swp)) {
[133]1241 mp1 = MPFROM2SHORT(swp.cx, swp.cy);
1242 mp2 = MPFROM2SHORT(swp.cx, swp.cy);
[2]1243 }
[133]1244 else
1245 return 0;
1246 }
1247 /* intentional fallthru */
1248 case WM_SIZE:
[299]1249 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
[551]1250 if (mp1 && mp2 && pd && pd->hwndDir1 && pd->hwndDir2) {
[133]1251 if (hwndTree)
1252 WinSetWindowPos(hwndTree,
1253 HWND_TOP,
1254 2,
1255 2,
1256 TreeWidth - 4,
1257 SHORT2FROMMP(mp2) - 4,
1258 SWP_SHOW | SWP_MOVE | SWP_SIZE);
1259 else
1260 TreeWidth = 0;
[551]1261 if (!pd->hwndMax) {
1262 if (fTileBackwards) {
1263 WinSetWindowPos(pd->hwndDir1, HWND_TOP,
[133]1264 (((SHORT1FROMMP(mp2) - TreeWidth) / 2) +
1265 TreeWidth) + 2,
1266 2,
1267 ((SHORT1FROMMP(mp2) - TreeWidth) / 2) - 4,
1268 SHORT2FROMMP(mp2) - 4,
1269 SWP_SHOW | SWP_MOVE | SWP_SIZE);
[551]1270 WinSetWindowPos(pd->hwndDir2, HWND_TOP,
[133]1271 TreeWidth + 2,
1272 2,
1273 ((SHORT1FROMMP(mp2) - TreeWidth) / 2) - 4,
1274 SHORT2FROMMP(mp2) - 4,
1275 SWP_SHOW | SWP_MOVE | SWP_SIZE);
1276 }
[551]1277 else {
1278 WinSetWindowPos(pd->hwndDir1, HWND_TOP,
[133]1279 TreeWidth + 2,
1280 2,
1281 (SHORT1FROMMP(mp2) - TreeWidth) - 4,
1282 (SHORT2FROMMP(mp2) / 2) - 4,
1283 SWP_SHOW | SWP_MOVE | SWP_SIZE);
[551]1284 WinSetWindowPos(pd->hwndDir2, HWND_TOP,
[133]1285 TreeWidth + 2,
1286 (SHORT2FROMMP(mp2) / 2) + 2,
1287 (SHORT1FROMMP(mp2) - TreeWidth) - 4,
1288 (SHORT2FROMMP(mp2) / 2) - 4,
1289 SWP_SHOW | SWP_MOVE | SWP_SIZE);
1290 }
1291 }
[551]1292 else {
[2]1293
[133]1294 HWND hwndOther;
[2]1295
[551]1296 WinSetWindowPos(pd->hwndMax, HWND_TOP,
[133]1297 TreeWidth + 2,
1298 2,
1299 (SHORT1FROMMP(mp2) - TreeWidth) - 4,
1300 SHORT2FROMMP(mp2) - 4,
1301 SWP_SHOW | SWP_MOVE | SWP_SIZE);
[551]1302 hwndOther = (pd->hwndMax == pd->hwndDir1) ?
1303 pd->hwndDir2 : pd->hwndDir1;
[133]1304 WinSetWindowPos(hwndOther, HWND_BOTTOM, 0, 0, 0, 0, SWP_HIDE);
[2]1305 }
[551]1306 WinSendMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
[133]1307 }
1308 if (msg == UM_SIZE)
[2]1309 return 0;
[133]1310 break;
[2]1311
[133]1312 case WM_ERASEBACKGROUND:
[551]1313 WinFillRect((HPS) mp1, (PRECTL) mp2, 0x00d0d0d0);
[133]1314 return 0;
1315
1316 case WM_PAINT:
1317 {
1318 HPS hps;
1319 RECTL rcl;
1320
[551]1321 hps = WinBeginPaint(hwnd, NULLHANDLE, NULL);
1322 if (hps) {
[133]1323 WinQueryWindowRect(hwnd, &rcl);
[551]1324 WinFillRect(hps, (PRECTL) & rcl, CLR_PALEGRAY);
[133]1325 WinEndPaint(hps);
[551]1326 WinSendMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
[2]1327 }
[133]1328 }
1329 break;
[2]1330
[133]1331 case UM_COMMAND:
1332 case WM_COMMAND:
1333 return MainWMCommand2(hwnd, msg, mp1, mp2);
[2]1334
[133]1335 case WM_CLOSE:
1336 fAmClosing = TRUE;
[551]1337 WinSendMsg(hwnd, WM_SAVEAPPLICATION, MPVOID, MPVOID);
[133]1338 CloseChildren(hwnd);
[551]1339 PostMsg(hwnd, UM_CLOSE, MPVOID, MPVOID);
[771]1340 DosSleep(1);
[133]1341 return 0;
[2]1342
[133]1343 case UM_CLOSE:
1344 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
1345 return 0;
[2]1346
[133]1347 case WM_DESTROY:
[551]1348 hwndMain = (HWND) 0;
[299]1349 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
[1009]1350 xfree(pd, pszSrcFile, __LINE__);
[551]1351 if (!PostMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID))
1352 WinSendMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID);
[133]1353 break;
[2]1354 }
[133]1355 return WinDefWindowProc(hwnd, msg, mp1, mp2);
[2]1356}
1357
[133]1358HWND StartFM32(HAB hab, INT argc, CHAR ** argv)
1359{
1360 HWND hwndFrame, hwndClient;
1361 ULONG FrameFlags = FCF_TITLEBAR | FCF_SYSMENU |
[551]1362 FCF_SIZEBORDER | FCF_MINMAX |
1363 FCF_ACCELTABLE | FCF_MENU | FCF_ICON | FCF_TASKLIST | FCF_NOBYTEALIGN;
[2]1364
1365 {
1366 INT x;
1367
[551]1368 for (x = 1; x < argc; x++) {
[133]1369 if (*argv[x] == '+' && !argv[x][1])
1370 fLogFile = TRUE;
[551]1371 if (*argv[x] == '-') {
[133]1372 if (argv[x][1])
1373 strcpy(profile, &argv[x][1]);
[2]1374 }
1375 }
1376 }
1377 {
[133]1378 CHAR inipath[CCHMAXPATH], fullpath[CCHMAXPATH];
[843]1379 FILESTATUS3 fsa;
[2]1380
[133]1381 if (PrfQueryProfileString(HINI_USERPROFILE,
1382 FM2Str,
[551]1383 "Home", NULL, inipath, sizeof(inipath))) {
[843]1384 if (!DosQueryPathInfo(inipath, FIL_STANDARD, &fsa, sizeof(fsa))) {
[551]1385 if (fsa.attrFile & FILE_DIRECTORY) {
[133]1386 if (DosQueryPathInfo(inipath,
[551]1387 FIL_QUERYFULLNAME, fullpath, sizeof(fullpath)))
[133]1388 strcpy(fullpath, inipath);
1389 switch_to(fullpath);
1390 }
[2]1391 }
1392 }
1393 }
1394
1395 hwndFrame = WinCreateStdWindow(HWND_DESKTOP,
[133]1396 WS_VISIBLE,
1397 &FrameFlags,
[593]1398 WC_MAINWND2,
[133]1399 NULL,
1400 WS_VISIBLE | WS_ANIMATE,
[551]1401 FM3ModHandle, MAIN2_FRAME, &hwndClient);
1402 if (hwndFrame) {
[875]1403 hwndMainMenu = WinWindowFromID(hwndFrame, FID_MENU);
[551]1404 if (!WinRestoreWindowPos(FM2Str, "MainWindowPos2", hwndFrame)) {
[2]1405
[133]1406 ULONG fl = SWP_MOVE | SWP_SIZE;
[2]1407 RECTL rcl;
[133]1408 ULONG icz = WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 3L;
1409 ULONG bsz = WinQuerySysValue(HWND_DESKTOP, SV_CYSIZEBORDER);
[2]1410
[133]1411 WinQueryWindowRect(HWND_DESKTOP, &rcl);
[2]1412 rcl.yBottom += icz;
1413 rcl.yTop -= bsz;
1414 rcl.xLeft += bsz;
1415 rcl.xRight -= bsz;
1416 WinSetWindowPos(hwndFrame,
[133]1417 HWND_TOP,
1418 rcl.xLeft,
1419 rcl.yBottom,
[551]1420 rcl.xRight - rcl.xLeft, rcl.yTop - rcl.yBottom, fl);
[2]1421 }
[133]1422 if (fLogFile)
1423 LogFileHandle = _fsopen("FM2.LOG", "a+", SH_DENYWR);
1424 if (hwndHelp)
1425 WinAssociateHelpInstance(hwndHelp, hwndFrame);
[551]1426 PostMsg(hwndClient, UM_SETUP, MPFROMLONG(argc), MPFROMP(argv));
[2]1427 }
1428 return hwndFrame;
1429}
[793]1430
1431#pragma alloc_text(PERSON11,MainFrameWndProc2,MainWndProc2)
1432#pragma alloc_text(PERSON12,StartFM32,MainWMOnce2)
1433#pragma alloc_text(PERSON13,MainWMCommand2)
Note: See TracBrowser for help on using the repository browser.