source: trunk/dll/mainwnd.c@ 922

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

Rework Config menu. Move some to submenu. Add drag&drop dialog toggle.
Rework Walk dialog. Put entry field at the top.

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