source: trunk/dll/mainwnd.c@ 1031

Last change on this file since 1031 was 1031, checked in by John Small, 17 years ago

Ticket 227: Moved warning message string to fm2dll.str.

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