source: trunk/dll/mainwnd.c@ 926

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

Background color on toolbar now can be change with drag drop; ticket 161. Set command line string length to 2048

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