source: trunk/dll/mainwnd.c@ 908

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

Avoid out of memory traps in Compare Directories
Rework Compare Directories progress display for 2 second update rate
Start refactoring to reduce dependence on fm3dll.h
Add timer services (IsITimerExpired etc.)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 160.4 KB
Line 
1
2/***********************************************************************
3
4 $Id: mainwnd.c 907 2008-01-06 07:26:17Z 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 WinDlgBox(HWND_DESKTOP,
4428 hwnd, CfgDlgProc, FM3ModHandle, CFG_FRAME, MPVOID);
4429 break;
4430
4431 case IDM_VIEWHELPS:
4432 case IDM_VIEWINFS:
4433 WinDlgBox(HWND_DESKTOP,
4434 HWND_DESKTOP,
4435 ViewInfProc,
4436 FM3ModHandle,
4437 VINF_FRAME,
4438 ((SHORT1FROMMP(mp1) == IDM_VIEWHELPS) ?
4439 MPFROMP(NullStr) : MPVOID));
4440 break;
4441
4442 case IDM_OPENWALK:
4443 {
4444 char newpath[CCHMAXPATH];
4445
4446 *newpath = 0;
4447 TopWindowName(hwnd, (HWND) 0, newpath);
4448 if (WinDlgBox(HWND_DESKTOP,
4449 hwnd,
4450 WalkAllDlgProc,
4451 FM3ModHandle, WALK_FRAME, MPFROMP(newpath)) && *newpath)
4452 OpenDirCnr((HWND) 0, hwndMain, hwndTree, FALSE, newpath);
4453 }
4454 break;
4455
4456 case IDM_WINDOWDLG:
4457 WindowList(hwnd);
4458 break;
4459
4460 case IDM_HELPMOUSE:
4461 case IDM_HELPCONTEXT:
4462 case IDM_HELPHINTS:
4463 case IDM_HELPPIX:
4464 case IDM_HELPTUTOR:
4465 case IDM_HELPUSERLIST:
4466 case IDM_HELP:
4467 case IDM_HELPCONTENTS:
4468 case IDM_HELPKEYS:
4469 case IDM_HELPGENERAL:
4470 if (hwndHelp) {
4471 if (SHORT1FROMMP(mp2) == CMDSRC_MENU) {
4472
4473 RECTL rcl;
4474 ULONG icz = WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2L;
4475
4476 WinQueryWindowRect(HWND_DESKTOP, &rcl);
4477 rcl.yBottom += icz;
4478 rcl.yTop -= icz;
4479 rcl.xLeft += icz;
4480 rcl.xRight -= icz;
4481 WinSendMsg(hwndHelp, HM_SET_COVERPAGE_SIZE, MPFROMP(&rcl), MPVOID);
4482 }
4483 else {
4484
4485 RECTL rcl;
4486
4487 WinQueryWindowRect(HWND_DESKTOP, &rcl);
4488 rcl.yBottom += 8;
4489 rcl.yTop = (rcl.yTop / 2) + (rcl.yTop / 7);
4490 rcl.xLeft = (rcl.xRight / 2) - (rcl.xRight / 7);
4491 rcl.xRight -= 8;
4492 WinSendMsg(hwndHelp, HM_SET_COVERPAGE_SIZE, MPFROMP(&rcl), MPVOID);
4493 }
4494 switch (SHORT1FROMMP(mp1)) {
4495 case IDM_HELPCONTEXT:
4496 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
4497 MPFROM2SHORT(HELP_CONTEXT, 0), MPFROMSHORT(HM_RESOURCEID));
4498 break;
4499
4500 case IDM_HELPMOUSE:
4501 if (hwndHelp)
4502 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
4503 MPFROM2SHORT(HELP_MOUSE, 0), MPFROMSHORT(HM_RESOURCEID));
4504 break;
4505
4506 case IDM_HELPPIX:
4507 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
4508 MPFROM2SHORT(HELP_BITMAP1, 0), MPFROMSHORT(HM_RESOURCEID));
4509 break;
4510
4511 case IDM_HELPTUTOR:
4512 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
4513 MPFROM2SHORT(HELP_TUTORIAL, 0),
4514 MPFROMSHORT(HM_RESOURCEID));
4515 break;
4516
4517 case IDM_HELPHINTS:
4518 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
4519 MPFROM2SHORT(HELP_HINTS, 0), MPFROMSHORT(HM_RESOURCEID));
4520 break;
4521
4522 case IDM_HELPGENERAL:
4523 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
4524 MPFROM2SHORT(HELP_MAIN, 0), MPFROMSHORT(HM_RESOURCEID));
4525 break;
4526 case IDM_HELPKEYS:
4527 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
4528 MPFROM2SHORT(HELP_KEYS, 0), MPFROMSHORT(HM_RESOURCEID));
4529 break;
4530
4531 case IDM_HELP:
4532 case IDM_HELPCONTENTS:
4533 WinSendMsg(hwndHelp, HM_HELP_CONTENTS, MPVOID, MPVOID);
4534 break;
4535
4536 case IDM_HELPUSERLIST:
4537 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
4538 MPFROM2SHORT(HELP_USERLISTS, 0),
4539 MPFROMSHORT(HM_RESOURCEID));
4540 break;
4541 }
4542 }
4543 break;
4544
4545 case IDM_EDITANYARCHIVER:
4546 EditArchiverDefinition(hwnd);
4547 break;
4548
4549 case IDM_ABOUT:
4550 WinDlgBox(HWND_DESKTOP, hwnd, AboutDlgProc, FM3ModHandle,
4551 ABT_FRAME, MPVOID);
4552 break;
4553
4554 case IDM_FONTPALETTE:
4555 OpenObject("<WP_FNTPAL>", Default, hwnd);
4556 break;
4557
4558 case IDM_HICOLORPALETTE:
4559 case IDM_COLORPALETTE:
4560 {
4561 CHAR *palette = "<WP_CLRPAL>";
4562 ULONG version[2];
4563
4564 if (!DosQuerySysInfo(QSV_VERSION_MAJOR, QSV_VERSION_MINOR,
4565 (PVOID) & version, (ULONG) sizeof(version))) {
4566 if (version[0] > 20L || (version[0] == 20L && version[1] > 29L)) {
4567 if (SHORT1FROMMP(mp1) == IDM_HICOLORPALETTE)
4568 palette = "<WP_HIRESCLRPAL>";
4569 else
4570 palette = "<WP_LORESCLRPAL>";
4571 }
4572 }
4573 OpenObject(palette, Default, hwnd);
4574 }
4575 break;
4576
4577 case IDM_SYSTEMSETUP:
4578 OpenObject("<WP_CONFIG>", Default, hwnd);
4579 break;
4580
4581 case IDM_SCHEMEPALETTE:
4582 {
4583 HOBJECT hWPSObject;
4584
4585 hWPSObject = WinQueryObject("<WP_SCHPAL>");
4586 if (hWPSObject != NULLHANDLE)
4587 WinSetObjectData(hWPSObject, "SCHEMES=Winter:PM_Winter,"
4588 "Spring:PM_Spring,Summer:PM_Summer,"
4589 "System:PM_System,Windows:PM_Windows;"
4590 "OPEN=DEFAULT");
4591 }
4592 break;
4593
4594 case IDM_SYSTEMCLOCK:
4595 OpenObject("<WP_CLOCK>", Default, hwnd);
4596 break;
4597
4598#ifdef NEVER
4599 case IDM_SYSINFO:
4600 WinDlgBox(HWND_DESKTOP, HWND_DESKTOP, SysInfoDlgProc, FM3ModHandle,
4601 SYS_FRAME, NULL);
4602 break;
4603#endif
4604
4605 case IDM_INSTANT:
4606 {
4607 CHAR path[CCHMAXPATH];
4608 PCNRITEM pci = (PCNRITEM) 0;
4609
4610 if (hwndTree)
4611 pci = (PCNRITEM) WinSendMsg(hwndTree, CM_QUERYRECORDEMPHASIS,
4612 MPFROMLONG(CMA_FIRST),
4613 MPFROMSHORT(CRA_CURSORED));
4614 if (pci && (INT) pci != -1) {
4615 strcpy(path, pci->pszFileName);
4616 MakeValidDir(path);
4617 }
4618 else
4619 save_dir2(path);
4620 WinDlgBox(HWND_DESKTOP, hwnd, InstantDlgProc, FM3ModHandle,
4621 BAT_FRAME, MPFROMP(path));
4622 }
4623 break;
4624
4625 case IDM_WINFULLSCREEN:
4626 case IDM_DOSCOMMANDLINE:
4627 case IDM_COMMANDLINE:
4628 {
4629 CHAR *env = GetCmdSpec(FALSE), path[CCHMAXPATH];
4630 INT type = SEPARATE | WINDOWED;
4631
4632 *path = 0;
4633 TopWindowName(hwnd, (HWND) 0, path);
4634 if (SHORT1FROMMP(mp1) == IDM_DOSCOMMANDLINE)
4635 env = GetCmdSpec(TRUE);
4636 else if (SHORT1FROMMP(mp1) != IDM_COMMANDLINE) {
4637 env = "WINOS2.COM";
4638 type = SEPARATE | FULLSCREEN;
4639 }
4640 runemf2(type, hwnd, pszSrcFile, __LINE__,
4641 path, NULL, "%s", env);
4642 }
4643 break;
4644
4645 case IDM_KILLPROC:
4646 WinDlgBox(HWND_DESKTOP, hwnd, KillDlgProc, FM3ModHandle,
4647 KILL_FRAME, NULL);
4648 break;
4649
4650 case IDM_AUTOVIEWCOMMENTS:
4651 case IDM_AUTOVIEWFILE:
4652 if (SHORT1FROMMP(mp1) == IDM_AUTOVIEWFILE)
4653 fComments = FALSE;
4654 else
4655 fComments = TRUE;
4656 PrfWriteProfileData(fmprof, FM3Str, "Comments", &fComments, sizeof(BOOL));
4657 WinSetWindowText((fComments) ? hwndAutoview : hwndAutoMLE, NullStr);
4658 goto AutoChange;
4659
4660 case IDM_AUTOVIEW:
4661 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER), SHORT1FROMMP(mp1),
4662 &fAutoView, TRUE, "AutoView");
4663 AutoChange:
4664 PostMsg(WinQueryWindow(hwnd, QW_PARENT), WM_UPDATEFRAME,
4665 MPFROMLONG(FCF_SIZEBORDER), MPVOID);
4666 if (fAutoView) {
4667
4668 CHAR s[CCHMAXPATH];
4669 HWND hwndDir;
4670 PCNRITEM pci;
4671
4672 hwndDir = TopWindowName(hwnd, (HWND) 0, s);
4673 if (hwndDir) {
4674 hwndDir = WinWindowFromID(hwndDir, FID_CLIENT);
4675 if (hwndDir) {
4676 hwndDir = WinWindowFromID(hwndDir, DIR_CNR);
4677 if (hwndDir) {
4678 pci = (PCNRITEM) WinSendMsg(hwndDir, CM_QUERYRECORDEMPHASIS,
4679 MPFROMLONG(CMA_FIRST),
4680 MPFROMSHORT(CRA_CURSORED));
4681 if (pci && (INT) pci != -1 &&
4682 (!(driveflags[toupper(*pci->pszFileName) - 'A'] & DRIVE_SLOW)))
4683 WinSendMsg(hwnd,
4684 UM_LOADFILE,
4685 MPFROMP(pci->pszFileName),
4686 (SHORT1FROMMP(mp1) == IDM_AUTOVIEW) ?
4687 MPVOID : MPFROMLONG(1));
4688 }
4689 }
4690 }
4691 }
4692 break;
4693
4694 case IDM_TEXTTOOLS:
4695 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER), SHORT1FROMMP(mp1),
4696 &fTextTools, TRUE, "TextTools");
4697 BuildTools(hwndToolback, TRUE);
4698 PostMsg(WinQueryWindow(hwnd, QW_PARENT), WM_UPDATEFRAME,
4699 MPFROMLONG(FCF_SIZEBORDER), MPVOID);
4700 break;
4701
4702 case IDM_TOOLTITLES:
4703 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER), SHORT1FROMMP(mp1),
4704 &fToolTitles, TRUE, "ToolTitles");
4705 BuildTools(hwndToolback, TRUE);
4706 PostMsg(WinQueryWindow(hwnd, QW_PARENT), WM_UPDATEFRAME,
4707 MPFROMLONG(FCF_SIZEBORDER), MPVOID);
4708 break;
4709
4710 case IDM_HIDEMENU:
4711 {
4712 HWND hwndMenu;
4713
4714 hwndMenu = WinQueryWindowULong(hwnd, QWL_USER);
4715 MenuInvisible = (MenuInvisible) ? FALSE : TRUE;
4716 if (MenuInvisible) {
4717 WinSetParent(hwndMenu, HWND_OBJECT, FALSE);
4718 WinSetMenuItemText(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
4719 FID_SYSMENU), IDM_HIDEMENU,
4720 GetPString(IDS_UNHIDEMENUTEXT));
4721 }
4722 else {
4723 WinSetParent(hwndMenu, WinQueryWindow(hwnd, QW_PARENT), FALSE);
4724 WinSetMenuItemText(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
4725 FID_SYSMENU), IDM_HIDEMENU,
4726 GetPString(IDS_HIDEMENUTEXT));
4727 }
4728 PostMsg(WinQueryWindow(hwnd, QW_PARENT), WM_UPDATEFRAME,
4729 MPFROMLONG(FCF_MENU), MPVOID);
4730 PrfWriteProfileData(fmprof, FM3Str, "MenuInvisible",
4731 &MenuInvisible, sizeof(BOOL));
4732 }
4733 break;
4734
4735 case IDM_SEEALL:
4736 case IDM_GREP:
4737 case IDM_COLLECTOR:
4738 {
4739 HWND hwndC;
4740 SWP swp;
4741 BOOL already = FALSE;
4742
4743 if (Collector)
4744 already = TRUE;
4745 if (!already && !fAutoTile && !fExternalCollector)
4746 GetNextWindowPos(hwnd, &swp, NULL, NULL);
4747 hwndC = StartCollector(fExternalCollector ? HWND_DESKTOP : hwnd, 4);
4748 if (hwndC) {
4749 if (!already && !fAutoTile && !fExternalCollector)
4750 WinSetWindowPos(hwndC, HWND_TOP,
4751 swp.x, swp.y, swp.cx, swp.cy,
4752 SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_ZORDER);
4753 else if (fAutoTile && !already)
4754 TileChildren(hwnd, TRUE);
4755 WinSetWindowPos(hwndC, HWND_TOP, 0, 0, 0, 0, SWP_SHOW | SWP_RESTORE |
4756 SWP_ACTIVATE);
4757 if (SHORT1FROMMP(mp1) == IDM_GREP)
4758 PostMsg(WinWindowFromID(hwndC, FID_CLIENT), WM_COMMAND,
4759 MPFROM2SHORT(IDM_GREP, 0), MPVOID);
4760 if (SHORT1FROMMP(mp1) == IDM_SEEALL)
4761 PostMsg(WinWindowFromID(hwndC, FID_CLIENT), WM_COMMAND,
4762 MPFROM2SHORT(IDM_SEEALL, 0), MPVOID);
4763 }
4764 }
4765 break;
4766
4767 case IDM_TOOLLEFT:
4768 case IDM_TOOLRIGHT:
4769 {
4770 TOOL *tool;
4771
4772 if (!toolhead || !toolhead->next) {
4773 firsttool = (toolhead) ? toolhead->id : 0;
4774 break;
4775 }
4776 tool = find_tool(firsttool);
4777 if (!tool)
4778 tool = toolhead;
4779 if (SHORT1FROMMP(mp1) == IDM_TOOLRIGHT) {
4780 tool = prev_tool(tool, TRUE);
4781 firsttool = tool->id;
4782 }
4783 else {
4784 tool = next_tool(tool, TRUE);
4785 firsttool = tool->id;
4786 }
4787 ResizeTools(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
4788 MAIN_TOOLS));
4789 }
4790 break;
4791
4792 case IDM_CREATETOOL:
4793 BuildTools(hwndToolback, TRUE);
4794 break;
4795
4796 case IDM_TOOLBAR:
4797 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
4798 IDM_TOOLSUBMENU, &fToolbar, TRUE, "Toolbar");
4799 BuildTools(hwndToolback, TRUE);
4800 WinShowWindow(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
4801 MAIN_TOOLS), fToolbar);
4802 WinSendMsg(WinQueryWindow(hwnd, QW_PARENT),
4803 WM_UPDATEFRAME, MPFROMLONG(FCF_SIZEBORDER), MPVOID);
4804 if (fDrivebar)
4805 WinInvalidateRect(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
4806 MAIN_DRIVES), NULL, TRUE);
4807 break;
4808
4809 case IDM_DRIVEBAR:
4810 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
4811 IDM_DRIVEBAR, &fDrivebar, TRUE, "Drivebar");
4812 WinShowWindow(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
4813 MAIN_DRIVES), fDrivebar);
4814 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
4815 WM_UPDATEFRAME, MPFROMLONG(FCF_SIZEBORDER), MPVOID);
4816 PostMsg(hwnd, UM_BUILDDRIVEBAR, MPVOID, MPVOID);
4817 break;
4818
4819 case IDM_USERLIST:
4820 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
4821 SHORT1FROMMP(mp1), &fUserComboBox, TRUE, "UserComboBox");
4822 WinShowWindow(hwndUserlist, fUserComboBox);
4823 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
4824 WM_UPDATEFRAME, MPFROMLONG(FCF_SIZEBORDER), MPVOID);
4825 PostMsg(hwnd, UM_FILLUSERLIST, MPVOID, MPVOID);
4826 PostMsg(hwnd, UM_FILLSETUPLIST, MPVOID, MPVOID);
4827 PostMsg(hwnd, UM_FILLCMDLIST, MPVOID, MPVOID);
4828 PostMsg(hwnd, UM_FILLBUTTONLIST, MPVOID, MPVOID);
4829 break;
4830
4831 case IDM_MOREBUTTONS:
4832 WinSetWindowText(hwndName, NullStr);
4833 WinSetWindowText(hwndDate, NullStr);
4834 WinSetWindowText(hwndAttr, NullStr);
4835 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
4836 SHORT1FROMMP(mp1), &fMoreButtons, TRUE, "MoreButtons");
4837 if (fMoreButtons) {
4838
4839 HWND hwndTemp;
4840
4841 hwndTemp = TopWindow(hwnd, (HWND) 0);
4842
4843 if (hwndTemp) {
4844 WinSetFocus(HWND_DESKTOP, hwnd);
4845 WinSetFocus(HWND_DESKTOP, hwndTemp);
4846 }
4847 }
4848 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
4849 WM_UPDATEFRAME, MPFROMLONG(FCF_SIZEBORDER), MPVOID);
4850 break;
4851
4852 case IDM_FREETREE:
4853 if (fFreeTree) {
4854
4855 SWP swp, swpT;
4856
4857 WinQueryWindowPos(hwndTree, &swpT);
4858 WinQueryWindowPos(hwnd, &swp);
4859 WinSetWindowPos(hwndTree, HWND_TOP, 0, swp.cy - swpT.cy, 0, 0,
4860 SWP_MOVE);
4861 }
4862 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER), SHORT1FROMMP(mp1),
4863 &fFreeTree, TRUE, "FreeTree");
4864 if (fAutoTile)
4865 TileChildren(hwnd, TRUE);
4866 break;
4867
4868 case IDM_AUTOTILE:
4869 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
4870 SHORT1FROMMP(mp1), &fAutoTile, TRUE, "AutoTile");
4871 if (fAutoTile)
4872 TileChildren(hwnd, TRUE);
4873 break;
4874
4875 case IDM_TILEBACKWARDS:
4876 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
4877 SHORT1FROMMP(mp1), &fTileBackwards, TRUE, "TileBackwards");
4878 if (fAutoTile)
4879 TileChildren(hwnd, TRUE);
4880 break;
4881
4882 case IDM_NEXTWINDOW:
4883 case IDM_PREVWINDOW:
4884 NextChild(hwnd, (SHORT1FROMMP(mp1) == IDM_PREVWINDOW));
4885 break;
4886
4887 case IDM_CASCADE:
4888 CascadeChildren(hwnd);
4889 break;
4890
4891 case IDM_TILE:
4892 TileChildren(hwnd, TRUE);
4893 break;
4894
4895 case IDM_RESTORE:
4896 MinResChildren(hwnd, SWP_RESTORE);
4897 break;
4898
4899 case IDM_MINIMIZE:
4900 MinResChildren(hwnd, SWP_MINIMIZE);
4901 break;
4902
4903 case IDM_ARRANGEICONS:
4904 ArrangeIcons(hwnd);
4905 break;
4906
4907 case IDM_INIVIEWER:
4908 StartIniEditor(hwnd, NULL, 4);
4909 break;
4910
4911 case IDM_EDITASSOC:
4912 EditAssociations(hwnd);
4913 break;
4914
4915 case IDM_EDITCOMMANDS:
4916 EditCommands(hwnd);
4917 PostMsg(hwnd, UM_FILLCMDLIST, MPVOID, MPVOID);
4918 break;
4919
4920 default:
4921 if (!SwitchCommand((HWND) WinQueryWindowULong(hwnd, QWL_USER),
4922 SHORT1FROMMP(mp1))) {
4923 if (SHORT1FROMMP(mp1) >= IDM_COMMANDSTART &&
4924 SHORT1FROMMP(mp1) < IDM_QUICKTOOLSTART) {
4925
4926 INT x;
4927 HWND hwndCnr;
4928
4929 if (!cmdloaded)
4930 load_commands();
4931 hwndCnr = TopWindow(hwnd, (HWND) 0);
4932 hwndCnr = (HWND) WinSendMsg(WinWindowFromID(hwndCnr, FID_CLIENT),
4933 UM_CONTAINERHWND, MPVOID, MPVOID);
4934 if (!hwndCnr) {
4935 Runtime_Error2(pszSrcFile, __LINE__, IDS_NOWINDOWTEXT);
4936 break;
4937 }
4938 x = SHORT1FROMMP(mp1) - IDM_COMMANDSTART;
4939 if (x >= 0) {
4940 x++;
4941 RunCommand(hwndCnr, x);
4942 if (fUnHilite) {
4943
4944 PCNRITEM pci;
4945 DIRCNRDATA *dcd = NULL;
4946
4947 // 12 May 07 SHL fixme to understand? backwards maybe? looking for DIR_CNR?
4948 if (WinQueryWindowUShort(hwndCnr, QWS_ID) != TREE_CNR)
4949 dcd = INSTDATA(hwndCnr);
4950 pci = (PCNRITEM) WinSendMsg(hwndCnr,
4951 CM_QUERYRECORDEMPHASIS,
4952 MPFROMLONG(CMA_FIRST),
4953 MPFROMSHORT(CRA_CURSORED));
4954 if (pci && (INT) pci != -1 &&
4955 (pci->rc.flRecordAttr & CRA_SELECTED))
4956 {
4957 UnHilite(hwnd,
4958 TRUE,
4959 dcd ? &dcd->lastselection : NULL,
4960 dcd ? dcd ->ulItemsToUnHilite : 0);
4961 }
4962 }
4963 }
4964 }
4965 else if (SHORT1FROMMP(mp1) >= IDM_QUICKTOOLSTART &&
4966 SHORT1FROMMP(mp1) < IDM_QUICKTOOLSTART + 50) {
4967 if (!qtloaded)
4968 load_quicktools();
4969 if (quicktool[SHORT1FROMMP(mp1) - IDM_QUICKTOOLSTART]) {
4970 if (fToolsChanged)
4971 save_tools(NULL);
4972 if (!load_tools(quicktool[SHORT1FROMMP(mp1) - IDM_QUICKTOOLSTART]))
4973 load_tools(NULL);
4974 else {
4975 strcpy(lasttoolbox,
4976 quicktool[SHORT1FROMMP(mp1) - IDM_QUICKTOOLSTART]);
4977 PrfWriteProfileString(fmprof, FM3Str, "LastToolBox", lasttoolbox);
4978 }
4979 BuildTools(hwndToolback, TRUE);
4980 }
4981 }
4982 else {
4983
4984 HWND hwndActive;
4985
4986 hwndActive = TopWindow(hwnd, (HWND) 0);
4987 if (hwndActive)
4988 PostMsg(WinWindowFromID(hwndActive, FID_CLIENT),
4989 WM_COMMAND, mp1, mp2);
4990 }
4991 }
4992 break; // default
4993 } // switch mp1
4994 return 0;
4995}
4996
4997static MRESULT EXPENTRY MainWMOnce(HWND hwnd, ULONG msg, MPARAM mp1,
4998 MPARAM mp2)
4999{
5000 TID tid;
5001 SWP swp;
5002 PFNWP oldproc;
5003 HWND hwndTmp;
5004 HWND hwndFrame;
5005 HWND hwndSysMenu, hwndSysSubMenu, hwndMenu;
5006 USHORT idSysMenu;
5007 MENUITEM mi, mit;
5008 ULONG size;
5009 BOOL temp = FALSE;
5010
5011 switch (msg) {
5012 case WM_CREATE:
5013 WinQueryWindowProcess(hwnd, &mypid, &tid);
5014 hwndMain = hwnd;
5015 WinSetWindowUShort(hwnd, QWL_USER + 8, 0);
5016 WinSetWindowUShort(hwnd, QWL_USER + 10, 0);
5017 WinSetWindowUShort(hwnd, QWL_USER + 12, 0);
5018 WinSetWindowUShort(hwnd, QWL_USER + 16, 0);
5019 if (_beginthread(MakeMainObjWin, NULL, 245760, MPVOID) == -1) {
5020 Runtime_Error(pszSrcFile, __LINE__,
5021 GetPString(IDS_COULDNTSTARTTHREADTEXT));
5022 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
5023 return 0;
5024 }
5025 else
5026 DosSleep(32);//05 Aug 07 GKY 64
5027
5028 hwndFrame = WinQueryWindow(hwnd, QW_PARENT);
5029
5030 /*
5031 * create frame children (not client children, frame children)
5032 */
5033 DosSleep(1);
5034 WinQueryWindowPos(hwndFrame, &swp);
5035 oldproc = WinSubclassWindow(hwndFrame, MainFrameWndProc);
5036 WinSetWindowPtr(hwndFrame, QWL_USER, (PVOID) oldproc);
5037 CommonCreateMainChildren(hwnd, &swp);
5038
5039 if (!WinCreateWindow(hwndFrame,
5040 WC_BUTTON,
5041 "I",
5042 WS_VISIBLE | BS_PUSHBUTTON | BS_NOPOINTERFOCUS,
5043 ((swp.cx -
5044 WinQuerySysValue(HWND_DESKTOP,
5045 SV_CXMINMAXBUTTON)) -
5046 WinQuerySysValue(HWND_DESKTOP,
5047 SV_CXMINMAXBUTTON) / 2) -
5048 WinQuerySysValue(HWND_DESKTOP,
5049 SV_CXSIZEBORDER),
5050 (swp.cy - WinQuerySysValue(HWND_DESKTOP,
5051 SV_CYMINMAXBUTTON)) -
5052 WinQuerySysValue(HWND_DESKTOP,
5053 SV_CYSIZEBORDER),
5054 WinQuerySysValue(HWND_DESKTOP,
5055 SV_CXMINMAXBUTTON) / 2,
5056 WinQuerySysValue(HWND_DESKTOP,
5057 SV_CYMINMAXBUTTON),
5058 hwnd, HWND_TOP, IDM_IDEALSIZE, NULL, NULL)) {
5059 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
5060 }
5061 else {
5062 WinSubclassWindow(WinWindowFromID(hwndFrame, IDM_IDEALSIZE),
5063 IdealButtonProc);
5064 SetPresParams(WinWindowFromID(hwndFrame,
5065 IDM_IDEALSIZE),
5066 NULL, NULL, NULL, GetPString(IDS_10SYSTEMVIOTEXT));
5067 }
5068
5069 hwndTmp = WinCreateWindow(hwndFrame,
5070 WC_BUTTON,
5071 "#1019",
5072 WS_VISIBLE | BS_PUSHBUTTON | BS_NOPOINTERFOCUS |
5073 BS_BITMAP,
5074 swp.cx - 46,
5075 swp.y + 2,
5076 24,
5077 22, hwnd, HWND_TOP, IDM_OPENWALK, NULL, NULL);
5078 if (!hwndTmp)
5079 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
5080
5081 hwndTmp = WinCreateWindow(hwndFrame,
5082 WC_BUTTON,
5083 "#3062",
5084 WS_VISIBLE | BS_PUSHBUTTON | BS_NOPOINTERFOCUS |
5085 BS_BITMAP,
5086 swp.cx - 22,
5087 swp.y + 2,
5088 24,
5089 22, hwnd, HWND_TOP, IDM_USERLIST, NULL, NULL);
5090 if (!hwndTmp)
5091 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
5092
5093 hwndUserlist = WinCreateWindow(hwndFrame,
5094 WC_COMBOBOX,
5095 (PSZ) NULL,
5096 WS_VISIBLE | CBS_DROPDOWN |
5097 LS_HORZSCROLL,
5098 (swp.x +
5099 WinQuerySysValue(HWND_DESKTOP,
5100 SV_CXSIZEBORDER) + 48L),
5101 (swp.cy -
5102 WinQuerySysValue(HWND_DESKTOP,
5103 SV_CYSIZEBORDER)) - 60,
5104 ((swp.cx -
5105 (WinQuerySysValue(HWND_DESKTOP,
5106 SV_CXSIZEBORDER) *
5107 2)) - 64L), 60L, hwndFrame, HWND_TOP,
5108 MAIN_USERLIST, NULL, NULL);
5109 if (!hwndUserlist)
5110 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
5111 hwndCmdlist = WinCreateWindow(hwndFrame,
5112 WC_COMBOBOX,
5113 (PSZ) NULL,
5114 WS_VISIBLE | CBS_DROPDOWN |
5115 LS_HORZSCROLL,
5116 (swp.x +
5117 WinQuerySysValue(HWND_DESKTOP,
5118 SV_CXSIZEBORDER) + 48L),
5119 (swp.cy -
5120 WinQuerySysValue(HWND_DESKTOP,
5121 SV_CYSIZEBORDER)) - 60,
5122 ((swp.cx -
5123 (WinQuerySysValue(HWND_DESKTOP,
5124 SV_CXSIZEBORDER) * 2)) -
5125 64L), 60L, hwndFrame, HWND_TOP,
5126 MAIN_CMDLIST, NULL, NULL);
5127 if (!hwndCmdlist)
5128 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
5129 WinSetWindowText(hwndCmdlist, GetPString(IDS_COMMANDSTEXT));
5130 hwndStatelist = WinCreateWindow(hwndFrame,
5131 WC_COMBOBOX,
5132 (PSZ) NULL,
5133 WS_VISIBLE | CBS_DROPDOWN |
5134 LS_HORZSCROLL,
5135 (swp.x +
5136 WinQuerySysValue(HWND_DESKTOP,
5137 SV_CXSIZEBORDER) + 48L),
5138 (swp.cy -
5139 WinQuerySysValue(HWND_DESKTOP,
5140 SV_CYSIZEBORDER)) - 60,
5141 ((swp.cx -
5142 (WinQuerySysValue(HWND_DESKTOP,
5143 SV_CXSIZEBORDER) *
5144 2)) - 64L), 60L, hwndFrame, HWND_TOP,
5145 MAIN_SETUPLIST, NULL, NULL);
5146 if (!hwndStatelist)
5147 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
5148
5149 hwndDrivelist = WinCreateWindow(hwndFrame,
5150 WC_COMBOBOX,
5151 (PSZ) NULL,
5152 WS_VISIBLE | CBS_DROPDOWN,
5153 (swp.x +
5154 WinQuerySysValue(HWND_DESKTOP,
5155 SV_CXSIZEBORDER)),
5156 (swp.cy -
5157 WinQuerySysValue(HWND_DESKTOP,
5158 SV_CYSIZEBORDER)) - 60,
5159 48L,
5160 60L,
5161 hwndFrame,
5162 HWND_TOP, MAIN_DRIVELIST, NULL, NULL);
5163 if (!hwndDrivelist)
5164 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
5165 SetPresParams(hwndDrivelist,
5166 NULL, NULL, NULL, GetPString(IDS_10SYSTEMMONOTEXT));
5167 hwndButtonlist = WinCreateWindow(hwndFrame,
5168 WC_COMBOBOX,
5169 (PSZ) NULL,
5170 WS_VISIBLE | CBS_DROPDOWN |
5171 LS_HORZSCROLL,
5172 (swp.cx -
5173 WinQuerySysValue(HWND_DESKTOP,
5174 SV_CXSIZEBORDER)) -
5175 164L,
5176 (swp.cy -
5177 WinQuerySysValue(HWND_DESKTOP,
5178 SV_CYSIZEBORDER)) - 60,
5179 164L, 60L, hwndFrame, HWND_TOP,
5180 MAIN_BUTTONLIST, NULL, NULL);
5181 if (!hwndButtonlist)
5182 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
5183 WinSendMsg(WinWindowFromID(hwndUserlist, CBID_EDIT),
5184 EM_SETTEXTLIMIT, MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
5185 WinSendMsg(WinWindowFromID(hwndStatelist, CBID_EDIT),
5186 EM_SETTEXTLIMIT, MPFROM2SHORT(STATE_NAME_MAX_BYTES, 0), MPVOID);
5187 WinSendMsg(WinWindowFromID(hwndDrivelist, CBID_EDIT),
5188 EM_SETREADONLY, MPFROM2SHORT(TRUE, 0), MPVOID);
5189 WinSendMsg(WinWindowFromID(hwndButtonlist, CBID_EDIT),
5190 EM_SETREADONLY, MPFROM2SHORT(TRUE, 0), MPVOID);
5191 WinSendMsg(WinWindowFromID(hwndCmdlist, CBID_EDIT),
5192 EM_SETREADONLY, MPFROM2SHORT(TRUE, 0), MPVOID);
5193
5194 oldproc = WinSubclassWindow(WinWindowFromID(hwndUserlist, CBID_EDIT),
5195 DropDownListProc);
5196 WinSetWindowPtr(WinWindowFromID(hwndUserlist, CBID_EDIT),
5197 QWL_USER, (PVOID) oldproc);
5198 oldproc = WinSubclassWindow(WinWindowFromID(hwndCmdlist, CBID_EDIT),
5199 DropDownListProc);
5200 WinSetWindowPtr(WinWindowFromID(hwndCmdlist, CBID_EDIT),
5201 QWL_USER, (PVOID) oldproc);
5202 oldproc = WinSubclassWindow(WinWindowFromID(hwndButtonlist, CBID_EDIT),
5203 DropDownListProc);
5204 WinSetWindowPtr(WinWindowFromID(hwndButtonlist, CBID_EDIT),
5205 QWL_USER, (PVOID) oldproc);
5206 oldproc = WinSubclassWindow(WinWindowFromID(hwndStatelist, CBID_EDIT),
5207 DropDownListProc);
5208 WinSetWindowPtr(WinWindowFromID(hwndStatelist, CBID_EDIT),
5209 QWL_USER, (PVOID) oldproc);
5210 oldproc = WinSubclassWindow(WinWindowFromID(hwndDrivelist, CBID_EDIT),
5211 DropDownListProc);
5212 WinSetWindowPtr(WinWindowFromID(hwndDrivelist, CBID_EDIT),
5213 QWL_USER, (PVOID) oldproc);
5214 oldproc = WinSubclassWindow(hwndUserlist, DropDownListProc);
5215 WinSetWindowPtr(hwndUserlist, QWL_USER, (PVOID) oldproc);
5216 oldproc = WinSubclassWindow(hwndCmdlist, DropDownListProc);
5217 WinSetWindowPtr(hwndCmdlist, QWL_USER, (PVOID) oldproc);
5218 oldproc = WinSubclassWindow(hwndStatelist, DropDownListProc);
5219 WinSetWindowPtr(hwndStatelist, QWL_USER, (PVOID) oldproc);
5220 oldproc = WinSubclassWindow(hwndDrivelist, DropDownListProc);
5221 WinSetWindowPtr(hwndDrivelist, QWL_USER, (PVOID) oldproc);
5222 oldproc = WinSubclassWindow(hwndButtonlist, DropDownListProc);
5223 WinSetWindowPtr(hwndButtonlist, QWL_USER, (PVOID) oldproc);
5224 oldproc = WinSubclassWindow(WinWindowFromID(hwndFrame, IDM_USERLIST),
5225 ChildFrameButtonProc);
5226 WinSetWindowPtr(WinWindowFromID(hwndFrame, IDM_USERLIST),
5227 QWL_USER, (PVOID) oldproc);
5228 oldproc = WinSubclassWindow(WinWindowFromID(hwndFrame, IDM_OPENWALK),
5229 ChildFrameButtonProc);
5230 WinSetWindowPtr(WinWindowFromID(hwndFrame, IDM_OPENWALK),
5231 QWL_USER, (PVOID) oldproc);
5232 hwndMenu = WinWindowFromID(hwndFrame, FID_MENU);
5233 WinSendMsg(hwnd, UM_ADDTOMENU, MPVOID, MPVOID);
5234 SetToggleChecks(hwndMenu);
5235 SetConditionalCascade(hwndMenu, IDM_TOOLSUBMENU, IDM_TOOLBAR);
5236 SetConditionalCascade(hwndMenu, IDM_AUTOVIEWSUBMENU, IDM_AUTOVIEW);
5237 SetConditionalCascade(hwndMenu, IDM_TILEMENU, IDM_TILE);
5238 WinSetWindowULong(hwnd, QWL_USER, hwndMenu);
5239 memset(&mi, 0, sizeof(mi));
5240 memset(&mit, 0, sizeof(mit));
5241 hwndSysMenu = WinWindowFromID(hwndFrame, FID_SYSMENU);
5242 idSysMenu = SHORT1FROMMR(WinSendMsg(hwndSysMenu,
5243 MM_ITEMIDFROMPOSITION,
5244 MPVOID, MPVOID));
5245 WinSendMsg(hwndSysMenu,
5246 MM_QUERYITEM, MPFROM2SHORT(idSysMenu, 0), MPFROMP(&mit));
5247 hwndSysSubMenu = mit.hwndSubMenu;
5248 mi.iPosition = MIT_END;
5249 mi.afStyle = MIS_SEPARATOR;
5250 mi.id = (USHORT) - 1;
5251 WinSendMsg(hwndSysSubMenu, MM_INSERTITEM, MPFROMP(&mi), MPFROMP(NULL));
5252 mi.afStyle = MIS_TEXT;
5253 mi.id = IDM_IDEALSIZE;
5254 WinSendMsg(hwndSysSubMenu,
5255 MM_INSERTITEM,
5256 MPFROMP(&mi), MPFROMP(GetPString(IDS_IDEALMENUTEXT)));
5257 mi.afStyle = MIS_TEXT;
5258 mi.id = IDM_HIDEMENU;
5259 WinSendMsg(hwndSysSubMenu,
5260 MM_INSERTITEM,
5261 MPFROMP(&mi), MPFROMP(GetPString(IDS_HIDEMENUTEXT)));
5262 SetSysMenu(hwndSysMenu);
5263
5264 size = sizeof(BOOL);
5265 if (PrfQueryProfileData(fmprof,
5266 FM3Str,
5267 "MenuInvisible", &temp, &size) && size && temp)
5268 WinSendMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_HIDEMENU, 0), MPVOID);
5269 size = sizeof(BOOL);
5270 if (PrfQueryProfileData(fmprof,
5271 FM3Str, "FreeTree", &temp, &size) && size && temp)
5272 WinSendMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_FREETREE, 0), MPVOID);
5273 size = sizeof(BOOL);
5274 if (PrfQueryProfileData(fmprof,
5275 FM3Str,
5276 "AutoTile", &temp, &size) && size && !temp)
5277 WinSendMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_AUTOTILE, 0), MPVOID);
5278 size = sizeof(BOOL);
5279 if (PrfQueryProfileData(fmprof,
5280 FM3Str, "Toolbar", &temp, &size) && size && !temp)
5281 WinSendMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_TOOLBAR, 0), MPVOID);
5282
5283 WinSetWindowText(WinWindowFromID(hwndFrame, FID_TITLEBAR), "FM/2");
5284 FixSwitchList(hwndFrame, NULL);
5285 break; // WM_CREATE
5286
5287 case UM_SETUP:
5288 /*
5289 * start up some initial children
5290 */
5291 load_tools(NULL);
5292 BuildTools(hwndToolback, TRUE);
5293 WinShowWindow(WinQueryWindow(hwnd, QW_PARENT), TRUE);
5294 PostMsg(MainObjectHwnd, UM_SETUP2, mp1, mp2);
5295 return 0;
5296
5297 case UM_SETUP2:
5298 {
5299 SWP swp;
5300 ULONG size = sizeof(SWP);
5301
5302 WinQueryWindowPos(hwnd, &swp);
5303 hwndTree = StartTreeCnr(hwnd, 0);
5304 if (!hwndTree)
5305 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
5306 else {
5307 if (!fSaveState ||
5308 !PrfQueryProfileData(fmprof,
5309 FM3Str,
5310 "LastTreePos",
5311 &swp, &size) || size != sizeof(SWP)) {
5312
5313 INT ratio, height = 0;
5314
5315 if (!fNoTreeGap)
5316 height = WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2;
5317 size = sizeof(ratio);
5318 if (!PrfQueryProfileData(fmprof,
5319 FM3Str,
5320 "TreeWindowRatio",
5321 (PVOID) & ratio,
5322 &size) || size < sizeof(ratio))
5323 ratio = 400;
5324 WinSetWindowPos(hwndTree,
5325 HWND_TOP,
5326 0,
5327 height,
5328 (swp.cx * 100) / ratio,
5329 swp.cy - height,
5330 SWP_SHOW | SWP_SIZE | SWP_MOVE |
5331 SWP_ACTIVATE | SWP_ZORDER);
5332 }
5333 else
5334 WinSetWindowPos(hwndTree,
5335 HWND_TOP,
5336 swp.x,
5337 swp.y,
5338 swp.cx,
5339 swp.cy,
5340 swp.fl | SWP_MOVE | SWP_SIZE | SWP_SHOW |
5341 SWP_ZORDER | SWP_ACTIVATE);
5342 }
5343 ResizeTools(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
5344 MAIN_TOOLS));
5345 }
5346 PostMsg(MainObjectHwnd, UM_SETUP3, mp1, mp2);
5347 return 0;
5348
5349 case UM_SETUP3:
5350 /* start remaining child windows */
5351 if (!fNoSaveState && fSaveState)
5352 PostMsg(MainObjectHwnd, UM_RESTORE, MPVOID, MPVOID);
5353 PostMsg(MainObjectHwnd, UM_SETUP4, mp1, mp2);
5354 return 0;
5355
5356 case UM_SETUP4:
5357 {
5358 INT argc = (INT) mp1, x;
5359 CHAR **argv = (CHAR **) mp2;
5360
5361 for (x = 1; x < argc; x++) {
5362 if (*argv[x] == '/' || *argv[x] == ';')
5363 continue;
5364 if (!IsFile(argv[x]) && !FindDirCnrByName(argv[x], FALSE))
5365 OpenDirCnr((HWND) 0, hwndMain, hwndTree, TRUE, argv[x]);
5366 }
5367 }
5368 PostMsg(MainObjectHwnd, UM_SETUP5, MPVOID, MPVOID);
5369 return 0;
5370
5371 case UM_SETUP5:
5372 if (fAutoTile)
5373 TileChildren(hwnd, TRUE);
5374 PostMsg(hwnd, UM_FILLUSERLIST, MPVOID, MPVOID);
5375 PostMsg(hwnd, UM_FILLSETUPLIST, MPVOID, MPVOID);
5376 PostMsg(hwnd, UM_FILLCMDLIST, MPVOID, MPVOID);
5377 PostMsg(hwnd, UM_FILLBUTTONLIST, MPVOID, MPVOID);
5378 {
5379 HWND hwndActive;
5380
5381 hwndActive = TopWindow(hwnd, hwndTree);
5382 if (hwndActive)
5383 WinSetWindowPos(hwndActive, HWND_TOP, 0, 0, 0, 0, SWP_ACTIVATE);
5384 }
5385 if (fStartMinimized || fReminimize)
5386 PostMsg(hwndTree, UM_MINIMIZE, MPVOID, MPVOID);
5387 else if (fStartMaximized)
5388 PostMsg(hwndTree, UM_MAXIMIZE, MPVOID, MPVOID);
5389 fRunning = TRUE;
5390 return 0;
5391 }
5392
5393 return WinDefWindowProc(hwnd, msg, mp1, mp2);
5394}
5395
5396MRESULT EXPENTRY MainWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
5397{
5398 switch (msg) {
5399 case WM_CREATE:
5400 case UM_SETUP:
5401 case UM_SETUP2:
5402 case UM_SETUP3:
5403 case UM_SETUP4:
5404 case UM_SETUP5:
5405 return MainWMOnce(hwnd, msg, mp1, mp2);
5406
5407 case WM_CONTROLPOINTER:
5408 if (!fNoFinger &&
5409 (SHORT1FROMMP(mp1) == IDM_OPENWALK ||
5410 SHORT1FROMMP(mp1) == IDM_USERLIST))
5411 return MRFROMLONG(hptrFinger);
5412 break;
5413
5414 case UM_LOADFILE:
5415 case UM_THREADUSE:
5416 case UM_BUILDDRIVEBAR:
5417 return CommonMainWndProc(hwnd, msg, mp1, mp2);
5418
5419 case WM_BUTTON1UP:
5420 case WM_BUTTON2UP:
5421 case WM_BUTTON3UP:
5422 case WM_MOUSEMOVE:
5423 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
5424 break;
5425
5426 case WM_CHAR:
5427 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
5428 break;
5429
5430 case WM_MENUEND:
5431 if ((HWND) mp2 == MainPopupMenu) {
5432 WinDestroyWindow(MainPopupMenu);
5433 MainPopupMenu = (HWND) 0;
5434 }
5435 break;
5436
5437 case UM_CONTEXTMENU:
5438 case WM_CONTEXTMENU:
5439 if (CheckMenu(hwndMainMenu, &MainPopupMenu, MAIN_POPUP)) {
5440 SetToggleChecks(MainPopupMenu);
5441 PopupMenu(hwnd, hwnd, MainPopupMenu);
5442 }
5443 if (msg == UM_CONTEXTMENU)
5444 return 0;
5445 return MRFROMSHORT(TRUE);
5446
5447 case UM_SETUSERLISTNAME:
5448 if (mp1) {
5449 if (fUserComboBox)
5450 WinSetWindowText(WinWindowFromID(hwndUserlist, CBID_EDIT),
5451 (CHAR *) mp1);
5452 if (add_udir(FALSE, (CHAR *) mp1)) {
5453 if (fUserComboBox && fAutoAddDirs) {
5454 WinSendMsg(hwndUserlist, LM_INSERTITEM,
5455 MPFROM2SHORT(LIT_SORTASCENDING, 0),
5456 MPFROMP((CHAR *) mp1));
5457 }
5458 }
5459 }
5460 return 0;
5461
5462 case UM_ARRANGEICONS:
5463 ArrangeIcons(hwnd);
5464 return 0;
5465
5466 case WM_CHORD:
5467 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_WINDOWDLG, 0), MPVOID);
5468 break;
5469
5470 case WM_SETFOCUS:
5471 if (mp2)
5472 PostMsg(hwnd, UM_FOCUSME, MPVOID, MPVOID);
5473 break;
5474
5475 case UM_FOCUSME:
5476 WinSetFocus(hwndTree, TRUE);
5477 return 0;
5478
5479 case UM_RESCAN:
5480 TileChildren(hwnd, TRUE);
5481 return 0;
5482
5483 case WM_SAVEAPPLICATION:
5484 {
5485 SWP swp;
5486
5487 WinQueryWindowPos(WinQueryWindow(hwnd, QW_PARENT), &swp);
5488 if (!(swp.fl & (SWP_HIDE | SWP_MINIMIZE))) {
5489 WinStoreWindowPos(FM2Str,
5490 "MainWindowPos", WinQueryWindow(hwnd, QW_PARENT));
5491 if (!fNoSaveState && fSaveState)
5492 SaveDirCnrState(hwnd, NULL);
5493 }
5494 }
5495 break;
5496
5497 case MM_PORTHOLEINIT:
5498 switch (SHORT1FROMMP(mp1)) {
5499 case 0:
5500 case 1:
5501 {
5502 HWND hwndCurrent;
5503 ULONG wmsg;
5504
5505 wmsg = (SHORT1FROMMP(mp1) == 0) ? UM_FILESMENU : UM_VIEWSMENU;
5506 hwndCurrent = TopWindow(hwnd, (HWND) 0);
5507 PortholeInit((HWND) WinSendMsg(WinWindowFromID(hwndCurrent,
5508 FID_CLIENT), wmsg,
5509 MPVOID, MPVOID), mp1, mp2);
5510 }
5511 break;
5512 }
5513 break;
5514
5515 case WM_INITMENU:
5516 switch (SHORT1FROMMP(mp1)) {
5517 case IDM_CONFIGMENU:
5518 SetToggleChecks((HWND) WinQueryWindowULong(hwnd, QWL_USER));
5519 break;
5520
5521 case IDM_WINDOWSMENU:
5522 /*
5523 * add child windows of client
5524 * and switchlist entries to end of pulldown menu
5525 */
5526 {
5527 HWND hwndMenu, hwndSubMenu;
5528 MENUITEM mi;
5529
5530 hwndMenu = WinQueryWindowULong(hwnd, QWL_USER);
5531 memset(&mi, 0, sizeof(mi));
5532 mi.iPosition = MIT_END;
5533 mi.afStyle = MIS_TEXT;
5534 if (!WinSendMsg(hwndMenu, MM_QUERYITEM,
5535 MPFROM2SHORT(IDM_WINDOWSMENU, TRUE), MPFROMP(&mi)))
5536 break;
5537 hwndSubMenu = mi.hwndSubMenu;
5538 SetupWinList(hwndSubMenu, hwnd, WinQueryWindow(hwnd, QW_PARENT));
5539 }
5540 break;
5541
5542 default:
5543 {
5544 HWND hwndCurrent;
5545
5546 hwndCurrent = TopWindow(hwnd, (HWND) 0);
5547 if (hwndCurrent)
5548 WinSendMsg(hwndCurrent, UM_INITMENU, mp1, mp2);
5549 }
5550 break;
5551 }
5552 break;
5553
5554 case UM_ADDTOMENU:
5555 AddToMenu((CHAR *) mp1, WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
5556 FID_MENU));
5557 return 0;
5558
5559 case UM_FILLCMDLIST:
5560 WinSendMsg(hwndCmdlist, LM_DELETEALL, MPVOID, MPVOID);
5561 if (!cmdloaded)
5562 load_commands();
5563 if (cmdhead) {
5564
5565 LINKCMDS *info;
5566
5567 info = cmdhead;
5568 while (info) {
5569 WinSendMsg(hwndCmdlist, LM_INSERTITEM,
5570 MPFROM2SHORT(LIT_END, 0), MPFROMP(info->title));
5571 info = info->next;
5572 }
5573 }
5574 return 0;
5575
5576 case UM_FILLSETUPLIST:
5577 fill_setups_list();
5578 return 0;
5579
5580 case UM_FILLBUTTONLIST:
5581 WinSendMsg(hwndButtonlist, LM_DELETEALL, MPVOID, MPVOID);
5582 if (fUserComboBox) {
5583
5584 BOOL foundit = FALSE, thisone;
5585 ULONG ulSearchCount;
5586 SHORT sSelect;
5587 FILEFINDBUF3 findbuf;
5588 HDIR hDir;
5589 CHAR *p;
5590
5591 DosError(FERR_DISABLEHARDERR);
5592 hDir = HDIR_CREATE;
5593 ulSearchCount = 1;
5594 if (!DosFindFirst("*.TLS", &hDir, FILE_READONLY | FILE_ARCHIVED,
5595 &findbuf, sizeof(FILEFINDBUF3),
5596 &ulSearchCount, FIL_STANDARD)) {
5597 do {
5598 priority_bumped();
5599 if (!foundit) {
5600 thisone = FALSE;
5601 p = strrchr(lasttoolbox, '\\');
5602 if (!p)
5603 p = lasttoolbox;
5604 else
5605 p++;
5606 if (!stricmp(findbuf.achName, p))
5607 thisone = TRUE;
5608 }
5609 p = strrchr(findbuf.achName, '.');
5610 if (p)
5611 *p = 0;
5612 sSelect = (SHORT) WinSendMsg(hwndButtonlist, LM_INSERTITEM,
5613 MPFROM2SHORT(LIT_SORTASCENDING, 0),
5614 MPFROMP(findbuf.achName));
5615 if (!foundit && thisone && sSelect >= 0) {
5616 WinSendMsg(hwndButtonlist, LM_SELECTITEM,
5617 MPFROM2SHORT(sSelect, 0), MPFROMLONG(TRUE));
5618 foundit = TRUE;
5619 }
5620 }
5621 while (!DosFindNext(hDir, &findbuf, sizeof(FILEFINDBUF3),
5622 &ulSearchCount));
5623 DosFindClose(hDir);
5624 priority_bumped();
5625 }
5626 WinSetWindowText(hwndButtonlist, GetPString(IDS_TOOLBOXTEXT));
5627 }
5628 return 0;
5629
5630 case UM_FILLUSERLIST:
5631 WinSendMsg(hwndUserlist, LM_DELETEALL, MPVOID, MPVOID);
5632 if (fUserComboBox) {
5633 ULONG ulDriveNum;
5634 ULONG ulDriveMap;
5635 ULONG ulSearchCount;
5636 FILEFINDBUF3 findbuf;
5637 HDIR hDir;
5638 APIRET rc;
5639 LINKDIRS *info;
5640 LINKDIRS *temp;
5641
5642 if (!loadedudirs)
5643 load_udirs();
5644 DosError(FERR_DISABLEHARDERR);
5645 DosQCurDisk(&ulDriveNum, &ulDriveMap);
5646 info = udirhead;
5647 while (info) {
5648 if (IsFullName(info->path) &&
5649 !(driveflags[toupper(*info->path) - 'A'] &
5650 (DRIVE_IGNORE | DRIVE_INVALID))) {
5651 DosError(FERR_DISABLEHARDERR);
5652 hDir = HDIR_CREATE;
5653 ulSearchCount = 1;
5654 if (!IsRoot(info->path))
5655 rc = DosFindFirst(info->path, &hDir, FILE_DIRECTORY |
5656 MUST_HAVE_DIRECTORY | FILE_READONLY |
5657 FILE_ARCHIVED | FILE_SYSTEM | FILE_HIDDEN,
5658 &findbuf, sizeof(FILEFINDBUF3),
5659 &ulSearchCount, FIL_STANDARD);
5660 else {
5661 rc = 0;
5662 findbuf.attrFile = FILE_DIRECTORY;
5663 }
5664 priority_bumped();
5665 if (!rc) {
5666 if (!IsRoot(info->path))
5667 DosFindClose(hDir);
5668 if (findbuf.attrFile & FILE_DIRECTORY)
5669 WinSendMsg(hwndUserlist, LM_INSERTITEM,
5670 MPFROM2SHORT(LIT_SORTASCENDING, 0),
5671 MPFROMP(info->path));
5672 else {
5673 temp = info->next;
5674 remove_udir(info->path);
5675 info = temp;
5676 continue;
5677 }
5678 }
5679 else if (!(ulDriveMap & (1 << (toupper(*info->path) - 'A')))) {
5680 temp = info->next;
5681 remove_udir(info->path);
5682 info = temp;
5683 continue;
5684 }
5685 }
5686 info = info->next;
5687 }
5688 info = ldirhead;
5689 while (info) {
5690 if (IsFullName(info->path) &&
5691 !(driveflags[toupper(*info->path) - 'A'] &
5692 (DRIVE_IGNORE | DRIVE_INVALID))) {
5693 DosError(FERR_DISABLEHARDERR);
5694 hDir = HDIR_CREATE;
5695 ulSearchCount = 1;
5696 if (!IsRoot(info->path))
5697 rc = DosFindFirst(info->path, &hDir, FILE_DIRECTORY |
5698 MUST_HAVE_DIRECTORY | FILE_READONLY |
5699 FILE_ARCHIVED | FILE_SYSTEM | FILE_HIDDEN,
5700 &findbuf, sizeof(FILEFINDBUF3),
5701 &ulSearchCount, FIL_STANDARD);
5702 else {
5703 rc = 0;
5704 findbuf.attrFile = FILE_DIRECTORY;
5705 }
5706 priority_bumped();
5707 if (!rc) {
5708 if (!IsRoot(info->path))
5709 DosFindClose(hDir);
5710 if (findbuf.attrFile & FILE_DIRECTORY)
5711 WinSendMsg(hwndUserlist, LM_INSERTITEM,
5712 MPFROM2SHORT(LIT_SORTASCENDING, 0),
5713 MPFROMP(info->path));
5714 else {
5715 temp = info->next;
5716 remove_udir(info->path);
5717 info = temp;
5718 continue;
5719 }
5720 }
5721 else if (!(ulDriveMap & (1 << (toupper(*info->path) - 'A')))) {
5722 temp = info->next;
5723 remove_udir(info->path);
5724 info = temp;
5725 continue;
5726 }
5727 }
5728 info = info->next;
5729 }
5730 WinSendMsg(hwndUserlist, LM_INSERTITEM,
5731 MPFROM2SHORT(0, 0),
5732 MPFROMP(GetPString(IDS_NEWDIRECTORYTEXT)));
5733 WinSetWindowText(hwndUserlist, GetPString(IDS_COMMONDIRTEXT));
5734 }
5735 return 0;
5736
5737 case UM_SIZE:
5738 if (fAutoTile)
5739 TileChildren(hwnd, FALSE);
5740 else
5741 MoveChildrenAwayFromTree(hwnd);
5742 return 0;
5743
5744 case WM_SIZE:
5745 ResizeChildren(hwnd, SHORT1FROMMP(mp1), SHORT2FROMMP(mp1),
5746 SHORT1FROMMP(mp2), SHORT2FROMMP(mp2));
5747 break;
5748
5749 case WM_ERASEBACKGROUND:
5750 WinFillRect((HPS) mp1, (PRECTL) mp2, 0x00d0d0d0);
5751 return 0;
5752
5753 case WM_PAINT:
5754 {
5755 HPS hps;
5756 RECTL rcl;
5757
5758 hps = WinBeginPaint(hwnd, (HPS) 0, NULL);
5759 if (hps) {
5760 WinQueryWindowRect(hwnd, &rcl);
5761 WinFillRect(hps, &rcl, CLR_PALEGRAY);
5762 WinEndPaint(hps);
5763 }
5764 }
5765 break;
5766
5767 case UM_CONTROL:
5768 switch (SHORT1FROMMP(mp1)) {
5769 case MAIN_CMDLIST:
5770 case MAIN_SETUPLIST:
5771 case MAIN_DRIVELIST:
5772 case MAIN_USERLIST:
5773 case MAIN_BUTTONLIST:
5774 switch (SHORT2FROMMP(mp1)) {
5775 case CBN_ENTER:
5776 {
5777 HWND hwndUL = WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
5778 SHORT1FROMMP(mp1));
5779 CHAR path[CCHMAXPATH];
5780 ULONG ul;
5781
5782 switch (SHORT1FROMMP(mp1)) {
5783 case MAIN_USERLIST:
5784 ul = CCHMAXPATH;
5785 break;
5786 case MAIN_SETUPLIST:
5787 ul = STATE_NAME_MAX_BYTES;
5788 break;
5789 default:
5790 ul = 13; // fixme to not be hardcoded
5791 }
5792
5793 SetShiftState();
5794 WinQueryWindowText(WinWindowFromID(hwndUL, CBID_EDIT), ul, path);
5795 bstrip(path);
5796 if (*path) {
5797 if (SHORT1FROMMP(mp1) == MAIN_USERLIST) {
5798 if (!strcmp(path, GetPString(IDS_NEWDIRECTORYTEXT))) {
5799 if (!LastDir ||
5800 !WinSendMsg(WinQueryWindow(LastDir, QW_PARENT),
5801 UM_CONTAINERDIR, MPFROMP(path), MPVOID))
5802 save_dir2(path);
5803 if (!PMMkDir(hwnd, path, TRUE)) {
5804 WinSetWindowText(hwndUL, GetPString(IDS_COMMONDIRTEXT));
5805 break;
5806 }
5807 }
5808 if (!IsFile(path) && !FindDirCnrByName(path, TRUE)) {
5809
5810 HWND hwndDir;
5811
5812 if ((fUserListSwitches &&
5813 !(shiftstate & KC_SHIFT)) ||
5814 (!fUserListSwitches && (shiftstate & KC_SHIFT))) {
5815 hwndDir = FindDirCnr(hwnd);
5816 if (hwndDir) {
5817 WinSendMsg(LastDir, UM_SETDIR, MPFROMP(path), MPVOID);
5818 break;
5819 }
5820 }
5821 OpenDirCnr((HWND) 0, hwndMain, hwndTree, FALSE, path);
5822 }
5823 }
5824 else if (SHORT1FROMMP(mp1) == MAIN_DRIVELIST) {
5825 ShowTreeRec(WinWindowFromID(WinWindowFromID(hwndTree,
5826 FID_CLIENT),
5827 TREE_CNR), path, FALSE, TRUE);
5828 WinSetFocus(HWND_DESKTOP, hwndTree);
5829 }
5830 else if (SHORT1FROMMP(mp1) == MAIN_BUTTONLIST) {
5831 strcat(path, ".TLS");
5832 load_tools(path);
5833 PrfWriteProfileString(fmprof,
5834 FM3Str, "LastToolBox", lasttoolbox);
5835 BuildTools(hwndToolback, TRUE);
5836 WinSetWindowText(hwndButtonlist, GetPString(IDS_TOOLBOXTEXT));
5837 }
5838 else if (SHORT1FROMMP(mp1) == MAIN_SETUPLIST) {
5839
5840 CHAR szKey[80];
5841 ULONG size, numsaves = 0;
5842
5843 SetShiftState();
5844 size = sizeof(ULONG);
5845 sprintf(szKey, "%s.NumDirsLastTime", path); // path is state name
5846 if (!PrfQueryProfileData(fmprof,
5847 FM3Str,
5848 szKey,
5849 (PVOID)&numsaves,
5850 &size))
5851 {
5852 if ((WinGetLastError(WinQueryAnchorBlock(hwnd)) & 0xffff) == PMERR_NOT_IN_IDX) {
5853 saymsg(MB_ENTER | MB_ICONASTERISK, hwnd,
5854 GetPString(IDS_WARNINGTEXT),
5855 GetPString(IDS_DOESNTEXISTTEXT), path);
5856 }
5857 else {
5858 Win_Error2(hwnd, hwnd, __FILE__, __LINE__,
5859 IDS_PRFQUERYPROFILEDATA);
5860 }
5861 }
5862 else if (!numsaves)
5863 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
5864 else {
5865 if ((shiftstate & KC_SHIFT) == 0)
5866 PostMsg(MainObjectHwnd, UM_RESTORE, MPVOID, MPFROMLONG(2L));
5867 {
5868 char *temp;
5869
5870 temp = xstrdup(path, pszSrcFile, __LINE__);
5871 if (!temp) {
5872 if ((shiftstate & KC_SHIFT) != 0 || fAutoTile)
5873 PostMsg(MainObjectHwnd, UM_RESTORE, MPVOID,
5874 MPFROMLONG(1));
5875 }
5876 else {
5877 if (!PostMsg
5878 (MainObjectHwnd, UM_RESTORE, MPFROMP(temp), MPVOID))
5879 free(temp);
5880 }
5881 }
5882 }
5883 // fixme to hold restored state name for a while
5884 // WinSetWindowText(hwndStatelist, GetPString(IDS_STATETEXT)); // 15 Apr 07 SHL
5885 }
5886 else if (SHORT1FROMMP(mp1) == MAIN_CMDLIST) {
5887
5888 SHORT sSelect;
5889
5890 sSelect = (SHORT) WinSendMsg(hwndCmdlist,
5891 LM_QUERYSELECTION,
5892 MPFROMSHORT(LIT_FIRST), MPVOID);
5893 if (sSelect >= 0)
5894 WinPostMsg(hwnd,
5895 WM_COMMAND,
5896 MPFROM2SHORT(IDM_COMMANDSTART + sSelect, 0),
5897 MPVOID);
5898 WinSetWindowText(hwndCmdlist, GetPString(IDS_COMMANDSTEXT));
5899 }
5900 }
5901 }
5902 break;
5903
5904 default:
5905 break;
5906 }
5907 break;
5908
5909 default:
5910 break;
5911 }
5912 return 0;
5913
5914 case WM_HELP:
5915 WinSendMsg(hwndHelp, HM_HELP_CONTENTS, MPVOID, MPVOID);
5916 break;
5917
5918 case UM_COMMAND:
5919 case WM_COMMAND:
5920
5921 return MainWMCommand(hwnd, msg, mp1, mp2);
5922
5923 case WM_CLOSE:
5924 WinSendMsg(WinQueryWindow(hwnd, QW_PARENT),
5925 WM_SYSCOMMAND, MPFROM2SHORT(SC_RESTORE, 0), MPVOID);
5926 WinSendMsg(hwnd, WM_SAVEAPPLICATION, MPVOID, MPVOID);
5927 fAmClosing = TRUE;
5928 WinSendMsg(WinQueryWindow(hwnd, QW_PARENT),
5929 WM_SYSCOMMAND, MPFROM2SHORT(SC_MINIMIZE, 0), MPVOID);
5930 if (CloseChildren(hwnd)) {
5931 fAmClosing = FALSE;
5932 if (fAutoTile)
5933 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_TILE, 0), MPVOID);
5934 return 0;
5935 }
5936 if (hwndTree) {
5937 if (!PostMsg(hwndTree, WM_CLOSE, MPVOID, MPVOID))
5938 WinSendMsg(hwndTree, WM_CLOSE, MPVOID, MPVOID);
5939 }
5940 DosSleep(1);
5941 return 0; // Hold off WM_QUIT
5942
5943 case UM_CLOSE:
5944 HideNote();
5945 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
5946 return 0;
5947
5948 case UM_RESTORE:
5949 {
5950 char *temp;
5951
5952 temp = xstrdup(GetPString(IDS_FM2TEMPTEXT), pszSrcFile, __LINE__);
5953 if (temp) {
5954 if (!PostMsg(MainObjectHwnd, UM_RESTORE, MPFROMP(temp), MPVOID))
5955 free(temp);
5956 }
5957 }
5958 return 0;
5959
5960 case UM_SETDIR:
5961 /* mp1 == name of directory to open */
5962 if (mp1)
5963 return MRFROMLONG(OpenDirCnr((HWND) 0,
5964 hwndMain,
5965 hwndTree, (BOOL) mp2, (char *)mp1));
5966 return 0;
5967
5968 case WM_DESTROY:
5969 hwndMain = (HWND) 0;
5970 if (!PostMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID))
5971 WinSendMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID);
5972 break;
5973 }
5974
5975 return WinDefWindowProc(hwnd, msg, mp1, mp2);
5976}
5977
5978#pragma alloc_text(MISC8,SetToggleChecks,FindDirCnrByName,TopWindow)
5979#pragma alloc_text(MISC8,TopWindowName,CountDirCnrs)
5980#pragma alloc_text(MAINWND,AdjustSizeOfClient,FillClient,ChildButtonProc)
5981#pragma alloc_text(MAINWND,ToolBackProc,StatusProc)
5982#pragma alloc_text(MAINWND,MoveChildrenAwayFromTree,ArrangeIcons,NextChild)
5983#pragma alloc_text(MAINWND,ChildFrameButtonProc)
5984#pragma alloc_text(MAINWND2,CloseChildren,CountChildren,GetNextWindowPos)
5985#pragma alloc_text(MAINWND2,CascadeChildren,TileChildren,ResizeChildren)
5986#pragma alloc_text(MAINWND2,MinResChildren,MainFrameWndProc,MainWndProc)
5987#pragma alloc_text(MAINWND2,DropDownListProc)
5988#pragma alloc_text(MAINWND3,RestoreDirCnrState,SaveDirCnrState)
5989#pragma alloc_text(MAINWND3,CloseDirCnrChildren,TransformSwp)
5990#pragma alloc_text(MAINWND3,ResizeTools,BuildTools,CommandLineProc)
5991#pragma alloc_text(MAINWND4,DriveProc,DriveBackProc,BuildDriveBarButtons,ResizeDrives)
5992#pragma alloc_text(MAINWND4,LEDProc,IdealButtonProc)
5993#pragma alloc_text(MAINWND5,MainWMOnce)
5994#pragma alloc_text(MAINWND6,MainWMCommand)
5995#pragma alloc_text(BUBBLE,MakeBubble,BubbleProc,BubbleHelp)
5996#pragma alloc_text(MAINOBJ,MainObjectWndProc,MakeMainObjWin)
5997
Note: See TracBrowser for help on using the repository browser.