source: trunk/dll/mainwnd.c@ 787

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

Rework UM_FILLSETUPLIST IDM_SAVEDIRCNRSTATE and ..._setups() logic for ticket# 109 and #31
Add GetMSecTimer()
Use GetMSecTimer in DbgMsg
Tweak notebook.ipf scanning page
Move more #pragma alloc_text statements to end of files for OpenWatcom
Delete obsoletes
Revert ExpandAll() ShowTreeRec() DosSleeps to 0 - DosSleep(1) was slowing down inner loops
Drop afFilesToGet - use FilesToGet directly
Optimze ShowTreeRec() collapse logic - was really slow

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