source: trunk/dll/mainwnd2.c@ 1186

Last change on this file since 1186 was 1186, checked in by John Small, 17 years ago

Ticket 187: Draft 2: Move remaining function declarations

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