source: trunk/dll/mainwnd.c@ 201

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

Rework MainWMCommand for VAC3.65 compat

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