source: trunk/dll/mainwnd.c@ 917

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

Correct/enhance settings notebook navigation, ticket #188 (Steven)
Reopen settings notebook to last selected page unless overridden, ticket #188 (Steven)
More Compare Directory overflow tweaks (Steven)

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