source: trunk/dll/mainwnd.c@ 1030

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

Fixed early memory free; Added free_... functions to make fortify checking easier; Added fortify scopes; Delete now moves to trash can on systems with the xworkplace trash can installed.

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