source: trunk/dll/mainwnd2.c@ 1036

Last change on this file since 1036 was 1009, checked in by Steven Levine, 17 years ago

Add xfree xstrdup Fortify support
Add MT capable Fortify scope logic

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