source: trunk/dll/mainwnd.c@ 689

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

Commit OpenWatcom compatibility updates

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