source: trunk/dll/mainwnd.c@ 186

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

Use QWL_USER

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