source: trunk/dll/mainwnd.c@ 275

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

Renames and comments

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