source: trunk/dll/mainwnd2.c@ 1131

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

Some additional toolbar enhancements and fixes (tickets 273, 274, 275)

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