source: trunk/dll/mainwnd.c@ 1011

Last change on this file since 1011 was 1011, checked in by Gregg Young, 17 years ago

Fortify updates to get it working everywhere

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