source: trunk/dll/mainwnd.c@ 304

Last change on this file since 304 was 297, checked in by root, 19 years ago

DriveProc: disable menu items if drive not ready
DriveProc: correct my stupid
IDM_EDITANYARCHIVER: sanitize code

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