source: trunk/dll/mainwnd.c@ 981

Last change on this file since 981 was 981, checked in by John Small, 18 years ago

Changes to fix problems with default presparams introduced as part
of tickets 150 and 230.

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