source: trunk/dll/mainwnd.c@ 181

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

Comments and localize code

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