source: trunk/dll/mainwnd2.c@ 1457

Last change on this file since 1457 was 1457, checked in by Steven Levine, 16 years ago

Blink thread LEDs while worker threads are working

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