source: trunk/dll/mainwnd.c@ 162

Last change on this file since 162 was 162, checked in by root, 20 years ago

Use ULONGLONG and CommaFmtULL

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