source: trunk/dll/mainwnd.c@ 1024

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

Initial fix to the problem of the saved FM/2 shutdown state not
setting the NumDirsLastTime value correctly when there are no
open directory containers at shutdown.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 174.8 KB
Line 
1
2/***********************************************************************
3
4 $Id: mainwnd.c 1024 2008-05-31 20:03:09Z jbs $
5
6 fm/2 main window
7
8 Copyright (c) 1993-98 M. Kimes
9 Copyright (c) 2001, 2008 Steven H. Levine
10
11 11 Jun 02 SHL Drop obsolete xor code
12 16 Oct 02 SHL Handle large partitions
13 01 Aug 04 SHL Rework lstrip/rstrip usage
14 23 May 05 SHL Use QWL_USER
15 23 May 05 SHL Use datamin.h
16 25 May 05 SHL Use ULONGLONG and CommaFmtULL
17 26 May 05 SHL Comments and localize code
18 05 Jun 05 SHL Use QWL_USER
19 06 Jun 05 SHL Rework MainWMCommand for VAC3.65 compat
20 13 Aug 05 SHL Renames and comments
21 08 Dec 05 SHL DriveProc: disable menu items if drive not ready
22 17 Dec 05 SHL DriveProc: correct my stupid
23 29 May 06 SHL IDM_EDITANYARCHIVER: sanitize code
24 17 Jul 06 SHL Use Runtime_Error
25 17 Aug 06 SHL Complain nicer if state name does not exist
26 18 Feb 07 GKY More drive type and icon support
27 08 Mar 07 SHL SaveDirCnrState: do not save state of NOPRESCAN volumes
28 09 Mar 07 SHL RestoreDirCnrState/SaveDirCnrState: optimize and avoid overflows
29 30 Mar 07 GKY Remove GetPString for window class names
30 06 Apr 07 GKY Work around PM DragInfo and DrgFreeDISH limits
31 06 Apr 07 GKY Add some error checking in drag/drop
32 15 Apr 07 SHL mainwnd MAIN_SETUPLIST restore state not found reporting
33 19 Apr 07 SHL Sync with AcceptOneDrop GetOneDrop mods
34 20 Apr 07 SHL Avoid spurious add_udir error reports
35 12 May 07 SHL Use dcd->ulItemsToUnHilite
36 10 Jun 07 GKY Add CheckPmDrgLimit including IsFm2Window as part of work around PM drag limit
37 06 Aug 07 GKY Reduce DosSleep times (ticket 148)
38 07 Aug 07 SHL Use BldQuotedFileName
39 16 Aug 07 SHL Update IDM_SAVEDIRCNRSTATE logic for ticket# 109
40 18 Aug 07 SHL Rework UM_FILLSETUPLIST for new setups storage
41 19 Aug 07 SHL Move #pragma alloc_text to end of file for OpenWatcom
42 19 Aug 07 SHL Rework SaveDirCnrState to return better error info
43 30 Aug 07 SHL Add accelerator support to quicklist windows
44 22 Nov 07 GKY Use CopyPresParams to fix presparam inconsistencies in menus
45 12 Jan 08 SHL Support drag&drop dialog toggle
46 16 Jan 08 SHL Add sync updates toggle
47 16 Jan 08 GKY Fix changing background color on toolbar
48 17 Jan 08 GKY Add presparam save & restore for individual directory containers
49 19 Jan 08 JBS Ticket 150: fix/improve save and restore of dir cnr state at FM/2 close/reopen
50 19 Jan 08 GKY Rework Utilities menu
51 05 Feb 08 SHL Restore no-prescan drives if restoring named state
52 14 Feb 08 SHL Rework to support settings menu conditional cascade
53 15 Feb 08 SHL Rework ResizeChildren to honor fNoTreeGap and resize drive tree better
54 19 Feb 08 JBS Stop deleting "State at last FM/2 Close" from INI file so it be accessed from States combo box.
55 22 Feb 08 JBS Ticket 230: Fix/improve various code related to state or presparam values in the INI file.
56 29 Feb 08 GKY Use xfree where appropriate
57
58***********************************************************************/
59
60#include <stdlib.h>
61#include <string.h>
62#include <ctype.h>
63#include <process.h> // _beginthread
64
65#define INCL_DOS
66#define INCL_WIN
67#define INCL_SHLERRORS // PMERR_NOT_IN_IDX
68#define INCL_WINHELP
69#define INCL_GPI
70#define INCL_LONGLONG
71
72#include "fm3dlg.h"
73#include "fm3str.h"
74#include "tools.h"
75#include "comp.h"
76#include "datamin.h"
77#include "pathutil.h" // BldQuotedFileName
78#include "errutil.h" // Dos_Error...
79#include "strutil.h" // GetPString
80#include "notebook.h" // CfgDlgProc CfgMenuInit
81#include "command.h" // LINKCMDS
82#include "fm3dll.h"
83
84#include "fortify.h"
85
86#pragma data_seg(DATA1)
87
88static PSZ pszSrcFile = __FILE__;
89
90static USHORT firsttool = 0;
91
92static BOOL CloseDirCnrChildren(HWND hwndClient);
93static BOOL RestoreDirCnrState(HWND hwndClient, PSZ pszStateName, BOOL noview);
94
95static MRESULT EXPENTRY MainObjectWndProc(HWND hwnd, ULONG msg, MPARAM mp1,
96 MPARAM mp2)
97{
98 switch (msg) {
99 case UM_SETUP:
100 case UM_SETUP2:
101 case UM_SETUP3:
102 case UM_SETUP4:
103 case UM_SETUP5:
104 /*
105 * feed setup messages to main window
106 */
107 PostMsg(hwndMain, msg, mp1, mp2);
108 return 0;
109
110 case UM_SETUP6:
111 /*
112 * handle bubble help requests from drive bar buttons
113 */
114 {
115 char dv[3], d;
116 HWND hwndB = (HWND) mp1;
117 USHORT id;
118
119 id = WinQueryWindowUShort(hwndB, QWS_ID);
120 *dv = 0;
121 WinQueryWindowText(WinWindowFromID(WinQueryWindow(hwndB, QW_PARENT),
122 id + 50), sizeof(dv), dv);
123 d = toupper(*dv);
124 if (isalpha(d) && d > 'B' &&
125 !(driveflags[d - 'A'] & (DRIVE_CDROM | DRIVE_INVALID |
126 DRIVE_SLOW)) &&
127 (!hwndBubble ||
128 WinQueryWindowULong(hwndBubble, QWL_USER) != hwndB) &&
129 !WinQueryCapture(HWND_DESKTOP)) {
130
131 FSALLOCATE fsa;
132 CHAR s[90], szQty[38];
133 ULONG ulPctFree;
134 ULONGLONG ullFreeQty;
135
136 if (!DosQueryFSInfo((d - 'A') + 1,
137 FSIL_ALLOC, &fsa, sizeof(FSALLOCATE))) {
138 ullFreeQty = (ULONGLONG) fsa.cUnitAvail *
139 (fsa.cSectorUnit * fsa.cbSector);
140 ulPctFree = (fsa.cUnit && fsa.cUnitAvail) ?
141 (fsa.cUnitAvail * 100) / fsa.cUnit : 0;
142 CommaFmtULL(szQty, sizeof(szQty), ullFreeQty, ' ');
143 sprintf(s, "%s (%lu%%) free", szQty, ulPctFree);
144 }
145 if ((!hwndBubble ||
146 WinQueryWindowULong(hwndBubble, QWL_USER) != hwndB) &&
147 !WinQueryCapture(HWND_DESKTOP))
148 WinSendMsg(hwndB, UM_SETUP6, MPFROMP(s), MPVOID);
149 }
150 }
151 return 0;
152
153 case UM_SETDIR:
154 {
155 CHAR s[8] = " :\\OS2";
156 ULONG bd;
157
158 if (DosQuerySysInfo(QSV_BOOT_DRIVE,
159 QSV_BOOT_DRIVE,
160 (PVOID) & bd, (ULONG) sizeof(ULONG)))
161 bd = 3L;
162 *s = (CHAR) bd + '@';
163 WinSendMsg(hwndMain, UM_SETDIR, MPFROMP(s), MPFROMLONG(1));
164 if (!mp1) {
165 s[3] = 0;
166 WinSendMsg(hwndMain, UM_SETDIR, MPFROMP(s), MPVOID);
167 }
168 PostMsg(MainObjectHwnd, UM_RESTORE, MPFROMLONG(1), MPFROMLONG(1));
169 }
170 return 0;
171
172 case UM_RESTORE:
173 switch ((ULONG)mp2) {
174 case 1:
175 TileChildren(hwndMain, TRUE);
176 break;
177 case 2:
178 CloseDirCnrChildren(hwndMain);
179 break;
180 case 0:
181 fNoTileUpdate = TRUE;
182 WinEnableWindow(WinQueryWindow(hwndMain, QW_PARENT), FALSE);
183 RestoreDirCnrState(hwndMain, (char *)mp1, FALSE);
184 WinEnableWindow(WinQueryWindow(hwndMain, QW_PARENT), TRUE);
185 fNoTileUpdate = FALSE;
186 //xfree((char *)mp1, pszSrcFile, __LINE__);
187 if (fAutoTile)
188 TileChildren(hwndMain, TRUE);
189 break;
190 default:
191 Runtime_Error(pszSrcFile, __LINE__, "%u unexpected", mp2);
192 }
193 return 0;
194
195 case UM_NOTIFY:
196 /*
197 * bring up notify messages for various windows
198 */
199 if (mp1)
200 return MRFROMLONG(DoNotify((char *)mp1));
201 return 0;
202
203 case WM_DESTROY:
204 if (!PostMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID))
205 WinSendMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID);
206# ifdef FORTIFY
207 Fortify_LeaveScope();
208# endif
209 break;
210 }
211 return WinDefWindowProc(hwnd, msg, mp1, mp2);
212}
213
214VOID MakeMainObjWin(VOID * args)
215{
216 HAB hab2;
217 HMQ hmq2;
218 QMSG qmsg2;
219
220 priority_bumped();
221 hab2 = WinInitialize(0);
222 if (hab2) {
223 hmq2 = WinCreateMsgQueue(hab2, 128);
224 if (hmq2) {
225 DosError(FERR_DISABLEHARDERR);
226 WinRegisterClass(hab2,
227 (PSZ) WC_OBJECTWINDOW,
228 MainObjectWndProc, 0, sizeof(PVOID));
229 MainObjectHwnd = WinCreateWindow(HWND_OBJECT,
230 WC_OBJECTWINDOW,
231 (PSZ) NULL,
232 0,
233 0L,
234 0L,
235 0L,
236 0L,
237 0L, HWND_TOP, OBJ_FRAME, NULL, NULL);
238 if (!MainObjectHwnd)
239 Win_Error2(HWND_OBJECT, HWND_DESKTOP, pszSrcFile, __LINE__,
240 IDS_WINCREATEWINDOW);
241 else {
242 WinSetWindowPtr(MainObjectHwnd, QWL_USER, args);
243 while (WinGetMsg(hab2, &qmsg2, (HWND) 0, 0, 0))
244 WinDispatchMsg(hab2, &qmsg2);
245 WinDestroyWindow(MainObjectHwnd);
246 }
247 WinDestroyMsgQueue(hmq2);
248 }
249 WinTerminate(hab2);
250 }
251}
252
253static MRESULT EXPENTRY IdealButtonProc(HWND hwnd, ULONG msg, MPARAM mp1,
254 MPARAM mp2)
255{
256 switch (msg) {
257 case WM_MOUSEMOVE:
258 BubbleHelp(hwnd, TRUE, FALSE, FALSE, GetPString(IDS_IDEALBUTTONHELP));
259 break;
260 }
261 return PFNWPButton(hwnd, msg, mp1, mp2);
262}
263
264HWND TopWindow(HWND hwndParent, HWND exclude)
265{
266 HENUM henum;
267 HWND hwndC = (HWND) 0;
268 USHORT id;
269
270 if (hwndParent) {
271 henum = WinBeginEnumWindows(hwndMain);
272 while ((hwndC = WinGetNextWindow(henum)) != NULLHANDLE) {
273 if (hwndC != exclude) {
274 id = WinQueryWindowUShort(hwndC, QWS_ID);
275 if (id)
276 break;
277 }
278 }
279 WinEndEnumWindows(henum);
280 }
281 return hwndC;
282}
283
284HWND TopWindowName(HWND hwndParent, HWND exclude, CHAR * ret)
285{
286 HENUM henum;
287 HWND hwndC = (HWND) 0, hwndDir, hwndClient;
288 USHORT id;
289 PCNRITEM pci = NULL;
290
291 if (ret) {
292 *ret = 0;
293 if (hwndParent) {
294 henum = WinBeginEnumWindows(hwndMain);
295 while ((hwndC = WinGetNextWindow(henum)) != NULLHANDLE) {
296 // saymsg(MB_ENTER,HWND_DESKTOP,DEBUG_STRING,"Tree = %lu\rExclude = %lu\rFound = %lu",hwndTree,exclude,hwndC);
297 if (hwndC != exclude && hwndC != hwndTree) {
298 id = WinQueryWindowUShort(hwndC, QWS_ID);
299 if (id) {
300 hwndClient = WinWindowFromID(hwndC, FID_CLIENT);
301 if (hwndClient) {
302 hwndDir = WinWindowFromID(hwndClient, DIR_CNR);
303 if (hwndDir) {
304 if (fLookInDir) {
305 pci = (PCNRITEM) WinSendMsg(hwndDir,
306 CM_QUERYRECORDEMPHASIS,
307 MPFROMLONG(CMA_FIRST),
308 MPFROMSHORT(CRA_CURSORED));
309 if (pci && (INT) pci != -1)
310 break;
311 }
312 if (WinSendMsg(hwndClient,
313 UM_CONTAINERDIR, MPFROMP(ret), MPVOID)) {
314 MakeValidDir(ret);
315 // saymsg(MB_ENTER,HWND_DESKTOP,DEBUG_STRING,"Tree = %lu\rExclude = %lu\rFound = %lu\r\"%s\"",hwndTree,exclude,hwndC,ret);
316 WinEndEnumWindows(henum);
317 return hwndC;
318 }
319 }
320 }
321 }
322 }
323 }
324 WinEndEnumWindows(henum);
325 if (!pci || (INT) pci == -1) {
326 hwndC = hwndTree;
327 pci = (PCNRITEM) WinSendMsg(WinWindowFromID(WinWindowFromID(hwndTree,
328 FID_CLIENT),
329 TREE_CNR),
330 CM_QUERYRECORDEMPHASIS,
331 MPFROMLONG(CMA_FIRST),
332 MPFROMSHORT(CRA_CURSORED));
333 }
334 if (pci && (INT) pci != -1) {
335 strcpy(ret, pci->pszFileName);
336 MakeValidDir(ret);
337 }
338 else
339 save_dir2(ret);
340 }
341 }
342 return hwndC;
343}
344
345ULONG CountDirCnrs(HWND hwndParent)
346{
347 HENUM henum;
348 HWND hwndF = (HWND) 0, hwndC, hwndDir;
349 ULONG ret = 0;
350
351 henum = WinBeginEnumWindows(hwndParent);
352 while ((hwndF = WinGetNextWindow(henum)) != NULLHANDLE) {
353 hwndC = WinWindowFromID(hwndF, FID_CLIENT);
354 if (hwndC) {
355 hwndDir = WinWindowFromID(hwndC, DIR_CNR);
356 if (hwndDir)
357 ret++;
358 }
359 }
360 WinEndEnumWindows(henum);
361 return ret;
362}
363
364HWND FindDirCnrByName(CHAR * directory, BOOL restore)
365{
366 HENUM henum;
367 HWND hwndF = (HWND) 0, hwndC, hwndDir;
368 CHAR retstr[CCHMAXPATH];
369
370 if (hwndMain) {
371 henum = WinBeginEnumWindows(hwndMain);
372 while ((hwndF = WinGetNextWindow(henum)) != NULLHANDLE) {
373 hwndC = WinWindowFromID(hwndF, FID_CLIENT);
374 if (hwndC) {
375 hwndDir = WinWindowFromID(hwndC, DIR_CNR);
376 if (hwndDir) {
377 *retstr = 0;
378 WinSendMsg(hwndC, UM_CONTAINERDIR, MPFROMP(retstr), MPVOID);
379 if (*retstr && !stricmp(retstr, directory)) {
380 if (restore)
381 WinSetWindowPos(hwndF,
382 HWND_TOP,
383 0,
384 0,
385 0,
386 0,
387 SWP_RESTORE | SWP_SHOW |
388 SWP_ACTIVATE | SWP_ZORDER);
389 break;
390 }
391 }
392 }
393 }
394 WinEndEnumWindows(henum);
395 }
396 return hwndF;
397}
398
399static VOID SetToggleChecks(HWND hwndMenu)
400{
401 WinCheckMenuItem(hwndMenu, IDM_TEXTTOOLS, fTextTools);
402 WinCheckMenuItem(hwndMenu, IDM_TOOLTITLES, fToolTitles);
403 WinCheckMenuItem(hwndMenu, IDM_USERLIST, fUserComboBox);
404 WinCheckMenuItem(hwndMenu, IDM_TOOLSUBMENU, fToolbar);
405 WinCheckMenuItem(hwndMenu, IDM_AUTOVIEWSUBMENU, fAutoView);
406 WinCheckMenuItem(hwndMenu, IDM_AUTOVIEWFILE, !fComments);
407 WinCheckMenuItem(hwndMenu, IDM_AUTOVIEWCOMMENTS, fComments);
408 WinCheckMenuItem(hwndMenu, IDM_MOREBUTTONS, fMoreButtons);
409 WinCheckMenuItem(hwndMenu, IDM_DRIVEBAR, fDrivebar);
410 WinCheckMenuItem(hwndMenu, IDM_AUTOTILE, fAutoTile);
411 WinCheckMenuItem(hwndMenu, IDM_TILEBACKWARDS, fTileBackwards);
412 WinCheckMenuItem(hwndMenu, IDM_TOGGLEDRAGDIALOG, fDragndropDlg);
413 WinCheckMenuItem(hwndMenu, IDM_SYNCUPDATES, fSyncUpdates);
414}
415
416static VOID ResizeTools(HWND hwnd)
417{
418 register ULONG butx = 18L;
419 INT attrib = SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_ZORDER | SWP_NOREDRAW,
420 noattrib;
421 register TOOL *tool, *starttool;
422 SWP *swp;
423 register ULONG numtools, x;
424
425 if (!fToolbar)
426 return;
427 noattrib = attrib;
428 noattrib &= (~(SWP_SHOW | SWP_ZORDER));
429 noattrib |= SWP_HIDE;
430 /* count tools */
431 tool = toolhead;
432 for (numtools = 0L; tool; numtools++)
433 tool = tool->next;
434 /* allocate swp array for WinSetMultWindowPos */
435 swp = xmallocz(sizeof(SWP) * (numtools + 2), pszSrcFile, __LINE__);
436 if (swp) {
437 for (x = 0; x < numtools + 2L; x++) {
438 swp[x].hwndInsertBehind = HWND_TOP;
439 swp[x].fl = attrib;
440 swp[x].y = (fToolTitles) ? 14L : 3L;
441 swp[x].cx = 32L;
442 swp[x].cy = 32L;
443 }
444 swp[0].x = swp[1].x = 2L;
445 swp[0].y = (fTextTools) ? 14L : 18L;
446 swp[1].y = (fTextTools) ? 1L : 2L;
447 swp[0].cx = swp[1].cx = 14L;
448 swp[0].cy = swp[1].cy = 14L;
449 swp[0].hwnd = WinWindowFromID(hwnd, IDM_TOOLLEFT);
450 swp[1].hwnd = WinWindowFromID(hwnd, IDM_TOOLRIGHT);
451 x = 2L;
452 tool = find_tool(firsttool);
453 if (!tool)
454 tool = toolhead;
455 starttool = tool;
456 while (tool) {
457 if (!(tool->flags & T_INVISIBLE)) {
458 swp[x].x = butx;
459 if (fTextTools || (tool->flags & T_TEXT)) {
460 butx += 55L;
461 swp[x].cx = 54L;
462 swp[x].cy = 24L;
463 swp[x].y = 3L;
464 }
465 else
466 butx += 33L;
467 if (tool->flags & T_SEPARATOR)
468 butx += 12;
469 }
470 else
471 swp[x].fl = noattrib;
472 swp[x].hwnd = WinWindowFromID(hwnd, tool->id);
473 x++;
474 tool = tool->next;
475 }
476 tool = toolhead;
477 while (tool && tool != starttool) {
478 swp[x].x = butx;
479 if (!(tool->flags & T_INVISIBLE)) {
480 if (fTextTools || (tool->flags & T_TEXT)) {
481 butx += 55L;
482 swp[x].cx = 54L;
483 swp[x].cy = 24L;
484 swp[x].y = 3L;
485 }
486 else
487 butx += 33L;
488 if (tool->flags & T_SEPARATOR)
489 butx += 12;
490 }
491 else
492 swp[x].fl = noattrib;
493 swp[x].hwnd = WinWindowFromID(hwnd, tool->id);
494 x++;
495 tool = tool->next;
496 }
497 WinSetMultWindowPos(WinQueryAnchorBlock(hwnd), swp, numtools + 2L);
498 if (!fTextTools && fToolTitles) {
499 for (x = 2L; x < numtools + 2L; x++) {
500 if (fTextTools || !fToolTitles)
501 swp[x].fl = noattrib;
502 else {
503 tool = find_tool(WinQueryWindowUShort(swp[x].hwnd, QWS_ID));
504 if (tool && (tool->flags & T_TEXT))
505 swp[x].fl = noattrib;
506 else {
507 swp[x].hwndInsertBehind = HWND_TOP;
508 swp[x].y = 1L;
509 swp[x].cy = 10L;
510 }
511 }
512 swp[x].hwnd = WinWindowFromID(hwnd,
513 WinQueryWindowUShort(swp[x].hwnd,
514 QWS_ID) + 25000);
515 }
516 WinSetMultWindowPos(WinQueryAnchorBlock(hwnd), &swp[2], numtools);
517 }
518 xfree(swp, pszSrcFile, __LINE__);
519 }
520 WinInvalidateRect(hwnd, NULL, TRUE);
521}
522
523static MRESULT EXPENTRY DropDownListProc(HWND hwnd, ULONG msg, MPARAM mp1,
524 MPARAM mp2)
525{
526 PFNWP oldproc = (PFNWP) INSTDATA(hwnd);
527 USHORT id;
528
529 static HWND hwndMenu = (HWND)0;
530 static BOOL emphasized = FALSE;
531
532 switch (msg) {
533 case WM_MOUSEMOVE:
534 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
535 break;
536
537 case WM_CHAR:
538 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
539 break;
540
541 case WM_MENUEND:
542 if (hwndMenu == (HWND) mp2) {
543 WinDestroyWindow(hwndMenu);
544 hwndMenu = (HWND) 0;
545 }
546 break;
547
548 case WM_FOCUSCHANGE:
549 {
550 HAB hab = WinQueryAnchorBlock(hwnd);
551 HWND hwndParent = WinQueryWindow(hwnd, QW_PARENT);
552 HWND hwndFrame = WinQueryWindow(hwndParent, QW_PARENT);
553 static HACCEL haccelSaved = NULLHANDLE;
554 static HACCEL haccelDriveList = NULLHANDLE;
555 static HACCEL haccelSetupList = NULLHANDLE;
556 static HACCEL haccelUserList = NULLHANDLE;
557 static HACCEL haccelCmdList = NULLHANDLE;
558 static HACCEL haccelButtonList = NULLHANDLE;
559 // DbgMsg(pszSrcFile, __LINE__, "WM_FOCUSCHANGE %u", SHORT1FROMMP(mp2));
560 id = WinQueryWindowUShort(hwndParent, QWS_ID);
561 if (SHORT1FROMMP(mp2)) {
562 // If getting focus 1st time - save original accelerator
563 if (haccelSaved == NULLHANDLE) {
564 haccelSaved = WinQueryAccelTable(hab, hwndFrame);
565 if (haccelSaved == NULLHANDLE)
566 Win_Error(hwnd, HWND_DESKTOP, pszSrcFile, __LINE__, "WinQueryAccelTable");
567 // else
568 // DbgMsg(pszSrcFile, __LINE__, "WinQueryAccelTable SAVED %x", haccelSaved);
569 }
570 if (haccelSaved != NULLHANDLE) {
571 switch (id) {
572 case MAIN_DRIVELIST:
573 if (haccelDriveList == NULLHANDLE) {
574 haccelDriveList = WinLoadAccelTable(hab, FM3ModHandle, MAIN_DRIVELIST);
575 if (haccelDriveList == NULLHANDLE)
576 Win_Error(hwnd, HWND_DESKTOP, pszSrcFile, __LINE__, "WinLoadAccelTable");
577 }
578 if (haccelDriveList != NULLHANDLE) {
579 if (!WinSetAccelTable(hab, haccelDriveList, hwndFrame))
580 Win_Error(hwndFrame, HWND_DESKTOP, pszSrcFile, __LINE__, "WinSetAccelTable");
581 // else
582 // DbgMsg(pszSrcFile, __LINE__, "WinSetAccelTable MAIN_DRIVELIST %x %x", hwndFrame, haccelDriveList);
583 }
584 break;
585 case MAIN_SETUPLIST:
586 if (haccelSetupList == NULLHANDLE) {
587 haccelSetupList = WinLoadAccelTable(hab, FM3ModHandle, MAIN_SETUPLIST);
588 if (haccelSetupList == NULLHANDLE)
589 Win_Error(hwnd, HWND_DESKTOP, pszSrcFile, __LINE__, "WinLoadAccelTable");
590 }
591 if (haccelSetupList != NULLHANDLE) {
592 if (!WinSetAccelTable(hab, haccelSetupList, hwndFrame))
593 Win_Error(hwndFrame, HWND_DESKTOP, pszSrcFile, __LINE__, "WinSetAccelTable");
594 // else
595 // DbgMsg(pszSrcFile, __LINE__, "WinSetAccelTable MAIN_SETUPLIST %x %x", hwndFrame, haccelSetupList);
596 }
597 break;
598 case MAIN_CMDLIST:
599 if (haccelCmdList == NULLHANDLE) {
600 haccelCmdList = WinLoadAccelTable(hab, FM3ModHandle, MAIN_CMDLIST);
601 if (haccelCmdList == NULLHANDLE)
602 Win_Error(hwnd, HWND_DESKTOP, pszSrcFile, __LINE__, "WinLoadAccelTable");
603 }
604 if (haccelCmdList != NULLHANDLE) {
605 if (!WinSetAccelTable(hab, haccelCmdList, hwndFrame))
606 Win_Error(hwndFrame, HWND_DESKTOP, pszSrcFile, __LINE__, "WinSetAccelTable");
607 // else
608 // DbgMsg(pszSrcFile, __LINE__, "WinSetAccelTable MAIN_CMDLIST %x %x", hwndFrame, haccelCmdList);
609 }
610 break;
611 case MAIN_USERLIST:
612 if (haccelUserList == NULLHANDLE) {
613 haccelUserList = WinLoadAccelTable(hab, FM3ModHandle, MAIN_USERLIST);
614 if (haccelUserList == NULLHANDLE)
615 Win_Error(hwnd, HWND_DESKTOP, pszSrcFile, __LINE__, "WinLoadAccelTable");
616 }
617 if (haccelUserList != NULLHANDLE) {
618 if (!WinSetAccelTable(hab, haccelUserList, hwndFrame))
619 Win_Error(hwndFrame, HWND_DESKTOP, pszSrcFile, __LINE__, "WinSetAccelTable");
620 // else
621 // DbgMsg(pszSrcFile, __LINE__, "WinSetAccelTable MAIN_USERLIST %x %x", hwndFrame, haccelUserList);
622 }
623 break;
624 case MAIN_BUTTONLIST:
625 if (haccelButtonList == NULLHANDLE) {
626 haccelButtonList = WinLoadAccelTable(hab, FM3ModHandle, MAIN_BUTTONLIST);
627 if (haccelButtonList == NULLHANDLE)
628 Win_Error(hwnd, HWND_DESKTOP, pszSrcFile, __LINE__, "WinLoadAccelTable");
629 }
630 if (haccelButtonList != NULLHANDLE) {
631 if (!WinSetAccelTable(hab, haccelButtonList, hwndFrame))
632 Win_Error(hwndFrame, HWND_DESKTOP, pszSrcFile, __LINE__, "WinSetAccelTable");
633 // else
634 // DbgMsg(pszSrcFile, __LINE__, "WinSetAccelTable MAIN_BUTTONLIST %x %x", hwndFrame, haccelButtonList);
635 }
636 break;
637 } // switch
638 }
639 }
640 else {
641 // Losing focus
642 switch (id) {
643 case MAIN_DRIVELIST:
644 case MAIN_SETUPLIST:
645 case MAIN_CMDLIST:
646 case MAIN_USERLIST:
647 case MAIN_BUTTONLIST:
648 if (haccelSaved != NULLHANDLE) {
649 if (!WinSetAccelTable(hab, haccelSaved, hwndFrame))
650 Win_Error(hwndFrame, HWND_DESKTOP, pszSrcFile, __LINE__, "WinSetAccelTable");
651 // else
652 // DbgMsg(pszSrcFile, __LINE__, "WinSetAccelTable SAVED %x %x", hwndFrame, haccelSaved);
653 }
654 break;
655 } // switch
656 }
657 }
658 break; // WM_FOCUSCHANGE
659
660 case WM_CONTEXTMENU:
661 {
662 MRESULT ret = MRFROMSHORT(TRUE);
663
664 if (hwndMenu)
665 WinDestroyWindow(hwndMenu);
666 hwndMenu = (HWND) 0;
667 id = WinQueryWindowUShort(WinQueryWindow(hwnd, QW_PARENT), QWS_ID);
668 switch (id) {
669 case MAIN_CMDLIST:
670 WinPostMsg(WinWindowFromID(WinQueryWindow(WinQueryWindow(hwnd,
671 QW_PARENT),
672 QW_PARENT),
673 FID_CLIENT),
674 WM_COMMAND, MPFROM2SHORT(IDM_EDITCOMMANDS, 0), MPVOID);
675 break;
676 case MAIN_USERLIST:
677 case MAIN_SETUPLIST:
678 hwndMenu = WinLoadMenu(HWND_DESKTOP, FM3ModHandle, id);
679 if (hwndMenu)
680 PopupMenu(hwnd,
681 WinWindowFromID(WinQueryWindow(WinQueryWindow(hwnd,
682 QW_PARENT),
683 QW_PARENT),
684 FID_CLIENT), hwndMenu);
685 break;
686 default:
687 ret = FALSE;
688 break;
689 } // switch
690 return ret;
691 }
692
693 case WM_CONTROL:
694 if (hwndStatus2) {
695 switch (SHORT1FROMMP(mp1)) {
696 case CBID_EDIT:
697 id = WinQueryWindowUShort(hwnd, QWS_ID);
698 switch (SHORT2FROMMP(mp1)) {
699 case EN_SETFOCUS:
700 switch (id) {
701 case MAIN_CMDLIST:
702 WinSetWindowText(hwndStatus2, GetPString(IDS_CMDLISTHELP));
703 break;
704 case MAIN_SETUPLIST:
705 WinSetWindowText(hwndStatus2, GetPString(IDS_SETUPLISTHELP));
706 break;
707 case MAIN_USERLIST:
708 WinSetWindowText(hwndStatus2, GetPString(IDS_USERLISTHELP));
709 break;
710 case MAIN_DRIVELIST:
711 WinSetWindowText(hwndStatus2, GetPString(IDS_DRIVELISTHELP));
712 break;
713 case MAIN_BUTTONLIST:
714 WinSetWindowText(hwndStatus2, GetPString(IDS_BUTTONLISTHELP));
715 break;
716 default:
717 break;
718 }
719 break;
720
721 default:
722 break;
723 }
724 }
725 break;
726
727 default:
728 break;
729 }
730 break;
731
732 case WM_BEGINDRAG:
733 id = WinQueryWindowUShort(hwnd, QWS_ID);
734 // saymsg(MB_ENTER,HWND_DESKTOP,DEBUG_STRING,"%u %s %u",id,(id == CBID_EDIT) ? "TRUE" : "FALSE",WinQueryWindowUShort(WinQueryWindow(hwnd,QW_PARENT),QWS_ID) == MAIN_USERLIST);
735 if (id == CBID_EDIT &&
736 WinQueryWindowUShort(WinQueryWindow(hwnd, QW_PARENT), QWS_ID) ==
737 MAIN_USERLIST) {
738
739 CHAR path[CCHMAXPATH];
740
741 *path = 0;
742 WinQueryWindowText(hwnd, CCHMAXPATH, path);
743 bstrip(path);
744 // saymsg(MB_ENTER,HWND_DESKTOP,DEBUG_STRING,"Dragging: %s",path);
745 if (*path && !IsRoot(path))
746 DragOne(hwnd, (HWND) 0, path, FALSE);
747 return 0;
748 }
749 break;
750
751 case DM_DRAGOVER:
752 id = WinQueryWindowUShort(WinQueryWindow(hwnd, QW_PARENT), QWS_ID);
753 if (id == MAIN_USERLIST) {
754 if (!emphasized) {
755 emphasized = TRUE;
756 DrawTargetEmphasis(hwnd, emphasized);
757 }
758 if (AcceptOneDrop(hwnd, mp1, mp2))
759 return MRFROM2SHORT(DOR_DROP, DO_MOVE);
760 return MRFROM2SHORT(DOR_NEVERDROP, 0);
761 }
762 break;
763
764 case DM_DRAGLEAVE:
765 id = WinQueryWindowUShort(WinQueryWindow(hwnd, QW_PARENT), QWS_ID);
766 if (id == MAIN_USERLIST) {
767 if (emphasized) {
768 emphasized = FALSE;
769 DrawTargetEmphasis(hwnd, emphasized);
770 }
771 }
772 break;
773
774 case DM_DROPHELP:
775 id = WinQueryWindowUShort(WinQueryWindow(hwnd, QW_PARENT), QWS_ID);
776 if (id == MAIN_USERLIST) {
777 DropHelp(mp1, mp2, hwnd, GetPString(IDS_USERLISTDROPHELP));
778 return 0;
779 }
780 break;
781
782 case DM_DROP:
783 id = WinQueryWindowUShort(WinQueryWindow(hwnd, QW_PARENT), QWS_ID);
784 if (id == MAIN_USERLIST) {
785
786 char szFrom[CCHMAXPATH + 2];
787
788 if (emphasized) {
789 emphasized = FALSE;
790 DrawTargetEmphasis(hwnd, emphasized);
791 }
792 if (GetOneDrop(hwnd, mp1, mp2, szFrom, sizeof(szFrom))) {
793 MakeValidDir(szFrom);
794 WinSetWindowText(hwnd, szFrom);
795 PostMsg(WinWindowFromID(WinQueryWindow(WinQueryWindow(hwnd,
796 QW_PARENT),
797 QW_PARENT),
798 FID_CLIENT),
799 UM_COMMAND, MPFROM2SHORT(IDM_ADDTOUSERLIST, 0), MPVOID);
800 return 0;
801 }
802 }
803 break;
804
805 case WM_DESTROY:
806 if (hwndMenu)
807 WinDestroyWindow(hwndMenu);
808 hwndMenu = (HWND) 0;
809 break;
810 }
811
812 return oldproc(hwnd, msg, mp1, mp2);
813}
814
815void BubbleHelp(HWND hwnd, BOOL other, BOOL drive, BOOL above, char *help)
816{
817 if (help && *help &&
818 ((drive && fDrivebarHelp) ||
819 (other && fOtherHelp) || (!other && !drive && fToolbarHelp))) {
820 if ((!hwndBubble ||
821 WinQueryWindowULong(hwndBubble, QWL_USER) != hwnd) &&
822 !WinQueryCapture(HWND_DESKTOP))
823 MakeBubble(hwnd, above, help);
824 }
825}
826
827VOID MakeBubble(HWND hwnd, BOOL above, CHAR * help)
828{
829 if (!hwnd || !help || !*help)
830 return;
831
832 if (hwndBubble)
833 WinDestroyWindow(hwndBubble);
834
835 {
836 HWND hwndActive;
837 char ucClassname[8];
838
839 hwndActive = WinQueryActiveWindow(HWND_DESKTOP);
840 if (hwndActive) {
841 /* don't bring up help if window isn't active */
842 if (!WinIsChild(hwnd, hwndActive))
843 return;
844 }
845 hwndActive = WinQueryFocus(HWND_DESKTOP);
846 if (WinQueryClassName(hwndActive, sizeof(ucClassname), ucClassname)) {
847 /* don't bring up help if a menu is active */
848 if (!strcmp(ucClassname, "#4"))
849 return;
850 }
851 }
852
853 hwndBubble = WinCreateWindow(HWND_DESKTOP,
854 WC_BUBBLE,
855 help,
856 WS_CLIPSIBLINGS | SS_TEXT |
857 DT_CENTER | DT_VCENTER,
858 0,
859 0,
860 0,
861 0,
862 HWND_DESKTOP, HWND_TOP, MAIN_HELP, NULL, NULL);
863 if (!hwndBubble)
864 Win_Error2(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
865 IDS_WINCREATEWINDOW);
866 else {
867 HPS hps;
868 POINTL aptl[TXTBOX_COUNT], ptl, tptl;
869 LONG lxScreen, sx, sy, extra = 0, lyScreen;
870 char *p, *pp, *wp;
871 SWP swp;
872
873 WinQueryWindowPos(hwnd, &swp);
874 lyScreen = WinQuerySysValue(HWND_DESKTOP, SV_CYSCREEN);
875 lxScreen = WinQuerySysValue(HWND_DESKTOP, SV_CXSCREEN);
876 WinSetWindowULong(hwndBubble, QWL_USER, hwnd);
877 SetPresParams(hwndBubble, NULL, NULL, NULL, GetPString(IDS_8HELVTEXT));
878 hps = WinGetPS(hwndBubble);
879 p = help;
880 tptl.x = tptl.y = 0;
881 while (p && *p) {
882 wp = NULL;
883 pp = strchr(p, '\r');
884 if (pp) {
885 wp = pp;
886 *pp = 0;
887 pp++;
888 }
889 GpiQueryTextBox(hps, strlen(p), p, TXTBOX_COUNT, aptl);
890 tptl.x = max(aptl[TXTBOX_TOPRIGHT].x, tptl.x);
891 if (tptl.y)
892 tptl.y += extra;
893 else
894 extra = aptl[TXTBOX_TOPLEFT].y / 4;
895 tptl.y += aptl[TXTBOX_TOPLEFT].y;
896 if (wp)
897 *wp = '\r';
898 p = pp;
899 }
900 WinSetWindowULong(hwndBubble, QWL_USER + 4, extra);
901 WinReleasePS(hps);
902 ptl.x = ptl.y = 0;
903 WinMapWindowPoints(hwnd, HWND_DESKTOP, &ptl, 1);
904 if (above) {
905 sy = ptl.y + swp.cy + 4;
906 if (sy + tptl.y + 12 > lyScreen) {
907 above = FALSE;
908 sy = ptl.y - (tptl.y + 14);
909 }
910 }
911 else
912 sy = ptl.y - (tptl.y + 14);
913 if (ptl.x > (lxScreen / 2))
914 sx = (ptl.x - tptl.x) - 16;
915 else
916 sx = ptl.x + (54 * (above == FALSE)) + 2;
917 if (sx < 0)
918 sx = 0;
919 if (sx + tptl.x + 14 > lxScreen)
920 sx = lxScreen - (tptl.x + 14);
921 if (sy < 0) {
922 sy = ptl.y + swp.cy + 4;
923 if (sy + tptl.y + 12 > lyScreen)
924 sy = 0;
925 }
926 WinSetWindowPos(hwndBubble, HWND_TOP, sx, sy,
927 tptl.x + 14,
928 tptl.y + 12,
929 SWP_DEACTIVATE | SWP_SHOW | SWP_ZORDER |
930 SWP_MOVE | SWP_SIZE);
931 }
932}
933
934MRESULT EXPENTRY BubbleProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
935{
936 switch (msg) {
937 case WM_SETFOCUS:
938 if (mp2)
939 PostMsg(hwnd, UM_FOCUSME, mp1, MPVOID);
940 break;
941
942 case UM_FOCUSME:
943 WinSetFocus(HWND_DESKTOP, (HWND) mp1);
944 return 0;
945
946 case WM_MOUSEMOVE:
947 WinShowWindow(hwnd, FALSE);
948 break;
949
950 case UM_TIMER:
951 {
952 POINTL ptl;
953
954 WinQueryPointerPos(HWND_DESKTOP, &ptl);
955 if (WinWindowFromPoint(HWND_DESKTOP, &ptl, TRUE) !=
956 WinQueryWindowULong(hwnd, QWL_USER) || !WinIsWindowVisible(hwnd))
957 WinDestroyWindow(hwnd);
958 }
959 return 0;
960
961 case WM_PAINT:
962 {
963 HPS hps;
964 SWP swp;
965 POINTL ptl, aptl[TXTBOX_COUNT];
966 CHAR *s, *p, *pp, *wp;
967 ULONG extra, tlen, y;
968
969 hps = WinBeginPaint(hwnd, (HPS) 0, NULL);
970 if (hps) {
971 WinQueryWindowPos(hwnd, &swp);
972 GpiCreateLogColorTable(hps, 0, LCOLF_RGB, 0, 0, 0);
973 GpiSetColor(hps, ((255 << 16) | (255 << 8) | 198));
974 GpiSetBackMix(hps, BM_LEAVEALONE);
975 GpiSetMix(hps, FM_OVERPAINT);
976 ptl.x = ptl.y = 0;
977 GpiMove(hps, &ptl);
978 ptl.x = swp.cx - 1;
979 ptl.y = swp.cy - 1;
980 GpiBox(hps, DRO_OUTLINEFILL, &ptl, 0, 0);
981 tlen = WinQueryWindowTextLength(hwnd);
982 if (tlen) {
983 s = xmalloc(tlen + 2, pszSrcFile, __LINE__);
984 if (s) {
985 WinQueryWindowText(hwnd, tlen + 1, s);
986 if (*s) {
987 p = s;
988 y = swp.cy - 3;
989 extra = WinQueryWindowULong(hwnd, QWL_USER + 4);
990 GpiSetColor(hps, 0);
991 GpiSetMix(hps, FM_OVERPAINT);
992 while (p && *p) {
993 wp = NULL;
994 pp = strchr(p, '\r');
995 if (pp) {
996 wp = pp;
997 *pp = 0;
998 pp++;
999 }
1000 GpiQueryTextBox(hps, strlen(p), p, TXTBOX_COUNT, aptl);
1001 ptl.x = 7;
1002 y -= aptl[TXTBOX_TOPLEFT].y;
1003 if (p != s)
1004 y -= extra;
1005 ptl.y = y;
1006 GpiCharStringAt(hps, &ptl, strlen(p), p);
1007 if (wp)
1008 *wp = '\r';
1009 p = pp;
1010 }
1011 }
1012 xfree(s, pszSrcFile, __LINE__);
1013 }
1014 }
1015 if (!(swp.fl & (SWP_HIDE | SWP_MINIMIZE)) && swp.cx > 6 && swp.cy > 6) {
1016 GpiSetColor(hps, CLR_WHITE);
1017 ptl.x = 1;
1018 ptl.y = 1;
1019 GpiMove(hps, &ptl);
1020 ptl.y = swp.cy - 2;
1021 GpiLine(hps, &ptl);
1022 ptl.x = swp.cx - 2;
1023 GpiLine(hps, &ptl);
1024 ptl.x = 2;
1025 ptl.y = 2;
1026 GpiMove(hps, &ptl);
1027 ptl.y = swp.cy - 3;
1028 GpiLine(hps, &ptl);
1029 ptl.x = swp.cx - 3;
1030 GpiLine(hps, &ptl);
1031 GpiSetColor(hps, CLR_BROWN);
1032 ptl.x = 1;
1033 ptl.y = 1;
1034 GpiMove(hps, &ptl);
1035 ptl.x = swp.cx - 2;
1036 GpiLine(hps, &ptl);
1037 ptl.y = swp.cy - 2;
1038 GpiLine(hps, &ptl);
1039 ptl.x = 2;
1040 ptl.y = 2;
1041 GpiMove(hps, &ptl);
1042 ptl.x = swp.cx - 3;
1043 GpiLine(hps, &ptl);
1044 ptl.y = swp.cy - 3;
1045 GpiLine(hps, &ptl);
1046 }
1047 WinEndPaint(hps);
1048 }
1049 }
1050 return 0;
1051
1052 case WM_CLOSE:
1053 WinDestroyWindow(hwnd);
1054 return 0;
1055
1056 case WM_DESTROY:
1057 hwndBubble = (HWND) 0;
1058 break;
1059 }
1060 return PFNWPStatic(hwnd, msg, mp1, mp2);
1061}
1062
1063MRESULT EXPENTRY LEDProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
1064{
1065 switch (msg) {
1066 case WM_CREATE:
1067 {
1068 MRESULT mr = PFNWPStatic(hwnd, msg, mp1, mp2);
1069 HBITMAP hbmold = (HBITMAP) 0;
1070 HPS hps = (HPS) 0;
1071
1072 switch (WinQueryWindowUShort(hwnd, QWS_ID)) {
1073 case MAIN_LED:
1074 hps = WinGetPS(hwnd);
1075 hbmold = (HBITMAP) WinSendMsg(hwnd, SM_QUERYHANDLE, MPVOID, MPVOID);
1076 if (!fBlueLED) {
1077 hbmLEDon = GpiLoadBitmap(hps, 0, LEDON_BMP, 12, 12);
1078 hbmLEDoff = GpiLoadBitmap(hps, 0, LEDOFF_BMP, 12, 12);
1079 }
1080 else {
1081 hbmLEDon = GpiLoadBitmap(hps, 0, LEDON2_BMP, 12, 12);
1082 hbmLEDoff = GpiLoadBitmap(hps, 0, LEDOFF2_BMP, 12, 12);
1083 }
1084 if (hbmLEDoff && hbmLEDon)
1085 WinSendMsg(hwnd, SM_SETHANDLE, MPFROMLONG(hbmLEDoff), MPVOID);
1086 else {
1087 if (hbmLEDoff)
1088 GpiDeleteBitmap(hbmLEDoff);
1089 if (hbmLEDon)
1090 GpiDeleteBitmap(hbmLEDon);
1091 }
1092 if (hbmold &&
1093 hbmLEDon &&
1094 hbmLEDoff && hbmold != hbmLEDon && hbmold != hbmLEDoff)
1095 GpiDeleteBitmap(hbmold);
1096 if (hps)
1097 WinReleasePS(hps);
1098 break;
1099 default:
1100 SetPresParams(hwnd,
1101 &RGBGREY,
1102 &RGBBLACK, &RGBGREY, GetPString(IDS_6HELVTEXT));
1103 break;
1104 }
1105 return mr;
1106 }
1107
1108 case WM_SETFOCUS:
1109 if (mp2)
1110 PostMsg(hwnd, UM_FOCUSME, mp1, MPVOID);
1111 break;
1112
1113 case UM_FOCUSME:
1114 WinSetFocus(HWND_DESKTOP, (HWND) mp1);
1115 return 0;
1116
1117 case WM_MOUSEMOVE:
1118 BubbleHelp(hwnd, TRUE, FALSE, FALSE, GetPString(IDS_LEDHELP));
1119 if (!fNoFinger) {
1120 WinSetPointer(HWND_DESKTOP, hptrFinger);
1121 return MRFROMLONG(TRUE);
1122 }
1123 break;
1124
1125 case WM_BUTTON1CLICK:
1126 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
1127 WM_COMMAND, MPFROM2SHORT(IDM_SHOWNOTEWND, 0), MPVOID);
1128 break;
1129
1130 case WM_BUTTON2CLICK:
1131 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
1132 WM_COMMAND, MPFROM2SHORT(IDM_HIDENOTEWND, 0), MPVOID);
1133 break;
1134
1135 case WM_CHORD:
1136 case WM_BUTTON3CLICK:
1137 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
1138 WM_COMMAND, MPFROM2SHORT(IDM_WINDOWDLG, 0), MPVOID);
1139 break;
1140 }
1141 return PFNWPStatic(hwnd, msg, mp1, mp2);
1142}
1143
1144MRESULT EXPENTRY ChildButtonProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
1145{
1146 USHORT id;
1147 TOOL *tool;
1148
1149 static HWND hwndMenu = (HWND) 0;
1150
1151 switch (msg) {
1152 case WM_BUTTON1DOWN:
1153 case WM_BUTTON2DOWN:
1154 case WM_BUTTON3DOWN:
1155 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
1156 break;
1157
1158 case WM_MOUSEMOVE:
1159 if (fToolbarHelp) {
1160 if ((!hwndBubble || WinQueryWindowULong(hwndBubble, QWL_USER) != hwnd)
1161 && !WinQueryCapture(HWND_DESKTOP)) {
1162 id = WinQueryWindowUShort(hwnd, QWS_ID);
1163 tool = find_tool(id);
1164 if (tool && tool->help && *tool->help) {
1165
1166 char s[128];
1167
1168 strcpy(s, tool->help);
1169 if (tool->flags & T_DROPABLE)
1170 strcat(s, GetPString(IDS_DROPONMETEXT));
1171 MakeBubble(hwnd, FALSE, s);
1172 }
1173 }
1174 }
1175 break;
1176
1177 case WM_COMMAND:
1178 switch (SHORT1FROMMP(mp1)) {
1179 case IDM_HELP:
1180 if (hwndHelp)
1181 WinSendMsg(hwndHelp,
1182 HM_DISPLAY_HELP,
1183 MPFROM2SHORT(HELP_TOOLBAR, 0), MPFROMSHORT(HM_RESOURCEID));
1184 break;
1185
1186 case IDM_HIDEANYTOOL: /* hide any tool */
1187 case IDM_HIDETOOL: /* hide tool */
1188 if (SHORT1FROMMP(mp1) == IDM_HIDETOOL)
1189 id = WinQueryWindowUShort(hwnd, QWS_ID);
1190 else
1191 id = (USHORT) WinDlgBox(HWND_DESKTOP, hwnd,
1192 PickToolProc, FM3ModHandle,
1193 PICKBTN_FRAME, GetPString(IDS_HIDETEXT));
1194 if (id) {
1195 tool = find_tool(id);
1196 if (tool) {
1197 tool->flags |= T_INVISIBLE;
1198 fToolsChanged = TRUE;
1199 }
1200 }
1201 break;
1202
1203 case IDM_SHOWTOOLS: /* show all tools */
1204 tool = toolhead;
1205 while (tool) {
1206 tool->flags &= (~T_INVISIBLE);
1207 tool = tool->next;
1208 fToolsChanged = TRUE;
1209 }
1210 break;
1211
1212 case IDM_DELETEANYTOOL: /* delete any button */
1213 case IDM_DELETETOOL: /* delete button */
1214 if (SHORT1FROMMP(mp1) == IDM_DELETETOOL)
1215 id = WinQueryWindowUShort(hwnd, QWS_ID);
1216 else
1217 id =
1218 (USHORT) WinDlgBox(HWND_DESKTOP, hwnd, PickToolProc, FM3ModHandle,
1219 PICKBTN_FRAME, GetPString(IDS_DELETETEXT));
1220 if (id)
1221 PostMsg(WinQueryWindow(hwnd, QW_PARENT), UM_SETUP,
1222 MPFROM2SHORT(id, 0), MPVOID);
1223 return 0;
1224
1225 case IDM_EDITANYTOOL: /* edit any button */
1226 case IDM_EDITTOOL: /* edit button */
1227 if (SHORT1FROMMP(mp1) == IDM_EDITTOOL)
1228 id = WinQueryWindowUShort(hwnd, QWS_ID);
1229 else
1230 id =
1231 (USHORT) WinDlgBox(HWND_DESKTOP, hwnd, PickToolProc, FM3ModHandle,
1232 PICKBTN_FRAME, GetPString(IDS_EDITTEXT));
1233 if (id) {
1234 tool = find_tool(id);
1235 if (tool) {
1236 if (WinDlgBox(HWND_DESKTOP, hwnd, AddToolProc, FM3ModHandle,
1237 ADDBTN_FRAME, (PVOID) tool))
1238 WinSendMsg(WinWindowFromID(WinQueryWindow(WinQueryWindow(hwnd,
1239 QW_PARENT),
1240 QW_PARENT), FID_CLIENT),
1241 WM_COMMAND, MPFROM2SHORT(IDM_CREATETOOL, 0),
1242 MPFROM2SHORT(id, 0));
1243 }
1244 }
1245 break;
1246
1247 case IDM_ADDTOOL: /* add tool */
1248 id = (USHORT) WinDlgBox(HWND_DESKTOP, hwnd, AddToolProc, FM3ModHandle,
1249 ADDBTN_FRAME, MPVOID);
1250 if (id && id != (USHORT) - 1)
1251 WinSendMsg(WinWindowFromID(WinQueryWindow(WinQueryWindow(hwnd,
1252 QW_PARENT),
1253 QW_PARENT), FID_CLIENT),
1254 WM_COMMAND, MPFROM2SHORT(IDM_CREATETOOL, 0),
1255 MPFROM2SHORT(id, 0));
1256 break;
1257
1258 case IDM_REORDERTOOLS: /* reorder tools */
1259 WinDlgBox(HWND_DESKTOP,
1260 hwnd, ReOrderToolsProc, FM3ModHandle, RE_FRAME, MPVOID);
1261 break;
1262
1263 case IDM_SAVETOOLS:
1264 case IDM_LOADTOOLS:
1265 if (WinDlgBox(HWND_DESKTOP,
1266 hwnd,
1267 ToolIODlgProc,
1268 FM3ModHandle,
1269 SVBTN_FRAME,
1270 (PVOID) (SHORT1FROMMP(mp1) == IDM_SAVETOOLS) ?
1271 "TRUE" : NULL))
1272 BuildTools(hwndToolback, TRUE);
1273 break;
1274 }
1275 ResizeTools(WinQueryWindow(hwnd, QW_PARENT));
1276 return 0;
1277
1278 case WM_MENUEND:
1279 if (hwndMenu == (HWND) mp2) {
1280 WinDestroyWindow(hwndMenu);
1281 hwndMenu = (HWND) 0;
1282 }
1283 break;
1284
1285 case WM_CONTEXTMENU:
1286 DosEnterCritSec();
1287 if (!hwndMenu)
1288 hwndMenu = WinLoadMenu(hwnd, FM3ModHandle, ID_BUTTONMENU);
1289 DosExitCritSec();
1290 SetPresParams(hwndMenu, NULL, NULL, NULL, GetPString(IDS_10SYSPROTEXT));
1291 if (PopupMenu(hwnd, hwnd, hwndMenu))
1292 WinShowWindow(hwndMenu, TRUE);
1293 return MRFROMSHORT(TRUE);
1294
1295 case DM_DRAGOVER:
1296 {
1297 PDRAGINFO pDInfo; /* Pointer to DRAGINFO */
1298
1299 pDInfo = (PDRAGINFO) mp1; /* Get DRAGINFO pointer */
1300 DrgAccessDraginfo(pDInfo); /* Access DRAGINFO */
1301 id = WinQueryWindowUShort(hwnd, QWS_ID);
1302 tool = find_tool(id);
1303 if (!tool) {
1304 DrgFreeDraginfo(pDInfo);
1305 return (MRFROM2SHORT(DOR_NEVERDROP, 0)); /* Drop not valid */
1306 }
1307 if (!(tool->flags & T_DROPABLE)) {
1308 DrgFreeDraginfo(pDInfo);
1309 return (MRFROM2SHORT(DOR_NEVERDROP, 0)); /* Drop not valid */
1310 }
1311 {
1312 PDRAGITEM pDItem; /* Pointer to DRAGITEM */
1313
1314 pDItem = DrgQueryDragitemPtr(pDInfo, /* Access DRAGITEM */
1315 0); /* Index to DRAGITEM */
1316 if (DrgVerifyRMF(pDItem, /* Check valid rendering */
1317 DRM_OS2FILE, /* mechanisms and data */
1318 NULL)) { /* formats */
1319 if (!(tool->flags & T_EMPHASIZED)) {
1320 tool->flags |= T_EMPHASIZED;
1321 DrawTargetEmphasis(hwnd, ((tool->flags & T_EMPHASIZED) != 0));
1322 DrgFreeDraginfo(pDInfo);
1323 }
1324 return (MRFROM2SHORT(DOR_DROP, /* Return okay to drop */
1325 DO_MOVE)); /* Move operation valid */
1326 }
1327 DrgFreeDraginfo(pDInfo);
1328 }
1329 }
1330 return (MRFROM2SHORT(DOR_NEVERDROP, 0)); /* Drop not valid */
1331
1332 case DM_DROPHELP:
1333 id = WinQueryWindowUShort(hwnd, QWS_ID);
1334 tool = find_tool(id);
1335 PFNWPButton(hwnd, msg, mp1, mp2);
1336 DropHelp(mp1, mp2, hwnd, GetPString(IDS_TOOLDROPHELP));
1337 return 0;
1338
1339 case DM_DRAGLEAVE:
1340 id = WinQueryWindowUShort(hwnd, QWS_ID);
1341 tool = find_tool(id);
1342 if (tool && (tool->flags & T_DROPABLE)) {
1343 if (tool->flags & T_EMPHASIZED) {
1344 tool->flags &= (~T_EMPHASIZED);
1345 DrawTargetEmphasis(hwnd, ((tool->flags & T_EMPHASIZED) != 0));
1346 }
1347 }
1348 break;
1349
1350 case DM_DROP:
1351 id = WinQueryWindowUShort(hwnd, QWS_ID);
1352 tool = find_tool(id);
1353 if (tool && (tool->flags & T_DROPABLE) != 0) {
1354 LISTINFO *li;
1355 CNRDRAGINFO cdi;
1356
1357 if (tool->flags & T_EMPHASIZED) {
1358 DrawTargetEmphasis(hwnd, ((tool->flags & T_EMPHASIZED) != 0));
1359 tool->flags &= (~T_EMPHASIZED);
1360 }
1361 memset(&cdi, 0, sizeof(cdi));
1362 cdi.pDragInfo = mp1;
1363 li = DoFileDrop(hwnd, NULL, FALSE, mp1, MPFROMP(&cdi));
1364 CheckPmDrgLimit(cdi.pDragInfo);
1365 if (li) {
1366 li->type = id;
1367 if (!li->list || !li->list[0])
1368 FreeListInfo(li);
1369 else {
1370 HWND hwndActive;
1371
1372 hwndActive = TopWindow(hwndMain, (HWND) 0);
1373 if (hwndActive) {
1374 if (!WinSendMsg(hwndActive, UM_COMMAND, MPFROMP(li), MPVOID))
1375 FreeListInfo(li);
1376 }
1377 else
1378 FreeListInfo(li);
1379 }
1380 }
1381 }
1382 return 0;
1383
1384 case WM_CLOSE:
1385 WinDestroyWindow(hwnd);
1386 return 0;
1387 }
1388 return PFNWPButton(hwnd, msg, mp1, mp2);
1389}
1390
1391VOID BuildTools(HWND hwndT, BOOL resize)
1392{
1393 TOOL *tool;
1394 ULONG ctrlxpos = 18L;
1395 CHAR s[33];
1396 HENUM henum;
1397 HWND hwndTool;
1398
1399 henum = WinBeginEnumWindows(hwndT);
1400 while ((hwndTool = WinGetNextWindow(henum)) != NULLHANDLE)
1401 WinDestroyWindow(hwndTool);
1402 WinEndEnumWindows(henum);
1403 if (!fToolbar) {
1404 load_quicktools();
1405 load_tools(NULL);
1406 return;
1407 }
1408 if (!toolhead)
1409 load_tools(NULL);
1410 tool = toolhead;
1411 while (tool) {
1412 sprintf(s, "#%u", tool->id);
1413 hwndTool = (HWND) 0;
1414 if (!fTextTools) {
1415 if (!(tool->flags & T_MYICON)) {
1416 hwndTool = WinCreateWindow(hwndT,
1417 WC_TOOLBUTTONS,
1418 s,
1419 BS_NOPOINTERFOCUS |
1420 BS_BITMAP | BS_PUSHBUTTON,
1421 ctrlxpos,
1422 14,
1423 32,
1424 32, hwndT, HWND_TOP, tool->id, NULL, NULL);
1425 }
1426 if (!hwndTool) {
1427 HBITMAP hbm = LoadBitmapFromFileNum(tool->id);
1428
1429 if (hbm) {
1430 BTNCDATA btc;
1431
1432 memset(&btc, 0, sizeof(btc));
1433 btc.cb = sizeof(btc);
1434 btc.hImage = hbm;
1435 hwndTool = WinCreateWindow(hwndT,
1436 WC_TOOLBUTTONS,
1437 NullStr,
1438 BS_NOPOINTERFOCUS |
1439 BS_BITMAP | BS_PUSHBUTTON,
1440 ctrlxpos,
1441 14,
1442 32,
1443 32,
1444 hwndT, HWND_TOP, tool->id, &btc, NULL);
1445 if (!hwndTool)
1446 GpiDeleteBitmap(hbm);
1447 }
1448 }
1449 if (hwndTool)
1450 tool->flags &= (~T_TEXT);
1451 }
1452 if (!hwndTool) {
1453 hwndTool = WinCreateWindow(hwndT,
1454 WC_TOOLBUTTONS,
1455 (!tool->text && tool->id >= IDM_COMMANDSTART
1456 && tool->id <
1457 IDM_QUICKTOOLSTART) ? command_title(tool->
1458 id -
1459 IDM_COMMANDSTART)
1460 : tool->text,
1461 BS_NOPOINTERFOCUS | BS_PUSHBUTTON, ctrlxpos,
1462 2, 54, 24, hwndT, HWND_TOP, tool->id, NULL,
1463 NULL);
1464 if (!hwndTool)
1465 Win_Error2(hwndT, HWND_DESKTOP, pszSrcFile, __LINE__,
1466 IDS_WINCREATEWINDOW);
1467 tool->flags |= T_TEXT;
1468 }
1469 if (fToolTitles && !fTextTools) {
1470 hwndTool = WinCreateWindow(hwndT,
1471 WC_STATIC,
1472 tool->text,
1473 SS_TEXT | DT_LEFT | DT_VCENTER,
1474 ctrlxpos,
1475 1,
1476 32,
1477 10,
1478 hwndT,
1479 HWND_TOP, tool->id + 25000, NULL, NULL);
1480 if (!hwndTool)
1481 Win_Error2(hwndT, HWND_DESKTOP, pszSrcFile, __LINE__,
1482 IDS_WINCREATEWINDOW);
1483 else {
1484 SetPresParams(hwndTool,
1485 &RGBGREY,
1486 &RGBBLACK, &RGBGREY, GetPString(IDS_2SYSTEMVIOTEXT));
1487 }
1488 }
1489 ctrlxpos += ((tool->flags & T_TEXT) ? 55L : 33L);
1490 SetPresParams(WinWindowFromID(hwndT, tool->id),
1491 NULL, NULL, NULL, GetPString(IDS_8HELVTEXT));
1492 tool = tool->next;
1493 } // while tool
1494
1495 hwndTool = WinCreateWindow(hwndT,
1496 WC_BUTTON,
1497 "#6010",
1498 BS_NOPOINTERFOCUS |
1499 BS_BITMAP | BS_PUSHBUTTON,
1500 1,
1501 19,
1502 14,
1503 13, hwndT, HWND_TOP, IDM_TOOLLEFT, NULL, NULL);
1504 if (!hwndTool)
1505 Win_Error2(hwndT, HWND_DESKTOP, pszSrcFile, __LINE__,
1506 IDS_WINCREATEWINDOW);
1507 hwndTool =
1508 WinCreateWindow(hwndT, WC_BUTTON, "#6011",
1509 BS_NOPOINTERFOCUS | BS_BITMAP | BS_PUSHBUTTON, 1, 4, 14,
1510 13, hwndT, HWND_TOP, IDM_TOOLRIGHT, NULL, NULL);
1511 if (!hwndTool)
1512 Win_Error2(hwndT, HWND_DESKTOP, pszSrcFile, __LINE__,
1513 IDS_WINCREATEWINDOW);
1514 if (resize)
1515 ResizeTools(hwndT);
1516}
1517
1518static MRESULT EXPENTRY CommandLineProc(HWND hwnd, ULONG msg, MPARAM mp1,
1519 MPARAM mp2)
1520{
1521 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
1522 static BOOL lbup = FALSE;
1523
1524 switch (msg) {
1525 case UM_FOCUSME:
1526 WinSetFocus(HWND_DESKTOP, hwnd);
1527 return 0;
1528
1529 case WM_SETFOCUS:
1530 if (!mp2 && !lbup) {
1531
1532 PID pid;
1533 TID tid;
1534
1535 if (WinQueryWindowUShort((HWND) mp1, QWS_ID) == COMMAND_BUTTON)
1536 break;
1537 if (!WinQueryWindowProcess((HWND) mp1, &pid, &tid) || pid == mypid)
1538 WinDestroyWindow(hwnd);
1539 }
1540 break;
1541
1542 case UM_RESCAN:
1543 {
1544 PSZ pszCmdLine;
1545
1546 pszCmdLine = xmallocz(MaxComLineStrg, pszSrcFile, __LINE__);
1547 if (pszCmdLine) {
1548 lbup = TRUE;
1549 if (WinDlgBox(HWND_DESKTOP,
1550 hwnd,
1551 CmdLine2DlgProc,
1552 FM3ModHandle, EXEC2_FRAME, MPFROMP(pszCmdLine))) {
1553 lstrip(pszCmdLine);
1554 WinSetWindowText(hwnd, pszCmdLine);
1555 }
1556 PostMsg(hwnd, UM_FOCUSME, MPVOID, MPVOID);
1557 PostMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
1558 xfree(pszCmdLine, pszSrcFile, __LINE__);
1559 }
1560 }
1561 return 0;
1562
1563 case UM_SETUP:
1564 lbup = FALSE;
1565 return 0;
1566
1567 case WM_BUTTON1DBLCLK:
1568 PostMsg(hwnd, UM_OPENWINDOWFORME, MPVOID, MPVOID);
1569 return 0;
1570
1571 case WM_COMMAND:
1572 switch (SHORT1FROMMP(mp1)) {
1573 case COMMAND_BUTTON:
1574 if (!lbup)
1575 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
1576 break;
1577 }
1578 return 0;
1579
1580 case UM_OPENWINDOWFORME:
1581 {
1582 static char directory[CCHMAXPATH], cl[1000];
1583 char **list = NULL;
1584 ULONG len;
1585 HWND hwndCnr;
1586
1587 *directory = *cl = 0;
1588 strcpy(cl, GetCmdSpec(FALSE));
1589 strcat(cl, " /C ");
1590 len = strlen(cl);
1591 WinQueryWindowText(hwnd, 1000 - len, cl + len);
1592 bstrip(cl + len);
1593 if (strlen(cl) > len) {
1594 WinSendMsg(WinQueryWindow(hwnd, QW_PARENT),
1595 UM_SETUP, MPFROMP(cl + len), MPVOID);
1596 WinQueryWindowText(hwndStatus, CCHMAXPATH, directory);
1597 bstrip(directory);
1598 if (*directory && (IsRoot(directory) || !IsFile(directory))) {
1599 if (!FM2Command(directory, cl + len)) {
1600 hwndCnr = TopWindow(hwndMain, (HWND) 0);
1601 if (hwndCnr) {
1602 hwndCnr = WinWindowFromID(hwndCnr, FID_CLIENT);
1603 if (hwndCnr) {
1604 hwndCnr = WinWindowFromID(hwndCnr, DIR_CNR);
1605 if (hwndCnr)
1606 list = BuildList(hwndCnr);
1607 }
1608 }
1609 WinSetActiveWindow(HWND_DESKTOP, hwndCnr);
1610 if (add_cmdline(cl + len, FALSE) && fSaveMiniCmds)
1611 save_cmdlines(FALSE);
1612 ExecOnList(hwndCnr,
1613 cl,
1614 WINDOWED | ((fKeepCmdLine) ?
1615 SEPARATEKEEP : SEPARATE),
1616 directory, list, NULL, pszSrcFile, __LINE__);
1617 xfree(list, pszSrcFile, __LINE__);
1618 WinDestroyWindow(hwnd);
1619 break;
1620 }
1621 }
1622 }
1623 WinSendMsg(hwnd, EM_SETSEL, MPFROM2SHORT(0, 1024), MPVOID);
1624 }
1625 return 0;
1626
1627 case WM_CHAR:
1628 if (!lbup && !(SHORT1FROMMP(mp1) & KC_KEYUP)) {
1629 if (SHORT1FROMMP(mp1) & KC_VIRTUALKEY) {
1630 if ((SHORT1FROMMP(mp2) & 255) == '\r')
1631 PostMsg(hwnd, UM_OPENWINDOWFORME, MPVOID, MPVOID);
1632 else if ((SHORT1FROMMP(mp2) & 0xff) == 0x1b)
1633 WinDestroyWindow(hwnd);
1634 else if (SHORT2FROMMP(mp2) == VK_UP || SHORT2FROMMP(mp2) == VK_DOWN)
1635 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
1636 }
1637 }
1638 else if ((SHORT1FROMMP(mp1) & KC_VIRTUALKEY) &&
1639 ((SHORT2FROMMP(mp2) == VK_UP ||
1640 SHORT2FROMMP(mp2) == VK_DOWN) ||
1641 (SHORT1FROMMP(mp2) == '\x1b') || (SHORT1FROMMP(mp2) == '\r')))
1642 return 0;
1643 break;
1644
1645 case WM_DESTROY:
1646 PostMsg(WinQueryWindow(hwnd, QW_PARENT), UM_RESCAN, MPVOID, MPVOID);
1647 lbup = FALSE;
1648 break;
1649 }
1650 return oldproc(hwnd, msg, mp1, mp2);
1651}
1652
1653MRESULT EXPENTRY DriveBackProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
1654{
1655 switch (msg) {
1656 case WM_CREATE:
1657 PostMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
1658 break;
1659
1660 case UM_SETUP:
1661 {
1662 RGB2 rgb;
1663
1664 memset(&rgb, 0, sizeof(rgb));
1665 rgb.bRed = (BYTE)128;
1666 SetPresParams(hwnd,
1667 &RGBGREY, &rgb, &RGBGREY, GetPString(IDS_8HELVTEXT));
1668 SetTargetDir(hwnd, TRUE);
1669 }
1670 return 0;
1671
1672 case WM_SETFOCUS:
1673 case UM_FOCUSME:
1674 case WM_BUTTON1DOWN:
1675 case WM_BUTTON1UP:
1676 case WM_BUTTON2DOWN:
1677 case WM_BUTTON2UP:
1678 case WM_BUTTON3DOWN:
1679 case WM_BUTTON3UP:
1680 return CommonTextButton(hwnd, msg, mp1, mp2);
1681
1682 case WM_MOUSEMOVE:
1683 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
1684 break;
1685
1686 case UM_CLICKED:
1687 case UM_CLICKED3:
1688 PostMsg(hwndMain, WM_COMMAND, MPFROM2SHORT(IDM_SETTARGET, 0), MPVOID);
1689 return 0;
1690
1691 case WM_CHAR:
1692 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
1693 break;
1694
1695 case WM_CONTROLPOINTER:
1696 if (!fNoFinger &&
1697 (SHORT1FROMMP(mp1) >= IDM_DRIVEA &&
1698 SHORT1FROMMP(mp1) < IDM_DRIVEA + 26))
1699 return MRFROMLONG(hptrFinger);
1700 break;
1701
1702 case WM_COMMAND:
1703 {
1704 CHAR dv[4];
1705
1706 *dv = 0;
1707 WinQueryWindowText(WinWindowFromID(hwnd, SHORT1FROMMP(mp1) + 50),
1708 2, dv);
1709 if (isalpha(*dv)) {
1710
1711 HWND hwndActive;
1712
1713 dv[1] = ':';
1714 dv[2] = '\\';
1715 dv[3] = 0;
1716 hwndActive = TopWindow(hwnd, (HWND) 0);
1717 if (hwndActive)
1718 WinSendMsg(WinWindowFromID(hwndActive, FID_CLIENT),
1719 UM_DRIVECMD, MPFROMP(dv), MPVOID);
1720 }
1721 }
1722 return 0;
1723
1724 case WM_PAINT:
1725 PaintRecessedWindow(hwnd, (HPS) 0, TRUE, FALSE);
1726 break;
1727
1728 case WM_CLOSE:
1729 WinDestroyWindow(hwnd);
1730 return 0;
1731 }
1732 return PFNWPStatic(hwnd, msg, mp1, mp2);
1733}
1734
1735MRESULT EXPENTRY DriveProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
1736{
1737 USHORT id;
1738 CHAR szDrv[CCHMAXPATH];
1739
1740 static BOOL emphasized = FALSE;
1741 static HWND hwndMenu = NULLHANDLE;
1742 static USHORT helpid = 0;
1743
1744 switch (msg) {
1745 case WM_MOUSEMOVE:
1746 if (fDrivebarHelp &&
1747 (!hwndBubble ||
1748 WinQueryWindowULong(hwndBubble, QWL_USER) != hwnd) &&
1749 !WinQueryCapture(HWND_DESKTOP)) {
1750 id = WinQueryWindowUShort(hwnd, QWS_ID);
1751 if (helpid != id) {
1752 helpid = id;
1753 PostMsg(MainObjectHwnd, UM_SETUP6, MPFROMLONG((ULONG) hwnd), MPVOID);
1754 }
1755 else
1756 helpid = 0;
1757 }
1758 break;
1759
1760 case UM_SETUP6:
1761 if (helpid == WinQueryWindowUShort(hwnd, QWS_ID)) {
1762 if ((char *)mp1 &&
1763 (!hwndBubble ||
1764 WinQueryWindowULong(hwndBubble, QWL_USER) != hwnd) &&
1765 !WinQueryCapture(HWND_DESKTOP)) {
1766
1767 RECTL rcl;
1768 POINTL ptl;
1769
1770 WinQueryPointerPos(HWND_DESKTOP, &ptl);
1771 WinMapWindowPoints(HWND_DESKTOP, hwnd, &ptl, 1);
1772 WinQueryWindowRect(hwnd, &rcl);
1773 if (WinPtInRect(WinQueryAnchorBlock(hwnd), &rcl, &ptl))
1774 BubbleHelp(hwnd, FALSE, TRUE, FALSE, (char *)mp1);
1775 }
1776 }
1777 return 0;
1778
1779 case WM_MENUEND:
1780 if (hwndMenu == (HWND) mp2) {
1781 WinDestroyWindow(hwndMenu);
1782 hwndMenu = (HWND) 0;
1783 }
1784 break;
1785
1786 case WM_CONTEXTMENU:
1787 if (hwndMenu)
1788 WinDestroyWindow(hwndMenu);
1789 hwndMenu = (HWND) 0;
1790 id = WinQueryWindowUShort(hwnd, QWS_ID);
1791 *szDrv = 0;
1792 WinQueryWindowText(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
1793 id + 50), sizeof(szDrv), szDrv);
1794 if (isalpha(*szDrv)) {
1795 hwndMenu = WinLoadMenu(HWND_DESKTOP, FM3ModHandle, MAIN_DRIVES);
1796 if (hwndMenu) {
1797 BOOL rdy;
1798 CHAR chDrv = *szDrv;
1799 UINT iDrv;
1800
1801 strcpy(szDrv + 2, "\\");
1802 MakeValidDir(szDrv);
1803 // Disable menus if MakeValidDir changes drive letter fixme this section doesn't do anything see treecnt.c
1804 rdy = toupper(*szDrv) == toupper(chDrv);
1805 iDrv = toupper(*szDrv) - 'A';
1806 if (!rdy || ~driveflags[iDrv] & DRIVE_REMOTE)
1807 WinEnableMenuItem(hwndMenu, IDM_DETACH, FALSE);
1808
1809 if (!rdy || driveflags[iDrv] & DRIVE_NOTWRITEABLE) {
1810 WinEnableMenuItem(hwndMenu, IDM_MKDIR, FALSE);
1811 WinEnableMenuItem(hwndMenu, IDM_FORMAT, FALSE);
1812 WinEnableMenuItem(hwndMenu, IDM_OPTIMIZE, FALSE);
1813 WinEnableMenuItem(hwndMenu, IDM_UNDELETE, FALSE);
1814 }
1815 if (!rdy || ~driveflags[iDrv] & DRIVE_REMOVABLE) {
1816 WinEnableMenuItem(hwndMenu, IDM_EJECT, FALSE);
1817 WinEnableMenuItem(hwndMenu, IDM_LOCK, FALSE);
1818 WinEnableMenuItem(hwndMenu, IDM_UNLOCK, FALSE);
1819 }
1820 if (!rdy) {
1821 WinEnableMenuItem(hwndMenu, IDM_INFO, FALSE);
1822 WinEnableMenuItem(hwndMenu, IDM_ARCHIVE, FALSE);
1823 WinEnableMenuItem(hwndMenu, IDM_SIZES, FALSE);
1824 WinEnableMenuItem(hwndMenu, IDM_SHOWALLFILES, FALSE);
1825 WinEnableMenuItem(hwndMenu, IDM_CHKDSK, FALSE);
1826 }
1827 /* fixme to be gone?
1828 if (!rdy || ~driveflags[iDrv] & DRIVE_CDROM) {
1829 WinEnableMenuItem(hwndMenu, IDM_CLOSETRAY, FALSE);
1830 }
1831 */
1832 PopupMenu(hwnd, hwnd, hwndMenu);
1833 }
1834 }
1835 return MRFROMSHORT(TRUE);
1836
1837 case WM_BUTTON2CLICK:
1838 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
1839 if (!(shiftstate & KC_CTRL))
1840 break;
1841
1842 case WM_CHORD:
1843 case WM_BUTTON3CLICK:
1844 id = WinQueryWindowUShort(hwnd, QWS_ID);
1845 *szDrv = 0;
1846 WinQueryWindowText(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
1847 id + 50), sizeof(szDrv), szDrv);
1848 if (isalpha(*szDrv)) {
1849 strcat(szDrv, "\\");
1850 if (!FindDirCnrByName(szDrv, TRUE))
1851 OpenDirCnr((HWND) 0, hwndMain, hwndTree, FALSE, szDrv);
1852 }
1853 break;
1854
1855 case WM_COMMAND:
1856 PostMsg(hwnd, UM_COMMAND, mp1, mp2);
1857 return 0;
1858
1859 case UM_COMMAND:
1860 id = WinQueryWindowUShort(hwnd, QWS_ID);
1861 *szDrv = 0;
1862 WinQueryWindowText(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
1863 id + 50), sizeof(szDrv), szDrv);
1864 if (isalpha(*szDrv)) {
1865 strcat(szDrv, "\\");
1866 CommonDriveCmd(hwnd, szDrv, SHORT1FROMMP(mp1));
1867 }
1868 return 0;
1869
1870 case DM_DRAGOVER:
1871 id = WinQueryWindowUShort(hwnd, QWS_ID);
1872 *szDrv = 0;
1873 WinQueryWindowText(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
1874 id + 50), sizeof(szDrv), szDrv);
1875 if (isalpha(*szDrv) &&
1876 !(driveflags[toupper(*szDrv) - 'A'] & DRIVE_NOTWRITEABLE)) {
1877 if (!emphasized) {
1878 emphasized = TRUE;
1879 DrawTargetEmphasis(hwnd, emphasized);
1880 }
1881 if (AcceptOneDrop(hwnd, mp1, mp2))
1882 return MRFROM2SHORT(DOR_DROP, DO_MOVE);
1883 return MRFROM2SHORT(DOR_NEVERDROP, 0);
1884 }
1885 break;
1886
1887 case DM_DRAGLEAVE:
1888 id = WinQueryWindowUShort(hwnd, QWS_ID);
1889 *szDrv = 0;
1890 WinQueryWindowText(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
1891 id + 50), sizeof(szDrv), szDrv);
1892 if (isalpha(*szDrv) &&
1893 !(driveflags[toupper(*szDrv) - 'A'] & DRIVE_NOTWRITEABLE)) {
1894 if (emphasized) {
1895 emphasized = FALSE;
1896 DrawTargetEmphasis(hwnd, emphasized);
1897 }
1898 }
1899 break;
1900
1901 case DM_DROPHELP:
1902 id = WinQueryWindowUShort(hwnd, QWS_ID);
1903 *szDrv = 0;
1904 WinQueryWindowText(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
1905 id + 50), sizeof(szDrv), szDrv);
1906 if (isalpha(*szDrv) &&
1907 !(driveflags[toupper(*szDrv) - 'A'] & DRIVE_NOTWRITEABLE)) {
1908 DropHelp(mp1, mp2, hwnd, GetPString(IDS_DRIVEDROPHELP));
1909 return 0;
1910 }
1911 break;
1912
1913 case DM_DROP:
1914 id = WinQueryWindowUShort(hwnd, QWS_ID);
1915 *szDrv = 0;
1916 WinQueryWindowText(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
1917 id + 50), sizeof(szDrv), szDrv);
1918 if (isalpha(*szDrv) &&
1919 !(driveflags[toupper(*szDrv) - 'A'] & DRIVE_NOTWRITEABLE)) {
1920
1921 CNRDRAGINFO cnd;
1922 LISTINFO *li;
1923 ULONG action = UM_ACTION;
1924
1925 if (emphasized) {
1926 emphasized = FALSE;
1927 DrawTargetEmphasis(hwnd, emphasized);
1928 }
1929 memset(&cnd, 0, sizeof(cnd));
1930 cnd.pDragInfo = (PDRAGINFO) mp1;
1931 cnd.pRecord = NULL;
1932 li = DoFileDrop(hwnd,
1933 NULL,
1934 TRUE, MPFROM2SHORT(TREE_CNR, CN_DROP), MPFROMP(&cnd));
1935 CheckPmDrgLimit(cnd.pDragInfo);
1936 if (li) {
1937 strcpy(li->targetpath, szDrv);
1938 strcat(li->targetpath, "\\");
1939 if (li->list && li->list[0] && IsRoot(li->list[0]))
1940 li->type = DO_LINK;
1941 else if (fDragndropDlg && (!*li->arcname || !li->info)) {
1942
1943 CHECKLIST cl;
1944
1945 memset(&cl, 0, sizeof(cl));
1946 cl.size = sizeof(cl);
1947 cl.flags = li->type;
1948 cl.list = li->list;
1949 cl.cmd = li->type;
1950 cl.prompt = li->targetpath;
1951 li->type = WinDlgBox(HWND_DESKTOP,
1952 hwndMain,
1953 DropListProc,
1954 FM3ModHandle, DND_FRAME, MPFROMP(&cl));
1955 if (li->type == DID_ERROR)
1956 Win_Error(DND_FRAME, HWND_DESKTOP, pszSrcFile, __LINE__,
1957 "Drag & Drop Dialog");
1958 if (!li->type) {
1959 FreeListInfo(li);
1960 return 0;
1961 }
1962 li->list = cl.list;
1963 if (!li->list || !li->list[0]) {
1964 FreeListInfo(li);
1965 return 0;
1966 }
1967 }
1968 else {
1969 if (!WinDlgBox(HWND_DESKTOP,
1970 hwndMain,
1971 WalkDlgProc,
1972 FM3ModHandle,
1973 WALK_FRAME,
1974 MPFROMP(li->targetpath)) || !*li->targetpath) {
1975 FreeListInfo(li);
1976 return 0;
1977 }
1978 }
1979 switch (li->type) {
1980 case DND_LAUNCH:
1981 strcat(li->targetpath, " %a");
1982 ExecOnList(hwndMain,
1983 li->targetpath, PROMPT | WINDOWED, NULL, li->list, NULL,
1984 pszSrcFile, __LINE__);
1985 FreeList(li->list);
1986 li->list = NULL;
1987 break;
1988 case DO_LINK:
1989 if (fLinkSetsIcon) {
1990 li->type = IDM_SETICON;
1991 action = UM_MASSACTION;
1992 }
1993 else
1994 li->type = IDM_COMPARE;
1995 break;
1996 case DND_EXTRACT:
1997 if (*li->targetpath && !IsFile(li->targetpath))
1998 li->type = IDM_EXTRACT;
1999 break;
2000 case DND_MOVE:
2001 li->type = IDM_MOVE;
2002 if (*li->targetpath && IsFile(li->targetpath) == 1) {
2003 action = UM_MASSACTION;
2004 li->type = IDM_ARCHIVEM;
2005 }
2006 break;
2007 case DND_WILDMOVE:
2008 li->type = IDM_WILDMOVE;
2009 if (*li->targetpath && IsFile(li->targetpath) == 1) {
2010 action = UM_MASSACTION;
2011 li->type = IDM_ARCHIVEM;
2012 }
2013 break;
2014 case DND_OBJECT:
2015 li->type = IDM_OBJECT;
2016 action = UM_MASSACTION;
2017 break;
2018 case DND_SHADOW:
2019 li->type = IDM_SHADOW;
2020 action = UM_MASSACTION;
2021 break;
2022 case DND_COMPARE:
2023 li->type = IDM_COMPARE;
2024 break;
2025 case DND_SETICON:
2026 action = UM_MASSACTION;
2027 li->type = IDM_SETICON;
2028 break;
2029 case DND_COPY:
2030 li->type = IDM_COPY;
2031 if (*li->targetpath && IsFile(li->targetpath) == 1) {
2032 action = UM_MASSACTION;
2033 li->type = IDM_ARCHIVE;
2034 }
2035 break;
2036 case DND_WILDCOPY:
2037 li->type = IDM_WILDCOPY;
2038 if (*li->targetpath && IsFile(li->targetpath) == 1) {
2039 action = UM_MASSACTION;
2040 li->type = IDM_ARCHIVE;
2041 }
2042 break;
2043 default:
2044 if (*li->arcname && li->info) {
2045 action = UM_MASSACTION;
2046 li->type = (li->type == DO_MOVE) ? IDM_FAKEEXTRACTM :
2047 IDM_FAKEEXTRACT;
2048 }
2049 else if (*li->targetpath && IsFile(li->targetpath) == 1) {
2050 action = UM_MASSACTION;
2051 li->type = (li->type == DO_MOVE) ? IDM_ARCHIVEM : IDM_ARCHIVE;
2052 }
2053 else
2054 li->type = (li->type == DO_MOVE) ? IDM_MOVE : IDM_COPY;
2055 break;
2056 }
2057 if (!li->list || !li->list[0])
2058 FreeListInfo(li);
2059 else
2060 WinSendMsg(hwndTree, UM_ACTION, MPFROMP(li), MPFROMLONG(action));
2061 }
2062 return 0;
2063 }
2064 break;
2065
2066 case WM_DESTROY:
2067 if (hwndMenu)
2068 WinDestroyWindow(hwndMenu);
2069 hwndMenu = (HWND) 0;
2070 break;
2071 }
2072 return PFNWPButton(hwnd, msg, mp1, mp2);
2073}
2074
2075VOID BuildDriveBarButtons(HWND hwndT)
2076{
2077 register ULONG x, y = 0;
2078 ULONG ulDriveNum, ulDriveMap, iconid;
2079 CHAR s[8];
2080 HENUM henum;
2081 HWND hwndB;
2082
2083 henum = WinBeginEnumWindows(hwndT);
2084
2085 while ((hwndB = WinGetNextWindow(henum)) != NULLHANDLE)
2086 WinDestroyWindow(hwndB);
2087
2088 WinEndEnumWindows(henum);
2089 if (fDrivebar) {
2090 DosError(FERR_DISABLEHARDERR);
2091 DosQCurDisk(&ulDriveNum, &ulDriveMap);
2092 for (x = 0; x < 26; x++) {
2093 if ((ulDriveMap & (1L << x)) && !(driveflags[x] & DRIVE_IGNORE)) {
2094 if (x > 1) {
2095 if (driveflags[x] & DRIVE_CDROM)
2096 iconid = CDROM_ICON;
2097 else
2098 iconid = (driveflags[x] & DRIVE_REMOVABLE) ?
2099 REMOVABLE_ICON :
2100 (driveflags[x] & DRIVE_VIRTUAL) ?
2101 VIRTUAL_ICON :
2102 (driveflags[x] & DRIVE_REMOTE) ?
2103 REMOTE_ICON :
2104 (driveflags[x] & DRIVE_RAMDISK) ?
2105 RAMDISK_ICON :
2106 (driveflags[x] & DRIVE_ZIPSTREAM) ?
2107 ZIPSTREAM_ICON :DRIVE_ICON;
2108 }
2109 else
2110 iconid = FLOPPY_ICON;
2111 sprintf(s, "#%lu", iconid);
2112 hwndB = WinCreateWindow(hwndT,
2113 WC_DRIVEBUTTONS,
2114 s,
2115 BS_NOPOINTERFOCUS | BS_BITMAP | BS_PUSHBUTTON,
2116 0,
2117 0,
2118 28,
2119 18,
2120 hwndT, HWND_TOP, y + IDM_DRIVEA, NULL, NULL);
2121 if (!hwndB)
2122 Win_Error2(hwndT, HWND_DESKTOP, pszSrcFile, __LINE__,
2123 IDS_WINCREATEWINDOW);
2124 else {
2125 WinSetWindowPos(hwndB, HWND_BOTTOM, 0, 0, 0, 0, SWP_ZORDER);
2126 sprintf(s, "%c:", (CHAR) x + 'A');
2127 hwndB = WinCreateWindow(hwndT,
2128 WC_STATIC,
2129 s,
2130 SS_TEXT | DT_LEFT | DT_VCENTER,
2131 0,
2132 0,
2133 10,
2134 18,
2135 hwndT,
2136 HWND_TOP, y + IDM_DRIVEATEXT, NULL, NULL);
2137 if (!hwndB)
2138 Win_Error2(hwndT, HWND_DESKTOP, pszSrcFile, __LINE__,
2139 IDS_WINCREATEWINDOW);
2140 else {
2141 SetPresParams(hwndB,
2142 &RGBGREY,
2143 &RGBBLACK, &RGBGREY, GetPString(IDS_6HELVTEXT));
2144 WinSetWindowPos(hwndB, HWND_BOTTOM, 0, 0, 0, 0, SWP_ZORDER);
2145 }
2146 y++;
2147 }
2148 }
2149 } // for
2150 } // if drivebar
2151 PostMsg(WinQueryWindow(hwndT, QW_PARENT),
2152 WM_UPDATEFRAME, MPFROMLONG(FCF_SIZEBORDER), MPVOID);
2153}
2154
2155VOID ResizeDrives(HWND hwndT, long xwidth)
2156{
2157 register ULONG ctrlxpos = 2, ctrlypos = 0, ctrlxsize;
2158 HENUM henum;
2159 HWND hwndB;
2160 RECTL rcl;
2161
2162 DriveLines = 0;
2163 if (!fDrivebar)
2164 return;
2165 if (!xwidth) {
2166 WinQueryWindowRect(hwndT, &rcl);
2167 xwidth = rcl.xRight - ((WinQuerySysValue(HWND_DESKTOP,
2168 SV_CYSIZEBORDER) * 2) + 2);
2169 }
2170 henum = WinBeginEnumWindows(hwndT);
2171 while ((hwndB = WinGetNextWindow(henum)) != NULLHANDLE) {
2172 if (WinQueryWindowUShort(hwndB, QWS_ID) > IDM_DRIVEA + 27)
2173 ctrlxsize = 10;
2174 else
2175 ctrlxsize = 28;
2176 WinSetWindowPos(hwndB,
2177 HWND_TOP,
2178 ctrlxpos, ctrlypos, ctrlxsize, 18, SWP_MOVE | SWP_SHOW);
2179 ctrlxpos += (ctrlxsize + 2);
2180 if (ctrlxsize == 10) {
2181 if (ctrlxpos + (42 + ((fShowTarget && DriveLines == 0) ?
2182 256 : 0)) > xwidth) {
2183 ctrlxpos = 2;
2184 ctrlypos += 18;
2185 DriveLines++;
2186 }
2187 }
2188 }
2189 if (ctrlxpos == 2 && DriveLines)
2190 DriveLines--;
2191}
2192
2193MRESULT EXPENTRY StatusProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
2194{
2195 static HWND hwndE = (HWND) 0, hwndB = (HWND) 0;
2196 static CHAR lastcmd[1024] = "";
2197
2198 switch (msg) {
2199 case WM_CREATE:
2200 {
2201 MRESULT mr = PFNWPStatic(hwnd, msg, mp1, mp2);
2202
2203 SetPresParams(hwnd,
2204 &RGBGREY,
2205 &RGBBLACK, &RGBGREY, GetPString(IDS_8HELVBOLDTEXT));
2206 return mr;
2207 }
2208
2209 case WM_PRESPARAMCHANGED:
2210 if (fRunning) {
2211
2212 ULONG AttrFound, AttrValue[64], cbRetLen;
2213
2214 cbRetLen = WinQueryPresParam(hwnd,
2215 (ULONG) mp1,
2216 0,
2217 &AttrFound,
2218 (ULONG) sizeof(AttrValue), &AttrValue, 0);
2219 if (cbRetLen) {
2220 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
2221 WM_UPDATEFRAME, MPFROMLONG(FCF_SIZEBORDER), MPVOID);
2222 }
2223 }
2224 break;
2225
2226 case WM_CONTEXTMENU:
2227 PostMsg(hwndMain, UM_CONTEXTMENU, MPVOID, MPVOID);
2228 return MRFROMSHORT(TRUE);
2229
2230 case WM_BEGINDRAG:
2231 if (hwndTree) {
2232
2233 SWP swp;
2234 ULONG fl = SWP_ACTIVATE | SWP_SHOW | SWP_ZORDER;
2235
2236 WinQueryWindowPos(hwndTree, &swp);
2237 if (!(swp.fl & SWP_MAXIMIZE))
2238 fl |= SWP_RESTORE;
2239 WinSetWindowPos(hwndTree, HWND_TOP, 0, 0, 0, 0, fl);
2240 }
2241 break;
2242
2243 case UM_SETUP:
2244 if (mp1)
2245 strcpy(lastcmd, (CHAR *)mp1);
2246 return 0;
2247
2248 case UM_RESCAN:
2249 if (hwndE && WinIsWindow(WinQueryAnchorBlock(hwnd), hwndE))
2250 WinDestroyWindow(hwndE);
2251 if (hwndB && WinIsWindow(WinQueryAnchorBlock(hwnd), hwndB))
2252 WinDestroyWindow(hwndB);
2253 hwndE = hwndB = (HWND) 0;
2254 return 0;
2255
2256 case WM_COMMAND:
2257 switch (SHORT1FROMMP(mp1)) {
2258 case COMMAND_BUTTON:
2259 PostMsg(hwndE, msg, mp1, mp2);
2260 break;
2261 }
2262 return 0;
2263
2264 case WM_MOUSEMOVE:
2265 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
2266 {
2267 USHORT id = WinQueryWindowUShort(hwnd, QWS_ID);
2268 char *s = NULL;
2269
2270 if (fOtherHelp) {
2271 if ((!hwndBubble || WinQueryWindowULong(hwndBubble, QWL_USER) != hwnd)
2272 && !WinQueryCapture(HWND_DESKTOP)) {
2273 switch (id) {
2274 case IDM_ATTRS:
2275 if (WinQueryWindowTextLength(hwnd))
2276 s = GetPString(IDS_ATTRSBUTTONHELP);
2277 break;
2278 case IDM_INFO:
2279 if (WinQueryWindowTextLength(hwnd))
2280 s = GetPString(IDS_INFOBUTTONHELP);
2281 break;
2282 case IDM_RENAME:
2283 if (WinQueryWindowTextLength(hwnd))
2284 s = GetPString(IDS_NAMEBUTTONHELP);
2285 break;
2286 case MAIN_STATUS2:
2287 if (!hwndE)
2288 s = GetPString(IDS_STATUS2HELP);
2289 break;
2290 default:
2291 break;
2292 }
2293 if (s)
2294 MakeBubble(hwnd, FALSE, s);
2295 else if (hwndBubble)
2296 WinDestroyWindow(hwndBubble);
2297 }
2298 }
2299 switch (id) {
2300 case IDM_ATTRS:
2301 case IDM_INFO:
2302 case IDM_RENAME:
2303 case MAIN_STATUS2:
2304 return CommonTextProc(hwnd, msg, mp1, mp2);
2305 default:
2306 break;
2307 }
2308 }
2309 break;
2310
2311 case WM_BUTTON2DOWN:
2312 case WM_BUTTON2UP:
2313 case UM_FOCUSME:
2314 return CommonTextButton(hwnd, msg, mp1, mp2);
2315
2316 case WM_BUTTON1DOWN:
2317 case WM_BUTTON1UP:
2318 case WM_BUTTON3DOWN:
2319 case WM_BUTTON3UP:
2320 {
2321 USHORT id;
2322
2323 id = WinQueryWindowUShort(hwnd, QWS_ID);
2324 switch (id) {
2325 case IDM_ATTRS:
2326 case IDM_INFO:
2327 case IDM_RENAME:
2328 case MAIN_STATUS2:
2329 return CommonTextButton(hwnd, msg, mp1, mp2);
2330 default:
2331 PostMsg(hwnd, UM_FOCUSME, MPVOID, MPVOID);
2332 break;
2333 }
2334 }
2335 break;
2336
2337 case WM_SETFOCUS:
2338 if (mp2) {
2339
2340 USHORT id;
2341
2342 id = WinQueryWindowUShort(hwnd, QWS_ID);
2343 if (id == MAIN_STATUS2 && hwndE)
2344 WinSendMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
2345 else
2346 return CommonTextButton(hwnd, msg, mp1, mp2);
2347 }
2348 break;
2349
2350 case WM_BUTTON1CLICK:
2351 {
2352 USHORT id;
2353
2354 id = WinQueryWindowUShort(hwnd, QWS_ID);
2355 if (id == MAIN_STATUS) {
2356 if (SHORT2FROMMP(mp2) & KC_CTRL)
2357 PostMsg(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
2358 FID_CLIENT),
2359 WM_COMMAND, MPFROM2SHORT(IDM_WINDOWDLG, 0), MPVOID);
2360 else if (hwndTree)
2361 PostMsg(hwndTree, UM_TIMER, MPVOID, MPVOID);
2362 }
2363 }
2364 break;
2365
2366 case UM_CLICKED:
2367 case UM_CLICKED3:
2368 {
2369 USHORT id;
2370
2371 id = WinQueryWindowUShort(hwnd, QWS_ID);
2372 if (id == MAIN_STATUS2 && !hwndE) {
2373
2374 SWP swp;
2375 CHAR directory[CCHMAXPATH];
2376 PFNWP oldproce;
2377
2378 *directory = 0;
2379 TopWindowName(hwndMain, (HWND) 0, directory);
2380 WinQueryWindowPos(hwnd, &swp);
2381 hwndB = WinCreateWindow(hwnd,
2382 WC_BUTTON,
2383 "+",
2384 WS_VISIBLE | BS_PUSHBUTTON |
2385 BS_NOPOINTERFOCUS,
2386 swp.cx - swp.cy,
2387 0,
2388 swp.cy,
2389 swp.cy,
2390 hwnd, HWND_TOP, COMMAND_BUTTON, NULL, NULL);
2391 if (!hwndB)
2392 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
2393 hwndE = WinCreateWindow(hwnd,
2394 WC_ENTRYFIELD,
2395 NULL,
2396 WS_VISIBLE | ES_AUTOSCROLL,
2397 0,
2398 0,
2399 swp.cx - swp.cy,
2400 swp.cy,
2401 hwnd, HWND_TOP, COMMAND_LINE, NULL, NULL);
2402 if (!hwndE)
2403 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
2404 if (!hwndE || !hwndB) {
2405 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
2406 return 0;
2407 }
2408 WinSendMsg(hwndE, EM_SETTEXTLIMIT, MPFROM2SHORT(1024, 0), MPVOID);
2409 WinSetWindowText(hwndStatus, directory);
2410 if (*lastcmd)
2411 WinSetWindowText(hwndE, lastcmd);
2412 else
2413 WinSetWindowText(hwndE, GetPString(IDS_HELPCMDTEXT));
2414 oldproce = WinSubclassWindow(hwndE, (PFNWP) CommandLineProc);
2415 if (oldproce)
2416 WinSetWindowPtr(hwndE, QWL_USER, (PVOID) oldproce);
2417 PostMsg(hwndE, UM_FOCUSME, MPVOID, MPVOID);
2418 PostMsg(hwndE, EM_SETSEL, MPFROM2SHORT(0, 1024), MPVOID);
2419 return 0;
2420 }
2421 if (msg == UM_CLICKED3 || (SHORT2FROMMP(mp2) & KC_CTRL)) {
2422 switch (id) {
2423 case IDM_ATTRS:
2424 id = IDM_SORTSIZE;
2425 break;
2426 case IDM_INFO:
2427 id = IDM_SORTLWDATE;
2428 break;
2429 case IDM_RENAME:
2430 id = IDM_SORTFILENAME;
2431 break;
2432 }
2433 }
2434 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
2435 WM_COMMAND, MPFROM2SHORT(id, 0), MPVOID);
2436 }
2437 return 0;
2438
2439 case WM_PAINT:
2440 {
2441 USHORT id;
2442
2443 id = WinQueryWindowUShort(hwnd, QWS_ID);
2444 switch (id) {
2445 case IDM_ATTRS:
2446 case IDM_INFO:
2447 case IDM_RENAME:
2448 case MAIN_STATUS2:
2449 PaintRecessedWindow(hwnd, (HPS) 0, TRUE, FALSE);
2450 break;
2451 default:
2452 PaintRecessedWindow(hwnd, (HPS) 0, FALSE, TRUE);
2453 break;
2454 }
2455 if (id == IDM_RENAME) {
2456
2457 HPS hps;
2458
2459 hps = WinBeginPaint(hwnd, (HPS) 0, NULL);
2460 if (hps) {
2461 PaintSTextWindow(hwnd, hps);
2462 WinEndPaint(hps);
2463 }
2464 return 0;
2465 }
2466 }
2467 break;
2468
2469 }
2470 return PFNWPStatic(hwnd, msg, mp1, mp2);
2471}
2472
2473MRESULT EXPENTRY ToolBackProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
2474{
2475 switch (msg) {
2476 case WM_CREATE:
2477 hwndToolback = hwnd;
2478 RestorePresParams(hwnd, "ToolBar");
2479 break;
2480
2481 case WM_MOUSEMOVE:
2482 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
2483 break;
2484
2485 case WM_CONTROLPOINTER:
2486 if (!fNoFinger && SHORT1FROMMP(mp1) < 25000)
2487 return MRFROMLONG(hptrFinger);
2488 break;
2489
2490 case WM_CHAR:
2491 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
2492 break;
2493
2494 case WM_COMMAND:
2495 case UM_COMMAND:
2496 return WinSendMsg(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
2497 FID_CLIENT), msg, mp1, mp2);
2498
2499 case WM_PAINT:
2500
2501 PaintRecessedWindow(hwnd, (HPS)0, TRUE, FALSE);
2502
2503 {
2504 HPS hps;
2505 RECTL rcl;
2506 ULONG lColor;
2507
2508 hps = WinBeginPaint(hwnd, (HPS)0, NULL);
2509 if (hps) {
2510 GpiCreateLogColorTable(hps, 0, LCOLF_RGB, 0, 0, NULL);
2511 WinQueryPresParam(hwnd, PP_BACKGROUNDCOLOR, 0, NULL,
2512 sizeof(lColor), &lColor, 0);
2513 WinQueryWindowRect(hwnd, &rcl);
2514 WinFillRect(hps, &rcl, lColor);
2515 WinEndPaint(hps);
2516 }
2517
2518 }
2519 break;
2520
2521 case WM_PRESPARAMCHANGED:
2522 PresParamChanged(hwnd, "ToolBar", mp1, mp2);
2523 WinInvalidateRect(hwnd, NULL, TRUE);
2524 break;
2525
2526 case UM_SETUP:
2527 {
2528 USHORT id;
2529 TOOL *tool;
2530
2531 id = SHORT1FROMMP(mp1);
2532 tool = find_tool(id);
2533 if (tool) {
2534 del_tool(tool);
2535 WinShowWindow(WinWindowFromID(hwnd, id), FALSE);
2536 if (fToolTitles)
2537 WinShowWindow(WinWindowFromID(hwnd, id + 25000), FALSE);
2538 ResizeTools(hwnd);
2539 }
2540 }
2541 return 0;
2542
2543 case WM_CHORD:
2544 {
2545 USHORT id;
2546
2547 id = (USHORT) WinDlgBox(HWND_DESKTOP,
2548 hwnd,
2549 AddToolProc,
2550 FM3ModHandle, ADDBTN_FRAME, MPVOID);
2551 if (id && id != (USHORT) - 1)
2552 WinSendMsg(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
2553 FID_CLIENT),
2554 WM_COMMAND,
2555 MPFROM2SHORT(IDM_CREATETOOL, 0), MPFROM2SHORT(id, 0));
2556 }
2557 break;
2558
2559 case WM_CONTEXTMENU:
2560 if (WinDlgBox(HWND_DESKTOP,
2561 hwnd, ToolIODlgProc, FM3ModHandle, SVBTN_FRAME, MPVOID))
2562 BuildTools(hwnd, TRUE);
2563 return MRFROMSHORT(TRUE);
2564
2565 case WM_CLOSE:
2566 WinDestroyWindow(hwnd);
2567 return 0;
2568
2569 case WM_DESTROY:
2570 break;
2571 }
2572 return WinDefWindowProc(hwnd, msg, mp1, mp2);
2573}
2574
2575static VOID AdjustSizeOfClient(PSWP pswp, PRECTL prectl)
2576{
2577 SWP swp;
2578 RECTL rectl;
2579
2580 if (fFreeTree)
2581 return;
2582 if (pswp) {
2583 if (WinQueryWindowPos(hwndTree, &swp) &&
2584 !(swp.fl & (SWP_MINIMIZE | SWP_HIDE | SWP_MAXIMIZE))) {
2585 pswp->x = swp.cx;
2586 pswp->cx -= swp.cx;
2587 }
2588 }
2589 if (prectl) {
2590 if (WinQueryWindowPos(hwndTree, &swp) &&
2591 !(swp.fl & (SWP_MINIMIZE | SWP_HIDE | SWP_MAXIMIZE)) &&
2592 WinQueryWindowRect(hwndTree, &rectl)) {
2593 prectl->xLeft = rectl.xRight;
2594 prectl->xRight -= rectl.xRight;
2595 }
2596 }
2597}
2598
2599VOID FillClient(HWND hwndClient, PSWP pswp, PRECTL prectl, BOOL avoidtree)
2600{
2601 ULONG adjust;
2602
2603 adjust = WinQuerySysValue(HWND_DESKTOP, SV_CYICON);
2604 if (pswp)
2605 WinQueryWindowPos(hwndClient, pswp);
2606 if (prectl)
2607 WinQueryWindowRect(hwndClient, prectl);
2608 if (avoidtree && !fFreeTree)
2609 AdjustSizeOfClient(pswp, prectl);
2610 if (prectl)
2611 prectl->yBottom += adjust;
2612 if (pswp) {
2613 if (!avoidtree || fFreeTree)
2614 pswp->x = 0;
2615 pswp->y = adjust;
2616 if (pswp->cy >= adjust)
2617 pswp->cy -= adjust;
2618 else
2619 pswp->cy = 0;
2620 }
2621}
2622
2623static VOID MoveChildrenAwayFromTree(HWND hwndClient)
2624{
2625 SWP swpC, swpT, swp;
2626 USHORT id;
2627 HWND hwndChild;
2628 HENUM henum;
2629
2630 if (fFreeTree)
2631 return;
2632 WinQueryWindowPos(hwndClient, &swpC);
2633 if (swpC.fl & (SWP_MINIMIZE | SWP_HIDE))
2634 return;
2635 WinQueryWindowPos(hwndTree, &swpT);
2636 henum = WinBeginEnumWindows(hwndClient);
2637 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
2638 id = WinQueryWindowUShort(hwndChild, QWS_ID);
2639 if (!id || id == TREE_FRAME)
2640 continue;
2641 WinQueryWindowPos(hwndChild, &swp);
2642 if (!(swp.fl & (SWP_MAXIMIZE | SWP_HIDE | SWP_MINIMIZE))) {
2643 if (swp.x < swpT.cx) {
2644 swp.x = swpT.cx;
2645 if (swp.x + swp.cx > swpC.cx)
2646 swp.cx = swpC.cx - swp.x;
2647 if (swp.cx > 24)
2648 WinSetWindowPos(hwndChild, HWND_TOP, swp.x, swp.y, swp.cx, swp.cy,
2649 SWP_SIZE | SWP_MOVE | SWP_SHOW);
2650 }
2651 }
2652 }
2653 WinEndEnumWindows(henum);
2654}
2655
2656static VOID ArrangeIcons(HWND hwndClient)
2657{
2658 HENUM henum;
2659 HWND hwndChild;
2660 SWP swp;
2661
2662 henum = WinBeginEnumWindows(hwndClient);
2663 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
2664 WinQueryWindowPos(hwndChild, &swp);
2665 if (swp.fl & (SWP_MINIMIZE | SWP_HIDE)) {
2666 WinSetWindowUShort(hwndChild, QWS_XMINIMIZE, (USHORT) - 1);
2667 WinSetWindowUShort(hwndChild, QWS_YMINIMIZE, (USHORT) - 1);
2668 WinSetWindowPos(hwndChild, HWND_TOP, 0, 0, 0, 0,
2669 SWP_MOVE | SWP_SHOW | SWP_FOCUSDEACTIVATE);
2670 }
2671 }
2672 WinEndEnumWindows(henum);
2673}
2674
2675static VOID NextChild(HWND hwndClient, BOOL previous)
2676{
2677 HENUM henum;
2678 HWND hwndActive, hwndNext, hwndPrev = (HWND) 0;
2679 BOOL next = FALSE, once = FALSE;
2680
2681 previous = !previous;
2682
2683 hwndActive = WinQueryActiveWindow(hwndClient);
2684 if (!hwndActive)
2685 next = TRUE;
2686 henum = WinBeginEnumWindows(hwndClient);
2687 for (;;) {
2688 hwndNext = WinGetNextWindow(henum);
2689 if (hwndNext) {
2690 if (!WinQueryWindowUShort(hwndNext, QWS_ID))
2691 continue;
2692 if (next)
2693 break;
2694 if (hwndNext == hwndActive) {
2695 if (!previous && hwndPrev) {
2696 hwndNext = hwndPrev;
2697 break;
2698 }
2699 else if (previous)
2700 next = TRUE;
2701 }
2702 hwndPrev = hwndNext;
2703 }
2704 else {
2705 if ((!next && previous) || once)
2706 break;
2707 else if (!previous) {
2708 hwndNext = hwndPrev;
2709 break;
2710 }
2711 else
2712 once = next = TRUE;
2713 }
2714 }
2715 WinEndEnumWindows(henum);
2716
2717 if (hwndNext && hwndNext != hwndActive) {
2718 WinSetWindowPos(hwndNext, HWND_TOP, 0, 0, 0, 0,
2719 SWP_ZORDER | SWP_ACTIVATE);
2720 WinSetWindowPos(hwndActive, ((previous) ? HWND_BOTTOM : hwndNext), 0, 0,
2721 0, 0, SWP_ZORDER);
2722 }
2723}
2724
2725BOOL CloseChildren(HWND hwndClient)
2726{
2727 HENUM henum;
2728 HWND hwndChild;
2729 BOOL ret = FALSE;
2730
2731 fNoTileUpdate = TRUE;
2732 henum = WinBeginEnumWindows(hwndClient);
2733 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
2734 if (hwndChild != hwndTree) {
2735 WinSendMsg(WinWindowFromID(hwndChild, FID_CLIENT),
2736 WM_SAVEAPPLICATION, MPVOID, MPVOID);
2737 if (WinSendMsg(WinWindowFromID(hwndChild, FID_CLIENT),
2738 WM_CLOSE, MPVOID, MPVOID)) {
2739 ret = TRUE;
2740 break;
2741 }
2742 }
2743 }
2744 WinEndEnumWindows(henum);
2745 fNoTileUpdate = FALSE;
2746 return ret;
2747}
2748
2749BOOL CloseDirCnrChildren(HWND hwndClient)
2750{
2751 /* returns TRUE if a directory container window was told to close */
2752
2753 HENUM henum;
2754 HWND hwndChild, hwndDir, hwndTemp;
2755 BOOL ret = FALSE;
2756
2757 fNoTileUpdate = TRUE;
2758 henum = WinBeginEnumWindows(hwndClient);
2759 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
2760 if (hwndChild != hwndTree) {
2761 hwndTemp = WinWindowFromID(hwndChild, FID_CLIENT);
2762 if (hwndTemp) {
2763 hwndDir = WinWindowFromID(hwndTemp, DIR_CNR);
2764 if (hwndDir) {
2765 WinSendMsg(WinWindowFromID(hwndChild, FID_CLIENT),
2766 WM_CLOSE, MPVOID, MPVOID);
2767 ret = TRUE;
2768 }
2769 }
2770 }
2771 }
2772 WinEndEnumWindows(henum);
2773 fNoTileUpdate = FALSE;
2774 return ret;
2775}
2776
2777/** Save directory container state
2778 * @param hwndClient Client window handle
2779 * @param pszStateName State name to save, NULL to save global state
2780 * @returns Number of directory container windows that were saved or -1 if error
2781 * @seealso RestoreDirCnrState
2782 */
2783
2784#define STATE_NAME_MAX_BYTES 256
2785
2786INT SaveDirCnrState(HWND hwndClient, PSZ pszStateName)
2787{
2788 HENUM henum;
2789 HWND hwndChild, hwndDir, hwndC;
2790 ULONG numsaves = 0, flWindowAttr;
2791 CHAR szPrefix[STATE_NAME_MAX_BYTES + 1];
2792 CHAR szKey[STATE_NAME_MAX_BYTES + 80];
2793 CHAR szDir[CCHMAXPATH];
2794 SWP swp;
2795 INT nSaved = 0;
2796 DIRCNRDATA *dcd;
2797 BOOL fIsShutDownState;
2798
2799 if (!pszStateName || !*pszStateName) {
2800 Runtime_Error(pszSrcFile, __LINE__, "no data");
2801 return -1;
2802 }
2803 if (strlen(pszStateName) > sizeof(szPrefix) - 2) {
2804 Runtime_Error(pszSrcFile, __LINE__, "SaveDirCnrState");
2805 return -1;
2806 }
2807
2808 fIsShutDownState = strcmp(pszStateName, GetPString(IDS_SHUTDOWNSTATE)) == 0;
2809 sprintf(szPrefix, "%s.", pszStateName);
2810
2811 henum = WinBeginEnumWindows(hwndClient);
2812 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
2813 if (hwndChild != hwndTree) {
2814 hwndC = WinWindowFromID(hwndChild, FID_CLIENT);
2815 if (hwndC) {
2816 hwndDir = WinWindowFromID(hwndC, DIR_CNR);
2817 if (hwndDir) {
2818 WinQueryWindowPos(hwndChild, &swp);
2819 *szDir = 0;
2820 WinSendMsg(hwndC, UM_CONTAINERDIR, MPFROMP(szDir), MPVOID);
2821 if (*szDir) {
2822 // If saving shutdown state skip no prescan drives
2823 if (fIsShutDownState &&
2824 driveflags[toupper(*szDir) - 'A'] & DRIVE_NOPRESCAN) {
2825 continue;
2826 }
2827 sprintf(szKey, "%sDirCnrPos.%lu", szPrefix, numsaves);
2828 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & swp,
2829 sizeof(SWP));
2830 dcd =
2831 WinQueryWindowPtr(WinWindowFromID(hwndC, DIR_CNR), QWL_USER);
2832 if (dcd) {
2833 sprintf(szKey, "%sDirCnrSort.%lu", szPrefix, numsaves);
2834 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & dcd->sortFlags,
2835 sizeof(INT));
2836 sprintf(szKey, "%sDirCnrFilter.%lu", szPrefix, numsaves);
2837 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & dcd->mask,
2838 sizeof(MASK));
2839 sprintf(szKey, "%sDirCnrView.%lu", szPrefix, numsaves);
2840 flWindowAttr = dcd->flWindowAttr;
2841 if (!fLeaveTree && (flWindowAttr & CV_TREE)) {
2842 flWindowAttr &= (~(CV_TREE | CV_ICON | CV_DETAIL | CV_TEXT));
2843 if (dcd->lastattr) {
2844 if (dcd->lastattr & CV_TEXT)
2845 flWindowAttr |= CV_TEXT;
2846 else if (dcd->lastattr & CV_DETAIL)
2847 flWindowAttr |= CV_DETAIL;
2848 else if (dcd->lastattr & CV_ICON)
2849 flWindowAttr |= CV_ICON;
2850 else
2851 flWindowAttr |= CV_NAME;
2852 }
2853 else
2854 flWindowAttr |= CV_NAME;
2855 }
2856 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & flWindowAttr,
2857 sizeof(ULONG));
2858 sprintf(szKey, "%sDirCnr.%lu.DetailsLongname", szPrefix, numsaves);
2859 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & dcd->detailslongname,
2860 sizeof(BOOL));
2861 sprintf(szKey, "%sDirCnr.%lu.DetailsSubject", szPrefix, numsaves);
2862 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & dcd->detailssubject,
2863 sizeof(BOOL));
2864 sprintf(szKey, "%sDirCnr.%lu.DetailsSize", szPrefix, numsaves);
2865 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & dcd->detailssize,
2866 sizeof(BOOL));
2867 sprintf(szKey, "%sDirCnr.%lu.DetailsEA", szPrefix, numsaves);
2868 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & dcd->detailsea,
2869 sizeof(BOOL));
2870 sprintf(szKey, "%sDirCnr.%lu.DetailsAttr", szPrefix, numsaves);
2871 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & dcd->detailsattr,
2872 sizeof(BOOL));
2873 sprintf(szKey, "%sDirCnr.%lu.DetailsIcon", szPrefix, numsaves);
2874 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & dcd->detailsicon,
2875 sizeof(BOOL));
2876 sprintf(szKey, "%sDirCnr.%lu.DetailsLWDate", szPrefix, numsaves);
2877 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & dcd->detailslwdate,
2878 sizeof(BOOL));
2879 sprintf(szKey, "%sDirCnr.%lu.DetailsLWTime", szPrefix, numsaves);
2880 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & dcd->detailslwtime,
2881 sizeof(BOOL));
2882 sprintf(szKey, "%sDirCnr.%lu.DetailsLADate", szPrefix, numsaves);
2883 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & dcd->detailsladate,
2884 sizeof(BOOL));
2885 sprintf(szKey, "%sDirCnr.%lu.DetailsLATime", szPrefix, numsaves);
2886 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & dcd->detailslatime,
2887 sizeof(BOOL));
2888 sprintf(szKey, "%sDirCnr.%lu.DetailsCRDate", szPrefix, numsaves);
2889 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & dcd->detailscrdate,
2890 sizeof(BOOL));
2891 sprintf(szKey, "%sDirCnr.%lu.DetailsCRTime", szPrefix, numsaves);
2892 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & dcd->detailscrtime,
2893 sizeof(BOOL));
2894 sprintf(szKey, "%sDirCnr.%lu", szPrefix, numsaves);
2895 SavePresParams(hwndDir, szKey);
2896 }
2897 sprintf(szKey, "%sDirCnrDir.%lu", szPrefix, numsaves++);
2898 PrfWriteProfileString(fmprof, FM3Str, szKey, szDir);
2899 nSaved++;
2900 }
2901 }
2902 }
2903 }
2904 } // while
2905 WinEndEnumWindows(henum);
2906
2907 if (nSaved) {
2908 if (WinQueryWindowPos(hwndTree, &swp)) {
2909 sprintf(szKey, "%sLastTreePos", szPrefix);
2910 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & swp, sizeof(SWP));
2911 }
2912 sprintf(szKey, "%sNumDirsLastTime", szPrefix);
2913 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & numsaves, sizeof(ULONG));
2914 WinQueryWindowPos(WinQueryWindow(hwndClient, QW_PARENT), &swp);
2915 sprintf(szKey, "%sMySizeLastTime", szPrefix);
2916 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & swp, sizeof(SWP));
2917 }
2918 else if (fIsShutDownState) {
2919 sprintf(szKey, "%sNumDirsLastTime", szPrefix);
2920 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & numsaves, sizeof(ULONG));
2921 }
2922
2923 return nSaved;
2924}
2925
2926static VOID TransformSwp(PSWP pswp, double xtrans, double ytrans)
2927{
2928 SWP swp;
2929 HWND hwnd;
2930
2931 if ((LONG) pswp->x < 0L) {
2932 pswp->cx -= abs(pswp->x);
2933 pswp->x = 0;
2934 }
2935 if ((LONG) pswp->y < 0L) {
2936 pswp->cy -= abs(pswp->y);
2937 pswp->y = 0;
2938 }
2939 pswp->x = (LONG) (((double)pswp->x * 100.0) / xtrans);
2940 pswp->cx = (LONG) (((double)pswp->cx * 100.0) / xtrans);
2941 pswp->y = (LONG) (((double)pswp->y * 100.0) / ytrans);
2942 pswp->cy = (LONG) (((double)pswp->cy * 100.0) / ytrans);
2943 if (pswp->hwnd) {
2944 hwnd = WinQueryWindow(pswp->hwnd, QW_PARENT);
2945 if (hwnd) {
2946 if (WinQueryWindowPos(hwnd, &swp)) {
2947 if (pswp->x > swp.cx)
2948 pswp->x = (swp.cx > 24) ? swp.cx - 24 : swp.cx;
2949 if (pswp->y > swp.cy)
2950 pswp->y = (swp.cy > 24) ? swp.cy - 24 : swp.cy;
2951 if (pswp->x + pswp->cx > swp.cx)
2952 pswp->cx = swp.cx - pswp->x;
2953 if (pswp->y + pswp->cy > swp.cy)
2954 pswp->cy = swp.cy - pswp->y;
2955 }
2956 }
2957 }
2958}
2959
2960/** Restore directory container state
2961 * @param hwndClient Client window handle
2962 * @param pszStateName State name to restore, NULL to restore global state
2963 * @param noview request view state restore bypass
2964 * @returns TRUE if one or more directory containers were opened
2965 * @seealso SaveDirCnrState
2966 */
2967
2968static BOOL RestoreDirCnrState(HWND hwndClient, PSZ pszStateName, BOOL noview)
2969{
2970 CHAR szKey[STATE_NAME_MAX_BYTES + 80];
2971 CHAR szDir[CCHMAXPATH];
2972 CHAR szPrefix[STATE_NAME_MAX_BYTES + 2];
2973 HWND hwndDir, hwndC, hwndPPSave = NULLHANDLE;
2974 SWP swp, swpO, swpN;
2975 ULONG size, numsaves = 0, x;
2976 double xtrans, ytrans;
2977 BOOL fRestored = FALSE;
2978 DIRCNRDATA localdcd, *dcd;
2979 BOOL fIsShutDownState;
2980 BOOL fDeleteState;
2981
2982 if (!pszStateName || !*pszStateName) {
2983 Runtime_Error(pszSrcFile, __LINE__, "no name");
2984 return fRestored;
2985 }
2986 if (strlen(pszStateName) > sizeof(szPrefix) - 2) {
2987 Runtime_Error(pszSrcFile, __LINE__, "name too long");
2988 return fRestored;
2989 }
2990
2991 sprintf(szPrefix, "%s.", pszStateName);
2992
2993 // If restoring shutdown state bypass no-prescan drives
2994 fIsShutDownState = strcmp(pszStateName, GetPString(IDS_SHUTDOWNSTATE)) == 0;
2995 // Delete saved state if internally saved state
2996 fDeleteState = strcmp(pszStateName, GetPString(IDS_FM2TEMPTEXT)) == 0;
2997
2998 size = sizeof(SWP);
2999 sprintf(szKey, "%sMySizeLastTime", szPrefix);
3000 if (!PrfQueryProfileData(fmprof,
3001 FM3Str,
3002 szKey,
3003 (PVOID) & swpO,
3004 &size) ||
3005 size != sizeof(SWP) || !swp.cx || !swp.cy)
3006 {
3007 WinQueryWindowPos(WinQueryWindow(hwndClient, QW_PARENT), &swpO);
3008 }
3009 // If restoring saved shutdown state or internally saved state, forget info
3010 if (fDeleteState)
3011 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3012 WinQueryWindowPos(WinQueryWindow(hwndClient, QW_PARENT), &swpN);
3013 if (swpN.fl & (SWP_MINIMIZE | SWP_HIDE))
3014 swpN = swpO;
3015 xtrans = ((double)swpO.cx * 100.0) / (double)swpN.cx;
3016 ytrans = ((double)swpO.cy * 100.0) / (double)swpN.cy;
3017 size = sizeof(SWP);
3018 sprintf(szKey, "%sLastTreePos", szPrefix);
3019 if (PrfQueryProfileData(fmprof, FM3Str, szKey, (PVOID) & swp, &size)) {
3020 if (fDeleteState)
3021 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3022 swp.hwnd = hwndTree;
3023 TransformSwp(&swp, xtrans, ytrans);
3024 if (!fFreeTree) {
3025 WinQueryWindowPos(hwndClient, &swpN);
3026 swp.x = 0;
3027 swp.y = (swpN.cy - swp.cy);
3028 }
3029 if (!(swp.fl & (SWP_MINIMIZE | SWP_HIDE))) {
3030 swp.fl &= (~SWP_ACTIVATE);
3031 WinSetWindowPos(hwndTree,
3032 HWND_TOP,
3033 swp.x,
3034 swp.y,
3035 swp.cx,
3036 swp.cy,
3037 swp.fl | SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_ZORDER);
3038 }
3039 else {
3040 WinSetWindowPos(hwndTree,
3041 HWND_TOP, 0, 0, 0, 0, SWP_MINIMIZE | SWP_SHOW);
3042 WinSetWindowUShort(hwndTree, QWS_XRESTORE, (USHORT) swp.x);
3043 WinSetWindowUShort(hwndTree, QWS_CXRESTORE, (USHORT) swp.cx);
3044 WinSetWindowUShort(hwndTree, QWS_YRESTORE, (USHORT) swp.y);
3045 WinSetWindowUShort(hwndTree, QWS_CYRESTORE, (USHORT) swp.cy);
3046 }
3047 }
3048 size = sizeof(ULONG);
3049 sprintf(szKey, "%sNumDirsLastTime", szPrefix);
3050 if (PrfQueryProfileData(fmprof,
3051 FM3Str, szKey, (PVOID) & numsaves, &size) && numsaves) {
3052 if (fDeleteState)
3053 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3054 for (x = 0; x < numsaves; x++) {
3055 sprintf(szKey, "%sDirCnrPos.%lu", szPrefix, x);
3056 size = sizeof(SWP);
3057 if (PrfQueryProfileData(fmprof, FM3Str, szKey, (PVOID) &swp, &size)) {
3058 if (fDeleteState)
3059 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3060 sprintf(szKey, "%sDirCnrDir.%lu", szPrefix, x);
3061 size = sizeof(szDir);
3062 if (PrfQueryProfileData(fmprof, FM3Str, szKey, (PVOID) szDir, &size)) {
3063 // If restoring shutdown state and drive marked no prescan
3064 // bypass window restore
3065 if (fIsShutDownState &&
3066 driveflags[toupper(*szDir) - 'A'] & DRIVE_NOPRESCAN) {
3067 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3068 continue;
3069 }
3070 if (fDeleteState)
3071 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3072 localdcd.detailslongname = detailslongname; // Set default
3073 size = sizeof(BOOL);
3074 sprintf(szKey, "%sDirCnr.%lu.DetailsLongname", szPrefix, x);
3075 if (PrfQueryProfileData(fmprof,
3076 FM3Str,
3077 szKey,
3078 (PVOID)&localdcd.detailslongname,
3079 &size) &&
3080 size == sizeof(BOOL))
3081 {
3082 if (fDeleteState)
3083 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3084 }
3085 localdcd.detailssubject = detailssubject; // Set default
3086 size = sizeof(BOOL);
3087 sprintf(szKey, "%sDirCnr.%lu.DetailsSubject", szPrefix, x);
3088 if (PrfQueryProfileData(fmprof,
3089 FM3Str,
3090 szKey,
3091 (PVOID)&localdcd.detailssubject,
3092 &size) &&
3093 size == sizeof(BOOL))
3094 {
3095 if (fDeleteState)
3096 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3097 }
3098 localdcd.detailsea = detailsea; // Set default
3099 size = sizeof(BOOL);
3100 sprintf(szKey, "%sDirCnr.%lu.DetailsEA", szPrefix, x);
3101 if (PrfQueryProfileData(fmprof,
3102 FM3Str,
3103 szKey,
3104 (PVOID) & localdcd.detailsea,
3105 &size) &&
3106 size == sizeof(BOOL))
3107 {
3108 if (fDeleteState)
3109 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3110 }
3111 localdcd.detailssize = detailssize; // Set default
3112 size = sizeof(BOOL);
3113 sprintf(szKey, "%sDirCnr.%lu.DetailsSize", szPrefix, x);
3114 if (PrfQueryProfileData(fmprof,
3115 FM3Str,
3116 szKey,
3117 (PVOID) & localdcd.detailssize,
3118 &size) &&
3119 size == sizeof(BOOL))
3120 {
3121 if (fDeleteState)
3122 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3123 }
3124 localdcd.detailsicon = detailsicon; // Set default
3125 size = sizeof(BOOL);
3126 sprintf(szKey, "%sDirCnr.%lu.DetailsIcon", szPrefix, x);
3127 if (PrfQueryProfileData(fmprof,
3128 FM3Str,
3129 szKey,
3130 (PVOID) & localdcd.detailsicon,
3131 &size) &&
3132 size == sizeof(BOOL))
3133 {
3134 if (fDeleteState)
3135 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3136 }
3137 localdcd.detailsattr = detailsattr; // Set default
3138 size = sizeof(BOOL);
3139 sprintf(szKey, "%sDirCnr.%lu.DetailsAttr", szPrefix, x);
3140 if (PrfQueryProfileData(fmprof,
3141 FM3Str,
3142 szKey,
3143 (PVOID)&localdcd.detailsattr,
3144 &size) &&
3145 size == sizeof(BOOL))
3146 {
3147 if (fDeleteState)
3148 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3149 }
3150 localdcd.detailscrdate = detailscrdate; // Set default
3151 size = sizeof(BOOL);
3152 sprintf(szKey, "%sDirCnr.%lu.DetailsCRDate", szPrefix, x);
3153 if (PrfQueryProfileData(fmprof,
3154 FM3Str,
3155 szKey,
3156 (PVOID) & localdcd.detailscrdate,
3157 &size) && size == sizeof(BOOL))
3158 {
3159 if (fDeleteState)
3160 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3161 }
3162 localdcd.detailscrtime = detailscrtime; // Set default
3163 size = sizeof(BOOL);
3164 sprintf(szKey, "%sDirCnr.%lu.DetailsCRTime", szPrefix, x);
3165 if (PrfQueryProfileData(fmprof,
3166 FM3Str,
3167 szKey,
3168 (PVOID)&localdcd.detailscrtime,
3169 &size) &&
3170 size == sizeof(BOOL))
3171 {
3172 if (fDeleteState)
3173 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3174 }
3175 localdcd.detailslwdate = detailslwdate; // Set default
3176 size = sizeof(BOOL);
3177 sprintf(szKey, "%sDirCnr.%lu.DetailsLWDate", szPrefix, x);
3178 if (PrfQueryProfileData(fmprof,
3179 FM3Str,
3180 szKey,
3181 (PVOID) & localdcd.detailslwdate,
3182 &size) &&
3183 size == sizeof(BOOL))
3184 {
3185 if (fDeleteState)
3186 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3187 }
3188 localdcd.detailslwtime = detailslwtime; // Set default
3189 size = sizeof(BOOL);
3190 sprintf(szKey, "%sDirCnr.%lu.DetailsLWTime", szPrefix, x);
3191 if (PrfQueryProfileData(fmprof,
3192 FM3Str,
3193 szKey,
3194 (PVOID) & localdcd.detailslwtime,
3195 &size) &&
3196 size == sizeof(BOOL))
3197 {
3198 if (fDeleteState)
3199 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3200 }
3201 localdcd.detailsladate = detailsladate; // Set default
3202 size = sizeof(BOOL);
3203 sprintf(szKey, "%sDirCnr.%lu.DetailsLADate", szPrefix, x);
3204 if (PrfQueryProfileData(fmprof,
3205 FM3Str,
3206 szKey,
3207 (PVOID) & localdcd.detailsladate,
3208 &size) &&
3209 size == sizeof(BOOL))
3210 {
3211 if (fDeleteState)
3212 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3213 }
3214 localdcd.detailslatime = detailslatime; // Set default
3215 size = sizeof(BOOL);
3216 sprintf(szKey, "%sDirCnr.%lu.DetailsLATime", szPrefix, x);
3217 if (PrfQueryProfileData(fmprof,
3218 FM3Str,
3219 szKey,
3220 (PVOID) & localdcd.detailslatime,
3221 &size) &&
3222 size == sizeof(BOOL))
3223 {
3224 if (fDeleteState)
3225 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3226 }
3227 hwndDir = (HWND) WinSendMsg(hwndClient,
3228 UM_SETDIR,
3229 MPFROMP(szDir), MPFROMLONG(1));
3230 if (hwndDir) {
3231 hwndC = WinWindowFromID(hwndDir, FID_CLIENT);
3232 if (hwndC) {
3233 HWND hwndCnr = WinWindowFromID(hwndC, DIR_CNR);
3234 if (!hwndPPSave) {
3235 hwndPPSave = WinCreateWindow(hwndCnr, // Create a window (used to save default presparams)
3236 WC_CONTAINER,
3237 NULL,
3238 CCS_AUTOPOSITION | CCS_MINIICONS |
3239 CCS_MINIRECORDCORE | ulCnrType |
3240 WS_VISIBLE,
3241 0,
3242 0,
3243 0,
3244 0,
3245 hwndCnr,
3246 HWND_TOP, (ULONG) -1, NULL, NULL);
3247 CopyPresParams(hwndPPSave, hwndC);
3248 RestorePresParams(hwndPPSave, "DirCnr");
3249 }
3250 sprintf(szKey, "%sDirCnr.%lu", szPrefix, x);
3251 RestorePresParams(hwndCnr, szKey);
3252 dcd = WinQueryWindowPtr(hwndCnr, QWL_USER);
3253 if (dcd) {
3254 dcd->detailslongname = localdcd.detailslongname;
3255 dcd->detailssubject = localdcd.detailssubject ;
3256 dcd->detailsattr = localdcd.detailsattr ;
3257 dcd->detailsea = localdcd.detailsea ;
3258 dcd->detailssize = localdcd.detailssize ;
3259 dcd->detailsicon = localdcd.detailsicon ;
3260 dcd->detailscrdate = localdcd.detailscrdate ;
3261 dcd->detailscrtime = localdcd.detailscrtime ;
3262 dcd->detailsladate = localdcd.detailsladate ;
3263 dcd->detailslatime = localdcd.detailslatime ;
3264 dcd->detailslwdate = localdcd.detailslwdate ;
3265 dcd->detailslwtime = localdcd.detailslwtime ;
3266 size = sizeof(INT);
3267 sprintf(szKey, "%sDirCnrSort.%lu", szPrefix, x);
3268 if (PrfQueryProfileData(fmprof,
3269 FM3Str,
3270 szKey,
3271 (PVOID) & dcd->sortFlags,
3272 &size) && size == sizeof(INT)) {
3273 if (!dcd->sortFlags)
3274 dcd->sortFlags = SORT_PATHNAME;
3275 }
3276 if (fDeleteState)
3277 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3278 size = sizeof(MASK);
3279 sprintf(szKey, "%sDirCnrFilter.%lu", szPrefix, x);
3280 if (PrfQueryProfileData(fmprof,
3281 FM3Str,
3282 szKey,
3283 (PVOID) & dcd->mask, &size) && size) {
3284 if (*dcd->mask.szMask)
3285 WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
3286 UM_FILTER, MPFROMP(dcd->mask.szMask), MPVOID);
3287 }
3288 *(dcd->mask.prompt) = 0;
3289 if (fDeleteState)
3290 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3291 size = sizeof(ULONG);
3292 sprintf(szKey, "%sDirCnrView.%lu", szPrefix, x);
3293 if (!noview) {
3294 if (PrfQueryProfileData(fmprof,
3295 FM3Str,
3296 szKey,
3297 (PVOID) & dcd->flWindowAttr,
3298 &size) && size == sizeof(ULONG)) {
3299
3300 CNRINFO cnri;
3301
3302 memset(&cnri, 0, sizeof(CNRINFO));
3303 cnri.cb = sizeof(CNRINFO);
3304 if (WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
3305 CM_QUERYCNRINFO,
3306 MPFROMP(&cnri),
3307 MPFROMLONG(sizeof(CNRINFO)))) {
3308 cnri.flWindowAttr = dcd->flWindowAttr;
3309 WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
3310 CM_SETCNRINFO,
3311 MPFROMP(&cnri),
3312 MPFROMLONG(CMA_FLWINDOWATTR));
3313 }
3314 }
3315 }
3316 if (fDeleteState)
3317 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3318 if (!PostMsg(hwndCnr, UM_SETUP2, NULL, NULL))
3319 WinSendMsg(hwndCnr, UM_SETUP2, NULL, NULL);
3320 }
3321 }
3322 fRestored = TRUE;
3323 swp.hwnd = hwndDir;
3324 TransformSwp(&swp, xtrans, ytrans);
3325 if (!fAutoTile && !(swp.fl & (SWP_HIDE | SWP_MINIMIZE)))
3326 WinSetWindowPos(hwndDir,
3327 HWND_TOP,
3328 swp.x,
3329 swp.y,
3330 swp.cx,
3331 swp.cy,
3332 swp.fl | SWP_MOVE |
3333 SWP_SIZE | SWP_SHOW | SWP_ZORDER |
3334 SWP_ACTIVATE);
3335 else if (swp.fl & (SWP_HIDE | SWP_MINIMIZE)) {
3336 WinSetWindowPos(hwndDir,
3337 HWND_TOP, 0, 0, 0, 0, SWP_MINIMIZE | SWP_SHOW);
3338 WinSetWindowUShort(hwndDir, QWS_XRESTORE, (USHORT) swp.x);
3339 WinSetWindowUShort(hwndDir, QWS_CXRESTORE, (USHORT) swp.cx);
3340 WinSetWindowUShort(hwndDir, QWS_YRESTORE, (USHORT) swp.y);
3341 WinSetWindowUShort(hwndDir, QWS_CYRESTORE, (USHORT) swp.cy);
3342 }
3343 else
3344 WinSetWindowPos(hwndDir,
3345 HWND_BOTTOM,
3346 0, 0, 0, 0, SWP_ZORDER | SWP_ACTIVATE);
3347 }
3348 }
3349 }
3350 } // for
3351 if (hwndPPSave) {
3352 SavePresParams(hwndPPSave, "DirCnr");
3353 WinDestroyWindow(hwndPPSave);
3354 }
3355 }
3356 return fRestored;
3357}
3358
3359static ULONG CountChildren(HWND hwndClient, ULONG * ulNumMinChildren)
3360{
3361 HENUM henum;
3362 HWND hwndChild;
3363 SWP swp;
3364 register ULONG ulCnt = 0L;
3365 USHORT id;
3366
3367 if (ulNumMinChildren)
3368 *ulNumMinChildren = 0L;
3369 henum = WinBeginEnumWindows(hwndClient);
3370 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
3371 id = WinQueryWindowUShort(hwndChild, QWS_ID);
3372 if (!id || (!fFreeTree && id == TREE_FRAME))
3373 continue;
3374 ulCnt++;
3375 if (ulNumMinChildren) {
3376 if (WinQueryWindowPos(hwndChild, &swp) && (swp.fl & SWP_MINIMIZE))
3377 (*ulNumMinChildren)++;
3378 }
3379 }
3380 WinEndEnumWindows(henum);
3381 return ulCnt;
3382}
3383
3384VOID GetNextWindowPos(HWND hwndClient, PSWP pswp, ULONG * ulCntR,
3385 ULONG * ulNumMinChildrenR)
3386{
3387 register ULONG ulCnt;
3388 ULONG ulNumMinChildren;
3389 RECTL Rectl;
3390 register ULONG ulXDiff, ulYDiff, ulWindowsPerStack;
3391
3392 if (!ulCntR || !ulNumMinChildrenR)
3393 ulCnt = CountChildren(hwndClient, &ulNumMinChildren);
3394 else {
3395 ulCnt = *ulCntR;
3396 ulNumMinChildren = *ulNumMinChildrenR;
3397 if (ulCnt == (ULONG) - 1) {
3398 ulCnt = CountChildren(hwndClient, &ulNumMinChildren);
3399 /* return these values to the caller for later use */
3400 *ulCntR = ulCnt;
3401 *ulNumMinChildrenR = ulNumMinChildren;
3402 }
3403 }
3404 WinQueryWindowRect(hwndClient, &Rectl);
3405 AdjustSizeOfClient(NULL, &Rectl);
3406 if (!fFreeTree) {
3407
3408 SWP swp;
3409
3410 WinQueryWindowPos(hwndTree, &swp);
3411 if (ulNumMinChildren || (swp.fl & (SWP_HIDE | SWP_MINIMIZE)))
3412 Rectl.yBottom += WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2;
3413 }
3414 else if (ulNumMinChildren)
3415 Rectl.yBottom += WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2;
3416
3417 ulXDiff = WinQuerySysValue(HWND_DESKTOP, SV_CXSIZEBORDER) +
3418 WinQuerySysValue(HWND_DESKTOP, SV_CXMINMAXBUTTON) / 2;
3419 ulYDiff = WinQuerySysValue(HWND_DESKTOP, SV_CYSIZEBORDER) +
3420 WinQuerySysValue(HWND_DESKTOP, SV_CYMINMAXBUTTON);
3421 ulWindowsPerStack = (Rectl.yTop - Rectl.yBottom) / (3 * ulYDiff);
3422 pswp->cx = Rectl.xRight - (ulWindowsPerStack * ulXDiff);
3423 pswp->cy = (Rectl.yTop - Rectl.yBottom) - (ulWindowsPerStack * ulYDiff);
3424 ulWindowsPerStack++;
3425 pswp->x = Rectl.xLeft + ((ulCnt % ulWindowsPerStack) * ulXDiff);
3426 pswp->y = (Rectl.yTop - pswp->cy - ((ulCnt % ulWindowsPerStack) * ulYDiff));
3427}
3428
3429static VOID CascadeChildren(HWND hwndClient)
3430{
3431 ULONG ulCnt = 0L, ulNumMinChildren;
3432 HWND hwndChild;
3433 HENUM henum;
3434 SWP swp;
3435 USHORT id;
3436 RECTL Rectl;
3437
3438 WinQueryWindowPos(hwndClient, &swp);
3439 if (swp.fl & (SWP_HIDE | SWP_MINIMIZE))
3440 return;
3441
3442 CountChildren(hwndClient, &ulNumMinChildren);
3443 if (!fFreeTree) {
3444 WinQueryWindowRect(hwndClient, &Rectl);
3445 AdjustSizeOfClient(NULL, &Rectl);
3446 WinQueryWindowPos(hwndTree, &swp);
3447 if (!(swp.fl & (SWP_MAXIMIZE | SWP_HIDE | SWP_MINIMIZE))) {
3448 if (swp.y + swp.cy < Rectl.yTop - Rectl.yBottom)
3449 swp.cy = (Rectl.yTop - Rectl.yBottom) - swp.y;
3450 if (swp.x != 0)
3451 swp.x = 0;
3452 if (swp.y < 0)
3453 swp.y = 0;
3454 if (swp.x + swp.cx > Rectl.xRight - Rectl.xLeft)
3455 swp.cx = Rectl.xRight - Rectl.xLeft;
3456 WinSetWindowPos(hwndTree, HWND_TOP, swp.x, swp.y, swp.cx, swp.cy,
3457 SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_RESTORE);
3458 }
3459 }
3460 henum = WinBeginEnumWindows(hwndClient);
3461 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
3462 id = WinQueryWindowUShort(hwndChild, QWS_ID);
3463 if (!id || (!fFreeTree && id == TREE_FRAME))
3464 continue;
3465 WinQueryWindowPos(hwndChild, &swp);
3466 if (!(swp.fl & (SWP_MINIMIZE | SWP_HIDE))) {
3467 GetNextWindowPos(hwndClient, &swp, &ulCnt, &ulNumMinChildren);
3468 WinSetWindowPos(hwndChild, HWND_TOP, swp.x, swp.y, swp.cx, swp.cy,
3469 SWP_SIZE | SWP_MOVE | SWP_SHOW | SWP_RESTORE |
3470 SWP_ZORDER | SWP_ACTIVATE);
3471 ulCnt++;
3472 }
3473 }
3474 WinEndEnumWindows(henum);
3475}
3476
3477VOID TileChildren(HWND hwndClient, BOOL absolute)
3478{
3479 register ULONG ulChildCnt, ulSquare, ulNumRows, ulNumCols, ulExtraCols,
3480 ulWidth, ulHeight;
3481 ULONG ulNumMinChildren;
3482 RECTL Rectl;
3483 HWND hwndChild;
3484
3485 if (fNoTileUpdate || hwndClient == HWND_DESKTOP)
3486 return;
3487 {
3488 SWP swp;
3489
3490 WinQueryWindowPos(hwndClient, &swp);
3491 if (swp.fl & (SWP_HIDE | SWP_MINIMIZE))
3492 return;
3493 }
3494 ulChildCnt = CountChildren(hwndClient, &ulNumMinChildren);
3495 ulChildCnt -= ulNumMinChildren;
3496 if (!ulChildCnt)
3497 return;
3498
3499 fNoTileUpdate = TRUE;
3500
3501 for (ulSquare = 2; ulSquare * ulSquare <= ulChildCnt; ulSquare++) {
3502 ;
3503 }
3504 if (!fTileBackwards) {
3505 ulNumCols = ulSquare - 1;
3506 ulNumRows = ulChildCnt / ulNumCols;
3507 }
3508 else {
3509 ulNumRows = ulSquare - 1;
3510 ulNumCols = ulChildCnt / ulNumRows;
3511 }
3512 ulExtraCols = ulChildCnt % ulNumCols;
3513
3514 WinQueryWindowRect(hwndClient, &Rectl);
3515
3516 if (!fFreeTree) {
3517
3518 SWP swp;
3519
3520 WinQueryWindowPos(hwndTree, &swp);
3521 if (!(swp.fl & (SWP_MAXIMIZE | SWP_HIDE | SWP_MINIMIZE))) {
3522 if (swp.y < 0)
3523 swp.y = 0;
3524 if (swp.y + swp.cy < Rectl.yTop - Rectl.yBottom)
3525 swp.cy = (Rectl.yTop - Rectl.yBottom) - swp.y;
3526 if (swp.x != 0)
3527 swp.x = 0;
3528 if (swp.x + swp.cx > Rectl.xRight - Rectl.xLeft)
3529 swp.cx = Rectl.xRight - Rectl.xLeft;
3530 WinSetWindowPos(hwndTree,
3531 HWND_TOP,
3532 swp.x,
3533 swp.y,
3534 swp.cx,
3535 swp.cy, SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_RESTORE);
3536 WinQueryWindowPos(hwndTree, &swp);
3537 }
3538 if (ulNumMinChildren || (swp.fl & (SWP_HIDE | SWP_MINIMIZE)))
3539 Rectl.yBottom += WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2;
3540 }
3541 else if (ulNumMinChildren)
3542 Rectl.yBottom += WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2;
3543
3544 AdjustSizeOfClient(NULL, &Rectl);
3545
3546 if (Rectl.xRight > 0L && (Rectl.yBottom < Rectl.yTop)) {
3547
3548 HENUM henum;
3549
3550 henum = WinBeginEnumWindows(hwndClient);
3551 if ((hwndChild = WinGetNextWindow(henum)) != (HWND) 0) {
3552
3553 ULONG ulCurRow, ulCurCol;
3554 SWP swp;
3555 USHORT id;
3556
3557 ulHeight = (Rectl.yTop - Rectl.yBottom) / ulNumRows;
3558
3559 for (ulCurRow = 0; ulCurRow < ulNumRows; ulCurRow++) {
3560 if ((ulNumRows - ulCurRow) <= ulExtraCols)
3561 ulNumCols++;
3562 for (ulCurCol = 0; ulCurCol < ulNumCols; ulCurCol++) {
3563 ulWidth = Rectl.xRight / ulNumCols;
3564
3565 while (hwndChild) {
3566 id = WinQueryWindowUShort(hwndChild, QWS_ID);
3567 if (id && (id != TREE_FRAME || fFreeTree)) {
3568 WinQueryWindowPos(hwndChild, &swp);
3569 if (!(swp.fl & (SWP_HIDE | SWP_MINIMIZE)))
3570 break;
3571 }
3572 hwndChild = WinGetNextWindow(henum);
3573 }
3574
3575 if (hwndChild) {
3576 if (!absolute && (swp.fl & SWP_MAXIMIZE)) {
3577 WinGetMaxPosition(hwndChild, &swp);
3578 WinSetWindowPos(hwndChild,
3579 HWND_TOP,
3580 swp.x,
3581 swp.y,
3582 swp.cx, swp.cy, SWP_MOVE | SWP_SIZE | SWP_SHOW);
3583 WinSetWindowUShort(hwndChild,
3584 QWS_XRESTORE,
3585 (USHORT) (ulWidth * ulCurCol) + Rectl.xLeft);
3586 WinSetWindowUShort(hwndChild,
3587 QWS_YRESTORE,
3588 (USHORT) (Rectl.yTop -
3589 (ulHeight * (ulCurRow + 1))));
3590 WinSetWindowUShort(hwndChild, QWS_CXRESTORE, (USHORT) ulWidth);
3591 WinSetWindowUShort(hwndChild, QWS_CYRESTORE, (USHORT) ulHeight);
3592 }
3593 else
3594 WinSetWindowPos(hwndChild,
3595 HWND_TOP,
3596 (ulWidth * ulCurCol) + Rectl.xLeft,
3597 Rectl.yTop - (ulHeight * (ulCurRow + 1)),
3598 ulWidth,
3599 ulHeight,
3600 SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_RESTORE);
3601 hwndChild = WinGetNextWindow(henum);
3602 }
3603 }
3604 if ((ulNumRows - ulCurRow) <= ulExtraCols) {
3605 ulNumCols--;
3606 ulExtraCols--;
3607 }
3608 }
3609 }
3610 WinEndEnumWindows(henum);
3611 }
3612
3613 fNoTileUpdate = FALSE;
3614}
3615
3616static VOID ResizeChildren(HWND hwndClient, SHORT oldcx, SHORT oldcy,
3617 SHORT newcx, SHORT newcy)
3618{
3619 /*
3620 * resize all children of the client to maintain their proportional
3621 * sizes and positions
3622 */
3623
3624 if (!newcx || !newcy || !oldcx || !oldcy)
3625 return;
3626 {
3627 HENUM henum;
3628 HWND hwndChild;
3629 register LONG x, y, cx, cy, ucx, ucy, ux, uy;
3630 SWP swp;
3631
3632 henum = WinBeginEnumWindows(hwndClient);
3633 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
3634 if (!WinQueryWindowUShort(hwndChild, QWS_ID))
3635 continue;
3636 if (WinQueryWindowPos(hwndChild, &swp)) {
3637 if (swp.fl & (SWP_MINIMIZE | SWP_HIDE)) {
3638 swp.x = WinQueryWindowUShort(hwndChild, QWS_XRESTORE);
3639 swp.y = WinQueryWindowUShort(hwndChild, QWS_YRESTORE);
3640 swp.cx = WinQueryWindowUShort(hwndChild, QWS_CXRESTORE);
3641 swp.cy = WinQueryWindowUShort(hwndChild, QWS_CYRESTORE);
3642 }
3643 else if (swp.fl & SWP_MAXIMIZE) {
3644 swp.x = WinQueryWindowUShort(hwndChild, QWS_XRESTORE);
3645 swp.y = WinQueryWindowUShort(hwndChild, QWS_YRESTORE);
3646 swp.cx = WinQueryWindowUShort(hwndChild, QWS_CXRESTORE);
3647 swp.cy = WinQueryWindowUShort(hwndChild, QWS_CYRESTORE);
3648 }
3649 cx = (swp.cx) ? (LONG) (((double)oldcx * 100.0) / (double)swp.cx) : 0;
3650 cy = (swp.cy) ? (LONG) (((double)oldcy * 100.0) / (double)swp.cy) : 0;
3651 x = (swp.x) ? (LONG) (((double)oldcx * 100.0) / (double)swp.x) : 0;
3652 y = (swp.y) ? (LONG) (((double)oldcy * 100.0) / (double)swp.y) : 0;
3653 if (x < 0)
3654 x = 0;
3655 if (y < 0)
3656 y = 0;
3657 ux = (x) ? (LONG) (((double)newcx * 100.0) / (double)x) : 0;
3658 uy = (y) ? (LONG) (((double)newcy * 100.0) / (double)y) : 0;
3659 ucx = (cx) ? (LONG) (((double)newcx * 100.0) / (double)cx) : 0;
3660 ucy = (cy) ? (LONG) (((double)newcy * 100.0) / (double)cy) : 0;
3661 if (ux + ucx > newcx)
3662 ucx = newcx - ux;
3663 if (uy + ucy > newcy)
3664 ucy = newcy - uy;
3665
3666 if (!(swp.fl & (SWP_MINIMIZE | SWP_HIDE | SWP_MAXIMIZE)))
3667 WinSetWindowPos(hwndChild, HWND_TOP, ux, uy, ucx, ucy,
3668 SWP_MOVE | SWP_SIZE | SWP_SHOW);
3669 else if (swp.fl & (SWP_HIDE | SWP_MINIMIZE)) {
3670 WinSetWindowUShort(hwndChild, QWS_XMINIMIZE, (USHORT) - 1);
3671 WinSetWindowUShort(hwndChild, QWS_YMINIMIZE, (USHORT) - 1);
3672 WinSetWindowPos(hwndChild, HWND_TOP, 0, 0, 0, 0,
3673 SWP_SIZE | SWP_MOVE | SWP_FOCUSDEACTIVATE);
3674 WinSetWindowUShort(hwndChild, QWS_XRESTORE, ux);
3675 WinSetWindowUShort(hwndChild, QWS_YRESTORE, uy);
3676 WinSetWindowUShort(hwndChild, QWS_CXRESTORE, ucx);
3677 WinSetWindowUShort(hwndChild, QWS_CYRESTORE, ucy);
3678 }
3679 else {
3680 WinGetMaxPosition(hwndChild, &swp);
3681 WinSetWindowPos(hwndChild, HWND_TOP, swp.x, swp.y, swp.cx, swp.cy,
3682 SWP_MOVE | SWP_SIZE | SWP_SHOW);
3683 WinSetWindowUShort(hwndChild, QWS_XRESTORE, ux);
3684 WinSetWindowUShort(hwndChild, QWS_YRESTORE, uy);
3685 WinSetWindowUShort(hwndChild, QWS_CXRESTORE, ucx);
3686 WinSetWindowUShort(hwndChild, QWS_CYRESTORE, ucy);
3687 }
3688 }
3689 }
3690 WinEndEnumWindows(henum);
3691 }
3692 if (!fFreeTree) {
3693
3694 RECTL Rectl;
3695 SWP swp;
3696
3697 WinQueryWindowRect(hwndClient, &Rectl);
3698 AdjustSizeOfClient(NULL, &Rectl);
3699 WinQueryWindowPos(hwndTree, &swp);
3700 if (!(swp.fl & (SWP_MAXIMIZE | SWP_HIDE | SWP_MINIMIZE))) {
3701
3702 if (!fNoTreeGap) {
3703 INT height = WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2;
3704 if (swp.y < height)
3705 swp.y = height; // Force bottom to position
3706 }
3707 else
3708 swp.y = 0; // Force bottom to position
3709
3710 swp.cy = (Rectl.yTop - Rectl.yBottom) - swp.y;
3711 if (swp.cy < 0)
3712 swp.cy = 0;
3713
3714 if (swp.x != 0)
3715 swp.x = 0; // Left align
3716
3717 // AdjustSizeOfClient can return bogus xRight values - fixme someday
3718 if (Rectl.xRight >= Rectl.xLeft) {
3719 if (swp.x + swp.cx > Rectl.xRight - Rectl.xLeft)
3720 swp.cx = Rectl.xRight - Rectl.xLeft;
3721 }
3722 WinSetWindowPos(hwndTree, HWND_TOP, swp.x, swp.y, swp.cx, swp.cy,
3723 SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_RESTORE);
3724 }
3725 }
3726}
3727
3728static VOID MinResChildren(HWND hwndClient, ULONG cmd)
3729{
3730 HENUM henum;
3731 HWND hwndChild;
3732
3733 {
3734 SWP swp;
3735
3736 WinQueryWindowPos(hwndClient, &swp);
3737 if (swp.fl & (SWP_HIDE | SWP_MINIMIZE))
3738 return;
3739 }
3740 henum = WinBeginEnumWindows(hwndClient);
3741 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
3742 if (!WinQueryWindowUShort(hwndChild, QWS_ID))
3743 continue;
3744 WinSetWindowPos(hwndChild, HWND_TOP, 0, 0, 0, 0, cmd);
3745 }
3746}
3747
3748//=== ChildFrameButtonProc: subclass handler for WALKBUTTON and QUICKBUTTON windows ===
3749
3750static MRESULT EXPENTRY ChildFrameButtonProc(HWND hwnd,
3751 ULONG msg,
3752 MPARAM mp1, MPARAM mp2)
3753{
3754 USHORT id;
3755 static BOOL emphasized = FALSE;
3756
3757 switch (msg) {
3758 case WM_BUTTON1CLICK:
3759 case WM_CHORD:
3760 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
3761 break;
3762
3763 case WM_MOUSEMOVE:
3764 if (fOtherHelp) {
3765 if ((!hwndBubble || WinQueryWindowULong(hwndBubble, QWL_USER) != hwnd)
3766 && !WinQueryCapture(HWND_DESKTOP)) {
3767 id = WinQueryWindowUShort(hwnd, QWS_ID);
3768 switch (id) {
3769 case IDM_OPENWALK:
3770 MakeBubble(hwnd, FALSE, GetPString(IDS_WALKBUTTONHELP));
3771 break;
3772 case IDM_USERLIST:
3773 MakeBubble(hwnd, FALSE, GetPString(IDS_QUICKBUTTONHELP));
3774 break;
3775 }
3776 }
3777 }
3778 break;
3779
3780 case WM_BUTTON3CLICK:
3781 case WM_BUTTON2CLICK:
3782 {
3783 USHORT cmd = 0;
3784
3785 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
3786 id = WinQueryWindowUShort(hwnd, QWS_ID);
3787 switch (id) {
3788 case IDM_OPENWALK:
3789 switch (msg) {
3790 case WM_BUTTON2CLICK:
3791 if ((shiftstate & (KC_ALT | KC_SHIFT | KC_CTRL)) ==
3792 (KC_ALT | KC_SHIFT | KC_CTRL))
3793 cmd = IDM_GREP;
3794 else if ((shiftstate & (KC_ALT | KC_CTRL)) == (KC_ALT | KC_CTRL))
3795 CascadeChildren(hwndMain);
3796
3797#ifdef NEVER
3798 else if ((shiftstate & (KC_ALT | KC_SHIFT)) == (KC_ALT | KC_SHIFT))
3799 cmd = IDM_SYSINFO;
3800#endif
3801
3802 else if (shiftstate & KC_SHIFT)
3803 cmd = IDM_WINDOWDLG;
3804 else if (shiftstate & KC_CTRL)
3805 cmd = IDM_SEEALL;
3806 else if (shiftstate & KC_ALT)
3807 TileChildren(hwndMain, TRUE);
3808 else
3809 cmd = IDM_WALKDIR;
3810 break;
3811 case WM_BUTTON3CLICK:
3812 TileChildren(hwndMain, TRUE);
3813 break;
3814 }
3815 break;
3816 case IDM_USERLIST:
3817 switch (msg) {
3818 case WM_BUTTON2CLICK:
3819 if ((shiftstate & (KC_ALT | KC_SHIFT | KC_CTRL)) ==
3820 (KC_ALT | KC_SHIFT | KC_CTRL))
3821 cmd = IDM_COLORPALETTE;
3822 else if ((shiftstate & (KC_ALT | KC_CTRL)) == (KC_ALT | KC_CTRL))
3823 cmd = IDM_HIDEMENU;
3824 else if ((shiftstate & (KC_ALT | KC_SHIFT)) == (KC_ALT | KC_SHIFT))
3825 cmd = IDM_NOTEBOOK;
3826 else if (shiftstate & KC_SHIFT)
3827 cmd = IDM_TOOLTITLES;
3828 else if (shiftstate & KC_CTRL)
3829 cmd = IDM_TEXTTOOLS;
3830 else if (shiftstate & KC_ALT)
3831 cmd = IDM_FONTPALETTE;
3832 else
3833 cmd = IDM_TOOLBAR;
3834 break;
3835 case WM_BUTTON3CLICK:
3836 cmd = IDM_DRIVEBAR;
3837 break;
3838 }
3839 break;
3840 } // switch id
3841
3842 if (cmd) {
3843 PostMsg(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT), FID_CLIENT),
3844 WM_COMMAND, MPFROM2SHORT(cmd, 0), MPVOID);
3845 }
3846 }
3847 break;
3848
3849 case DM_DRAGOVER:
3850 id = WinQueryWindowUShort(hwnd, QWS_ID);
3851 if (id == IDM_OPENWALK) {
3852 if (!emphasized) {
3853 emphasized = TRUE;
3854 DrawTargetEmphasis(hwnd, emphasized);
3855 }
3856 if (AcceptOneDrop(hwnd, mp1, mp2))
3857 return MRFROM2SHORT(DOR_DROP, DO_MOVE);
3858 }
3859 return MRFROM2SHORT(DOR_NEVERDROP, 0);
3860
3861 case DM_DRAGLEAVE:
3862 if (emphasized) {
3863 emphasized = FALSE;
3864 DrawTargetEmphasis(hwnd, emphasized);
3865 }
3866 break;
3867
3868 case DM_DROPHELP:
3869 DropHelp(mp1, mp2, hwnd, GetPString(IDS_OPENDROPHELP));
3870 return 0;
3871
3872 case DM_DROP:
3873 {
3874 char szFrom[CCHMAXPATH + 2];
3875
3876 if (emphasized) {
3877 emphasized = FALSE;
3878 DrawTargetEmphasis(hwnd, emphasized);
3879 }
3880 if (GetOneDrop(hwnd, mp1, mp2, szFrom, sizeof(szFrom))) {
3881 if (MakeValidDir(szFrom) && !FindDirCnrByName(szFrom, TRUE)) {
3882 OpenDirCnr((HWND) 0, hwndMain, hwndTree, FALSE, szFrom);
3883 }
3884 }
3885 }
3886 return 0;
3887
3888 case WM_CLOSE:
3889 WinDestroyWindow(hwnd);
3890 return 0;
3891 }
3892 return PFNWPButton(hwnd, msg, mp1, mp2);
3893}
3894
3895static MRESULT EXPENTRY MainFrameWndProc(HWND hwnd, ULONG msg, MPARAM mp1,
3896 MPARAM mp2)
3897{
3898 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
3899 static ULONG aheight = 0L;
3900
3901 switch (msg) {
3902 case WM_ADJUSTWINDOWPOS:
3903 {
3904 SWP *pswp;
3905
3906 pswp = (SWP *) mp1;
3907 if (fDataMin && !fAmClosing) {
3908 if (pswp->fl & (SWP_HIDE | SWP_MINIMIZE)) {
3909
3910 SWP swp;
3911
3912 WinQueryWindowPos(hwnd, &swp);
3913 PostMsg(hwnd, UM_FOCUSME, MPFROMLONG(swp.fl), MPVOID);
3914 HideNote();
3915 }
3916 else if (pswp->fl & (SWP_SHOW | SWP_RESTORE)) {
3917 if (DataHwnd)
3918 PostMsg(DataHwnd, WM_CLOSE, MPVOID, MPVOID);
3919 }
3920 }
3921 if (!fAmClosing) {
3922 if (pswp->fl & (SWP_HIDE | SWP_MINIMIZE))
3923 HideNote();
3924 }
3925 }
3926 break;
3927
3928 case UM_FOCUSME:
3929 CreateDataBar(HWND_DESKTOP, (ULONG) mp1);
3930 return 0;
3931
3932 case WM_BUTTON1UP:
3933 case WM_BUTTON2UP:
3934 case WM_BUTTON3UP:
3935 case WM_MOUSEMOVE:
3936 case WM_CHORD:
3937 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
3938 break;
3939
3940 case WM_CHAR:
3941 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
3942 break;
3943
3944 case WM_CONTROL:
3945 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), UM_CONTROL, mp1,
3946 mp2);
3947
3948 case WM_COMMAND:
3949 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
3950
3951 case WM_CALCFRAMERECT:
3952 {
3953 MRESULT mr;
3954 PRECTL prectl;
3955 LONG sheight = 20, bheight = 20;
3956
3957 mr = oldproc(hwnd, msg, mp1, mp2);
3958
3959 /*
3960 * Calculate the position of the client rectangle.
3961 * Otherwise, we'll see a lot of redraw when we move the
3962 * client during WM_FORMATFRAME.
3963 */
3964
3965 if (mr && mp2) {
3966 prectl = (PRECTL) mp1;
3967 if (prectl->yBottom != prectl->yTop) {
3968 {
3969 HPS hps;
3970 POINTL aptl[TXTBOX_COUNT];
3971
3972 hps = WinGetPS(hwndStatus);
3973 if (hps) {
3974 GpiQueryTextBox(hps, 6, "$`WjgT", TXTBOX_COUNT, aptl);
3975 bheight = sheight = aptl[TXTBOX_TOPLEFT].y + 6;
3976 WinReleasePS(hps);
3977 }
3978 }
3979 prectl->yBottom += (sheight + 4);
3980 prectl->yTop -= (sheight + 4);
3981 if (fMoreButtons) {
3982
3983 HPS hps;
3984 POINTL aptl[TXTBOX_COUNT];
3985
3986 hps = WinGetPS(hwndName);
3987 if (hps) {
3988 GpiQueryTextBox(hps, 6, "$`WjgT", TXTBOX_COUNT, aptl);
3989 bheight = aptl[TXTBOX_TOPLEFT].y + 6;
3990 WinReleasePS(hps);
3991 }
3992 prectl->yBottom += (bheight + 4);
3993 prectl->yTop -= (bheight + 4);
3994 }
3995 if (fToolbar) {
3996 if (!fTextTools)
3997 prectl->yTop -= ((fToolTitles) ? 50 : 40);
3998 else
3999 prectl->yTop -= 32;
4000 }
4001 if (fDrivebar) {
4002 ResizeDrives(WinWindowFromID(hwnd, MAIN_DRIVES),
4003 ((prectl->xRight -
4004 (WinQuerySysValue(HWND_DESKTOP,
4005 SV_CYSIZEBORDER) * 2)) - 4));
4006 prectl->yTop -= (16 * (DriveLines * 18));
4007 }
4008 if (fUserComboBox) {
4009 if (!aheight) {
4010
4011 SWP swpTemp;
4012
4013 WinQueryWindowPos(WinWindowFromID(hwndDrivelist, CBID_EDIT),
4014 &swpTemp);
4015 aheight = swpTemp.cy;
4016 }
4017 prectl->yTop -= (aheight + 6L);
4018 }
4019 if (fAutoView) {
4020 AutoviewHeight = min(AutoviewHeight,
4021 (prectl->yTop - prectl->yBottom) - 116);
4022 AutoviewHeight = max(AutoviewHeight, 36);
4023 prectl->yBottom += (AutoviewHeight + 6);
4024 }
4025 }
4026 }
4027 return mr;
4028 }
4029
4030 case WM_FORMATFRAME:
4031 {
4032 SHORT sCount, soldCount;
4033 PSWP pswp, pswpClient, pswpNew;
4034 SWP swpClient;
4035 LONG theight = 48L, dheight = 20L, width, sheight = 20, bheight = 20;
4036
4037 sCount = (SHORT) oldproc(hwnd, msg, mp1, mp2);
4038 soldCount = sCount;
4039
4040 /*
4041 * Reformat the frame to "squeeze" the client
4042 * and make room for status window sibling beneath
4043 * and toolbar above (if toolbar's on) and userlists
4044 * (if userlists are on).
4045 */
4046
4047 pswp = (PSWP) mp1;
4048 {
4049 SHORT x;
4050
4051 for (x = 0; x < soldCount; x++) {
4052 if (WinQueryWindowUShort(pswp->hwnd, QWS_ID) == FID_CLIENT) {
4053 pswpClient = pswp;
4054 break;
4055 }
4056 pswp++;
4057 }
4058 }
4059
4060 {
4061 HPS hps;
4062 POINTL aptl[TXTBOX_COUNT];
4063
4064 hps = WinGetPS(hwndStatus);
4065 if (hps) {
4066 GpiQueryTextBox(hps, 6, "$`WjgT", TXTBOX_COUNT, aptl);
4067 bheight = sheight = aptl[TXTBOX_TOPLEFT].y + 6;
4068 WinReleasePS(hps);
4069 }
4070 if (fMoreButtons) {
4071 hps = WinGetPS(hwndName);
4072 if (hps) {
4073 GpiQueryTextBox(hps, 6, "$`WjgT", TXTBOX_COUNT, aptl);
4074 bheight = aptl[TXTBOX_TOPLEFT].y + 6;
4075 WinReleasePS(hps);
4076 }
4077 }
4078 }
4079 pswpNew = (PSWP) mp1 + soldCount;
4080 *pswpNew = *pswpClient;
4081 swpClient = *pswpClient;
4082 pswpNew->hwnd = hwndStatus;
4083 pswpNew->hwndInsertBehind = HWND_BOTTOM;
4084 pswpNew->x = swpClient.x + 3;
4085 pswpNew->y = swpClient.y + 2;
4086 if (!fSplitStatus)
4087 width = swpClient.cx - (16 + (sheight * 2) + 4);
4088 else
4089 width = (swpClient.cx - (16 + (sheight * 2) + 4)) / 2;
4090 width = max(width, 10);
4091 if (fSplitStatus)
4092 pswpNew->cx = width - 6;
4093 else
4094 pswpNew->cx = width - 8;
4095 pswpNew->cy = sheight;
4096 pswpClient->y = pswpNew->y + pswpNew->cy + 3;
4097 pswpClient->cy = (swpClient.cy - pswpNew->cy) - 3;
4098 sCount++;
4099
4100 if (fSplitStatus) {
4101 pswpNew = (PSWP) mp1 + (soldCount + 1);
4102 *pswpNew = *pswpClient;
4103 pswpNew->hwnd = hwndStatus2;
4104 pswpNew->hwndInsertBehind = HWND_BOTTOM;
4105 pswpNew->x = width + 8;
4106 pswpNew->y = swpClient.y + 2;
4107 pswpNew->cx = width - 6;
4108 pswpNew->cy = sheight;
4109 sCount++;
4110 }
4111 else {
4112 WinShowWindow(hwndStatus2, FALSE);
4113 WinSetWindowText(hwndStatus2, NullStr);
4114 }
4115
4116 if (fToolbar) {
4117 if (fTextTools)
4118 theight = 32L;
4119 else if (!fToolTitles)
4120 theight = 40L;
4121 pswpNew = (PSWP) mp1 + (soldCount + 1 + (fSplitStatus != FALSE));
4122 *pswpNew = *pswpClient;
4123 pswpNew->hwnd = WinWindowFromID(hwnd, MAIN_TOOLS);
4124 pswpNew->hwndInsertBehind = HWND_BOTTOM;
4125 pswpNew->x = swpClient.x + 2;
4126 pswpNew->y = (swpClient.y + swpClient.cy) - (theight - 2);
4127 pswpNew->cx = swpClient.cx - 4;
4128 pswpNew->cy = theight - 4;
4129 pswpClient->cy -= theight;
4130 sCount++;
4131 }
4132 else
4133 WinShowWindow(WinWindowFromID(hwnd, MAIN_TOOLS), FALSE);
4134
4135 if (fDrivebar) {
4136 ResizeDrives(WinWindowFromID(hwnd, MAIN_DRIVES), pswpClient->cx - 4);
4137 pswpNew = (PSWP) mp1 + (soldCount + 1 +
4138 (fSplitStatus != FALSE) +
4139 (fToolbar != FALSE));
4140 *pswpNew = *pswpClient;
4141 pswpNew->hwnd = WinWindowFromID(hwnd, MAIN_DRIVES);
4142 pswpNew->hwndInsertBehind = HWND_BOTTOM;
4143 pswpNew->x = swpClient.x + 2;
4144 dheight += ((dheight - 2) * DriveLines);
4145 pswpNew->y = (swpClient.y + swpClient.cy) - (dheight - 2);
4146 if (fToolbar)
4147 pswpNew->y -= theight;
4148 pswpNew->cx = swpClient.cx - 4;
4149 pswpNew->cy = dheight - 4;
4150 pswpClient->cy -= dheight;
4151 sCount++;
4152 }
4153 else
4154 WinShowWindow(WinWindowFromID(hwnd, MAIN_DRIVES), FALSE);
4155
4156 if (fAutoView) {
4157 pswpNew = (PSWP) mp1 + (soldCount + 1 +
4158 (fToolbar != FALSE) +
4159 (fDrivebar != FALSE) +
4160 (fSplitStatus != FALSE));
4161 *pswpNew = *pswpClient;
4162 pswpNew->hwnd = (fComments) ? hwndAutoMLE : hwndAutoview;
4163 pswpNew->x = pswpClient->x + 3;
4164 pswpNew->y = pswpClient->y + 3;
4165 if (fMoreButtons)
4166 pswpNew->y += (bheight + 4);
4167 pswpNew->cx = pswpClient->cx - 6;
4168 AutoviewHeight = min(AutoviewHeight, pswpClient->cy - 116);
4169 AutoviewHeight = max(AutoviewHeight, 36);
4170 pswpNew->cy = AutoviewHeight;
4171 pswpClient->y += (AutoviewHeight + 6);
4172 pswpClient->cy -= (AutoviewHeight + 6);
4173 sCount++;
4174 WinShowWindow((fComments) ? hwndAutoview : hwndAutoMLE, FALSE);
4175 }
4176 else {
4177 WinShowWindow(hwndAutoview, FALSE);
4178 WinShowWindow(hwndAutoMLE, FALSE);
4179 }
4180
4181 pswpNew = (PSWP) mp1 + (soldCount + 1 +
4182 (fToolbar != FALSE) +
4183 (fDrivebar != FALSE) +
4184 (fSplitStatus != FALSE) + (fAutoView != FALSE));
4185 *pswpNew = *pswpClient;
4186 pswpNew->hwnd = WinWindowFromID(hwnd, IDM_OPENWALK);
4187 pswpNew->x = swpClient.cx - ((sheight * 2) + 4);
4188 pswpNew->y = swpClient.y;
4189 pswpNew->cx = sheight + 4;
4190 pswpNew->cy = sheight + 4;
4191 sCount++;
4192 pswpNew = (PSWP) mp1 + (soldCount + 2 +
4193 (fToolbar != FALSE) +
4194 (fDrivebar != FALSE) +
4195 (fSplitStatus != FALSE) + (fAutoView != FALSE));
4196 *pswpNew = *pswpClient;
4197 pswpNew->hwnd = WinWindowFromID(hwnd, IDM_USERLIST);
4198 pswpNew->x = swpClient.cx - (sheight + 2);
4199 pswpNew->y = swpClient.y;
4200 pswpNew->cx = sheight + 4;
4201 pswpNew->cy = sheight + 4;
4202 sCount++;
4203 pswpNew = (PSWP) mp1 + (soldCount + 3 +
4204 (fToolbar != FALSE) +
4205 (fDrivebar != FALSE) +
4206 (fSplitStatus != FALSE) + (fAutoView != FALSE));
4207 *pswpNew = *pswpClient;
4208 pswpNew->hwnd = WinWindowFromID(hwnd, MAIN_LED);
4209 pswpNew->x = swpClient.cx - ((sheight * 2) + 16);
4210 pswpNew->y = swpClient.y;
4211 pswpNew->cx = 12;
4212 pswpNew->cy = 12;
4213 sCount++;
4214 pswpNew = (PSWP) mp1 + (soldCount + 4 +
4215 (fToolbar != FALSE) +
4216 (fDrivebar != FALSE) +
4217 (fSplitStatus != FALSE) + (fAutoView != FALSE));
4218 *pswpNew = *pswpClient;
4219 pswpNew->hwnd = WinWindowFromID(hwnd, MAIN_LEDHDR);
4220 pswpNew->x = swpClient.cx - ((sheight * 2) + 16);
4221 pswpNew->y = swpClient.y + 12;
4222 pswpNew->cx = 12;
4223 pswpNew->cy = sheight - 8;
4224 sCount++;
4225 if (fUserComboBox) {
4226 if (!aheight) {
4227
4228 SWP swpTemp;
4229
4230 WinQueryWindowPos(WinWindowFromID(hwndDrivelist, CBID_EDIT),
4231 &swpTemp);
4232 aheight = swpTemp.cy;
4233 }
4234 pswpNew = (PSWP) mp1 + (soldCount + 5 +
4235 (fToolbar != FALSE) +
4236 (fSplitStatus != FALSE) +
4237 (fDrivebar != FALSE) + (fAutoView != FALSE));
4238 *pswpNew = *pswpClient;
4239 pswpNew->hwnd = hwndDrivelist;
4240 pswpNew->x = swpClient.x;
4241 pswpNew->cx = 48;
4242 pswpClient->cy -= (aheight + 6L);
4243 pswpNew->y = pswpClient->y;
4244 pswpNew->cy = pswpClient->cy + (aheight + 5L);
4245 sCount++;
4246 pswpNew = (PSWP) mp1 + (soldCount + 6 +
4247 (fToolbar != FALSE) +
4248 (fDrivebar != FALSE) +
4249 (fSplitStatus != FALSE) +
4250 (fAutoView != FALSE));
4251 *pswpNew = *pswpClient;
4252 pswpNew->hwnd = hwndStatelist;
4253 pswpNew->x = swpClient.x + 48;
4254 pswpNew->cx = (swpClient.cx - 48) / 7;
4255 pswpNew->y = pswpClient->y;
4256 pswpNew->cy = pswpClient->cy + (aheight + 5L);
4257 sCount++;
4258 pswpNew = (PSWP) mp1 + (soldCount + 7 +
4259 (fToolbar != FALSE) +
4260 (fDrivebar != FALSE) +
4261 (fSplitStatus != FALSE) +
4262 (fAutoView != FALSE));
4263 *pswpNew = *pswpClient;
4264 pswpNew->hwnd = hwndCmdlist;
4265 pswpNew->x = swpClient.x + 48 + ((swpClient.cx - 48) / 7);
4266 pswpNew->cx = (swpClient.cx - 48) / 5 +
4267 ((swpClient.cx - 48) / 5) - ((swpClient.cx - 48) / 7);
4268 pswpNew->y = pswpClient->y;
4269 pswpNew->cy = pswpClient->cy + (aheight + 5L);
4270 sCount++;
4271 pswpNew = (PSWP) mp1 + (soldCount + 8 +
4272 (fToolbar != FALSE) +
4273 (fDrivebar != FALSE) +
4274 (fSplitStatus != FALSE) +
4275 (fAutoView != FALSE));
4276 *pswpNew = *pswpClient;
4277 pswpNew->hwnd = hwndUserlist;
4278 pswpNew->x = swpClient.x + 48 + (((swpClient.cx - 48) / 5) * 2);
4279 pswpNew->cx = ((swpClient.x + swpClient.cx) - pswpNew->x) -
4280 ((fToolbar) ? ((swpClient.cx - 48) / 7) : 0);
4281 pswpNew->y = pswpClient->y;
4282 pswpNew->cy = pswpClient->cy + (aheight + 5L);
4283 sCount++;
4284 if (fToolbar) {
4285 pswpNew = (PSWP) mp1 + (soldCount + 9 +
4286 (fToolbar != FALSE) +
4287 (fDrivebar != FALSE) +
4288 (fSplitStatus != FALSE) +
4289 (fAutoView != FALSE));
4290 *pswpNew = *pswpClient;
4291 pswpNew->hwnd = hwndButtonlist;
4292 pswpNew->x = swpClient.cx - ((swpClient.cx - 48) / 7) + 4;
4293 pswpNew->cx = (swpClient.x + swpClient.cx) - pswpNew->x;
4294 pswpNew->y = pswpClient->y;
4295 pswpNew->cy = pswpClient->cy + (aheight + 5L);
4296 sCount++;
4297 }
4298 else
4299 WinShowWindow(hwndButtonlist, FALSE);
4300 }
4301 else {
4302 WinShowWindow(hwndUserlist, FALSE);
4303 WinShowWindow(hwndDrivelist, FALSE);
4304 WinShowWindow(hwndStatelist, FALSE);
4305 WinShowWindow(hwndButtonlist, FALSE);
4306 WinShowWindow(hwndCmdlist, FALSE);
4307 }
4308 {
4309 PSWP pswpTitlebar = (PSWP) 0, pswpMinbutton = (PSWP) 0;
4310 SHORT x;
4311
4312 pswpNew = (PSWP) mp1 + (soldCount + 5 +
4313 (fToolbar != FALSE) +
4314 (fDrivebar != FALSE) +
4315 (fSplitStatus != FALSE) +
4316 (fAutoView != FALSE) +
4317 ((fUserComboBox != FALSE) * 4) +
4318 (fUserComboBox != FALSE &&
4319 fToolbar != FALSE));
4320 pswp = (PSWP) mp1;
4321 for (x = 0; x < soldCount; x++) {
4322 if (!pswpTitlebar &&
4323 WinQueryWindowUShort(pswp->hwnd, QWS_ID) == FID_TITLEBAR)
4324 pswpTitlebar = pswp;
4325 else if (!pswpMinbutton &&
4326 WinQueryWindowUShort(pswp->hwnd, QWS_ID) == FID_MINMAX)
4327 pswpMinbutton = pswp;
4328 if (pswpTitlebar && pswpMinbutton)
4329 break;
4330 pswp++;
4331 }
4332 if (pswpMinbutton && pswpTitlebar) {
4333 *pswpNew = *pswpMinbutton;
4334 pswpNew->hwnd = WinWindowFromID(hwnd, IDM_IDEALSIZE);
4335 pswpNew->cy = pswpMinbutton->cy + 3;
4336 pswpNew->cx = min(pswpNew->cy, (pswpMinbutton->cx / 2) + 3);
4337 pswpTitlebar->cx -= (pswpNew->cx - 1);
4338 pswpNew->x = pswpTitlebar->x + (pswpTitlebar->cx);
4339 pswpNew->y = pswpMinbutton->y - 1;
4340 sCount++;
4341 }
4342 else
4343 WinShowWindow(WinWindowFromID(hwnd, IDM_IDEALSIZE), FALSE);
4344 }
4345
4346 if (fMoreButtons) {
4347
4348 LONG lastx;
4349
4350 pswpNew = (PSWP) mp1 + (soldCount + 6 +
4351 (fToolbar != FALSE) +
4352 (fDrivebar != FALSE) +
4353 (fSplitStatus != FALSE) +
4354 (fAutoView != FALSE) +
4355 ((fUserComboBox != FALSE) * 4) +
4356 (fUserComboBox != FALSE &&
4357 fToolbar != FALSE));
4358 *pswpNew = *pswpClient;
4359 pswpNew->hwnd = hwndName;
4360 pswpNew->x = swpClient.x + 3;
4361 pswpNew->y = swpClient.y + (sheight + 6);
4362 pswpNew->cx = ((swpClient.cx / 2) + (swpClient.cx / 5)) - 3;
4363 lastx = pswpNew->x + pswpNew->cx;
4364 pswpNew->cy = bheight;
4365 pswpClient->y += (bheight + 4);
4366 pswpClient->cy -= (bheight + 4);
4367 sCount++;
4368 pswpNew = (PSWP) mp1 + (soldCount + 7 +
4369 (fToolbar != FALSE) +
4370 (fDrivebar != FALSE) +
4371 (fSplitStatus != FALSE) +
4372 (fAutoView != FALSE) +
4373 ((fUserComboBox != FALSE) * 4) +
4374 (fUserComboBox != FALSE &&
4375 fToolbar != FALSE));
4376 *pswpNew = *pswpClient;
4377 pswpNew->hwnd = hwndDate;
4378 pswpNew->x = lastx + 3;
4379 pswpNew->y = swpClient.y + (sheight + 6);
4380 pswpNew->cx = (swpClient.cx / 6) + (swpClient.cx / 16) - 3;
4381 lastx = pswpNew->x + pswpNew->cx;
4382 pswpNew->cy = bheight;
4383 sCount++;
4384 pswpNew = (PSWP) mp1 + (soldCount + 8 +
4385 (fToolbar != FALSE) +
4386 (fDrivebar != FALSE) +
4387 (fSplitStatus != FALSE) +
4388 (fAutoView != FALSE) +
4389 ((fUserComboBox != FALSE) * 4) +
4390 (fUserComboBox != FALSE &&
4391 fToolbar != FALSE));
4392 *pswpNew = *pswpClient;
4393 pswpNew->hwnd = hwndAttr;
4394 pswpNew->x = lastx + 3;
4395 pswpNew->y = swpClient.y + (sheight + 6);
4396 pswpNew->cx = (swpClient.cx - pswpNew->x) - 1;
4397 pswpNew->cy = bheight;
4398 sCount++;
4399 }
4400 else {
4401 WinShowWindow(hwndAttr, FALSE);
4402 WinShowWindow(hwndName, FALSE);
4403 WinShowWindow(hwndDate, FALSE);
4404 }
4405 return MRFROMSHORT(sCount);
4406 }
4407
4408 case WM_QUERYFRAMECTLCOUNT:
4409 {
4410 SHORT sCount;
4411
4412 sCount = (SHORT) oldproc(hwnd, msg, mp1, mp2);
4413
4414 sCount += 6;
4415 if (fSplitStatus)
4416 sCount++;
4417 if (fToolbar)
4418 sCount++;
4419 if (fUserComboBox) {
4420 sCount += 4;
4421 if (fToolbar)
4422 sCount++;
4423 }
4424 if (fDrivebar)
4425 sCount++;
4426 if (fAutoView)
4427 sCount++;
4428 if (fMoreButtons)
4429 sCount += 3;
4430 return MRFROMSHORT(sCount);
4431 }
4432
4433 case WM_CLOSE:
4434 WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
4435 return 0;
4436 }
4437 return oldproc(hwnd, msg, mp1, mp2);
4438}
4439
4440MRESULT EXPENTRY MainWMCommand(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
4441{
4442 SetShiftState();
4443 switch (SHORT1FROMMP(mp1)) {
4444
4445 case IDM_CONTEXTMENU:
4446 {
4447 HWND hwnd = WinQueryFocus(HWND_DESKTOP);
4448 // DbgMsg(pszSrcFile, __LINE__, "IDM_CONTEXTMENU %x", hwnd);
4449 if (hwnd != NULLHANDLE) {
4450 HWND hwndParent = WinQueryWindow(hwnd, QW_PARENT);
4451 USHORT id = WinQueryWindowUShort(hwndParent, QWS_ID);
4452 switch (id) {
4453 case MAIN_SETUPLIST:
4454 case MAIN_USERLIST:
4455 case MAIN_CMDLIST:
4456 // DbgMsg(pszSrcFile, __LINE__, "WM_CONTEXTMENU");
4457 WinPostMsg(hwnd, WM_CONTEXTMENU, 0, 0);
4458 }
4459 }
4460 }
4461 break;
4462
4463 case IDM_SETTARGET:
4464 SetTargetDir(hwnd, FALSE);
4465 break;
4466
4467 case IDM_TOAUTOMLE:
4468 if (fComments && fAutoView)
4469 WinSetFocus(HWND_DESKTOP, hwndAutoMLE);
4470 break;
4471
4472 case IDM_HIDENOTEWND:
4473 HideNote();
4474 break;
4475 case IDM_SHOWNOTEWND:
4476 ShowNote();
4477 break;
4478
4479 case IDM_COMPARE:
4480 {
4481 WALK2 wa;
4482 PCNRITEM pci;
4483
4484 memset(&wa, 0, sizeof(wa));
4485 wa.size = sizeof(wa);
4486 pci =
4487 (PCNRITEM)
4488 WinSendMsg(WinWindowFromID
4489 (WinWindowFromID(hwndTree, FID_CLIENT), TREE_CNR),
4490 CM_QUERYRECORDEMPHASIS, MPFROMLONG(CMA_FIRST),
4491 MPFROMSHORT(CRA_CURSORED));
4492 if (pci && (INT) pci != -1) {
4493 strcpy(wa.szCurrentPath1, pci->pszFileName);
4494 MakeValidDir(wa.szCurrentPath1);
4495 }
4496 else
4497 save_dir2(wa.szCurrentPath1);
4498 TopWindowName(hwndMain, (HWND) 0, wa.szCurrentPath2);
4499 if (!*wa.szCurrentPath2)
4500 strcpy(wa.szCurrentPath2, wa.szCurrentPath1);
4501 MakeValidDir(wa.szCurrentPath2);
4502 if (WinDlgBox(HWND_DESKTOP,
4503 hwnd,
4504 WalkTwoCmpDlgProc,
4505 FM3ModHandle,
4506 WALK2_FRAME,
4507 MPFROMP(&wa)) &&
4508 !IsFile(wa.szCurrentPath1) && !IsFile(wa.szCurrentPath2)) {
4509 if (!*dircompare) {
4510
4511 COMPARE *cmp;
4512
4513 cmp = xmallocz(sizeof(COMPARE), pszSrcFile, __LINE__);
4514 if (cmp) {
4515 cmp->size = sizeof(COMPARE);
4516 strcpy(cmp->leftdir, wa.szCurrentPath1);
4517 strcpy(cmp->rightdir, wa.szCurrentPath2);
4518 cmp->hwndParent = hwnd;
4519 cmp->dcd.hwndParent = hwnd;
4520 WinDlgBox(HWND_DESKTOP,
4521 HWND_DESKTOP,
4522 CompareDlgProc, FM3ModHandle, COMP_FRAME, MPFROMP(cmp));
4523 }
4524 }
4525 else {
4526
4527 CHAR szPath1[CCHMAXPATH];
4528 CHAR szPath2[CCHMAXPATH];
4529 runemf2(SEPARATE,
4530 HWND_DESKTOP, pszSrcFile, __LINE__,
4531 NULL, NULL,
4532 "%s %s %s",
4533 dircompare,
4534 BldQuotedFileName(szPath1, wa.szCurrentPath1),
4535 BldQuotedFileName(szPath2, wa.szCurrentPath2));
4536 }
4537 }
4538 }
4539 break;
4540
4541 case IDM_EXIT:
4542 case IDM_KILLME:
4543 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
4544 break;
4545
4546 case IDM_CLI:
4547 if (fSplitStatus &&
4548 hwndStatus2 &&
4549 !WinIsWindow(WinQueryAnchorBlock(hwnd),
4550 WinWindowFromID(hwndStatus2, COMMAND_LINE)))
4551 PostMsg(hwndStatus2, UM_CLICKED, MPVOID, MPVOID);
4552 break;
4553
4554 case IDM_ADDTOUSERLIST:
4555 case IDM_DELETEFROMUSERLIST:
4556 {
4557 CHAR temp[CCHMAXPATH], path[CCHMAXPATH];
4558
4559 *temp = 0;
4560 WinQueryWindowText(hwndUserlist, CCHMAXPATH, temp);
4561 bstrip(temp);
4562 if (*temp &&
4563 !DosQueryPathInfo(temp, FIL_QUERYFULLNAME, path, sizeof(path))) {
4564 if (SHORT1FROMMP(mp1) == IDM_ADDTOUSERLIST) {
4565 add_udir(TRUE, path);
4566 if (fUdirsChanged)
4567 save_udirs();
4568 WinSendMsg(hwnd, UM_FILLUSERLIST, MPVOID, MPVOID);
4569 }
4570 else {
4571 if (!remove_udir(path))
4572 Runtime_Error(pszSrcFile, __LINE__, "remove_udir");
4573 else {
4574 if (fUdirsChanged)
4575 save_udirs();
4576 WinSendMsg(hwnd, UM_FILLUSERLIST, MPVOID, MPVOID);
4577 }
4578 }
4579 }
4580 }
4581 break;
4582
4583 case IDM_SAVEDIRCNRSTATE:
4584 case IDM_DELETEDIRCNRSTATE:
4585 {
4586 CHAR szStateName[STATE_NAME_MAX_BYTES + 1];
4587
4588 *szStateName = 0;
4589 WinQueryWindowText(hwndStatelist, STATE_NAME_MAX_BYTES, szStateName);
4590 bstrip(szStateName);
4591 // Complain if attempting to use reserved name
4592 if (stricmp(szStateName, GetPString(IDS_STATETEXT)) == 0 ||
4593 stricmp(szStateName, GetPString(IDS_FM2TEMPTEXT)) == 0 ||
4594 stricmp(szStateName, GetPString(IDS_SHUTDOWNSTATE)) == 0)
4595 {
4596 saymsg(MB_ENTER | MB_ICONASTERISK, hwnd,
4597 GetPString(IDS_WARNINGTEXT),
4598 "\"%s\" is a reserved state name", szStateName);
4599 }
4600 // Ignore request if blank
4601 else if (*szStateName) {
4602 if (SHORT1FROMMP(mp1) == IDM_SAVEDIRCNRSTATE) {
4603 // Save
4604 INT nSaved = SaveDirCnrState(hwnd, szStateName);
4605 if (nSaved > 0) {
4606 INT ret = add_setup(szStateName);
4607 if (ret == 0) {
4608 WinSendMsg(hwndStatelist, LM_INSERTITEM,
4609 MPFROM2SHORT(LIT_SORTASCENDING, 0), MPFROMP(szStateName));
4610 save_setups();
4611 }
4612 else if (ret != 1) {
4613 saymsg(MB_ENTER | MB_ICONASTERISK, hwnd,
4614 GetPString(IDS_WARNINGTEXT),
4615 "\"%s\" state name add failed", szStateName); // 15 Apr 07 SHL failed
4616 WinSetWindowText(hwndStatelist, GetPString(IDS_STATETEXT));
4617 }
4618 }
4619 else {
4620 saymsg(MB_ENTER | MB_ICONASTERISK,
4621 hwnd,
4622 GetPString(IDS_WARNINGTEXT),
4623 nSaved == 0 ?
4624 "Nothing to save" :
4625 "State data save failed");
4626 WinSetWindowText(hwndStatelist, GetPString(IDS_STATETEXT));
4627 }
4628 }
4629 else {
4630 // Delete
4631 ULONG numsaves = 0, size, x;
4632 CHAR s[STATE_NAME_MAX_BYTES + 80];
4633
4634 INT ret = remove_setup(szStateName);
4635 if (ret == 1)
4636 save_setups();
4637 sprintf(s, "%s.NumDirsLastTime", szStateName);
4638 size = sizeof(ULONG);
4639 if (!PrfQueryProfileData(fmprof,
4640 FM3Str,
4641 s,
4642 (PVOID)&numsaves,
4643 &size)) {
4644 saymsg(MB_ENTER | MB_ICONASTERISK, hwnd,
4645 GetPString(IDS_WARNINGTEXT),
4646 GetPString(IDS_DOESNTEXISTTEXT), szStateName);
4647 }
4648 else if (!size)
4649 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
4650 else {
4651 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0L);
4652 for (x = 0; x < numsaves; x++) {
4653 sprintf(s, "%s.DirCnrPos.%lu", szStateName, x);
4654 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4655 sprintf(s, "%s.DirCnrDir.%lu", szStateName, x);
4656 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4657 sprintf(s, "%s.DirCnrSort.%lu", szStateName, x);
4658 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4659 sprintf(s, "%s.DirCnrFilter.%lu", szStateName, x);
4660 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4661 sprintf(s, "%s.DirCnrView.%lu", szStateName, x);
4662 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4663 sprintf(s, "%s.DirCnr.%lu.DetailsLongname", szStateName, x);
4664 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4665 sprintf(s, "%s.DirCnr.%lu.DetailsSubject", szStateName, x);
4666 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4667 sprintf(s, "%s.DirCnr.%lu.DetailsSize", szStateName, x);
4668 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4669 sprintf(s, "%s.DirCnr.%lu.DetailsEA", szStateName, x);
4670 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4671 sprintf(s, "%s.DirCnr.%lu.DetailsAttr", szStateName, x);
4672 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4673 sprintf(s, "%s.DirCnr.%lu.DetailsIcon", szStateName, x);
4674 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4675 sprintf(s, "%s.DirCnr.%lu.DetailsLWDate", szStateName, x);
4676 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4677 sprintf(s, "%s.DirCnr.%lu.DetailsLWTime", szStateName, x);
4678 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4679 sprintf(s, "%s.DirCnr.%lu.DetailsLADate", szStateName, x);
4680 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4681 sprintf(s, "%s.DirCnr.%lu.DetailsLATime", szStateName, x);
4682 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4683 sprintf(s, "%s.DirCnr.%lu.DetailsCRDate", szStateName, x);
4684 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4685 sprintf(s, "%s.DirCnr.%lu.DetailsCRTime", szStateName, x);
4686 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4687 sprintf(s, "%s.DirCnr.%lu.Backgroundcolor", szStateName, x);
4688 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4689 sprintf(s, "%s.DirCnr.%lu.Fontnamesize", szStateName, x);
4690 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4691 }
4692 sprintf(s, "%s.LastTreePos", szStateName);
4693 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4694 sprintf(s, "%s.MySizeLastTime", szStateName);
4695 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4696 }
4697 PostMsg(hwnd, UM_FILLSETUPLIST, MPVOID, MPVOID);
4698 }
4699 }
4700 }
4701 break;
4702
4703 case IDM_IDEALSIZE:
4704 {
4705 SWP swp, swpD;
4706 ULONG icz = WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2L;
4707 ULONG bsz = WinQuerySysValue(HWND_DESKTOP, SV_CYSIZEBORDER);
4708
4709 WinQueryWindowPos(WinQueryWindow(hwnd, QW_PARENT), &swp);
4710 if (swp.fl & SWP_MAXIMIZE) {
4711 WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_SYSCOMMAND,
4712 MPFROM2SHORT(SC_RESTORE, 0), MPVOID);
4713 WinQueryWindowPos(WinQueryWindow(hwnd, QW_PARENT), &swp);
4714 }
4715 WinGetMaxPosition(WinQueryWindow(hwnd, QW_PARENT), &swpD);
4716 swpD.x += bsz;
4717 swpD.cx -= (bsz * 2);
4718 swpD.y += icz;
4719 swpD.cy -= (icz + bsz);
4720 if (swp.x == swpD.x && swp.y == swpD.y &&
4721 swp.cx == swpD.cx && swp.cy == swpD.cy &&
4722 // fixme to be #defined someday
4723 WinQueryWindowUShort(hwnd, QWL_USER + 10) &&
4724 WinQueryWindowUShort(hwnd, QWL_USER + 14)) {
4725 swpD.x = WinQueryWindowUShort(hwnd, QWL_USER + 8);
4726 swpD.cx = WinQueryWindowUShort(hwnd, QWL_USER + 10);
4727 swpD.y = WinQueryWindowUShort(hwnd, QWL_USER + 12);
4728 swpD.cy = WinQueryWindowUShort(hwnd, QWL_USER + 14);
4729 }
4730 else {
4731 WinSetWindowUShort(hwnd, QWL_USER + 8, (USHORT) swp.x);
4732 WinSetWindowUShort(hwnd, QWL_USER + 10, (USHORT) swp.cx);
4733 WinSetWindowUShort(hwnd, QWL_USER + 12, (USHORT) swp.y);
4734 WinSetWindowUShort(hwnd, QWL_USER + 14, (USHORT) swp.cy);
4735 }
4736 WinSetWindowPos(WinQueryWindow(hwnd, QW_PARENT), HWND_TOP,
4737 swpD.x, swpD.y, swpD.cx, swpD.cy, SWP_MOVE | SWP_SIZE);
4738 }
4739 break;
4740
4741 case IDM_BLINK:
4742 WinSetWindowPos(WinQueryWindow(hwnd, QW_PARENT), HWND_TOP, 0, 0, 0, 0,
4743 SWP_MINIMIZE);
4744 WinSetWindowPos(WinQueryWindow(hwnd, QW_PARENT), HWND_TOP, 0, 0, 0, 0,
4745 SWP_RESTORE | SWP_ZORDER);
4746 break;
4747
4748 case DID_CANCEL:
4749 {
4750 HWND hwndTop = TopWindow(hwndMain, (HWND) 0);
4751
4752 if (hwndTop)
4753 WinSetFocus(HWND_DESKTOP, hwndTop);
4754 }
4755 break;
4756
4757 case IDM_NOTEBOOK:
4758 case IDM_DIRCNRSETTINGS:
4759 case IDM_DIRVIEWSETTINGS:
4760 case IDM_DIRSORTSETTINGS:
4761 case IDM_COLLECTORVIEWSETTINGS:
4762 case IDM_COLLECTORSORTSETTINGS:
4763 case IDM_ARCHIVERSETTINGS:
4764 case IDM_TREECNRVIEWSETTINGS:
4765 case IDM_TREECNRSORTSETTINGS:
4766 case IDM_VIEWERSETTINGS:
4767 case IDM_VIEWERSETTINGS2:
4768 case IDM_COMPARESETTINGS:
4769 case IDM_MONOLITHICSETTINGS:
4770 case IDM_GENERALSETTINGS:
4771 case IDM_SCANSETTINGS:
4772 case IDM_BUBBLESSETTINGS:
4773 case IDM_QUICKSETTINGS:
4774 WinDlgBox(HWND_DESKTOP,
4775 hwnd, CfgDlgProc, FM3ModHandle, CFG_FRAME, MPFROMLONG(mp1));
4776 break;
4777
4778 case IDM_VIEWHELPS:
4779 case IDM_VIEWINFS:
4780 WinDlgBox(HWND_DESKTOP,
4781 HWND_DESKTOP,
4782 ViewInfProc,
4783 FM3ModHandle,
4784 VINF_FRAME,
4785 ((SHORT1FROMMP(mp1) == IDM_VIEWHELPS) ?
4786 MPFROMP(NullStr) : MPVOID));
4787 break;
4788
4789 case IDM_OPENWALK:
4790 {
4791 char newpath[CCHMAXPATH];
4792
4793 *newpath = 0;
4794 TopWindowName(hwnd, (HWND) 0, newpath);
4795 if (WinDlgBox(HWND_DESKTOP,
4796 hwnd,
4797 WalkAllDlgProc,
4798 FM3ModHandle, WALK_FRAME, MPFROMP(newpath)) && *newpath)
4799 OpenDirCnr((HWND) 0, hwndMain, hwndTree, FALSE, newpath);
4800 }
4801 break;
4802
4803 case IDM_WINDOWDLG:
4804 WindowList(hwnd);
4805 break;
4806
4807 case IDM_HELPMOUSE:
4808 case IDM_HELPCONTEXT:
4809 case IDM_HELPHINTS:
4810 case IDM_HELPPIX:
4811 case IDM_HELPTUTOR:
4812 case IDM_HELPUSERLIST:
4813 case IDM_HELP:
4814 case IDM_HELPCONTENTS:
4815 case IDM_HELPKEYS:
4816 case IDM_HELPGENERAL:
4817 if (hwndHelp) {
4818 if (SHORT1FROMMP(mp2) == CMDSRC_MENU) {
4819
4820 RECTL rcl;
4821 ULONG icz = WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2L;
4822
4823 WinQueryWindowRect(HWND_DESKTOP, &rcl);
4824 rcl.yBottom += icz;
4825 rcl.yTop -= icz;
4826 rcl.xLeft += icz;
4827 rcl.xRight -= icz;
4828 WinSendMsg(hwndHelp, HM_SET_COVERPAGE_SIZE, MPFROMP(&rcl), MPVOID);
4829 }
4830 else {
4831
4832 RECTL rcl;
4833
4834 WinQueryWindowRect(HWND_DESKTOP, &rcl);
4835 rcl.yBottom += 8;
4836 rcl.yTop = (rcl.yTop / 2) + (rcl.yTop / 7);
4837 rcl.xLeft = (rcl.xRight / 2) - (rcl.xRight / 7);
4838 rcl.xRight -= 8;
4839 WinSendMsg(hwndHelp, HM_SET_COVERPAGE_SIZE, MPFROMP(&rcl), MPVOID);
4840 }
4841 switch (SHORT1FROMMP(mp1)) {
4842 case IDM_HELPCONTEXT:
4843 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
4844 MPFROM2SHORT(HELP_CONTEXT, 0), MPFROMSHORT(HM_RESOURCEID));
4845 break;
4846
4847 case IDM_HELPMOUSE:
4848 if (hwndHelp)
4849 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
4850 MPFROM2SHORT(HELP_MOUSE, 0), MPFROMSHORT(HM_RESOURCEID));
4851 break;
4852
4853 case IDM_HELPPIX:
4854 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
4855 MPFROM2SHORT(HELP_BITMAP1, 0), MPFROMSHORT(HM_RESOURCEID));
4856 break;
4857
4858 case IDM_HELPTUTOR:
4859 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
4860 MPFROM2SHORT(HELP_TUTORIAL, 0),
4861 MPFROMSHORT(HM_RESOURCEID));
4862 break;
4863
4864 case IDM_HELPHINTS:
4865 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
4866 MPFROM2SHORT(HELP_HINTS, 0), MPFROMSHORT(HM_RESOURCEID));
4867 break;
4868
4869 case IDM_HELPGENERAL:
4870 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
4871 MPFROM2SHORT(HELP_MAIN, 0), MPFROMSHORT(HM_RESOURCEID));
4872 break;
4873 case IDM_HELPKEYS:
4874 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
4875 MPFROM2SHORT(HELP_KEYS, 0), MPFROMSHORT(HM_RESOURCEID));
4876 break;
4877
4878 case IDM_HELP:
4879 case IDM_HELPCONTENTS:
4880 WinSendMsg(hwndHelp, HM_HELP_CONTENTS, MPVOID, MPVOID);
4881 break;
4882
4883 case IDM_HELPUSERLIST:
4884 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
4885 MPFROM2SHORT(HELP_USERLISTS, 0),
4886 MPFROMSHORT(HM_RESOURCEID));
4887 break;
4888 }
4889 }
4890 break;
4891
4892 case IDM_EDITANYARCHIVER:
4893 EditArchiverDefinition(hwnd);
4894 break;
4895
4896 case IDM_ABOUT:
4897 WinDlgBox(HWND_DESKTOP, hwnd, AboutDlgProc, FM3ModHandle,
4898 ABT_FRAME, MPVOID);
4899 break;
4900
4901 case IDM_FONTPALETTE:
4902 OpenObject("<WP_FNTPAL>", Default, hwnd);
4903 break;
4904
4905 case IDM_HICOLORPALETTE:
4906 case IDM_COLORPALETTE:
4907 {
4908 CHAR *palette = "<WP_CLRPAL>";
4909 ULONG version[2];
4910
4911 if (!DosQuerySysInfo(QSV_VERSION_MAJOR, QSV_VERSION_MINOR,
4912 (PVOID) & version, (ULONG) sizeof(version))) {
4913 if (version[0] > 20L || (version[0] == 20L && version[1] > 29L)) {
4914 if (SHORT1FROMMP(mp1) == IDM_HICOLORPALETTE)
4915 palette = "<WP_HIRESCLRPAL>";
4916 else
4917 palette = "<WP_LORESCLRPAL>";
4918 }
4919 }
4920 OpenObject(palette, Default, hwnd);
4921 }
4922 break;
4923
4924 case IDM_SYSTEMSETUP:
4925 OpenObject("<WP_CONFIG>", Default, hwnd);
4926 break;
4927
4928 case IDM_SCHEMEPALETTE:
4929 {
4930 HOBJECT hWPSObject;
4931
4932 hWPSObject = WinQueryObject("<WP_SCHPAL>");
4933 if (hWPSObject != NULLHANDLE)
4934 WinSetObjectData(hWPSObject, "SCHEMES=Winter:PM_Winter,"
4935 "Spring:PM_Spring,Summer:PM_Summer,"
4936 "System:PM_System,Windows:PM_Windows;"
4937 "OPEN=DEFAULT");
4938 }
4939 break;
4940
4941 case IDM_SYSTEMCLOCK:
4942 OpenObject("<WP_CLOCK>", Default, hwnd);
4943 break;
4944
4945#ifdef NEVER
4946 case IDM_SYSINFO:
4947 WinDlgBox(HWND_DESKTOP, HWND_DESKTOP, SysInfoDlgProc, FM3ModHandle,
4948 SYS_FRAME, NULL);
4949 break;
4950#endif
4951
4952 case IDM_INSTANT:
4953 {
4954 CHAR path[CCHMAXPATH];
4955 PCNRITEM pci = (PCNRITEM) 0;
4956
4957 if (hwndTree)
4958 pci = (PCNRITEM) WinSendMsg(hwndTree, CM_QUERYRECORDEMPHASIS,
4959 MPFROMLONG(CMA_FIRST),
4960 MPFROMSHORT(CRA_CURSORED));
4961 if (pci && (INT) pci != -1) {
4962 strcpy(path, pci->pszFileName);
4963 MakeValidDir(path);
4964 }
4965 else
4966 save_dir2(path);
4967 WinDlgBox(HWND_DESKTOP, hwnd, InstantDlgProc, FM3ModHandle,
4968 BAT_FRAME, MPFROMP(path));
4969 }
4970 break;
4971
4972 case IDM_WINFULLSCREEN:
4973 case IDM_DOSCOMMANDLINE:
4974 case IDM_COMMANDLINE:
4975 {
4976 CHAR *env = GetCmdSpec(FALSE), path[CCHMAXPATH];
4977 INT type = SEPARATE | WINDOWED;
4978
4979 *path = 0;
4980 TopWindowName(hwnd, (HWND) 0, path);
4981 if (SHORT1FROMMP(mp1) == IDM_DOSCOMMANDLINE)
4982 env = GetCmdSpec(TRUE);
4983 else if (SHORT1FROMMP(mp1) != IDM_COMMANDLINE) {
4984 env = "WINOS2.COM";
4985 type = SEPARATE | FULLSCREEN;
4986 }
4987 runemf2(type, hwnd, pszSrcFile, __LINE__,
4988 path, NULL, "%s", env);
4989 }
4990 break;
4991
4992 case IDM_KILLPROC:
4993 WinDlgBox(HWND_DESKTOP, hwnd, KillDlgProc, FM3ModHandle,
4994 KILL_FRAME, NULL);
4995 break;
4996
4997 case IDM_AUTOVIEWCOMMENTS:
4998 case IDM_AUTOVIEWFILE:
4999 if (SHORT1FROMMP(mp1) == IDM_AUTOVIEWFILE)
5000 fComments = FALSE;
5001 else
5002 fComments = TRUE;
5003 PrfWriteProfileData(fmprof, FM3Str, "Comments", &fComments, sizeof(BOOL));
5004 WinSetWindowText((fComments) ? hwndAutoview : hwndAutoMLE, NullStr);
5005 goto AutoChange;
5006
5007 case IDM_AUTOVIEW:
5008 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER), SHORT1FROMMP(mp1),
5009 &fAutoView, TRUE, "AutoView");
5010 AutoChange:
5011 PostMsg(WinQueryWindow(hwnd, QW_PARENT), WM_UPDATEFRAME,
5012 MPFROMLONG(FCF_SIZEBORDER), MPVOID);
5013 if (fAutoView) {
5014
5015 CHAR s[CCHMAXPATH];
5016 HWND hwndDir;
5017 PCNRITEM pci;
5018
5019 hwndDir = TopWindowName(hwnd, (HWND) 0, s);
5020 if (hwndDir) {
5021 hwndDir = WinWindowFromID(hwndDir, FID_CLIENT);
5022 if (hwndDir) {
5023 hwndDir = WinWindowFromID(hwndDir, DIR_CNR);
5024 if (hwndDir) {
5025 pci = (PCNRITEM) WinSendMsg(hwndDir, CM_QUERYRECORDEMPHASIS,
5026 MPFROMLONG(CMA_FIRST),
5027 MPFROMSHORT(CRA_CURSORED));
5028 if (pci && (INT) pci != -1 &&
5029 (!(driveflags[toupper(*pci->pszFileName) - 'A'] & DRIVE_SLOW)))
5030 WinSendMsg(hwnd,
5031 UM_LOADFILE,
5032 MPFROMP(pci->pszFileName),
5033 (SHORT1FROMMP(mp1) == IDM_AUTOVIEW) ?
5034 MPVOID : MPFROMLONG(1));
5035 }
5036 }
5037 }
5038 }
5039 break;
5040
5041 case IDM_TEXTTOOLS:
5042 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER), SHORT1FROMMP(mp1),
5043 &fTextTools, TRUE, "TextTools");
5044 BuildTools(hwndToolback, TRUE);
5045 PostMsg(WinQueryWindow(hwnd, QW_PARENT), WM_UPDATEFRAME,
5046 MPFROMLONG(FCF_SIZEBORDER), MPVOID);
5047 break;
5048
5049 case IDM_TOOLTITLES:
5050 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER), SHORT1FROMMP(mp1),
5051 &fToolTitles, TRUE, "ToolTitles");
5052 BuildTools(hwndToolback, TRUE);
5053 PostMsg(WinQueryWindow(hwnd, QW_PARENT), WM_UPDATEFRAME,
5054 MPFROMLONG(FCF_SIZEBORDER), MPVOID);
5055 break;
5056
5057 case IDM_HIDEMENU:
5058 {
5059 HWND hwndMenu = WinQueryWindowULong(hwnd, QWL_USER);
5060 MenuInvisible = MenuInvisible ? FALSE : TRUE;
5061 if (MenuInvisible) {
5062 WinSetParent(hwndMenu, HWND_OBJECT, FALSE);
5063 WinSetMenuItemText(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
5064 FID_SYSMENU), IDM_HIDEMENU,
5065 GetPString(IDS_UNHIDEMENUTEXT));
5066 }
5067 else {
5068 WinSetParent(hwndMenu, WinQueryWindow(hwnd, QW_PARENT), FALSE);
5069 WinSetMenuItemText(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
5070 FID_SYSMENU), IDM_HIDEMENU,
5071 GetPString(IDS_HIDEMENUTEXT));
5072 }
5073 PostMsg(WinQueryWindow(hwnd, QW_PARENT), WM_UPDATEFRAME,
5074 MPFROMLONG(FCF_MENU), MPVOID);
5075 PrfWriteProfileData(fmprof, FM3Str, "MenuInvisible",
5076 &MenuInvisible, sizeof(BOOL));
5077 }
5078 break;
5079
5080 case IDM_SEEALL:
5081 case IDM_GREP:
5082 case IDM_COLLECTOR:
5083 {
5084 HWND hwndC;
5085 SWP swp;
5086 BOOL already = FALSE;
5087
5088 if (Collector)
5089 already = TRUE;
5090 if (!already && !fAutoTile && !fExternalCollector)
5091 GetNextWindowPos(hwnd, &swp, NULL, NULL);
5092 hwndC = StartCollector(fExternalCollector ? HWND_DESKTOP : hwnd, 4);
5093 if (hwndC) {
5094 if (!already && !fAutoTile && !fExternalCollector)
5095 WinSetWindowPos(hwndC, HWND_TOP,
5096 swp.x, swp.y, swp.cx, swp.cy,
5097 SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_ZORDER);
5098 else if (fAutoTile && !already)
5099 TileChildren(hwnd, TRUE);
5100 WinSetWindowPos(hwndC, HWND_TOP, 0, 0, 0, 0, SWP_SHOW | SWP_RESTORE |
5101 SWP_ACTIVATE);
5102 if (SHORT1FROMMP(mp1) == IDM_GREP)
5103 PostMsg(WinWindowFromID(hwndC, FID_CLIENT), WM_COMMAND,
5104 MPFROM2SHORT(IDM_GREP, 0), MPVOID);
5105 if (SHORT1FROMMP(mp1) == IDM_SEEALL)
5106 PostMsg(WinWindowFromID(hwndC, FID_CLIENT), WM_COMMAND,
5107 MPFROM2SHORT(IDM_SEEALL, 0), MPVOID);
5108 }
5109 }
5110 break;
5111
5112 case IDM_TOOLLEFT:
5113 case IDM_TOOLRIGHT:
5114 {
5115 TOOL *tool;
5116
5117 if (!toolhead || !toolhead->next) {
5118 firsttool = (toolhead) ? toolhead->id : 0;
5119 break;
5120 }
5121 tool = find_tool(firsttool);
5122 if (!tool)
5123 tool = toolhead;
5124 if (SHORT1FROMMP(mp1) == IDM_TOOLRIGHT) {
5125 tool = prev_tool(tool, TRUE);
5126 firsttool = tool->id;
5127 }
5128 else {
5129 tool = next_tool(tool, TRUE);
5130 firsttool = tool->id;
5131 }
5132 ResizeTools(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
5133 MAIN_TOOLS));
5134 }
5135 break;
5136
5137 case IDM_CREATETOOL:
5138 BuildTools(hwndToolback, TRUE);
5139 break;
5140
5141 case IDM_TOOLBAR:
5142 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
5143 IDM_TOOLSUBMENU, &fToolbar, TRUE, "Toolbar");
5144 BuildTools(hwndToolback, TRUE);
5145 WinShowWindow(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
5146 MAIN_TOOLS), fToolbar);
5147 WinSendMsg(WinQueryWindow(hwnd, QW_PARENT),
5148 WM_UPDATEFRAME, MPFROMLONG(FCF_SIZEBORDER), MPVOID);
5149 if (fDrivebar)
5150 WinInvalidateRect(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
5151 MAIN_DRIVES), NULL, TRUE);
5152 break;
5153
5154 case IDM_DRIVEBAR:
5155 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
5156 IDM_DRIVEBAR, &fDrivebar, TRUE, "Drivebar");
5157 WinShowWindow(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
5158 MAIN_DRIVES), fDrivebar);
5159 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
5160 WM_UPDATEFRAME, MPFROMLONG(FCF_SIZEBORDER), MPVOID);
5161 PostMsg(hwnd, UM_BUILDDRIVEBAR, MPVOID, MPVOID);
5162 break;
5163
5164 case IDM_USERLIST:
5165 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
5166 SHORT1FROMMP(mp1), &fUserComboBox, TRUE, "UserComboBox");
5167 WinShowWindow(hwndUserlist, fUserComboBox);
5168 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
5169 WM_UPDATEFRAME, MPFROMLONG(FCF_SIZEBORDER), MPVOID);
5170 PostMsg(hwnd, UM_FILLUSERLIST, MPVOID, MPVOID);
5171 PostMsg(hwnd, UM_FILLSETUPLIST, MPVOID, MPVOID);
5172 PostMsg(hwnd, UM_FILLCMDLIST, MPVOID, MPVOID);
5173 PostMsg(hwnd, UM_FILLBUTTONLIST, MPVOID, MPVOID);
5174 break;
5175
5176 case IDM_MOREBUTTONS:
5177 WinSetWindowText(hwndName, NullStr);
5178 WinSetWindowText(hwndDate, NullStr);
5179 WinSetWindowText(hwndAttr, NullStr);
5180 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
5181 SHORT1FROMMP(mp1), &fMoreButtons, TRUE, "MoreButtons");
5182 if (fMoreButtons) {
5183
5184 HWND hwndTemp;
5185
5186 hwndTemp = TopWindow(hwnd, (HWND) 0);
5187
5188 if (hwndTemp) {
5189 WinSetFocus(HWND_DESKTOP, hwnd);
5190 WinSetFocus(HWND_DESKTOP, hwndTemp);
5191 }
5192 }
5193 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
5194 WM_UPDATEFRAME, MPFROMLONG(FCF_SIZEBORDER), MPVOID);
5195 break;
5196
5197 case IDM_TOGGLEDRAGDIALOG:
5198 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
5199 IDM_TOGGLEDRAGDIALOG,
5200 &fDragndropDlg,
5201 TRUE,
5202 "Drag&DropDlg");
5203 break;
5204
5205 case IDM_SYNCUPDATES:
5206 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
5207 IDM_SYNCUPDATES,
5208 &fSyncUpdates,
5209 TRUE,
5210 "SyncUpdates");
5211 break;
5212
5213 case IDM_FREETREE:
5214 if (fFreeTree) {
5215 SWP swp, swpT;
5216
5217 WinQueryWindowPos(hwndTree, &swpT);
5218 WinQueryWindowPos(hwnd, &swp);
5219 WinSetWindowPos(hwndTree, HWND_TOP, 0, swp.cy - swpT.cy, 0, 0,
5220 SWP_MOVE);
5221 }
5222 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER), SHORT1FROMMP(mp1),
5223 &fFreeTree, TRUE, "FreeTree");
5224 if (fAutoTile)
5225 TileChildren(hwnd, TRUE);
5226 break;
5227
5228 case IDM_AUTOTILE:
5229 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
5230 SHORT1FROMMP(mp1), &fAutoTile, TRUE, "AutoTile");
5231 if (fAutoTile)
5232 TileChildren(hwnd, TRUE);
5233 break;
5234
5235 case IDM_TILEBACKWARDS:
5236 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
5237 SHORT1FROMMP(mp1), &fTileBackwards, TRUE, "TileBackwards");
5238 if (fAutoTile)
5239 TileChildren(hwnd, TRUE);
5240 break;
5241
5242 case IDM_NEXTWINDOW:
5243 case IDM_PREVWINDOW:
5244 NextChild(hwnd, (SHORT1FROMMP(mp1) == IDM_PREVWINDOW));
5245 break;
5246
5247 case IDM_CASCADE:
5248 CascadeChildren(hwnd);
5249 break;
5250
5251 case IDM_TILE:
5252 TileChildren(hwnd, TRUE);
5253 break;
5254
5255 case IDM_RESTORE:
5256 MinResChildren(hwnd, SWP_RESTORE);
5257 break;
5258
5259 case IDM_MINIMIZE:
5260 MinResChildren(hwnd, SWP_MINIMIZE);
5261 break;
5262
5263 case IDM_ARRANGEICONS:
5264 ArrangeIcons(hwnd);
5265 break;
5266
5267 case IDM_INIVIEWER:
5268 StartIniEditor(hwnd, NULL, 4);
5269 break;
5270
5271 case IDM_EDITASSOC:
5272 EditAssociations(hwnd);
5273 break;
5274
5275 case IDM_EDITCOMMANDS:
5276 EditCommands(hwnd);
5277 PostMsg(hwnd, UM_FILLCMDLIST, MPVOID, MPVOID);
5278 break;
5279
5280 default:
5281 if (!SwitchCommand((HWND) WinQueryWindowULong(hwnd, QWL_USER),
5282 SHORT1FROMMP(mp1))) {
5283 if (SHORT1FROMMP(mp1) >= IDM_COMMANDSTART &&
5284 SHORT1FROMMP(mp1) < IDM_QUICKTOOLSTART) {
5285
5286 INT x;
5287 HWND hwndCnr;
5288
5289 if (!cmdloaded)
5290 load_commands();
5291 hwndCnr = TopWindow(hwnd, (HWND) 0);
5292 hwndCnr = (HWND) WinSendMsg(WinWindowFromID(hwndCnr, FID_CLIENT),
5293 UM_CONTAINERHWND, MPVOID, MPVOID);
5294 if (!hwndCnr) {
5295 Runtime_Error2(pszSrcFile, __LINE__, IDS_NOWINDOWTEXT);
5296 break;
5297 }
5298 x = SHORT1FROMMP(mp1) - IDM_COMMANDSTART;
5299 if (x >= 0) {
5300 x++;
5301 RunCommand(hwndCnr, x);
5302 if (fUnHilite) {
5303
5304 PCNRITEM pci;
5305 DIRCNRDATA *dcd = NULL;
5306
5307 // 12 May 07 SHL fixme to understand? backwards maybe? looking for DIR_CNR?
5308 if (WinQueryWindowUShort(hwndCnr, QWS_ID) != TREE_CNR)
5309 dcd = INSTDATA(hwndCnr);
5310 pci = (PCNRITEM) WinSendMsg(hwndCnr,
5311 CM_QUERYRECORDEMPHASIS,
5312 MPFROMLONG(CMA_FIRST),
5313 MPFROMSHORT(CRA_CURSORED));
5314 if (pci && (INT) pci != -1 &&
5315 (pci->rc.flRecordAttr & CRA_SELECTED))
5316 {
5317 UnHilite(hwnd,
5318 TRUE,
5319 dcd ? &dcd->lastselection : NULL,
5320 dcd ? dcd ->ulItemsToUnHilite : 0);
5321 }
5322 }
5323 }
5324 }
5325 else if (SHORT1FROMMP(mp1) >= IDM_QUICKTOOLSTART &&
5326 SHORT1FROMMP(mp1) < IDM_QUICKTOOLSTART + 50) {
5327 if (!qtloaded)
5328 load_quicktools();
5329 if (quicktool[SHORT1FROMMP(mp1) - IDM_QUICKTOOLSTART]) {
5330 if (fToolsChanged)
5331 save_tools(NULL);
5332 if (!load_tools(quicktool[SHORT1FROMMP(mp1) - IDM_QUICKTOOLSTART]))
5333 load_tools(NULL);
5334 else {
5335 strcpy(lasttoolbox,
5336 quicktool[SHORT1FROMMP(mp1) - IDM_QUICKTOOLSTART]);
5337 PrfWriteProfileString(fmprof, FM3Str, "LastToolBox", lasttoolbox);
5338 }
5339 BuildTools(hwndToolback, TRUE);
5340 }
5341 }
5342 else {
5343
5344 HWND hwndActive;
5345
5346 hwndActive = TopWindow(hwnd, (HWND) 0);
5347 if (hwndActive)
5348 PostMsg(WinWindowFromID(hwndActive, FID_CLIENT),
5349 WM_COMMAND, mp1, mp2);
5350 }
5351 }
5352 break; // default
5353 } // switch mp1
5354 return 0;
5355}
5356
5357static MRESULT EXPENTRY MainWMOnce(HWND hwnd, ULONG msg, MPARAM mp1,
5358 MPARAM mp2)
5359{
5360 TID tid;
5361 SWP swp;
5362 PFNWP oldproc;
5363 HWND hwndTmp;
5364 HWND hwndFrame;
5365 HWND hwndSysMenu, hwndSysSubMenu, hwndMenu;
5366 USHORT idSysMenu;
5367 MENUITEM mi, mit;
5368 ULONG size;
5369 BOOL temp = FALSE;
5370
5371 switch (msg) {
5372 case WM_CREATE:
5373 WinQueryWindowProcess(hwnd, &mypid, &tid);
5374 hwndMain = hwnd;
5375 WinSetWindowUShort(hwnd, QWL_USER + 8, 0);
5376 WinSetWindowUShort(hwnd, QWL_USER + 10, 0);
5377 WinSetWindowUShort(hwnd, QWL_USER + 12, 0);
5378 WinSetWindowUShort(hwnd, QWL_USER + 16, 0);
5379 if (_beginthread(MakeMainObjWin, NULL, 245760, MPVOID) == -1) {
5380 Runtime_Error(pszSrcFile, __LINE__,
5381 GetPString(IDS_COULDNTSTARTTHREADTEXT));
5382 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
5383 return 0;
5384 }
5385 else
5386 DosSleep(32);//05 Aug 07 GKY 64
5387
5388 hwndFrame = WinQueryWindow(hwnd, QW_PARENT);
5389
5390 /*
5391 * create frame children (not client children, frame children)
5392 */
5393 DosSleep(1);
5394 WinQueryWindowPos(hwndFrame, &swp);
5395 oldproc = WinSubclassWindow(hwndFrame, MainFrameWndProc);
5396 WinSetWindowPtr(hwndFrame, QWL_USER, (PVOID) oldproc);
5397 CommonCreateMainChildren(hwnd, &swp);
5398
5399 if (!WinCreateWindow(hwndFrame,
5400 WC_BUTTON,
5401 "I",
5402 WS_VISIBLE | BS_PUSHBUTTON | BS_NOPOINTERFOCUS,
5403 ((swp.cx -
5404 WinQuerySysValue(HWND_DESKTOP,
5405 SV_CXMINMAXBUTTON)) -
5406 WinQuerySysValue(HWND_DESKTOP,
5407 SV_CXMINMAXBUTTON) / 2) -
5408 WinQuerySysValue(HWND_DESKTOP,
5409 SV_CXSIZEBORDER),
5410 (swp.cy - WinQuerySysValue(HWND_DESKTOP,
5411 SV_CYMINMAXBUTTON)) -
5412 WinQuerySysValue(HWND_DESKTOP,
5413 SV_CYSIZEBORDER),
5414 WinQuerySysValue(HWND_DESKTOP,
5415 SV_CXMINMAXBUTTON) / 2,
5416 WinQuerySysValue(HWND_DESKTOP,
5417 SV_CYMINMAXBUTTON),
5418 hwnd, HWND_TOP, IDM_IDEALSIZE, NULL, NULL)) {
5419 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
5420 }
5421 else {
5422 WinSubclassWindow(WinWindowFromID(hwndFrame, IDM_IDEALSIZE),
5423 IdealButtonProc);
5424 SetPresParams(WinWindowFromID(hwndFrame,
5425 IDM_IDEALSIZE),
5426 NULL, NULL, NULL, GetPString(IDS_10SYSTEMVIOTEXT));
5427 }
5428
5429 hwndTmp = WinCreateWindow(hwndFrame,
5430 WC_BUTTON,
5431 "#1019",
5432 WS_VISIBLE | BS_PUSHBUTTON | BS_NOPOINTERFOCUS |
5433 BS_BITMAP,
5434 swp.cx - 46,
5435 swp.y + 2,
5436 24,
5437 22, hwnd, HWND_TOP, IDM_OPENWALK, NULL, NULL);
5438 if (!hwndTmp)
5439 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
5440
5441 hwndTmp = WinCreateWindow(hwndFrame,
5442 WC_BUTTON,
5443 "#3062",
5444 WS_VISIBLE | BS_PUSHBUTTON | BS_NOPOINTERFOCUS |
5445 BS_BITMAP,
5446 swp.cx - 22,
5447 swp.y + 2,
5448 24,
5449 22, hwnd, HWND_TOP, IDM_USERLIST, NULL, NULL);
5450 if (!hwndTmp)
5451 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
5452
5453 hwndUserlist = WinCreateWindow(hwndFrame,
5454 WC_COMBOBOX,
5455 (PSZ) NULL,
5456 WS_VISIBLE | CBS_DROPDOWN |
5457 LS_HORZSCROLL,
5458 (swp.x +
5459 WinQuerySysValue(HWND_DESKTOP,
5460 SV_CXSIZEBORDER) + 48L),
5461 (swp.cy -
5462 WinQuerySysValue(HWND_DESKTOP,
5463 SV_CYSIZEBORDER)) - 60,
5464 ((swp.cx -
5465 (WinQuerySysValue(HWND_DESKTOP,
5466 SV_CXSIZEBORDER) *
5467 2)) - 64L), 60L, hwndFrame, HWND_TOP,
5468 MAIN_USERLIST, NULL, NULL);
5469 if (!hwndUserlist)
5470 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
5471 hwndCmdlist = WinCreateWindow(hwndFrame,
5472 WC_COMBOBOX,
5473 (PSZ) NULL,
5474 WS_VISIBLE | CBS_DROPDOWN |
5475 LS_HORZSCROLL,
5476 (swp.x +
5477 WinQuerySysValue(HWND_DESKTOP,
5478 SV_CXSIZEBORDER) + 48L),
5479 (swp.cy -
5480 WinQuerySysValue(HWND_DESKTOP,
5481 SV_CYSIZEBORDER)) - 60,
5482 ((swp.cx -
5483 (WinQuerySysValue(HWND_DESKTOP,
5484 SV_CXSIZEBORDER) * 2)) -
5485 64L), 60L, hwndFrame, HWND_TOP,
5486 MAIN_CMDLIST, NULL, NULL);
5487 if (!hwndCmdlist)
5488 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
5489 WinSetWindowText(hwndCmdlist, GetPString(IDS_COMMANDSTEXT));
5490 hwndStatelist = WinCreateWindow(hwndFrame,
5491 WC_COMBOBOX,
5492 (PSZ) NULL,
5493 WS_VISIBLE | CBS_DROPDOWN |
5494 LS_HORZSCROLL,
5495 (swp.x +
5496 WinQuerySysValue(HWND_DESKTOP,
5497 SV_CXSIZEBORDER) + 48L),
5498 (swp.cy -
5499 WinQuerySysValue(HWND_DESKTOP,
5500 SV_CYSIZEBORDER)) - 60,
5501 ((swp.cx -
5502 (WinQuerySysValue(HWND_DESKTOP,
5503 SV_CXSIZEBORDER) *
5504 2)) - 64L), 60L, hwndFrame, HWND_TOP,
5505 MAIN_SETUPLIST, NULL, NULL);
5506 if (!hwndStatelist)
5507 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
5508
5509 hwndDrivelist = WinCreateWindow(hwndFrame,
5510 WC_COMBOBOX,
5511 (PSZ) NULL,
5512 WS_VISIBLE | CBS_DROPDOWN,
5513 (swp.x +
5514 WinQuerySysValue(HWND_DESKTOP,
5515 SV_CXSIZEBORDER)),
5516 (swp.cy -
5517 WinQuerySysValue(HWND_DESKTOP,
5518 SV_CYSIZEBORDER)) - 60,
5519 48L,
5520 60L,
5521 hwndFrame,
5522 HWND_TOP, MAIN_DRIVELIST, NULL, NULL);
5523 if (!hwndDrivelist)
5524 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
5525 SetPresParams(hwndDrivelist,
5526 NULL, NULL, NULL, GetPString(IDS_10SYSTEMMONOTEXT));
5527 hwndButtonlist = WinCreateWindow(hwndFrame,
5528 WC_COMBOBOX,
5529 (PSZ) NULL,
5530 WS_VISIBLE | CBS_DROPDOWN |
5531 LS_HORZSCROLL,
5532 (swp.cx -
5533 WinQuerySysValue(HWND_DESKTOP,
5534 SV_CXSIZEBORDER)) -
5535 164L,
5536 (swp.cy -
5537 WinQuerySysValue(HWND_DESKTOP,
5538 SV_CYSIZEBORDER)) - 60,
5539 164L, 60L, hwndFrame, HWND_TOP,
5540 MAIN_BUTTONLIST, NULL, NULL);
5541 if (!hwndButtonlist)
5542 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
5543 WinSendMsg(WinWindowFromID(hwndUserlist, CBID_EDIT),
5544 EM_SETTEXTLIMIT, MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
5545 WinSendMsg(WinWindowFromID(hwndStatelist, CBID_EDIT),
5546 EM_SETTEXTLIMIT, MPFROM2SHORT(STATE_NAME_MAX_BYTES, 0), MPVOID);
5547 WinSendMsg(WinWindowFromID(hwndDrivelist, CBID_EDIT),
5548 EM_SETREADONLY, MPFROM2SHORT(TRUE, 0), MPVOID);
5549 WinSendMsg(WinWindowFromID(hwndButtonlist, CBID_EDIT),
5550 EM_SETREADONLY, MPFROM2SHORT(TRUE, 0), MPVOID);
5551 WinSendMsg(WinWindowFromID(hwndCmdlist, CBID_EDIT),
5552 EM_SETREADONLY, MPFROM2SHORT(TRUE, 0), MPVOID);
5553
5554 oldproc = WinSubclassWindow(WinWindowFromID(hwndUserlist, CBID_EDIT),
5555 DropDownListProc);
5556 WinSetWindowPtr(WinWindowFromID(hwndUserlist, CBID_EDIT),
5557 QWL_USER, (PVOID) oldproc);
5558 oldproc = WinSubclassWindow(WinWindowFromID(hwndCmdlist, CBID_EDIT),
5559 DropDownListProc);
5560 WinSetWindowPtr(WinWindowFromID(hwndCmdlist, CBID_EDIT),
5561 QWL_USER, (PVOID) oldproc);
5562 oldproc = WinSubclassWindow(WinWindowFromID(hwndButtonlist, CBID_EDIT),
5563 DropDownListProc);
5564 WinSetWindowPtr(WinWindowFromID(hwndButtonlist, CBID_EDIT),
5565 QWL_USER, (PVOID) oldproc);
5566 oldproc = WinSubclassWindow(WinWindowFromID(hwndStatelist, CBID_EDIT),
5567 DropDownListProc);
5568 WinSetWindowPtr(WinWindowFromID(hwndStatelist, CBID_EDIT),
5569 QWL_USER, (PVOID) oldproc);
5570 oldproc = WinSubclassWindow(WinWindowFromID(hwndDrivelist, CBID_EDIT),
5571 DropDownListProc);
5572 WinSetWindowPtr(WinWindowFromID(hwndDrivelist, CBID_EDIT),
5573 QWL_USER, (PVOID) oldproc);
5574 oldproc = WinSubclassWindow(hwndUserlist, DropDownListProc);
5575 WinSetWindowPtr(hwndUserlist, QWL_USER, (PVOID) oldproc);
5576 oldproc = WinSubclassWindow(hwndCmdlist, DropDownListProc);
5577 WinSetWindowPtr(hwndCmdlist, QWL_USER, (PVOID) oldproc);
5578 oldproc = WinSubclassWindow(hwndStatelist, DropDownListProc);
5579 WinSetWindowPtr(hwndStatelist, QWL_USER, (PVOID) oldproc);
5580 oldproc = WinSubclassWindow(hwndDrivelist, DropDownListProc);
5581 WinSetWindowPtr(hwndDrivelist, QWL_USER, (PVOID) oldproc);
5582 oldproc = WinSubclassWindow(hwndButtonlist, DropDownListProc);
5583 WinSetWindowPtr(hwndButtonlist, QWL_USER, (PVOID) oldproc);
5584 oldproc = WinSubclassWindow(WinWindowFromID(hwndFrame, IDM_USERLIST),
5585 ChildFrameButtonProc);
5586 WinSetWindowPtr(WinWindowFromID(hwndFrame, IDM_USERLIST),
5587 QWL_USER, (PVOID) oldproc);
5588 oldproc = WinSubclassWindow(WinWindowFromID(hwndFrame, IDM_OPENWALK),
5589 ChildFrameButtonProc);
5590 WinSetWindowPtr(WinWindowFromID(hwndFrame, IDM_OPENWALK),
5591 QWL_USER, (PVOID) oldproc);
5592 hwndMenu = WinWindowFromID(hwndFrame, FID_MENU);
5593 WinSendMsg(hwnd, UM_ADDTOMENU, MPVOID, MPVOID);
5594 SetToggleChecks(hwndMenu);
5595 CfgMenuInit(hwndMenu, FALSE); // 14 Feb 08 SHL
5596 SetConditionalCascade(hwndMenu, IDM_COMMANDLINESUBMENU, IDM_COMMANDLINE);
5597 SetConditionalCascade(hwndMenu, IDM_TOOLSUBMENU, IDM_TOOLBAR);
5598 SetConditionalCascade(hwndMenu, IDM_AUTOVIEWSUBMENU, IDM_AUTOVIEW);
5599 SetConditionalCascade(hwndMenu, IDM_TILEMENU, IDM_TILE);
5600 WinSetWindowULong(hwnd, QWL_USER, hwndMenu);
5601 memset(&mi, 0, sizeof(mi));
5602 memset(&mit, 0, sizeof(mit));
5603 hwndSysMenu = WinWindowFromID(hwndFrame, FID_SYSMENU);
5604 idSysMenu = SHORT1FROMMR(WinSendMsg(hwndSysMenu,
5605 MM_ITEMIDFROMPOSITION,
5606 MPVOID, MPVOID));
5607 WinSendMsg(hwndSysMenu,
5608 MM_QUERYITEM, MPFROM2SHORT(idSysMenu, 0), MPFROMP(&mit));
5609 hwndSysSubMenu = mit.hwndSubMenu;
5610 mi.iPosition = MIT_END;
5611 mi.afStyle = MIS_SEPARATOR;
5612 mi.id = (USHORT) - 1;
5613 WinSendMsg(hwndSysSubMenu, MM_INSERTITEM, MPFROMP(&mi), MPFROMP(NULL));
5614 mi.afStyle = MIS_TEXT;
5615 mi.id = IDM_IDEALSIZE;
5616 WinSendMsg(hwndSysSubMenu,
5617 MM_INSERTITEM,
5618 MPFROMP(&mi), MPFROMP(GetPString(IDS_IDEALMENUTEXT)));
5619 mi.afStyle = MIS_TEXT;
5620 mi.id = IDM_HIDEMENU;
5621 WinSendMsg(hwndSysSubMenu,
5622 MM_INSERTITEM,
5623 MPFROMP(&mi), MPFROMP(GetPString(IDS_HIDEMENUTEXT)));
5624 SetSysMenu(hwndSysMenu);
5625
5626 size = sizeof(BOOL);
5627 if (PrfQueryProfileData(fmprof,
5628 FM3Str,
5629 "MenuInvisible", &temp, &size) && size && temp)
5630 WinSendMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_HIDEMENU, 0), MPVOID);
5631 size = sizeof(BOOL);
5632 if (PrfQueryProfileData(fmprof,
5633 FM3Str, "FreeTree", &temp, &size) && size && temp)
5634 WinSendMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_FREETREE, 0), MPVOID);
5635 size = sizeof(BOOL);
5636 if (PrfQueryProfileData(fmprof,
5637 FM3Str,
5638 "AutoTile", &temp, &size) && size && !temp)
5639 WinSendMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_AUTOTILE, 0), MPVOID);
5640 size = sizeof(BOOL);
5641 if (PrfQueryProfileData(fmprof,
5642 FM3Str, "Toolbar", &temp, &size) && size && !temp)
5643 WinSendMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_TOOLBAR, 0), MPVOID);
5644
5645 WinSetWindowText(WinWindowFromID(hwndFrame, FID_TITLEBAR), "FM/2");
5646 FixSwitchList(hwndFrame, NULL);
5647 break; // WM_CREATE
5648
5649 case UM_SETUP:
5650 /*
5651 * start up some initial children
5652 */
5653 load_tools(NULL);
5654 BuildTools(hwndToolback, TRUE);
5655 WinShowWindow(WinQueryWindow(hwnd, QW_PARENT), TRUE);
5656 PostMsg(MainObjectHwnd, UM_SETUP2, mp1, mp2);
5657 return 0;
5658
5659 case UM_SETUP2:
5660 {
5661 SWP swp;
5662 ULONG size = sizeof(SWP);
5663
5664 WinQueryWindowPos(hwnd, &swp);
5665 hwndTree = StartTreeCnr(hwnd, 4);
5666 if (!hwndTree)
5667 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
5668 else {
5669 if (!fSaveState ||
5670 !PrfQueryProfileData(fmprof,
5671 FM3Str,
5672 "LastTreePos",
5673 &swp, &size) || size != sizeof(SWP)) {
5674
5675 INT ratio, height = 0;
5676
5677 if (!fNoTreeGap)
5678 height = WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2;
5679 size = sizeof(ratio);
5680 if (!PrfQueryProfileData(fmprof,
5681 FM3Str,
5682 "TreeWindowRatio",
5683 (PVOID) & ratio,
5684 &size) || size < sizeof(ratio))
5685 ratio = 400;
5686 WinSetWindowPos(hwndTree,
5687 HWND_TOP,
5688 0,
5689 height,
5690 (swp.cx * 100) / ratio,
5691 swp.cy - height,
5692 SWP_SHOW | SWP_SIZE | SWP_MOVE |
5693 SWP_ACTIVATE | SWP_ZORDER);
5694 }
5695 else
5696 WinSetWindowPos(hwndTree,
5697 HWND_TOP,
5698 swp.x,
5699 swp.y,
5700 swp.cx,
5701 swp.cy,
5702 swp.fl | SWP_MOVE | SWP_SIZE | SWP_SHOW |
5703 SWP_ZORDER | SWP_ACTIVATE);
5704 }
5705 ResizeTools(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
5706 MAIN_TOOLS));
5707 }
5708 PostMsg(MainObjectHwnd, UM_SETUP3, mp1, mp2);
5709 return 0;
5710
5711 case UM_SETUP3:
5712 /* start remaining child windows */
5713 if (!fNoSaveState && fSaveState)
5714 PostMsg(MainObjectHwnd, UM_RESTORE, MPFROMP(GetPString(IDS_SHUTDOWNSTATE)), MPVOID);
5715 PostMsg(MainObjectHwnd, UM_SETUP4, mp1, mp2);
5716 return 0;
5717
5718 case UM_SETUP4:
5719 {
5720 INT argc = (INT) mp1, x;
5721 CHAR **argv = (CHAR **) mp2;
5722
5723 for (x = 1; x < argc; x++) {
5724 if (*argv[x] == '/' || *argv[x] == ';')
5725 continue;
5726 if (!IsFile(argv[x]) && !FindDirCnrByName(argv[x], FALSE))
5727 OpenDirCnr((HWND) 0, hwndMain, hwndTree, TRUE, argv[x]);
5728 }
5729 }
5730 PostMsg(MainObjectHwnd, UM_SETUP5, MPVOID, MPVOID);
5731 return 0;
5732
5733 case UM_SETUP5:
5734 if (fAutoTile)
5735 TileChildren(hwnd, TRUE);
5736 PostMsg(hwnd, UM_FILLUSERLIST, MPVOID, MPVOID);
5737 PostMsg(hwnd, UM_FILLSETUPLIST, MPVOID, MPVOID);
5738 PostMsg(hwnd, UM_FILLCMDLIST, MPVOID, MPVOID);
5739 PostMsg(hwnd, UM_FILLBUTTONLIST, MPVOID, MPVOID);
5740 {
5741 HWND hwndActive;
5742
5743 hwndActive = TopWindow(hwnd, hwndTree);
5744 if (hwndActive)
5745 WinSetWindowPos(hwndActive, HWND_TOP, 0, 0, 0, 0, SWP_ACTIVATE);
5746 }
5747 if (fStartMinimized || fReminimize)
5748 PostMsg(hwndTree, UM_MINIMIZE, MPVOID, MPVOID);
5749 else if (fStartMaximized)
5750 PostMsg(hwndTree, UM_MAXIMIZE, MPVOID, MPVOID);
5751 fRunning = TRUE;
5752 if (fWantFirstTimeInit) {
5753 fWantFirstTimeInit = FALSE;
5754 PostMsg(hwnd, WM_COMMAND, MPFROMLONG(IDM_QUICKSETTINGS), MPVOID);
5755 }
5756# ifdef FORTIFY
5757 Fortify_EnterScope();
5758# endif
5759 return 0;
5760 }
5761
5762 return WinDefWindowProc(hwnd, msg, mp1, mp2);
5763}
5764
5765MRESULT EXPENTRY MainWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
5766{
5767 switch (msg) {
5768 case WM_CREATE:
5769 case UM_SETUP:
5770 case UM_SETUP2:
5771 case UM_SETUP3:
5772 case UM_SETUP4:
5773 case UM_SETUP5:
5774 return MainWMOnce(hwnd, msg, mp1, mp2);
5775
5776 case WM_CONTROLPOINTER:
5777 if (!fNoFinger &&
5778 (SHORT1FROMMP(mp1) == IDM_OPENWALK ||
5779 SHORT1FROMMP(mp1) == IDM_USERLIST))
5780 return MRFROMLONG(hptrFinger);
5781 break;
5782
5783 case UM_LOADFILE:
5784 case UM_THREADUSE:
5785 case UM_BUILDDRIVEBAR:
5786 return CommonMainWndProc(hwnd, msg, mp1, mp2);
5787
5788 case WM_BUTTON1UP:
5789 case WM_BUTTON2UP:
5790 case WM_BUTTON3UP:
5791 case WM_MOUSEMOVE:
5792 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
5793 break;
5794
5795 case WM_CHAR:
5796 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
5797 break;
5798
5799 case WM_MENUEND:
5800 if ((HWND) mp2 == MainPopupMenu) {
5801 WinDestroyWindow(MainPopupMenu);
5802 MainPopupMenu = (HWND) 0;
5803 }
5804 break;
5805
5806 case UM_CONTEXTMENU:
5807 case WM_CONTEXTMENU:
5808 if (CheckMenu(hwndMainMenu, &MainPopupMenu, MAIN_POPUP)) {
5809 SetToggleChecks(MainPopupMenu);
5810 PopupMenu(hwnd, hwnd, MainPopupMenu);
5811 }
5812 if (msg == UM_CONTEXTMENU)
5813 return 0;
5814 return MRFROMSHORT(TRUE);
5815
5816 case UM_SETUSERLISTNAME:
5817 if (mp1) {
5818 if (fUserComboBox)
5819 WinSetWindowText(WinWindowFromID(hwndUserlist, CBID_EDIT),
5820 (CHAR *)mp1);
5821 if (add_udir(FALSE, (CHAR *)mp1)) {
5822 if (fUserComboBox && fAutoAddDirs) {
5823 WinSendMsg(hwndUserlist, LM_INSERTITEM,
5824 MPFROM2SHORT(LIT_SORTASCENDING, 0),
5825 MPFROMP((CHAR *)mp1));
5826 }
5827 }
5828 }
5829 return 0;
5830
5831 case UM_ARRANGEICONS:
5832 ArrangeIcons(hwnd);
5833 return 0;
5834
5835 case WM_CHORD:
5836 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_WINDOWDLG, 0), MPVOID);
5837 break;
5838
5839 case WM_SETFOCUS:
5840 if (mp2)
5841 PostMsg(hwnd, UM_FOCUSME, MPVOID, MPVOID);
5842 break;
5843
5844 case UM_FOCUSME:
5845 WinSetFocus(hwndTree, TRUE);
5846 return 0;
5847
5848 case UM_RESCAN:
5849 TileChildren(hwnd, TRUE);
5850 return 0;
5851
5852 case WM_SAVEAPPLICATION:
5853 {
5854 SWP swp;
5855
5856 WinQueryWindowPos(WinQueryWindow(hwnd, QW_PARENT), &swp);
5857 if (!(swp.fl & (SWP_HIDE | SWP_MINIMIZE))) {
5858 WinStoreWindowPos(FM2Str,
5859 "MainWindowPos", WinQueryWindow(hwnd, QW_PARENT));
5860 if (!fNoSaveState && fSaveState)
5861 SaveDirCnrState(hwnd, GetPString(IDS_SHUTDOWNSTATE));
5862 }
5863 }
5864 break;
5865
5866 case MM_PORTHOLEINIT:
5867 switch (SHORT1FROMMP(mp1)) {
5868 case 0:
5869 case 1:
5870 {
5871 HWND hwndCurrent;
5872 ULONG wmsg;
5873
5874 wmsg = (SHORT1FROMMP(mp1) == 0) ? UM_FILESMENU : UM_VIEWSMENU;
5875 hwndCurrent = TopWindow(hwnd, (HWND) 0);
5876 PortholeInit((HWND) WinSendMsg(WinWindowFromID(hwndCurrent,
5877 FID_CLIENT), wmsg,
5878 MPVOID, MPVOID), mp1, mp2);
5879 }
5880 break;
5881 }
5882 break;
5883
5884 case WM_INITMENU:
5885 switch (SHORT1FROMMP(mp1)) {
5886 case IDM_CONFIGMENU:
5887 SetToggleChecks((HWND) WinQueryWindowULong(hwnd, QWL_USER));
5888 break;
5889
5890 case IDM_WINDOWSMENU:
5891 /*
5892 * add child windows of client
5893 * and switchlist entries to end of pulldown menu
5894 */
5895 {
5896 HWND hwndMenu, hwndSubMenu;
5897 MENUITEM mi;
5898
5899 hwndMenu = WinQueryWindowULong(hwnd, QWL_USER);
5900 memset(&mi, 0, sizeof(mi));
5901 mi.iPosition = MIT_END;
5902 mi.afStyle = MIS_TEXT;
5903 if (!WinSendMsg(hwndMenu, MM_QUERYITEM,
5904 MPFROM2SHORT(IDM_WINDOWSMENU, TRUE), MPFROMP(&mi)))
5905 break;
5906 hwndSubMenu = mi.hwndSubMenu;
5907 SetupWinList(hwndSubMenu, hwnd, WinQueryWindow(hwnd, QW_PARENT));
5908 }
5909 break;
5910
5911 default:
5912 {
5913 HWND hwndCurrent;
5914
5915 hwndCurrent = TopWindow(hwnd, (HWND) 0);
5916 if (hwndCurrent)
5917 WinSendMsg(hwndCurrent, UM_INITMENU, mp1, mp2);
5918 }
5919 break;
5920 }
5921 break;
5922
5923 case UM_ADDTOMENU:
5924 AddToMenu((CHAR *)mp1, WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
5925 FID_MENU));
5926 return 0;
5927
5928 case UM_FILLCMDLIST:
5929 WinSendMsg(hwndCmdlist, LM_DELETEALL, MPVOID, MPVOID);
5930 if (!cmdloaded)
5931 load_commands();
5932 if (cmdhead) {
5933
5934 LINKCMDS *info;
5935
5936 info = cmdhead;
5937 while (info) {
5938 WinSendMsg(hwndCmdlist, LM_INSERTITEM,
5939 MPFROM2SHORT(LIT_END, 0), MPFROMP(info->title));
5940 info = info->next;
5941 }
5942 }
5943 return 0;
5944
5945 case UM_FILLSETUPLIST:
5946 fill_setups_list();
5947 return 0;
5948
5949 case UM_FILLBUTTONLIST:
5950 WinSendMsg(hwndButtonlist, LM_DELETEALL, MPVOID, MPVOID);
5951 if (fUserComboBox) {
5952
5953 BOOL foundit = FALSE, thisone;
5954 ULONG ulSearchCount;
5955 SHORT sSelect;
5956 FILEFINDBUF3 findbuf;
5957 HDIR hDir;
5958 CHAR *p;
5959
5960 DosError(FERR_DISABLEHARDERR);
5961 hDir = HDIR_CREATE;
5962 ulSearchCount = 1;
5963 if (!DosFindFirst("*.TLS", &hDir, FILE_READONLY | FILE_ARCHIVED,
5964 &findbuf, sizeof(FILEFINDBUF3),
5965 &ulSearchCount, FIL_STANDARD)) {
5966 do {
5967 priority_bumped();
5968 if (!foundit) {
5969 thisone = FALSE;
5970 p = strrchr(lasttoolbox, '\\');
5971 if (!p)
5972 p = lasttoolbox;
5973 else
5974 p++;
5975 if (!stricmp(findbuf.achName, p))
5976 thisone = TRUE;
5977 }
5978 p = strrchr(findbuf.achName, '.');
5979 if (p)
5980 *p = 0;
5981 sSelect = (SHORT) WinSendMsg(hwndButtonlist, LM_INSERTITEM,
5982 MPFROM2SHORT(LIT_SORTASCENDING, 0),
5983 MPFROMP(findbuf.achName));
5984 if (!foundit && thisone && sSelect >= 0) {
5985 WinSendMsg(hwndButtonlist, LM_SELECTITEM,
5986 MPFROM2SHORT(sSelect, 0), MPFROMLONG(TRUE));
5987 foundit = TRUE;
5988 }
5989 }
5990 while (!DosFindNext(hDir, &findbuf, sizeof(FILEFINDBUF3),
5991 &ulSearchCount));
5992 DosFindClose(hDir);
5993 priority_bumped();
5994 }
5995 WinSetWindowText(hwndButtonlist, GetPString(IDS_TOOLBOXTEXT));
5996 }
5997 return 0;
5998
5999 case UM_FILLUSERLIST:
6000 WinSendMsg(hwndUserlist, LM_DELETEALL, MPVOID, MPVOID);
6001 if (fUserComboBox) {
6002 ULONG ulDriveNum;
6003 ULONG ulDriveMap;
6004 ULONG ulSearchCount;
6005 FILEFINDBUF3 findbuf;
6006 HDIR hDir;
6007 APIRET rc;
6008 LINKDIRS *info;
6009 LINKDIRS *temp;
6010
6011 if (!loadedudirs)
6012 load_udirs();
6013 DosError(FERR_DISABLEHARDERR);
6014 DosQCurDisk(&ulDriveNum, &ulDriveMap);
6015 info = udirhead;
6016 while (info) {
6017 if (IsFullName(info->path) &&
6018 !(driveflags[toupper(*info->path) - 'A'] &
6019 (DRIVE_IGNORE | DRIVE_INVALID))) {
6020 DosError(FERR_DISABLEHARDERR);
6021 hDir = HDIR_CREATE;
6022 ulSearchCount = 1;
6023 if (!IsRoot(info->path))
6024 rc = DosFindFirst(info->path, &hDir, FILE_DIRECTORY |
6025 MUST_HAVE_DIRECTORY | FILE_READONLY |
6026 FILE_ARCHIVED | FILE_SYSTEM | FILE_HIDDEN,
6027 &findbuf, sizeof(FILEFINDBUF3),
6028 &ulSearchCount, FIL_STANDARD);
6029 else {
6030 rc = 0;
6031 findbuf.attrFile = FILE_DIRECTORY;
6032 }
6033 priority_bumped();
6034 if (!rc) {
6035 if (!IsRoot(info->path))
6036 DosFindClose(hDir);
6037 if (findbuf.attrFile & FILE_DIRECTORY)
6038 WinSendMsg(hwndUserlist, LM_INSERTITEM,
6039 MPFROM2SHORT(LIT_SORTASCENDING, 0),
6040 MPFROMP(info->path));
6041 else {
6042 temp = info->next;
6043 remove_udir(info->path);
6044 info = temp;
6045 continue;
6046 }
6047 }
6048 else if (!(ulDriveMap & (1 << (toupper(*info->path) - 'A')))) {
6049 temp = info->next;
6050 remove_udir(info->path);
6051 info = temp;
6052 continue;
6053 }
6054 }
6055 info = info->next;
6056 }
6057 info = ldirhead;
6058 while (info) {
6059 if (IsFullName(info->path) &&
6060 !(driveflags[toupper(*info->path) - 'A'] &
6061 (DRIVE_IGNORE | DRIVE_INVALID))) {
6062 DosError(FERR_DISABLEHARDERR);
6063 hDir = HDIR_CREATE;
6064 ulSearchCount = 1;
6065 if (!IsRoot(info->path))
6066 rc = DosFindFirst(info->path, &hDir, FILE_DIRECTORY |
6067 MUST_HAVE_DIRECTORY | FILE_READONLY |
6068 FILE_ARCHIVED | FILE_SYSTEM | FILE_HIDDEN,
6069 &findbuf, sizeof(FILEFINDBUF3),
6070 &ulSearchCount, FIL_STANDARD);
6071 else {
6072 rc = 0;
6073 findbuf.attrFile = FILE_DIRECTORY;
6074 }
6075 priority_bumped();
6076 if (!rc) {
6077 if (!IsRoot(info->path))
6078 DosFindClose(hDir);
6079 if (findbuf.attrFile & FILE_DIRECTORY)
6080 WinSendMsg(hwndUserlist, LM_INSERTITEM,
6081 MPFROM2SHORT(LIT_SORTASCENDING, 0),
6082 MPFROMP(info->path));
6083 else {
6084 temp = info->next;
6085 remove_udir(info->path);
6086 info = temp;
6087 continue;
6088 }
6089 }
6090 else if (!(ulDriveMap & (1 << (toupper(*info->path) - 'A')))) {
6091 temp = info->next;
6092 remove_udir(info->path);
6093 info = temp;
6094 continue;
6095 }
6096 }
6097 info = info->next;
6098 }
6099 WinSendMsg(hwndUserlist, LM_INSERTITEM,
6100 MPFROM2SHORT(0, 0),
6101 MPFROMP(GetPString(IDS_NEWDIRECTORYTEXT)));
6102 WinSetWindowText(hwndUserlist, GetPString(IDS_COMMONDIRTEXT));
6103 }
6104 return 0;
6105
6106 case UM_SIZE:
6107 if (fAutoTile)
6108 TileChildren(hwnd, FALSE);
6109 else
6110 MoveChildrenAwayFromTree(hwnd);
6111 return 0;
6112
6113 case WM_SIZE:
6114 ResizeChildren(hwnd, SHORT1FROMMP(mp1), SHORT2FROMMP(mp1),
6115 SHORT1FROMMP(mp2), SHORT2FROMMP(mp2));
6116 break;
6117
6118 case WM_ERASEBACKGROUND:
6119 WinFillRect((HPS) mp1, (PRECTL) mp2, 0x00d0d0d0);
6120 return 0;
6121
6122 case WM_PAINT:
6123 {
6124 HPS hps;
6125 RECTL rcl;
6126
6127 hps = WinBeginPaint(hwnd, (HPS) 0, NULL);
6128 if (hps) {
6129 WinQueryWindowRect(hwnd, &rcl);
6130 WinFillRect(hps, &rcl, CLR_PALEGRAY);
6131 WinEndPaint(hps);
6132 }
6133 }
6134 break;
6135
6136 case UM_CONTROL:
6137 switch (SHORT1FROMMP(mp1)) {
6138 case MAIN_CMDLIST:
6139 case MAIN_SETUPLIST:
6140 case MAIN_DRIVELIST:
6141 case MAIN_USERLIST:
6142 case MAIN_BUTTONLIST:
6143 switch (SHORT2FROMMP(mp1)) {
6144 case CBN_ENTER:
6145 {
6146 HWND hwndUL = WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
6147 SHORT1FROMMP(mp1));
6148 CHAR path[CCHMAXPATH];
6149 ULONG ul;
6150
6151 switch (SHORT1FROMMP(mp1)) {
6152 case MAIN_USERLIST:
6153 ul = CCHMAXPATH;
6154 break;
6155 case MAIN_SETUPLIST:
6156 ul = STATE_NAME_MAX_BYTES;
6157 break;
6158 default:
6159 ul = 13; // fixme to not be hardcoded
6160 }
6161
6162 SetShiftState();
6163 WinQueryWindowText(WinWindowFromID(hwndUL, CBID_EDIT), ul, path);
6164 bstrip(path);
6165 if (*path) {
6166 if (SHORT1FROMMP(mp1) == MAIN_USERLIST) {
6167 if (!strcmp(path, GetPString(IDS_NEWDIRECTORYTEXT))) {
6168 if (!LastDir ||
6169 !WinSendMsg(WinQueryWindow(LastDir, QW_PARENT),
6170 UM_CONTAINERDIR, MPFROMP(path), MPVOID))
6171 save_dir2(path);
6172 if (!PMMkDir(hwnd, path, TRUE)) {
6173 WinSetWindowText(hwndUL, GetPString(IDS_COMMONDIRTEXT));
6174 break;
6175 }
6176 }
6177 if (!IsFile(path) && !FindDirCnrByName(path, TRUE)) {
6178
6179 HWND hwndDir;
6180
6181 if ((fUserListSwitches &&
6182 !(shiftstate & KC_SHIFT)) ||
6183 (!fUserListSwitches && (shiftstate & KC_SHIFT))) {
6184 hwndDir = FindDirCnr(hwnd);
6185 if (hwndDir) {
6186 WinSendMsg(LastDir, UM_SETDIR, MPFROMP(path), MPVOID);
6187 break;
6188 }
6189 }
6190 OpenDirCnr((HWND) 0, hwndMain, hwndTree, FALSE, path);
6191 }
6192 }
6193 else if (SHORT1FROMMP(mp1) == MAIN_DRIVELIST) {
6194 ShowTreeRec(WinWindowFromID(WinWindowFromID(hwndTree,
6195 FID_CLIENT),
6196 TREE_CNR), path, FALSE, TRUE);
6197 WinSetFocus(HWND_DESKTOP, hwndTree);
6198 }
6199 else if (SHORT1FROMMP(mp1) == MAIN_BUTTONLIST) {
6200 strcat(path, ".TLS");
6201 load_tools(path);
6202 PrfWriteProfileString(fmprof,
6203 FM3Str, "LastToolBox", lasttoolbox);
6204 BuildTools(hwndToolback, TRUE);
6205 WinSetWindowText(hwndButtonlist, GetPString(IDS_TOOLBOXTEXT));
6206 }
6207 else if (SHORT1FROMMP(mp1) == MAIN_SETUPLIST) {
6208 CHAR szKey[80];
6209 ULONG size, numsaves = 0;
6210
6211 SetShiftState();
6212 size = sizeof(ULONG);
6213 sprintf(szKey, "%s.NumDirsLastTime", path); // path is state name
6214 if (!PrfQueryProfileData(fmprof,
6215 FM3Str,
6216 szKey,
6217 (PVOID)&numsaves,
6218 &size))
6219 {
6220 if ((WinGetLastError(WinQueryAnchorBlock(hwnd)) & 0xffff) == PMERR_NOT_IN_IDX) {
6221 saymsg(MB_ENTER | MB_ICONASTERISK, hwnd,
6222 GetPString(IDS_WARNINGTEXT),
6223 GetPString(IDS_DOESNTEXISTTEXT), path);
6224 }
6225 else {
6226 Win_Error2(hwnd, hwnd, __FILE__, __LINE__,
6227 IDS_PRFQUERYPROFILEDATA);
6228 }
6229 }
6230 else if (!numsaves)
6231 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
6232 else {
6233 char *pszStateName;
6234 if ((shiftstate & KC_SHIFT) == 0)
6235 PostMsg(MainObjectHwnd, UM_RESTORE, MPVOID, MPFROMLONG(2));
6236 pszStateName = xstrdup(path, pszSrcFile, __LINE__);
6237 if (!pszStateName) {
6238 // Fall back if out of memory - already complained
6239 if ((shiftstate & KC_SHIFT) != 0 || fAutoTile) {
6240 // Autotile requested or forced
6241 PostMsg(MainObjectHwnd,
6242 UM_RESTORE,
6243 MPVOID,
6244 MPFROMLONG(1)); // Autotile
6245 }
6246 }
6247 else if (!PostMsg(MainObjectHwnd,
6248 UM_RESTORE,
6249 MPFROMP(pszStateName),
6250 MPVOID)) {
6251 xfree(pszStateName, pszSrcFile, __LINE__);
6252 }
6253 }
6254 }
6255 else if (SHORT1FROMMP(mp1) == MAIN_CMDLIST) {
6256
6257 SHORT sSelect;
6258
6259 sSelect = (SHORT) WinSendMsg(hwndCmdlist,
6260 LM_QUERYSELECTION,
6261 MPFROMSHORT(LIT_FIRST), MPVOID);
6262 if (sSelect >= 0)
6263 WinPostMsg(hwnd,
6264 WM_COMMAND,
6265 MPFROM2SHORT(IDM_COMMANDSTART + sSelect, 0),
6266 MPVOID);
6267 WinSetWindowText(hwndCmdlist, GetPString(IDS_COMMANDSTEXT));
6268 }
6269 }
6270 }
6271 break;
6272
6273 default:
6274 break;
6275 }
6276 break;
6277
6278 default:
6279 break;
6280 }
6281 return 0;
6282
6283 case WM_HELP:
6284 WinSendMsg(hwndHelp, HM_HELP_CONTENTS, MPVOID, MPVOID);
6285 break;
6286
6287 case UM_COMMAND:
6288 case WM_COMMAND:
6289
6290 return MainWMCommand(hwnd, msg, mp1, mp2);
6291
6292 case WM_CLOSE:
6293 WinSendMsg(WinQueryWindow(hwnd, QW_PARENT),
6294 WM_SYSCOMMAND, MPFROM2SHORT(SC_RESTORE, 0), MPVOID);
6295 WinSendMsg(hwnd, WM_SAVEAPPLICATION, MPVOID, MPVOID);
6296 fAmClosing = TRUE;
6297 WinSendMsg(WinQueryWindow(hwnd, QW_PARENT),
6298 WM_SYSCOMMAND, MPFROM2SHORT(SC_MINIMIZE, 0), MPVOID);
6299 if (CloseChildren(hwnd)) {
6300 fAmClosing = FALSE;
6301 if (fAutoTile)
6302 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_TILE, 0), MPVOID);
6303 return 0;
6304 }
6305 if (hwndTree) {
6306 if (!PostMsg(hwndTree, WM_CLOSE, MPVOID, MPVOID))
6307 WinSendMsg(hwndTree, WM_CLOSE, MPVOID, MPVOID);
6308 }
6309 DosSleep(1);
6310 return 0; // Hold off WM_QUIT
6311
6312 case UM_CLOSE:
6313 HideNote();
6314 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
6315 return 0;
6316
6317 case UM_RESTORE:
6318 {
6319 // Try to restore saved shutdown state
6320 char *pszDefaultStateName = xstrdup(GetPString(IDS_SHUTDOWNSTATE),
6321 pszSrcFile, __LINE__);
6322 if (pszDefaultStateName) {
6323 if (!PostMsg(MainObjectHwnd, UM_RESTORE, MPFROMP(pszDefaultStateName), MPVOID))
6324 // 05 Feb 08 SHL fixme to complain?
6325 xfree(pszDefaultStateName, pszSrcFile, __LINE__);
6326 }
6327 }
6328 return 0;
6329
6330 case UM_SETDIR:
6331 /* mp1 == name of directory to open */
6332 if (mp1)
6333 return MRFROMLONG(OpenDirCnr((HWND) 0,
6334 hwndMain,
6335 hwndTree, (BOOL) mp2, (char *)mp1));
6336 return 0;
6337
6338 case WM_DESTROY:
6339 hwndMain = (HWND) 0;
6340 if (!PostMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID))
6341 WinSendMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID);
6342# ifdef FORTIFY
6343 Fortify_LeaveScope();
6344# endif
6345 break;
6346 }
6347 return WinDefWindowProc(hwnd, msg, mp1, mp2);
6348}
6349
6350#pragma alloc_text(MISC8,SetToggleChecks,FindDirCnrByName,TopWindow)
6351#pragma alloc_text(MISC8,TopWindowName,CountDirCnrs)
6352#pragma alloc_text(MAINWND,AdjustSizeOfClient,FillClient,ChildButtonProc)
6353#pragma alloc_text(MAINWND,ToolBackProc,StatusProc)
6354#pragma alloc_text(MAINWND,MoveChildrenAwayFromTree,ArrangeIcons,NextChild)
6355#pragma alloc_text(MAINWND,ChildFrameButtonProc)
6356#pragma alloc_text(MAINWND2,CloseChildren,CountChildren,GetNextWindowPos)
6357#pragma alloc_text(MAINWND2,CascadeChildren,TileChildren,ResizeChildren)
6358#pragma alloc_text(MAINWND2,MinResChildren,MainFrameWndProc,MainWndProc)
6359#pragma alloc_text(MAINWND2,DropDownListProc)
6360#pragma alloc_text(MAINWND3,RestoreDirCnrState,SaveDirCnrState)
6361#pragma alloc_text(MAINWND3,CloseDirCnrChildren,TransformSwp)
6362#pragma alloc_text(MAINWND3,ResizeTools,BuildTools,CommandLineProc)
6363#pragma alloc_text(MAINWND4,DriveProc,DriveBackProc,BuildDriveBarButtons,ResizeDrives)
6364#pragma alloc_text(MAINWND4,LEDProc,IdealButtonProc)
6365#pragma alloc_text(MAINWND5,MainWMOnce)
6366#pragma alloc_text(MAINWND6,MainWMCommand)
6367#pragma alloc_text(BUBBLE,MakeBubble,BubbleProc,BubbleHelp)
6368#pragma alloc_text(MAINOBJ,MainObjectWndProc,MakeMainObjWin)
6369
Note: See TracBrowser for help on using the repository browser.