source: trunk/dll/mainwnd2.c@ 1140

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

Comments added for recent changes

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