source: trunk/dll/mainwnd.c@ 773

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

Correct some compare directories collector nits
Use BldQuoted... functions
Move BldQuoted... functions near primary callers
Add RUNTYPE_MASK
Use Runtime_Error2 more

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