source: trunk/dll/mainwnd.c@ 935

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

Update Utilities menu add command line, system & bookself submenus; Stop Z order of directory container from being reversed on restart.

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