source: trunk/dll/mainwnd.c@ 888

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

runemf2 now quotes executable strings if needed (Ticket 180); it also reports where it was called from on errors

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 160.4 KB
Line 
1
2/***********************************************************************
3
4 $Id: mainwnd.c 888 2007-12-22 22:02:11Z 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, pszSrcFile, __LINE__);
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 pszSrcFile, __LINE__);
1964 FreeList(li->list);
1965 li->list = NULL;
1966 break;
1967 case DO_LINK:
1968 if (fLinkSetsIcon) {
1969 li->type = IDM_SETICON;
1970 action = UM_MASSACTION;
1971 }
1972 else
1973 li->type = IDM_COMPARE;
1974 break;
1975 case DND_EXTRACT:
1976 if (*li->targetpath && !IsFile(li->targetpath))
1977 li->type = IDM_EXTRACT;
1978 break;
1979 case DND_MOVE:
1980 li->type = IDM_MOVE;
1981 if (*li->targetpath && IsFile(li->targetpath) == 1) {
1982 action = UM_MASSACTION;
1983 li->type = IDM_ARCHIVEM;
1984 }
1985 break;
1986 case DND_WILDMOVE:
1987 li->type = IDM_WILDMOVE;
1988 if (*li->targetpath && IsFile(li->targetpath) == 1) {
1989 action = UM_MASSACTION;
1990 li->type = IDM_ARCHIVEM;
1991 }
1992 break;
1993 case DND_OBJECT:
1994 li->type = IDM_OBJECT;
1995 action = UM_MASSACTION;
1996 break;
1997 case DND_SHADOW:
1998 li->type = IDM_SHADOW;
1999 action = UM_MASSACTION;
2000 break;
2001 case DND_COMPARE:
2002 li->type = IDM_COMPARE;
2003 break;
2004 case DND_SETICON:
2005 action = UM_MASSACTION;
2006 li->type = IDM_SETICON;
2007 break;
2008 case DND_COPY:
2009 li->type = IDM_COPY;
2010 if (*li->targetpath && IsFile(li->targetpath) == 1) {
2011 action = UM_MASSACTION;
2012 li->type = IDM_ARCHIVE;
2013 }
2014 break;
2015 case DND_WILDCOPY:
2016 li->type = IDM_WILDCOPY;
2017 if (*li->targetpath && IsFile(li->targetpath) == 1) {
2018 action = UM_MASSACTION;
2019 li->type = IDM_ARCHIVE;
2020 }
2021 break;
2022 default:
2023 if (*li->arcname && li->info) {
2024 action = UM_MASSACTION;
2025 li->type = (li->type == DO_MOVE) ? IDM_FAKEEXTRACTM :
2026 IDM_FAKEEXTRACT;
2027 }
2028 else if (*li->targetpath && IsFile(li->targetpath) == 1) {
2029 action = UM_MASSACTION;
2030 li->type = (li->type == DO_MOVE) ? IDM_ARCHIVEM : IDM_ARCHIVE;
2031 }
2032 else
2033 li->type = (li->type == DO_MOVE) ? IDM_MOVE : IDM_COPY;
2034 break;
2035 }
2036 if (!li->list || !li->list[0])
2037 FreeListInfo(li);
2038 else
2039 WinSendMsg(hwndTree, UM_ACTION, MPFROMP(li), MPFROMLONG(action));
2040 }
2041 return 0;
2042 }
2043 break;
2044
2045 case WM_DESTROY:
2046 if (hwndMenu)
2047 WinDestroyWindow(hwndMenu);
2048 hwndMenu = (HWND) 0;
2049 break;
2050 }
2051 return PFNWPButton(hwnd, msg, mp1, mp2);
2052}
2053
2054VOID BuildDriveBarButtons(HWND hwndT)
2055{
2056 register ULONG x, y = 0;
2057 ULONG ulDriveNum, ulDriveMap, iconid;
2058 CHAR s[8];
2059 HENUM henum;
2060 HWND hwndB;
2061
2062 henum = WinBeginEnumWindows(hwndT);
2063
2064 while ((hwndB = WinGetNextWindow(henum)) != NULLHANDLE)
2065 WinDestroyWindow(hwndB);
2066
2067 WinEndEnumWindows(henum);
2068 if (fDrivebar) {
2069 DosError(FERR_DISABLEHARDERR);
2070 DosQCurDisk(&ulDriveNum, &ulDriveMap);
2071 for (x = 0; x < 26; x++) {
2072 if ((ulDriveMap & (1L << x)) && !(driveflags[x] & DRIVE_IGNORE)) {
2073 if (x > 1) {
2074 if (driveflags[x] & DRIVE_CDROM)
2075 iconid = CDROM_ICON;
2076 else
2077 iconid = (driveflags[x] & DRIVE_REMOVABLE) ?
2078 REMOVABLE_ICON :
2079 (driveflags[x] & DRIVE_VIRTUAL) ?
2080 VIRTUAL_ICON :
2081 (driveflags[x] & DRIVE_REMOTE) ?
2082 REMOTE_ICON :
2083 (driveflags[x] & DRIVE_RAMDISK) ?
2084 RAMDISK_ICON :
2085 (driveflags[x] & DRIVE_ZIPSTREAM) ?
2086 ZIPSTREAM_ICON :DRIVE_ICON;
2087 }
2088 else
2089 iconid = FLOPPY_ICON;
2090 sprintf(s, "#%lu", iconid);
2091 hwndB = WinCreateWindow(hwndT,
2092 WC_DRIVEBUTTONS,
2093 s,
2094 BS_NOPOINTERFOCUS | BS_BITMAP | BS_PUSHBUTTON,
2095 0,
2096 0,
2097 28,
2098 18,
2099 hwndT, HWND_TOP, y + IDM_DRIVEA, NULL, NULL);
2100 if (!hwndB)
2101 Win_Error2(hwndT, HWND_DESKTOP, pszSrcFile, __LINE__,
2102 IDS_WINCREATEWINDOW);
2103 else {
2104 WinSetWindowPos(hwndB, HWND_BOTTOM, 0, 0, 0, 0, SWP_ZORDER);
2105 sprintf(s, "%c:", (CHAR) x + 'A');
2106 hwndB = WinCreateWindow(hwndT,
2107 WC_STATIC,
2108 s,
2109 SS_TEXT | DT_LEFT | DT_VCENTER,
2110 0,
2111 0,
2112 10,
2113 18,
2114 hwndT,
2115 HWND_TOP, y + IDM_DRIVEATEXT, NULL, NULL);
2116 if (!hwndB)
2117 Win_Error2(hwndT, HWND_DESKTOP, pszSrcFile, __LINE__,
2118 IDS_WINCREATEWINDOW);
2119 else {
2120 SetPresParams(hwndB,
2121 &RGBGREY,
2122 &RGBBLACK, &RGBGREY, GetPString(IDS_6HELVTEXT));
2123 WinSetWindowPos(hwndB, HWND_BOTTOM, 0, 0, 0, 0, SWP_ZORDER);
2124 }
2125 y++;
2126 }
2127 }
2128 } // for
2129 } // if drivebar
2130 PostMsg(WinQueryWindow(hwndT, QW_PARENT),
2131 WM_UPDATEFRAME, MPFROMLONG(FCF_SIZEBORDER), MPVOID);
2132}
2133
2134VOID ResizeDrives(HWND hwndT, long xwidth)
2135{
2136 register ULONG ctrlxpos = 2, ctrlypos = 0, ctrlxsize;
2137 HENUM henum;
2138 HWND hwndB;
2139 RECTL rcl;
2140
2141 DriveLines = 0;
2142 if (!fDrivebar)
2143 return;
2144 if (!xwidth) {
2145 WinQueryWindowRect(hwndT, &rcl);
2146 xwidth = rcl.xRight - ((WinQuerySysValue(HWND_DESKTOP,
2147 SV_CYSIZEBORDER) * 2) + 2);
2148 }
2149 henum = WinBeginEnumWindows(hwndT);
2150 while ((hwndB = WinGetNextWindow(henum)) != NULLHANDLE) {
2151 if (WinQueryWindowUShort(hwndB, QWS_ID) > IDM_DRIVEA + 27)
2152 ctrlxsize = 10;
2153 else
2154 ctrlxsize = 28;
2155 WinSetWindowPos(hwndB,
2156 HWND_TOP,
2157 ctrlxpos, ctrlypos, ctrlxsize, 18, SWP_MOVE | SWP_SHOW);
2158 ctrlxpos += (ctrlxsize + 2);
2159 if (ctrlxsize == 10) {
2160 if (ctrlxpos + (42 + ((fShowTarget && DriveLines == 0) ?
2161 256 : 0)) > xwidth) {
2162 ctrlxpos = 2;
2163 ctrlypos += 18;
2164 DriveLines++;
2165 }
2166 }
2167 }
2168 if (ctrlxpos == 2 && DriveLines)
2169 DriveLines--;
2170}
2171
2172MRESULT EXPENTRY StatusProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
2173{
2174 static HWND hwndE = (HWND) 0, hwndB = (HWND) 0;
2175 static CHAR lastcmd[1024] = "";
2176
2177 switch (msg) {
2178 case WM_CREATE:
2179 {
2180 MRESULT mr = PFNWPStatic(hwnd, msg, mp1, mp2);
2181
2182 SetPresParams(hwnd,
2183 &RGBGREY,
2184 &RGBBLACK, &RGBGREY, GetPString(IDS_8HELVBOLDTEXT));
2185 return mr;
2186 }
2187
2188 case WM_PRESPARAMCHANGED:
2189 if (fRunning) {
2190
2191 ULONG AttrFound, AttrValue[64], cbRetLen;
2192
2193 cbRetLen = WinQueryPresParam(hwnd,
2194 (ULONG) mp1,
2195 0,
2196 &AttrFound,
2197 (ULONG) sizeof(AttrValue), &AttrValue, 0);
2198 if (cbRetLen) {
2199 //switch (AttrFound) {
2200 //case PP_FONTNAMESIZE:
2201 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
2202 WM_UPDATEFRAME, MPFROMLONG(FCF_SIZEBORDER), MPVOID);
2203 break;
2204
2205 }
2206 }
2207 break;
2208
2209 case WM_CONTEXTMENU:
2210 PostMsg(hwndMain, UM_CONTEXTMENU, MPVOID, MPVOID);
2211 return MRFROMSHORT(TRUE);
2212
2213 case WM_BEGINDRAG:
2214 if (hwndTree) {
2215
2216 SWP swp;
2217 ULONG fl = SWP_ACTIVATE | SWP_SHOW | SWP_ZORDER;
2218
2219 WinQueryWindowPos(hwndTree, &swp);
2220 if (!(swp.fl & SWP_MAXIMIZE))
2221 fl |= SWP_RESTORE;
2222 WinSetWindowPos(hwndTree, HWND_TOP, 0, 0, 0, 0, fl);
2223 }
2224 break;
2225
2226 case UM_SETUP:
2227 if (mp1)
2228 strcpy(lastcmd, (CHAR *) mp1);
2229 return 0;
2230
2231 case UM_RESCAN:
2232 if (hwndE && WinIsWindow(WinQueryAnchorBlock(hwnd), hwndE))
2233 WinDestroyWindow(hwndE);
2234 if (hwndB && WinIsWindow(WinQueryAnchorBlock(hwnd), hwndB))
2235 WinDestroyWindow(hwndB);
2236 hwndE = hwndB = (HWND) 0;
2237 return 0;
2238
2239 case WM_COMMAND:
2240 switch (SHORT1FROMMP(mp1)) {
2241 case COMMAND_BUTTON:
2242 PostMsg(hwndE, msg, mp1, mp2);
2243 break;
2244 }
2245 return 0;
2246
2247 case WM_MOUSEMOVE:
2248 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
2249 {
2250 USHORT id = WinQueryWindowUShort(hwnd, QWS_ID);
2251 char *s = NULL;
2252
2253 if (fOtherHelp) {
2254 if ((!hwndBubble || WinQueryWindowULong(hwndBubble, QWL_USER) != hwnd)
2255 && !WinQueryCapture(HWND_DESKTOP)) {
2256 switch (id) {
2257 case IDM_ATTRS:
2258 if (WinQueryWindowTextLength(hwnd))
2259 s = GetPString(IDS_ATTRSBUTTONHELP);
2260 break;
2261 case IDM_INFO:
2262 if (WinQueryWindowTextLength(hwnd))
2263 s = GetPString(IDS_INFOBUTTONHELP);
2264 break;
2265 case IDM_RENAME:
2266 if (WinQueryWindowTextLength(hwnd))
2267 s = GetPString(IDS_NAMEBUTTONHELP);
2268 break;
2269 case MAIN_STATUS2:
2270 if (!hwndE)
2271 s = GetPString(IDS_STATUS2HELP);
2272 break;
2273 default:
2274 break;
2275 }
2276 if (s)
2277 MakeBubble(hwnd, FALSE, s);
2278 else if (hwndBubble)
2279 WinDestroyWindow(hwndBubble);
2280 }
2281 }
2282 switch (id) {
2283 case IDM_ATTRS:
2284 case IDM_INFO:
2285 case IDM_RENAME:
2286 case MAIN_STATUS2:
2287 return CommonTextProc(hwnd, msg, mp1, mp2);
2288 default:
2289 break;
2290 }
2291 }
2292 break;
2293
2294 case WM_BUTTON2DOWN:
2295 case WM_BUTTON2UP:
2296 case UM_FOCUSME:
2297 return CommonTextButton(hwnd, msg, mp1, mp2);
2298
2299 case WM_BUTTON1DOWN:
2300 case WM_BUTTON1UP:
2301 case WM_BUTTON3DOWN:
2302 case WM_BUTTON3UP:
2303 {
2304 USHORT id;
2305
2306 id = WinQueryWindowUShort(hwnd, QWS_ID);
2307 switch (id) {
2308 case IDM_ATTRS:
2309 case IDM_INFO:
2310 case IDM_RENAME:
2311 case MAIN_STATUS2:
2312 return CommonTextButton(hwnd, msg, mp1, mp2);
2313 default:
2314 PostMsg(hwnd, UM_FOCUSME, MPVOID, MPVOID);
2315 break;
2316 }
2317 }
2318 break;
2319
2320 case WM_SETFOCUS:
2321 if (mp2) {
2322
2323 USHORT id;
2324
2325 id = WinQueryWindowUShort(hwnd, QWS_ID);
2326 if (id == MAIN_STATUS2 && hwndE)
2327 WinSendMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
2328 else
2329 return CommonTextButton(hwnd, msg, mp1, mp2);
2330 }
2331 break;
2332
2333 case WM_BUTTON1CLICK:
2334 {
2335 USHORT id;
2336
2337 id = WinQueryWindowUShort(hwnd, QWS_ID);
2338 if (id == MAIN_STATUS) {
2339 if (SHORT2FROMMP(mp2) & KC_CTRL)
2340 PostMsg(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
2341 FID_CLIENT),
2342 WM_COMMAND, MPFROM2SHORT(IDM_WINDOWDLG, 0), MPVOID);
2343 else if (hwndTree)
2344 PostMsg(hwndTree, UM_TIMER, MPVOID, MPVOID);
2345 }
2346 }
2347 break;
2348
2349 case UM_CLICKED:
2350 case UM_CLICKED3:
2351 {
2352 USHORT id;
2353
2354 id = WinQueryWindowUShort(hwnd, QWS_ID);
2355 if (id == MAIN_STATUS2 && !hwndE) {
2356
2357 SWP swp;
2358 CHAR directory[CCHMAXPATH];
2359 PFNWP oldproce;
2360
2361 *directory = 0;
2362 TopWindowName(hwndMain, (HWND) 0, directory);
2363 WinQueryWindowPos(hwnd, &swp);
2364 hwndB = WinCreateWindow(hwnd,
2365 WC_BUTTON,
2366 "+",
2367 WS_VISIBLE | BS_PUSHBUTTON |
2368 BS_NOPOINTERFOCUS,
2369 swp.cx - swp.cy,
2370 0,
2371 swp.cy,
2372 swp.cy,
2373 hwnd, HWND_TOP, COMMAND_BUTTON, NULL, NULL);
2374 if (!hwndB)
2375 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
2376 hwndE = WinCreateWindow(hwnd,
2377 WC_ENTRYFIELD,
2378 NULL,
2379 WS_VISIBLE | ES_AUTOSCROLL,
2380 0,
2381 0,
2382 swp.cx - swp.cy,
2383 swp.cy,
2384 hwnd, HWND_TOP, COMMAND_LINE, NULL, NULL);
2385 if (!hwndE)
2386 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
2387 if (!hwndE || !hwndB) {
2388 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
2389 return 0;
2390 }
2391 WinSendMsg(hwndE, EM_SETTEXTLIMIT, MPFROM2SHORT(1024, 0), MPVOID);
2392 WinSetWindowText(hwndStatus, directory);
2393 if (*lastcmd)
2394 WinSetWindowText(hwndE, lastcmd);
2395 else
2396 WinSetWindowText(hwndE, GetPString(IDS_HELPCMDTEXT));
2397 oldproce = WinSubclassWindow(hwndE, (PFNWP) CommandLineProc);
2398 if (oldproce)
2399 WinSetWindowPtr(hwndE, QWL_USER, (PVOID) oldproce);
2400 PostMsg(hwndE, UM_FOCUSME, MPVOID, MPVOID);
2401 PostMsg(hwndE, EM_SETSEL, MPFROM2SHORT(0, 1024), MPVOID);
2402 return 0;
2403 }
2404 if (msg == UM_CLICKED3 || (SHORT2FROMMP(mp2) & KC_CTRL)) {
2405 switch (id) {
2406 case IDM_ATTRS:
2407 id = IDM_SORTSIZE;
2408 break;
2409 case IDM_INFO:
2410 id = IDM_SORTLWDATE;
2411 break;
2412 case IDM_RENAME:
2413 id = IDM_SORTFILENAME;
2414 break;
2415 }
2416 }
2417 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
2418 WM_COMMAND, MPFROM2SHORT(id, 0), MPVOID);
2419 }
2420 return 0;
2421
2422 case WM_PAINT:
2423 {
2424 USHORT id;
2425
2426 id = WinQueryWindowUShort(hwnd, QWS_ID);
2427 switch (id) {
2428 case IDM_ATTRS:
2429 case IDM_INFO:
2430 case IDM_RENAME:
2431 case MAIN_STATUS2:
2432 PaintRecessedWindow(hwnd, (HPS) 0, TRUE, FALSE);
2433 break;
2434 default:
2435 PaintRecessedWindow(hwnd, (HPS) 0, FALSE, TRUE);
2436 break;
2437 }
2438 if (id == IDM_RENAME) {
2439
2440 HPS hps;
2441
2442 hps = WinBeginPaint(hwnd, (HPS) 0, NULL);
2443 if (hps) {
2444 PaintSTextWindow(hwnd, hps);
2445 WinEndPaint(hps);
2446 }
2447 return 0;
2448 }
2449 }
2450 break;
2451
2452 }
2453 return PFNWPStatic(hwnd, msg, mp1, mp2);
2454}
2455
2456MRESULT EXPENTRY ToolBackProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
2457{
2458 switch (msg) {
2459 case WM_CREATE:
2460 hwndToolback = hwnd;
2461 SetPresParams(hwnd,
2462 &RGBGREY, &RGBBLACK, &RGBGREY, GetPString(IDS_8HELVTEXT));
2463 break;
2464
2465 case WM_MOUSEMOVE:
2466 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
2467 break;
2468
2469 case WM_CONTROLPOINTER:
2470 if (!fNoFinger && SHORT1FROMMP(mp1) < 25000)
2471 return MRFROMLONG(hptrFinger);
2472 break;
2473
2474 case WM_CHAR:
2475 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
2476 break;
2477
2478 case WM_COMMAND:
2479 case UM_COMMAND:
2480 return WinSendMsg(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
2481 FID_CLIENT), msg, mp1, mp2);
2482
2483 case WM_PAINT:
2484 {
2485 HPS hps;
2486 RECTL rcl;
2487
2488 hps = WinBeginPaint(hwnd, (HPS) 0, NULL);
2489 if (hps) {
2490 WinQueryWindowRect(hwnd, &rcl);
2491 WinFillRect(hps, &rcl, CLR_PALEGRAY);
2492 WinEndPaint(hps);
2493 }
2494 PaintRecessedWindow(hwnd, (HPS) 0, TRUE, FALSE);
2495 }
2496 break;
2497
2498 case UM_SETUP:
2499 {
2500 USHORT id;
2501 TOOL *tool;
2502
2503 id = SHORT1FROMMP(mp1);
2504 tool = find_tool(id);
2505 if (tool) {
2506 del_tool(tool);
2507 WinShowWindow(WinWindowFromID(hwnd, id), FALSE);
2508 if (fToolTitles)
2509 WinShowWindow(WinWindowFromID(hwnd, id + 25000), FALSE);
2510 ResizeTools(hwnd);
2511 }
2512 }
2513 return 0;
2514
2515 case WM_CHORD:
2516 {
2517 USHORT id;
2518
2519 id = (USHORT) WinDlgBox(HWND_DESKTOP,
2520 hwnd,
2521 AddToolProc,
2522 FM3ModHandle, ADDBTN_FRAME, MPVOID);
2523 if (id && id != (USHORT) - 1)
2524 WinSendMsg(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
2525 FID_CLIENT),
2526 WM_COMMAND,
2527 MPFROM2SHORT(IDM_CREATETOOL, 0), MPFROM2SHORT(id, 0));
2528 }
2529 break;
2530
2531 case WM_CONTEXTMENU:
2532 if (WinDlgBox(HWND_DESKTOP,
2533 hwnd, ToolIODlgProc, FM3ModHandle, SVBTN_FRAME, MPVOID))
2534 BuildTools(hwnd, TRUE);
2535 return MRFROMSHORT(TRUE);
2536
2537 case WM_CLOSE:
2538 WinDestroyWindow(hwnd);
2539 return 0;
2540
2541 case WM_DESTROY:
2542 break;
2543 }
2544 return WinDefWindowProc(hwnd, msg, mp1, mp2);
2545}
2546
2547static VOID AdjustSizeOfClient(PSWP pswp, PRECTL prectl)
2548{
2549 SWP swp;
2550 RECTL rectl;
2551
2552 if (fFreeTree)
2553 return;
2554 if (pswp) {
2555 if (WinQueryWindowPos(hwndTree, &swp) &&
2556 !(swp.fl & (SWP_MINIMIZE | SWP_HIDE | SWP_MAXIMIZE))) {
2557 pswp->x = swp.cx;
2558 pswp->cx -= swp.cx;
2559 }
2560 }
2561 if (prectl) {
2562 if (WinQueryWindowPos(hwndTree, &swp) &&
2563 !(swp.fl & (SWP_MINIMIZE | SWP_HIDE | SWP_MAXIMIZE)) &&
2564 WinQueryWindowRect(hwndTree, &rectl)) {
2565 prectl->xLeft = rectl.xRight;
2566 prectl->xRight -= rectl.xRight;
2567 }
2568 }
2569}
2570
2571VOID FillClient(HWND hwndClient, PSWP pswp, PRECTL prectl, BOOL avoidtree)
2572{
2573 ULONG adjust;
2574
2575 adjust = WinQuerySysValue(HWND_DESKTOP, SV_CYICON);
2576 if (pswp)
2577 WinQueryWindowPos(hwndClient, pswp);
2578 if (prectl)
2579 WinQueryWindowRect(hwndClient, prectl);
2580 if (avoidtree && !fFreeTree)
2581 AdjustSizeOfClient(pswp, prectl);
2582 if (prectl)
2583 prectl->yBottom += adjust;
2584 if (pswp) {
2585 if (!avoidtree || fFreeTree)
2586 pswp->x = 0;
2587 pswp->y = adjust;
2588 if (pswp->cy >= adjust)
2589 pswp->cy -= adjust;
2590 else
2591 pswp->cy = 0;
2592 }
2593}
2594
2595static VOID MoveChildrenAwayFromTree(HWND hwndClient)
2596{
2597 SWP swpC, swpT, swp;
2598 USHORT id;
2599 HWND hwndChild;
2600 HENUM henum;
2601
2602 if (fFreeTree)
2603 return;
2604 WinQueryWindowPos(hwndClient, &swpC);
2605 if (swpC.fl & (SWP_MINIMIZE | SWP_HIDE))
2606 return;
2607 WinQueryWindowPos(hwndTree, &swpT);
2608 henum = WinBeginEnumWindows(hwndClient);
2609 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
2610 id = WinQueryWindowUShort(hwndChild, QWS_ID);
2611 if (!id || id == TREE_FRAME)
2612 continue;
2613 WinQueryWindowPos(hwndChild, &swp);
2614 if (!(swp.fl & (SWP_MAXIMIZE | SWP_HIDE | SWP_MINIMIZE))) {
2615 if (swp.x < swpT.cx) {
2616 swp.x = swpT.cx;
2617 if (swp.x + swp.cx > swpC.cx)
2618 swp.cx = swpC.cx - swp.x;
2619 if (swp.cx > 24)
2620 WinSetWindowPos(hwndChild, HWND_TOP, swp.x, swp.y, swp.cx, swp.cy,
2621 SWP_SIZE | SWP_MOVE | SWP_SHOW);
2622 }
2623 }
2624 }
2625 WinEndEnumWindows(henum);
2626}
2627
2628static VOID ArrangeIcons(HWND hwndClient)
2629{
2630 HENUM henum;
2631 HWND hwndChild;
2632 SWP swp;
2633
2634 henum = WinBeginEnumWindows(hwndClient);
2635 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
2636 WinQueryWindowPos(hwndChild, &swp);
2637 if (swp.fl & (SWP_MINIMIZE | SWP_HIDE)) {
2638 WinSetWindowUShort(hwndChild, QWS_XMINIMIZE, (USHORT) - 1);
2639 WinSetWindowUShort(hwndChild, QWS_YMINIMIZE, (USHORT) - 1);
2640 WinSetWindowPos(hwndChild, HWND_TOP, 0, 0, 0, 0,
2641 SWP_MOVE | SWP_SHOW | SWP_FOCUSDEACTIVATE);
2642 }
2643 }
2644 WinEndEnumWindows(henum);
2645}
2646
2647static VOID NextChild(HWND hwndClient, BOOL previous)
2648{
2649 HENUM henum;
2650 HWND hwndActive, hwndNext, hwndPrev = (HWND) 0;
2651 BOOL next = FALSE, once = FALSE;
2652
2653 previous = !previous;
2654
2655 hwndActive = WinQueryActiveWindow(hwndClient);
2656 if (!hwndActive)
2657 next = TRUE;
2658 henum = WinBeginEnumWindows(hwndClient);
2659 for (;;) {
2660 hwndNext = WinGetNextWindow(henum);
2661 if (hwndNext) {
2662 if (!WinQueryWindowUShort(hwndNext, QWS_ID))
2663 continue;
2664 if (next)
2665 break;
2666 if (hwndNext == hwndActive) {
2667 if (!previous && hwndPrev) {
2668 hwndNext = hwndPrev;
2669 break;
2670 }
2671 else if (previous)
2672 next = TRUE;
2673 }
2674 hwndPrev = hwndNext;
2675 }
2676 else {
2677 if ((!next && previous) || once)
2678 break;
2679 else if (!previous) {
2680 hwndNext = hwndPrev;
2681 break;
2682 }
2683 else
2684 once = next = TRUE;
2685 }
2686 }
2687 WinEndEnumWindows(henum);
2688
2689 if (hwndNext && hwndNext != hwndActive) {
2690 WinSetWindowPos(hwndNext, HWND_TOP, 0, 0, 0, 0,
2691 SWP_ZORDER | SWP_ACTIVATE);
2692 WinSetWindowPos(hwndActive, ((previous) ? HWND_BOTTOM : hwndNext), 0, 0,
2693 0, 0, SWP_ZORDER);
2694 }
2695}
2696
2697BOOL CloseChildren(HWND hwndClient)
2698{
2699 HENUM henum;
2700 HWND hwndChild;
2701 BOOL ret = FALSE;
2702
2703 fNoTileUpdate = TRUE;
2704 henum = WinBeginEnumWindows(hwndClient);
2705 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
2706 if (hwndChild != hwndTree) {
2707 WinSendMsg(WinWindowFromID(hwndChild, FID_CLIENT),
2708 WM_SAVEAPPLICATION, MPVOID, MPVOID);
2709 if (WinSendMsg(WinWindowFromID(hwndChild, FID_CLIENT),
2710 WM_CLOSE, MPVOID, MPVOID)) {
2711 ret = TRUE;
2712 break;
2713 }
2714 }
2715 }
2716 WinEndEnumWindows(henum);
2717 fNoTileUpdate = FALSE;
2718 return ret;
2719}
2720
2721BOOL CloseDirCnrChildren(HWND hwndClient)
2722{
2723 /* returns TRUE if a directory container window was told to close */
2724
2725 HENUM henum;
2726 HWND hwndChild, hwndDir, hwndTemp;
2727 BOOL ret = FALSE;
2728
2729 fNoTileUpdate = TRUE;
2730 henum = WinBeginEnumWindows(hwndClient);
2731 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
2732 if (hwndChild != hwndTree) {
2733 hwndTemp = WinWindowFromID(hwndChild, FID_CLIENT);
2734 if (hwndTemp) {
2735 hwndDir = WinWindowFromID(hwndTemp, DIR_CNR);
2736 if (hwndDir) {
2737 WinSendMsg(WinWindowFromID(hwndChild, FID_CLIENT),
2738 WM_CLOSE, MPVOID, MPVOID);
2739 ret = TRUE;
2740 }
2741 }
2742 }
2743 }
2744 WinEndEnumWindows(henum);
2745 fNoTileUpdate = FALSE;
2746 return ret;
2747}
2748
2749/** Save directory container state
2750 * @param hwndClient Client window handle
2751 * @param pszStateName State name to save, NULL to save global state
2752 * @returns Number of directory container windows that were saved or -1 if error
2753 * @seealso RestoreDirCnrState
2754 */
2755
2756#define STATE_NAME_MAX_BYTES 256
2757
2758INT SaveDirCnrState(HWND hwndClient, PSZ pszStateName)
2759{
2760 HENUM henum;
2761 HWND hwndChild, hwndDir, hwndC;
2762 ULONG numsaves = 0, flWindowAttr;
2763 CHAR szPrefix[STATE_NAME_MAX_BYTES + 1];
2764 CHAR szKey[STATE_NAME_MAX_BYTES + 80];
2765 CHAR szDir[CCHMAXPATH];
2766 SWP swp;
2767 INT nSaved = 0;
2768 DIRCNRDATA *dcd;
2769
2770 if (!pszStateName)
2771 strcpy(szPrefix, NullStr);
2772 else {
2773 if (strlen(pszStateName) > sizeof(szPrefix) - 2) {
2774 Runtime_Error(pszSrcFile, __LINE__, "SaveDirCnrState");
2775 return -1;
2776 }
2777 sprintf(szPrefix, "%s.", pszStateName);
2778 }
2779
2780 henum = WinBeginEnumWindows(hwndClient);
2781 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
2782 if (hwndChild != hwndTree) {
2783 hwndC = WinWindowFromID(hwndChild, FID_CLIENT);
2784 if (hwndC) {
2785 hwndDir = WinWindowFromID(hwndC, DIR_CNR);
2786 if (hwndDir) {
2787 WinQueryWindowPos(hwndChild, &swp);
2788 *szDir = 0;
2789 WinSendMsg(hwndC, UM_CONTAINERDIR, MPFROMP(szDir), MPVOID);
2790 if (*szDir) {
2791 if (driveflags[toupper(*szDir) - 'A'] & DRIVE_NOPRESCAN)
2792 continue;
2793 sprintf(szKey, "%sDirCnrPos.%lu", szPrefix, numsaves);
2794 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & swp,
2795 sizeof(SWP));
2796 dcd =
2797 WinQueryWindowPtr(WinWindowFromID(hwndC, DIR_CNR), QWL_USER);
2798 if (dcd) {
2799 sprintf(szKey, "%sDirCnrSort.%lu", szPrefix, numsaves);
2800 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & dcd->sortFlags,
2801 sizeof(INT));
2802 sprintf(szKey, "%sDirCnrFilter.%lu", szPrefix, numsaves);
2803 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & dcd->mask,
2804 sizeof(MASK));
2805 sprintf(szKey, "%sDirCnrView.%lu", szPrefix, numsaves);
2806 flWindowAttr = dcd->flWindowAttr;
2807 if (!fLeaveTree && (flWindowAttr & CV_TREE)) {
2808 flWindowAttr &= (~(CV_TREE | CV_ICON | CV_DETAIL | CV_TEXT));
2809 if (dcd->lastattr) {
2810 if (dcd->lastattr & CV_TEXT)
2811 flWindowAttr |= CV_TEXT;
2812 else if (dcd->lastattr & CV_DETAIL)
2813 flWindowAttr |= CV_DETAIL;
2814 else if (dcd->lastattr & CV_ICON)
2815 flWindowAttr |= CV_ICON;
2816 else
2817 flWindowAttr |= CV_NAME;
2818 }
2819 else
2820 flWindowAttr |= CV_NAME;
2821 }
2822 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & flWindowAttr,
2823 sizeof(ULONG));
2824 }
2825 sprintf(szKey, "%sDirCnrDir.%lu", szPrefix, numsaves++);
2826 PrfWriteProfileString(fmprof, FM3Str, szKey, szDir);
2827 nSaved++;
2828 }
2829 }
2830 }
2831 }
2832 } // while
2833 WinEndEnumWindows(henum);
2834
2835 if (nSaved) {
2836 if (WinQueryWindowPos(hwndTree, &swp)) {
2837 sprintf(szKey, "%sLastTreePos", szPrefix);
2838 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & swp, sizeof(SWP));
2839 }
2840 sprintf(szKey, "%sNumDirsLastTime", szPrefix);
2841 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & numsaves, sizeof(ULONG));
2842 WinQueryWindowPos(WinQueryWindow(hwndClient, QW_PARENT), &swp);
2843 sprintf(szKey, "%sMySizeLastTime", szPrefix);
2844 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & swp, sizeof(SWP));
2845 }
2846
2847 return nSaved;
2848}
2849
2850static VOID TransformSwp(PSWP pswp, double xtrans, double ytrans)
2851{
2852 SWP swp;
2853 HWND hwnd;
2854
2855 if ((LONG) pswp->x < 0L) {
2856 pswp->cx -= abs(pswp->x);
2857 pswp->x = 0;
2858 }
2859 if ((LONG) pswp->y < 0L) {
2860 pswp->cy -= abs(pswp->y);
2861 pswp->y = 0;
2862 }
2863 pswp->x = (LONG) (((double)pswp->x * 100.0) / xtrans);
2864 pswp->cx = (LONG) (((double)pswp->cx * 100.0) / xtrans);
2865 pswp->y = (LONG) (((double)pswp->y * 100.0) / ytrans);
2866 pswp->cy = (LONG) (((double)pswp->cy * 100.0) / ytrans);
2867 if (pswp->hwnd) {
2868 hwnd = WinQueryWindow(pswp->hwnd, QW_PARENT);
2869 if (hwnd) {
2870 if (WinQueryWindowPos(hwnd, &swp)) {
2871 if (pswp->x > swp.cx)
2872 pswp->x = (swp.cx > 24) ? swp.cx - 24 : swp.cx;
2873 if (pswp->y > swp.cy)
2874 pswp->y = (swp.cy > 24) ? swp.cy - 24 : swp.cy;
2875 if (pswp->x + pswp->cx > swp.cx)
2876 pswp->cx = swp.cx - pswp->x;
2877 if (pswp->y + pswp->cy > swp.cy)
2878 pswp->cy = swp.cy - pswp->y;
2879 }
2880 }
2881 }
2882}
2883
2884/** Restore directory container state
2885 * @param hwndClient Client window handle
2886 * @param pszStateName State name to restore, NULL to restore global state
2887 * @returns TRUE if one or more directory containers were opened
2888 * @seealso SaveDirCnrState
2889 */
2890
2891static BOOL RestoreDirCnrState(HWND hwndClient, PSZ pszStateName, BOOL noview)
2892{
2893 CHAR szKey[STATE_NAME_MAX_BYTES + 80];
2894 CHAR szDir[CCHMAXPATH];
2895 CHAR szPrefix[STATE_NAME_MAX_BYTES + 2];
2896 HWND hwndDir, hwndC;
2897 SWP swp, swpO, swpN;
2898 ULONG size, numsaves = 0L, x;
2899 double xtrans, ytrans;
2900 BOOL fRestored = FALSE;
2901 DIRCNRDATA *dcd;
2902
2903 if (!pszStateName)
2904 strcpy(szPrefix, NullStr);
2905 else {
2906 if (strlen(pszStateName) > sizeof(szPrefix) - 2) {
2907 Runtime_Error(pszSrcFile, __LINE__, "RestoreDirCnrState");
2908 return fRestored;
2909 }
2910 sprintf(szPrefix, "%s.", pszStateName);
2911 }
2912
2913 size = sizeof(SWP);
2914 sprintf(szKey, "%sMySizeLastTime", szPrefix);
2915 if (!PrfQueryProfileData(fmprof,
2916 FM3Str,
2917 szKey,
2918 (PVOID) & swpO,
2919 &size) ||
2920 size != sizeof(SWP) || !swp.cx || !swp.cy)
2921 {
2922 WinQueryWindowPos(WinQueryWindow(hwndClient, QW_PARENT), &swpO);
2923 }
2924 if (!pszStateName || !strcmp(pszStateName, GetPString(IDS_FM2TEMPTEXT)))
2925 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
2926 WinQueryWindowPos(WinQueryWindow(hwndClient, QW_PARENT), &swpN);
2927 if (swpN.fl & (SWP_MINIMIZE | SWP_HIDE))
2928 swpN = swpO;
2929 xtrans = ((double)swpO.cx * 100.0) / (double)swpN.cx;
2930 ytrans = ((double)swpO.cy * 100.0) / (double)swpN.cy;
2931 size = sizeof(SWP);
2932 sprintf(szKey, "%sLastTreePos", szPrefix);
2933 if (PrfQueryProfileData(fmprof, FM3Str, szKey, (PVOID) & swp, &size)) {
2934 if (!pszStateName || !strcmp(pszStateName, GetPString(IDS_FM2TEMPTEXT)))
2935 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
2936 swp.hwnd = hwndTree;
2937 TransformSwp(&swp, xtrans, ytrans);
2938 if (!fFreeTree) {
2939 WinQueryWindowPos(hwndClient, &swpN);
2940 swp.x = 0;
2941 swp.y = (swpN.cy - swp.cy);
2942 }
2943 if (!(swp.fl & (SWP_MINIMIZE | SWP_HIDE))) {
2944 swp.fl &= (~SWP_ACTIVATE);
2945 WinSetWindowPos(hwndTree,
2946 HWND_TOP,
2947 swp.x,
2948 swp.y,
2949 swp.cx,
2950 swp.cy,
2951 swp.fl | SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_ZORDER);
2952 }
2953 else {
2954 WinSetWindowPos(hwndTree,
2955 HWND_TOP, 0, 0, 0, 0, SWP_MINIMIZE | SWP_SHOW);
2956 WinSetWindowUShort(hwndTree, QWS_XRESTORE, (USHORT) swp.x);
2957 WinSetWindowUShort(hwndTree, QWS_CXRESTORE, (USHORT) swp.cx);
2958 WinSetWindowUShort(hwndTree, QWS_YRESTORE, (USHORT) swp.y);
2959 WinSetWindowUShort(hwndTree, QWS_CYRESTORE, (USHORT) swp.cy);
2960 }
2961 }
2962 size = sizeof(ULONG);
2963 sprintf(szKey, "%sNumDirsLastTime", szPrefix);
2964 if (PrfQueryProfileData(fmprof,
2965 FM3Str, szKey, (PVOID) & numsaves, &size) && numsaves) {
2966 if (!pszStateName || !strcmp(pszStateName, GetPString(IDS_FM2TEMPTEXT)))
2967 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
2968 for (x = 0; x < numsaves; x++) {
2969 sprintf(szKey, "%sDirCnrPos.%lu", szPrefix, x);
2970 size = sizeof(SWP);
2971 if (PrfQueryProfileData(fmprof, FM3Str, szKey, (PVOID) & swp, &size)) {
2972 if (!pszStateName || !strcmp(pszStateName, GetPString(IDS_FM2TEMPTEXT)))
2973 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
2974 sprintf(szKey, "%sDirCnrDir.%lu", szPrefix, x);
2975 size = sizeof(szDir);
2976 if (PrfQueryProfileData(fmprof, FM3Str, szKey, (PVOID) szDir, &size)) {
2977 if (!pszStateName || !strcmp(pszStateName, GetPString(IDS_FM2TEMPTEXT)))
2978 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
2979 if (driveflags[toupper(*szDir) - 'A'] & DRIVE_NOPRESCAN) {
2980 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
2981 continue;
2982 }
2983 hwndDir = (HWND) WinSendMsg(hwndClient,
2984 UM_SETDIR,
2985 MPFROMP(szDir), MPFROMLONG(1));
2986 if (hwndDir) {
2987 hwndC = WinWindowFromID(hwndDir, FID_CLIENT);
2988 if (hwndC) {
2989 dcd = WinQueryWindowPtr(WinWindowFromID(hwndC, DIR_CNR),
2990 QWL_USER);
2991 if (dcd) {
2992 size = sizeof(INT);
2993 sprintf(szKey, "%sDirCnrSort.%lu", szPrefix, x);
2994 if (PrfQueryProfileData(fmprof,
2995 FM3Str,
2996 szKey,
2997 (PVOID) & dcd->sortFlags,
2998 &size) && size == sizeof(INT)) {
2999 if (!dcd->sortFlags)
3000 dcd->sortFlags = SORT_PATHNAME;
3001 }
3002 if (!pszStateName || !strcmp(pszStateName, GetPString(IDS_FM2TEMPTEXT)))
3003 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3004 size = sizeof(MASK);
3005 sprintf(szKey, "%sDirCnrFilter.%lu", szPrefix, x);
3006 if (PrfQueryProfileData(fmprof,
3007 FM3Str,
3008 szKey,
3009 (PVOID) & dcd->mask, &size) && size) {
3010 if (*dcd->mask.szMask)
3011 WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
3012 UM_FILTER, MPFROMP(dcd->mask.szMask), MPVOID);
3013 }
3014 *(dcd->mask.prompt) = 0;
3015 if (!pszStateName || !strcmp(pszStateName, GetPString(IDS_FM2TEMPTEXT)))
3016 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3017 size = sizeof(ULONG);
3018 sprintf(szKey, "%sDirCnrView.%lu", szPrefix, x);
3019 if (!noview) {
3020 if (PrfQueryProfileData(fmprof,
3021 FM3Str,
3022 szKey,
3023 (PVOID) & dcd->flWindowAttr,
3024 &size) && size == sizeof(ULONG)) {
3025
3026 CNRINFO cnri;
3027
3028 memset(&cnri, 0, sizeof(CNRINFO));
3029 cnri.cb = sizeof(CNRINFO);
3030 if (WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
3031 CM_QUERYCNRINFO,
3032 MPFROMP(&cnri),
3033 MPFROMLONG(sizeof(CNRINFO)))) {
3034 cnri.flWindowAttr = dcd->flWindowAttr;
3035 WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
3036 CM_SETCNRINFO,
3037 MPFROMP(&cnri),
3038 MPFROMLONG(CMA_FLWINDOWATTR));
3039 }
3040 }
3041 }
3042 if (!pszStateName || !strcmp(pszStateName, GetPString(IDS_FM2TEMPTEXT)))
3043 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3044 }
3045 }
3046 fRestored = TRUE;
3047 swp.hwnd = hwndDir;
3048 TransformSwp(&swp, xtrans, ytrans);
3049 if (!fAutoTile && !(swp.fl & (SWP_HIDE | SWP_MINIMIZE)))
3050 WinSetWindowPos(hwndDir,
3051 HWND_TOP,
3052 swp.x,
3053 swp.y,
3054 swp.cx,
3055 swp.cy,
3056 swp.fl | SWP_MOVE |
3057 SWP_SIZE | SWP_SHOW | SWP_ZORDER |
3058 SWP_ACTIVATE);
3059 else if (swp.fl & (SWP_HIDE | SWP_MINIMIZE)) {
3060 WinSetWindowPos(hwndDir,
3061 HWND_TOP, 0, 0, 0, 0, SWP_MINIMIZE | SWP_SHOW);
3062 WinSetWindowUShort(hwndDir, QWS_XRESTORE, (USHORT) swp.x);
3063 WinSetWindowUShort(hwndDir, QWS_CXRESTORE, (USHORT) swp.cx);
3064 WinSetWindowUShort(hwndDir, QWS_YRESTORE, (USHORT) swp.y);
3065 WinSetWindowUShort(hwndDir, QWS_CYRESTORE, (USHORT) swp.cy);
3066 }
3067 else
3068 WinSetWindowPos(hwndDir,
3069 HWND_TOP,
3070 0, 0, 0, 0, SWP_ZORDER | SWP_ACTIVATE);
3071 }
3072 }
3073 }
3074 } // for
3075 }
3076 return fRestored;
3077}
3078
3079static ULONG CountChildren(HWND hwndClient, ULONG * ulNumMinChildren)
3080{
3081 HENUM henum;
3082 HWND hwndChild;
3083 SWP swp;
3084 register ULONG ulCnt = 0L;
3085 USHORT id;
3086
3087 if (ulNumMinChildren)
3088 *ulNumMinChildren = 0L;
3089 henum = WinBeginEnumWindows(hwndClient);
3090 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
3091 id = WinQueryWindowUShort(hwndChild, QWS_ID);
3092 if (!id || (!fFreeTree && id == TREE_FRAME))
3093 continue;
3094 ulCnt++;
3095 if (ulNumMinChildren) {
3096 if (WinQueryWindowPos(hwndChild, &swp) && (swp.fl & SWP_MINIMIZE))
3097 (*ulNumMinChildren)++;
3098 }
3099 }
3100 WinEndEnumWindows(henum);
3101 return ulCnt;
3102}
3103
3104VOID GetNextWindowPos(HWND hwndClient, PSWP pswp, ULONG * ulCntR,
3105 ULONG * ulNumMinChildrenR)
3106{
3107 register ULONG ulCnt;
3108 ULONG ulNumMinChildren;
3109 RECTL Rectl;
3110 register ULONG ulXDiff, ulYDiff, ulWindowsPerStack;
3111
3112 if (!ulCntR || !ulNumMinChildrenR)
3113 ulCnt = CountChildren(hwndClient, &ulNumMinChildren);
3114 else {
3115 ulCnt = *ulCntR;
3116 ulNumMinChildren = *ulNumMinChildrenR;
3117 if (ulCnt == (ULONG) - 1) {
3118 ulCnt = CountChildren(hwndClient, &ulNumMinChildren);
3119 /* return these values to the caller for later use */
3120 *ulCntR = ulCnt;
3121 *ulNumMinChildrenR = ulNumMinChildren;
3122 }
3123 }
3124 WinQueryWindowRect(hwndClient, &Rectl);
3125 AdjustSizeOfClient(NULL, &Rectl);
3126 if (!fFreeTree) {
3127
3128 SWP swp;
3129
3130 WinQueryWindowPos(hwndTree, &swp);
3131 if (ulNumMinChildren || (swp.fl & (SWP_HIDE | SWP_MINIMIZE)))
3132 Rectl.yBottom += WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2;
3133 }
3134 else if (ulNumMinChildren)
3135 Rectl.yBottom += WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2;
3136
3137 ulXDiff = WinQuerySysValue(HWND_DESKTOP, SV_CXSIZEBORDER) +
3138 WinQuerySysValue(HWND_DESKTOP, SV_CXMINMAXBUTTON) / 2;
3139 ulYDiff = WinQuerySysValue(HWND_DESKTOP, SV_CYSIZEBORDER) +
3140 WinQuerySysValue(HWND_DESKTOP, SV_CYMINMAXBUTTON);
3141 ulWindowsPerStack = (Rectl.yTop - Rectl.yBottom) / (3 * ulYDiff);
3142 pswp->cx = Rectl.xRight - (ulWindowsPerStack * ulXDiff);
3143 pswp->cy = (Rectl.yTop - Rectl.yBottom) - (ulWindowsPerStack * ulYDiff);
3144 ulWindowsPerStack++;
3145 pswp->x = Rectl.xLeft + ((ulCnt % ulWindowsPerStack) * ulXDiff);
3146 pswp->y = (Rectl.yTop - pswp->cy - ((ulCnt % ulWindowsPerStack) * ulYDiff));
3147}
3148
3149static VOID CascadeChildren(HWND hwndClient)
3150{
3151 ULONG ulCnt = 0L, ulNumMinChildren;
3152 HWND hwndChild;
3153 HENUM henum;
3154 SWP swp;
3155 USHORT id;
3156 RECTL Rectl;
3157
3158 WinQueryWindowPos(hwndClient, &swp);
3159 if (swp.fl & (SWP_HIDE | SWP_MINIMIZE))
3160 return;
3161
3162 CountChildren(hwndClient, &ulNumMinChildren);
3163 if (!fFreeTree) {
3164 WinQueryWindowRect(hwndClient, &Rectl);
3165 AdjustSizeOfClient(NULL, &Rectl);
3166 WinQueryWindowPos(hwndTree, &swp);
3167 if (!(swp.fl & (SWP_MAXIMIZE | SWP_HIDE | SWP_MINIMIZE))) {
3168 if (swp.y + swp.cy < Rectl.yTop - Rectl.yBottom)
3169 swp.cy = (Rectl.yTop - Rectl.yBottom) - swp.y;
3170 if (swp.x != 0)
3171 swp.x = 0;
3172 if (swp.y < 0)
3173 swp.y = 0;
3174 if (swp.x + swp.cx > Rectl.xRight - Rectl.xLeft)
3175 swp.cx = Rectl.xRight - Rectl.xLeft;
3176 WinSetWindowPos(hwndTree, HWND_TOP, swp.x, swp.y, swp.cx, swp.cy,
3177 SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_RESTORE);
3178 }
3179 }
3180 henum = WinBeginEnumWindows(hwndClient);
3181 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
3182 id = WinQueryWindowUShort(hwndChild, QWS_ID);
3183 if (!id || (!fFreeTree && id == TREE_FRAME))
3184 continue;
3185 WinQueryWindowPos(hwndChild, &swp);
3186 if (!(swp.fl & (SWP_MINIMIZE | SWP_HIDE))) {
3187 GetNextWindowPos(hwndClient, &swp, &ulCnt, &ulNumMinChildren);
3188 WinSetWindowPos(hwndChild, HWND_TOP, swp.x, swp.y, swp.cx, swp.cy,
3189 SWP_SIZE | SWP_MOVE | SWP_SHOW | SWP_RESTORE |
3190 SWP_ZORDER | SWP_ACTIVATE);
3191 ulCnt++;
3192 }
3193 }
3194 WinEndEnumWindows(henum);
3195}
3196
3197VOID TileChildren(HWND hwndClient, BOOL absolute)
3198{
3199 register ULONG ulChildCnt, ulSquare, ulNumRows, ulNumCols, ulExtraCols,
3200 ulWidth, ulHeight;
3201 ULONG ulNumMinChildren;
3202 RECTL Rectl;
3203 HWND hwndChild;
3204
3205 if (fNoTileUpdate || hwndClient == HWND_DESKTOP)
3206 return;
3207 {
3208 SWP swp;
3209
3210 WinQueryWindowPos(hwndClient, &swp);
3211 if (swp.fl & (SWP_HIDE | SWP_MINIMIZE))
3212 return;
3213 }
3214 ulChildCnt = CountChildren(hwndClient, &ulNumMinChildren);
3215 ulChildCnt -= ulNumMinChildren;
3216 if (!ulChildCnt)
3217 return;
3218
3219 fNoTileUpdate = TRUE;
3220
3221 for (ulSquare = 2; ulSquare * ulSquare <= ulChildCnt; ulSquare++) {
3222 ;
3223 }
3224 if (!fTileBackwards) {
3225 ulNumCols = ulSquare - 1;
3226 ulNumRows = ulChildCnt / ulNumCols;
3227 }
3228 else {
3229 ulNumRows = ulSquare - 1;
3230 ulNumCols = ulChildCnt / ulNumRows;
3231 }
3232 ulExtraCols = ulChildCnt % ulNumCols;
3233
3234 WinQueryWindowRect(hwndClient, &Rectl);
3235
3236 if (!fFreeTree) {
3237
3238 SWP swp;
3239
3240 WinQueryWindowPos(hwndTree, &swp);
3241 if (!(swp.fl & (SWP_MAXIMIZE | SWP_HIDE | SWP_MINIMIZE))) {
3242 if (swp.y < 0)
3243 swp.y = 0;
3244 if (swp.y + swp.cy < Rectl.yTop - Rectl.yBottom)
3245 swp.cy = (Rectl.yTop - Rectl.yBottom) - swp.y;
3246 if (swp.x != 0)
3247 swp.x = 0;
3248 if (swp.x + swp.cx > Rectl.xRight - Rectl.xLeft)
3249 swp.cx = Rectl.xRight - Rectl.xLeft;
3250 WinSetWindowPos(hwndTree,
3251 HWND_TOP,
3252 swp.x,
3253 swp.y,
3254 swp.cx,
3255 swp.cy, SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_RESTORE);
3256 WinQueryWindowPos(hwndTree, &swp);
3257 }
3258 if (ulNumMinChildren || (swp.fl & (SWP_HIDE | SWP_MINIMIZE)))
3259 Rectl.yBottom += WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2;
3260 }
3261 else if (ulNumMinChildren)
3262 Rectl.yBottom += WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2;
3263
3264 AdjustSizeOfClient(NULL, &Rectl);
3265
3266 if (Rectl.xRight > 0L && (Rectl.yBottom < Rectl.yTop)) {
3267
3268 HENUM henum;
3269
3270 henum = WinBeginEnumWindows(hwndClient);
3271 if ((hwndChild = WinGetNextWindow(henum)) != (HWND) 0) {
3272
3273 ULONG ulCurRow, ulCurCol;
3274 SWP swp;
3275 USHORT id;
3276
3277 ulHeight = (Rectl.yTop - Rectl.yBottom) / ulNumRows;
3278
3279 for (ulCurRow = 0; ulCurRow < ulNumRows; ulCurRow++) {
3280 if ((ulNumRows - ulCurRow) <= ulExtraCols)
3281 ulNumCols++;
3282 for (ulCurCol = 0; ulCurCol < ulNumCols; ulCurCol++) {
3283 ulWidth = Rectl.xRight / ulNumCols;
3284
3285 while (hwndChild) {
3286 id = WinQueryWindowUShort(hwndChild, QWS_ID);
3287 if (id && (id != TREE_FRAME || fFreeTree)) {
3288 WinQueryWindowPos(hwndChild, &swp);
3289 if (!(swp.fl & (SWP_HIDE | SWP_MINIMIZE)))
3290 break;
3291 }
3292 hwndChild = WinGetNextWindow(henum);
3293 }
3294
3295 if (hwndChild) {
3296 if (!absolute && (swp.fl & SWP_MAXIMIZE)) {
3297 WinGetMaxPosition(hwndChild, &swp);
3298 WinSetWindowPos(hwndChild,
3299 HWND_TOP,
3300 swp.x,
3301 swp.y,
3302 swp.cx, swp.cy, SWP_MOVE | SWP_SIZE | SWP_SHOW);
3303 WinSetWindowUShort(hwndChild,
3304 QWS_XRESTORE,
3305 (USHORT) (ulWidth * ulCurCol) + Rectl.xLeft);
3306 WinSetWindowUShort(hwndChild,
3307 QWS_YRESTORE,
3308 (USHORT) (Rectl.yTop -
3309 (ulHeight * (ulCurRow + 1))));
3310 WinSetWindowUShort(hwndChild, QWS_CXRESTORE, (USHORT) ulWidth);
3311 WinSetWindowUShort(hwndChild, QWS_CYRESTORE, (USHORT) ulHeight);
3312 }
3313 else
3314 WinSetWindowPos(hwndChild,
3315 HWND_TOP,
3316 (ulWidth * ulCurCol) + Rectl.xLeft,
3317 Rectl.yTop - (ulHeight * (ulCurRow + 1)),
3318 ulWidth,
3319 ulHeight,
3320 SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_RESTORE);
3321 hwndChild = WinGetNextWindow(henum);
3322 }
3323 }
3324 if ((ulNumRows - ulCurRow) <= ulExtraCols) {
3325 ulNumCols--;
3326 ulExtraCols--;
3327 }
3328 }
3329 }
3330 WinEndEnumWindows(henum);
3331 }
3332
3333 fNoTileUpdate = FALSE;
3334}
3335
3336static VOID ResizeChildren(HWND hwndClient, SHORT oldcx, SHORT oldcy,
3337 SHORT newcx, SHORT newcy)
3338{
3339 /*
3340 * resize all children of the client to maintain their proportional
3341 * sizes and positions
3342 */
3343
3344 if (!newcx || !newcy || !oldcx || !oldcy)
3345 return;
3346 {
3347 HENUM henum;
3348 HWND hwndChild;
3349 register LONG x, y, cx, cy, ucx, ucy, ux, uy;
3350 SWP swp;
3351
3352 henum = WinBeginEnumWindows(hwndClient);
3353 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
3354 if (!WinQueryWindowUShort(hwndChild, QWS_ID))
3355 continue;
3356 if (WinQueryWindowPos(hwndChild, &swp)) {
3357 if (swp.fl & (SWP_MINIMIZE | SWP_HIDE)) {
3358 swp.x = WinQueryWindowUShort(hwndChild, QWS_XRESTORE);
3359 swp.y = WinQueryWindowUShort(hwndChild, QWS_YRESTORE);
3360 swp.cx = WinQueryWindowUShort(hwndChild, QWS_CXRESTORE);
3361 swp.cy = WinQueryWindowUShort(hwndChild, QWS_CYRESTORE);
3362 }
3363 else if (swp.fl & SWP_MAXIMIZE) {
3364 swp.x = WinQueryWindowUShort(hwndChild, QWS_XRESTORE);
3365 swp.y = WinQueryWindowUShort(hwndChild, QWS_YRESTORE);
3366 swp.cx = WinQueryWindowUShort(hwndChild, QWS_CXRESTORE);
3367 swp.cy = WinQueryWindowUShort(hwndChild, QWS_CYRESTORE);
3368 }
3369 cx = (swp.cx) ? (LONG) (((double)oldcx * 100.0) / (double)swp.cx) : 0;
3370 cy = (swp.cy) ? (LONG) (((double)oldcy * 100.0) / (double)swp.cy) : 0;
3371 x = (swp.x) ? (LONG) (((double)oldcx * 100.0) / (double)swp.x) : 0;
3372 y = (swp.y) ? (LONG) (((double)oldcy * 100.0) / (double)swp.y) : 0;
3373 if (x < 0)
3374 x = 0;
3375 if (y < 0)
3376 y = 0;
3377 ux = (x) ? (LONG) (((double)newcx * 100.0) / (double)x) : 0;
3378 uy = (y) ? (LONG) (((double)newcy * 100.0) / (double)y) : 0;
3379 ucx = (cx) ? (LONG) (((double)newcx * 100.0) / (double)cx) : 0;
3380 ucy = (cy) ? (LONG) (((double)newcy * 100.0) / (double)cy) : 0;
3381 if (ux + ucx > newcx)
3382 ucx = newcx - ux;
3383 if (uy + ucy > newcy)
3384 ucy = newcy - uy;
3385
3386 if (!(swp.fl & (SWP_MINIMIZE | SWP_HIDE | SWP_MAXIMIZE)))
3387 WinSetWindowPos(hwndChild, HWND_TOP, ux, uy, ucx, ucy,
3388 SWP_MOVE | SWP_SIZE | SWP_SHOW);
3389 else if (swp.fl & (SWP_HIDE | SWP_MINIMIZE)) {
3390 WinSetWindowUShort(hwndChild, QWS_XMINIMIZE, (USHORT) - 1);
3391 WinSetWindowUShort(hwndChild, QWS_YMINIMIZE, (USHORT) - 1);
3392 WinSetWindowPos(hwndChild, HWND_TOP, 0, 0, 0, 0,
3393 SWP_SIZE | SWP_MOVE | SWP_FOCUSDEACTIVATE);
3394 WinSetWindowUShort(hwndChild, QWS_XRESTORE, ux);
3395 WinSetWindowUShort(hwndChild, QWS_YRESTORE, uy);
3396 WinSetWindowUShort(hwndChild, QWS_CXRESTORE, ucx);
3397 WinSetWindowUShort(hwndChild, QWS_CYRESTORE, ucy);
3398 }
3399 else {
3400 WinGetMaxPosition(hwndChild, &swp);
3401 WinSetWindowPos(hwndChild, HWND_TOP, swp.x, swp.y, swp.cx, swp.cy,
3402 SWP_MOVE | SWP_SIZE | SWP_SHOW);
3403 WinSetWindowUShort(hwndChild, QWS_XRESTORE, ux);
3404 WinSetWindowUShort(hwndChild, QWS_YRESTORE, uy);
3405 WinSetWindowUShort(hwndChild, QWS_CXRESTORE, ucx);
3406 WinSetWindowUShort(hwndChild, QWS_CYRESTORE, ucy);
3407 }
3408 }
3409 }
3410 WinEndEnumWindows(henum);
3411 }
3412 if (!fFreeTree) {
3413
3414 RECTL Rectl;
3415 SWP swp;
3416
3417 WinQueryWindowRect(hwndClient, &Rectl);
3418 AdjustSizeOfClient(NULL, &Rectl);
3419 WinQueryWindowPos(hwndTree, &swp);
3420 if (!(swp.fl & (SWP_MAXIMIZE | SWP_HIDE | SWP_MINIMIZE))) {
3421 if (swp.y + swp.cy < Rectl.yTop - Rectl.yBottom)
3422 swp.cy = (Rectl.yTop - Rectl.yBottom) - swp.y;
3423 if (swp.x != 0)
3424 swp.x = 0;
3425 if (swp.y < 0)
3426 swp.y = 0;
3427 if (swp.x + swp.cx > Rectl.xRight - Rectl.xLeft)
3428 swp.cx = Rectl.xRight - Rectl.xLeft;
3429 WinSetWindowPos(hwndTree, HWND_TOP, swp.x, swp.y, swp.cx, swp.cy,
3430 SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_RESTORE);
3431 }
3432 }
3433}
3434
3435static VOID MinResChildren(HWND hwndClient, ULONG cmd)
3436{
3437 HENUM henum;
3438 HWND hwndChild;
3439
3440 {
3441 SWP swp;
3442
3443 WinQueryWindowPos(hwndClient, &swp);
3444 if (swp.fl & (SWP_HIDE | SWP_MINIMIZE))
3445 return;
3446 }
3447 henum = WinBeginEnumWindows(hwndClient);
3448 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
3449 if (!WinQueryWindowUShort(hwndChild, QWS_ID))
3450 continue;
3451 WinSetWindowPos(hwndChild, HWND_TOP, 0, 0, 0, 0, cmd);
3452 }
3453}
3454
3455//=== ChildFrameButtonProc: subclass handler for WALKBUTTON and QUICKBUTTON windows ===
3456
3457static MRESULT EXPENTRY ChildFrameButtonProc(HWND hwnd,
3458 ULONG msg,
3459 MPARAM mp1, MPARAM mp2)
3460{
3461 USHORT id;
3462 static BOOL emphasized = FALSE;
3463
3464 switch (msg) {
3465 case WM_BUTTON1CLICK:
3466 case WM_CHORD:
3467 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
3468 break;
3469
3470 case WM_MOUSEMOVE:
3471 if (fOtherHelp) {
3472 if ((!hwndBubble || WinQueryWindowULong(hwndBubble, QWL_USER) != hwnd)
3473 && !WinQueryCapture(HWND_DESKTOP)) {
3474 id = WinQueryWindowUShort(hwnd, QWS_ID);
3475 switch (id) {
3476 case IDM_OPENWALK:
3477 MakeBubble(hwnd, FALSE, GetPString(IDS_WALKBUTTONHELP));
3478 break;
3479 case IDM_USERLIST:
3480 MakeBubble(hwnd, FALSE, GetPString(IDS_QUICKBUTTONHELP));
3481 break;
3482 }
3483 }
3484 }
3485 break;
3486
3487 case WM_BUTTON3CLICK:
3488 case WM_BUTTON2CLICK:
3489 {
3490 USHORT cmd = 0;
3491
3492 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
3493 id = WinQueryWindowUShort(hwnd, QWS_ID);
3494 switch (id) {
3495 case IDM_OPENWALK:
3496 switch (msg) {
3497 case WM_BUTTON2CLICK:
3498 if ((shiftstate & (KC_ALT | KC_SHIFT | KC_CTRL)) ==
3499 (KC_ALT | KC_SHIFT | KC_CTRL))
3500 cmd = IDM_GREP;
3501 else if ((shiftstate & (KC_ALT | KC_CTRL)) == (KC_ALT | KC_CTRL))
3502 CascadeChildren(hwndMain);
3503
3504#ifdef NEVER
3505 else if ((shiftstate & (KC_ALT | KC_SHIFT)) == (KC_ALT | KC_SHIFT))
3506 cmd = IDM_SYSINFO;
3507#endif
3508
3509 else if (shiftstate & KC_SHIFT)
3510 cmd = IDM_WINDOWDLG;
3511 else if (shiftstate & KC_CTRL)
3512 cmd = IDM_SEEALL;
3513 else if (shiftstate & KC_ALT)
3514 TileChildren(hwndMain, TRUE);
3515 else
3516 cmd = IDM_WALKDIR;
3517 break;
3518 case WM_BUTTON3CLICK:
3519 TileChildren(hwndMain, TRUE);
3520 break;
3521 }
3522 break;
3523 case IDM_USERLIST:
3524 switch (msg) {
3525 case WM_BUTTON2CLICK:
3526 if ((shiftstate & (KC_ALT | KC_SHIFT | KC_CTRL)) ==
3527 (KC_ALT | KC_SHIFT | KC_CTRL))
3528 cmd = IDM_COLORPALETTE;
3529 else if ((shiftstate & (KC_ALT | KC_CTRL)) == (KC_ALT | KC_CTRL))
3530 cmd = IDM_HIDEMENU;
3531 else if ((shiftstate & (KC_ALT | KC_SHIFT)) == (KC_ALT | KC_SHIFT))
3532 cmd = IDM_NOTEBOOK;
3533 else if (shiftstate & KC_SHIFT)
3534 cmd = IDM_TOOLTITLES;
3535 else if (shiftstate & KC_CTRL)
3536 cmd = IDM_TEXTTOOLS;
3537 else if (shiftstate & KC_ALT)
3538 cmd = IDM_FONTPALETTE;
3539 else
3540 cmd = IDM_TOOLBAR;
3541 break;
3542 case WM_BUTTON3CLICK:
3543 cmd = IDM_DRIVEBAR;
3544 break;
3545 }
3546 break;
3547 } // switch id
3548
3549 if (cmd) {
3550 PostMsg(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT), FID_CLIENT),
3551 WM_COMMAND, MPFROM2SHORT(cmd, 0), MPVOID);
3552 }
3553 }
3554 break;
3555
3556 case DM_DRAGOVER:
3557 id = WinQueryWindowUShort(hwnd, QWS_ID);
3558 if (id == IDM_OPENWALK) {
3559 if (!emphasized) {
3560 emphasized = TRUE;
3561 DrawTargetEmphasis(hwnd, emphasized);
3562 }
3563 if (AcceptOneDrop(hwnd, mp1, mp2))
3564 return MRFROM2SHORT(DOR_DROP, DO_MOVE);
3565 }
3566 return MRFROM2SHORT(DOR_NEVERDROP, 0);
3567
3568 case DM_DRAGLEAVE:
3569 if (emphasized) {
3570 emphasized = FALSE;
3571 DrawTargetEmphasis(hwnd, emphasized);
3572 }
3573 break;
3574
3575 case DM_DROPHELP:
3576 DropHelp(mp1, mp2, hwnd, GetPString(IDS_OPENDROPHELP));
3577 return 0;
3578
3579 case DM_DROP:
3580 {
3581 char szFrom[CCHMAXPATH + 2];
3582
3583 if (emphasized) {
3584 emphasized = FALSE;
3585 DrawTargetEmphasis(hwnd, emphasized);
3586 }
3587 if (GetOneDrop(hwnd, mp1, mp2, szFrom, sizeof(szFrom))) {
3588 if (MakeValidDir(szFrom) && !FindDirCnrByName(szFrom, TRUE)) {
3589 OpenDirCnr((HWND) 0, hwndMain, hwndTree, FALSE, szFrom);
3590 }
3591 }
3592 }
3593 return 0;
3594
3595 case WM_CLOSE:
3596 WinDestroyWindow(hwnd);
3597 return 0;
3598 }
3599 return PFNWPButton(hwnd, msg, mp1, mp2);
3600}
3601
3602static MRESULT EXPENTRY MainFrameWndProc(HWND hwnd, ULONG msg, MPARAM mp1,
3603 MPARAM mp2)
3604{
3605 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
3606 static ULONG aheight = 0L;
3607
3608 switch (msg) {
3609 case WM_ADJUSTWINDOWPOS:
3610 {
3611 SWP *pswp;
3612
3613 pswp = (SWP *) mp1;
3614 if (fDataMin && !fAmClosing) {
3615 if (pswp->fl & (SWP_HIDE | SWP_MINIMIZE)) {
3616
3617 SWP swp;
3618
3619 WinQueryWindowPos(hwnd, &swp);
3620 PostMsg(hwnd, UM_FOCUSME, MPFROMLONG(swp.fl), MPVOID);
3621 HideNote();
3622 }
3623 else if (pswp->fl & (SWP_SHOW | SWP_RESTORE)) {
3624 if (DataHwnd)
3625 PostMsg(DataHwnd, WM_CLOSE, MPVOID, MPVOID);
3626 }
3627 }
3628 if (!fAmClosing) {
3629 if (pswp->fl & (SWP_HIDE | SWP_MINIMIZE))
3630 HideNote();
3631 }
3632 }
3633 break;
3634
3635 case UM_FOCUSME:
3636 CreateDataBar(HWND_DESKTOP, (ULONG) mp1);
3637 return 0;
3638
3639 case WM_BUTTON1UP:
3640 case WM_BUTTON2UP:
3641 case WM_BUTTON3UP:
3642 case WM_MOUSEMOVE:
3643 case WM_CHORD:
3644 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
3645 break;
3646
3647 case WM_CHAR:
3648 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
3649 break;
3650
3651 case WM_CONTROL:
3652 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), UM_CONTROL, mp1,
3653 mp2);
3654
3655 case WM_COMMAND:
3656 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
3657
3658 case WM_CALCFRAMERECT:
3659 {
3660 MRESULT mr;
3661 PRECTL prectl;
3662 LONG sheight = 20, bheight = 20;
3663
3664 mr = oldproc(hwnd, msg, mp1, mp2);
3665
3666 /*
3667 * Calculate the position of the client rectangle.
3668 * Otherwise, we'll see a lot of redraw when we move the
3669 * client during WM_FORMATFRAME.
3670 */
3671
3672 if (mr && mp2) {
3673 prectl = (PRECTL) mp1;
3674 if (prectl->yBottom != prectl->yTop) {
3675 {
3676 HPS hps;
3677 POINTL aptl[TXTBOX_COUNT];
3678
3679 hps = WinGetPS(hwndStatus);
3680 if (hps) {
3681 GpiQueryTextBox(hps, 6, "$`WjgT", TXTBOX_COUNT, aptl);
3682 bheight = sheight = aptl[TXTBOX_TOPLEFT].y + 6;
3683 WinReleasePS(hps);
3684 }
3685 }
3686 prectl->yBottom += (sheight + 4);
3687 prectl->yTop -= (sheight + 4);
3688 if (fMoreButtons) {
3689
3690 HPS hps;
3691 POINTL aptl[TXTBOX_COUNT];
3692
3693 hps = WinGetPS(hwndName);
3694 if (hps) {
3695 GpiQueryTextBox(hps, 6, "$`WjgT", TXTBOX_COUNT, aptl);
3696 bheight = aptl[TXTBOX_TOPLEFT].y + 6;
3697 WinReleasePS(hps);
3698 }
3699 prectl->yBottom += (bheight + 4);
3700 prectl->yTop -= (bheight + 4);
3701 }
3702 if (fToolbar) {
3703 if (!fTextTools)
3704 prectl->yTop -= ((fToolTitles) ? 50 : 40);
3705 else
3706 prectl->yTop -= 32;
3707 }
3708 if (fDrivebar) {
3709 ResizeDrives(WinWindowFromID(hwnd, MAIN_DRIVES),
3710 ((prectl->xRight -
3711 (WinQuerySysValue(HWND_DESKTOP,
3712 SV_CYSIZEBORDER) * 2)) - 4));
3713 prectl->yTop -= (16 * (DriveLines * 18));
3714 }
3715 if (fUserComboBox) {
3716 if (!aheight) {
3717
3718 SWP swpTemp;
3719
3720 WinQueryWindowPos(WinWindowFromID(hwndDrivelist, CBID_EDIT),
3721 &swpTemp);
3722 aheight = swpTemp.cy;
3723 }
3724 prectl->yTop -= (aheight + 6L);
3725 }
3726 if (fAutoView) {
3727 AutoviewHeight = min(AutoviewHeight,
3728 (prectl->yTop - prectl->yBottom) - 116);
3729 AutoviewHeight = max(AutoviewHeight, 36);
3730 prectl->yBottom += (AutoviewHeight + 6);
3731 }
3732 }
3733 }
3734 return mr;
3735 }
3736
3737 case WM_FORMATFRAME:
3738 {
3739 SHORT sCount, soldCount;
3740 PSWP pswp, pswpClient, pswpNew;
3741 SWP swpClient;
3742 LONG theight = 48L, dheight = 20L, width, sheight = 20, bheight = 20;
3743
3744 sCount = (SHORT) oldproc(hwnd, msg, mp1, mp2);
3745 soldCount = sCount;
3746
3747 /*
3748 * Reformat the frame to "squeeze" the client
3749 * and make room for status window sibling beneath
3750 * and toolbar above (if toolbar's on) and userlists
3751 * (if userlists are on).
3752 */
3753
3754 pswp = (PSWP) mp1;
3755 {
3756 SHORT x;
3757
3758 for (x = 0; x < soldCount; x++) {
3759 if (WinQueryWindowUShort(pswp->hwnd, QWS_ID) == FID_CLIENT) {
3760 pswpClient = pswp;
3761 break;
3762 }
3763 pswp++;
3764 }
3765 }
3766
3767 {
3768 HPS hps;
3769 POINTL aptl[TXTBOX_COUNT];
3770
3771 hps = WinGetPS(hwndStatus);
3772 if (hps) {
3773 GpiQueryTextBox(hps, 6, "$`WjgT", TXTBOX_COUNT, aptl);
3774 bheight = sheight = aptl[TXTBOX_TOPLEFT].y + 6;
3775 WinReleasePS(hps);
3776 }
3777 if (fMoreButtons) {
3778 hps = WinGetPS(hwndName);
3779 if (hps) {
3780 GpiQueryTextBox(hps, 6, "$`WjgT", TXTBOX_COUNT, aptl);
3781 bheight = aptl[TXTBOX_TOPLEFT].y + 6;
3782 WinReleasePS(hps);
3783 }
3784 }
3785 }
3786 pswpNew = (PSWP) mp1 + soldCount;
3787 *pswpNew = *pswpClient;
3788 swpClient = *pswpClient;
3789 pswpNew->hwnd = hwndStatus;
3790 pswpNew->hwndInsertBehind = HWND_BOTTOM;
3791 pswpNew->x = swpClient.x + 3;
3792 pswpNew->y = swpClient.y + 2;
3793 if (!fSplitStatus)
3794 width = swpClient.cx - (16 + (sheight * 2) + 4);
3795 else
3796 width = (swpClient.cx - (16 + (sheight * 2) + 4)) / 2;
3797 width = max(width, 10);
3798 if (fSplitStatus)
3799 pswpNew->cx = width - 6;
3800 else
3801 pswpNew->cx = width - 8;
3802 pswpNew->cy = sheight;
3803 pswpClient->y = pswpNew->y + pswpNew->cy + 3;
3804 pswpClient->cy = (swpClient.cy - pswpNew->cy) - 3;
3805 sCount++;
3806
3807 if (fSplitStatus) {
3808 pswpNew = (PSWP) mp1 + (soldCount + 1);
3809 *pswpNew = *pswpClient;
3810 pswpNew->hwnd = hwndStatus2;
3811 pswpNew->hwndInsertBehind = HWND_BOTTOM;
3812 pswpNew->x = width + 8;
3813 pswpNew->y = swpClient.y + 2;
3814 pswpNew->cx = width - 6;
3815 pswpNew->cy = sheight;
3816 sCount++;
3817 }
3818 else {
3819 WinShowWindow(hwndStatus2, FALSE);
3820 WinSetWindowText(hwndStatus2, NullStr);
3821 }
3822
3823 if (fToolbar) {
3824 if (fTextTools)
3825 theight = 32L;
3826 else if (!fToolTitles)
3827 theight = 40L;
3828 pswpNew = (PSWP) mp1 + (soldCount + 1 + (fSplitStatus != FALSE));
3829 *pswpNew = *pswpClient;
3830 pswpNew->hwnd = WinWindowFromID(hwnd, MAIN_TOOLS);
3831 pswpNew->hwndInsertBehind = HWND_BOTTOM;
3832 pswpNew->x = swpClient.x + 2;
3833 pswpNew->y = (swpClient.y + swpClient.cy) - (theight - 2);
3834 pswpNew->cx = swpClient.cx - 4;
3835 pswpNew->cy = theight - 4;
3836 pswpClient->cy -= theight;
3837 sCount++;
3838 }
3839 else
3840 WinShowWindow(WinWindowFromID(hwnd, MAIN_TOOLS), FALSE);
3841
3842 if (fDrivebar) {
3843 ResizeDrives(WinWindowFromID(hwnd, MAIN_DRIVES), pswpClient->cx - 4);
3844 pswpNew = (PSWP) mp1 + (soldCount + 1 +
3845 (fSplitStatus != FALSE) +
3846 (fToolbar != FALSE));
3847 *pswpNew = *pswpClient;
3848 pswpNew->hwnd = WinWindowFromID(hwnd, MAIN_DRIVES);
3849 pswpNew->hwndInsertBehind = HWND_BOTTOM;
3850 pswpNew->x = swpClient.x + 2;
3851 dheight += ((dheight - 2) * DriveLines);
3852 pswpNew->y = (swpClient.y + swpClient.cy) - (dheight - 2);
3853 if (fToolbar)
3854 pswpNew->y -= theight;
3855 pswpNew->cx = swpClient.cx - 4;
3856 pswpNew->cy = dheight - 4;
3857 pswpClient->cy -= dheight;
3858 sCount++;
3859 }
3860 else
3861 WinShowWindow(WinWindowFromID(hwnd, MAIN_DRIVES), FALSE);
3862
3863 if (fAutoView) {
3864 pswpNew = (PSWP) mp1 + (soldCount + 1 +
3865 (fToolbar != FALSE) +
3866 (fDrivebar != FALSE) +
3867 (fSplitStatus != FALSE));
3868 *pswpNew = *pswpClient;
3869 pswpNew->hwnd = (fComments) ? hwndAutoMLE : hwndAutoview;
3870 pswpNew->x = pswpClient->x + 3;
3871 pswpNew->y = pswpClient->y + 3;
3872 if (fMoreButtons)
3873 pswpNew->y += (bheight + 4);
3874 pswpNew->cx = pswpClient->cx - 6;
3875 AutoviewHeight = min(AutoviewHeight, pswpClient->cy - 116);
3876 AutoviewHeight = max(AutoviewHeight, 36);
3877 pswpNew->cy = AutoviewHeight;
3878 pswpClient->y += (AutoviewHeight + 6);
3879 pswpClient->cy -= (AutoviewHeight + 6);
3880 sCount++;
3881 WinShowWindow((fComments) ? hwndAutoview : hwndAutoMLE, FALSE);
3882 }
3883 else {
3884 WinShowWindow(hwndAutoview, FALSE);
3885 WinShowWindow(hwndAutoMLE, FALSE);
3886 }
3887
3888 pswpNew = (PSWP) mp1 + (soldCount + 1 +
3889 (fToolbar != FALSE) +
3890 (fDrivebar != FALSE) +
3891 (fSplitStatus != FALSE) + (fAutoView != FALSE));
3892 *pswpNew = *pswpClient;
3893 pswpNew->hwnd = WinWindowFromID(hwnd, IDM_OPENWALK);
3894 pswpNew->x = swpClient.cx - ((sheight * 2) + 4);
3895 pswpNew->y = swpClient.y;
3896 pswpNew->cx = sheight + 4;
3897 pswpNew->cy = sheight + 4;
3898 sCount++;
3899 pswpNew = (PSWP) mp1 + (soldCount + 2 +
3900 (fToolbar != FALSE) +
3901 (fDrivebar != FALSE) +
3902 (fSplitStatus != FALSE) + (fAutoView != FALSE));
3903 *pswpNew = *pswpClient;
3904 pswpNew->hwnd = WinWindowFromID(hwnd, IDM_USERLIST);
3905 pswpNew->x = swpClient.cx - (sheight + 2);
3906 pswpNew->y = swpClient.y;
3907 pswpNew->cx = sheight + 4;
3908 pswpNew->cy = sheight + 4;
3909 sCount++;
3910 pswpNew = (PSWP) mp1 + (soldCount + 3 +
3911 (fToolbar != FALSE) +
3912 (fDrivebar != FALSE) +
3913 (fSplitStatus != FALSE) + (fAutoView != FALSE));
3914 *pswpNew = *pswpClient;
3915 pswpNew->hwnd = WinWindowFromID(hwnd, MAIN_LED);
3916 pswpNew->x = swpClient.cx - ((sheight * 2) + 16);
3917 pswpNew->y = swpClient.y;
3918 pswpNew->cx = 12;
3919 pswpNew->cy = 12;
3920 sCount++;
3921 pswpNew = (PSWP) mp1 + (soldCount + 4 +
3922 (fToolbar != FALSE) +
3923 (fDrivebar != FALSE) +
3924 (fSplitStatus != FALSE) + (fAutoView != FALSE));
3925 *pswpNew = *pswpClient;
3926 pswpNew->hwnd = WinWindowFromID(hwnd, MAIN_LEDHDR);
3927 pswpNew->x = swpClient.cx - ((sheight * 2) + 16);
3928 pswpNew->y = swpClient.y + 12;
3929 pswpNew->cx = 12;
3930 pswpNew->cy = sheight - 8;
3931 sCount++;
3932 if (fUserComboBox) {
3933 if (!aheight) {
3934
3935 SWP swpTemp;
3936
3937 WinQueryWindowPos(WinWindowFromID(hwndDrivelist, CBID_EDIT),
3938 &swpTemp);
3939 aheight = swpTemp.cy;
3940 }
3941 pswpNew = (PSWP) mp1 + (soldCount + 5 +
3942 (fToolbar != FALSE) +
3943 (fSplitStatus != FALSE) +
3944 (fDrivebar != FALSE) + (fAutoView != FALSE));
3945 *pswpNew = *pswpClient;
3946 pswpNew->hwnd = hwndDrivelist;
3947 pswpNew->x = swpClient.x;
3948 pswpNew->cx = 48;
3949 pswpClient->cy -= (aheight + 6L);
3950 pswpNew->y = pswpClient->y;
3951 pswpNew->cy = pswpClient->cy + (aheight + 5L);
3952 sCount++;
3953 pswpNew = (PSWP) mp1 + (soldCount + 6 +
3954 (fToolbar != FALSE) +
3955 (fDrivebar != FALSE) +
3956 (fSplitStatus != FALSE) +
3957 (fAutoView != FALSE));
3958 *pswpNew = *pswpClient;
3959 pswpNew->hwnd = hwndStatelist;
3960 pswpNew->x = swpClient.x + 48;
3961 pswpNew->cx = (swpClient.cx - 48) / 7;
3962 pswpNew->y = pswpClient->y;
3963 pswpNew->cy = pswpClient->cy + (aheight + 5L);
3964 sCount++;
3965 pswpNew = (PSWP) mp1 + (soldCount + 7 +
3966 (fToolbar != FALSE) +
3967 (fDrivebar != FALSE) +
3968 (fSplitStatus != FALSE) +
3969 (fAutoView != FALSE));
3970 *pswpNew = *pswpClient;
3971 pswpNew->hwnd = hwndCmdlist;
3972 pswpNew->x = swpClient.x + 48 + ((swpClient.cx - 48) / 7);
3973 pswpNew->cx = (swpClient.cx - 48) / 5 +
3974 ((swpClient.cx - 48) / 5) - ((swpClient.cx - 48) / 7);
3975 pswpNew->y = pswpClient->y;
3976 pswpNew->cy = pswpClient->cy + (aheight + 5L);
3977 sCount++;
3978 pswpNew = (PSWP) mp1 + (soldCount + 8 +
3979 (fToolbar != FALSE) +
3980 (fDrivebar != FALSE) +
3981 (fSplitStatus != FALSE) +
3982 (fAutoView != FALSE));
3983 *pswpNew = *pswpClient;
3984 pswpNew->hwnd = hwndUserlist;
3985 pswpNew->x = swpClient.x + 48 + (((swpClient.cx - 48) / 5) * 2);
3986 pswpNew->cx = ((swpClient.x + swpClient.cx) - pswpNew->x) -
3987 ((fToolbar) ? ((swpClient.cx - 48) / 7) : 0);
3988 pswpNew->y = pswpClient->y;
3989 pswpNew->cy = pswpClient->cy + (aheight + 5L);
3990 sCount++;
3991 if (fToolbar) {
3992 pswpNew = (PSWP) mp1 + (soldCount + 9 +
3993 (fToolbar != FALSE) +
3994 (fDrivebar != FALSE) +
3995 (fSplitStatus != FALSE) +
3996 (fAutoView != FALSE));
3997 *pswpNew = *pswpClient;
3998 pswpNew->hwnd = hwndButtonlist;
3999 pswpNew->x = swpClient.cx - ((swpClient.cx - 48) / 7) + 4;
4000 pswpNew->cx = (swpClient.x + swpClient.cx) - pswpNew->x;
4001 pswpNew->y = pswpClient->y;
4002 pswpNew->cy = pswpClient->cy + (aheight + 5L);
4003 sCount++;
4004 }
4005 else
4006 WinShowWindow(hwndButtonlist, FALSE);
4007 }
4008 else {
4009 WinShowWindow(hwndUserlist, FALSE);
4010 WinShowWindow(hwndDrivelist, FALSE);
4011 WinShowWindow(hwndStatelist, FALSE);
4012 WinShowWindow(hwndButtonlist, FALSE);
4013 WinShowWindow(hwndCmdlist, FALSE);
4014 }
4015 {
4016 PSWP pswpTitlebar = (PSWP) 0, pswpMinbutton = (PSWP) 0;
4017 SHORT x;
4018
4019 pswpNew = (PSWP) mp1 + (soldCount + 5 +
4020 (fToolbar != FALSE) +
4021 (fDrivebar != FALSE) +
4022 (fSplitStatus != FALSE) +
4023 (fAutoView != FALSE) +
4024 ((fUserComboBox != FALSE) * 4) +
4025 (fUserComboBox != FALSE &&
4026 fToolbar != FALSE));
4027 pswp = (PSWP) mp1;
4028 for (x = 0; x < soldCount; x++) {
4029 if (!pswpTitlebar &&
4030 WinQueryWindowUShort(pswp->hwnd, QWS_ID) == FID_TITLEBAR)
4031 pswpTitlebar = pswp;
4032 else if (!pswpMinbutton &&
4033 WinQueryWindowUShort(pswp->hwnd, QWS_ID) == FID_MINMAX)
4034 pswpMinbutton = pswp;
4035 if (pswpTitlebar && pswpMinbutton)
4036 break;
4037 pswp++;
4038 }
4039 if (pswpMinbutton && pswpTitlebar) {
4040 *pswpNew = *pswpMinbutton;
4041 pswpNew->hwnd = WinWindowFromID(hwnd, IDM_IDEALSIZE);
4042 pswpNew->cy = pswpMinbutton->cy + 3;
4043 pswpNew->cx = min(pswpNew->cy, (pswpMinbutton->cx / 2) + 3);
4044 pswpTitlebar->cx -= (pswpNew->cx - 1);
4045 pswpNew->x = pswpTitlebar->x + (pswpTitlebar->cx);
4046 pswpNew->y = pswpMinbutton->y - 1;
4047 sCount++;
4048 }
4049 else
4050 WinShowWindow(WinWindowFromID(hwnd, IDM_IDEALSIZE), FALSE);
4051 }
4052
4053 if (fMoreButtons) {
4054
4055 LONG lastx;
4056
4057 pswpNew = (PSWP) mp1 + (soldCount + 6 +
4058 (fToolbar != FALSE) +
4059 (fDrivebar != FALSE) +
4060 (fSplitStatus != FALSE) +
4061 (fAutoView != FALSE) +
4062 ((fUserComboBox != FALSE) * 4) +
4063 (fUserComboBox != FALSE &&
4064 fToolbar != FALSE));
4065 *pswpNew = *pswpClient;
4066 pswpNew->hwnd = hwndName;
4067 pswpNew->x = swpClient.x + 3;
4068 pswpNew->y = swpClient.y + (sheight + 6);
4069 pswpNew->cx = ((swpClient.cx / 2) + (swpClient.cx / 5)) - 3;
4070 lastx = pswpNew->x + pswpNew->cx;
4071 pswpNew->cy = bheight;
4072 pswpClient->y += (bheight + 4);
4073 pswpClient->cy -= (bheight + 4);
4074 sCount++;
4075 pswpNew = (PSWP) mp1 + (soldCount + 7 +
4076 (fToolbar != FALSE) +
4077 (fDrivebar != FALSE) +
4078 (fSplitStatus != FALSE) +
4079 (fAutoView != FALSE) +
4080 ((fUserComboBox != FALSE) * 4) +
4081 (fUserComboBox != FALSE &&
4082 fToolbar != FALSE));
4083 *pswpNew = *pswpClient;
4084 pswpNew->hwnd = hwndDate;
4085 pswpNew->x = lastx + 3;
4086 pswpNew->y = swpClient.y + (sheight + 6);
4087 pswpNew->cx = (swpClient.cx / 6) + (swpClient.cx / 16) - 3;
4088 lastx = pswpNew->x + pswpNew->cx;
4089 pswpNew->cy = bheight;
4090 sCount++;
4091 pswpNew = (PSWP) mp1 + (soldCount + 8 +
4092 (fToolbar != FALSE) +
4093 (fDrivebar != FALSE) +
4094 (fSplitStatus != FALSE) +
4095 (fAutoView != FALSE) +
4096 ((fUserComboBox != FALSE) * 4) +
4097 (fUserComboBox != FALSE &&
4098 fToolbar != FALSE));
4099 *pswpNew = *pswpClient;
4100 pswpNew->hwnd = hwndAttr;
4101 pswpNew->x = lastx + 3;
4102 pswpNew->y = swpClient.y + (sheight + 6);
4103 pswpNew->cx = (swpClient.cx - pswpNew->x) - 1;
4104 pswpNew->cy = bheight;
4105 sCount++;
4106 }
4107 else {
4108 WinShowWindow(hwndAttr, FALSE);
4109 WinShowWindow(hwndName, FALSE);
4110 WinShowWindow(hwndDate, FALSE);
4111 }
4112 return MRFROMSHORT(sCount);
4113 }
4114
4115 case WM_QUERYFRAMECTLCOUNT:
4116 {
4117 SHORT sCount;
4118
4119 sCount = (SHORT) oldproc(hwnd, msg, mp1, mp2);
4120
4121 sCount += 6;
4122 if (fSplitStatus)
4123 sCount++;
4124 if (fToolbar)
4125 sCount++;
4126 if (fUserComboBox) {
4127 sCount += 4;
4128 if (fToolbar)
4129 sCount++;
4130 }
4131 if (fDrivebar)
4132 sCount++;
4133 if (fAutoView)
4134 sCount++;
4135 if (fMoreButtons)
4136 sCount += 3;
4137 return MRFROMSHORT(sCount);
4138 }
4139
4140 case WM_CLOSE:
4141 WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
4142 return 0;
4143 }
4144 return oldproc(hwnd, msg, mp1, mp2);
4145}
4146
4147MRESULT EXPENTRY MainWMCommand(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
4148{
4149 SetShiftState();
4150 switch (SHORT1FROMMP(mp1)) {
4151
4152 case IDM_CONTEXTMENU:
4153 {
4154 HWND hwnd = WinQueryFocus(HWND_DESKTOP);
4155 // DbgMsg(pszSrcFile, __LINE__, "IDM_CONTEXTMENU %x", hwnd);
4156 if (hwnd != NULLHANDLE) {
4157 HWND hwndParent = WinQueryWindow(hwnd, QW_PARENT);
4158 USHORT id = WinQueryWindowUShort(hwndParent, QWS_ID);
4159 switch (id) {
4160 case MAIN_SETUPLIST:
4161 case MAIN_USERLIST:
4162 case MAIN_CMDLIST:
4163 // DbgMsg(pszSrcFile, __LINE__, "WM_CONTEXTMENU");
4164 WinPostMsg(hwnd, WM_CONTEXTMENU, 0, 0);
4165 }
4166 }
4167 }
4168 break;
4169
4170 case IDM_SETTARGET:
4171 SetTargetDir(hwnd, FALSE);
4172 break;
4173
4174 case IDM_TOAUTOMLE:
4175 if (fComments && fAutoView)
4176 WinSetFocus(HWND_DESKTOP, hwndAutoMLE);
4177 break;
4178
4179 case IDM_HIDENOTEWND:
4180 HideNote();
4181 break;
4182 case IDM_SHOWNOTEWND:
4183 ShowNote();
4184 break;
4185
4186 case IDM_COMPARE:
4187 {
4188 WALK2 wa;
4189 PCNRITEM pci;
4190
4191 memset(&wa, 0, sizeof(wa));
4192 wa.size = sizeof(wa);
4193 pci =
4194 (PCNRITEM)
4195 WinSendMsg(WinWindowFromID
4196 (WinWindowFromID(hwndTree, FID_CLIENT), TREE_CNR),
4197 CM_QUERYRECORDEMPHASIS, MPFROMLONG(CMA_FIRST),
4198 MPFROMSHORT(CRA_CURSORED));
4199 if (pci && (INT) pci != -1) {
4200 strcpy(wa.szCurrentPath1, pci->pszFileName);
4201 MakeValidDir(wa.szCurrentPath1);
4202 }
4203 else
4204 save_dir2(wa.szCurrentPath1);
4205 TopWindowName(hwndMain, (HWND) 0, wa.szCurrentPath2);
4206 if (!*wa.szCurrentPath2)
4207 strcpy(wa.szCurrentPath2, wa.szCurrentPath1);
4208 MakeValidDir(wa.szCurrentPath2);
4209 if (WinDlgBox(HWND_DESKTOP,
4210 hwnd,
4211 WalkTwoCmpDlgProc,
4212 FM3ModHandle,
4213 WALK2_FRAME,
4214 MPFROMP(&wa)) &&
4215 !IsFile(wa.szCurrentPath1) && !IsFile(wa.szCurrentPath2)) {
4216 if (!*dircompare) {
4217
4218 COMPARE *cmp;
4219
4220 cmp = xmallocz(sizeof(COMPARE), pszSrcFile, __LINE__);
4221 if (cmp) {
4222 cmp->size = sizeof(COMPARE);
4223 strcpy(cmp->leftdir, wa.szCurrentPath1);
4224 strcpy(cmp->rightdir, wa.szCurrentPath2);
4225 cmp->hwndParent = hwnd;
4226 cmp->dcd.hwndParent = hwnd;
4227 WinDlgBox(HWND_DESKTOP,
4228 HWND_DESKTOP,
4229 CompareDlgProc, FM3ModHandle, COMP_FRAME, MPFROMP(cmp));
4230 }
4231 }
4232 else {
4233
4234 CHAR szPath1[CCHMAXPATH];
4235 CHAR szPath2[CCHMAXPATH];
4236 runemf2(SEPARATE,
4237 HWND_DESKTOP, pszSrcFile, __LINE__,
4238 NULL, NULL,
4239 "%s %s %s",
4240 dircompare,
4241 BldQuotedFileName(szPath1, wa.szCurrentPath1),
4242 BldQuotedFileName(szPath2, wa.szCurrentPath2));
4243 }
4244 }
4245 }
4246 break;
4247
4248 case IDM_EXIT:
4249 case IDM_KILLME:
4250 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
4251 break;
4252
4253 case IDM_CLI:
4254 if (fSplitStatus &&
4255 hwndStatus2 &&
4256 !WinIsWindow(WinQueryAnchorBlock(hwnd),
4257 WinWindowFromID(hwndStatus2, COMMAND_LINE)))
4258 PostMsg(hwndStatus2, UM_CLICKED, MPVOID, MPVOID);
4259 break;
4260
4261 case IDM_ADDTOUSERLIST:
4262 case IDM_DELETEFROMUSERLIST:
4263 {
4264 CHAR temp[CCHMAXPATH], path[CCHMAXPATH];
4265
4266 *temp = 0;
4267 WinQueryWindowText(hwndUserlist, CCHMAXPATH, temp);
4268 bstrip(temp);
4269 if (*temp &&
4270 !DosQueryPathInfo(temp, FIL_QUERYFULLNAME, path, sizeof(path))) {
4271 if (SHORT1FROMMP(mp1) == IDM_ADDTOUSERLIST) {
4272 add_udir(TRUE, path);
4273 if (fUdirsChanged)
4274 save_udirs();
4275 WinSendMsg(hwnd, UM_FILLUSERLIST, MPVOID, MPVOID);
4276 }
4277 else {
4278 if (!remove_udir(path))
4279 Runtime_Error(pszSrcFile, __LINE__, "remove_udir");
4280 else {
4281 if (fUdirsChanged)
4282 save_udirs();
4283 WinSendMsg(hwnd, UM_FILLUSERLIST, MPVOID, MPVOID);
4284 }
4285 }
4286 }
4287 }
4288 break;
4289
4290 case IDM_SAVEDIRCNRSTATE:
4291 case IDM_DELETEDIRCNRSTATE:
4292 {
4293 CHAR szStateName[STATE_NAME_MAX_BYTES + 1];
4294
4295 *szStateName = 0;
4296 WinQueryWindowText(hwndStatelist, STATE_NAME_MAX_BYTES, szStateName);
4297 bstrip(szStateName);
4298 // Ignore request if blank or attempting to using illegal name
4299 if (*szStateName && stricmp(szStateName, GetPString(IDS_STATETEXT))) {
4300 if (SHORT1FROMMP(mp1) == IDM_SAVEDIRCNRSTATE) {
4301 // Save
4302 INT nSaved = SaveDirCnrState(hwnd, szStateName);
4303 if (nSaved > 0) {
4304 INT ret = add_setup(szStateName);
4305 if (ret == 0) {
4306 WinSendMsg(hwndStatelist, LM_INSERTITEM,
4307 MPFROM2SHORT(LIT_SORTASCENDING, 0), MPFROMP(szStateName));
4308 save_setups();
4309 }
4310 else if (ret != 1) {
4311 saymsg(MB_ENTER | MB_ICONASTERISK, hwnd,
4312 GetPString(IDS_WARNINGTEXT),
4313 "\"%s\" state name add failed", szStateName); // 15 Apr 07 SHL failed
4314 WinSetWindowText(hwndStatelist, GetPString(IDS_STATETEXT));
4315 }
4316 }
4317 else {
4318 saymsg(MB_ENTER | MB_ICONASTERISK,
4319 hwnd,
4320 GetPString(IDS_WARNINGTEXT),
4321 nSaved == 0 ?
4322 "Nothing to save" :
4323 "State data save failed");
4324 WinSetWindowText(hwndStatelist, GetPString(IDS_STATETEXT));
4325 }
4326 }
4327 else {
4328 // Delete
4329 ULONG numsaves = 0, size, x;
4330 CHAR s[STATE_NAME_MAX_BYTES + 80];
4331
4332 INT ret = remove_setup(szStateName);
4333 if (ret == 1)
4334 save_setups();
4335 sprintf(s, "%s.NumDirsLastTime", szStateName);
4336 size = sizeof(ULONG);
4337 if (!PrfQueryProfileData(fmprof,
4338 FM3Str,
4339 s,
4340 (PVOID)&numsaves,
4341 &size)) {
4342 saymsg(MB_ENTER | MB_ICONASTERISK, hwnd,
4343 GetPString(IDS_WARNINGTEXT),
4344 GetPString(IDS_DOESNTEXISTTEXT), szStateName);
4345 }
4346 else if (!size)
4347 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
4348 else {
4349 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0L);
4350 for (x = 0; x < numsaves; x++) {
4351 sprintf(s, "%s.DirCnrPos.%lu", szStateName, x);
4352 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4353 sprintf(s, "%s.DirCnrDir.%lu", szStateName, x);
4354 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4355 sprintf(s, "%s.DirCnrSort.%lu", szStateName, x);
4356 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4357 sprintf(s, "%s.DirCnrFilter.%lu", szStateName, x);
4358 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4359 sprintf(s, "%s.DirCnrView.%lu", szStateName, x);
4360 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4361 }
4362 sprintf(s, "%s.LastTreePos", szStateName);
4363 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4364 sprintf(s, "%s.MySizeLastTime", szStateName);
4365 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4366 }
4367 PostMsg(hwnd, UM_FILLSETUPLIST, MPVOID, MPVOID);
4368 }
4369 }
4370 }
4371 break;
4372
4373 case IDM_IDEALSIZE:
4374 {
4375 SWP swp, swpD;
4376 ULONG icz = WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2L;
4377 ULONG bsz = WinQuerySysValue(HWND_DESKTOP, SV_CYSIZEBORDER);
4378
4379 WinQueryWindowPos(WinQueryWindow(hwnd, QW_PARENT), &swp);
4380 if (swp.fl & SWP_MAXIMIZE) {
4381 WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_SYSCOMMAND,
4382 MPFROM2SHORT(SC_RESTORE, 0), MPVOID);
4383 WinQueryWindowPos(WinQueryWindow(hwnd, QW_PARENT), &swp);
4384 }
4385 WinGetMaxPosition(WinQueryWindow(hwnd, QW_PARENT), &swpD);
4386 swpD.x += bsz;
4387 swpD.cx -= (bsz * 2);
4388 swpD.y += icz;
4389 swpD.cy -= (icz + bsz);
4390 if (swp.x == swpD.x && swp.y == swpD.y &&
4391 swp.cx == swpD.cx && swp.cy == swpD.cy &&
4392 // fixme to be #defined someday
4393 WinQueryWindowUShort(hwnd, QWL_USER + 10) &&
4394 WinQueryWindowUShort(hwnd, QWL_USER + 14)) {
4395 swpD.x = WinQueryWindowUShort(hwnd, QWL_USER + 8);
4396 swpD.cx = WinQueryWindowUShort(hwnd, QWL_USER + 10);
4397 swpD.y = WinQueryWindowUShort(hwnd, QWL_USER + 12);
4398 swpD.cy = WinQueryWindowUShort(hwnd, QWL_USER + 14);
4399 }
4400 else {
4401 WinSetWindowUShort(hwnd, QWL_USER + 8, (USHORT) swp.x);
4402 WinSetWindowUShort(hwnd, QWL_USER + 10, (USHORT) swp.cx);
4403 WinSetWindowUShort(hwnd, QWL_USER + 12, (USHORT) swp.y);
4404 WinSetWindowUShort(hwnd, QWL_USER + 14, (USHORT) swp.cy);
4405 }
4406 WinSetWindowPos(WinQueryWindow(hwnd, QW_PARENT), HWND_TOP,
4407 swpD.x, swpD.y, swpD.cx, swpD.cy, SWP_MOVE | SWP_SIZE);
4408 }
4409 break;
4410
4411 case IDM_BLINK:
4412 WinSetWindowPos(WinQueryWindow(hwnd, QW_PARENT), HWND_TOP, 0, 0, 0, 0,
4413 SWP_MINIMIZE);
4414 WinSetWindowPos(WinQueryWindow(hwnd, QW_PARENT), HWND_TOP, 0, 0, 0, 0,
4415 SWP_RESTORE | SWP_ZORDER);
4416 break;
4417
4418 case DID_CANCEL:
4419 {
4420 HWND hwndTop = TopWindow(hwndMain, (HWND) 0);
4421
4422 if (hwndTop)
4423 WinSetFocus(HWND_DESKTOP, hwndTop);
4424 }
4425 break;
4426
4427 case IDM_NOTEBOOK:
4428 WinDlgBox(HWND_DESKTOP,
4429 hwnd, CfgDlgProc, FM3ModHandle, CFG_FRAME, MPVOID);
4430 break;
4431
4432 case IDM_VIEWHELPS:
4433 case IDM_VIEWINFS:
4434 WinDlgBox(HWND_DESKTOP,
4435 HWND_DESKTOP,
4436 ViewInfProc,
4437 FM3ModHandle,
4438 VINF_FRAME,
4439 ((SHORT1FROMMP(mp1) == IDM_VIEWHELPS) ?
4440 MPFROMP(NullStr) : MPVOID));
4441 break;
4442
4443 case IDM_OPENWALK:
4444 {
4445 char newpath[CCHMAXPATH];
4446
4447 *newpath = 0;
4448 TopWindowName(hwnd, (HWND) 0, newpath);
4449 if (WinDlgBox(HWND_DESKTOP,
4450 hwnd,
4451 WalkAllDlgProc,
4452 FM3ModHandle, WALK_FRAME, MPFROMP(newpath)) && *newpath)
4453 OpenDirCnr((HWND) 0, hwndMain, hwndTree, FALSE, newpath);
4454 }
4455 break;
4456
4457 case IDM_WINDOWDLG:
4458 WindowList(hwnd);
4459 break;
4460
4461 case IDM_HELPMOUSE:
4462 case IDM_HELPCONTEXT:
4463 case IDM_HELPHINTS:
4464 case IDM_HELPPIX:
4465 case IDM_HELPTUTOR:
4466 case IDM_HELPUSERLIST:
4467 case IDM_HELP:
4468 case IDM_HELPCONTENTS:
4469 case IDM_HELPKEYS:
4470 case IDM_HELPGENERAL:
4471 if (hwndHelp) {
4472 if (SHORT1FROMMP(mp2) == CMDSRC_MENU) {
4473
4474 RECTL rcl;
4475 ULONG icz = WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2L;
4476
4477 WinQueryWindowRect(HWND_DESKTOP, &rcl);
4478 rcl.yBottom += icz;
4479 rcl.yTop -= icz;
4480 rcl.xLeft += icz;
4481 rcl.xRight -= icz;
4482 WinSendMsg(hwndHelp, HM_SET_COVERPAGE_SIZE, MPFROMP(&rcl), MPVOID);
4483 }
4484 else {
4485
4486 RECTL rcl;
4487
4488 WinQueryWindowRect(HWND_DESKTOP, &rcl);
4489 rcl.yBottom += 8;
4490 rcl.yTop = (rcl.yTop / 2) + (rcl.yTop / 7);
4491 rcl.xLeft = (rcl.xRight / 2) - (rcl.xRight / 7);
4492 rcl.xRight -= 8;
4493 WinSendMsg(hwndHelp, HM_SET_COVERPAGE_SIZE, MPFROMP(&rcl), MPVOID);
4494 }
4495 switch (SHORT1FROMMP(mp1)) {
4496 case IDM_HELPCONTEXT:
4497 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
4498 MPFROM2SHORT(HELP_CONTEXT, 0), MPFROMSHORT(HM_RESOURCEID));
4499 break;
4500
4501 case IDM_HELPMOUSE:
4502 if (hwndHelp)
4503 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
4504 MPFROM2SHORT(HELP_MOUSE, 0), MPFROMSHORT(HM_RESOURCEID));
4505 break;
4506
4507 case IDM_HELPPIX:
4508 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
4509 MPFROM2SHORT(HELP_BITMAP1, 0), MPFROMSHORT(HM_RESOURCEID));
4510 break;
4511
4512 case IDM_HELPTUTOR:
4513 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
4514 MPFROM2SHORT(HELP_TUTORIAL, 0),
4515 MPFROMSHORT(HM_RESOURCEID));
4516 break;
4517
4518 case IDM_HELPHINTS:
4519 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
4520 MPFROM2SHORT(HELP_HINTS, 0), MPFROMSHORT(HM_RESOURCEID));
4521 break;
4522
4523 case IDM_HELPGENERAL:
4524 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
4525 MPFROM2SHORT(HELP_MAIN, 0), MPFROMSHORT(HM_RESOURCEID));
4526 break;
4527 case IDM_HELPKEYS:
4528 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
4529 MPFROM2SHORT(HELP_KEYS, 0), MPFROMSHORT(HM_RESOURCEID));
4530 break;
4531
4532 case IDM_HELP:
4533 case IDM_HELPCONTENTS:
4534 WinSendMsg(hwndHelp, HM_HELP_CONTENTS, MPVOID, MPVOID);
4535 break;
4536
4537 case IDM_HELPUSERLIST:
4538 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
4539 MPFROM2SHORT(HELP_USERLISTS, 0),
4540 MPFROMSHORT(HM_RESOURCEID));
4541 break;
4542 }
4543 }
4544 break;
4545
4546 case IDM_EDITANYARCHIVER:
4547 EditArchiverDefinition(hwnd);
4548 break;
4549
4550 case IDM_ABOUT:
4551 WinDlgBox(HWND_DESKTOP, hwnd, AboutDlgProc, FM3ModHandle,
4552 ABT_FRAME, MPVOID);
4553 break;
4554
4555 case IDM_FONTPALETTE:
4556 OpenObject("<WP_FNTPAL>", Default, hwnd);
4557 break;
4558
4559 case IDM_HICOLORPALETTE:
4560 case IDM_COLORPALETTE:
4561 {
4562 CHAR *palette = "<WP_CLRPAL>";
4563 ULONG version[2];
4564
4565 if (!DosQuerySysInfo(QSV_VERSION_MAJOR, QSV_VERSION_MINOR,
4566 (PVOID) & version, (ULONG) sizeof(version))) {
4567 if (version[0] > 20L || (version[0] == 20L && version[1] > 29L)) {
4568 if (SHORT1FROMMP(mp1) == IDM_HICOLORPALETTE)
4569 palette = "<WP_HIRESCLRPAL>";
4570 else
4571 palette = "<WP_LORESCLRPAL>";
4572 }
4573 }
4574 OpenObject(palette, Default, hwnd);
4575 }
4576 break;
4577
4578 case IDM_SYSTEMSETUP:
4579 OpenObject("<WP_CONFIG>", Default, hwnd);
4580 break;
4581
4582 case IDM_SCHEMEPALETTE:
4583 {
4584 HOBJECT hWPSObject;
4585
4586 hWPSObject = WinQueryObject("<WP_SCHPAL>");
4587 if (hWPSObject != NULLHANDLE)
4588 WinSetObjectData(hWPSObject, "SCHEMES=Winter:PM_Winter,"
4589 "Spring:PM_Spring,Summer:PM_Summer,"
4590 "System:PM_System,Windows:PM_Windows;"
4591 "OPEN=DEFAULT");
4592 }
4593 break;
4594
4595 case IDM_SYSTEMCLOCK:
4596 OpenObject("<WP_CLOCK>", Default, hwnd);
4597 break;
4598
4599#ifdef NEVER
4600 case IDM_SYSINFO:
4601 WinDlgBox(HWND_DESKTOP, HWND_DESKTOP, SysInfoDlgProc, FM3ModHandle,
4602 SYS_FRAME, NULL);
4603 break;
4604#endif
4605
4606 case IDM_INSTANT:
4607 {
4608 CHAR path[CCHMAXPATH];
4609 PCNRITEM pci = (PCNRITEM) 0;
4610
4611 if (hwndTree)
4612 pci = (PCNRITEM) WinSendMsg(hwndTree, CM_QUERYRECORDEMPHASIS,
4613 MPFROMLONG(CMA_FIRST),
4614 MPFROMSHORT(CRA_CURSORED));
4615 if (pci && (INT) pci != -1) {
4616 strcpy(path, pci->pszFileName);
4617 MakeValidDir(path);
4618 }
4619 else
4620 save_dir2(path);
4621 WinDlgBox(HWND_DESKTOP, hwnd, InstantDlgProc, FM3ModHandle,
4622 BAT_FRAME, MPFROMP(path));
4623 }
4624 break;
4625
4626 case IDM_WINFULLSCREEN:
4627 case IDM_DOSCOMMANDLINE:
4628 case IDM_COMMANDLINE:
4629 {
4630 CHAR *env = GetCmdSpec(FALSE), path[CCHMAXPATH];
4631 INT type = SEPARATE | WINDOWED;
4632
4633 *path = 0;
4634 TopWindowName(hwnd, (HWND) 0, path);
4635 if (SHORT1FROMMP(mp1) == IDM_DOSCOMMANDLINE)
4636 env = GetCmdSpec(TRUE);
4637 else if (SHORT1FROMMP(mp1) != IDM_COMMANDLINE) {
4638 env = "WINOS2.COM";
4639 type = SEPARATE | FULLSCREEN;
4640 }
4641 runemf2(type, hwnd, pszSrcFile, __LINE__,
4642 path, NULL, "%s", env);
4643 }
4644 break;
4645
4646 case IDM_KILLPROC:
4647 WinDlgBox(HWND_DESKTOP, hwnd, KillDlgProc, FM3ModHandle,
4648 KILL_FRAME, NULL);
4649 break;
4650
4651 case IDM_AUTOVIEWCOMMENTS:
4652 case IDM_AUTOVIEWFILE:
4653 if (SHORT1FROMMP(mp1) == IDM_AUTOVIEWFILE)
4654 fComments = FALSE;
4655 else
4656 fComments = TRUE;
4657 PrfWriteProfileData(fmprof, FM3Str, "Comments", &fComments, sizeof(BOOL));
4658 WinSetWindowText((fComments) ? hwndAutoview : hwndAutoMLE, NullStr);
4659 goto AutoChange;
4660
4661 case IDM_AUTOVIEW:
4662 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER), SHORT1FROMMP(mp1),
4663 &fAutoView, TRUE, "AutoView");
4664 AutoChange:
4665 PostMsg(WinQueryWindow(hwnd, QW_PARENT), WM_UPDATEFRAME,
4666 MPFROMLONG(FCF_SIZEBORDER), MPVOID);
4667 if (fAutoView) {
4668
4669 CHAR s[CCHMAXPATH];
4670 HWND hwndDir;
4671 PCNRITEM pci;
4672
4673 hwndDir = TopWindowName(hwnd, (HWND) 0, s);
4674 if (hwndDir) {
4675 hwndDir = WinWindowFromID(hwndDir, FID_CLIENT);
4676 if (hwndDir) {
4677 hwndDir = WinWindowFromID(hwndDir, DIR_CNR);
4678 if (hwndDir) {
4679 pci = (PCNRITEM) WinSendMsg(hwndDir, CM_QUERYRECORDEMPHASIS,
4680 MPFROMLONG(CMA_FIRST),
4681 MPFROMSHORT(CRA_CURSORED));
4682 if (pci && (INT) pci != -1 &&
4683 (!(driveflags[toupper(*pci->pszFileName) - 'A'] & DRIVE_SLOW)))
4684 WinSendMsg(hwnd,
4685 UM_LOADFILE,
4686 MPFROMP(pci->pszFileName),
4687 (SHORT1FROMMP(mp1) == IDM_AUTOVIEW) ?
4688 MPVOID : MPFROMLONG(1));
4689 }
4690 }
4691 }
4692 }
4693 break;
4694
4695 case IDM_TEXTTOOLS:
4696 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER), SHORT1FROMMP(mp1),
4697 &fTextTools, TRUE, "TextTools");
4698 BuildTools(hwndToolback, TRUE);
4699 PostMsg(WinQueryWindow(hwnd, QW_PARENT), WM_UPDATEFRAME,
4700 MPFROMLONG(FCF_SIZEBORDER), MPVOID);
4701 break;
4702
4703 case IDM_TOOLTITLES:
4704 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER), SHORT1FROMMP(mp1),
4705 &fToolTitles, TRUE, "ToolTitles");
4706 BuildTools(hwndToolback, TRUE);
4707 PostMsg(WinQueryWindow(hwnd, QW_PARENT), WM_UPDATEFRAME,
4708 MPFROMLONG(FCF_SIZEBORDER), MPVOID);
4709 break;
4710
4711 case IDM_HIDEMENU:
4712 {
4713 HWND hwndMenu;
4714
4715 hwndMenu = WinQueryWindowULong(hwnd, QWL_USER);
4716 MenuInvisible = (MenuInvisible) ? FALSE : TRUE;
4717 if (MenuInvisible) {
4718 WinSetParent(hwndMenu, HWND_OBJECT, FALSE);
4719 WinSetMenuItemText(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
4720 FID_SYSMENU), IDM_HIDEMENU,
4721 GetPString(IDS_UNHIDEMENUTEXT));
4722 }
4723 else {
4724 WinSetParent(hwndMenu, WinQueryWindow(hwnd, QW_PARENT), FALSE);
4725 WinSetMenuItemText(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
4726 FID_SYSMENU), IDM_HIDEMENU,
4727 GetPString(IDS_HIDEMENUTEXT));
4728 }
4729 PostMsg(WinQueryWindow(hwnd, QW_PARENT), WM_UPDATEFRAME,
4730 MPFROMLONG(FCF_MENU), MPVOID);
4731 PrfWriteProfileData(fmprof, FM3Str, "MenuInvisible",
4732 &MenuInvisible, sizeof(BOOL));
4733 }
4734 break;
4735
4736 case IDM_SEEALL:
4737 case IDM_GREP:
4738 case IDM_COLLECTOR:
4739 {
4740 HWND hwndC;
4741 SWP swp;
4742 BOOL already = FALSE;
4743
4744 if (Collector)
4745 already = TRUE;
4746 if (!already && !fAutoTile && !fExternalCollector)
4747 GetNextWindowPos(hwnd, &swp, NULL, NULL);
4748 hwndC = StartCollector(fExternalCollector ? HWND_DESKTOP : hwnd, 4);
4749 if (hwndC) {
4750 if (!already && !fAutoTile && !fExternalCollector)
4751 WinSetWindowPos(hwndC, HWND_TOP,
4752 swp.x, swp.y, swp.cx, swp.cy,
4753 SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_ZORDER);
4754 else if (fAutoTile && !already)
4755 TileChildren(hwnd, TRUE);
4756 WinSetWindowPos(hwndC, HWND_TOP, 0, 0, 0, 0, SWP_SHOW | SWP_RESTORE |
4757 SWP_ACTIVATE);
4758 if (SHORT1FROMMP(mp1) == IDM_GREP)
4759 PostMsg(WinWindowFromID(hwndC, FID_CLIENT), WM_COMMAND,
4760 MPFROM2SHORT(IDM_GREP, 0), MPVOID);
4761 if (SHORT1FROMMP(mp1) == IDM_SEEALL)
4762 PostMsg(WinWindowFromID(hwndC, FID_CLIENT), WM_COMMAND,
4763 MPFROM2SHORT(IDM_SEEALL, 0), MPVOID);
4764 }
4765 }
4766 break;
4767
4768 case IDM_TOOLLEFT:
4769 case IDM_TOOLRIGHT:
4770 {
4771 TOOL *tool;
4772
4773 if (!toolhead || !toolhead->next) {
4774 firsttool = (toolhead) ? toolhead->id : 0;
4775 break;
4776 }
4777 tool = find_tool(firsttool);
4778 if (!tool)
4779 tool = toolhead;
4780 if (SHORT1FROMMP(mp1) == IDM_TOOLRIGHT) {
4781 tool = prev_tool(tool, TRUE);
4782 firsttool = tool->id;
4783 }
4784 else {
4785 tool = next_tool(tool, TRUE);
4786 firsttool = tool->id;
4787 }
4788 ResizeTools(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
4789 MAIN_TOOLS));
4790 }
4791 break;
4792
4793 case IDM_CREATETOOL:
4794 BuildTools(hwndToolback, TRUE);
4795 break;
4796
4797 case IDM_TOOLBAR:
4798 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
4799 IDM_TOOLSUBMENU, &fToolbar, TRUE, "Toolbar");
4800 BuildTools(hwndToolback, TRUE);
4801 WinShowWindow(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
4802 MAIN_TOOLS), fToolbar);
4803 WinSendMsg(WinQueryWindow(hwnd, QW_PARENT),
4804 WM_UPDATEFRAME, MPFROMLONG(FCF_SIZEBORDER), MPVOID);
4805 if (fDrivebar)
4806 WinInvalidateRect(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
4807 MAIN_DRIVES), NULL, TRUE);
4808 break;
4809
4810 case IDM_DRIVEBAR:
4811 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
4812 IDM_DRIVEBAR, &fDrivebar, TRUE, "Drivebar");
4813 WinShowWindow(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
4814 MAIN_DRIVES), fDrivebar);
4815 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
4816 WM_UPDATEFRAME, MPFROMLONG(FCF_SIZEBORDER), MPVOID);
4817 PostMsg(hwnd, UM_BUILDDRIVEBAR, MPVOID, MPVOID);
4818 break;
4819
4820 case IDM_USERLIST:
4821 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
4822 SHORT1FROMMP(mp1), &fUserComboBox, TRUE, "UserComboBox");
4823 WinShowWindow(hwndUserlist, fUserComboBox);
4824 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
4825 WM_UPDATEFRAME, MPFROMLONG(FCF_SIZEBORDER), MPVOID);
4826 PostMsg(hwnd, UM_FILLUSERLIST, MPVOID, MPVOID);
4827 PostMsg(hwnd, UM_FILLSETUPLIST, MPVOID, MPVOID);
4828 PostMsg(hwnd, UM_FILLCMDLIST, MPVOID, MPVOID);
4829 PostMsg(hwnd, UM_FILLBUTTONLIST, MPVOID, MPVOID);
4830 break;
4831
4832 case IDM_MOREBUTTONS:
4833 WinSetWindowText(hwndName, NullStr);
4834 WinSetWindowText(hwndDate, NullStr);
4835 WinSetWindowText(hwndAttr, NullStr);
4836 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
4837 SHORT1FROMMP(mp1), &fMoreButtons, TRUE, "MoreButtons");
4838 if (fMoreButtons) {
4839
4840 HWND hwndTemp;
4841
4842 hwndTemp = TopWindow(hwnd, (HWND) 0);
4843
4844 if (hwndTemp) {
4845 WinSetFocus(HWND_DESKTOP, hwnd);
4846 WinSetFocus(HWND_DESKTOP, hwndTemp);
4847 }
4848 }
4849 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
4850 WM_UPDATEFRAME, MPFROMLONG(FCF_SIZEBORDER), MPVOID);
4851 break;
4852
4853 case IDM_FREETREE:
4854 if (fFreeTree) {
4855
4856 SWP swp, swpT;
4857
4858 WinQueryWindowPos(hwndTree, &swpT);
4859 WinQueryWindowPos(hwnd, &swp);
4860 WinSetWindowPos(hwndTree, HWND_TOP, 0, swp.cy - swpT.cy, 0, 0,
4861 SWP_MOVE);
4862 }
4863 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER), SHORT1FROMMP(mp1),
4864 &fFreeTree, TRUE, "FreeTree");
4865 if (fAutoTile)
4866 TileChildren(hwnd, TRUE);
4867 break;
4868
4869 case IDM_AUTOTILE:
4870 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
4871 SHORT1FROMMP(mp1), &fAutoTile, TRUE, "AutoTile");
4872 if (fAutoTile)
4873 TileChildren(hwnd, TRUE);
4874 break;
4875
4876 case IDM_TILEBACKWARDS:
4877 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
4878 SHORT1FROMMP(mp1), &fTileBackwards, TRUE, "TileBackwards");
4879 if (fAutoTile)
4880 TileChildren(hwnd, TRUE);
4881 break;
4882
4883 case IDM_NEXTWINDOW:
4884 case IDM_PREVWINDOW:
4885 NextChild(hwnd, (SHORT1FROMMP(mp1) == IDM_PREVWINDOW));
4886 break;
4887
4888 case IDM_CASCADE:
4889 CascadeChildren(hwnd);
4890 break;
4891
4892 case IDM_TILE:
4893 TileChildren(hwnd, TRUE);
4894 break;
4895
4896 case IDM_RESTORE:
4897 MinResChildren(hwnd, SWP_RESTORE);
4898 break;
4899
4900 case IDM_MINIMIZE:
4901 MinResChildren(hwnd, SWP_MINIMIZE);
4902 break;
4903
4904 case IDM_ARRANGEICONS:
4905 ArrangeIcons(hwnd);
4906 break;
4907
4908 case IDM_INIVIEWER:
4909 StartIniEditor(hwnd, NULL, 4);
4910 break;
4911
4912 case IDM_EDITASSOC:
4913 EditAssociations(hwnd);
4914 break;
4915
4916 case IDM_EDITCOMMANDS:
4917 EditCommands(hwnd);
4918 PostMsg(hwnd, UM_FILLCMDLIST, MPVOID, MPVOID);
4919 break;
4920
4921 default:
4922 if (!SwitchCommand((HWND) WinQueryWindowULong(hwnd, QWL_USER),
4923 SHORT1FROMMP(mp1))) {
4924 if (SHORT1FROMMP(mp1) >= IDM_COMMANDSTART &&
4925 SHORT1FROMMP(mp1) < IDM_QUICKTOOLSTART) {
4926
4927 INT x;
4928 HWND hwndCnr;
4929
4930 if (!cmdloaded)
4931 load_commands();
4932 hwndCnr = TopWindow(hwnd, (HWND) 0);
4933 hwndCnr = (HWND) WinSendMsg(WinWindowFromID(hwndCnr, FID_CLIENT),
4934 UM_CONTAINERHWND, MPVOID, MPVOID);
4935 if (!hwndCnr) {
4936 Runtime_Error2(pszSrcFile, __LINE__, IDS_NOWINDOWTEXT);
4937 break;
4938 }
4939 x = SHORT1FROMMP(mp1) - IDM_COMMANDSTART;
4940 if (x >= 0) {
4941 x++;
4942 RunCommand(hwndCnr, x);
4943 if (fUnHilite) {
4944
4945 PCNRITEM pci;
4946 DIRCNRDATA *dcd = NULL;
4947
4948 // 12 May 07 SHL fixme to understand? backwards maybe? looking for DIR_CNR?
4949 if (WinQueryWindowUShort(hwndCnr, QWS_ID) != TREE_CNR)
4950 dcd = INSTDATA(hwndCnr);
4951 pci = (PCNRITEM) WinSendMsg(hwndCnr,
4952 CM_QUERYRECORDEMPHASIS,
4953 MPFROMLONG(CMA_FIRST),
4954 MPFROMSHORT(CRA_CURSORED));
4955 if (pci && (INT) pci != -1 &&
4956 (pci->rc.flRecordAttr & CRA_SELECTED))
4957 {
4958 UnHilite(hwnd,
4959 TRUE,
4960 dcd ? &dcd->lastselection : NULL,
4961 dcd ? dcd ->ulItemsToUnHilite : 0);
4962 }
4963 }
4964 }
4965 }
4966 else if (SHORT1FROMMP(mp1) >= IDM_QUICKTOOLSTART &&
4967 SHORT1FROMMP(mp1) < IDM_QUICKTOOLSTART + 50) {
4968 if (!qtloaded)
4969 load_quicktools();
4970 if (quicktool[SHORT1FROMMP(mp1) - IDM_QUICKTOOLSTART]) {
4971 if (fToolsChanged)
4972 save_tools(NULL);
4973 if (!load_tools(quicktool[SHORT1FROMMP(mp1) - IDM_QUICKTOOLSTART]))
4974 load_tools(NULL);
4975 else {
4976 strcpy(lasttoolbox,
4977 quicktool[SHORT1FROMMP(mp1) - IDM_QUICKTOOLSTART]);
4978 PrfWriteProfileString(fmprof, FM3Str, "LastToolBox", lasttoolbox);
4979 }
4980 BuildTools(hwndToolback, TRUE);
4981 }
4982 }
4983 else {
4984
4985 HWND hwndActive;
4986
4987 hwndActive = TopWindow(hwnd, (HWND) 0);
4988 if (hwndActive)
4989 PostMsg(WinWindowFromID(hwndActive, FID_CLIENT),
4990 WM_COMMAND, mp1, mp2);
4991 }
4992 }
4993 break; // default
4994 } // switch mp1
4995 return 0;
4996}
4997
4998static MRESULT EXPENTRY MainWMOnce(HWND hwnd, ULONG msg, MPARAM mp1,
4999 MPARAM mp2)
5000{
5001 TID tid;
5002 SWP swp;
5003 PFNWP oldproc;
5004 HWND hwndTmp;
5005 HWND hwndFrame;
5006 HWND hwndSysMenu, hwndSysSubMenu, hwndMenu;
5007 USHORT idSysMenu;
5008 MENUITEM mi, mit;
5009 ULONG size;
5010 BOOL temp = FALSE;
5011
5012 switch (msg) {
5013 case WM_CREATE:
5014 WinQueryWindowProcess(hwnd, &mypid, &tid);
5015 hwndMain = hwnd;
5016 WinSetWindowUShort(hwnd, QWL_USER + 8, 0);
5017 WinSetWindowUShort(hwnd, QWL_USER + 10, 0);
5018 WinSetWindowUShort(hwnd, QWL_USER + 12, 0);
5019 WinSetWindowUShort(hwnd, QWL_USER + 16, 0);
5020 if (_beginthread(MakeMainObjWin, NULL, 245760, MPVOID) == -1) {
5021 Runtime_Error(pszSrcFile, __LINE__,
5022 GetPString(IDS_COULDNTSTARTTHREADTEXT));
5023 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
5024 return 0;
5025 }
5026 else
5027 DosSleep(32);//05 Aug 07 GKY 64
5028
5029 hwndFrame = WinQueryWindow(hwnd, QW_PARENT);
5030
5031 /*
5032 * create frame children (not client children, frame children)
5033 */
5034 DosSleep(1);
5035 WinQueryWindowPos(hwndFrame, &swp);
5036 oldproc = WinSubclassWindow(hwndFrame, MainFrameWndProc);
5037 WinSetWindowPtr(hwndFrame, QWL_USER, (PVOID) oldproc);
5038 CommonCreateMainChildren(hwnd, &swp);
5039
5040 if (!WinCreateWindow(hwndFrame,
5041 WC_BUTTON,
5042 "I",
5043 WS_VISIBLE | BS_PUSHBUTTON | BS_NOPOINTERFOCUS,
5044 ((swp.cx -
5045 WinQuerySysValue(HWND_DESKTOP,
5046 SV_CXMINMAXBUTTON)) -
5047 WinQuerySysValue(HWND_DESKTOP,
5048 SV_CXMINMAXBUTTON) / 2) -
5049 WinQuerySysValue(HWND_DESKTOP,
5050 SV_CXSIZEBORDER),
5051 (swp.cy - WinQuerySysValue(HWND_DESKTOP,
5052 SV_CYMINMAXBUTTON)) -
5053 WinQuerySysValue(HWND_DESKTOP,
5054 SV_CYSIZEBORDER),
5055 WinQuerySysValue(HWND_DESKTOP,
5056 SV_CXMINMAXBUTTON) / 2,
5057 WinQuerySysValue(HWND_DESKTOP,
5058 SV_CYMINMAXBUTTON),
5059 hwnd, HWND_TOP, IDM_IDEALSIZE, NULL, NULL)) {
5060 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
5061 }
5062 else {
5063 WinSubclassWindow(WinWindowFromID(hwndFrame, IDM_IDEALSIZE),
5064 IdealButtonProc);
5065 SetPresParams(WinWindowFromID(hwndFrame,
5066 IDM_IDEALSIZE),
5067 NULL, NULL, NULL, GetPString(IDS_10SYSTEMVIOTEXT));
5068 }
5069
5070 hwndTmp = WinCreateWindow(hwndFrame,
5071 WC_BUTTON,
5072 "#1019",
5073 WS_VISIBLE | BS_PUSHBUTTON | BS_NOPOINTERFOCUS |
5074 BS_BITMAP,
5075 swp.cx - 46,
5076 swp.y + 2,
5077 24,
5078 22, hwnd, HWND_TOP, IDM_OPENWALK, NULL, NULL);
5079 if (!hwndTmp)
5080 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
5081
5082 hwndTmp = WinCreateWindow(hwndFrame,
5083 WC_BUTTON,
5084 "#3062",
5085 WS_VISIBLE | BS_PUSHBUTTON | BS_NOPOINTERFOCUS |
5086 BS_BITMAP,
5087 swp.cx - 22,
5088 swp.y + 2,
5089 24,
5090 22, hwnd, HWND_TOP, IDM_USERLIST, NULL, NULL);
5091 if (!hwndTmp)
5092 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
5093
5094 hwndUserlist = WinCreateWindow(hwndFrame,
5095 WC_COMBOBOX,
5096 (PSZ) NULL,
5097 WS_VISIBLE | CBS_DROPDOWN |
5098 LS_HORZSCROLL,
5099 (swp.x +
5100 WinQuerySysValue(HWND_DESKTOP,
5101 SV_CXSIZEBORDER) + 48L),
5102 (swp.cy -
5103 WinQuerySysValue(HWND_DESKTOP,
5104 SV_CYSIZEBORDER)) - 60,
5105 ((swp.cx -
5106 (WinQuerySysValue(HWND_DESKTOP,
5107 SV_CXSIZEBORDER) *
5108 2)) - 64L), 60L, hwndFrame, HWND_TOP,
5109 MAIN_USERLIST, NULL, NULL);
5110 if (!hwndUserlist)
5111 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
5112 hwndCmdlist = WinCreateWindow(hwndFrame,
5113 WC_COMBOBOX,
5114 (PSZ) NULL,
5115 WS_VISIBLE | CBS_DROPDOWN |
5116 LS_HORZSCROLL,
5117 (swp.x +
5118 WinQuerySysValue(HWND_DESKTOP,
5119 SV_CXSIZEBORDER) + 48L),
5120 (swp.cy -
5121 WinQuerySysValue(HWND_DESKTOP,
5122 SV_CYSIZEBORDER)) - 60,
5123 ((swp.cx -
5124 (WinQuerySysValue(HWND_DESKTOP,
5125 SV_CXSIZEBORDER) * 2)) -
5126 64L), 60L, hwndFrame, HWND_TOP,
5127 MAIN_CMDLIST, NULL, NULL);
5128 if (!hwndCmdlist)
5129 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
5130 WinSetWindowText(hwndCmdlist, GetPString(IDS_COMMANDSTEXT));
5131 hwndStatelist = WinCreateWindow(hwndFrame,
5132 WC_COMBOBOX,
5133 (PSZ) NULL,
5134 WS_VISIBLE | CBS_DROPDOWN |
5135 LS_HORZSCROLL,
5136 (swp.x +
5137 WinQuerySysValue(HWND_DESKTOP,
5138 SV_CXSIZEBORDER) + 48L),
5139 (swp.cy -
5140 WinQuerySysValue(HWND_DESKTOP,
5141 SV_CYSIZEBORDER)) - 60,
5142 ((swp.cx -
5143 (WinQuerySysValue(HWND_DESKTOP,
5144 SV_CXSIZEBORDER) *
5145 2)) - 64L), 60L, hwndFrame, HWND_TOP,
5146 MAIN_SETUPLIST, NULL, NULL);
5147 if (!hwndStatelist)
5148 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
5149
5150 hwndDrivelist = WinCreateWindow(hwndFrame,
5151 WC_COMBOBOX,
5152 (PSZ) NULL,
5153 WS_VISIBLE | CBS_DROPDOWN,
5154 (swp.x +
5155 WinQuerySysValue(HWND_DESKTOP,
5156 SV_CXSIZEBORDER)),
5157 (swp.cy -
5158 WinQuerySysValue(HWND_DESKTOP,
5159 SV_CYSIZEBORDER)) - 60,
5160 48L,
5161 60L,
5162 hwndFrame,
5163 HWND_TOP, MAIN_DRIVELIST, NULL, NULL);
5164 if (!hwndDrivelist)
5165 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
5166 SetPresParams(hwndDrivelist,
5167 NULL, NULL, NULL, GetPString(IDS_10SYSTEMMONOTEXT));
5168 hwndButtonlist = WinCreateWindow(hwndFrame,
5169 WC_COMBOBOX,
5170 (PSZ) NULL,
5171 WS_VISIBLE | CBS_DROPDOWN |
5172 LS_HORZSCROLL,
5173 (swp.cx -
5174 WinQuerySysValue(HWND_DESKTOP,
5175 SV_CXSIZEBORDER)) -
5176 164L,
5177 (swp.cy -
5178 WinQuerySysValue(HWND_DESKTOP,
5179 SV_CYSIZEBORDER)) - 60,
5180 164L, 60L, hwndFrame, HWND_TOP,
5181 MAIN_BUTTONLIST, NULL, NULL);
5182 if (!hwndButtonlist)
5183 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
5184 WinSendMsg(WinWindowFromID(hwndUserlist, CBID_EDIT),
5185 EM_SETTEXTLIMIT, MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
5186 WinSendMsg(WinWindowFromID(hwndStatelist, CBID_EDIT),
5187 EM_SETTEXTLIMIT, MPFROM2SHORT(STATE_NAME_MAX_BYTES, 0), MPVOID);
5188 WinSendMsg(WinWindowFromID(hwndDrivelist, CBID_EDIT),
5189 EM_SETREADONLY, MPFROM2SHORT(TRUE, 0), MPVOID);
5190 WinSendMsg(WinWindowFromID(hwndButtonlist, CBID_EDIT),
5191 EM_SETREADONLY, MPFROM2SHORT(TRUE, 0), MPVOID);
5192 WinSendMsg(WinWindowFromID(hwndCmdlist, CBID_EDIT),
5193 EM_SETREADONLY, MPFROM2SHORT(TRUE, 0), MPVOID);
5194
5195 oldproc = WinSubclassWindow(WinWindowFromID(hwndUserlist, CBID_EDIT),
5196 DropDownListProc);
5197 WinSetWindowPtr(WinWindowFromID(hwndUserlist, CBID_EDIT),
5198 QWL_USER, (PVOID) oldproc);
5199 oldproc = WinSubclassWindow(WinWindowFromID(hwndCmdlist, CBID_EDIT),
5200 DropDownListProc);
5201 WinSetWindowPtr(WinWindowFromID(hwndCmdlist, CBID_EDIT),
5202 QWL_USER, (PVOID) oldproc);
5203 oldproc = WinSubclassWindow(WinWindowFromID(hwndButtonlist, CBID_EDIT),
5204 DropDownListProc);
5205 WinSetWindowPtr(WinWindowFromID(hwndButtonlist, CBID_EDIT),
5206 QWL_USER, (PVOID) oldproc);
5207 oldproc = WinSubclassWindow(WinWindowFromID(hwndStatelist, CBID_EDIT),
5208 DropDownListProc);
5209 WinSetWindowPtr(WinWindowFromID(hwndStatelist, CBID_EDIT),
5210 QWL_USER, (PVOID) oldproc);
5211 oldproc = WinSubclassWindow(WinWindowFromID(hwndDrivelist, CBID_EDIT),
5212 DropDownListProc);
5213 WinSetWindowPtr(WinWindowFromID(hwndDrivelist, CBID_EDIT),
5214 QWL_USER, (PVOID) oldproc);
5215 oldproc = WinSubclassWindow(hwndUserlist, DropDownListProc);
5216 WinSetWindowPtr(hwndUserlist, QWL_USER, (PVOID) oldproc);
5217 oldproc = WinSubclassWindow(hwndCmdlist, DropDownListProc);
5218 WinSetWindowPtr(hwndCmdlist, QWL_USER, (PVOID) oldproc);
5219 oldproc = WinSubclassWindow(hwndStatelist, DropDownListProc);
5220 WinSetWindowPtr(hwndStatelist, QWL_USER, (PVOID) oldproc);
5221 oldproc = WinSubclassWindow(hwndDrivelist, DropDownListProc);
5222 WinSetWindowPtr(hwndDrivelist, QWL_USER, (PVOID) oldproc);
5223 oldproc = WinSubclassWindow(hwndButtonlist, DropDownListProc);
5224 WinSetWindowPtr(hwndButtonlist, QWL_USER, (PVOID) oldproc);
5225 oldproc = WinSubclassWindow(WinWindowFromID(hwndFrame, IDM_USERLIST),
5226 ChildFrameButtonProc);
5227 WinSetWindowPtr(WinWindowFromID(hwndFrame, IDM_USERLIST),
5228 QWL_USER, (PVOID) oldproc);
5229 oldproc = WinSubclassWindow(WinWindowFromID(hwndFrame, IDM_OPENWALK),
5230 ChildFrameButtonProc);
5231 WinSetWindowPtr(WinWindowFromID(hwndFrame, IDM_OPENWALK),
5232 QWL_USER, (PVOID) oldproc);
5233 hwndMenu = WinWindowFromID(hwndFrame, FID_MENU);
5234 WinSendMsg(hwnd, UM_ADDTOMENU, MPVOID, MPVOID);
5235 SetToggleChecks(hwndMenu);
5236 SetConditionalCascade(hwndMenu, IDM_TOOLSUBMENU, IDM_TOOLBAR);
5237 SetConditionalCascade(hwndMenu, IDM_AUTOVIEWSUBMENU, IDM_AUTOVIEW);
5238 SetConditionalCascade(hwndMenu, IDM_TILEMENU, IDM_TILE);
5239 WinSetWindowULong(hwnd, QWL_USER, hwndMenu);
5240 memset(&mi, 0, sizeof(mi));
5241 memset(&mit, 0, sizeof(mit));
5242 hwndSysMenu = WinWindowFromID(hwndFrame, FID_SYSMENU);
5243 idSysMenu = SHORT1FROMMR(WinSendMsg(hwndSysMenu,
5244 MM_ITEMIDFROMPOSITION,
5245 MPVOID, MPVOID));
5246 WinSendMsg(hwndSysMenu,
5247 MM_QUERYITEM, MPFROM2SHORT(idSysMenu, 0), MPFROMP(&mit));
5248 hwndSysSubMenu = mit.hwndSubMenu;
5249 mi.iPosition = MIT_END;
5250 mi.afStyle = MIS_SEPARATOR;
5251 mi.id = (USHORT) - 1;
5252 WinSendMsg(hwndSysSubMenu, MM_INSERTITEM, MPFROMP(&mi), MPFROMP(NULL));
5253 mi.afStyle = MIS_TEXT;
5254 mi.id = IDM_IDEALSIZE;
5255 WinSendMsg(hwndSysSubMenu,
5256 MM_INSERTITEM,
5257 MPFROMP(&mi), MPFROMP(GetPString(IDS_IDEALMENUTEXT)));
5258 mi.afStyle = MIS_TEXT;
5259 mi.id = IDM_HIDEMENU;
5260 WinSendMsg(hwndSysSubMenu,
5261 MM_INSERTITEM,
5262 MPFROMP(&mi), MPFROMP(GetPString(IDS_HIDEMENUTEXT)));
5263 SetSysMenu(hwndSysMenu);
5264
5265 size = sizeof(BOOL);
5266 if (PrfQueryProfileData(fmprof,
5267 FM3Str,
5268 "MenuInvisible", &temp, &size) && size && temp)
5269 WinSendMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_HIDEMENU, 0), MPVOID);
5270 size = sizeof(BOOL);
5271 if (PrfQueryProfileData(fmprof,
5272 FM3Str, "FreeTree", &temp, &size) && size && temp)
5273 WinSendMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_FREETREE, 0), MPVOID);
5274 size = sizeof(BOOL);
5275 if (PrfQueryProfileData(fmprof,
5276 FM3Str,
5277 "AutoTile", &temp, &size) && size && !temp)
5278 WinSendMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_AUTOTILE, 0), MPVOID);
5279 size = sizeof(BOOL);
5280 if (PrfQueryProfileData(fmprof,
5281 FM3Str, "Toolbar", &temp, &size) && size && !temp)
5282 WinSendMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_TOOLBAR, 0), MPVOID);
5283
5284 WinSetWindowText(WinWindowFromID(hwndFrame, FID_TITLEBAR), "FM/2");
5285 FixSwitchList(hwndFrame, NULL);
5286 break; // WM_CREATE
5287
5288 case UM_SETUP:
5289 /*
5290 * start up some initial children
5291 */
5292 load_tools(NULL);
5293 BuildTools(hwndToolback, TRUE);
5294 WinShowWindow(WinQueryWindow(hwnd, QW_PARENT), TRUE);
5295 PostMsg(MainObjectHwnd, UM_SETUP2, mp1, mp2);
5296 return 0;
5297
5298 case UM_SETUP2:
5299 {
5300 SWP swp;
5301 ULONG size = sizeof(SWP);
5302
5303 WinQueryWindowPos(hwnd, &swp);
5304 hwndTree = StartTreeCnr(hwnd, 0);
5305 if (!hwndTree)
5306 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
5307 else {
5308 if (!fSaveState ||
5309 !PrfQueryProfileData(fmprof,
5310 FM3Str,
5311 "LastTreePos",
5312 &swp, &size) || size != sizeof(SWP)) {
5313
5314 INT ratio, height = 0;
5315
5316 if (!fNoTreeGap)
5317 height = WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2;
5318 size = sizeof(ratio);
5319 if (!PrfQueryProfileData(fmprof,
5320 FM3Str,
5321 "TreeWindowRatio",
5322 (PVOID) & ratio,
5323 &size) || size < sizeof(ratio))
5324 ratio = 400;
5325 WinSetWindowPos(hwndTree,
5326 HWND_TOP,
5327 0,
5328 height,
5329 (swp.cx * 100) / ratio,
5330 swp.cy - height,
5331 SWP_SHOW | SWP_SIZE | SWP_MOVE |
5332 SWP_ACTIVATE | SWP_ZORDER);
5333 }
5334 else
5335 WinSetWindowPos(hwndTree,
5336 HWND_TOP,
5337 swp.x,
5338 swp.y,
5339 swp.cx,
5340 swp.cy,
5341 swp.fl | SWP_MOVE | SWP_SIZE | SWP_SHOW |
5342 SWP_ZORDER | SWP_ACTIVATE);
5343 }
5344 ResizeTools(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
5345 MAIN_TOOLS));
5346 }
5347 PostMsg(MainObjectHwnd, UM_SETUP3, mp1, mp2);
5348 return 0;
5349
5350 case UM_SETUP3:
5351 /* start remaining child windows */
5352 if (!fNoSaveState && fSaveState)
5353 PostMsg(MainObjectHwnd, UM_RESTORE, MPVOID, MPVOID);
5354 PostMsg(MainObjectHwnd, UM_SETUP4, mp1, mp2);
5355 return 0;
5356
5357 case UM_SETUP4:
5358 {
5359 INT argc = (INT) mp1, x;
5360 CHAR **argv = (CHAR **) mp2;
5361
5362 for (x = 1; x < argc; x++) {
5363 if (*argv[x] == '/' || *argv[x] == ';')
5364 continue;
5365 if (!IsFile(argv[x]) && !FindDirCnrByName(argv[x], FALSE))
5366 OpenDirCnr((HWND) 0, hwndMain, hwndTree, TRUE, argv[x]);
5367 }
5368 }
5369 PostMsg(MainObjectHwnd, UM_SETUP5, MPVOID, MPVOID);
5370 return 0;
5371
5372 case UM_SETUP5:
5373 if (fAutoTile)
5374 TileChildren(hwnd, TRUE);
5375 PostMsg(hwnd, UM_FILLUSERLIST, MPVOID, MPVOID);
5376 PostMsg(hwnd, UM_FILLSETUPLIST, MPVOID, MPVOID);
5377 PostMsg(hwnd, UM_FILLCMDLIST, MPVOID, MPVOID);
5378 PostMsg(hwnd, UM_FILLBUTTONLIST, MPVOID, MPVOID);
5379 {
5380 HWND hwndActive;
5381
5382 hwndActive = TopWindow(hwnd, hwndTree);
5383 if (hwndActive)
5384 WinSetWindowPos(hwndActive, HWND_TOP, 0, 0, 0, 0, SWP_ACTIVATE);
5385 }
5386 if (fStartMinimized || fReminimize)
5387 PostMsg(hwndTree, UM_MINIMIZE, MPVOID, MPVOID);
5388 else if (fStartMaximized)
5389 PostMsg(hwndTree, UM_MAXIMIZE, MPVOID, MPVOID);
5390 fRunning = TRUE;
5391 return 0;
5392 }
5393
5394 return WinDefWindowProc(hwnd, msg, mp1, mp2);
5395}
5396
5397MRESULT EXPENTRY MainWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
5398{
5399 switch (msg) {
5400 case WM_CREATE:
5401 case UM_SETUP:
5402 case UM_SETUP2:
5403 case UM_SETUP3:
5404 case UM_SETUP4:
5405 case UM_SETUP5:
5406 return MainWMOnce(hwnd, msg, mp1, mp2);
5407
5408 case WM_CONTROLPOINTER:
5409 if (!fNoFinger &&
5410 (SHORT1FROMMP(mp1) == IDM_OPENWALK ||
5411 SHORT1FROMMP(mp1) == IDM_USERLIST))
5412 return MRFROMLONG(hptrFinger);
5413 break;
5414
5415 case UM_LOADFILE:
5416 case UM_THREADUSE:
5417 case UM_BUILDDRIVEBAR:
5418 return CommonMainWndProc(hwnd, msg, mp1, mp2);
5419
5420 case WM_BUTTON1UP:
5421 case WM_BUTTON2UP:
5422 case WM_BUTTON3UP:
5423 case WM_MOUSEMOVE:
5424 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
5425 break;
5426
5427 case WM_CHAR:
5428 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
5429 break;
5430
5431 case WM_MENUEND:
5432 if ((HWND) mp2 == MainPopupMenu) {
5433 WinDestroyWindow(MainPopupMenu);
5434 MainPopupMenu = (HWND) 0;
5435 }
5436 break;
5437
5438 case UM_CONTEXTMENU:
5439 case WM_CONTEXTMENU:
5440 if (CheckMenu(hwndMainMenu, &MainPopupMenu, MAIN_POPUP)) {
5441 SetToggleChecks(MainPopupMenu);
5442 PopupMenu(hwnd, hwnd, MainPopupMenu);
5443 }
5444 if (msg == UM_CONTEXTMENU)
5445 return 0;
5446 return MRFROMSHORT(TRUE);
5447
5448 case UM_SETUSERLISTNAME:
5449 if (mp1) {
5450 if (fUserComboBox)
5451 WinSetWindowText(WinWindowFromID(hwndUserlist, CBID_EDIT),
5452 (CHAR *) mp1);
5453 if (add_udir(FALSE, (CHAR *) mp1)) {
5454 if (fUserComboBox && fAutoAddDirs) {
5455 WinSendMsg(hwndUserlist, LM_INSERTITEM,
5456 MPFROM2SHORT(LIT_SORTASCENDING, 0),
5457 MPFROMP((CHAR *) mp1));
5458 }
5459 }
5460 }
5461 return 0;
5462
5463 case UM_ARRANGEICONS:
5464 ArrangeIcons(hwnd);
5465 return 0;
5466
5467 case WM_CHORD:
5468 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_WINDOWDLG, 0), MPVOID);
5469 break;
5470
5471 case WM_SETFOCUS:
5472 if (mp2)
5473 PostMsg(hwnd, UM_FOCUSME, MPVOID, MPVOID);
5474 break;
5475
5476 case UM_FOCUSME:
5477 WinSetFocus(hwndTree, TRUE);
5478 return 0;
5479
5480 case UM_RESCAN:
5481 TileChildren(hwnd, TRUE);
5482 return 0;
5483
5484 case WM_SAVEAPPLICATION:
5485 {
5486 SWP swp;
5487
5488 WinQueryWindowPos(WinQueryWindow(hwnd, QW_PARENT), &swp);
5489 if (!(swp.fl & (SWP_HIDE | SWP_MINIMIZE))) {
5490 WinStoreWindowPos(FM2Str,
5491 "MainWindowPos", WinQueryWindow(hwnd, QW_PARENT));
5492 if (!fNoSaveState && fSaveState)
5493 SaveDirCnrState(hwnd, NULL);
5494 }
5495 }
5496 break;
5497
5498 case MM_PORTHOLEINIT:
5499 switch (SHORT1FROMMP(mp1)) {
5500 case 0:
5501 case 1:
5502 {
5503 HWND hwndCurrent;
5504 ULONG wmsg;
5505
5506 wmsg = (SHORT1FROMMP(mp1) == 0) ? UM_FILESMENU : UM_VIEWSMENU;
5507 hwndCurrent = TopWindow(hwnd, (HWND) 0);
5508 PortholeInit((HWND) WinSendMsg(WinWindowFromID(hwndCurrent,
5509 FID_CLIENT), wmsg,
5510 MPVOID, MPVOID), mp1, mp2);
5511 }
5512 break;
5513 }
5514 break;
5515
5516 case WM_INITMENU:
5517 switch (SHORT1FROMMP(mp1)) {
5518 case IDM_CONFIGMENU:
5519 SetToggleChecks((HWND) WinQueryWindowULong(hwnd, QWL_USER));
5520 break;
5521
5522 case IDM_WINDOWSMENU:
5523 /*
5524 * add child windows of client
5525 * and switchlist entries to end of pulldown menu
5526 */
5527 {
5528 HWND hwndMenu, hwndSubMenu;
5529 MENUITEM mi;
5530
5531 hwndMenu = WinQueryWindowULong(hwnd, QWL_USER);
5532 memset(&mi, 0, sizeof(mi));
5533 mi.iPosition = MIT_END;
5534 mi.afStyle = MIS_TEXT;
5535 if (!WinSendMsg(hwndMenu, MM_QUERYITEM,
5536 MPFROM2SHORT(IDM_WINDOWSMENU, TRUE), MPFROMP(&mi)))
5537 break;
5538 hwndSubMenu = mi.hwndSubMenu;
5539 SetupWinList(hwndSubMenu, hwnd, WinQueryWindow(hwnd, QW_PARENT));
5540 }
5541 break;
5542
5543 default:
5544 {
5545 HWND hwndCurrent;
5546
5547 hwndCurrent = TopWindow(hwnd, (HWND) 0);
5548 if (hwndCurrent)
5549 WinSendMsg(hwndCurrent, UM_INITMENU, mp1, mp2);
5550 }
5551 break;
5552 }
5553 break;
5554
5555 case UM_ADDTOMENU:
5556 AddToMenu((CHAR *) mp1, WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
5557 FID_MENU));
5558 return 0;
5559
5560 case UM_FILLCMDLIST:
5561 WinSendMsg(hwndCmdlist, LM_DELETEALL, MPVOID, MPVOID);
5562 if (!cmdloaded)
5563 load_commands();
5564 if (cmdhead) {
5565
5566 LINKCMDS *info;
5567
5568 info = cmdhead;
5569 while (info) {
5570 WinSendMsg(hwndCmdlist, LM_INSERTITEM,
5571 MPFROM2SHORT(LIT_END, 0), MPFROMP(info->title));
5572 info = info->next;
5573 }
5574 }
5575 return 0;
5576
5577 case UM_FILLSETUPLIST:
5578 fill_setups_list();
5579 return 0;
5580
5581 case UM_FILLBUTTONLIST:
5582 WinSendMsg(hwndButtonlist, LM_DELETEALL, MPVOID, MPVOID);
5583 if (fUserComboBox) {
5584
5585 BOOL foundit = FALSE, thisone;
5586 ULONG ulSearchCount;
5587 SHORT sSelect;
5588 FILEFINDBUF3 findbuf;
5589 HDIR hDir;
5590 CHAR *p;
5591
5592 DosError(FERR_DISABLEHARDERR);
5593 hDir = HDIR_CREATE;
5594 ulSearchCount = 1;
5595 if (!DosFindFirst("*.TLS", &hDir, FILE_READONLY | FILE_ARCHIVED,
5596 &findbuf, sizeof(FILEFINDBUF3),
5597 &ulSearchCount, FIL_STANDARD)) {
5598 do {
5599 priority_bumped();
5600 if (!foundit) {
5601 thisone = FALSE;
5602 p = strrchr(lasttoolbox, '\\');
5603 if (!p)
5604 p = lasttoolbox;
5605 else
5606 p++;
5607 if (!stricmp(findbuf.achName, p))
5608 thisone = TRUE;
5609 }
5610 p = strrchr(findbuf.achName, '.');
5611 if (p)
5612 *p = 0;
5613 sSelect = (SHORT) WinSendMsg(hwndButtonlist, LM_INSERTITEM,
5614 MPFROM2SHORT(LIT_SORTASCENDING, 0),
5615 MPFROMP(findbuf.achName));
5616 if (!foundit && thisone && sSelect >= 0) {
5617 WinSendMsg(hwndButtonlist, LM_SELECTITEM,
5618 MPFROM2SHORT(sSelect, 0), MPFROMLONG(TRUE));
5619 foundit = TRUE;
5620 }
5621 }
5622 while (!DosFindNext(hDir, &findbuf, sizeof(FILEFINDBUF3),
5623 &ulSearchCount));
5624 DosFindClose(hDir);
5625 priority_bumped();
5626 }
5627 WinSetWindowText(hwndButtonlist, GetPString(IDS_TOOLBOXTEXT));
5628 }
5629 return 0;
5630
5631 case UM_FILLUSERLIST:
5632 WinSendMsg(hwndUserlist, LM_DELETEALL, MPVOID, MPVOID);
5633 if (fUserComboBox) {
5634 ULONG ulDriveNum;
5635 ULONG ulDriveMap;
5636 ULONG ulSearchCount;
5637 FILEFINDBUF3 findbuf;
5638 HDIR hDir;
5639 APIRET rc;
5640 LINKDIRS *info;
5641 LINKDIRS *temp;
5642
5643 if (!loadedudirs)
5644 load_udirs();
5645 DosError(FERR_DISABLEHARDERR);
5646 DosQCurDisk(&ulDriveNum, &ulDriveMap);
5647 info = udirhead;
5648 while (info) {
5649 if (IsFullName(info->path) &&
5650 !(driveflags[toupper(*info->path) - 'A'] &
5651 (DRIVE_IGNORE | DRIVE_INVALID))) {
5652 DosError(FERR_DISABLEHARDERR);
5653 hDir = HDIR_CREATE;
5654 ulSearchCount = 1;
5655 if (!IsRoot(info->path))
5656 rc = DosFindFirst(info->path, &hDir, FILE_DIRECTORY |
5657 MUST_HAVE_DIRECTORY | FILE_READONLY |
5658 FILE_ARCHIVED | FILE_SYSTEM | FILE_HIDDEN,
5659 &findbuf, sizeof(FILEFINDBUF3),
5660 &ulSearchCount, FIL_STANDARD);
5661 else {
5662 rc = 0;
5663 findbuf.attrFile = FILE_DIRECTORY;
5664 }
5665 priority_bumped();
5666 if (!rc) {
5667 if (!IsRoot(info->path))
5668 DosFindClose(hDir);
5669 if (findbuf.attrFile & FILE_DIRECTORY)
5670 WinSendMsg(hwndUserlist, LM_INSERTITEM,
5671 MPFROM2SHORT(LIT_SORTASCENDING, 0),
5672 MPFROMP(info->path));
5673 else {
5674 temp = info->next;
5675 remove_udir(info->path);
5676 info = temp;
5677 continue;
5678 }
5679 }
5680 else if (!(ulDriveMap & (1 << (toupper(*info->path) - 'A')))) {
5681 temp = info->next;
5682 remove_udir(info->path);
5683 info = temp;
5684 continue;
5685 }
5686 }
5687 info = info->next;
5688 }
5689 info = ldirhead;
5690 while (info) {
5691 if (IsFullName(info->path) &&
5692 !(driveflags[toupper(*info->path) - 'A'] &
5693 (DRIVE_IGNORE | DRIVE_INVALID))) {
5694 DosError(FERR_DISABLEHARDERR);
5695 hDir = HDIR_CREATE;
5696 ulSearchCount = 1;
5697 if (!IsRoot(info->path))
5698 rc = DosFindFirst(info->path, &hDir, FILE_DIRECTORY |
5699 MUST_HAVE_DIRECTORY | FILE_READONLY |
5700 FILE_ARCHIVED | FILE_SYSTEM | FILE_HIDDEN,
5701 &findbuf, sizeof(FILEFINDBUF3),
5702 &ulSearchCount, FIL_STANDARD);
5703 else {
5704 rc = 0;
5705 findbuf.attrFile = FILE_DIRECTORY;
5706 }
5707 priority_bumped();
5708 if (!rc) {
5709 if (!IsRoot(info->path))
5710 DosFindClose(hDir);
5711 if (findbuf.attrFile & FILE_DIRECTORY)
5712 WinSendMsg(hwndUserlist, LM_INSERTITEM,
5713 MPFROM2SHORT(LIT_SORTASCENDING, 0),
5714 MPFROMP(info->path));
5715 else {
5716 temp = info->next;
5717 remove_udir(info->path);
5718 info = temp;
5719 continue;
5720 }
5721 }
5722 else if (!(ulDriveMap & (1 << (toupper(*info->path) - 'A')))) {
5723 temp = info->next;
5724 remove_udir(info->path);
5725 info = temp;
5726 continue;
5727 }
5728 }
5729 info = info->next;
5730 }
5731 WinSendMsg(hwndUserlist, LM_INSERTITEM,
5732 MPFROM2SHORT(0, 0),
5733 MPFROMP(GetPString(IDS_NEWDIRECTORYTEXT)));
5734 WinSetWindowText(hwndUserlist, GetPString(IDS_COMMONDIRTEXT));
5735 }
5736 return 0;
5737
5738 case UM_SIZE:
5739 if (fAutoTile)
5740 TileChildren(hwnd, FALSE);
5741 else
5742 MoveChildrenAwayFromTree(hwnd);
5743 return 0;
5744
5745 case WM_SIZE:
5746 ResizeChildren(hwnd, SHORT1FROMMP(mp1), SHORT2FROMMP(mp1),
5747 SHORT1FROMMP(mp2), SHORT2FROMMP(mp2));
5748 break;
5749
5750 case WM_ERASEBACKGROUND:
5751 WinFillRect((HPS) mp1, (PRECTL) mp2, 0x00d0d0d0);
5752 return 0;
5753
5754 case WM_PAINT:
5755 {
5756 HPS hps;
5757 RECTL rcl;
5758
5759 hps = WinBeginPaint(hwnd, (HPS) 0, NULL);
5760 if (hps) {
5761 WinQueryWindowRect(hwnd, &rcl);
5762 WinFillRect(hps, &rcl, CLR_PALEGRAY);
5763 WinEndPaint(hps);
5764 }
5765 }
5766 break;
5767
5768 case UM_CONTROL:
5769 switch (SHORT1FROMMP(mp1)) {
5770 case MAIN_CMDLIST:
5771 case MAIN_SETUPLIST:
5772 case MAIN_DRIVELIST:
5773 case MAIN_USERLIST:
5774 case MAIN_BUTTONLIST:
5775 switch (SHORT2FROMMP(mp1)) {
5776 case CBN_ENTER:
5777 {
5778 HWND hwndUL = WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
5779 SHORT1FROMMP(mp1));
5780 CHAR path[CCHMAXPATH];
5781 ULONG ul;
5782
5783 switch (SHORT1FROMMP(mp1)) {
5784 case MAIN_USERLIST:
5785 ul = CCHMAXPATH;
5786 break;
5787 case MAIN_SETUPLIST:
5788 ul = STATE_NAME_MAX_BYTES;
5789 break;
5790 default:
5791 ul = 13; // fixme to not be hardcoded
5792 }
5793
5794 SetShiftState();
5795 WinQueryWindowText(WinWindowFromID(hwndUL, CBID_EDIT), ul, path);
5796 bstrip(path);
5797 if (*path) {
5798 if (SHORT1FROMMP(mp1) == MAIN_USERLIST) {
5799 if (!strcmp(path, GetPString(IDS_NEWDIRECTORYTEXT))) {
5800 if (!LastDir ||
5801 !WinSendMsg(WinQueryWindow(LastDir, QW_PARENT),
5802 UM_CONTAINERDIR, MPFROMP(path), MPVOID))
5803 save_dir2(path);
5804 if (!PMMkDir(hwnd, path, TRUE)) {
5805 WinSetWindowText(hwndUL, GetPString(IDS_COMMONDIRTEXT));
5806 break;
5807 }
5808 }
5809 if (!IsFile(path) && !FindDirCnrByName(path, TRUE)) {
5810
5811 HWND hwndDir;
5812
5813 if ((fUserListSwitches &&
5814 !(shiftstate & KC_SHIFT)) ||
5815 (!fUserListSwitches && (shiftstate & KC_SHIFT))) {
5816 hwndDir = FindDirCnr(hwnd);
5817 if (hwndDir) {
5818 WinSendMsg(LastDir, UM_SETDIR, MPFROMP(path), MPVOID);
5819 break;
5820 }
5821 }
5822 OpenDirCnr((HWND) 0, hwndMain, hwndTree, FALSE, path);
5823 }
5824 }
5825 else if (SHORT1FROMMP(mp1) == MAIN_DRIVELIST) {
5826 ShowTreeRec(WinWindowFromID(WinWindowFromID(hwndTree,
5827 FID_CLIENT),
5828 TREE_CNR), path, FALSE, TRUE);
5829 WinSetFocus(HWND_DESKTOP, hwndTree);
5830 }
5831 else if (SHORT1FROMMP(mp1) == MAIN_BUTTONLIST) {
5832 strcat(path, ".TLS");
5833 load_tools(path);
5834 PrfWriteProfileString(fmprof,
5835 FM3Str, "LastToolBox", lasttoolbox);
5836 BuildTools(hwndToolback, TRUE);
5837 WinSetWindowText(hwndButtonlist, GetPString(IDS_TOOLBOXTEXT));
5838 }
5839 else if (SHORT1FROMMP(mp1) == MAIN_SETUPLIST) {
5840
5841 CHAR szKey[80];
5842 ULONG size, numsaves = 0;
5843
5844 SetShiftState();
5845 size = sizeof(ULONG);
5846 sprintf(szKey, "%s.NumDirsLastTime", path); // path is state name
5847 if (!PrfQueryProfileData(fmprof,
5848 FM3Str,
5849 szKey,
5850 (PVOID)&numsaves,
5851 &size))
5852 {
5853 if ((WinGetLastError(WinQueryAnchorBlock(hwnd)) & 0xffff) == PMERR_NOT_IN_IDX) {
5854 saymsg(MB_ENTER | MB_ICONASTERISK, hwnd,
5855 GetPString(IDS_WARNINGTEXT),
5856 GetPString(IDS_DOESNTEXISTTEXT), path);
5857 }
5858 else {
5859 Win_Error2(hwnd, hwnd, __FILE__, __LINE__,
5860 IDS_PRFQUERYPROFILEDATA);
5861 }
5862 }
5863 else if (!numsaves)
5864 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
5865 else {
5866 if ((shiftstate & KC_SHIFT) == 0)
5867 PostMsg(MainObjectHwnd, UM_RESTORE, MPVOID, MPFROMLONG(2L));
5868 {
5869 char *temp;
5870
5871 temp = xstrdup(path, pszSrcFile, __LINE__);
5872 if (!temp) {
5873 if ((shiftstate & KC_SHIFT) != 0 || fAutoTile)
5874 PostMsg(MainObjectHwnd, UM_RESTORE, MPVOID,
5875 MPFROMLONG(1));
5876 }
5877 else {
5878 if (!PostMsg
5879 (MainObjectHwnd, UM_RESTORE, MPFROMP(temp), MPVOID))
5880 free(temp);
5881 }
5882 }
5883 }
5884 // fixme to hold restored state name for a while
5885 // WinSetWindowText(hwndStatelist, GetPString(IDS_STATETEXT)); // 15 Apr 07 SHL
5886 }
5887 else if (SHORT1FROMMP(mp1) == MAIN_CMDLIST) {
5888
5889 SHORT sSelect;
5890
5891 sSelect = (SHORT) WinSendMsg(hwndCmdlist,
5892 LM_QUERYSELECTION,
5893 MPFROMSHORT(LIT_FIRST), MPVOID);
5894 if (sSelect >= 0)
5895 WinPostMsg(hwnd,
5896 WM_COMMAND,
5897 MPFROM2SHORT(IDM_COMMANDSTART + sSelect, 0),
5898 MPVOID);
5899 WinSetWindowText(hwndCmdlist, GetPString(IDS_COMMANDSTEXT));
5900 }
5901 }
5902 }
5903 break;
5904
5905 default:
5906 break;
5907 }
5908 break;
5909
5910 default:
5911 break;
5912 }
5913 return 0;
5914
5915 case WM_HELP:
5916 WinSendMsg(hwndHelp, HM_HELP_CONTENTS, MPVOID, MPVOID);
5917 break;
5918
5919 case UM_COMMAND:
5920 case WM_COMMAND:
5921
5922 return MainWMCommand(hwnd, msg, mp1, mp2);
5923
5924 case WM_CLOSE:
5925 WinSendMsg(WinQueryWindow(hwnd, QW_PARENT),
5926 WM_SYSCOMMAND, MPFROM2SHORT(SC_RESTORE, 0), MPVOID);
5927 WinSendMsg(hwnd, WM_SAVEAPPLICATION, MPVOID, MPVOID);
5928 fAmClosing = TRUE;
5929 WinSendMsg(WinQueryWindow(hwnd, QW_PARENT),
5930 WM_SYSCOMMAND, MPFROM2SHORT(SC_MINIMIZE, 0), MPVOID);
5931 if (CloseChildren(hwnd)) {
5932 fAmClosing = FALSE;
5933 if (fAutoTile)
5934 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_TILE, 0), MPVOID);
5935 return 0;
5936 }
5937 if (hwndTree) {
5938 if (!PostMsg(hwndTree, WM_CLOSE, MPVOID, MPVOID))
5939 WinSendMsg(hwndTree, WM_CLOSE, MPVOID, MPVOID);
5940 }
5941 DosSleep(1);
5942 return 0; // Hold off WM_QUIT
5943
5944 case UM_CLOSE:
5945 HideNote();
5946 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
5947 return 0;
5948
5949 case UM_RESTORE:
5950 {
5951 char *temp;
5952
5953 temp = xstrdup(GetPString(IDS_FM2TEMPTEXT), pszSrcFile, __LINE__);
5954 if (temp) {
5955 if (!PostMsg(MainObjectHwnd, UM_RESTORE, MPFROMP(temp), MPVOID))
5956 free(temp);
5957 }
5958 }
5959 return 0;
5960
5961 case UM_SETDIR:
5962 /* mp1 == name of directory to open */
5963 if (mp1)
5964 return MRFROMLONG(OpenDirCnr((HWND) 0,
5965 hwndMain,
5966 hwndTree, (BOOL) mp2, (char *)mp1));
5967 return 0;
5968
5969 case WM_DESTROY:
5970 hwndMain = (HWND) 0;
5971 if (!PostMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID))
5972 WinSendMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID);
5973 break;
5974 }
5975
5976 return WinDefWindowProc(hwnd, msg, mp1, mp2);
5977}
5978
5979#pragma alloc_text(MISC8,SetToggleChecks,FindDirCnrByName,TopWindow)
5980#pragma alloc_text(MISC8,TopWindowName,CountDirCnrs)
5981#pragma alloc_text(MAINWND,AdjustSizeOfClient,FillClient,ChildButtonProc)
5982#pragma alloc_text(MAINWND,ToolBackProc,StatusProc)
5983#pragma alloc_text(MAINWND,MoveChildrenAwayFromTree,ArrangeIcons,NextChild)
5984#pragma alloc_text(MAINWND,ChildFrameButtonProc)
5985#pragma alloc_text(MAINWND2,CloseChildren,CountChildren,GetNextWindowPos)
5986#pragma alloc_text(MAINWND2,CascadeChildren,TileChildren,ResizeChildren)
5987#pragma alloc_text(MAINWND2,MinResChildren,MainFrameWndProc,MainWndProc)
5988#pragma alloc_text(MAINWND2,DropDownListProc)
5989#pragma alloc_text(MAINWND3,RestoreDirCnrState,SaveDirCnrState)
5990#pragma alloc_text(MAINWND3,CloseDirCnrChildren,TransformSwp)
5991#pragma alloc_text(MAINWND3,ResizeTools,BuildTools,CommandLineProc)
5992#pragma alloc_text(MAINWND4,DriveProc,DriveBackProc,BuildDriveBarButtons,ResizeDrives)
5993#pragma alloc_text(MAINWND4,LEDProc,IdealButtonProc)
5994#pragma alloc_text(MAINWND5,MainWMOnce)
5995#pragma alloc_text(MAINWND6,MainWMCommand)
5996#pragma alloc_text(BUBBLE,MakeBubble,BubbleProc,BubbleHelp)
5997#pragma alloc_text(MAINOBJ,MainObjectWndProc,MakeMainObjWin)
5998
Note: See TracBrowser for help on using the repository browser.