source: trunk/dll/mainwnd2.c@ 1387

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

Updated history; comments minor code cleanup for recent changes

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