source: trunk/dll/mainwnd2.c@ 985

Last change on this file since 985 was 985, checked in by Gregg Young, 18 years ago

Update sizes dialog (ticket 44); Make max command line length user settable (ticket 199); use xfree for free in most cases (ticket 212); initial code to check for valid ini file (ticket 102); Some additional refactoring and structure rework; Some documentation updates;

  • 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 985 2008-03-01 01:37:14Z 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
44#include "arccnrs.h" // BldQuotedFileName
45#include "errutil.h" // Dos_Error...
46#include "strutil.h" // GetPString
[953]47#include "notebook.h" // CfgDlgProc
[907]48#include "fm3dll.h"
[2]49
[133]50typedef struct
51{
52 USHORT size;
53 USHORT dummy;
54 HWND hwndDir1;
55 HWND hwndDir2;
56 HWND hwndCurr;
57 HWND hwndLastDir;
58 HWND hwndMax;
[551]59}
60PERSON1DATA;
[2]61
[352]62static PSZ pszSrcFile = __FILE__;
63
[551]64static MRESULT EXPENTRY MainFrameWndProc2(HWND hwnd, ULONG msg, MPARAM mp1,
65 MPARAM mp2)
[133]66{
[299]67 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
[2]68
[551]69 switch (msg) {
[133]70 case WM_ADJUSTWINDOWPOS:
71 {
72 SWP *pswp;
[2]73
[133]74 pswp = (SWP *) mp1;
[551]75 if (pswp->fl & (SWP_SHOW | SWP_RESTORE))
[133]76 PostMsg(WinWindowFromID(hwnd, FID_CLIENT), UM_SIZE, MPVOID, MPVOID);
[551]77 if (fDataMin && !fAmClosing) {
78 if (pswp->fl & (SWP_HIDE | SWP_MINIMIZE)) {
[2]79
[133]80 SWP swp;
[2]81
[133]82 WinQueryWindowPos(hwnd, &swp);
83 PostMsg(hwnd, UM_FOCUSME, MPFROMLONG(swp.fl), MPVOID);
84 HideNote();
85 }
[551]86 else if (pswp->fl & (SWP_SHOW | SWP_RESTORE)) {
[133]87 if (DataHwnd)
88 PostMsg(DataHwnd, WM_CLOSE, MPVOID, MPVOID);
89 }
[2]90 }
[551]91 if (!fAmClosing) {
92 if (pswp->fl & (SWP_HIDE | SWP_MINIMIZE))
[133]93 HideNote();
94 }
95 }
96 break;
[2]97
[133]98 case UM_FOCUSME:
99 CreateDataBar(HWND_DESKTOP, (ULONG) mp1);
100 return 0;
[2]101
[133]102 case WM_BUTTON1UP:
103 case WM_BUTTON2UP:
104 case WM_BUTTON3UP:
105 case WM_MOUSEMOVE:
106 case WM_CHORD:
107 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
108 break;
[2]109
[133]110 case WM_CHAR:
111 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
112 break;
[2]113
[133]114 case WM_CONTROL:
[551]115 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), UM_CONTROL, mp1,
116 mp2);
[2]117
[133]118 case WM_COMMAND:
119 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
[2]120
[133]121 case WM_CALCFRAMERECT:
122 {
123 MRESULT mr;
124 PRECTL prectl;
125 LONG sheight = 20, bheight = 20;
[2]126
[133]127 mr = (oldproc) ? oldproc(hwnd, msg, mp1, mp2) :
128 PFNWPFrame(hwnd, msg, mp1, mp2);
[2]129
[133]130 /*
131 * Calculate the position of the client rectangle.
[773]132 * Otherwise, we'll see a lot of redraw when we move the
[133]133 * client during WM_FORMATFRAME.
134 */
[2]135
[551]136 if (mr && mp2) {
[133]137 prectl = (PRECTL) mp1;
[551]138 if (prectl->yBottom != prectl->yTop) {
[133]139 {
140 HPS hps;
141 POINTL aptl[TXTBOX_COUNT];
[2]142
[133]143 hps = WinGetPS(hwndStatus);
144 GpiQueryTextBox(hps, 6, "$`WjgT", TXTBOX_COUNT, aptl);
145 WinReleasePS(hps);
146 sheight = aptl[TXTBOX_TOPLEFT].y + 6;
147 hps = WinGetPS(hwndName);
148 GpiQueryTextBox(hps, 6, "$`WjgT", TXTBOX_COUNT, aptl);
149 WinReleasePS(hps);
150 bheight = aptl[TXTBOX_TOPLEFT].y + 6;
151 }
[551]152 prectl->yBottom += (sheight + 4);
153 prectl->yTop -= (sheight + 4);
154 prectl->yBottom += (bheight + 4);
155 prectl->yTop -= (bheight + 4);
156 if (fToolbar) {
[133]157 if (!fTextTools)
[551]158 prectl->yTop -= ((fToolTitles) ? 50 : 40);
[133]159 else
[551]160 prectl->yTop -= 32;
[133]161 }
162 ResizeDrives(WinWindowFromID(hwnd, MAIN_DRIVES),
[551]163 ((prectl->xRight -
[133]164 (WinQuerySysValue(HWND_DESKTOP,
165 SV_CYSIZEBORDER) * 2)) - 4));
[551]166 prectl->yTop -= (16 * (DriveLines * 18));
167 prectl->yTop -= 2;
168 if (fAutoView) {
[133]169 AutoviewHeight = min(AutoviewHeight,
[551]170 (prectl->yTop - prectl->yBottom) - 116);
[133]171 AutoviewHeight = max(AutoviewHeight, 36);
[551]172 prectl->yBottom += (AutoviewHeight + 6);
[133]173 }
174 }
[2]175 }
[133]176 return mr;
177 }
[2]178
[133]179 case WM_FORMATFRAME:
180 {
181 SHORT sCount, soldCount;
182 PSWP pswp, pswpClient, pswpNew;
183 SWP swpClient;
184 ULONG theight = 48L, dheight = 20, bheight = 20, sheight = 20;
185 LONG width, lastx;
[2]186
[133]187 sCount = (SHORT) ((oldproc) ? oldproc(hwnd, msg, mp1, mp2) :
188 PFNWPFrame(hwnd, msg, mp1, mp2));
189 soldCount = sCount;
190 /*
191 * Reformat the frame to "squeeze" the client
192 * and make room for status window sibling beneath
193 * and toolbar above (if toolbar's on) and userlists
194 * (if userlists are on).
195 */
[2]196
[133]197 pswp = (PSWP) mp1;
198 {
199 SHORT x;
[2]200
[551]201 for (x = 0; x < sCount; x++) {
202 if (WinQueryWindowUShort(pswp->hwnd, QWS_ID) == FID_CLIENT) {
[133]203 pswpClient = pswp;
204 break;
205 }
206 pswp++;
207 }
208 }
[2]209
[133]210 {
211 HPS hps;
212 POINTL aptl[TXTBOX_COUNT];
[2]213
[133]214 hps = WinGetPS(hwndStatus);
215 GpiQueryTextBox(hps, 6, "$`WjgT", TXTBOX_COUNT, aptl);
216 WinReleasePS(hps);
217 bheight = sheight = aptl[TXTBOX_TOPLEFT].y + 6;
218 hps = WinGetPS(hwndName);
219 GpiQueryTextBox(hps, 6, "$`WjgT", TXTBOX_COUNT, aptl);
220 WinReleasePS(hps);
221 bheight = aptl[TXTBOX_TOPLEFT].y + 6;
222 }
[2]223
[133]224 pswpNew = (PSWP) mp1 + soldCount;
225 *pswpNew = *pswpClient;
226 swpClient = *pswpClient;
[551]227 pswpNew->hwnd = hwndStatus;
228 pswpNew->x = swpClient.x + 3;
229 pswpNew->y = swpClient.y + 2;
[133]230 width = (swpClient.cx / 2) - 6;
231 width = max(width, 10);
[551]232 pswpNew->cx = width - 6;
233 pswpNew->cy = sheight;
234 pswpClient->y = pswpNew->y + pswpNew->cy + 3;
235 pswpClient->cy = (swpClient.cy - pswpNew->cy) - 3;
[133]236 sCount++;
[2]237
[133]238 pswpNew = (PSWP) mp1 + (soldCount + 1);
239 *pswpNew = *pswpClient;
[551]240 pswpNew->hwnd = hwndStatus2;
241 pswpNew->x = width + 8;
242 pswpNew->y = swpClient.y + 2;
243 pswpNew->cx = width - 6;
244 pswpNew->cy = sheight;
[133]245 sCount++;
[2]246
[551]247 if (fToolbar) {
[133]248 if (fTextTools)
249 theight = 32L;
250 else if (!fToolTitles)
251 theight = 40L;
252 pswpNew = (PSWP) mp1 + (soldCount + 2);
253 *pswpNew = *pswpClient;
[551]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;
[133]260 sCount++;
261 }
262 else
263 WinShowWindow(WinWindowFromID(hwnd, MAIN_TOOLS), FALSE);
[2]264
[551]265 ResizeDrives(WinWindowFromID(hwnd, MAIN_DRIVES), pswpClient->cx - 4);
[133]266 pswpNew = (PSWP) mp1 + (soldCount + 2 + (fToolbar != FALSE));
267 *pswpNew = *pswpClient;
[551]268 pswpNew->hwnd = WinWindowFromID(hwnd, MAIN_DRIVES);
269 pswpNew->x = swpClient.x + 2;
[133]270 dheight += ((dheight - 2) * DriveLines);
[551]271 pswpNew->y = (swpClient.y + swpClient.cy) - (dheight - 2);
[133]272 if (fToolbar)
[551]273 pswpNew->y -= theight;
274 pswpNew->cx = swpClient.cx - 4;
275 pswpNew->cy = dheight - 4;
276 pswpClient->cy -= dheight;
277 pswpClient->cy -= 2;
[133]278 sCount++;
[2]279
[551]280 if (fAutoView) {
[133]281 pswpNew = (PSWP) mp1 + (soldCount + 3 + (fToolbar != FALSE));
282 *pswpNew = *pswpClient;
[551]283 pswpNew->hwnd = (fComments) ? hwndAutoMLE : hwndAutoview;
284 pswpNew->x = pswpClient->x + 3;
285 pswpNew->y = pswpClient->y + 3;
[133]286 if (fMoreButtons)
[551]287 pswpNew->y += (bheight + 4);
288 pswpNew->cx = pswpClient->cx - 6;
289 AutoviewHeight = min(AutoviewHeight, pswpClient->cy - 116);
[133]290 AutoviewHeight = max(AutoviewHeight, 36);
[551]291 pswpNew->cy = AutoviewHeight;
292 pswpClient->y += (AutoviewHeight + 6);
293 pswpClient->cy -= (AutoviewHeight + 6);
[133]294 sCount++;
295 WinShowWindow((fComments) ? hwndAutoview : hwndAutoMLE, FALSE);
296 }
[551]297 else {
[133]298 WinShowWindow(hwndAutoview, FALSE);
299 WinShowWindow(hwndAutoMLE, FALSE);
300 }
[2]301
[133]302 pswpNew = (PSWP) mp1 + (soldCount + 3 + (fToolbar != FALSE) +
303 (fAutoView != FALSE));
304 *pswpNew = *pswpClient;
[551]305 pswpNew->hwnd = WinWindowFromID(hwnd, MAIN_LED);
306 pswpNew->x = (swpClient.x + swpClient.cx) - 12;
307 pswpNew->y = swpClient.y;
308 pswpNew->cx = 12;
309 pswpNew->cy = 12;
[133]310 sCount++;
[2]311
[133]312 pswpNew = (PSWP) mp1 + (soldCount + 4 + (fToolbar != FALSE) +
313 (fAutoView != FALSE));
314 *pswpNew = *pswpClient;
[551]315 pswpNew->hwnd = WinWindowFromID(hwnd, MAIN_LEDHDR);
316 pswpNew->x = (swpClient.x + swpClient.cx) - 12;
317 pswpNew->y = swpClient.y + 12;
318 pswpNew->cx = 12;
319 pswpNew->cy = sheight - 8;
[133]320 sCount++;
[2]321
[133]322 pswpNew = (PSWP) mp1 + (soldCount + 5 + (fToolbar != FALSE) +
323 (fAutoView != FALSE));
324 *pswpNew = *pswpClient;
[551]325 pswpNew->hwnd = hwndName;
326 pswpNew->x = swpClient.x + 3;
327 pswpNew->y = swpClient.y + (sheight + 6);
328 pswpNew->cx = ((swpClient.cx / 2) + (swpClient.cx / 5)) - 3;
329 lastx = pswpNew->x + pswpNew->cx;
330 pswpNew->cy = bheight;
331 pswpClient->y += (bheight + 4);
332 pswpClient->cy -= (bheight + 4);
[133]333 sCount++;
[2]334
[133]335 pswpNew = (PSWP) mp1 + (soldCount + 6 + (fToolbar != FALSE) +
336 (fAutoView != FALSE));
337 *pswpNew = *pswpClient;
[551]338 pswpNew->hwnd = hwndDate;
339 pswpNew->x = lastx + 3;
340 pswpNew->y = swpClient.y + (sheight + 6);
341 pswpNew->cx = (swpClient.cx / 6) + (swpClient.cx / 16) - 3;
342 lastx = pswpNew->x + pswpNew->cx;
343 pswpNew->cy = bheight;
[133]344 sCount++;
[2]345
[133]346 pswpNew = (PSWP) mp1 + (soldCount + 7 + (fToolbar != FALSE) +
347 (fAutoView != FALSE));
348 *pswpNew = *pswpClient;
[551]349 pswpNew->hwnd = hwndAttr;
350 pswpNew->x = lastx + 3;
351 pswpNew->y = swpClient.y + (sheight + 6);
352 pswpNew->cx = (swpClient.cx - pswpNew->x) - 1;
353 pswpNew->cy = bheight;
[133]354 sCount++;
[2]355
[133]356 return MRFROMSHORT(sCount);
357 }
[2]358
[133]359 case WM_QUERYFRAMECTLCOUNT:
360 {
361 SHORT sCount;
[2]362
[133]363 sCount = (SHORT) ((oldproc) ? oldproc(hwnd, msg, mp1, mp2) :
364 PFNWPFrame(hwnd, msg, mp1, mp2));
365 sCount += 8;
366 if (fToolbar)
367 sCount++;
368 if (fAutoView)
369 sCount++;
370 return MRFROMSHORT(sCount);
371 }
[2]372
[133]373 case WM_CLOSE:
374 WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
375 return 0;
[2]376 }
[133]377 return (oldproc) ? oldproc(hwnd, msg, mp1, mp2) :
378 PFNWPFrame(hwnd, msg, mp1, mp2);
[2]379}
380
[551]381static MRESULT EXPENTRY MainWMCommand2(HWND hwnd, ULONG msg, MPARAM mp1,
382 MPARAM mp2)
[133]383{
[2]384 PERSON1DATA *pd;
385
386 SetShiftState();
[551]387 switch (SHORT1FROMMP(mp1)) {
[133]388 case IDM_TOAUTOMLE:
389 case IDM_CLI:
390 case IDM_CREATETOOL:
391 case IDM_ABOUT:
392 case IDM_WINFULLSCREEN:
393 case IDM_DOSCOMMANDLINE:
394 case IDM_INIVIEWER:
395 case IDM_EDITASSOC:
396 case IDM_COMMANDLINE:
397 case IDM_KILLPROC:
398 case IDM_TOOLBAR:
399 case IDM_TEXTTOOLS:
400 case IDM_TOOLTITLES:
401 case IDM_TOOLLEFT:
402 case IDM_TOOLRIGHT:
403 case IDM_AUTOVIEWCOMMENTS:
404 case IDM_AUTOVIEWFILE:
405 case IDM_AUTOVIEW:
[2]406// case IDM_SYSINFO:
[133]407 case IDM_HIDENOTEWND:
408 case IDM_SHOWNOTEWND:
409 case IDM_INSTANT:
410 case IDM_HELPCONTEXT:
411 case IDM_HELPHINTS:
412 case IDM_HELPPIX:
413 case IDM_KILLME:
414 case IDM_EXIT:
415 case IDM_HELPTUTOR:
416 case IDM_HELPCONTENTS:
417 case IDM_HELPGENERAL:
418 case IDM_HELPKEYS:
419 case IDM_HELPMOUSE:
420 case IDM_HELP:
421 return MainWMCommand(hwnd, msg, mp1, mp2);
[2]422
[133]423 case IDM_REMAP:
424 WinDlgBox(HWND_DESKTOP,
[551]425 hwnd, RemapDlgProc, FM3ModHandle, MAP_FRAME, NULL);
[133]426 break;
[2]427
[551]428 case IDM_TWODIRS: // Menu action
429 case IDM_WINDOWDLG: // Toolbar action
[299]430 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
[551]431 if (pd) {
[2]432
[133]433 WALK2 wa;
[2]434
[133]435 memset(&wa, 0, sizeof(wa));
436 wa.size = sizeof(wa);
437 *wa.szCurrentPath1 = 0;
[551]438 WinSendMsg(pd->hwndDir1,
439 UM_CONTAINERDIR, MPFROMP(wa.szCurrentPath1), MPVOID);
[133]440 MakeValidDir(wa.szCurrentPath1);
441 *wa.szCurrentPath2 = 0;
[551]442 WinSendMsg(pd->hwndDir2,
443 UM_CONTAINERDIR, MPFROMP(wa.szCurrentPath2), MPVOID);
[133]444 MakeValidDir(wa.szCurrentPath2);
445 if (WinDlgBox(HWND_DESKTOP,
446 hwnd,
447 WalkTwoSetDlgProc,
448 FM3ModHandle,
449 WALK2_FRAME,
450 MPFROMP(&wa)) &&
451 (IsRoot(wa.szCurrentPath1) ||
452 !IsFile(wa.szCurrentPath1)) &&
[551]453 (IsRoot(wa.szCurrentPath2) || !IsFile(wa.szCurrentPath2))) {
454 WinSendMsg(WinWindowFromID(WinWindowFromID(pd->hwndDir1,
[133]455 FID_CLIENT), DIR_CNR),
[551]456 UM_SETDIR, MPFROMP(wa.szCurrentPath1), MPVOID);
457 WinSendMsg(WinWindowFromID(WinWindowFromID(pd->hwndDir2,
[133]458 FID_CLIENT), DIR_CNR),
[551]459 UM_SETDIR, MPFROMP(wa.szCurrentPath2), MPVOID);
[2]460 }
[133]461 }
462 break;
[2]463
[133]464 case IDM_COMPARE:
[299]465 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
[551]466 if (pd) {
[2]467
[133]468 WALK2 wa;
[2]469
[133]470 memset(&wa, 0, sizeof(wa));
471 wa.size = sizeof(wa);
472 *wa.szCurrentPath1 = 0;
[551]473 WinSendMsg(pd->hwndDir1,
474 UM_CONTAINERDIR, MPFROMP(wa.szCurrentPath1), MPVOID);
[133]475 MakeValidDir(wa.szCurrentPath1);
476 *wa.szCurrentPath2 = 0;
[551]477 WinSendMsg(pd->hwndDir2,
478 UM_CONTAINERDIR, MPFROMP(wa.szCurrentPath2), MPVOID);
[133]479 MakeValidDir(wa.szCurrentPath2);
480 if (WinDlgBox(HWND_DESKTOP,
481 hwnd,
482 WalkTwoCmpDlgProc,
483 FM3ModHandle,
484 WALK2_FRAME,
485 MPFROMP(&wa)) &&
486 (IsRoot(wa.szCurrentPath1) ||
487 !IsFile(wa.szCurrentPath1)) &&
[551]488 (IsRoot(wa.szCurrentPath2) || !IsFile(wa.szCurrentPath2))) {
489 if (!*dircompare) {
[2]490
[133]491 COMPARE *cmp;
[2]492
[551]493 cmp = xmallocz(sizeof(COMPARE), pszSrcFile, __LINE__);
[352]494 if (cmp) {
[551]495 cmp->size = sizeof(COMPARE);
496 strcpy(cmp->leftdir, wa.szCurrentPath1);
497 strcpy(cmp->rightdir, wa.szCurrentPath2);
498 cmp->hwndParent = hwnd;
499 cmp->dcd.hwndParent = hwnd;
[133]500 WinDlgBox(HWND_DESKTOP,
501 HWND_DESKTOP,
[551]502 CompareDlgProc, FM3ModHandle, COMP_FRAME, MPFROMP(cmp));
[133]503 }
504 }
[551]505 else {
[773]506 CHAR szPath1[CCHMAXPATH];
507 CHAR szPath2[CCHMAXPATH];
[133]508 runemf2(SEPARATE,
[917]509 HWND_DESKTOP, pszSrcFile, __LINE__,
510 NULL, NULL,
[773]511 "%s %s %s",
[133]512 dircompare,
[773]513 BldQuotedFileName(szPath1, wa.szCurrentPath1),
514 BldQuotedFileName(szPath2, wa.szCurrentPath2));
[133]515 }
[2]516 }
[133]517 }
518 break;
[2]519
[133]520 case IDM_VTREE:
[551]521 WinSendMsg(hwnd, UM_SETUP2, MPFROMLONG(1), MPVOID);
522 if (hwndTree) {
[133]523 WinShowWindow(hwndTree, FALSE);
[551]524 PostMsg(hwndTree, WM_CLOSE, MPVOID, MPVOID);
525 hwndTree = (HWND) 0;
[133]526 }
[551]527 else {
[2]528
[133]529 ULONG size = sizeof(ULONG);
[2]530
[133]531 hwndTree = StartTreeCnr(hwnd, 3);
532 PrfQueryProfileData(fmprof,
533 realappname,
[551]534 "FM/4 TreeWidth", (PVOID) & TreeWidth, &size);
[133]535 TreeWidth = max(TreeWidth, 80);
536 }
537 {
[551]538 BOOL dummy = (hwndTree != (HWND) 0);
[2]539
540 PrfWriteProfileData(fmprof,
[133]541 realappname,
[551]542 "FM/4 TreeUp", (PVOID) & dummy, sizeof(dummy));
[133]543 }
[551]544 PostMsg(hwnd, UM_SIZE, MPVOID, MPVOID);
[133]545 break;
[2]546
[133]547 case IDM_TILEBACKWARDS:
[551]548 WinSendMsg(hwnd, UM_SETUP2, MPFROMLONG(1), MPVOID);
[133]549 fTileBackwards = (fTileBackwards) ? FALSE : TRUE;
550 PrfWriteProfileData(fmprof,
551 FM3Str,
552 "TileBackwards",
[551]553 (PVOID) & fTileBackwards, sizeof(BOOL));
554 PostMsg(hwnd, UM_SIZE, MPVOID, MPVOID);
[133]555 break;
[2]556
[133]557 case IDM_NEXTWINDOW:
558 case IDM_PREVWINDOW:
[299]559 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
[551]560 if (pd) {
[2]561
[133]562 HWND hwndFocus;
563
[551]564 if (hwndTree) {
565 if (pd->hwndMax) {
566 if (hwndTree == pd->hwndCurr)
567 hwndFocus = pd->hwndMax;
[133]568 else
569 hwndFocus = hwndTree;
570 }
[551]571 else {
572 if (hwndTree == pd->hwndCurr)
[133]573 hwndFocus = (SHORT1FROMMP(mp1) == IDM_PREVWINDOW) ?
[551]574 pd->hwndDir1 : pd->hwndDir2;
575 else if (pd->hwndDir1 == pd->hwndCurr)
[133]576 hwndFocus = (SHORT1FROMMP(mp1) == IDM_PREVWINDOW) ?
[551]577 pd->hwndDir2 : hwndTree;
[133]578 else
579 hwndFocus = (SHORT1FROMMP(mp1) == IDM_PREVWINDOW) ?
[551]580 hwndTree : pd->hwndDir1;
[133]581 }
[2]582 }
[551]583 else {
584 if (pd->hwndMax)
585 hwndFocus = pd->hwndMax;
[133]586 else
[953]587 hwndFocus = pd->hwndCurr == pd->hwndDir1 ?
588 pd->hwndDir2 : pd->hwndDir1;
[133]589 }
590 WinSetFocus(HWND_DESKTOP, hwndFocus);
591 }
592 break;
[2]593
[133]594 case IDM_NOTEBOOK:
[953]595 case IDM_DIRCNRSETTINGS:
596 case IDM_DIRVIEWSETTINGS:
597 case IDM_DIRSORTSETTINGS:
598 case IDM_COLLECTORVIEWSETTINGS:
599 case IDM_COLLECTORSORTSETTINGS:
600 case IDM_ARCHIVERSETTINGS:
601 case IDM_TREECNRVIEWSETTINGS:
602 case IDM_TREECNRSORTSETTINGS:
603 case IDM_VIEWERSETTINGS:
604 case IDM_VIEWERSETTINGS2:
605 case IDM_COMPARESETTINGS:
606 case IDM_MONOLITHICSETTINGS:
607 case IDM_GENERALSETTINGS:
608 case IDM_SCANSETTINGS:
609 case IDM_BUBBLESSETTINGS:
[133]610 WinDlgBox(HWND_DESKTOP,
611 hwnd,
[917]612 CfgDlgProc,
613 FM3ModHandle,
614 CFG_FRAME,
[953]615 MPFROMLONG(mp1)); // 15 Feb 08 SHL
[551]616 PostMsg(hwnd, UM_SIZE, MPVOID, MPVOID);
[133]617 break;
[2]618
[133]619 case IDM_SEEALL:
620 case IDM_GREP:
621 case IDM_COLLECTOR:
622 {
623 HWND hwndC;
624
625 hwndC = StartCollector(HWND_DESKTOP, 4);
[551]626 if (hwndC) {
[133]627 WinSetWindowPos(hwndC,
628 HWND_TOP,
[551]629 0, 0, 0, 0, SWP_SHOW | SWP_RESTORE | SWP_ACTIVATE);
[133]630 if (SHORT1FROMMP(mp1) == IDM_GREP)
631 PostMsg(WinWindowFromID(hwndC, FID_CLIENT),
[551]632 WM_COMMAND, MPFROM2SHORT(IDM_GREP, 0), MPVOID);
[133]633 if (SHORT1FROMMP(mp1) == IDM_SEEALL)
634 PostMsg(WinWindowFromID(hwndC, FID_CLIENT),
[551]635 WM_COMMAND, MPFROM2SHORT(IDM_SEEALL, 0), MPVOID);
[2]636 }
[133]637 }
638 break;
[2]639
[133]640 case IDM_EDITCOMMANDS:
641 EditCommands(hwnd);
642 break;
643
644 default:
645 if (SHORT1FROMMP(mp1) >= IDM_SWITCHSTART &&
[551]646 SHORT1FROMMP(mp1) < IDM_SWITCHSTART + 499) {
[133]647 if (SHORT1FROMMP(mp1) - IDM_SWITCHSTART < numswitches)
[551]648 WinSwitchToProgram(switches[SHORT1FROMMP(mp1) - IDM_SWITCHSTART]);
[2]649 break;
[133]650 }
651 else if (SHORT1FROMMP(mp1) >= IDM_COMMANDSTART &&
[551]652 SHORT1FROMMP(mp1) < IDM_QUICKTOOLSTART) {
[2]653
[133]654 INT x;
655 HWND hwndCnr;
656
657 if (!cmdloaded)
658 load_commands();
[551]659 hwndCnr = TopWindow(hwnd, (HWND) 0);
660 hwndCnr = (HWND) WinSendMsg(WinWindowFromID(hwndCnr, FID_CLIENT),
661 UM_CONTAINERHWND, MPVOID, MPVOID);
662 if (!hwndCnr) {
663 Runtime_Error2(pszSrcFile, __LINE__, IDS_NOWINDOWTEXT);
[133]664 break;
[2]665 }
[133]666 x = SHORT1FROMMP(mp1) - IDM_COMMANDSTART;
[551]667 if (x >= 0) {
[133]668 x++;
669 RunCommand(hwndCnr, x);
[551]670 if (fUnHilite) {
[2]671
[133]672 PCNRITEM pci;
673 DIRCNRDATA *dcd = NULL;
[2]674
[133]675 if (WinQueryWindowUShort(hwndCnr, QWS_ID) != TREE_CNR)
676 dcd = INSTDATA(hwndCnr);
677 pci = (PCNRITEM) WinSendMsg(hwndCnr,
678 CM_QUERYRECORDEMPHASIS,
679 MPFROMLONG(CMA_FIRST),
680 MPFROMSHORT(CRA_CURSORED));
[672]681 if (pci && (INT) pci != -1 && (pci->rc.flRecordAttr & CRA_SELECTED)) {
682 UnHilite(hwnd,
683 TRUE,
684 dcd ? &dcd->lastselection : NULL,
685 dcd ? dcd->ulItemsToUnHilite : 0);
686 }
[133]687 }
[2]688 }
[133]689 }
690 else if (SHORT1FROMMP(mp1) >= IDM_QUICKTOOLSTART &&
[551]691 SHORT1FROMMP(mp1) < IDM_QUICKTOOLSTART + 50) {
[133]692 if (!qtloaded)
693 load_quicktools();
[551]694 if (quicktool[SHORT1FROMMP(mp1) - IDM_QUICKTOOLSTART]) {
[133]695 if (fToolsChanged)
696 save_tools(NULL);
697 if (!load_tools(quicktool[SHORT1FROMMP(mp1) - IDM_QUICKTOOLSTART]))
698 load_tools(NULL);
[551]699 else {
700 strcpy(lasttoolbox,
701 quicktool[SHORT1FROMMP(mp1) - IDM_QUICKTOOLSTART]);
702 PrfWriteProfileString(fmprof, FM3Str, "LastToolBox", lasttoolbox);
[133]703 }
704 BuildTools(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
[551]705 MAIN_TOOLS), TRUE);
[2]706 }
[133]707 }
[551]708 else {
[2]709
[133]710 HWND hwndActive;
[2]711
[551]712 hwndActive = TopWindow(hwnd, (HWND) 0);
[133]713 if (hwndActive)
[551]714 PostMsg(WinWindowFromID(hwndActive, FID_CLIENT), msg, mp1, mp2);
[133]715 }
716 break;
[2]717 }
718 return 0;
719}
720
[551]721static MRESULT EXPENTRY MainWMOnce2(HWND hwnd, ULONG msg, MPARAM mp1,
722 MPARAM mp2)
[133]723{
[2]724 PERSON1DATA *pd;
725
[551]726 switch (msg) {
[133]727 case WM_CREATE:
728 {
729 TID tid;
[2]730
[133]731 WinQueryWindowProcess(hwnd, &mypid, &tid);
732 }
733 hwndMain = hwnd;
734 WinSetWindowUShort(hwnd, QWL_USER + 8, 0);
735 WinSetWindowUShort(hwnd, QWL_USER + 10, 0);
736 WinSetWindowUShort(hwnd, QWL_USER + 12, 0);
737 WinSetWindowUShort(hwnd, QWL_USER + 16, 0);
[551]738 if (_beginthread(MakeMainObjWin, NULL, 245760, MPVOID) == -1) {
739 Runtime_Error(pszSrcFile, __LINE__,
740 GetPString(IDS_COULDNTSTARTTHREADTEXT));
741 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
[133]742 return 0;
743 }
744 else
[771]745 DosSleep(32);//05 Aug 07 GKY 64
[2]746
[551]747 pd = xmallocz(sizeof(PERSON1DATA), pszSrcFile, __LINE__);
[133]748 if (!pd)
749 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
[352]750 else {
[551]751 pd->size = sizeof(PERSON1DATA);
752 WinSetWindowPtr(hwnd, QWL_USER + 4, (PVOID) pd);
[133]753 }
754 {
755 SWP swp;
756 PFNWP oldproc;
[2]757
[133]758 /*
759 * create frame children (not client children, frame children)
760 */
[771]761 DosSleep(1);
[133]762 WinQueryWindowPos(WinQueryWindow(hwnd, QW_PARENT), &swp);
763 oldproc = WinSubclassWindow(WinQueryWindow(hwnd, QW_PARENT),
764 (PFNWP) MainFrameWndProc2);
765 if (oldproc)
[574]766 WinSetWindowPtr(WinQueryWindow(hwnd, QW_PARENT), QWL_USER, (PVOID) oldproc);
[133]767 CommonCreateMainChildren(hwnd, &swp);
[2]768
[133]769 {
770 HWND hwndMenu;
[2]771
[551]772 hwndMenu = WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT), FID_MENU);
[953]773 WinSetWindowULong(hwnd, QWL_USER, hwndMenu);
774 CfgMenuInit(hwndMenu, FALSE); // 14 Feb 08 SHL
775 SetConditionalCascade(hwndMenu, IDM_COMMANDLINESUBMENU, IDM_COMMANDLINE);
[551]776 SetConditionalCascade(hwndMenu, IDM_COMMANDSMENU, IDM_DOITYOURSELF);
777 SetConditionalCascade(hwndMenu, IDM_TOOLSUBMENU, IDM_TOOLBAR);
[2]778 }
[133]779 }
780 WinSetWindowText(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
[551]781 FID_TITLEBAR), "FM/2 Lite");
782 FixSwitchList(WinQueryWindow(hwnd, QW_PARENT), NULL);
783 SetSysMenu(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT), FID_SYSMENU));
[133]784 break;
[2]785
[133]786 case UM_SETUP:
[299]787 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
[551]788 if (pd) {
[2]789
[133]790 CHAR s[CCHMAXPATH];
791 ULONG size;
792 DIRCNRDATA *dcd;
793 HWND hwndC;
794 BOOL dummy = TRUE;
[2]795
[133]796 size = sizeof(BOOL);
797 PrfQueryProfileData(fmprof,
[551]798 realappname, "FM/4 TreeUp", (PVOID) & dummy, &size);
799 if (dummy) {
[133]800 size = sizeof(ULONG);
801 hwndTree = StartTreeCnr(hwnd, 3);
802 PrfQueryProfileData(fmprof,
803 realappname,
[551]804 "FM/4 TreeWidth", (PVOID) & TreeWidth, &size);
[133]805 TreeWidth = max(TreeWidth, 80);
806 }
807 size = sizeof(BOOL);
808 if (PrfQueryProfileData(fmprof,
809 FM3Str,
[551]810 "Toolbar", &dummy, &size) && size && !dummy)
811 WinSendMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_TOOLBAR, 0), MPVOID);
[2]812
[133]813 size = sizeof(s);
814 *s = 0;
815 if (PrfQueryProfileData(fmprof,
[551]816 realappname, "FM/4 Dir1", s, &size) && *s)
[133]817 MakeValidDir(s);
818 else
819 save_dir(s);
[551]820 pd->hwndLastDir = pd->hwndCurr = pd->hwndDir1 =
821 StartDirCnr(hwnd, s, (HWND) 0, 3);
[133]822 size = sizeof(s);
823 *s = 0;
824 if (PrfQueryProfileData(fmprof,
[551]825 realappname, "FM/4 Dir2", s, &size) && *s)
[133]826 MakeValidDir(s);
827 else
828 save_dir(s);
[551]829 pd->hwndDir2 = StartDirCnr(hwnd, s, (HWND) 0, 3);
830 WinSetFocus(HWND_DESKTOP, pd->hwndCurr);
[2]831
[551]832 hwndC = WinWindowFromID(pd->hwndDir1, FID_CLIENT);
833 if (hwndC) {
[299]834 dcd = WinQueryWindowPtr(WinWindowFromID(hwndC, DIR_CNR), QWL_USER);
[551]835 if (dcd) {
[133]836 size = sizeof(INT);
837 if (PrfQueryProfileData(fmprof,
838 realappname,
839 "FM/4 Dir1.Sort",
[551]840 (PVOID) & dcd->sortFlags,
841 &size) && size == sizeof(INT)) {
842 if (!dcd->sortFlags)
843 dcd->sortFlags = SORT_PATHNAME;
[133]844 }
845 size = sizeof(MASK);
846 if (PrfQueryProfileData(fmprof,
847 realappname,
848 "FM/4 Dir1.Filter",
[551]849 (PVOID) & dcd->mask, &size) && size) {
850 if (*dcd->mask.szMask)
[133]851 WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
[551]852 UM_FILTER, MPFROMP(dcd->mask.szMask), MPVOID);
[133]853 }
[551]854 *(dcd->mask.prompt) = 0;
[133]855 size = sizeof(ULONG);
856 if (PrfQueryProfileData(fmprof,
857 realappname,
858 "FM/4 Dir1.View",
[551]859 (PVOID) & dcd->flWindowAttr,
860 &size) && size == sizeof(ULONG)) {
[2]861
[133]862 CNRINFO cnri;
[2]863
[133]864 memset(&cnri, 0, sizeof(CNRINFO));
865 cnri.cb = sizeof(CNRINFO);
866 if (WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
867 CM_QUERYCNRINFO,
[551]868 MPFROMP(&cnri), MPFROMLONG(sizeof(CNRINFO)))) {
869 cnri.flWindowAttr = dcd->flWindowAttr;
[133]870 WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
871 CM_SETCNRINFO,
[551]872 MPFROMP(&cnri), MPFROMLONG(CMA_FLWINDOWATTR));
[133]873 }
874 }
875 }
876 }
[2]877
[551]878 hwndC = WinWindowFromID(pd->hwndDir2, FID_CLIENT);
879 if (hwndC) {
[299]880 dcd = WinQueryWindowPtr(WinWindowFromID(hwndC, DIR_CNR), QWL_USER);
[551]881 if (dcd) {
[133]882 size = sizeof(INT);
883 if (PrfQueryProfileData(fmprof,
884 realappname,
885 "FM/4 Dir2.Sort",
[551]886 (PVOID) & dcd->sortFlags,
887 &size) && size == sizeof(INT)) {
888 if (!dcd->sortFlags)
889 dcd->sortFlags = SORT_PATHNAME;
[133]890 }
891 size = sizeof(MASK);
892 if (PrfQueryProfileData(fmprof,
893 realappname,
894 "FM/4 Dir2.Filter",
[551]895 (PVOID) & dcd->mask, &size) && size) {
896 if (*dcd->mask.szMask)
[133]897 WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
[551]898 UM_FILTER, MPFROMP(dcd->mask.szMask), MPVOID);
[133]899 }
[551]900 *(dcd->mask.prompt) = 0;
[133]901 size = sizeof(ULONG);
902 if (PrfQueryProfileData(fmprof,
903 realappname,
904 "FM/4 Dir2.View",
[551]905 (PVOID) & dcd->flWindowAttr,
906 &size) && size == sizeof(ULONG)) {
[2]907
[133]908 CNRINFO cnri;
[2]909
[133]910 memset(&cnri, 0, sizeof(CNRINFO));
911 cnri.cb = sizeof(CNRINFO);
912 if (WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
913 CM_QUERYCNRINFO,
[551]914 MPFROMP(&cnri), MPFROMLONG(sizeof(CNRINFO)))) {
915 cnri.flWindowAttr = dcd->flWindowAttr;
[133]916 WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
917 CM_SETCNRINFO,
[551]918 MPFROMP(&cnri), MPFROMLONG(CMA_FLWINDOWATTR));
[133]919 }
920 }
921 }
[2]922 }
[133]923 }
924 {
925 ULONG which = 0, size = sizeof(ULONG);
926
927 if (PrfQueryProfileData(fmprof,
928 realappname,
929 "FM/4 Max",
930 (PVOID) & which,
[551]931 &size) && size == sizeof(ULONG) && which) {
[133]932 PostMsg(hwnd,
933 UM_MAXIMIZE,
934 MPFROMLONG(((which == 1) ?
[551]935 pd->hwndDir1 : pd->hwndDir2)), MPVOID);
[2]936 }
[133]937 }
[551]938 PostMsg(hwnd, UM_SIZE, MPVOID, MPVOID);
[133]939 if (!hwndTree)
[551]940 PostMsg(hwnd, UM_BUILDDRIVEBAR, MPVOID, MPVOID);
[133]941 load_tools(NULL);
942 BuildTools(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
[551]943 MAIN_TOOLS), TRUE);
[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);
[985]1350 xfree(pd);
[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.