source: trunk/dll/mainwnd2.c@ 1444

Last change on this file since 1444 was 1444, checked in by Gregg Young, 16 years ago

Rework of drivebar to rescan all drives and refresh media buttons and menu items grey out inappropriate menu items. Streamline Tree scan code and use semaphores to serialize access. Add NOEASUPPORT and LOCALHD driveflag; .LONGNAME usage fixes; (Tickets 377-386)

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