source: trunk/dll/mainwnd.c@ 940

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

Minor cleanup, added comments and History for recent changes

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