source: trunk/dll/mainwnd.c@ 1027

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

Ticket 227: Code cleanup and comments

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