source: trunk/dll/mainwnd.c@ 925

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

Add immediate updates toggle to config menu. Ticket #132.

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