source: trunk/dll/mainwnd2.c@ 1544

Last change on this file since 1544 was 1544, checked in by Gregg Young, 15 years ago

Changes to fopen and _fsopen to allow FM2 to be loaded in high memory

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