source: trunk/dll/mainwnd2.c@ 1438

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

Improved drivebar changes; Added AddBackslashToPath() to remove repeatative code. replaced "
" with PCSZ variable; ANY_OBJ added the DosAlloc... (experimental)

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