source: trunk/dll/mainwnd.c@ 953

Last change on this file since 953 was 953, checked in by Steven Levine, 18 years ago

Rework code and resources to support settings menu conditional cascade
Optimize last settings menu save/restore

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