source: trunk/dll/mainwnd.c@ 875

Last change on this file since 875 was 875, checked in by Gregg Young, 18 years ago

Used global variable to link presparams to main menu window for both drop down and pop up menus

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