source: trunk/dll/mainwnd.c@ 985

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

Update sizes dialog (ticket 44); Make max command line length user settable (ticket 199); use xfree for free in most cases (ticket 212); initial code to check for valid ini file (ticket 102); Some additional refactoring and structure rework; Some documentation updates;

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