source: trunk/dll/mainwnd.c@ 144

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

Use datamin.h

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