source: trunk/dll/mainwnd.c@ 447

Last change on this file since 447 was 447, checked in by root, 19 years ago

Complain nicer if state name does not exist

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