source: trunk/dll/mainwnd.c@ 961

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

Restore SaveDirCnrState internal state save logic - accidentally removed
Move save shutdown state name to strings (IDS_SHUTDOWNSTATE, ShutdownState)

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