source: trunk/dll/mainwnd2.c@ 1161

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

Ticket 187: Draft 1: Functions only

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