source: trunk/dll/mainwnd.c@ 1036

Last change on this file since 1036 was 1036, checked in by Gregg Young, 17 years ago

More fortify changes eliminated the leave scope wrapper except in mainwnd.c Wrapper only unlaods stuuff (archivers, commands, etc

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