source: trunk/dll/mainwnd.c@ 549

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

Support additional file systems types (Gregg)
Reorganize menus (Gregg)
Enhance unzip option controls (Gregg)
Remember search options in Seek and Scan (Gregg)
Allow drive flag editing for not ready drives (Gregg)
Correct bitmap loading defects (Steven)
Update documentation (Gregg)
Add newer, better bitmaps (David)
Update Readme to discuss move to Netlabs (Steve)

  • 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 549 2007-02-04 03:14:36Z 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 fixme this section doesn't seem to do anything see treecnt.c
2024 rdy = toupper(*szDrv) == toupper(chDrv);
2025 iDrv = toupper(*szDrv) - 'A';
2026 if (!rdy || ~driveflags[iDrv] & DRIVE_REMOTE)
2027 WinEnableMenuItem(hwndMenu, IDM_DETACH, FALSE);
2028
2029 if (!rdy || driveflags[iDrv] & DRIVE_NOTWRITEABLE)
2030 {
2031 WinEnableMenuItem(hwndMenu, IDM_MKDIR, FALSE);
2032 WinEnableMenuItem(hwndMenu, IDM_FORMAT, FALSE);
2033 WinEnableMenuItem(hwndMenu, IDM_OPTIMIZE, FALSE);
2034 WinEnableMenuItem(hwndMenu, IDM_UNDELETE, FALSE);
2035 }
2036 if (!rdy || ~driveflags[iDrv] & DRIVE_REMOVABLE)
2037 {
2038 WinEnableMenuItem(hwndMenu, IDM_EJECT, FALSE);
2039 WinEnableMenuItem(hwndMenu, IDM_LOCK, FALSE);
2040 WinEnableMenuItem(hwndMenu, IDM_UNLOCK, FALSE);
2041 }
2042 if (!rdy)
2043 {
2044 WinEnableMenuItem(hwndMenu, IDM_INFO, FALSE);
2045 WinEnableMenuItem(hwndMenu, IDM_ARCHIVE, FALSE);
2046 WinEnableMenuItem(hwndMenu, IDM_SIZES, FALSE);
2047 WinEnableMenuItem(hwndMenu, IDM_SHOWALLFILES, FALSE);
2048 WinEnableMenuItem(hwndMenu, IDM_CHKDSK, FALSE);
2049 }
2050 /* fixme to be gone?
2051 if (!rdy || ~driveflags[iDrv] & DRIVE_CDROM) {
2052 WinEnableMenuItem(hwndMenu, IDM_CLOSETRAY, FALSE);
2053 }
2054 */
2055 PopupMenu(hwnd,
2056 hwnd,
2057 hwndMenu);
2058 }
2059 }
2060 return MRFROMSHORT(TRUE);
2061
2062 case WM_BUTTON2CLICK:
2063 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
2064 if (!(shiftstate & KC_CTRL))
2065 break;
2066
2067 case WM_CHORD:
2068 case WM_BUTTON3CLICK:
2069 id = WinQueryWindowUShort(hwnd, QWS_ID);
2070 *szDrv = 0;
2071 WinQueryWindowText(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
2072 id + 50),
2073 sizeof(szDrv),
2074 szDrv);
2075 if (isalpha(*szDrv))
2076 {
2077 strcat(szDrv, "\\");
2078 if (!FindDirCnrByName(szDrv, TRUE))
2079 OpenDirCnr((HWND)0,
2080 hwndMain,
2081 hwndTree,
2082 FALSE,
2083 szDrv);
2084 }
2085 break;
2086
2087 case WM_COMMAND:
2088 PostMsg(hwnd, UM_COMMAND, mp1, mp2);
2089 return 0;
2090
2091 case UM_COMMAND:
2092 id = WinQueryWindowUShort(hwnd, QWS_ID);
2093 *szDrv = 0;
2094 WinQueryWindowText(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
2095 id + 50),
2096 sizeof(szDrv),
2097 szDrv);
2098 if (isalpha(*szDrv))
2099 {
2100 strcat(szDrv, "\\");
2101 CommonDriveCmd(hwnd, szDrv, SHORT1FROMMP(mp1));
2102 }
2103 return 0;
2104
2105 case DM_DRAGOVER:
2106 id = WinQueryWindowUShort(hwnd, QWS_ID);
2107 *szDrv = 0;
2108 WinQueryWindowText(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
2109 id + 50),
2110 sizeof(szDrv),
2111 szDrv);
2112 if (isalpha(*szDrv) &&
2113 !(driveflags[toupper(*szDrv) - 'A'] & DRIVE_NOTWRITEABLE))
2114 {
2115 if (!emphasized)
2116 {
2117 emphasized = TRUE;
2118 DrawTargetEmphasis(hwnd, emphasized);
2119 }
2120 if (AcceptOneDrop(mp1, mp2))
2121 return MRFROM2SHORT(DOR_DROP,
2122 DO_MOVE);
2123 return MRFROM2SHORT(DOR_NEVERDROP, 0);
2124 }
2125 break;
2126
2127 case DM_DRAGLEAVE:
2128 id = WinQueryWindowUShort(hwnd, QWS_ID);
2129 *szDrv = 0;
2130 WinQueryWindowText(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
2131 id + 50),
2132 sizeof(szDrv),
2133 szDrv);
2134 if (isalpha(*szDrv) &&
2135 !(driveflags[toupper(*szDrv) - 'A'] & DRIVE_NOTWRITEABLE))
2136 {
2137 if (emphasized)
2138 {
2139 emphasized = FALSE;
2140 DrawTargetEmphasis(hwnd, emphasized);
2141 }
2142 }
2143 break;
2144
2145 case DM_DROPHELP:
2146 id = WinQueryWindowUShort(hwnd, QWS_ID);
2147 *szDrv = 0;
2148 WinQueryWindowText(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
2149 id + 50), sizeof(szDrv), szDrv);
2150 if (isalpha(*szDrv) &&
2151 !(driveflags[toupper(*szDrv) - 'A'] & DRIVE_NOTWRITEABLE))
2152 {
2153 DropHelp(mp1, mp2, hwnd, GetPString(IDS_DRIVEDROPHELP));
2154 return 0;
2155 }
2156 break;
2157
2158 case DM_DROP:
2159 id = WinQueryWindowUShort(hwnd, QWS_ID);
2160 *szDrv = 0;
2161 WinQueryWindowText(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
2162 id + 50),
2163 sizeof(szDrv),
2164 szDrv);
2165 if (isalpha(*szDrv) &&
2166 !(driveflags[toupper(*szDrv) - 'A'] & DRIVE_NOTWRITEABLE))
2167 {
2168
2169 CNRDRAGINFO cnd;
2170 LISTINFO *li;
2171 ULONG action = UM_ACTION;
2172
2173 if (emphasized)
2174 {
2175 emphasized = FALSE;
2176 DrawTargetEmphasis(hwnd, emphasized);
2177 }
2178 memset(&cnd, 0, sizeof(cnd));
2179 cnd.pDragInfo = (PDRAGINFO) mp1;
2180 cnd.pRecord = NULL;
2181 li = DoFileDrop(hwnd,
2182 NULL,
2183 TRUE,
2184 MPFROM2SHORT(TREE_CNR, CN_DROP),
2185 MPFROMP(&cnd));
2186 if (li)
2187 {
2188 strcpy(li -> targetpath, szDrv);
2189 strcat(li -> targetpath, "\\");
2190 if (li -> list &&
2191 li -> list[0] &&
2192 IsRoot(li -> list[0]))
2193 li -> type = DO_LINK;
2194 else if (fDragndropDlg &&
2195 (!*li -> arcname || !li -> info))
2196 {
2197
2198 CHECKLIST cl;
2199
2200 memset(&cl, 0, sizeof(cl));
2201 cl.size = sizeof(cl);
2202 cl.flags = li -> type;
2203 cl.list = li -> list;
2204 cl.cmd = li -> type;
2205 cl.prompt = li -> targetpath;
2206 li -> type = WinDlgBox(HWND_DESKTOP,
2207 hwndMain,
2208 DropListProc,
2209 FM3ModHandle,
2210 DND_FRAME,
2211 MPFROMP(&cl));
2212 if (!li -> type)
2213 {
2214 FreeListInfo(li);
2215 return 0;
2216 }
2217 li -> list = cl.list;
2218 if (!li -> list || !li -> list[0])
2219 {
2220 FreeListInfo(li);
2221 return 0;
2222 }
2223 }
2224 else
2225 {
2226 if (!WinDlgBox(HWND_DESKTOP,
2227 hwndMain,
2228 WalkDlgProc,
2229 FM3ModHandle,
2230 WALK_FRAME,
2231 MPFROMP(li -> targetpath)) ||
2232 !*li -> targetpath)
2233 {
2234 FreeListInfo(li);
2235 return 0;
2236 }
2237 }
2238 switch (li -> type)
2239 {
2240 case DND_LAUNCH:
2241 strcat(li -> targetpath, " %a");
2242 ExecOnList(hwndMain,
2243 li -> targetpath,
2244 PROMPT | WINDOWED,
2245 NULL,
2246 li -> list,
2247 NULL);
2248 FreeList(li -> list);
2249 li -> list = NULL;
2250 break;
2251 case DO_LINK:
2252 if (fLinkSetsIcon)
2253 {
2254 li -> type = IDM_SETICON;
2255 action = UM_MASSACTION;
2256 }
2257 else
2258 li -> type = IDM_COMPARE;
2259 break;
2260 case DND_EXTRACT:
2261 if (*li -> targetpath &&
2262 !IsFile(li -> targetpath))
2263 li -> type = IDM_EXTRACT;
2264 break;
2265 case DND_MOVE:
2266 li -> type = IDM_MOVE;
2267 if (*li -> targetpath &&
2268 IsFile(li -> targetpath) == 1)
2269 {
2270 action = UM_MASSACTION;
2271 li -> type = IDM_ARCHIVEM;
2272 }
2273 break;
2274 case DND_WILDMOVE:
2275 li -> type = IDM_WILDMOVE;
2276 if (*li -> targetpath &&
2277 IsFile(li -> targetpath) == 1)
2278 {
2279 action = UM_MASSACTION;
2280 li -> type = IDM_ARCHIVEM;
2281 }
2282 break;
2283 case DND_OBJECT:
2284 li -> type = IDM_OBJECT;
2285 action = UM_MASSACTION;
2286 break;
2287 case DND_SHADOW:
2288 li -> type = IDM_SHADOW;
2289 action = UM_MASSACTION;
2290 break;
2291 case DND_COMPARE:
2292 li -> type = IDM_COMPARE;
2293 break;
2294 case DND_SETICON:
2295 action = UM_MASSACTION;
2296 li -> type = IDM_SETICON;
2297 break;
2298 case DND_COPY:
2299 li -> type = IDM_COPY;
2300 if (*li -> targetpath &&
2301 IsFile(li -> targetpath) == 1)
2302 {
2303 action = UM_MASSACTION;
2304 li -> type = IDM_ARCHIVE;
2305 }
2306 break;
2307 case DND_WILDCOPY:
2308 li -> type = IDM_WILDCOPY;
2309 if (*li -> targetpath &&
2310 IsFile(li -> targetpath) == 1)
2311 {
2312 action = UM_MASSACTION;
2313 li -> type = IDM_ARCHIVE;
2314 }
2315 break;
2316 default:
2317 if (*li -> arcname && li -> info)
2318 {
2319 action = UM_MASSACTION;
2320 li -> type = (li -> type == DO_MOVE) ? IDM_FAKEEXTRACTM :
2321 IDM_FAKEEXTRACT;
2322 }
2323 else if (*li -> targetpath && IsFile(li -> targetpath) == 1)
2324 {
2325 action = UM_MASSACTION;
2326 li -> type = (li -> type == DO_MOVE) ? IDM_ARCHIVEM : IDM_ARCHIVE;
2327 }
2328 else
2329 li -> type = (li -> type == DO_MOVE) ? IDM_MOVE : IDM_COPY;
2330 break;
2331 }
2332 if (!li -> list || !li -> list[0])
2333 FreeListInfo(li);
2334 else
2335 WinSendMsg(hwndTree,
2336 UM_ACTION,
2337 MPFROMP(li),
2338 MPFROMLONG(action));
2339 }
2340 return 0;
2341 }
2342 break;
2343
2344 case WM_DESTROY:
2345 if (hwndMenu)
2346 WinDestroyWindow(hwndMenu);
2347 hwndMenu = (HWND)0;
2348 break;
2349 }
2350 return PFNWPButton(hwnd, msg, mp1, mp2);
2351}
2352
2353VOID BuildDriveBarButtons(HWND hwndT)
2354{
2355 register ULONG x, y = 0;
2356 ULONG ulDriveNum, ulDriveMap, iconid;
2357 CHAR s[8];
2358 HENUM henum;
2359 HWND hwndB;
2360
2361 henum = WinBeginEnumWindows(hwndT);
2362
2363 while ((hwndB = WinGetNextWindow(henum)) != NULLHANDLE)
2364 WinDestroyWindow(hwndB);
2365
2366 WinEndEnumWindows(henum);
2367 if (fDrivebar) {
2368 DosError(FERR_DISABLEHARDERR);
2369 DosQCurDisk(&ulDriveNum, &ulDriveMap);
2370 for (x = 0; x < 26; x++) {
2371 if ((ulDriveMap & (1L << x)) &&
2372 !(driveflags[x] & DRIVE_IGNORE))
2373 {
2374 if (x > 1)
2375 {
2376 if (driveflags[x] & DRIVE_CDROM)
2377 iconid = CDROM_ICON;
2378 else
2379 iconid = (driveflags[x] & DRIVE_REMOVABLE) ?
2380 REMOVABLE_ICON :
2381 (driveflags[x] & DRIVE_REMOTE) ?
2382 REMOTE_ICON :
2383 (driveflags[x] & DRIVE_ZIPSTREAM) ?
2384 DRIVE_ICON :
2385 DRIVE_ICON;
2386 }
2387 else
2388 iconid = FLOPPY_ICON;
2389 sprintf(s, "#%lu", iconid);
2390 hwndB = WinCreateWindow(hwndT,
2391 GetPString(IDS_WCDRIVEBUTTONS),
2392 s,
2393 BS_NOPOINTERFOCUS | BS_BITMAP | BS_PUSHBUTTON,
2394 0,
2395 0,
2396 28,
2397 18,
2398 hwndT,
2399 HWND_TOP,
2400 y + IDM_DRIVEA,
2401 NULL,
2402 NULL);
2403 if (!hwndB)
2404 Win_Error2(hwndT,HWND_DESKTOP,pszSrcFile,__LINE__,IDS_WINCREATEWINDOW);
2405 else {
2406 WinSetWindowPos(hwndB,
2407 HWND_BOTTOM,
2408 0,
2409 0,
2410 0,
2411 0,
2412 SWP_ZORDER);
2413 sprintf(s, "%c:", (CHAR) x + 'A');
2414 hwndB = WinCreateWindow(hwndT,
2415 WC_STATIC,
2416 s,
2417 SS_TEXT | DT_LEFT | DT_VCENTER,
2418 0,
2419 0,
2420 10,
2421 18,
2422 hwndT,
2423 HWND_TOP,
2424 y + IDM_DRIVEATEXT,
2425 NULL,
2426 NULL);
2427 if (!hwndB)
2428 Win_Error2(hwndT,HWND_DESKTOP,pszSrcFile,__LINE__,IDS_WINCREATEWINDOW);
2429 else {
2430 SetPresParams(hwndB,
2431 &RGBGREY,
2432 &RGBBLACK,
2433 &RGBGREY,
2434 GetPString(IDS_6HELVTEXT));
2435 WinSetWindowPos(hwndB,
2436 HWND_BOTTOM,
2437 0,
2438 0,
2439 0,
2440 0,
2441 SWP_ZORDER);
2442 }
2443 y++;
2444 }
2445 }
2446 } // for
2447 } // if drivebar
2448 PostMsg(WinQueryWindow(hwndT, QW_PARENT),
2449 WM_UPDATEFRAME,
2450 MPFROMLONG(FCF_SIZEBORDER),
2451 MPVOID);
2452}
2453
2454VOID ResizeDrives(HWND hwndT, long xwidth)
2455{
2456 register ULONG ctrlxpos = 2, ctrlypos = 0, ctrlxsize;
2457 HENUM henum;
2458 HWND hwndB;
2459 RECTL rcl;
2460
2461 DriveLines = 0;
2462 if (!fDrivebar)
2463 return;
2464 if (!xwidth)
2465 {
2466 WinQueryWindowRect(hwndT, &rcl);
2467 xwidth = rcl.xRight - ((WinQuerySysValue(HWND_DESKTOP,
2468 SV_CYSIZEBORDER) * 2) + 2);
2469 }
2470 henum = WinBeginEnumWindows(hwndT);
2471 while ((hwndB = WinGetNextWindow(henum)) != NULLHANDLE)
2472 {
2473 if (WinQueryWindowUShort(hwndB, QWS_ID) > IDM_DRIVEA + 27)
2474 ctrlxsize = 10;
2475 else
2476 ctrlxsize = 28;
2477 WinSetWindowPos(hwndB,
2478 HWND_TOP,
2479 ctrlxpos,
2480 ctrlypos,
2481 ctrlxsize,
2482 18,
2483 SWP_MOVE | SWP_SHOW);
2484 ctrlxpos += (ctrlxsize + 2);
2485 if (ctrlxsize == 10)
2486 {
2487 if (ctrlxpos + (42 + ((fShowTarget && DriveLines == 0) ?
2488 256 :
2489 0)) > xwidth)
2490 {
2491 ctrlxpos = 2;
2492 ctrlypos += 18;
2493 DriveLines++;
2494 }
2495 }
2496 }
2497 if (ctrlxpos == 2 && DriveLines)
2498 DriveLines--;
2499}
2500
2501MRESULT EXPENTRY StatusProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
2502{
2503 static HWND hwndE = (HWND)0, hwndB = (HWND)0;
2504 static CHAR lastcmd[1024] = "";
2505
2506 switch (msg)
2507 {
2508 case WM_CREATE:
2509 {
2510 MRESULT mr = PFNWPStatic(hwnd, msg, mp1, mp2);
2511
2512 SetPresParams(hwnd,
2513 &RGBGREY,
2514 &RGBBLACK,
2515 &RGBGREY,
2516 GetPString(IDS_8HELVBOLDTEXT));
2517 return mr;
2518 }
2519
2520 case WM_PRESPARAMCHANGED:
2521 if (fRunning)
2522 {
2523
2524 ULONG AttrFound, AttrValue[64], cbRetLen;
2525
2526 cbRetLen = WinQueryPresParam(hwnd,
2527 (ULONG) mp1,
2528 0,
2529 &AttrFound,
2530 (ULONG) sizeof(AttrValue),
2531 &AttrValue, 0);
2532 if (cbRetLen)
2533 {
2534 switch (AttrFound)
2535 {
2536 case PP_FONTNAMESIZE:
2537 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
2538 WM_UPDATEFRAME,
2539 MPFROMLONG(FCF_SIZEBORDER),
2540 MPVOID);
2541 break;
2542 }
2543 }
2544 }
2545 break;
2546
2547 case WM_CONTEXTMENU:
2548 PostMsg(hwndMain,
2549 UM_CONTEXTMENU,
2550 MPVOID,
2551 MPVOID);
2552 return MRFROMSHORT(TRUE);
2553
2554 case WM_BEGINDRAG:
2555 if (hwndTree)
2556 {
2557
2558 SWP swp;
2559 ULONG fl = SWP_ACTIVATE | SWP_SHOW | SWP_ZORDER;
2560
2561 WinQueryWindowPos(hwndTree, &swp);
2562 if (!(swp.fl & SWP_MAXIMIZE))
2563 fl |= SWP_RESTORE;
2564 WinSetWindowPos(hwndTree, HWND_TOP, 0, 0, 0, 0, fl);
2565 }
2566 break;
2567
2568 case UM_SETUP:
2569 if (mp1)
2570 strcpy(lastcmd, (CHAR *) mp1);
2571 return 0;
2572
2573 case UM_RESCAN:
2574 if (hwndE &&
2575 WinIsWindow(WinQueryAnchorBlock(hwnd), hwndE))
2576 WinDestroyWindow(hwndE);
2577 if (hwndB &&
2578 WinIsWindow(WinQueryAnchorBlock(hwnd), hwndB))
2579 WinDestroyWindow(hwndB);
2580 hwndE = hwndB = (HWND)0;
2581 return 0;
2582
2583 case WM_COMMAND:
2584 switch (SHORT1FROMMP(mp1))
2585 {
2586 case COMMAND_BUTTON:
2587 PostMsg(hwndE, msg, mp1, mp2);
2588 break;
2589 }
2590 return 0;
2591
2592 case WM_MOUSEMOVE:
2593 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
2594 {
2595 USHORT id = WinQueryWindowUShort(hwnd, QWS_ID);
2596 char *s = NULL;
2597
2598 if (fOtherHelp)
2599 {
2600 if ((!hwndBubble || WinQueryWindowULong(hwndBubble, QWL_USER) != hwnd) &&
2601 !WinQueryCapture(HWND_DESKTOP))
2602 {
2603 switch (id)
2604 {
2605 case IDM_ATTRS:
2606 if (WinQueryWindowTextLength(hwnd))
2607 s = GetPString(IDS_ATTRSBUTTONHELP);
2608 break;
2609 case IDM_INFO:
2610 if (WinQueryWindowTextLength(hwnd))
2611 s = GetPString(IDS_INFOBUTTONHELP);
2612 break;
2613 case IDM_RENAME:
2614 if (WinQueryWindowTextLength(hwnd))
2615 s = GetPString(IDS_NAMEBUTTONHELP);
2616 break;
2617 case MAIN_STATUS2:
2618 if (!hwndE)
2619 s = GetPString(IDS_STATUS2HELP);
2620 break;
2621 default:
2622 break;
2623 }
2624 if (s)
2625 MakeBubble(hwnd, FALSE, s);
2626 else if (hwndBubble)
2627 WinDestroyWindow(hwndBubble);
2628 }
2629 }
2630 switch (id)
2631 {
2632 case IDM_ATTRS:
2633 case IDM_INFO:
2634 case IDM_RENAME:
2635 case MAIN_STATUS2:
2636 return CommonTextProc(hwnd, msg, mp1, mp2);
2637 default:
2638 break;
2639 }
2640 }
2641 break;
2642
2643 case WM_BUTTON2DOWN:
2644 case WM_BUTTON2UP:
2645 case UM_FOCUSME:
2646 return CommonTextButton(hwnd, msg, mp1, mp2);
2647
2648 case WM_BUTTON1DOWN:
2649 case WM_BUTTON1UP:
2650 case WM_BUTTON3DOWN:
2651 case WM_BUTTON3UP:
2652 {
2653 USHORT id;
2654
2655 id = WinQueryWindowUShort(hwnd, QWS_ID);
2656 switch (id)
2657 {
2658 case IDM_ATTRS:
2659 case IDM_INFO:
2660 case IDM_RENAME:
2661 case MAIN_STATUS2:
2662 return CommonTextButton(hwnd, msg, mp1, mp2);
2663 default:
2664 PostMsg(hwnd,
2665 UM_FOCUSME,
2666 MPVOID,
2667 MPVOID);
2668 break;
2669 }
2670 }
2671 break;
2672
2673 case WM_SETFOCUS:
2674 if (mp2)
2675 {
2676
2677 USHORT id;
2678
2679 id = WinQueryWindowUShort(hwnd, QWS_ID);
2680 if (id == MAIN_STATUS2 &&
2681 hwndE)
2682 WinSendMsg(hwnd,
2683 UM_RESCAN,
2684 MPVOID,
2685 MPVOID);
2686 else
2687 return CommonTextButton(hwnd, msg, mp1, mp2);
2688 }
2689 break;
2690
2691 case WM_BUTTON1CLICK:
2692 {
2693 USHORT id;
2694
2695 id = WinQueryWindowUShort(hwnd, QWS_ID);
2696 if (id == MAIN_STATUS)
2697 {
2698 if (SHORT2FROMMP(mp2) & KC_CTRL)
2699 PostMsg(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
2700 FID_CLIENT),
2701 WM_COMMAND,
2702 MPFROM2SHORT(IDM_WINDOWDLG, 0),
2703 MPVOID);
2704 else if (hwndTree)
2705 PostMsg(hwndTree,
2706 UM_TIMER,
2707 MPVOID,
2708 MPVOID);
2709 }
2710 }
2711 break;
2712
2713 case UM_CLICKED:
2714 case UM_CLICKED3:
2715 {
2716 USHORT id;
2717
2718 id = WinQueryWindowUShort(hwnd, QWS_ID);
2719 if (id == MAIN_STATUS2 &&
2720 !hwndE)
2721 {
2722
2723 SWP swp;
2724 CHAR directory[CCHMAXPATH];
2725 PFNWP oldproce;
2726
2727 *directory = 0;
2728 TopWindowName(hwndMain, (HWND)0, directory);
2729 WinQueryWindowPos(hwnd, &swp);
2730 hwndB = WinCreateWindow(hwnd,
2731 WC_BUTTON,
2732 "+",
2733 WS_VISIBLE | BS_PUSHBUTTON |
2734 BS_NOPOINTERFOCUS,
2735 swp.cx - swp.cy,
2736 0,
2737 swp.cy,
2738 swp.cy,
2739 hwnd,
2740 HWND_TOP,
2741 COMMAND_BUTTON,
2742 NULL,
2743 NULL);
2744 if (!hwndB)
2745 Win_Error2(hwnd,hwnd,pszSrcFile,__LINE__,IDS_WINCREATEWINDOW);
2746 hwndE = WinCreateWindow(hwnd,
2747 WC_ENTRYFIELD,
2748 NULL,
2749 WS_VISIBLE | ES_AUTOSCROLL,
2750 0,
2751 0,
2752 swp.cx - swp.cy,
2753 swp.cy,
2754 hwnd,
2755 HWND_TOP,
2756 COMMAND_LINE,
2757 NULL,
2758 NULL);
2759 if (!hwndE)
2760 Win_Error2(hwnd,hwnd,pszSrcFile,__LINE__,IDS_WINCREATEWINDOW);
2761 if (!hwndE || !hwndB) {
2762 PostMsg(hwnd,
2763 UM_RESCAN,
2764 MPVOID,
2765 MPVOID);
2766 return 0;
2767 }
2768 WinSendMsg(hwndE,
2769 EM_SETTEXTLIMIT,
2770 MPFROM2SHORT(1024, 0),
2771 MPVOID);
2772 WinSetWindowText(hwndStatus,
2773 directory);
2774 if (*lastcmd)
2775 WinSetWindowText(hwndE,
2776 lastcmd);
2777 else
2778 WinSetWindowText(hwndE,
2779 GetPString(IDS_HELPCMDTEXT));
2780 oldproce = WinSubclassWindow(hwndE,
2781 (PFNWP) CommandLineProc);
2782 if (oldproce)
2783 WinSetWindowPtr(hwndE,
2784 QWL_USER,
2785 (PVOID) oldproce);
2786 PostMsg(hwndE,
2787 UM_FOCUSME,
2788 MPVOID,
2789 MPVOID);
2790 PostMsg(hwndE,
2791 EM_SETSEL,
2792 MPFROM2SHORT(0, 1024),
2793 MPVOID);
2794 return 0;
2795 }
2796 if (msg == UM_CLICKED3 ||
2797 (SHORT2FROMMP(mp2) & KC_CTRL))
2798 {
2799 switch (id)
2800 {
2801 case IDM_ATTRS:
2802 id = IDM_SORTSIZE;
2803 break;
2804 case IDM_INFO:
2805 id = IDM_SORTLWDATE;
2806 break;
2807 case IDM_RENAME:
2808 id = IDM_SORTFILENAME;
2809 break;
2810 }
2811 }
2812 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
2813 WM_COMMAND,
2814 MPFROM2SHORT(id, 0),
2815 MPVOID);
2816 }
2817 return 0;
2818
2819 case WM_PAINT:
2820 {
2821 USHORT id;
2822
2823 id = WinQueryWindowUShort(hwnd, QWS_ID);
2824 switch (id)
2825 {
2826 case IDM_ATTRS:
2827 case IDM_INFO:
2828 case IDM_RENAME:
2829 case MAIN_STATUS2:
2830 PaintRecessedWindow(hwnd, (HPS) 0, TRUE, FALSE);
2831 break;
2832 default:
2833 PaintRecessedWindow(hwnd, (HPS) 0, FALSE, TRUE);
2834 break;
2835 }
2836 if (id == IDM_RENAME)
2837 {
2838
2839 HPS hps;
2840
2841 hps = WinBeginPaint(hwnd, (HPS) 0, NULL);
2842 if (hps)
2843 {
2844 PaintSTextWindow(hwnd, hps);
2845 WinEndPaint(hps);
2846 }
2847 return 0;
2848 }
2849 }
2850 break;
2851
2852 }
2853 return PFNWPStatic(hwnd, msg, mp1, mp2);
2854}
2855
2856MRESULT EXPENTRY ToolBackProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
2857{
2858 switch (msg)
2859 {
2860 case WM_CREATE:
2861 hwndToolback = hwnd;
2862 SetPresParams(hwnd,
2863 &RGBGREY,
2864 &RGBBLACK,
2865 &RGBGREY,
2866 GetPString(IDS_8HELVTEXT));
2867 break;
2868
2869 case WM_MOUSEMOVE:
2870 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
2871 break;
2872
2873 case WM_CONTROLPOINTER:
2874 if (!fNoFinger &&
2875 SHORT1FROMMP(mp1) < 25000)
2876 return MRFROMLONG(hptrFinger);
2877 break;
2878
2879 case WM_CHAR:
2880 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
2881 break;
2882
2883 case WM_COMMAND:
2884 case UM_COMMAND:
2885 return WinSendMsg(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
2886 FID_CLIENT),
2887 msg,
2888 mp1,
2889 mp2);
2890
2891 case WM_PAINT:
2892 {
2893 HPS hps;
2894 RECTL rcl;
2895
2896 hps = WinBeginPaint(hwnd, (HPS) 0, NULL);
2897 if (hps)
2898 {
2899 WinQueryWindowRect(hwnd, &rcl);
2900 WinFillRect(hps, &rcl, CLR_PALEGRAY);
2901 WinEndPaint(hps);
2902 }
2903 PaintRecessedWindow(hwnd,
2904 (HPS) 0,
2905 TRUE,
2906 FALSE);
2907 }
2908 break;
2909
2910 case UM_SETUP:
2911 {
2912 USHORT id;
2913 TOOL *tool;
2914
2915 id = SHORT1FROMMP(mp1);
2916 tool = find_tool(id);
2917 if (tool)
2918 {
2919 del_tool(tool);
2920 WinShowWindow(WinWindowFromID(hwnd, id), FALSE);
2921 if (fToolTitles)
2922 WinShowWindow(WinWindowFromID(hwnd, id + 25000), FALSE);
2923 ResizeTools(hwnd);
2924 }
2925 }
2926 return 0;
2927
2928 case WM_CHORD:
2929 {
2930 USHORT id;
2931
2932 id = (USHORT) WinDlgBox(HWND_DESKTOP,
2933 hwnd,
2934 AddToolProc,
2935 FM3ModHandle,
2936 ADDBTN_FRAME,
2937 MPVOID);
2938 if (id && id != (USHORT) - 1)
2939 WinSendMsg(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
2940 FID_CLIENT),
2941 WM_COMMAND,
2942 MPFROM2SHORT(IDM_CREATETOOL, 0),
2943 MPFROM2SHORT(id, 0));
2944 }
2945 break;
2946
2947 case WM_CONTEXTMENU:
2948 if (WinDlgBox(HWND_DESKTOP,
2949 hwnd,
2950 ToolIODlgProc,
2951 FM3ModHandle,
2952 SVBTN_FRAME,
2953 MPVOID))
2954 BuildTools(hwnd, TRUE);
2955 return MRFROMSHORT(TRUE);
2956
2957 case WM_CLOSE:
2958 WinDestroyWindow(hwnd);
2959 return 0;
2960
2961 case WM_DESTROY:
2962 break;
2963 }
2964 return WinDefWindowProc(hwnd, msg, mp1, mp2);
2965}
2966
2967static VOID AdjustSizeOfClient(PSWP pswp, PRECTL prectl)
2968{
2969 SWP swp;
2970 RECTL rectl;
2971
2972 if (fFreeTree)
2973 return;
2974 if (pswp)
2975 {
2976 if (WinQueryWindowPos(hwndTree, &swp) &&
2977 !(swp.fl & (SWP_MINIMIZE | SWP_HIDE | SWP_MAXIMIZE)))
2978 {
2979 pswp -> x = swp.cx;
2980 pswp -> cx -= swp.cx;
2981 }
2982 }
2983 if (prectl)
2984 {
2985 if (WinQueryWindowPos(hwndTree, &swp) &&
2986 !(swp.fl & (SWP_MINIMIZE | SWP_HIDE | SWP_MAXIMIZE)) &&
2987 WinQueryWindowRect(hwndTree, &rectl))
2988 {
2989 prectl -> xLeft = rectl.xRight;
2990 prectl -> xRight -= rectl.xRight;
2991 }
2992 }
2993}
2994
2995VOID FillClient(HWND hwndClient, PSWP pswp, PRECTL prectl, BOOL avoidtree)
2996{
2997 ULONG adjust;
2998
2999 adjust = WinQuerySysValue(HWND_DESKTOP, SV_CYICON);
3000 if (pswp)
3001 WinQueryWindowPos(hwndClient, pswp);
3002 if (prectl)
3003 WinQueryWindowRect(hwndClient, prectl);
3004 if (avoidtree && !fFreeTree)
3005 AdjustSizeOfClient(pswp, prectl);
3006 if (prectl)
3007 prectl -> yBottom += adjust;
3008 if (pswp)
3009 {
3010 if (!avoidtree || fFreeTree)
3011 pswp -> x = 0;
3012 pswp -> y = adjust;
3013 if (pswp -> cy >= adjust)
3014 pswp -> cy -= adjust;
3015 else
3016 pswp -> cy = 0;
3017 }
3018}
3019
3020static VOID MoveChildrenAwayFromTree(HWND hwndClient)
3021{
3022 SWP swpC, swpT, swp;
3023 USHORT id;
3024 HWND hwndChild;
3025 HENUM henum;
3026
3027 if (fFreeTree)
3028 return;
3029 WinQueryWindowPos(hwndClient, &swpC);
3030 if (swpC.fl & (SWP_MINIMIZE | SWP_HIDE))
3031 return;
3032 WinQueryWindowPos(hwndTree, &swpT);
3033 henum = WinBeginEnumWindows(hwndClient);
3034 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE)
3035 {
3036 id = WinQueryWindowUShort(hwndChild, QWS_ID);
3037 if (!id || id == TREE_FRAME)
3038 continue;
3039 WinQueryWindowPos(hwndChild, &swp);
3040 if (!(swp.fl & (SWP_MAXIMIZE | SWP_HIDE | SWP_MINIMIZE)))
3041 {
3042 if (swp.x < swpT.cx)
3043 {
3044 swp.x = swpT.cx;
3045 if (swp.x + swp.cx > swpC.cx)
3046 swp.cx = swpC.cx - swp.x;
3047 if (swp.cx > 24)
3048 WinSetWindowPos(hwndChild, HWND_TOP, swp.x, swp.y, swp.cx, swp.cy,
3049 SWP_SIZE | SWP_MOVE | SWP_SHOW);
3050 }
3051 }
3052 }
3053 WinEndEnumWindows(henum);
3054}
3055
3056static VOID ArrangeIcons(HWND hwndClient)
3057{
3058 HENUM henum;
3059 HWND hwndChild;
3060 SWP swp;
3061
3062 henum = WinBeginEnumWindows(hwndClient);
3063 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE)
3064 {
3065 WinQueryWindowPos(hwndChild, &swp);
3066 if (swp.fl & (SWP_MINIMIZE | SWP_HIDE))
3067 {
3068 WinSetWindowUShort(hwndChild, QWS_XMINIMIZE, (USHORT) - 1);
3069 WinSetWindowUShort(hwndChild, QWS_YMINIMIZE, (USHORT) - 1);
3070 WinSetWindowPos(hwndChild, HWND_TOP, 0, 0, 0, 0,
3071 SWP_MOVE | SWP_SHOW | SWP_FOCUSDEACTIVATE);
3072 }
3073 }
3074 WinEndEnumWindows(henum);
3075}
3076
3077static VOID NextChild(HWND hwndClient, BOOL previous)
3078{
3079 HENUM henum;
3080 HWND hwndActive, hwndNext, hwndPrev = (HWND)0;
3081 BOOL next = FALSE, once = FALSE;
3082
3083 previous = !previous;
3084
3085 hwndActive = WinQueryActiveWindow(hwndClient);
3086 if (!hwndActive)
3087 next = TRUE;
3088 henum = WinBeginEnumWindows(hwndClient);
3089 for (;;)
3090 {
3091 hwndNext = WinGetNextWindow(henum);
3092 if (hwndNext)
3093 {
3094 if (!WinQueryWindowUShort(hwndNext, QWS_ID))
3095 continue;
3096 if (next)
3097 break;
3098 if (hwndNext == hwndActive)
3099 {
3100 if (!previous && hwndPrev)
3101 {
3102 hwndNext = hwndPrev;
3103 break;
3104 }
3105 else if (previous)
3106 next = TRUE;
3107 }
3108 hwndPrev = hwndNext;
3109 }
3110 else
3111 {
3112 if ((!next && previous) || once)
3113 break;
3114 else if (!previous)
3115 {
3116 hwndNext = hwndPrev;
3117 break;
3118 }
3119 else
3120 once = next = TRUE;
3121 }
3122 }
3123 WinEndEnumWindows(henum);
3124
3125 if (hwndNext && hwndNext != hwndActive)
3126 {
3127 WinSetWindowPos(hwndNext, HWND_TOP, 0, 0, 0, 0, SWP_ZORDER | SWP_ACTIVATE);
3128 WinSetWindowPos(hwndActive, ((previous) ? HWND_BOTTOM : hwndNext),
3129 0, 0, 0, 0, SWP_ZORDER);
3130 }
3131}
3132
3133BOOL CloseChildren(HWND hwndClient)
3134{
3135 HENUM henum;
3136 HWND hwndChild;
3137 BOOL ret = FALSE;
3138
3139 fNoTileUpdate = TRUE;
3140 henum = WinBeginEnumWindows(hwndClient);
3141 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE)
3142 {
3143 if (hwndChild != hwndTree)
3144 {
3145 WinSendMsg(WinWindowFromID(hwndChild, FID_CLIENT),
3146 WM_SAVEAPPLICATION,
3147 MPVOID,
3148 MPVOID);
3149 if (WinSendMsg(WinWindowFromID(hwndChild, FID_CLIENT),
3150 WM_CLOSE,
3151 MPVOID,
3152 MPVOID))
3153 {
3154 ret = TRUE;
3155 break;
3156 }
3157 }
3158 }
3159 WinEndEnumWindows(henum);
3160 fNoTileUpdate = FALSE;
3161 return ret;
3162}
3163
3164BOOL CloseDirCnrChildren(HWND hwndClient)
3165{
3166 /* returns TRUE if a directory container window was told to close */
3167
3168 HENUM henum;
3169 HWND hwndChild, hwndDir, hwndTemp;
3170 BOOL ret = FALSE;
3171
3172 fNoTileUpdate = TRUE;
3173 henum = WinBeginEnumWindows(hwndClient);
3174 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE)
3175 {
3176 if (hwndChild != hwndTree)
3177 {
3178 hwndTemp = WinWindowFromID(hwndChild, FID_CLIENT);
3179 if (hwndTemp)
3180 {
3181 hwndDir = WinWindowFromID(hwndTemp, DIR_CNR);
3182 if (hwndDir)
3183 {
3184 WinSendMsg(WinWindowFromID(hwndChild, FID_CLIENT),
3185 WM_CLOSE,
3186 MPVOID,
3187 MPVOID);
3188 ret = TRUE;
3189 }
3190 }
3191 }
3192 }
3193 WinEndEnumWindows(henum);
3194 fNoTileUpdate = FALSE;
3195 return ret;
3196}
3197
3198BOOL SaveDirCnrState(HWND hwndClient, CHAR * name)
3199{
3200 /* returns TRUE if any directory container windows existed */
3201
3202 HENUM henum;
3203 HWND hwndChild, hwndDir, hwndC;
3204 ULONG numsaves = 0, flWindowAttr;
3205 CHAR s[120], directory[CCHMAXPATH];
3206 SWP swp;
3207 BOOL ret = FALSE;
3208 DIRCNRDATA *dcd;
3209
3210 henum = WinBeginEnumWindows(hwndClient);
3211 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE)
3212 {
3213 if (hwndChild != hwndTree)
3214 {
3215 hwndC = WinWindowFromID(hwndChild, FID_CLIENT);
3216 if (hwndC)
3217 {
3218 hwndDir = WinWindowFromID(hwndC, DIR_CNR);
3219 if (hwndDir)
3220 {
3221 WinQueryWindowPos(hwndChild, &swp);
3222 *directory = 0;
3223 WinSendMsg(hwndC, UM_CONTAINERDIR, MPFROMP(directory), MPVOID);
3224 if (*directory)
3225 {
3226 sprintf(s, "%s%sDirCnrPos.%lu", (name) ? name : NullStr, (name) ? "." : NullStr,
3227 numsaves);
3228 PrfWriteProfileData(fmprof,
3229 FM3Str,
3230 s,
3231 (PVOID) & swp,
3232 sizeof(SWP));
3233 dcd = WinQueryWindowPtr(WinWindowFromID(hwndC, DIR_CNR), QWL_USER);
3234 if (dcd)
3235 {
3236 sprintf(s, "%s%sDirCnrSort.%lu", (name) ? name : NullStr, (name) ? "." : NullStr,
3237 numsaves);
3238 PrfWriteProfileData(fmprof, FM3Str, s, (PVOID) & dcd -> sortFlags,
3239 sizeof(INT));
3240 sprintf(s, "%s%sDirCnrFilter.%lu", (name) ? name : NullStr, (name) ? "." : NullStr,
3241 numsaves);
3242 PrfWriteProfileData(fmprof, FM3Str, s, (PVOID) & dcd -> mask,
3243 sizeof(MASK));
3244 sprintf(s, "%s%sDirCnrView.%lu", (name) ? name : NullStr, (name) ? "." : NullStr,
3245 numsaves);
3246 flWindowAttr = dcd -> flWindowAttr;
3247 if (!fLeaveTree && (flWindowAttr & CV_TREE))
3248 {
3249 flWindowAttr &= (~(CV_TREE | CV_ICON | CV_DETAIL | CV_TEXT));
3250 if (dcd -> lastattr)
3251 {
3252 if (dcd -> lastattr & CV_TEXT)
3253 flWindowAttr |= CV_TEXT;
3254 else if (dcd -> lastattr & CV_DETAIL)
3255 flWindowAttr |= CV_DETAIL;
3256 else if (dcd -> lastattr & CV_ICON)
3257 flWindowAttr |= CV_ICON;
3258 else
3259 flWindowAttr |= CV_NAME;
3260 }
3261 else
3262 flWindowAttr |= CV_NAME;
3263 }
3264 PrfWriteProfileData(fmprof, FM3Str, s, (PVOID) & flWindowAttr,
3265 sizeof(ULONG));
3266 }
3267 sprintf(s, "%s%sDirCnrDir.%lu", (name) ? name : NullStr, (name) ? "." : NullStr,
3268 numsaves++);
3269 PrfWriteProfileString(fmprof, FM3Str, s, directory);
3270 ret = TRUE;
3271 }
3272 }
3273 }
3274 }
3275 }
3276 WinEndEnumWindows(henum);
3277 if (ret)
3278 {
3279 if (WinQueryWindowPos(hwndTree, &swp))
3280 {
3281 sprintf(s, "%s%sLastTreePos", (name) ? name : NullStr, (name) ? "." : NullStr);
3282 PrfWriteProfileData(fmprof, FM3Str, s, (PVOID) & swp, sizeof(SWP));
3283 }
3284 sprintf(s, "%s%sNumDirsLastTime", (name) ? name : NullStr, (name) ? "." : NullStr);
3285 PrfWriteProfileData(fmprof, FM3Str, s, (PVOID) & numsaves, sizeof(ULONG));
3286 WinQueryWindowPos(WinQueryWindow(hwndClient, QW_PARENT), &swp);
3287 sprintf(s, "%s%sMySizeLastTime", (name) ? name : NullStr, (name) ? "." : NullStr);
3288 PrfWriteProfileData(fmprof, FM3Str, s, (PVOID) & swp, sizeof(SWP));
3289 }
3290 return ret;
3291}
3292
3293static VOID TransformSwp(PSWP pswp, double xtrans, double ytrans)
3294{
3295 SWP swp;
3296 HWND hwnd;
3297
3298 if ((LONG) pswp -> x < 0L)
3299 {
3300 pswp -> cx -= abs(pswp -> x);
3301 pswp -> x = 0;
3302 }
3303 if ((LONG) pswp -> y < 0L)
3304 {
3305 pswp -> cy -= abs(pswp -> y);
3306 pswp -> y = 0;
3307 }
3308 pswp -> x = (LONG) (((double) pswp -> x * 100.0) / xtrans);
3309 pswp -> cx = (LONG) (((double) pswp -> cx * 100.0) / xtrans);
3310 pswp -> y = (LONG) (((double) pswp -> y * 100.0) / ytrans);
3311 pswp -> cy = (LONG) (((double) pswp -> cy * 100.0) / ytrans);
3312 if (pswp -> hwnd)
3313 {
3314 hwnd = WinQueryWindow(pswp -> hwnd, QW_PARENT);
3315 if (hwnd)
3316 {
3317 if (WinQueryWindowPos(hwnd, &swp))
3318 {
3319 if (pswp -> x > swp.cx)
3320 pswp -> x = (swp.cx > 24) ? swp.cx - 24 : swp.cx;
3321 if (pswp -> y > swp.cy)
3322 pswp -> y = (swp.cy > 24) ? swp.cy - 24 : swp.cy;
3323 if (pswp -> x + pswp -> cx > swp.cx)
3324 pswp -> cx = swp.cx - pswp -> x;
3325 if (pswp -> y + pswp -> cy > swp.cy)
3326 pswp -> cy = swp.cy - pswp -> y;
3327 }
3328 }
3329 }
3330}
3331
3332static BOOL RestoreDirCnrState(HWND hwndClient, CHAR * name, BOOL noview)
3333{
3334 /* returns TRUE if a directory container was opened */
3335
3336 CHAR s[120], tdir[CCHMAXPATH];
3337 HWND hwndDir, hwndC;
3338 SWP swp, swpO, swpN;
3339 ULONG size, numsaves = 0L, x;
3340 double xtrans, ytrans;
3341 BOOL ret = FALSE;
3342 DIRCNRDATA *dcd;
3343
3344 size = sizeof(SWP);
3345 sprintf(s,
3346 "%s%sMySizeLastTime",
3347 (name) ? name : NullStr,
3348 (name) ? "." : NullStr);
3349 if (!PrfQueryProfileData(fmprof,
3350 FM3Str,
3351 s,
3352 (PVOID) & swpO,
3353 &size) ||
3354 size != sizeof(SWP) || !swp.cx || !swp.cy)
3355 WinQueryWindowPos(WinQueryWindow(hwndClient, QW_PARENT), &swpO);
3356 if (!name ||
3357 !strcmp(name, GetPString(IDS_FM2TEMPTEXT)))
3358 PrfWriteProfileData(fmprof,
3359 FM3Str,
3360 s,
3361 NULL,
3362 0L);
3363 WinQueryWindowPos(WinQueryWindow(hwndClient, QW_PARENT), &swpN);
3364 if (swpN.fl & (SWP_MINIMIZE | SWP_HIDE))
3365 swpN = swpO;
3366 xtrans = ((double) swpO.cx * 100.0) / (double) swpN.cx;
3367 ytrans = ((double) swpO.cy * 100.0) / (double) swpN.cy;
3368 size = sizeof(SWP);
3369 sprintf(s,
3370 "%s%sLastTreePos",
3371 (name) ? (name) : NullStr,
3372 (name) ? "." : NullStr);
3373 if (PrfQueryProfileData(fmprof,
3374 FM3Str,
3375 s,
3376 (PVOID) & swp,
3377 &size))
3378 {
3379 if (!name ||
3380 !strcmp(name, GetPString(IDS_FM2TEMPTEXT)))
3381 PrfWriteProfileData(fmprof,
3382 FM3Str,
3383 s,
3384 NULL,
3385 0L);
3386 swp.hwnd = hwndTree;
3387 TransformSwp(&swp,
3388 xtrans,
3389 ytrans);
3390 if (!fFreeTree)
3391 {
3392 WinQueryWindowPos(hwndClient, &swpN);
3393 swp.x = 0;
3394 swp.y = (swpN.cy - swp.cy);
3395 }
3396 if (!(swp.fl & (SWP_MINIMIZE | SWP_HIDE)))
3397 {
3398 swp.fl &= (~SWP_ACTIVATE);
3399 WinSetWindowPos(hwndTree,
3400 HWND_TOP,
3401 swp.x,
3402 swp.y,
3403 swp.cx,
3404 swp.cy,
3405 swp.fl | SWP_MOVE |
3406 SWP_SIZE | SWP_SHOW | SWP_ZORDER);
3407 }
3408 else
3409 {
3410 WinSetWindowPos(hwndTree,
3411 HWND_TOP,
3412 0,
3413 0,
3414 0,
3415 0,
3416 SWP_MINIMIZE | SWP_SHOW);
3417 WinSetWindowUShort(hwndTree,
3418 QWS_XRESTORE,
3419 (USHORT) swp.x);
3420 WinSetWindowUShort(hwndTree,
3421 QWS_CXRESTORE,
3422 (USHORT) swp.cx);
3423 WinSetWindowUShort(hwndTree,
3424 QWS_YRESTORE,
3425 (USHORT) swp.y);
3426 WinSetWindowUShort(hwndTree,
3427 QWS_CYRESTORE,
3428 (USHORT) swp.cy);
3429 }
3430 }
3431 size = sizeof(ULONG);
3432 sprintf(s,
3433 "%s%sNumDirsLastTime",
3434 (name) ? name : NullStr,
3435 (name) ? "." : NullStr);
3436 if (PrfQueryProfileData(fmprof,
3437 FM3Str,
3438 s,
3439 (PVOID) & numsaves,
3440 &size) &&
3441 numsaves)
3442 {
3443 if (!name ||
3444 !strcmp(name, GetPString(IDS_FM2TEMPTEXT)))
3445 PrfWriteProfileData(fmprof,
3446 FM3Str,
3447 s,
3448 NULL,
3449 0L);
3450 for (x = 0; x < numsaves; x++)
3451 {
3452 sprintf(s,
3453 "%s%sDirCnrPos.%lu",
3454 (name) ? name : NullStr,
3455 (name) ? "." : NullStr,
3456 x);
3457 size = sizeof(SWP);
3458 if (PrfQueryProfileData(fmprof,
3459 FM3Str,
3460 s,
3461 (PVOID) & swp,
3462 &size))
3463 {
3464 if (!name ||
3465 !strcmp(name, GetPString(IDS_FM2TEMPTEXT)))
3466 PrfWriteProfileData(fmprof,
3467 FM3Str,
3468 s,
3469 NULL,
3470 0L);
3471 sprintf(s,
3472 "%s%sDirCnrDir.%lu",
3473 (name) ? name : NullStr,
3474 (name) ? "." : NullStr,
3475 x);
3476 size = sizeof(tdir);
3477 if (PrfQueryProfileData(fmprof,
3478 FM3Str,
3479 s,
3480 (PVOID) tdir,
3481 &size))
3482 {
3483 if (!name ||
3484 !strcmp(name, GetPString(IDS_FM2TEMPTEXT)))
3485 PrfWriteProfileData(fmprof,
3486 FM3Str,
3487 s,
3488 NULL,
3489 0L);
3490 hwndDir = (HWND)WinSendMsg(hwndClient,
3491 UM_SETDIR,
3492 MPFROMP(tdir),
3493 MPFROMLONG(1L));
3494 if (hwndDir)
3495 {
3496 hwndC = WinWindowFromID(hwndDir,
3497 FID_CLIENT);
3498 if (hwndC)
3499 {
3500 dcd = WinQueryWindowPtr(WinWindowFromID(hwndC, DIR_CNR),
3501 QWL_USER);
3502 if (dcd)
3503 {
3504 size = sizeof(INT);
3505 sprintf(s,
3506 "%s%sDirCnrSort.%lu",
3507 (name) ? name : NullStr,
3508 (name) ? "." : NullStr,
3509 x);
3510 if (PrfQueryProfileData(fmprof,
3511 FM3Str,
3512 s,
3513 (PVOID) & dcd -> sortFlags,
3514 &size) &&
3515 size == sizeof(INT))
3516 {
3517 if (!dcd -> sortFlags)
3518 dcd -> sortFlags = SORT_PATHNAME;
3519 }
3520 if (!name ||
3521 !strcmp(name, GetPString(IDS_FM2TEMPTEXT)))
3522 PrfWriteProfileData(fmprof,
3523 FM3Str,
3524 s,
3525 NULL,
3526 0L);
3527 size = sizeof(MASK);
3528 sprintf(s,
3529 "%s%sDirCnrFilter.%lu",
3530 (name) ? name : NullStr,
3531 (name) ? "." : NullStr,
3532 x);
3533 if (PrfQueryProfileData(fmprof,
3534 FM3Str,
3535 s,
3536 (PVOID) & dcd -> mask,
3537 &size) &&
3538 size)
3539 {
3540 if (*dcd -> mask.szMask)
3541 WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
3542 UM_FILTER,
3543 MPFROMP(dcd -> mask.szMask),
3544 MPVOID);
3545 }
3546 *(dcd -> mask.prompt) = 0;
3547 if (!name ||
3548 !strcmp(name, GetPString(IDS_FM2TEMPTEXT)))
3549 PrfWriteProfileData(fmprof,
3550 FM3Str,
3551 s,
3552 NULL,
3553 0L);
3554 size = sizeof(ULONG);
3555 sprintf(s,
3556 "%s%sDirCnrView.%lu",
3557 (name) ? name : NullStr,
3558 (name) ? "." : NullStr,
3559 x);
3560 if (!noview)
3561 {
3562 if (PrfQueryProfileData(fmprof,
3563 FM3Str,
3564 s,
3565 (PVOID) & dcd -> flWindowAttr,
3566 &size) &&
3567 size == sizeof(ULONG))
3568 {
3569
3570 CNRINFO cnri;
3571
3572 memset(&cnri, 0, sizeof(CNRINFO));
3573 cnri.cb = sizeof(CNRINFO);
3574 if (WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
3575 CM_QUERYCNRINFO,
3576 MPFROMP(&cnri),
3577 MPFROMLONG(sizeof(CNRINFO))))
3578 {
3579 cnri.flWindowAttr = dcd -> flWindowAttr;
3580 WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
3581 CM_SETCNRINFO,
3582 MPFROMP(&cnri),
3583 MPFROMLONG(CMA_FLWINDOWATTR));
3584 }
3585 }
3586 }
3587 if (!name ||
3588 !strcmp(name, GetPString(IDS_FM2TEMPTEXT)))
3589 PrfWriteProfileData(fmprof,
3590 FM3Str,
3591 s,
3592 NULL,
3593 0L);
3594 }
3595 }
3596 ret = TRUE;
3597 swp.hwnd = hwndDir;
3598 TransformSwp(&swp,
3599 xtrans,
3600 ytrans);
3601 if (!fAutoTile &&
3602 !(swp.fl & (SWP_HIDE | SWP_MINIMIZE)))
3603 WinSetWindowPos(hwndDir,
3604 HWND_TOP,
3605 swp.x,
3606 swp.y,
3607 swp.cx,
3608 swp.cy,
3609 swp.fl | SWP_MOVE |
3610 SWP_SIZE | SWP_SHOW | SWP_ZORDER | SWP_ACTIVATE);
3611 else if (swp.fl & (SWP_HIDE | SWP_MINIMIZE))
3612 {
3613 WinSetWindowPos(hwndDir,
3614 HWND_TOP,
3615 0,
3616 0,
3617 0,
3618 0,
3619 SWP_MINIMIZE | SWP_SHOW);
3620 WinSetWindowUShort(hwndDir,
3621 QWS_XRESTORE,
3622 (USHORT) swp.x);
3623 WinSetWindowUShort(hwndDir,
3624 QWS_CXRESTORE,
3625 (USHORT) swp.cx);
3626 WinSetWindowUShort(hwndDir,
3627 QWS_YRESTORE,
3628 (USHORT) swp.y);
3629 WinSetWindowUShort(hwndDir,
3630 QWS_CYRESTORE,
3631 (USHORT) swp.cy);
3632 }
3633 else
3634 WinSetWindowPos(hwndDir,
3635 HWND_TOP,
3636 0,
3637 0,
3638 0,
3639 0,
3640 SWP_ZORDER | SWP_ACTIVATE);
3641 }
3642 }
3643 }
3644 }
3645 }
3646 return ret;
3647}
3648
3649static ULONG CountChildren(HWND hwndClient, ULONG * ulNumMinChildren)
3650{
3651 HENUM henum;
3652 HWND hwndChild;
3653 SWP swp;
3654 register ULONG ulCnt = 0L;
3655 USHORT id;
3656
3657 if (ulNumMinChildren)
3658 *ulNumMinChildren = 0L;
3659 henum = WinBeginEnumWindows(hwndClient);
3660 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE)
3661 {
3662 id = WinQueryWindowUShort(hwndChild, QWS_ID);
3663 if (!id || (!fFreeTree && id == TREE_FRAME))
3664 continue;
3665 ulCnt++;
3666 if (ulNumMinChildren)
3667 {
3668 if (WinQueryWindowPos(hwndChild, &swp) &&
3669 (swp.fl & SWP_MINIMIZE))
3670 (*ulNumMinChildren)++;
3671 }
3672 }
3673 WinEndEnumWindows(henum);
3674 return ulCnt;
3675}
3676
3677VOID GetNextWindowPos(HWND hwndClient, PSWP pswp, ULONG * ulCntR,
3678 ULONG * ulNumMinChildrenR)
3679{
3680 register ULONG ulCnt;
3681 ULONG ulNumMinChildren;
3682 RECTL Rectl;
3683 register ULONG ulXDiff, ulYDiff, ulWindowsPerStack;
3684
3685 if (!ulCntR || !ulNumMinChildrenR)
3686 ulCnt = CountChildren(hwndClient, &ulNumMinChildren);
3687 else
3688 {
3689 ulCnt = *ulCntR;
3690 ulNumMinChildren = *ulNumMinChildrenR;
3691 if (ulCnt == (ULONG) - 1L)
3692 {
3693 ulCnt = CountChildren(hwndClient, &ulNumMinChildren);
3694 /* return these values to the caller for later use */
3695 *ulCntR = ulCnt;
3696 *ulNumMinChildrenR = ulNumMinChildren;
3697 }
3698 }
3699 WinQueryWindowRect(hwndClient, &Rectl);
3700 AdjustSizeOfClient(NULL, &Rectl);
3701 if (!fFreeTree)
3702 {
3703
3704 SWP swp;
3705
3706 WinQueryWindowPos(hwndTree, &swp);
3707 if (ulNumMinChildren || (swp.fl & (SWP_HIDE | SWP_MINIMIZE)))
3708 Rectl.yBottom += WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2;
3709 }
3710 else if (ulNumMinChildren)
3711 Rectl.yBottom += WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2;
3712
3713 ulXDiff = WinQuerySysValue(HWND_DESKTOP, SV_CXSIZEBORDER) +
3714 WinQuerySysValue(HWND_DESKTOP, SV_CXMINMAXBUTTON) / 2;
3715 ulYDiff = WinQuerySysValue(HWND_DESKTOP, SV_CYSIZEBORDER) +
3716 WinQuerySysValue(HWND_DESKTOP, SV_CYMINMAXBUTTON);
3717 ulWindowsPerStack = (Rectl.yTop - Rectl.yBottom) / (3 * ulYDiff);
3718 pswp -> cx = Rectl.xRight - (ulWindowsPerStack * ulXDiff);
3719 pswp -> cy = (Rectl.yTop - Rectl.yBottom) - (ulWindowsPerStack * ulYDiff);
3720 ulWindowsPerStack++;
3721 pswp -> x = Rectl.xLeft + ((ulCnt % ulWindowsPerStack) * ulXDiff);
3722 pswp -> y = (Rectl.yTop - pswp -> cy - ((ulCnt % ulWindowsPerStack) * ulYDiff));
3723}
3724
3725static VOID CascadeChildren(HWND hwndClient)
3726{
3727 ULONG ulCnt = 0L, ulNumMinChildren;
3728 HWND hwndChild;
3729 HENUM henum;
3730 SWP swp;
3731 USHORT id;
3732 RECTL Rectl;
3733
3734 WinQueryWindowPos(hwndClient, &swp);
3735 if (swp.fl & (SWP_HIDE | SWP_MINIMIZE))
3736 return;
3737
3738 CountChildren(hwndClient, &ulNumMinChildren);
3739 if (!fFreeTree)
3740 {
3741 WinQueryWindowRect(hwndClient, &Rectl);
3742 AdjustSizeOfClient(NULL, &Rectl);
3743 WinQueryWindowPos(hwndTree, &swp);
3744 if (!(swp.fl & (SWP_MAXIMIZE | SWP_HIDE | SWP_MINIMIZE)))
3745 {
3746 if (swp.y + swp.cy < Rectl.yTop - Rectl.yBottom)
3747 swp.cy = (Rectl.yTop - Rectl.yBottom) - swp.y;
3748 if (swp.x != 0)
3749 swp.x = 0;
3750 if (swp.y < 0)
3751 swp.y = 0;
3752 if (swp.x + swp.cx > Rectl.xRight - Rectl.xLeft)
3753 swp.cx = Rectl.xRight - Rectl.xLeft;
3754 WinSetWindowPos(hwndTree, HWND_TOP, swp.x, swp.y, swp.cx, swp.cy,
3755 SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_RESTORE);
3756 }
3757 }
3758 henum = WinBeginEnumWindows(hwndClient);
3759 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE)
3760 {
3761 id = WinQueryWindowUShort(hwndChild, QWS_ID);
3762 if (!id || (!fFreeTree && id == TREE_FRAME))
3763 continue;
3764 WinQueryWindowPos(hwndChild, &swp);
3765 if (!(swp.fl & (SWP_MINIMIZE | SWP_HIDE)))
3766 {
3767 GetNextWindowPos(hwndClient, &swp, &ulCnt, &ulNumMinChildren);
3768 WinSetWindowPos(hwndChild, HWND_TOP, swp.x, swp.y, swp.cx, swp.cy,
3769 SWP_SIZE | SWP_MOVE | SWP_SHOW | SWP_RESTORE |
3770 SWP_ZORDER | SWP_ACTIVATE);
3771 ulCnt++;
3772 }
3773 }
3774 WinEndEnumWindows(henum);
3775}
3776
3777VOID TileChildren(HWND hwndClient, BOOL absolute)
3778{
3779 register ULONG ulChildCnt, ulSquare, ulNumRows, ulNumCols, ulExtraCols,
3780 ulWidth, ulHeight;
3781 ULONG ulNumMinChildren;
3782 RECTL Rectl;
3783 HWND hwndChild;
3784
3785 if (fNoTileUpdate || hwndClient == HWND_DESKTOP)
3786 return;
3787 {
3788 SWP swp;
3789
3790 WinQueryWindowPos(hwndClient, &swp);
3791 if (swp.fl & (SWP_HIDE | SWP_MINIMIZE))
3792 return;
3793 }
3794 ulChildCnt = CountChildren(hwndClient,
3795 &ulNumMinChildren);
3796 ulChildCnt -= ulNumMinChildren;
3797 if (!ulChildCnt)
3798 return;
3799
3800 fNoTileUpdate = TRUE;
3801
3802 for (ulSquare = 2;
3803 ulSquare * ulSquare <= ulChildCnt;
3804 ulSquare++)
3805 {
3806 ;
3807 }
3808 if (!fTileBackwards)
3809 {
3810 ulNumCols = ulSquare - 1L;
3811 ulNumRows = ulChildCnt / ulNumCols;
3812 }
3813 else
3814 {
3815 ulNumRows = ulSquare - 1L;
3816 ulNumCols = ulChildCnt / ulNumRows;
3817 }
3818 ulExtraCols = ulChildCnt % ulNumCols;
3819
3820 WinQueryWindowRect(hwndClient,
3821 &Rectl);
3822
3823 if (!fFreeTree)
3824 {
3825
3826 SWP swp;
3827
3828 WinQueryWindowPos(hwndTree, &swp);
3829 if (!(swp.fl & (SWP_MAXIMIZE | SWP_HIDE | SWP_MINIMIZE)))
3830 {
3831 if (swp.y < 0)
3832 swp.y = 0;
3833 if (swp.y + swp.cy < Rectl.yTop - Rectl.yBottom)
3834 swp.cy = (Rectl.yTop - Rectl.yBottom) - swp.y;
3835 if (swp.x != 0)
3836 swp.x = 0;
3837 if (swp.x + swp.cx > Rectl.xRight - Rectl.xLeft)
3838 swp.cx = Rectl.xRight - Rectl.xLeft;
3839 WinSetWindowPos(hwndTree,
3840 HWND_TOP,
3841 swp.x,
3842 swp.y,
3843 swp.cx,
3844 swp.cy,
3845 SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_RESTORE);
3846 WinQueryWindowPos(hwndTree, &swp);
3847 }
3848 if (ulNumMinChildren ||
3849 (swp.fl & (SWP_HIDE | SWP_MINIMIZE)))
3850 Rectl.yBottom += WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2;
3851 }
3852 else if (ulNumMinChildren)
3853 Rectl.yBottom += WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2;
3854
3855 AdjustSizeOfClient(NULL,
3856 &Rectl);
3857
3858 if (Rectl.xRight > 0L &&
3859 (Rectl.yBottom < Rectl.yTop))
3860 {
3861
3862 HENUM henum;
3863
3864 henum = WinBeginEnumWindows(hwndClient);
3865 if ((hwndChild = WinGetNextWindow(henum)) != (HWND)0)
3866 {
3867
3868 ULONG ulCurRow, ulCurCol;
3869 SWP swp;
3870 USHORT id;
3871
3872 ulHeight = (Rectl.yTop - Rectl.yBottom) / ulNumRows;
3873
3874 for (ulCurRow = 0;
3875 ulCurRow < ulNumRows;
3876 ulCurRow++)
3877 {
3878 if ((ulNumRows - ulCurRow) <= ulExtraCols)
3879 ulNumCols++;
3880 for (ulCurCol = 0;
3881 ulCurCol < ulNumCols;
3882 ulCurCol++)
3883 {
3884 ulWidth = Rectl.xRight / ulNumCols;
3885
3886 while (hwndChild)
3887 {
3888 id = WinQueryWindowUShort(hwndChild, QWS_ID);
3889 if (id &&
3890 (id != TREE_FRAME || fFreeTree))
3891 {
3892 WinQueryWindowPos(hwndChild, &swp);
3893 if (!(swp.fl & (SWP_HIDE | SWP_MINIMIZE)))
3894 break;
3895 }
3896 hwndChild = WinGetNextWindow(henum);
3897 }
3898
3899 if (hwndChild)
3900 {
3901 if (!absolute &&
3902 (swp.fl & SWP_MAXIMIZE))
3903 {
3904 WinGetMaxPosition(hwndChild, &swp);
3905 WinSetWindowPos(hwndChild,
3906 HWND_TOP,
3907 swp.x,
3908 swp.y,
3909 swp.cx,
3910 swp.cy,
3911 SWP_MOVE | SWP_SIZE | SWP_SHOW);
3912 WinSetWindowUShort(hwndChild,
3913 QWS_XRESTORE,
3914 (USHORT) (ulWidth * ulCurCol) + Rectl.xLeft);
3915 WinSetWindowUShort(hwndChild,
3916 QWS_YRESTORE,
3917 (USHORT) (Rectl.yTop -
3918 (ulHeight * (ulCurRow + 1L))));
3919 WinSetWindowUShort(hwndChild,
3920 QWS_CXRESTORE,
3921 (USHORT) ulWidth);
3922 WinSetWindowUShort(hwndChild,
3923 QWS_CYRESTORE,
3924 (USHORT) ulHeight);
3925 }
3926 else
3927 WinSetWindowPos(hwndChild,
3928 HWND_TOP,
3929 (ulWidth * ulCurCol) + Rectl.xLeft,
3930 Rectl.yTop - (ulHeight * (ulCurRow + 1L)),
3931 ulWidth,
3932 ulHeight,
3933 SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_RESTORE);
3934 hwndChild = WinGetNextWindow(henum);
3935 }
3936 }
3937 if ((ulNumRows - ulCurRow) <= ulExtraCols)
3938 {
3939 ulNumCols--;
3940 ulExtraCols--;
3941 }
3942 }
3943 }
3944 WinEndEnumWindows(henum);
3945 }
3946
3947 fNoTileUpdate = FALSE;
3948}
3949
3950static VOID ResizeChildren(HWND hwndClient, SHORT oldcx, SHORT oldcy, SHORT newcx,
3951 SHORT newcy)
3952{
3953 /*
3954 * resize all children of the client to maintain their proportional
3955 * sizes and positions
3956 */
3957
3958 if (!newcx ||
3959 !newcy ||
3960 !oldcx ||
3961 !oldcy)
3962 return;
3963 {
3964 HENUM henum;
3965 HWND hwndChild;
3966 register LONG x, y, cx, cy, ucx, ucy, ux, uy;
3967 SWP swp;
3968
3969 henum = WinBeginEnumWindows(hwndClient);
3970 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE)
3971 {
3972 if (!WinQueryWindowUShort(hwndChild, QWS_ID))
3973 continue;
3974 if (WinQueryWindowPos(hwndChild, &swp))
3975 {
3976 if (swp.fl & (SWP_MINIMIZE | SWP_HIDE))
3977 {
3978 swp.x = WinQueryWindowUShort(hwndChild, QWS_XRESTORE);
3979 swp.y = WinQueryWindowUShort(hwndChild, QWS_YRESTORE);
3980 swp.cx = WinQueryWindowUShort(hwndChild, QWS_CXRESTORE);
3981 swp.cy = WinQueryWindowUShort(hwndChild, QWS_CYRESTORE);
3982 }
3983 else if (swp.fl & SWP_MAXIMIZE)
3984 {
3985 swp.x = WinQueryWindowUShort(hwndChild, QWS_XRESTORE);
3986 swp.y = WinQueryWindowUShort(hwndChild, QWS_YRESTORE);
3987 swp.cx = WinQueryWindowUShort(hwndChild, QWS_CXRESTORE);
3988 swp.cy = WinQueryWindowUShort(hwndChild, QWS_CYRESTORE);
3989 }
3990 cx = (swp.cx) ? (LONG) (((double) oldcx * 100.0) / (double) swp.cx) : 0;
3991 cy = (swp.cy) ? (LONG) (((double) oldcy * 100.0) / (double) swp.cy) : 0;
3992 x = (swp.x) ? (LONG) (((double) oldcx * 100.0) / (double) swp.x) : 0;
3993 y = (swp.y) ? (LONG) (((double) oldcy * 100.0) / (double) swp.y) : 0;
3994 if (x < 0)
3995 x = 0;
3996 if (y < 0)
3997 y = 0;
3998 ux = (x) ? (LONG) (((double) newcx * 100.0) / (double) x) : 0;
3999 uy = (y) ? (LONG) (((double) newcy * 100.0) / (double) y) : 0;
4000 ucx = (cx) ? (LONG) (((double) newcx * 100.0) / (double) cx) : 0;
4001 ucy = (cy) ? (LONG) (((double) newcy * 100.0) / (double) cy) : 0;
4002 if (ux + ucx > newcx)
4003 ucx = newcx - ux;
4004 if (uy + ucy > newcy)
4005 ucy = newcy - uy;
4006
4007 if (!(swp.fl & (SWP_MINIMIZE | SWP_HIDE | SWP_MAXIMIZE)))
4008 WinSetWindowPos(hwndChild, HWND_TOP, ux, uy, ucx, ucy,
4009 SWP_MOVE | SWP_SIZE | SWP_SHOW);
4010 else if (swp.fl & (SWP_HIDE | SWP_MINIMIZE))
4011 {
4012 WinSetWindowUShort(hwndChild, QWS_XMINIMIZE, (USHORT) - 1);
4013 WinSetWindowUShort(hwndChild, QWS_YMINIMIZE, (USHORT) - 1);
4014 WinSetWindowPos(hwndChild, HWND_TOP, 0, 0, 0, 0,
4015 SWP_SIZE | SWP_MOVE | SWP_FOCUSDEACTIVATE);
4016 WinSetWindowUShort(hwndChild, QWS_XRESTORE, ux);
4017 WinSetWindowUShort(hwndChild, QWS_YRESTORE, uy);
4018 WinSetWindowUShort(hwndChild, QWS_CXRESTORE, ucx);
4019 WinSetWindowUShort(hwndChild, QWS_CYRESTORE, ucy);
4020 }
4021 else
4022 {
4023 WinGetMaxPosition(hwndChild, &swp);
4024 WinSetWindowPos(hwndChild, HWND_TOP, swp.x, swp.y, swp.cx, swp.cy,
4025 SWP_MOVE | SWP_SIZE | SWP_SHOW);
4026 WinSetWindowUShort(hwndChild, QWS_XRESTORE, ux);
4027 WinSetWindowUShort(hwndChild, QWS_YRESTORE, uy);
4028 WinSetWindowUShort(hwndChild, QWS_CXRESTORE, ucx);
4029 WinSetWindowUShort(hwndChild, QWS_CYRESTORE, ucy);
4030 }
4031 }
4032 }
4033 WinEndEnumWindows(henum);
4034 }
4035 if (!fFreeTree)
4036 {
4037
4038 RECTL Rectl;
4039 SWP swp;
4040
4041 WinQueryWindowRect(hwndClient, &Rectl);
4042 AdjustSizeOfClient(NULL, &Rectl);
4043 WinQueryWindowPos(hwndTree, &swp);
4044 if (!(swp.fl & (SWP_MAXIMIZE | SWP_HIDE | SWP_MINIMIZE)))
4045 {
4046 if (swp.y + swp.cy < Rectl.yTop - Rectl.yBottom)
4047 swp.cy = (Rectl.yTop - Rectl.yBottom) - swp.y;
4048 if (swp.x != 0)
4049 swp.x = 0;
4050 if (swp.y < 0)
4051 swp.y = 0;
4052 if (swp.x + swp.cx > Rectl.xRight - Rectl.xLeft)
4053 swp.cx = Rectl.xRight - Rectl.xLeft;
4054 WinSetWindowPos(hwndTree, HWND_TOP, swp.x, swp.y, swp.cx, swp.cy,
4055 SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_RESTORE);
4056 }
4057 }
4058}
4059
4060static VOID MinResChildren(HWND hwndClient, ULONG cmd)
4061{
4062 HENUM henum;
4063 HWND hwndChild;
4064
4065 {
4066 SWP swp;
4067
4068 WinQueryWindowPos(hwndClient, &swp);
4069 if (swp.fl & (SWP_HIDE | SWP_MINIMIZE))
4070 return;
4071 }
4072 henum = WinBeginEnumWindows(hwndClient);
4073 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE)
4074 {
4075 if (!WinQueryWindowUShort(hwndChild, QWS_ID))
4076 continue;
4077 WinSetWindowPos(hwndChild, HWND_TOP, 0, 0, 0, 0, cmd);
4078 }
4079}
4080
4081//=== ChildFrameButtonProc: subclass handler for WALKBUTTON and QUICKBUTTON windows ===
4082
4083static MRESULT EXPENTRY ChildFrameButtonProc(HWND hwnd,
4084 ULONG msg,
4085 MPARAM mp1,
4086 MPARAM mp2)
4087{
4088 USHORT id;
4089 static BOOL emphasized = FALSE;
4090
4091 switch (msg)
4092 {
4093 case WM_BUTTON1CLICK:
4094 case WM_CHORD:
4095 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
4096 break;
4097
4098 case WM_MOUSEMOVE:
4099 if (fOtherHelp)
4100 {
4101 if ((!hwndBubble || WinQueryWindowULong(hwndBubble, QWL_USER) != hwnd) &&
4102 !WinQueryCapture(HWND_DESKTOP))
4103 {
4104 id = WinQueryWindowUShort(hwnd, QWS_ID);
4105 switch (id)
4106 {
4107 case IDM_OPENWALK:
4108 MakeBubble(hwnd,
4109 FALSE,
4110 GetPString(IDS_WALKBUTTONHELP));
4111 break;
4112 case IDM_USERLIST:
4113 MakeBubble(hwnd,
4114 FALSE,
4115 GetPString(IDS_QUICKBUTTONHELP));
4116 break;
4117 }
4118 }
4119 }
4120 break;
4121
4122 case WM_BUTTON3CLICK:
4123 case WM_BUTTON2CLICK:
4124 {
4125 USHORT cmd = 0;
4126
4127 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
4128 id = WinQueryWindowUShort(hwnd, QWS_ID);
4129 switch (id)
4130 {
4131 case IDM_OPENWALK:
4132 switch (msg)
4133 {
4134 case WM_BUTTON2CLICK:
4135 if ((shiftstate & (KC_ALT | KC_SHIFT | KC_CTRL)) ==
4136 (KC_ALT | KC_SHIFT | KC_CTRL))
4137 cmd = IDM_GREP;
4138 else if ((shiftstate & (KC_ALT | KC_CTRL)) ==
4139 (KC_ALT | KC_CTRL))
4140 CascadeChildren(hwndMain);
4141
4142#ifdef NEVER
4143 else if ((shiftstate & (KC_ALT | KC_SHIFT)) ==
4144 (KC_ALT | KC_SHIFT))
4145 cmd = IDM_SYSINFO;
4146#endif
4147
4148 else if (shiftstate & KC_SHIFT)
4149 cmd = IDM_WINDOWDLG;
4150 else if (shiftstate & KC_CTRL)
4151 cmd = IDM_SEEALL;
4152 else if (shiftstate & KC_ALT)
4153 TileChildren(hwndMain, TRUE);
4154 else
4155 cmd = IDM_WALKDIR;
4156 break;
4157 case WM_BUTTON3CLICK:
4158 TileChildren(hwndMain, TRUE);
4159 break;
4160 }
4161 break;
4162 case IDM_USERLIST:
4163 switch (msg)
4164 {
4165 case WM_BUTTON2CLICK:
4166 if ((shiftstate & (KC_ALT | KC_SHIFT | KC_CTRL)) ==
4167 (KC_ALT | KC_SHIFT | KC_CTRL))
4168 cmd = IDM_COLORPALETTE;
4169 else if ((shiftstate & (KC_ALT | KC_CTRL)) ==
4170 (KC_ALT | KC_CTRL))
4171 cmd = IDM_HIDEMENU;
4172 else if ((shiftstate & (KC_ALT | KC_SHIFT)) ==
4173 (KC_ALT | KC_SHIFT))
4174 cmd = IDM_NOTEBOOK;
4175 else if (shiftstate & KC_SHIFT)
4176 cmd = IDM_TOOLTITLES;
4177 else if (shiftstate & KC_CTRL)
4178 cmd = IDM_TEXTTOOLS;
4179 else if (shiftstate & KC_ALT)
4180 cmd = IDM_FONTPALETTE;
4181 else
4182 cmd = IDM_TOOLBAR;
4183 break;
4184 case WM_BUTTON3CLICK:
4185 cmd = IDM_DRIVEBAR;
4186 break;
4187 }
4188 break;
4189 } // switch id
4190
4191 if (cmd)
4192 {
4193 PostMsg(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT), FID_CLIENT),
4194 WM_COMMAND,
4195 MPFROM2SHORT(cmd, 0),
4196 MPVOID);
4197 }
4198 }
4199 break;
4200
4201 case DM_DRAGOVER:
4202 id = WinQueryWindowUShort(hwnd, QWS_ID);
4203 if (id == IDM_OPENWALK)
4204 {
4205 if (!emphasized)
4206 {
4207 emphasized = TRUE;
4208 DrawTargetEmphasis(hwnd, emphasized);
4209 }
4210 if (AcceptOneDrop(mp1, mp2))
4211 return MRFROM2SHORT(DOR_DROP,
4212 DO_MOVE);
4213 }
4214 return MRFROM2SHORT(DOR_NEVERDROP, 0);
4215
4216 case DM_DRAGLEAVE:
4217 if (emphasized)
4218 {
4219 emphasized = FALSE;
4220 DrawTargetEmphasis(hwnd, emphasized);
4221 }
4222 break;
4223
4224 case DM_DROPHELP:
4225 DropHelp(mp1, mp2, hwnd, GetPString(IDS_OPENDROPHELP));
4226 return 0;
4227
4228 case DM_DROP:
4229 {
4230 char szFrom[CCHMAXPATH + 2];
4231
4232 if (emphasized)
4233 {
4234 emphasized = FALSE;
4235 DrawTargetEmphasis(hwnd,
4236 emphasized);
4237 }
4238 if (GetOneDrop(mp1,
4239 mp2,
4240 szFrom,
4241 sizeof(szFrom)))
4242 {
4243 if (MakeValidDir(szFrom) &&
4244 !FindDirCnrByName(szFrom, TRUE))
4245 {
4246 OpenDirCnr((HWND)0,
4247 hwndMain,
4248 hwndTree,
4249 FALSE,
4250 szFrom);
4251 }
4252 }
4253 }
4254 return 0;
4255
4256 case WM_CLOSE:
4257 WinDestroyWindow(hwnd);
4258 return 0;
4259 }
4260 return PFNWPButton(hwnd, msg, mp1, mp2);
4261}
4262
4263static MRESULT EXPENTRY MainFrameWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
4264{
4265 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
4266 static ULONG aheight = 0L;
4267
4268 switch (msg)
4269 {
4270 case WM_ADJUSTWINDOWPOS:
4271 {
4272 SWP *pswp;
4273
4274 pswp = (SWP *) mp1;
4275 if (fDataMin && !fAmClosing)
4276 {
4277 if (pswp -> fl & (SWP_HIDE | SWP_MINIMIZE))
4278 {
4279
4280 SWP swp;
4281
4282 WinQueryWindowPos(hwnd, &swp);
4283 PostMsg(hwnd,
4284 UM_FOCUSME,
4285 MPFROMLONG(swp.fl),
4286 MPVOID);
4287 HideNote();
4288 }
4289 else if (pswp -> fl & (SWP_SHOW | SWP_RESTORE))
4290 {
4291 if (DataHwnd)
4292 PostMsg(DataHwnd,
4293 WM_CLOSE,
4294 MPVOID,
4295 MPVOID);
4296 }
4297 }
4298 if (!fAmClosing)
4299 {
4300 if (pswp -> fl & (SWP_HIDE | SWP_MINIMIZE))
4301 HideNote();
4302 }
4303 }
4304 break;
4305
4306 case UM_FOCUSME:
4307 CreateDataBar(HWND_DESKTOP, (ULONG) mp1);
4308 return 0;
4309
4310 case WM_BUTTON1UP:
4311 case WM_BUTTON2UP:
4312 case WM_BUTTON3UP:
4313 case WM_MOUSEMOVE:
4314 case WM_CHORD:
4315 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
4316 break;
4317
4318 case WM_CHAR:
4319 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
4320 break;
4321
4322 case WM_CONTROL:
4323 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), UM_CONTROL, mp1, mp2);
4324
4325 case WM_COMMAND:
4326 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
4327
4328 case WM_CALCFRAMERECT:
4329 {
4330 MRESULT mr;
4331 PRECTL prectl;
4332 LONG sheight = 20, bheight = 20;
4333
4334 mr = oldproc(hwnd, msg, mp1, mp2);
4335
4336 /*
4337 * Calculate the position of the client rectangle.
4338 * Otherwise, we'll see a lot of redraw when we move the
4339 * client during WM_FORMATFRAME.
4340 */
4341
4342 if (mr && mp2)
4343 {
4344 prectl = (PRECTL) mp1;
4345 if (prectl -> yBottom != prectl -> yTop)
4346 {
4347 {
4348 HPS hps;
4349 POINTL aptl[TXTBOX_COUNT];
4350
4351 hps = WinGetPS(hwndStatus);
4352 if (hps)
4353 {
4354 GpiQueryTextBox(hps, 6, "$`WjgT", TXTBOX_COUNT, aptl);
4355 bheight = sheight = aptl[TXTBOX_TOPLEFT].y + 6;
4356 WinReleasePS(hps);
4357 }
4358 }
4359 prectl -> yBottom += (sheight + 4);
4360 prectl -> yTop -= (sheight + 4);
4361 if (fMoreButtons)
4362 {
4363
4364 HPS hps;
4365 POINTL aptl[TXTBOX_COUNT];
4366
4367 hps = WinGetPS(hwndName);
4368 if (hps)
4369 {
4370 GpiQueryTextBox(hps,
4371 6,
4372 "$`WjgT",
4373 TXTBOX_COUNT,
4374 aptl);
4375 bheight = aptl[TXTBOX_TOPLEFT].y + 6;
4376 WinReleasePS(hps);
4377 }
4378 prectl -> yBottom += (bheight + 4);
4379 prectl -> yTop -= (bheight + 4);
4380 }
4381 if (fToolbar)
4382 {
4383 if (!fTextTools)
4384 prectl -> yTop -= ((fToolTitles) ? 50 : 40);
4385 else
4386 prectl -> yTop -= 32;
4387 }
4388 if (fDrivebar)
4389 {
4390 ResizeDrives(WinWindowFromID(hwnd, MAIN_DRIVES),
4391 ((prectl -> xRight -
4392 (WinQuerySysValue(HWND_DESKTOP,
4393 SV_CYSIZEBORDER) * 2)) - 4));
4394 prectl -> yTop -= (16 * (DriveLines * 18));
4395 }
4396 if (fUserComboBox)
4397 {
4398 if (!aheight)
4399 {
4400
4401 SWP swpTemp;
4402
4403 WinQueryWindowPos(WinWindowFromID(hwndDrivelist, CBID_EDIT),
4404 &swpTemp);
4405 aheight = swpTemp.cy;
4406 }
4407 prectl -> yTop -= (aheight + 6L);
4408 }
4409 if (fAutoView)
4410 {
4411 AutoviewHeight = min(AutoviewHeight,
4412 (prectl -> yTop - prectl -> yBottom) - 116);
4413 AutoviewHeight = max(AutoviewHeight, 36);
4414 prectl -> yBottom += (AutoviewHeight + 6);
4415 }
4416 }
4417 }
4418 return mr;
4419 }
4420
4421 case WM_FORMATFRAME:
4422 {
4423 SHORT sCount, soldCount;
4424 PSWP pswp, pswpClient, pswpNew;
4425 SWP swpClient;
4426 LONG theight = 48L, dheight = 20L, width, sheight = 20, bheight = 20;
4427
4428 sCount = (SHORT) oldproc(hwnd, msg, mp1, mp2);
4429 soldCount = sCount;
4430
4431 /*
4432 * Reformat the frame to "squeeze" the client
4433 * and make room for status window sibling beneath
4434 * and toolbar above (if toolbar's on) and userlists
4435 * (if userlists are on).
4436 */
4437
4438 pswp = (PSWP) mp1;
4439 {
4440 SHORT x;
4441
4442 for (x = 0; x < soldCount; x++)
4443 {
4444 if (WinQueryWindowUShort(pswp -> hwnd, QWS_ID) == FID_CLIENT)
4445 {
4446 pswpClient = pswp;
4447 break;
4448 }
4449 pswp++;
4450 }
4451 }
4452
4453 {
4454 HPS hps;
4455 POINTL aptl[TXTBOX_COUNT];
4456
4457 hps = WinGetPS(hwndStatus);
4458 if (hps)
4459 {
4460 GpiQueryTextBox(hps,
4461 6,
4462 "$`WjgT",
4463 TXTBOX_COUNT,
4464 aptl);
4465 bheight = sheight = aptl[TXTBOX_TOPLEFT].y + 6;
4466 WinReleasePS(hps);
4467 }
4468 if (fMoreButtons)
4469 {
4470 hps = WinGetPS(hwndName);
4471 if (hps)
4472 {
4473 GpiQueryTextBox(hps,
4474 6,
4475 "$`WjgT",
4476 TXTBOX_COUNT,
4477 aptl);
4478 bheight = aptl[TXTBOX_TOPLEFT].y + 6;
4479 WinReleasePS(hps);
4480 }
4481 }
4482 }
4483 pswpNew = (PSWP) mp1 + soldCount;
4484 *pswpNew = *pswpClient;
4485 swpClient = *pswpClient;
4486 pswpNew -> hwnd = hwndStatus;
4487 pswpNew -> hwndInsertBehind = HWND_BOTTOM;
4488 pswpNew -> x = swpClient.x + 3;
4489 pswpNew -> y = swpClient.y + 2;
4490 if (!fSplitStatus)
4491 width = swpClient.cx - (16 + (sheight * 2) + 4);
4492 else
4493 width = (swpClient.cx - (16 + (sheight * 2) + 4)) / 2;
4494 width = max(width, 10);
4495 if (fSplitStatus)
4496 pswpNew -> cx = width - 6;
4497 else
4498 pswpNew -> cx = width - 8;
4499 pswpNew -> cy = sheight;
4500 pswpClient -> y = pswpNew -> y + pswpNew -> cy + 3;
4501 pswpClient -> cy = (swpClient.cy - pswpNew -> cy) - 3;
4502 sCount++;
4503
4504 if (fSplitStatus)
4505 {
4506 pswpNew = (PSWP) mp1 + (soldCount + 1);
4507 *pswpNew = *pswpClient;
4508 pswpNew -> hwnd = hwndStatus2;
4509 pswpNew -> hwndInsertBehind = HWND_BOTTOM;
4510 pswpNew -> x = width + 8;
4511 pswpNew -> y = swpClient.y + 2;
4512 pswpNew -> cx = width - 6;
4513 pswpNew -> cy = sheight;
4514 sCount++;
4515 }
4516 else
4517 {
4518 WinShowWindow(hwndStatus2, FALSE);
4519 WinSetWindowText(hwndStatus2,
4520 NullStr);
4521 }
4522
4523 if (fToolbar)
4524 {
4525 if (fTextTools)
4526 theight = 32L;
4527 else if (!fToolTitles)
4528 theight = 40L;
4529 pswpNew = (PSWP) mp1 + (soldCount + 1 +
4530 (fSplitStatus != FALSE));
4531 *pswpNew = *pswpClient;
4532 pswpNew -> hwnd = WinWindowFromID(hwnd, MAIN_TOOLS);
4533 pswpNew -> hwndInsertBehind = HWND_BOTTOM;
4534 pswpNew -> x = swpClient.x + 2;
4535 pswpNew -> y = (swpClient.y + swpClient.cy) - (theight - 2);
4536 pswpNew -> cx = swpClient.cx - 4;
4537 pswpNew -> cy = theight - 4;
4538 pswpClient -> cy -= theight;
4539 sCount++;
4540 }
4541 else
4542 WinShowWindow(WinWindowFromID(hwnd, MAIN_TOOLS), FALSE);
4543
4544 if (fDrivebar)
4545 {
4546 ResizeDrives(WinWindowFromID(hwnd, MAIN_DRIVES),
4547 pswpClient -> cx - 4);
4548 pswpNew = (PSWP) mp1 + (soldCount + 1 +
4549 (fSplitStatus != FALSE) +
4550 (fToolbar != FALSE));
4551 *pswpNew = *pswpClient;
4552 pswpNew -> hwnd = WinWindowFromID(hwnd, MAIN_DRIVES);
4553 pswpNew -> hwndInsertBehind = HWND_BOTTOM;
4554 pswpNew -> x = swpClient.x + 2;
4555 dheight += ((dheight - 2) * DriveLines);
4556 pswpNew -> y = (swpClient.y + swpClient.cy) - (dheight - 2);
4557 if (fToolbar)
4558 pswpNew -> y -= theight;
4559 pswpNew -> cx = swpClient.cx - 4;
4560 pswpNew -> cy = dheight - 4;
4561 pswpClient -> cy -= dheight;
4562 sCount++;
4563 }
4564 else
4565 WinShowWindow(WinWindowFromID(hwnd, MAIN_DRIVES), FALSE);
4566
4567 if (fAutoView)
4568 {
4569 pswpNew = (PSWP) mp1 + (soldCount + 1 +
4570 (fToolbar != FALSE) +
4571 (fDrivebar != FALSE) +
4572 (fSplitStatus != FALSE));
4573 *pswpNew = *pswpClient;
4574 pswpNew -> hwnd = (fComments) ? hwndAutoMLE : hwndAutoview;
4575 pswpNew -> x = pswpClient -> x + 3;
4576 pswpNew -> y = pswpClient -> y + 3;
4577 if (fMoreButtons)
4578 pswpNew -> y += (bheight + 4);
4579 pswpNew -> cx = pswpClient -> cx - 6;
4580 AutoviewHeight = min(AutoviewHeight,
4581 pswpClient -> cy - 116);
4582 AutoviewHeight = max(AutoviewHeight, 36);
4583 pswpNew -> cy = AutoviewHeight;
4584 pswpClient -> y += (AutoviewHeight + 6);
4585 pswpClient -> cy -= (AutoviewHeight + 6);
4586 sCount++;
4587 WinShowWindow((fComments) ? hwndAutoview : hwndAutoMLE, FALSE);
4588 }
4589 else
4590 {
4591 WinShowWindow(hwndAutoview, FALSE);
4592 WinShowWindow(hwndAutoMLE, FALSE);
4593 }
4594
4595 pswpNew = (PSWP) mp1 + (soldCount + 1 +
4596 (fToolbar != FALSE) +
4597 (fDrivebar != FALSE) +
4598 (fSplitStatus != FALSE) +
4599 (fAutoView != FALSE));
4600 *pswpNew = *pswpClient;
4601 pswpNew -> hwnd = WinWindowFromID(hwnd, IDM_OPENWALK);
4602 pswpNew -> x = swpClient.cx - ((sheight * 2) + 4);
4603 pswpNew -> y = swpClient.y;
4604 pswpNew -> cx = sheight + 4;
4605 pswpNew -> cy = sheight + 4;
4606 sCount++;
4607 pswpNew = (PSWP) mp1 + (soldCount + 2 +
4608 (fToolbar != FALSE) +
4609 (fDrivebar != FALSE) +
4610 (fSplitStatus != FALSE) +
4611 (fAutoView != FALSE));
4612 *pswpNew = *pswpClient;
4613 pswpNew -> hwnd = WinWindowFromID(hwnd, IDM_USERLIST);
4614 pswpNew -> x = swpClient.cx - (sheight + 2);
4615 pswpNew -> y = swpClient.y;
4616 pswpNew -> cx = sheight + 4;
4617 pswpNew -> cy = sheight + 4;
4618 sCount++;
4619 pswpNew = (PSWP) mp1 + (soldCount + 3 +
4620 (fToolbar != FALSE) +
4621 (fDrivebar != FALSE) +
4622 (fSplitStatus != FALSE) +
4623 (fAutoView != FALSE));
4624 *pswpNew = *pswpClient;
4625 pswpNew -> hwnd = WinWindowFromID(hwnd, MAIN_LED);
4626 pswpNew -> x = swpClient.cx - ((sheight * 2) + 16);
4627 pswpNew -> y = swpClient.y;
4628 pswpNew -> cx = 12;
4629 pswpNew -> cy = 12;
4630 sCount++;
4631 pswpNew = (PSWP) mp1 + (soldCount + 4 +
4632 (fToolbar != FALSE) +
4633 (fDrivebar != FALSE) +
4634 (fSplitStatus != FALSE) +
4635 (fAutoView != FALSE));
4636 *pswpNew = *pswpClient;
4637 pswpNew -> hwnd = WinWindowFromID(hwnd, MAIN_LEDHDR);
4638 pswpNew -> x = swpClient.cx - ((sheight * 2) + 16);
4639 pswpNew -> y = swpClient.y + 12;
4640 pswpNew -> cx = 12;
4641 pswpNew -> cy = sheight - 8;
4642 sCount++;
4643 if (fUserComboBox)
4644 {
4645 if (!aheight)
4646 {
4647
4648 SWP swpTemp;
4649
4650 WinQueryWindowPos(WinWindowFromID(hwndDrivelist, CBID_EDIT),
4651 &swpTemp);
4652 aheight = swpTemp.cy;
4653 }
4654 pswpNew = (PSWP) mp1 + (soldCount + 5 +
4655 (fToolbar != FALSE) +
4656 (fSplitStatus != FALSE) +
4657 (fDrivebar != FALSE) +
4658 (fAutoView != FALSE));
4659 *pswpNew = *pswpClient;
4660 pswpNew -> hwnd = hwndDrivelist;
4661 pswpNew -> x = swpClient.x;
4662 pswpNew -> cx = 48;
4663 pswpClient -> cy -= (aheight + 6L);
4664 pswpNew -> y = pswpClient -> y;
4665 pswpNew -> cy = pswpClient -> cy + (aheight + 5L);
4666 sCount++;
4667 pswpNew = (PSWP) mp1 + (soldCount + 6 +
4668 (fToolbar != FALSE) +
4669 (fDrivebar != FALSE) +
4670 (fSplitStatus != FALSE) +
4671 (fAutoView != FALSE));
4672 *pswpNew = *pswpClient;
4673 pswpNew -> hwnd = hwndStatelist;
4674 pswpNew -> x = swpClient.x + 48;
4675 pswpNew -> cx = (swpClient.cx - 48) / 7;
4676 pswpNew -> y = pswpClient -> y;
4677 pswpNew -> cy = pswpClient -> cy + (aheight + 5L);
4678 sCount++;
4679 pswpNew = (PSWP) mp1 + (soldCount + 7 +
4680 (fToolbar != FALSE) +
4681 (fDrivebar != FALSE) +
4682 (fSplitStatus != FALSE) +
4683 (fAutoView != FALSE));
4684 *pswpNew = *pswpClient;
4685 pswpNew -> hwnd = hwndCmdlist;
4686 pswpNew -> x = swpClient.x + 48 + ((swpClient.cx - 48) / 7);
4687 pswpNew -> cx = (swpClient.cx - 48) / 5 +
4688 ((swpClient.cx - 48) / 5) - ((swpClient.cx - 48) / 7);
4689 pswpNew -> y = pswpClient -> y;
4690 pswpNew -> cy = pswpClient -> cy + (aheight + 5L);
4691 sCount++;
4692 pswpNew = (PSWP) mp1 + (soldCount + 8 +
4693 (fToolbar != FALSE) +
4694 (fDrivebar != FALSE) +
4695 (fSplitStatus != FALSE) +
4696 (fAutoView != FALSE));
4697 *pswpNew = *pswpClient;
4698 pswpNew -> hwnd = hwndUserlist;
4699 pswpNew -> x = swpClient.x + 48 + (((swpClient.cx - 48) / 5) * 2);
4700 pswpNew -> cx = ((swpClient.x + swpClient.cx) - pswpNew -> x) -
4701 ((fToolbar) ?
4702 ((swpClient.cx - 48) / 7) : 0);
4703 pswpNew -> y = pswpClient -> y;
4704 pswpNew -> cy = pswpClient -> cy + (aheight + 5L);
4705 sCount++;
4706 if (fToolbar)
4707 {
4708 pswpNew = (PSWP) mp1 + (soldCount + 9 +
4709 (fToolbar != FALSE) +
4710 (fDrivebar != FALSE) +
4711 (fSplitStatus != FALSE) +
4712 (fAutoView != FALSE));
4713 *pswpNew = *pswpClient;
4714 pswpNew -> hwnd = hwndButtonlist;
4715 pswpNew -> x = swpClient.cx - ((swpClient.cx - 48) / 7) + 4;
4716 pswpNew -> cx = (swpClient.x + swpClient.cx) - pswpNew -> x;
4717 pswpNew -> y = pswpClient -> y;
4718 pswpNew -> cy = pswpClient -> cy + (aheight + 5L);
4719 sCount++;
4720 }
4721 else
4722 WinShowWindow(hwndButtonlist, FALSE);
4723 }
4724 else
4725 {
4726 WinShowWindow(hwndUserlist, FALSE);
4727 WinShowWindow(hwndDrivelist, FALSE);
4728 WinShowWindow(hwndStatelist, FALSE);
4729 WinShowWindow(hwndButtonlist, FALSE);
4730 WinShowWindow(hwndCmdlist, FALSE);
4731 }
4732 {
4733 PSWP pswpTitlebar = (PSWP) 0, pswpMinbutton = (PSWP) 0;
4734 SHORT x;
4735
4736 pswpNew = (PSWP) mp1 + (soldCount + 5 +
4737 (fToolbar != FALSE) +
4738 (fDrivebar != FALSE) +
4739 (fSplitStatus != FALSE) +
4740 (fAutoView != FALSE) +
4741 ((fUserComboBox != FALSE) * 4) +
4742 (fUserComboBox != FALSE &&
4743 fToolbar != FALSE));
4744 pswp = (PSWP) mp1;
4745 for (x = 0; x < soldCount; x++)
4746 {
4747 if (!pswpTitlebar &&
4748 WinQueryWindowUShort(pswp -> hwnd, QWS_ID) == FID_TITLEBAR)
4749 pswpTitlebar = pswp;
4750 else if (!pswpMinbutton &&
4751 WinQueryWindowUShort(pswp -> hwnd, QWS_ID) == FID_MINMAX)
4752 pswpMinbutton = pswp;
4753 if (pswpTitlebar &&
4754 pswpMinbutton)
4755 break;
4756 pswp++;
4757 }
4758 if (pswpMinbutton &&
4759 pswpTitlebar)
4760 {
4761 *pswpNew = *pswpMinbutton;
4762 pswpNew -> hwnd = WinWindowFromID(hwnd, IDM_IDEALSIZE);
4763 pswpNew -> cy = pswpMinbutton -> cy + 3;
4764 pswpNew -> cx = min(pswpNew -> cy, (pswpMinbutton -> cx / 2) + 3);
4765 pswpTitlebar -> cx -= (pswpNew -> cx - 1);
4766 pswpNew -> x = pswpTitlebar -> x + (pswpTitlebar -> cx);
4767 pswpNew -> y = pswpMinbutton -> y - 1;
4768 sCount++;
4769 }
4770 else
4771 WinShowWindow(WinWindowFromID(hwnd, IDM_IDEALSIZE), FALSE);
4772 }
4773
4774 if (fMoreButtons)
4775 {
4776
4777 LONG lastx;
4778
4779 pswpNew = (PSWP) mp1 + (soldCount + 6 +
4780 (fToolbar != FALSE) +
4781 (fDrivebar != FALSE) +
4782 (fSplitStatus != FALSE) +
4783 (fAutoView != FALSE) +
4784 ((fUserComboBox != FALSE) * 4) +
4785 (fUserComboBox != FALSE &&
4786 fToolbar != FALSE));
4787 *pswpNew = *pswpClient;
4788 pswpNew -> hwnd = hwndName;
4789 pswpNew -> x = swpClient.x + 3;
4790 pswpNew -> y = swpClient.y + (sheight + 6);
4791 pswpNew -> cx = ((swpClient.cx / 2) + (swpClient.cx / 5)) - 3;
4792 lastx = pswpNew -> x + pswpNew -> cx;
4793 pswpNew -> cy = bheight;
4794 pswpClient -> y += (bheight + 4);
4795 pswpClient -> cy -= (bheight + 4);
4796 sCount++;
4797 pswpNew = (PSWP) mp1 + (soldCount + 7 +
4798 (fToolbar != FALSE) +
4799 (fDrivebar != FALSE) +
4800 (fSplitStatus != FALSE) +
4801 (fAutoView != FALSE) +
4802 ((fUserComboBox != FALSE) * 4) +
4803 (fUserComboBox != FALSE &&
4804 fToolbar != FALSE));
4805 *pswpNew = *pswpClient;
4806 pswpNew -> hwnd = hwndDate;
4807 pswpNew -> x = lastx + 3;
4808 pswpNew -> y = swpClient.y + (sheight + 6);
4809 pswpNew -> cx = (swpClient.cx / 6) + (swpClient.cx / 16) - 3;
4810 lastx = pswpNew -> x + pswpNew -> cx;
4811 pswpNew -> cy = bheight;
4812 sCount++;
4813 pswpNew = (PSWP) mp1 + (soldCount + 8 +
4814 (fToolbar != FALSE) +
4815 (fDrivebar != FALSE) +
4816 (fSplitStatus != FALSE) +
4817 (fAutoView != FALSE) +
4818 ((fUserComboBox != FALSE) * 4) +
4819 (fUserComboBox != FALSE &&
4820 fToolbar != FALSE));
4821 *pswpNew = *pswpClient;
4822 pswpNew -> hwnd = hwndAttr;
4823 pswpNew -> x = lastx + 3;
4824 pswpNew -> y = swpClient.y + (sheight + 6);
4825 pswpNew -> cx = (swpClient.cx - pswpNew -> x) - 1;
4826 pswpNew -> cy = bheight;
4827 sCount++;
4828 }
4829 else
4830 {
4831 WinShowWindow(hwndAttr, FALSE);
4832 WinShowWindow(hwndName, FALSE);
4833 WinShowWindow(hwndDate, FALSE);
4834 }
4835 return MRFROMSHORT(sCount);
4836 }
4837
4838 case WM_QUERYFRAMECTLCOUNT:
4839 {
4840 SHORT sCount;
4841
4842 sCount = (SHORT) oldproc(hwnd, msg, mp1, mp2);
4843
4844 sCount += 6;
4845 if (fSplitStatus)
4846 sCount++;
4847 if (fToolbar)
4848 sCount++;
4849 if (fUserComboBox)
4850 {
4851 sCount += 4;
4852 if (fToolbar)
4853 sCount++;
4854 }
4855 if (fDrivebar)
4856 sCount++;
4857 if (fAutoView)
4858 sCount++;
4859 if (fMoreButtons)
4860 sCount += 3;
4861 return MRFROMSHORT(sCount);
4862 }
4863
4864 case WM_CLOSE:
4865 WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
4866 return 0;
4867 }
4868 return oldproc(hwnd, msg, mp1, mp2);
4869}
4870
4871MRESULT EXPENTRY MainWMCommand(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
4872{
4873 SetShiftState();
4874 switch (SHORT1FROMMP(mp1))
4875 {
4876 case IDM_SETTARGET:
4877 SetTargetDir(hwnd, FALSE);
4878 break;
4879
4880 case IDM_TOAUTOMLE:
4881 if (fComments && fAutoView)
4882 WinSetFocus(HWND_DESKTOP,
4883 hwndAutoMLE);
4884 break;
4885
4886 case IDM_HIDENOTEWND:
4887 HideNote();
4888 break;
4889 case IDM_SHOWNOTEWND:
4890 ShowNote();
4891 break;
4892
4893 case IDM_COMPARE:
4894 {
4895 WALK2 wa;
4896 PCNRITEM pci;
4897
4898 memset(&wa, 0, sizeof(wa));
4899 wa.size = sizeof(wa);
4900 pci = (PCNRITEM) WinSendMsg(WinWindowFromID(WinWindowFromID(
4901 hwndTree, FID_CLIENT), TREE_CNR),
4902 CM_QUERYRECORDEMPHASIS,
4903 MPFROMLONG(CMA_FIRST),
4904 MPFROMSHORT(CRA_CURSORED));
4905 if (pci && (INT) pci != -1)
4906 {
4907 strcpy(wa.szCurrentPath1, pci -> szFileName);
4908 MakeValidDir(wa.szCurrentPath1);
4909 }
4910 else
4911 save_dir2(wa.szCurrentPath1);
4912 TopWindowName(hwndMain, (HWND)0, wa.szCurrentPath2);
4913 if (!*wa.szCurrentPath2)
4914 strcpy(wa.szCurrentPath2, wa.szCurrentPath1);
4915 MakeValidDir(wa.szCurrentPath2);
4916 if (WinDlgBox(HWND_DESKTOP,
4917 hwnd,
4918 WalkTwoCmpDlgProc,
4919 FM3ModHandle,
4920 WALK2_FRAME,
4921 MPFROMP(&wa)) &&
4922 !IsFile(wa.szCurrentPath1) &&
4923 !IsFile(wa.szCurrentPath2))
4924 {
4925 if (!*dircompare)
4926 {
4927
4928 COMPARE *cmp;
4929
4930 cmp = xmallocz(sizeof(COMPARE),pszSrcFile,__LINE__);
4931 if (cmp) {
4932 cmp -> size = sizeof(COMPARE);
4933 strcpy(cmp -> leftdir, wa.szCurrentPath1);
4934 strcpy(cmp -> rightdir, wa.szCurrentPath2);
4935 cmp -> hwndParent = hwnd;
4936 cmp -> dcd.hwndParent = hwnd;
4937 WinDlgBox(HWND_DESKTOP,
4938 HWND_DESKTOP,
4939 CompareDlgProc,
4940 FM3ModHandle,
4941 COMP_FRAME,
4942 MPFROMP(cmp));
4943 }
4944 }
4945 else
4946 {
4947
4948 CHAR d1[] = "\"";
4949 CHAR d2[] = "\"";
4950
4951 if (!needs_quoting(wa.szCurrentPath1))
4952 *d1 = 0;
4953 if (!needs_quoting(wa.szCurrentPath2))
4954 *d2 = 0;
4955 runemf2(SEPARATE,
4956 HWND_DESKTOP,
4957 NULL,
4958 NULL,
4959 "%s %s%s%s %s%s%s",
4960 dircompare,
4961 d1,
4962 wa.szCurrentPath1,
4963 d1,
4964 d2,
4965 wa.szCurrentPath2,
4966 d2);
4967 }
4968 }
4969 }
4970 break;
4971
4972 case IDM_EXIT:
4973 case IDM_KILLME:
4974 PostMsg(hwnd,
4975 WM_CLOSE,
4976 MPVOID,
4977 MPVOID);
4978 break;
4979
4980 case IDM_CLI:
4981 if (fSplitStatus &&
4982 hwndStatus2 &&
4983 !WinIsWindow(WinQueryAnchorBlock(hwnd),
4984 WinWindowFromID(hwndStatus2, COMMAND_LINE)))
4985 PostMsg(hwndStatus2,
4986 UM_CLICKED,
4987 MPVOID,
4988 MPVOID);
4989 break;
4990
4991 case IDM_ADDTOUSERLIST:
4992 case IDM_DELETEFROMUSERLIST:
4993 {
4994 CHAR temp[CCHMAXPATH], path[CCHMAXPATH];
4995
4996 *temp = 0;
4997 WinQueryWindowText(hwndUserlist,
4998 CCHMAXPATH,
4999 temp);
5000 bstrip(temp);
5001 if (*temp &&
5002 !DosQueryPathInfo(temp,
5003 FIL_QUERYFULLNAME,
5004 path,
5005 sizeof(path)))
5006 {
5007 if (SHORT1FROMMP(mp1) == IDM_ADDTOUSERLIST)
5008 {
5009 if (!add_udir(TRUE, path))
5010 Runtime_Error(pszSrcFile, __LINE__, "add_udir");
5011 else {
5012 if (fUdirsChanged)
5013 save_udirs();
5014 WinSendMsg(hwnd,
5015 UM_FILLUSERLIST,
5016 MPVOID,
5017 MPVOID);
5018 }
5019 }
5020 else
5021 {
5022 if (!remove_udir(path))
5023 Runtime_Error(pszSrcFile, __LINE__, "remove_udir");
5024 else {
5025 if (fUdirsChanged)
5026 save_udirs();
5027 WinSendMsg(hwnd, UM_FILLUSERLIST, MPVOID, MPVOID);
5028 }
5029 }
5030 }
5031 }
5032 break;
5033
5034 case IDM_SAVEDIRCNRSTATE:
5035 case IDM_DELETEDIRCNRSTATE:
5036 {
5037 CHAR name[14];
5038
5039 *name = 0;
5040 WinQueryWindowText(hwndStatelist, 13, name);
5041 bstrip(name);
5042 if (*name)
5043 {
5044 if (SHORT1FROMMP(mp1) == IDM_SAVEDIRCNRSTATE) {
5045 // Save
5046 if (SaveDirCnrState(hwnd, name))
5047 {
5048 if (add_setup(name))
5049 {
5050 WinSendMsg(hwndStatelist, LM_INSERTITEM,
5051 MPFROM2SHORT(LIT_SORTASCENDING, 0),
5052 MPFROMP(name));
5053 save_setups();
5054 }
5055 }
5056 WinSetWindowText(hwndStatelist,GetPString(IDS_STATETEXT));
5057 }
5058 else {
5059 // Delete
5060 ULONG numsaves = 0, size, x;
5061 CHAR s[120];
5062
5063 if (remove_setup(name))
5064 save_setups();
5065 sprintf(s, "%s.NumDirsLastTime", name);
5066 size = sizeof(ULONG);
5067 if (!PrfQueryProfileData(fmprof, FM3Str, s, (PVOID)&numsaves, &size)) {
5068 saymsg(MB_ENTER | MB_ICONASTERISK,
5069 hwnd,
5070 GetPString(IDS_WARNINGTEXT),
5071 GetPString(IDS_DOESNTEXISTTEXT), name);
5072 }
5073 else if (!size)
5074 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
5075 else {
5076 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0L);
5077 for (x = 0; x < numsaves; x++)
5078 {
5079 sprintf(s, "%s.DirCnrPos.%lu", name, x);
5080 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
5081 sprintf(s, "%s.DirCnrDir.%lu", name, x);
5082 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
5083 sprintf(s, "%s.DirCnrSort.%lu", name, x);
5084 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
5085 sprintf(s, "%s.DirCnrFilter.%lu", name, x);
5086 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
5087 sprintf(s, "%s.DirCnrView.%lu", name, x);
5088 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
5089 }
5090 sprintf(s, "%s.LastTreePos", name);
5091 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
5092 sprintf(s, "%s.MySizeLastTime", name);
5093 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
5094 }
5095 PostMsg(hwnd, UM_FILLSETUPLIST, MPVOID, MPVOID);
5096 }
5097 }
5098 }
5099 break;
5100
5101 case IDM_IDEALSIZE:
5102 {
5103 SWP swp, swpD;
5104 ULONG icz = WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2L;
5105 ULONG bsz = WinQuerySysValue(HWND_DESKTOP, SV_CYSIZEBORDER);
5106
5107 WinQueryWindowPos(WinQueryWindow(hwnd, QW_PARENT), &swp);
5108 if (swp.fl & SWP_MAXIMIZE)
5109 {
5110 WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_SYSCOMMAND,
5111 MPFROM2SHORT(SC_RESTORE, 0), MPVOID);
5112 WinQueryWindowPos(WinQueryWindow(hwnd, QW_PARENT), &swp);
5113 }
5114 WinGetMaxPosition(WinQueryWindow(hwnd, QW_PARENT), &swpD);
5115 swpD.x += bsz;
5116 swpD.cx -= (bsz * 2);
5117 swpD.y += icz;
5118 swpD.cy -= (icz + bsz);
5119 if (swp.x == swpD.x && swp.y == swpD.y &&
5120 swp.cx == swpD.cx &&
5121 swp.cy == swpD.cy &&
5122 // fixme to be #defined someday
5123 WinQueryWindowUShort(hwnd, QWL_USER + 10) &&
5124 WinQueryWindowUShort(hwnd, QWL_USER + 14))
5125 {
5126 swpD.x = WinQueryWindowUShort(hwnd, QWL_USER + 8);
5127 swpD.cx = WinQueryWindowUShort(hwnd, QWL_USER + 10);
5128 swpD.y = WinQueryWindowUShort(hwnd, QWL_USER + 12);
5129 swpD.cy = WinQueryWindowUShort(hwnd, QWL_USER + 14);
5130 }
5131 else
5132 {
5133 WinSetWindowUShort(hwnd, QWL_USER + 8, (USHORT) swp.x);
5134 WinSetWindowUShort(hwnd, QWL_USER + 10, (USHORT) swp.cx);
5135 WinSetWindowUShort(hwnd, QWL_USER + 12, (USHORT) swp.y);
5136 WinSetWindowUShort(hwnd, QWL_USER + 14, (USHORT) swp.cy);
5137 }
5138 WinSetWindowPos(WinQueryWindow(hwnd, QW_PARENT), HWND_TOP,
5139 swpD.x, swpD.y, swpD.cx,
5140 swpD.cy, SWP_MOVE | SWP_SIZE);
5141 }
5142 break;
5143
5144 case IDM_BLINK:
5145 WinSetWindowPos(WinQueryWindow(hwnd, QW_PARENT), HWND_TOP, 0, 0, 0, 0,
5146 SWP_MINIMIZE);
5147 WinSetWindowPos(WinQueryWindow(hwnd, QW_PARENT), HWND_TOP, 0, 0, 0, 0,
5148 SWP_RESTORE | SWP_ZORDER);
5149 break;
5150
5151 case DID_CANCEL:
5152 {
5153 HWND hwndTop = TopWindow(hwndMain, (HWND)0);
5154
5155 if (hwndTop)
5156 WinSetFocus(HWND_DESKTOP,
5157 hwndTop);
5158 }
5159 break;
5160
5161 case IDM_NOTEBOOK:
5162 WinDlgBox(HWND_DESKTOP,
5163 hwnd,
5164 CfgDlgProc,
5165 FM3ModHandle,
5166 CFG_FRAME,
5167 MPVOID);
5168 break;
5169
5170 case IDM_VIEWHELPS:
5171 case IDM_VIEWINFS:
5172 WinDlgBox(HWND_DESKTOP,
5173 HWND_DESKTOP,
5174 ViewInfProc,
5175 FM3ModHandle,
5176 VINF_FRAME,
5177 ((SHORT1FROMMP(mp1) == IDM_VIEWHELPS) ?
5178 MPFROMP(NullStr) :
5179 MPVOID));
5180 break;
5181
5182 case IDM_OPENWALK:
5183 {
5184 char newpath[CCHMAXPATH];
5185
5186 *newpath = 0;
5187 TopWindowName(hwnd, (HWND)0, newpath);
5188 if (WinDlgBox(HWND_DESKTOP,
5189 hwnd,
5190 WalkAllDlgProc,
5191 FM3ModHandle,
5192 WALK_FRAME,
5193 MPFROMP(newpath)) &&
5194 *newpath)
5195 OpenDirCnr((HWND)0,
5196 hwndMain,
5197 hwndTree,
5198 FALSE,
5199 newpath);
5200 }
5201 break;
5202
5203 case IDM_WINDOWDLG:
5204 WindowList(hwnd);
5205 break;
5206
5207 case IDM_HELPMOUSE:
5208 case IDM_HELPCONTEXT:
5209 case IDM_HELPHINTS:
5210 case IDM_HELPPIX:
5211 case IDM_HELPTUTOR:
5212 case IDM_HELPUSERLIST:
5213 case IDM_HELP:
5214 case IDM_HELPCONTENTS:
5215 case IDM_HELPKEYS:
5216 case IDM_HELPGENERAL:
5217 if (hwndHelp)
5218 {
5219 if (SHORT1FROMMP(mp2) == CMDSRC_MENU)
5220 {
5221
5222 RECTL rcl;
5223 ULONG icz = WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2L;
5224
5225 WinQueryWindowRect(HWND_DESKTOP, &rcl);
5226 rcl.yBottom += icz;
5227 rcl.yTop -= icz;
5228 rcl.xLeft += icz;
5229 rcl.xRight -= icz;
5230 WinSendMsg(hwndHelp, HM_SET_COVERPAGE_SIZE,
5231 MPFROMP(&rcl), MPVOID);
5232 }
5233 else
5234 {
5235
5236 RECTL rcl;
5237
5238 WinQueryWindowRect(HWND_DESKTOP, &rcl);
5239 rcl.yBottom += 8;
5240 rcl.yTop = (rcl.yTop / 2) + (rcl.yTop / 7);
5241 rcl.xLeft = (rcl.xRight / 2) - (rcl.xRight / 7);
5242 rcl.xRight -= 8;
5243 WinSendMsg(hwndHelp, HM_SET_COVERPAGE_SIZE,
5244 MPFROMP(&rcl), MPVOID);
5245 }
5246 switch (SHORT1FROMMP(mp1))
5247 {
5248 case IDM_HELPCONTEXT:
5249 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
5250 MPFROM2SHORT(HELP_CONTEXT, 0),
5251 MPFROMSHORT(HM_RESOURCEID));
5252 break;
5253
5254 case IDM_HELPMOUSE:
5255 if (hwndHelp)
5256 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
5257 MPFROM2SHORT(HELP_MOUSE, 0),
5258 MPFROMSHORT(HM_RESOURCEID));
5259 break;
5260
5261 case IDM_HELPPIX:
5262 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
5263 MPFROM2SHORT(HELP_BITMAP1, 0),
5264 MPFROMSHORT(HM_RESOURCEID));
5265 break;
5266
5267 case IDM_HELPTUTOR:
5268 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
5269 MPFROM2SHORT(HELP_TUTORIAL, 0),
5270 MPFROMSHORT(HM_RESOURCEID));
5271 break;
5272
5273 case IDM_HELPHINTS:
5274 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
5275 MPFROM2SHORT(HELP_HINTS, 0),
5276 MPFROMSHORT(HM_RESOURCEID));
5277 break;
5278
5279 case IDM_HELPGENERAL:
5280 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
5281 MPFROM2SHORT(HELP_MAIN, 0),
5282 MPFROMSHORT(HM_RESOURCEID));
5283 break;
5284 case IDM_HELPKEYS:
5285 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
5286 MPFROM2SHORT(HELP_KEYS, 0),
5287 MPFROMSHORT(HM_RESOURCEID));
5288 break;
5289
5290 case IDM_HELP:
5291 case IDM_HELPCONTENTS:
5292 WinSendMsg(hwndHelp, HM_HELP_CONTENTS, MPVOID, MPVOID);
5293 break;
5294
5295 case IDM_HELPUSERLIST:
5296 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
5297 MPFROM2SHORT(HELP_USERLISTS, 0),
5298 MPFROMSHORT(HM_RESOURCEID));
5299 break;
5300 }
5301 }
5302 break;
5303
5304 case IDM_EDITANYARCHIVER:
5305 EditArchiverDefinition(hwnd);
5306 break;
5307
5308 case IDM_ABOUT:
5309 WinDlgBox(HWND_DESKTOP, hwnd, AboutDlgProc, FM3ModHandle,
5310 ABT_FRAME, MPVOID);
5311 break;
5312
5313 case IDM_FONTPALETTE:
5314 OpenObject("<WP_FNTPAL>", Default, hwnd);
5315 break;
5316
5317 case IDM_HICOLORPALETTE:
5318 case IDM_COLORPALETTE:
5319 {
5320 CHAR *palette = "<WP_CLRPAL>";
5321 ULONG version[2];
5322
5323 if (!DosQuerySysInfo(QSV_VERSION_MAJOR, QSV_VERSION_MINOR,
5324 (PVOID) & version, (ULONG) sizeof(version)))
5325 {
5326 if (version[0] > 20L || (version[0] == 20L && version[1] > 29L))
5327 {
5328 if (SHORT1FROMMP(mp1) == IDM_HICOLORPALETTE)
5329 palette = "<WP_HIRESCLRPAL>";
5330 else
5331 palette = "<WP_LORESCLRPAL>";
5332 }
5333 }
5334 OpenObject(palette, Default, hwnd);
5335 }
5336 break;
5337
5338 case IDM_SYSTEMSETUP:
5339 OpenObject("<WP_CONFIG>", Default, hwnd);
5340 break;
5341
5342 case IDM_SCHEMEPALETTE:
5343 {
5344 HOBJECT hWPSObject;
5345
5346 hWPSObject = WinQueryObject("<WP_SCHPAL>");
5347 if (hWPSObject != NULLHANDLE)
5348 WinSetObjectData(hWPSObject, "SCHEMES=Winter:PM_Winter,"
5349 "Spring:PM_Spring,Summer:PM_Summer,"
5350 "System:PM_System,Windows:PM_Windows;"
5351 "OPEN=DEFAULT");
5352 }
5353 break;
5354
5355 case IDM_SYSTEMCLOCK:
5356 OpenObject("<WP_CLOCK>", Default, hwnd);
5357 break;
5358
5359#ifdef NEVER
5360 case IDM_SYSINFO:
5361 WinDlgBox(HWND_DESKTOP, HWND_DESKTOP, SysInfoDlgProc, FM3ModHandle,
5362 SYS_FRAME, NULL);
5363 break;
5364#endif
5365
5366 case IDM_INSTANT:
5367 {
5368 CHAR path[CCHMAXPATH];
5369 PCNRITEM pci = (PCNRITEM) 0;
5370
5371 if (hwndTree)
5372 pci = (PCNRITEM) WinSendMsg(hwndTree, CM_QUERYRECORDEMPHASIS,
5373 MPFROMLONG(CMA_FIRST),
5374 MPFROMSHORT(CRA_CURSORED));
5375 if (pci && (INT) pci != -1)
5376 {
5377 strcpy(path, pci -> szFileName);
5378 MakeValidDir(path);
5379 }
5380 else
5381 save_dir2(path);
5382 WinDlgBox(HWND_DESKTOP, hwnd, InstantDlgProc, FM3ModHandle,
5383 BAT_FRAME, MPFROMP(path));
5384 }
5385 break;
5386
5387 case IDM_WINFULLSCREEN:
5388 case IDM_DOSCOMMANDLINE:
5389 case IDM_COMMANDLINE:
5390 {
5391 CHAR *env = GetCmdSpec(FALSE), path[CCHMAXPATH];
5392 INT type = SEPARATE | WINDOWED;
5393
5394 *path = 0;
5395 TopWindowName(hwnd, (HWND)0, path);
5396 if (SHORT1FROMMP(mp1) == IDM_DOSCOMMANDLINE)
5397 env = GetCmdSpec(TRUE);
5398 else if (SHORT1FROMMP(mp1) != IDM_COMMANDLINE)
5399 {
5400 env = "WINOS2.COM";
5401 type = SEPARATE | FULLSCREEN;
5402 }
5403 runemf2(type, hwnd, path, NULL, "%s", env);
5404 }
5405 break;
5406
5407 case IDM_KILLPROC:
5408 WinDlgBox(HWND_DESKTOP, hwnd, KillDlgProc, FM3ModHandle,
5409 KILL_FRAME, NULL);
5410 break;
5411
5412 case IDM_AUTOVIEWCOMMENTS:
5413 case IDM_AUTOVIEWFILE:
5414 if (SHORT1FROMMP(mp1) == IDM_AUTOVIEWFILE)
5415 fComments = FALSE;
5416 else
5417 fComments = TRUE;
5418 PrfWriteProfileData(fmprof, FM3Str, "Comments", &fComments,
5419 sizeof(BOOL));
5420 WinSetWindowText((fComments) ? hwndAutoview : hwndAutoMLE, NullStr);
5421 goto AutoChange;
5422
5423 case IDM_AUTOVIEW:
5424 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER), SHORT1FROMMP(mp1),
5425 &fAutoView, TRUE, "AutoView");
5426 AutoChange:
5427 PostMsg(WinQueryWindow(hwnd, QW_PARENT), WM_UPDATEFRAME,
5428 MPFROMLONG(FCF_SIZEBORDER), MPVOID);
5429 if (fAutoView)
5430 {
5431
5432 CHAR s[CCHMAXPATH];
5433 HWND hwndDir;
5434 PCNRITEM pci;
5435
5436 hwndDir = TopWindowName(hwnd, (HWND)0, s);
5437 if (hwndDir)
5438 {
5439 hwndDir = WinWindowFromID(hwndDir, FID_CLIENT);
5440 if (hwndDir)
5441 {
5442 hwndDir = WinWindowFromID(hwndDir, DIR_CNR);
5443 if (hwndDir)
5444 {
5445 pci = (PCNRITEM) WinSendMsg(hwndDir, CM_QUERYRECORDEMPHASIS,
5446 MPFROMLONG(CMA_FIRST),
5447 MPFROMSHORT(CRA_CURSORED));
5448 if (pci && (INT) pci != -1 &&
5449 (!(driveflags[toupper(*pci -> szFileName) - 'A'] & DRIVE_SLOW)))
5450 WinSendMsg(hwnd,
5451 UM_LOADFILE,
5452 MPFROMP(pci -> szFileName),
5453 (SHORT1FROMMP(mp1) == IDM_AUTOVIEW) ?
5454 MPVOID :
5455 MPFROMLONG(1L));
5456 }
5457 }
5458 }
5459 }
5460 break;
5461
5462 case IDM_TEXTTOOLS:
5463 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER), SHORT1FROMMP(mp1),
5464 &fTextTools, TRUE, "TextTools");
5465 BuildTools(hwndToolback, TRUE);
5466 PostMsg(WinQueryWindow(hwnd, QW_PARENT), WM_UPDATEFRAME,
5467 MPFROMLONG(FCF_SIZEBORDER), MPVOID);
5468 break;
5469
5470 case IDM_TOOLTITLES:
5471 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER), SHORT1FROMMP(mp1),
5472 &fToolTitles, TRUE, "ToolTitles");
5473 BuildTools(hwndToolback, TRUE);
5474 PostMsg(WinQueryWindow(hwnd, QW_PARENT), WM_UPDATEFRAME,
5475 MPFROMLONG(FCF_SIZEBORDER), MPVOID);
5476 break;
5477
5478 case IDM_HIDEMENU:
5479 {
5480 HWND hwndMenu;
5481
5482 hwndMenu = WinQueryWindowULong(hwnd, QWL_USER);
5483 MenuInvisible = (MenuInvisible) ? FALSE : TRUE;
5484 if (MenuInvisible)
5485 {
5486 WinSetParent(hwndMenu, HWND_OBJECT, FALSE);
5487 WinSetMenuItemText(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
5488 FID_SYSMENU), IDM_HIDEMENU,
5489 GetPString(IDS_UNHIDEMENUTEXT));
5490 }
5491 else
5492 {
5493 WinSetParent(hwndMenu, WinQueryWindow(hwnd, QW_PARENT), FALSE);
5494 WinSetMenuItemText(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
5495 FID_SYSMENU), IDM_HIDEMENU,
5496 GetPString(IDS_HIDEMENUTEXT));
5497 }
5498 PostMsg(WinQueryWindow(hwnd, QW_PARENT), WM_UPDATEFRAME,
5499 MPFROMLONG(FCF_MENU), MPVOID);
5500 PrfWriteProfileData(fmprof, FM3Str, "MenuInvisible",
5501 &MenuInvisible, sizeof(BOOL));
5502 }
5503 break;
5504
5505 case IDM_SEEALL:
5506 case IDM_GREP:
5507 case IDM_COLLECTOR:
5508 {
5509 HWND hwndC;
5510 SWP swp;
5511 BOOL already = FALSE;
5512
5513 if (Collector)
5514 already = TRUE;
5515 if (!already && !fAutoTile && !fExternalCollector)
5516 GetNextWindowPos(hwnd, &swp, NULL, NULL);
5517 hwndC = StartCollector((fExternalCollector) ? HWND_DESKTOP :
5518 hwnd, 4);
5519 if (hwndC)
5520 {
5521 if (!already && !fAutoTile && !fExternalCollector)
5522 WinSetWindowPos(hwndC, HWND_TOP, swp.x, swp.y,
5523 swp.cx, swp.cy, SWP_MOVE | SWP_SIZE |
5524 SWP_SHOW | SWP_ZORDER);
5525 else if (fAutoTile && !already)
5526 TileChildren(hwnd, TRUE);
5527 WinSetWindowPos(hwndC, HWND_TOP, 0, 0, 0, 0, SWP_SHOW | SWP_RESTORE |
5528 SWP_ACTIVATE);
5529 if (SHORT1FROMMP(mp1) == IDM_GREP)
5530 PostMsg(WinWindowFromID(hwndC, FID_CLIENT), WM_COMMAND,
5531 MPFROM2SHORT(IDM_GREP, 0), MPVOID);
5532 if (SHORT1FROMMP(mp1) == IDM_SEEALL)
5533 PostMsg(WinWindowFromID(hwndC, FID_CLIENT), WM_COMMAND,
5534 MPFROM2SHORT(IDM_SEEALL, 0), MPVOID);
5535 }
5536 }
5537 break;
5538
5539 case IDM_TOOLLEFT:
5540 case IDM_TOOLRIGHT:
5541 {
5542 TOOL *tool;
5543
5544 if (!toolhead || !toolhead -> next)
5545 {
5546 firsttool = (toolhead) ? toolhead -> id : 0;
5547 break;
5548 }
5549 tool = find_tool(firsttool);
5550 if (!tool)
5551 tool = toolhead;
5552 if (SHORT1FROMMP(mp1) == IDM_TOOLRIGHT)
5553 {
5554 tool = prev_tool(tool, TRUE);
5555 firsttool = tool -> id;
5556 }
5557 else
5558 {
5559 tool = next_tool(tool, TRUE);
5560 firsttool = tool -> id;
5561 }
5562 ResizeTools(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
5563 MAIN_TOOLS));
5564 }
5565 break;
5566
5567 case IDM_CREATETOOL:
5568 BuildTools(hwndToolback,
5569 TRUE);
5570 break;
5571
5572 case IDM_TOOLBAR:
5573 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
5574 IDM_TOOLSUBMENU,
5575 &fToolbar,
5576 TRUE,
5577 "Toolbar");
5578 BuildTools(hwndToolback,
5579 TRUE);
5580 WinShowWindow(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
5581 MAIN_TOOLS),
5582 fToolbar);
5583 WinSendMsg(WinQueryWindow(hwnd, QW_PARENT),
5584 WM_UPDATEFRAME,
5585 MPFROMLONG(FCF_SIZEBORDER),
5586 MPVOID);
5587 if (fDrivebar)
5588 WinInvalidateRect(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
5589 MAIN_DRIVES),
5590 NULL,
5591 TRUE);
5592 break;
5593
5594 case IDM_DRIVEBAR:
5595 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
5596 IDM_DRIVEBAR,
5597 &fDrivebar,
5598 TRUE,
5599 "Drivebar");
5600 WinShowWindow(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
5601 MAIN_DRIVES),
5602 fDrivebar);
5603 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
5604 WM_UPDATEFRAME,
5605 MPFROMLONG(FCF_SIZEBORDER),
5606 MPVOID);
5607 PostMsg(hwnd,
5608 UM_BUILDDRIVEBAR,
5609 MPVOID,
5610 MPVOID);
5611 break;
5612
5613 case IDM_USERLIST:
5614 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
5615 SHORT1FROMMP(mp1),
5616 &fUserComboBox,
5617 TRUE,
5618 "UserComboBox");
5619 WinShowWindow(hwndUserlist, fUserComboBox);
5620 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
5621 WM_UPDATEFRAME,
5622 MPFROMLONG(FCF_SIZEBORDER),
5623 MPVOID);
5624 PostMsg(hwnd,
5625 UM_FILLUSERLIST,
5626 MPVOID,
5627 MPVOID);
5628 PostMsg(hwnd,
5629 UM_FILLSETUPLIST,
5630 MPVOID,
5631 MPVOID);
5632 PostMsg(hwnd,
5633 UM_FILLCMDLIST,
5634 MPVOID,
5635 MPVOID);
5636 PostMsg(hwnd,
5637 UM_FILLBUTTONLIST,
5638 MPVOID,
5639 MPVOID);
5640 break;
5641
5642 case IDM_MOREBUTTONS:
5643 WinSetWindowText(hwndName, NullStr);
5644 WinSetWindowText(hwndDate, NullStr);
5645 WinSetWindowText(hwndAttr, NullStr);
5646 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
5647 SHORT1FROMMP(mp1),
5648 &fMoreButtons,
5649 TRUE,
5650 "MoreButtons");
5651 if (fMoreButtons)
5652 {
5653
5654 HWND hwndTemp;
5655
5656 hwndTemp = TopWindow(hwnd, (HWND)0);
5657
5658 if (hwndTemp)
5659 {
5660 WinSetFocus(HWND_DESKTOP,
5661 hwnd);
5662 WinSetFocus(HWND_DESKTOP,
5663 hwndTemp);
5664 }
5665 }
5666 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
5667 WM_UPDATEFRAME,
5668 MPFROMLONG(FCF_SIZEBORDER),
5669 MPVOID);
5670 break;
5671
5672 case IDM_FREETREE:
5673 if (fFreeTree)
5674 {
5675
5676 SWP swp, swpT;
5677
5678 WinQueryWindowPos(hwndTree, &swpT);
5679 WinQueryWindowPos(hwnd, &swp);
5680 WinSetWindowPos(hwndTree, HWND_TOP, 0, swp.cy - swpT.cy, 0, 0, SWP_MOVE);
5681 }
5682 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER), SHORT1FROMMP(mp1),
5683 &fFreeTree, TRUE, "FreeTree");
5684 if (fAutoTile)
5685 TileChildren(hwnd, TRUE);
5686 break;
5687
5688 case IDM_AUTOTILE:
5689 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
5690 SHORT1FROMMP(mp1),
5691 &fAutoTile,
5692 TRUE,
5693 "AutoTile");
5694 if (fAutoTile)
5695 TileChildren(hwnd, TRUE);
5696 break;
5697
5698 case IDM_TILEBACKWARDS:
5699 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
5700 SHORT1FROMMP(mp1),
5701 &fTileBackwards,
5702 TRUE,
5703 "TileBackwards");
5704 if (fAutoTile)
5705 TileChildren(hwnd, TRUE);
5706 break;
5707
5708 case IDM_NEXTWINDOW:
5709 case IDM_PREVWINDOW:
5710 NextChild(hwnd,
5711 (SHORT1FROMMP(mp1) == IDM_PREVWINDOW));
5712 break;
5713
5714 case IDM_CASCADE:
5715 CascadeChildren(hwnd);
5716 break;
5717
5718 case IDM_TILE:
5719 TileChildren(hwnd, TRUE);
5720 break;
5721
5722 case IDM_RESTORE:
5723 MinResChildren(hwnd,
5724 SWP_RESTORE);
5725 break;
5726
5727 case IDM_MINIMIZE:
5728 MinResChildren(hwnd,
5729 SWP_MINIMIZE);
5730 break;
5731
5732 case IDM_ARRANGEICONS:
5733 ArrangeIcons(hwnd);
5734 break;
5735
5736 case IDM_INIVIEWER:
5737 StartIniEditor(hwnd, NULL, 4);
5738 break;
5739
5740 case IDM_EDITASSOC:
5741 EditAssociations(hwnd);
5742 break;
5743
5744 case IDM_EDITCOMMANDS:
5745 EditCommands(hwnd);
5746 PostMsg(hwnd,
5747 UM_FILLCMDLIST,
5748 MPVOID,
5749 MPVOID);
5750 break;
5751
5752 default:
5753 if (!SwitchCommand((HWND)WinQueryWindowULong(hwnd, QWL_USER),
5754 SHORT1FROMMP(mp1)))
5755 {
5756 if (SHORT1FROMMP(mp1) >= IDM_COMMANDSTART &&
5757 SHORT1FROMMP(mp1) < IDM_QUICKTOOLSTART)
5758 {
5759
5760 INT x;
5761 HWND hwndCnr;
5762
5763 if (!cmdloaded)
5764 load_commands();
5765 hwndCnr = TopWindow(hwnd, (HWND)0);
5766 hwndCnr = (HWND)WinSendMsg(WinWindowFromID(hwndCnr, FID_CLIENT),
5767 UM_CONTAINERHWND,
5768 MPVOID,
5769 MPVOID);
5770 if (!hwndCnr) {
5771 Runtime_Error2(pszSrcFile, __LINE__, IDS_NOWINDOWTEXT);
5772 break;
5773 }
5774 x = SHORT1FROMMP(mp1) - IDM_COMMANDSTART;
5775 if (x >= 0)
5776 {
5777 x++;
5778 RunCommand(hwndCnr, x);
5779 if (fUnHilite)
5780 {
5781
5782 PCNRITEM pci;
5783 DIRCNRDATA *dcd = NULL;
5784
5785 if (WinQueryWindowUShort(hwndCnr, QWS_ID) != TREE_CNR)
5786 dcd = INSTDATA(hwndCnr);
5787 pci = (PCNRITEM) WinSendMsg(hwndCnr,
5788 CM_QUERYRECORDEMPHASIS,
5789 MPFROMLONG(CMA_FIRST),
5790 MPFROMSHORT(CRA_CURSORED));
5791 if (pci && (INT) pci != -1 &&
5792 (pci -> rc.flRecordAttr & CRA_SELECTED))
5793 UnHilite(hwnd,
5794 TRUE,
5795 ((dcd) ? &dcd -> lastselection : NULL));
5796 }
5797 }
5798 }
5799 else if (SHORT1FROMMP(mp1) >= IDM_QUICKTOOLSTART &&
5800 SHORT1FROMMP(mp1) < IDM_QUICKTOOLSTART + 50)
5801 {
5802 if (!qtloaded)
5803 load_quicktools();
5804 if (quicktool[SHORT1FROMMP(mp1) - IDM_QUICKTOOLSTART])
5805 {
5806 if (fToolsChanged)
5807 save_tools(NULL);
5808 if (!load_tools(quicktool[SHORT1FROMMP(mp1) - IDM_QUICKTOOLSTART]))
5809 load_tools(NULL);
5810 else
5811 {
5812 strcpy(lasttoolbox,
5813 quicktool[SHORT1FROMMP(mp1) - IDM_QUICKTOOLSTART]);
5814 PrfWriteProfileString(fmprof,
5815 FM3Str,
5816 "LastToolBox",
5817 lasttoolbox);
5818 }
5819 BuildTools(hwndToolback,
5820 TRUE);
5821 }
5822 }
5823 else
5824 {
5825
5826 HWND hwndActive;
5827
5828 hwndActive = TopWindow(hwnd,
5829 (HWND)0);
5830 if (hwndActive)
5831 PostMsg(WinWindowFromID(hwndActive, FID_CLIENT),
5832 WM_COMMAND,
5833 mp1,
5834 mp2);
5835 }
5836 }
5837 break;
5838 }
5839 return 0;
5840}
5841
5842static MRESULT EXPENTRY MainWMOnce(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
5843{
5844 TID tid;
5845 SWP swp;
5846 PFNWP oldproc;
5847 HWND hwndTmp;
5848 HWND hwndFrame;
5849 HWND hwndSysMenu, hwndSysSubMenu, hwndMenu;
5850 USHORT idSysMenu;
5851 MENUITEM mi, mit;
5852 ULONG size;
5853 BOOL temp = FALSE;
5854
5855 switch (msg) {
5856 case WM_CREATE:
5857 WinQueryWindowProcess(hwnd,&mypid,&tid);
5858 hwndMain = hwnd;
5859 WinSetWindowUShort(hwnd, QWL_USER + 8, 0);
5860 WinSetWindowUShort(hwnd, QWL_USER + 10, 0);
5861 WinSetWindowUShort(hwnd, QWL_USER + 12, 0);
5862 WinSetWindowUShort(hwnd, QWL_USER + 16, 0);
5863 if (_beginthread(MakeMainObjWin,NULL,245760,MPVOID) == -1) {
5864 Runtime_Error(pszSrcFile, __LINE__, GetPString(IDS_COULDNTSTARTTHREADTEXT));
5865 PostMsg(hwnd,WM_CLOSE,MPVOID,MPVOID);
5866 return 0;
5867 }
5868 else
5869 DosSleep(64);
5870
5871 hwndFrame = WinQueryWindow(hwnd, QW_PARENT);
5872
5873 /*
5874 * create frame children (not client children, frame children)
5875 */
5876 DosSleep(1L);
5877 WinQueryWindowPos(hwndFrame, &swp);
5878 oldproc = WinSubclassWindow(hwndFrame,MainFrameWndProc);
5879 WinSetWindowPtr(hwndFrame,QWL_USER,(PVOID)oldproc);
5880 CommonCreateMainChildren(hwnd, &swp);
5881
5882 if (!WinCreateWindow(hwndFrame,
5883 WC_BUTTON,
5884 "I",
5885 WS_VISIBLE | BS_PUSHBUTTON | BS_NOPOINTERFOCUS,
5886 ((swp.cx -
5887 WinQuerySysValue(HWND_DESKTOP,
5888 SV_CXMINMAXBUTTON)) -
5889 WinQuerySysValue(HWND_DESKTOP,
5890 SV_CXMINMAXBUTTON) / 2) -
5891 WinQuerySysValue(HWND_DESKTOP,
5892 SV_CXSIZEBORDER),
5893 (swp.cy - WinQuerySysValue(HWND_DESKTOP,
5894 SV_CYMINMAXBUTTON)) -
5895 WinQuerySysValue(HWND_DESKTOP,
5896 SV_CYSIZEBORDER),
5897 WinQuerySysValue(HWND_DESKTOP,
5898 SV_CXMINMAXBUTTON) / 2,
5899 WinQuerySysValue(HWND_DESKTOP,
5900 SV_CYMINMAXBUTTON),
5901 hwnd,
5902 HWND_TOP,
5903 IDM_IDEALSIZE,
5904 NULL,
5905 NULL))
5906 {
5907 Win_Error2(hwnd,hwnd,pszSrcFile,__LINE__,IDS_WINCREATEWINDOW);
5908 }
5909 else {
5910 WinSubclassWindow(WinWindowFromID(hwndFrame,IDM_IDEALSIZE),
5911 IdealButtonProc);
5912 SetPresParams(WinWindowFromID(hwndFrame,
5913 IDM_IDEALSIZE),
5914 NULL,
5915 NULL,
5916 NULL,
5917 GetPString(IDS_10SYSTEMVIOTEXT));
5918 }
5919
5920 hwndTmp = WinCreateWindow(hwndFrame,
5921 WC_BUTTON,
5922 "#1019",
5923 WS_VISIBLE | BS_PUSHBUTTON | BS_NOPOINTERFOCUS |
5924 BS_BITMAP,
5925 swp.cx - 46,
5926 swp.y + 2,
5927 24,
5928 22,
5929 hwnd,
5930 HWND_TOP,
5931 IDM_OPENWALK,
5932 NULL,
5933 NULL);
5934 if (!hwndTmp)
5935 Win_Error2(hwnd,hwnd,pszSrcFile,__LINE__,IDS_WINCREATEWINDOW);
5936
5937 hwndTmp = WinCreateWindow(hwndFrame,
5938 WC_BUTTON,
5939 "#3062",
5940 WS_VISIBLE | BS_PUSHBUTTON | BS_NOPOINTERFOCUS |
5941 BS_BITMAP,
5942 swp.cx - 22,
5943 swp.y + 2,
5944 24,
5945 22,
5946 hwnd,
5947 HWND_TOP,
5948 IDM_USERLIST,
5949 NULL,
5950 NULL);
5951 if (!hwndTmp)
5952 Win_Error2(hwnd,hwnd,pszSrcFile,__LINE__,IDS_WINCREATEWINDOW);
5953
5954 hwndUserlist = WinCreateWindow(hwndFrame,
5955 WC_COMBOBOX,
5956 (PSZ) NULL,
5957 WS_VISIBLE | CBS_DROPDOWN |
5958 LS_HORZSCROLL,
5959 (swp.x +
5960 WinQuerySysValue(HWND_DESKTOP,
5961 SV_CXSIZEBORDER) + 48L),
5962 (swp.cy -
5963 WinQuerySysValue(HWND_DESKTOP,
5964 SV_CYSIZEBORDER)) - 60,
5965 ((swp.cx -
5966 (WinQuerySysValue(HWND_DESKTOP,
5967 SV_CXSIZEBORDER) * 2)) - 64L),
5968 60L,
5969 hwndFrame,
5970 HWND_TOP,
5971 MAIN_USERLIST,
5972 NULL,
5973 NULL);
5974 if (!hwndUserlist)
5975 Win_Error2(hwnd,hwnd,pszSrcFile,__LINE__,IDS_WINCREATEWINDOW);
5976 hwndCmdlist = WinCreateWindow(hwndFrame,
5977 WC_COMBOBOX,
5978 (PSZ) NULL,
5979 WS_VISIBLE | CBS_DROPDOWN |
5980 LS_HORZSCROLL,
5981 (swp.x +
5982 WinQuerySysValue(HWND_DESKTOP,
5983 SV_CXSIZEBORDER) + 48L),
5984 (swp.cy -
5985 WinQuerySysValue(HWND_DESKTOP,
5986 SV_CYSIZEBORDER)) - 60,
5987 ((swp.cx -
5988 (WinQuerySysValue(HWND_DESKTOP,
5989 SV_CXSIZEBORDER) * 2)) - 64L),
5990 60L,
5991 hwndFrame,
5992 HWND_TOP,
5993 MAIN_CMDLIST,
5994 NULL,
5995 NULL);
5996 if (!hwndCmdlist)
5997 Win_Error2(hwnd,hwnd,pszSrcFile,__LINE__,IDS_WINCREATEWINDOW);
5998 WinSetWindowText(hwndCmdlist,
5999 GetPString(IDS_COMMANDSTEXT));
6000 hwndStatelist = WinCreateWindow(hwndFrame,
6001 WC_COMBOBOX,
6002 (PSZ) NULL,
6003 WS_VISIBLE | CBS_DROPDOWN |
6004 LS_HORZSCROLL,
6005 (swp.x +
6006 WinQuerySysValue(HWND_DESKTOP,
6007 SV_CXSIZEBORDER) + 48L),
6008 (swp.cy -
6009 WinQuerySysValue(HWND_DESKTOP,
6010 SV_CYSIZEBORDER)) - 60,
6011 ((swp.cx -
6012 (WinQuerySysValue(HWND_DESKTOP,
6013 SV_CXSIZEBORDER) * 2)) - 64L),
6014 60L,
6015 hwndFrame,
6016 HWND_TOP,
6017 MAIN_SETUPLIST,
6018 NULL,
6019 NULL);
6020 if (!hwndStatelist)
6021 Win_Error2(hwnd,hwnd,pszSrcFile,__LINE__,IDS_WINCREATEWINDOW);
6022 hwndDrivelist = WinCreateWindow(hwndFrame,
6023 WC_COMBOBOX,
6024 (PSZ) NULL,
6025 WS_VISIBLE | CBS_DROPDOWN,
6026 (swp.x +
6027 WinQuerySysValue(HWND_DESKTOP,
6028 SV_CXSIZEBORDER)),
6029 (swp.cy -
6030 WinQuerySysValue(HWND_DESKTOP,
6031 SV_CYSIZEBORDER)) - 60,
6032 48L,
6033 60L,
6034 hwndFrame,
6035 HWND_TOP,
6036 MAIN_DRIVELIST,
6037 NULL,
6038 NULL);
6039 if (!hwndDrivelist)
6040 Win_Error2(hwnd,hwnd,pszSrcFile,__LINE__,IDS_WINCREATEWINDOW);
6041 SetPresParams(hwndDrivelist,
6042 NULL,
6043 NULL,
6044 NULL,
6045 GetPString(IDS_10SYSTEMMONOTEXT));
6046 hwndButtonlist = WinCreateWindow(hwndFrame,
6047 WC_COMBOBOX,
6048 (PSZ) NULL,
6049 WS_VISIBLE | CBS_DROPDOWN |
6050 LS_HORZSCROLL,
6051 (swp.cx -
6052 WinQuerySysValue(HWND_DESKTOP,
6053 SV_CXSIZEBORDER)) - 164L,
6054 (swp.cy -
6055 WinQuerySysValue(HWND_DESKTOP,
6056 SV_CYSIZEBORDER)) - 60,
6057 164L,
6058 60L,
6059 hwndFrame,
6060 HWND_TOP,
6061 MAIN_BUTTONLIST,
6062 NULL,
6063 NULL);
6064 if (!hwndButtonlist)
6065 Win_Error2(hwnd,hwnd,pszSrcFile,__LINE__,IDS_WINCREATEWINDOW);
6066 WinSendMsg(WinWindowFromID(hwndUserlist, CBID_EDIT),
6067 EM_SETTEXTLIMIT,
6068 MPFROM2SHORT(CCHMAXPATH, 0),
6069 MPVOID);
6070 WinSendMsg(WinWindowFromID(hwndStatelist, CBID_EDIT),
6071 EM_SETTEXTLIMIT,
6072 MPFROM2SHORT(13, 0),
6073 MPVOID);
6074 WinSendMsg(WinWindowFromID(hwndDrivelist, CBID_EDIT),
6075 EM_SETREADONLY,
6076 MPFROM2SHORT(TRUE, 0),
6077 MPVOID);
6078 WinSendMsg(WinWindowFromID(hwndButtonlist, CBID_EDIT),
6079 EM_SETREADONLY,
6080 MPFROM2SHORT(TRUE, 0),
6081 MPVOID);
6082 WinSendMsg(WinWindowFromID(hwndCmdlist, CBID_EDIT),
6083 EM_SETREADONLY,
6084 MPFROM2SHORT(TRUE, 0),
6085 MPVOID);
6086
6087 oldproc = WinSubclassWindow(WinWindowFromID(hwndUserlist, CBID_EDIT),
6088 DropDownListProc);
6089 WinSetWindowPtr(WinWindowFromID(hwndUserlist, CBID_EDIT),
6090 QWL_USER,
6091 (PVOID)oldproc);
6092 oldproc = WinSubclassWindow(WinWindowFromID(hwndCmdlist, CBID_EDIT),
6093 DropDownListProc);
6094 WinSetWindowPtr(WinWindowFromID(hwndCmdlist, CBID_EDIT),
6095 QWL_USER,
6096 (PVOID)oldproc);
6097 oldproc = WinSubclassWindow(WinWindowFromID(hwndButtonlist, CBID_EDIT),
6098 DropDownListProc);
6099 WinSetWindowPtr(WinWindowFromID(hwndButtonlist, CBID_EDIT),
6100 QWL_USER,
6101 (PVOID)oldproc);
6102 oldproc = WinSubclassWindow(WinWindowFromID(hwndStatelist, CBID_EDIT),
6103 DropDownListProc);
6104 WinSetWindowPtr(WinWindowFromID(hwndStatelist, CBID_EDIT),
6105 QWL_USER,
6106 (PVOID)oldproc);
6107 oldproc = WinSubclassWindow(WinWindowFromID(hwndDrivelist, CBID_EDIT),
6108 DropDownListProc);
6109 WinSetWindowPtr(WinWindowFromID(hwndDrivelist, CBID_EDIT),
6110 QWL_USER,
6111 (PVOID)oldproc);
6112 oldproc = WinSubclassWindow(hwndUserlist,DropDownListProc);
6113 WinSetWindowPtr(hwndUserlist,QWL_USER,(PVOID)oldproc);
6114 oldproc = WinSubclassWindow(hwndCmdlist,DropDownListProc);
6115 WinSetWindowPtr(hwndCmdlist,QWL_USER,(PVOID)oldproc);
6116 oldproc = WinSubclassWindow(hwndStatelist,DropDownListProc);
6117 WinSetWindowPtr(hwndStatelist,QWL_USER,(PVOID)oldproc);
6118 oldproc = WinSubclassWindow(hwndDrivelist,
6119 DropDownListProc);
6120 WinSetWindowPtr(hwndDrivelist, QWL_USER, (PVOID) oldproc);
6121 oldproc = WinSubclassWindow(hwndButtonlist,DropDownListProc);
6122 WinSetWindowPtr(hwndButtonlist,QWL_USER,(PVOID)oldproc);
6123 oldproc = WinSubclassWindow(WinWindowFromID(hwndFrame,IDM_USERLIST),
6124 ChildFrameButtonProc);
6125 WinSetWindowPtr(WinWindowFromID(hwndFrame,IDM_USERLIST),
6126 QWL_USER,
6127 (PVOID)oldproc);
6128 oldproc = WinSubclassWindow(WinWindowFromID(hwndFrame,IDM_OPENWALK),
6129 ChildFrameButtonProc);
6130 WinSetWindowPtr(WinWindowFromID(hwndFrame,IDM_OPENWALK),
6131 QWL_USER,
6132 (PVOID)oldproc);
6133 hwndMenu = WinWindowFromID(hwndFrame,FID_MENU);
6134 WinSendMsg(hwnd,UM_ADDTOMENU,MPVOID,MPVOID);
6135 SetToggleChecks(hwndMenu);
6136 SetConditionalCascade(hwndMenu,
6137 IDM_TOOLSUBMENU,
6138 IDM_TOOLBAR);
6139 SetConditionalCascade(hwndMenu,
6140 IDM_AUTOVIEWSUBMENU,
6141 IDM_AUTOVIEW);
6142 SetConditionalCascade(hwndMenu,
6143 IDM_TILEMENU,
6144 IDM_TILE);
6145 WinSetWindowULong(hwnd,QWL_USER,hwndMenu);
6146 memset(&mi, 0, sizeof(mi));
6147 memset(&mit, 0, sizeof(mit));
6148 hwndSysMenu = WinWindowFromID(hwndFrame,FID_SYSMENU);
6149 idSysMenu = SHORT1FROMMR(WinSendMsg(hwndSysMenu,
6150 MM_ITEMIDFROMPOSITION,
6151 MPVOID,
6152 MPVOID));
6153 WinSendMsg(hwndSysMenu,
6154 MM_QUERYITEM,
6155 MPFROM2SHORT(idSysMenu, 0),
6156 MPFROMP(&mit));
6157 hwndSysSubMenu = mit.hwndSubMenu;
6158 mi.iPosition = MIT_END;
6159 mi.afStyle = MIS_SEPARATOR;
6160 mi.id = (USHORT) -1;
6161 WinSendMsg(hwndSysSubMenu,
6162 MM_INSERTITEM,
6163 MPFROMP(&mi),
6164 MPFROMP(NULL));
6165 mi.afStyle = MIS_TEXT;
6166 mi.id = IDM_IDEALSIZE;
6167 WinSendMsg(hwndSysSubMenu,
6168 MM_INSERTITEM,
6169 MPFROMP(&mi),
6170 MPFROMP(GetPString(IDS_IDEALMENUTEXT)));
6171 mi.afStyle = MIS_TEXT;
6172 mi.id = IDM_HIDEMENU;
6173 WinSendMsg(hwndSysSubMenu,
6174 MM_INSERTITEM,
6175 MPFROMP(&mi),
6176 MPFROMP(GetPString(IDS_HIDEMENUTEXT)));
6177 SetSysMenu(hwndSysMenu);
6178
6179 size = sizeof(BOOL);
6180 if (PrfQueryProfileData(fmprof,
6181 FM3Str,
6182 "MenuInvisible",
6183 &temp,
6184 &size) &&
6185 size &&
6186 temp)
6187 WinSendMsg(hwnd,
6188 WM_COMMAND,
6189 MPFROM2SHORT(IDM_HIDEMENU, 0),
6190 MPVOID);
6191 size = sizeof(BOOL);
6192 if (PrfQueryProfileData(fmprof,
6193 FM3Str,
6194 "FreeTree",
6195 &temp,
6196 &size) &&
6197 size &&
6198 temp)
6199 WinSendMsg(hwnd,
6200 WM_COMMAND,
6201 MPFROM2SHORT(IDM_FREETREE, 0),
6202 MPVOID);
6203 size = sizeof(BOOL);
6204 if (PrfQueryProfileData(fmprof,
6205 FM3Str,
6206 "AutoTile",
6207 &temp,
6208 &size) &&
6209 size &&
6210 !temp)
6211 WinSendMsg(hwnd,
6212 WM_COMMAND,
6213 MPFROM2SHORT(IDM_AUTOTILE, 0),
6214 MPVOID);
6215 size = sizeof(BOOL);
6216 if (PrfQueryProfileData(fmprof,
6217 FM3Str,
6218 "Toolbar",
6219 &temp,
6220 &size) &&
6221 size &&
6222 !temp)
6223 WinSendMsg(hwnd,
6224 WM_COMMAND,
6225 MPFROM2SHORT(IDM_TOOLBAR, 0),
6226 MPVOID);
6227
6228 WinSetWindowText(WinWindowFromID(hwndFrame,FID_TITLEBAR),"FM/2");
6229 FixSwitchList(hwndFrame,NULL);
6230 break; // WM_CREATE
6231
6232 case UM_SETUP:
6233 /*
6234 * start up some initial children
6235 */
6236 load_tools(NULL);
6237 BuildTools(hwndToolback,TRUE);
6238 WinShowWindow(WinQueryWindow(hwnd, QW_PARENT),TRUE);
6239 PostMsg(MainObjectHwnd,UM_SETUP2,mp1,mp2);
6240 return 0;
6241
6242 case UM_SETUP2:
6243 {
6244 SWP swp;
6245 ULONG size = sizeof(SWP);
6246
6247 WinQueryWindowPos(hwnd, &swp);
6248 hwndTree = StartTreeCnr(hwnd, 0);
6249 if (!hwndTree)
6250 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
6251 else
6252 {
6253 if (!fSaveState ||
6254 !PrfQueryProfileData(fmprof,
6255 FM3Str,
6256 "LastTreePos",
6257 &swp,
6258 &size) ||
6259 size != sizeof(SWP))
6260 {
6261
6262 INT ratio, height = 0;
6263
6264 if (!fNoTreeGap)
6265 height = WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2;
6266 size = sizeof(ratio);
6267 if (!PrfQueryProfileData(fmprof,
6268 FM3Str,
6269 "TreeWindowRatio",
6270 (PVOID) & ratio,
6271 &size) ||
6272 size < sizeof(ratio))
6273 ratio = 400;
6274 WinSetWindowPos(hwndTree,
6275 HWND_TOP,
6276 0,
6277 height,
6278 (swp.cx * 100) / ratio,
6279 swp.cy - height,
6280 SWP_SHOW | SWP_SIZE | SWP_MOVE |
6281 SWP_ACTIVATE | SWP_ZORDER);
6282 }
6283 else
6284 WinSetWindowPos(hwndTree,
6285 HWND_TOP,
6286 swp.x,
6287 swp.y,
6288 swp.cx,
6289 swp.cy,
6290 swp.fl | SWP_MOVE | SWP_SIZE | SWP_SHOW |
6291 SWP_ZORDER | SWP_ACTIVATE);
6292 }
6293 ResizeTools(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
6294 MAIN_TOOLS));
6295 }
6296 PostMsg(MainObjectHwnd,UM_SETUP3,mp1,mp2);
6297 return 0;
6298
6299 case UM_SETUP3:
6300 /* start remaining child windows */
6301 if (!fNoSaveState && fSaveState)
6302 PostMsg(MainObjectHwnd,UM_RESTORE,MPVOID,MPVOID);
6303 PostMsg(MainObjectHwnd,UM_SETUP4,mp1,mp2);
6304 return 0;
6305
6306 case UM_SETUP4:
6307 {
6308 INT argc = (INT) mp1, x;
6309 CHAR **argv = (CHAR **) mp2;
6310
6311 for (x = 1; x < argc; x++) {
6312 if (*argv[x] == '/' || *argv[x] == ';')
6313 continue;
6314 if (!IsFile(argv[x]) &&
6315 !FindDirCnrByName(argv[x], FALSE))
6316 OpenDirCnr((HWND)0,
6317 hwndMain,
6318 hwndTree,
6319 TRUE,
6320 argv[x]);
6321 }
6322 }
6323 PostMsg(MainObjectHwnd,UM_SETUP5,MPVOID,MPVOID);
6324 return 0;
6325
6326 case UM_SETUP5:
6327 if (fAutoTile)
6328 TileChildren(hwnd, TRUE);
6329 PostMsg(hwnd,UM_FILLUSERLIST,MPVOID,MPVOID);
6330 PostMsg(hwnd,UM_FILLSETUPLIST,MPVOID,MPVOID);
6331 PostMsg(hwnd,UM_FILLCMDLIST,MPVOID,MPVOID);
6332 PostMsg(hwnd,UM_FILLBUTTONLIST,MPVOID,MPVOID);
6333 {
6334 HWND hwndActive;
6335
6336 hwndActive = TopWindow(hwnd, hwndTree);
6337 if (hwndActive)
6338 WinSetWindowPos(hwndActive,
6339 HWND_TOP,
6340 0,
6341 0,
6342 0,
6343 0,
6344 SWP_ACTIVATE);
6345 }
6346 if (fStartMinimized || fReminimize)
6347 PostMsg(hwndTree,UM_MINIMIZE,MPVOID,MPVOID);
6348 else if (fStartMaximized)
6349 PostMsg(hwndTree,UM_MAXIMIZE,MPVOID,MPVOID);
6350 fRunning = TRUE;
6351 return 0;
6352 }
6353
6354 return WinDefWindowProc(hwnd, msg, mp1, mp2);
6355}
6356
6357MRESULT EXPENTRY MainWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
6358{
6359 switch (msg)
6360 {
6361 case WM_CREATE:
6362 case UM_SETUP:
6363 case UM_SETUP2:
6364 case UM_SETUP3:
6365 case UM_SETUP4:
6366 case UM_SETUP5:
6367 return MainWMOnce(hwnd, msg, mp1, mp2);
6368
6369 case WM_CONTROLPOINTER:
6370 if (!fNoFinger &&
6371 (SHORT1FROMMP(mp1) == IDM_OPENWALK ||
6372 SHORT1FROMMP(mp1) == IDM_USERLIST))
6373 return MRFROMLONG(hptrFinger);
6374 break;
6375
6376 case UM_LOADFILE:
6377 case UM_THREADUSE:
6378 case UM_BUILDDRIVEBAR:
6379 return CommonMainWndProc(hwnd, msg, mp1, mp2);
6380
6381 case WM_BUTTON1UP:
6382 case WM_BUTTON2UP:
6383 case WM_BUTTON3UP:
6384 case WM_MOUSEMOVE:
6385 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
6386 break;
6387
6388 case WM_CHAR:
6389 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
6390 break;
6391
6392 case WM_MENUEND:
6393 if ((HWND)mp2 == MainPopupMenu)
6394 {
6395 WinDestroyWindow(MainPopupMenu);
6396 MainPopupMenu = (HWND)0;
6397 }
6398 break;
6399
6400 case UM_CONTEXTMENU:
6401 case WM_CONTEXTMENU:
6402 if (CheckMenu(&MainPopupMenu, MAIN_POPUP))
6403 {
6404 SetToggleChecks(MainPopupMenu);
6405 PopupMenu(hwnd, hwnd, MainPopupMenu);
6406 }
6407 if (msg == UM_CONTEXTMENU)
6408 return 0;
6409 return MRFROMSHORT(TRUE);
6410
6411 case UM_SETUSERLISTNAME:
6412 if (mp1)
6413 {
6414 if (fUserComboBox)
6415 WinSetWindowText(WinWindowFromID(hwndUserlist, CBID_EDIT),
6416 (CHAR *) mp1);
6417 if (add_udir(FALSE, (CHAR *) mp1))
6418 {
6419 if (fUserComboBox)
6420 {
6421 if (fAutoAddDirs)
6422 WinSendMsg(hwndUserlist, LM_INSERTITEM,
6423 MPFROM2SHORT(LIT_SORTASCENDING, 0),
6424 MPFROMP((CHAR *) mp1));
6425 }
6426 }
6427 }
6428 return 0;
6429
6430 case UM_ARRANGEICONS:
6431 ArrangeIcons(hwnd);
6432 return 0;
6433
6434 case WM_CHORD:
6435 PostMsg(hwnd,
6436 WM_COMMAND,
6437 MPFROM2SHORT(IDM_WINDOWDLG, 0),
6438 MPVOID);
6439 break;
6440
6441 case WM_SETFOCUS:
6442 if (mp2)
6443 PostMsg(hwnd,
6444 UM_FOCUSME,
6445 MPVOID,
6446 MPVOID);
6447 break;
6448
6449 case UM_FOCUSME:
6450 WinSetFocus(hwndTree,
6451 TRUE);
6452 return 0;
6453
6454 case UM_RESCAN:
6455 TileChildren(hwnd, TRUE);
6456 return 0;
6457
6458 case WM_SAVEAPPLICATION:
6459 {
6460 SWP swp;
6461
6462 WinQueryWindowPos(WinQueryWindow(hwnd, QW_PARENT), &swp);
6463 if (!(swp.fl & (SWP_HIDE | SWP_MINIMIZE)))
6464 {
6465 WinStoreWindowPos(FM2Str,
6466 "MainWindowPos",
6467 WinQueryWindow(hwnd, QW_PARENT));
6468 if (!fNoSaveState && fSaveState)
6469 SaveDirCnrState(hwnd, NULL);
6470 }
6471 }
6472 break;
6473
6474 case MM_PORTHOLEINIT:
6475 switch (SHORT1FROMMP(mp1))
6476 {
6477 case 0:
6478 case 1:
6479 {
6480 HWND hwndCurrent;
6481 ULONG wmsg;
6482
6483 wmsg = (SHORT1FROMMP(mp1) == 0) ? UM_FILESMENU : UM_VIEWSMENU;
6484 hwndCurrent = TopWindow(hwnd, (HWND)0);
6485 PortholeInit((HWND)WinSendMsg(WinWindowFromID(hwndCurrent,
6486 FID_CLIENT), wmsg, MPVOID,
6487 MPVOID), mp1, mp2);
6488 }
6489 break;
6490 }
6491 break;
6492
6493 case WM_INITMENU:
6494 switch (SHORT1FROMMP(mp1))
6495 {
6496 case IDM_CONFIGMENU:
6497 SetToggleChecks((HWND)WinQueryWindowULong(hwnd, QWL_USER));
6498 break;
6499
6500 case IDM_WINDOWSMENU:
6501 /*
6502 * add child windows of client
6503 * and switchlist entries to end of pulldown menu
6504 */
6505 {
6506 HWND hwndMenu, hwndSubMenu;
6507 MENUITEM mi;
6508
6509 hwndMenu = WinQueryWindowULong(hwnd, QWL_USER);
6510 memset(&mi, 0, sizeof(mi));
6511 mi.iPosition = MIT_END;
6512 mi.afStyle = MIS_TEXT;
6513 if (!WinSendMsg(hwndMenu, MM_QUERYITEM,
6514 MPFROM2SHORT(IDM_WINDOWSMENU, TRUE),
6515 MPFROMP(&mi)))
6516 break;
6517 hwndSubMenu = mi.hwndSubMenu;
6518 SetupWinList(hwndSubMenu,
6519 hwnd,
6520 WinQueryWindow(hwnd, QW_PARENT));
6521 }
6522 break;
6523
6524 default:
6525 {
6526 HWND hwndCurrent;
6527
6528 hwndCurrent = TopWindow(hwnd, (HWND)0);
6529 if (hwndCurrent)
6530 WinSendMsg(hwndCurrent, UM_INITMENU, mp1, mp2);
6531 }
6532 break;
6533 }
6534 break;
6535
6536 case UM_ADDTOMENU:
6537 AddToMenu((CHAR *) mp1, WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
6538 FID_MENU));
6539 return 0;
6540
6541 case UM_FILLCMDLIST:
6542 WinSendMsg(hwndCmdlist, LM_DELETEALL, MPVOID, MPVOID);
6543 if (!cmdloaded)
6544 load_commands();
6545 if (cmdhead)
6546 {
6547
6548 LINKCMDS *info;
6549
6550 info = cmdhead;
6551 while (info)
6552 {
6553 WinSendMsg(hwndCmdlist, LM_INSERTITEM,
6554 MPFROM2SHORT(LIT_END, 0),
6555 MPFROMP(info -> title));
6556 info = info -> next;
6557 }
6558 }
6559 return 0;
6560
6561 case UM_FILLSETUPLIST:
6562 WinSendMsg(hwndStatelist, LM_DELETEALL, MPVOID, MPVOID);
6563 if (fUserComboBox)
6564 {
6565
6566 INT x;
6567
6568 if (!loadedsetups)
6569 load_setups();
6570 for (x = 0; x < MAXNUMSETUPS; x++)
6571 {
6572 if (*lastsetups[x])
6573 WinSendMsg(hwndStatelist, LM_INSERTITEM,
6574 MPFROM2SHORT(LIT_SORTASCENDING, 0),
6575 MPFROMP(lastsetups[x]));
6576 }
6577 WinSetWindowText(hwndStatelist, GetPString(IDS_STATETEXT));
6578 }
6579 return 0;
6580
6581 case UM_FILLBUTTONLIST:
6582 WinSendMsg(hwndButtonlist, LM_DELETEALL, MPVOID, MPVOID);
6583 if (fUserComboBox)
6584 {
6585
6586 BOOL foundit = FALSE, thisone;
6587 ULONG ulSearchCount;
6588 SHORT sSelect;
6589 FILEFINDBUF3 findbuf;
6590 HDIR hDir;
6591 CHAR *p;
6592
6593 DosError(FERR_DISABLEHARDERR);
6594 hDir = HDIR_CREATE;
6595 ulSearchCount = 1L;
6596 if (!DosFindFirst("*.TLS", &hDir, FILE_READONLY | FILE_ARCHIVED,
6597 &findbuf, sizeof(FILEFINDBUF3),
6598 &ulSearchCount, FIL_STANDARD))
6599 {
6600 do
6601 {
6602 priority_bumped();
6603 if (!foundit)
6604 {
6605 thisone = FALSE;
6606 p = strrchr(lasttoolbox, '\\');
6607 if (!p)
6608 p = lasttoolbox;
6609 else
6610 p++;
6611 if (!stricmp(findbuf.achName, p))
6612 thisone = TRUE;
6613 }
6614 p = strrchr(findbuf.achName, '.');
6615 if (p)
6616 *p = 0;
6617 sSelect = (SHORT) WinSendMsg(hwndButtonlist, LM_INSERTITEM,
6618 MPFROM2SHORT(LIT_SORTASCENDING, 0),
6619 MPFROMP(findbuf.achName));
6620 if (!foundit && thisone && sSelect >= 0)
6621 {
6622 WinSendMsg(hwndButtonlist, LM_SELECTITEM, MPFROM2SHORT(sSelect, 0),
6623 MPFROMLONG(TRUE));
6624 foundit = TRUE;
6625 }
6626 }
6627 while (!DosFindNext(hDir, &findbuf, sizeof(FILEFINDBUF3),
6628 &ulSearchCount));
6629 DosFindClose(hDir);
6630 priority_bumped();
6631 }
6632 WinSetWindowText(hwndButtonlist, GetPString(IDS_TOOLBOXTEXT));
6633 }
6634 return 0;
6635
6636 case UM_FILLUSERLIST:
6637 WinSendMsg(hwndUserlist, LM_DELETEALL, MPVOID, MPVOID);
6638 if (fUserComboBox)
6639 {
6640 ULONG ulDriveNum;
6641 ULONG ulDriveMap;
6642 ULONG ulSearchCount;
6643 FILEFINDBUF3 findbuf;
6644 HDIR hDir;
6645 APIRET rc;
6646 LINKDIRS *info;
6647 LINKDIRS *temp;
6648
6649 if (!loadedudirs)
6650 load_udirs();
6651 DosError(FERR_DISABLEHARDERR);
6652 DosQCurDisk(&ulDriveNum, &ulDriveMap);
6653 info = udirhead;
6654 while (info)
6655 {
6656 if (IsFullName(info -> path) &&
6657 !(driveflags[toupper(*info -> path) - 'A'] &
6658 (DRIVE_IGNORE | DRIVE_INVALID)))
6659 {
6660 DosError(FERR_DISABLEHARDERR);
6661 hDir = HDIR_CREATE;
6662 ulSearchCount = 1L;
6663 if (!IsRoot(info -> path))
6664 rc = DosFindFirst(info -> path, &hDir, FILE_DIRECTORY |
6665 MUST_HAVE_DIRECTORY | FILE_READONLY |
6666 FILE_ARCHIVED | FILE_SYSTEM | FILE_HIDDEN,
6667 &findbuf, sizeof(FILEFINDBUF3),
6668 &ulSearchCount, FIL_STANDARD);
6669 else
6670 {
6671 rc = 0;
6672 findbuf.attrFile = FILE_DIRECTORY;
6673 }
6674 priority_bumped();
6675 if (!rc)
6676 {
6677 if (!IsRoot(info -> path))
6678 DosFindClose(hDir);
6679 if (findbuf.attrFile & FILE_DIRECTORY)
6680 WinSendMsg(hwndUserlist, LM_INSERTITEM,
6681 MPFROM2SHORT(LIT_SORTASCENDING, 0),
6682 MPFROMP(info -> path));
6683 else
6684 {
6685 temp = info -> next;
6686 remove_udir(info -> path);
6687 info = temp;
6688 continue;
6689 }
6690 }
6691 else if (!(ulDriveMap & (1L << (toupper(*info -> path) - 'A'))))
6692 {
6693 temp = info -> next;
6694 remove_udir(info -> path);
6695 info = temp;
6696 continue;
6697 }
6698 }
6699 info = info -> next;
6700 }
6701 info = ldirhead;
6702 while (info)
6703 {
6704 if (IsFullName(info -> path) &&
6705 !(driveflags[toupper(*info -> path) - 'A'] &
6706 (DRIVE_IGNORE | DRIVE_INVALID)))
6707 {
6708 DosError(FERR_DISABLEHARDERR);
6709 hDir = HDIR_CREATE;
6710 ulSearchCount = 1L;
6711 if (!IsRoot(info -> path))
6712 rc = DosFindFirst(info -> path, &hDir, FILE_DIRECTORY |
6713 MUST_HAVE_DIRECTORY | FILE_READONLY |
6714 FILE_ARCHIVED | FILE_SYSTEM | FILE_HIDDEN,
6715 &findbuf, sizeof(FILEFINDBUF3),
6716 &ulSearchCount, FIL_STANDARD);
6717 else
6718 {
6719 rc = 0;
6720 findbuf.attrFile = FILE_DIRECTORY;
6721 }
6722 priority_bumped();
6723 if (!rc)
6724 {
6725 if (!IsRoot(info -> path))
6726 DosFindClose(hDir);
6727 if (findbuf.attrFile & FILE_DIRECTORY)
6728 WinSendMsg(hwndUserlist, LM_INSERTITEM,
6729 MPFROM2SHORT(LIT_SORTASCENDING, 0),
6730 MPFROMP(info -> path));
6731 else
6732 {
6733 temp = info -> next;
6734 remove_udir(info -> path);
6735 info = temp;
6736 continue;
6737 }
6738 }
6739 else if (!(ulDriveMap & (1L << (toupper(*info -> path) - 'A'))))
6740 {
6741 temp = info -> next;
6742 remove_udir(info -> path);
6743 info = temp;
6744 continue;
6745 }
6746 }
6747 info = info -> next;
6748 }
6749 WinSendMsg(hwndUserlist, LM_INSERTITEM,
6750 MPFROM2SHORT(0, 0),
6751 MPFROMP(GetPString(IDS_NEWDIRECTORYTEXT)));
6752 WinSetWindowText(hwndUserlist, GetPString(IDS_COMMONDIRTEXT));
6753 }
6754 return 0;
6755
6756 case UM_SIZE:
6757 if (fAutoTile)
6758 TileChildren(hwnd, FALSE);
6759 else
6760 MoveChildrenAwayFromTree(hwnd);
6761 return 0;
6762
6763 case WM_SIZE:
6764 ResizeChildren(hwnd, SHORT1FROMMP(mp1), SHORT2FROMMP(mp1),
6765 SHORT1FROMMP(mp2), SHORT2FROMMP(mp2));
6766 break;
6767
6768 case WM_ERASEBACKGROUND:
6769 WinFillRect((HPS) mp1, (PRECTL) mp2, 0x00d0d0d0);
6770 return 0;
6771
6772 case WM_PAINT:
6773 {
6774 HPS hps;
6775 RECTL rcl;
6776
6777 hps = WinBeginPaint(hwnd, (HPS) 0, NULL);
6778 if (hps)
6779 {
6780 WinQueryWindowRect(hwnd, &rcl);
6781 WinFillRect(hps, &rcl, CLR_PALEGRAY);
6782 WinEndPaint(hps);
6783 }
6784 }
6785 break;
6786
6787 case UM_CONTROL:
6788 switch (SHORT1FROMMP(mp1))
6789 {
6790 case MAIN_CMDLIST:
6791 case MAIN_SETUPLIST:
6792 case MAIN_DRIVELIST:
6793 case MAIN_USERLIST:
6794 case MAIN_BUTTONLIST:
6795 switch (SHORT2FROMMP(mp1))
6796 {
6797 case CBN_ENTER:
6798 {
6799 HWND hwndUL = WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
6800 SHORT1FROMMP(mp1));
6801 CHAR path[CCHMAXPATH];
6802
6803 SetShiftState();
6804 WinQueryWindowText(WinWindowFromID(hwndUL, CBID_EDIT),
6805 ((SHORT1FROMMP(mp1) == MAIN_USERLIST) ?
6806 CCHMAXPATH : 13), path);
6807 bstrip(path);
6808 if (*path)
6809 {
6810 if (SHORT1FROMMP(mp1) == MAIN_USERLIST)
6811 {
6812 if (!strcmp(path, GetPString(IDS_NEWDIRECTORYTEXT)))
6813 {
6814 if (!LastDir ||
6815 !WinSendMsg(WinQueryWindow(LastDir, QW_PARENT),
6816 UM_CONTAINERDIR,
6817 MPFROMP(path),
6818 MPVOID))
6819 save_dir2(path);
6820 if (!PMMkDir(hwnd,
6821 path,
6822 TRUE))
6823 {
6824 WinSetWindowText(hwndUL,
6825 GetPString(IDS_COMMONDIRTEXT));
6826 break;
6827 }
6828 }
6829 if (!IsFile(path) &&
6830 !FindDirCnrByName(path, TRUE))
6831 {
6832
6833 HWND hwndDir;
6834
6835 if ((fUserListSwitches &&
6836 !(shiftstate & KC_SHIFT)) ||
6837 (!fUserListSwitches &&
6838 (shiftstate & KC_SHIFT)))
6839 {
6840 hwndDir = FindDirCnr(hwnd);
6841 if (hwndDir)
6842 {
6843 WinSendMsg(LastDir,
6844 UM_SETDIR,
6845 MPFROMP(path),
6846 MPVOID);
6847 break;
6848 }
6849 }
6850 OpenDirCnr((HWND)0,
6851 hwndMain,
6852 hwndTree,
6853 FALSE,
6854 path);
6855 }
6856 }
6857 else if (SHORT1FROMMP(mp1) == MAIN_DRIVELIST)
6858 {
6859 ShowTreeRec(WinWindowFromID(WinWindowFromID(hwndTree,
6860 FID_CLIENT),
6861 TREE_CNR),
6862 path,
6863 FALSE,
6864 TRUE);
6865 WinSetFocus(HWND_DESKTOP,
6866 hwndTree);
6867 }
6868 else if (SHORT1FROMMP(mp1) == MAIN_BUTTONLIST)
6869 {
6870 strcat(path, ".TLS");
6871 load_tools(path);
6872 PrfWriteProfileString(fmprof,
6873 FM3Str,
6874 "LastToolBox",
6875 lasttoolbox);
6876 BuildTools(hwndToolback,
6877 TRUE);
6878 WinSetWindowText(hwndButtonlist,
6879 GetPString(IDS_TOOLBOXTEXT));
6880 }
6881 else if (SHORT1FROMMP(mp1) == MAIN_SETUPLIST)
6882 {
6883
6884 CHAR s[120];
6885 ULONG size, numsaves = 0;
6886
6887 SetShiftState();
6888 size = sizeof(ULONG);
6889 sprintf(s,
6890 "%s.NumDirsLastTime",
6891 path);
6892 if (!PrfQueryProfileData(fmprof,FM3Str,s,(PVOID)&numsaves,&size))
6893 Win_Error2(hwnd,hwnd,__FILE__,__LINE__,IDS_PRFQUERYPROFILEDATA);
6894 else if (!numsaves)
6895 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
6896 else {
6897 if ((shiftstate & KC_SHIFT) == 0)
6898 PostMsg(MainObjectHwnd,UM_RESTORE,MPVOID,MPFROMLONG(2L));
6899 {
6900 char *temp;
6901
6902 temp = xstrdup(path,pszSrcFile,__LINE__);
6903 if (!temp)
6904 {
6905 if ((shiftstate & KC_SHIFT) != 0 || fAutoTile)
6906 PostMsg(MainObjectHwnd,UM_RESTORE,MPVOID,MPFROMLONG(1L));
6907 }
6908 else {
6909 if (!PostMsg(MainObjectHwnd,UM_RESTORE,MPFROMP(temp),MPVOID))
6910 free(temp);
6911 }
6912 }
6913 }
6914 WinSetWindowText(hwndStatelist,
6915 GetPString(IDS_STATETEXT));
6916 }
6917 else if (SHORT1FROMMP(mp1) == MAIN_CMDLIST)
6918 {
6919
6920 SHORT sSelect;
6921
6922 sSelect = (SHORT) WinSendMsg(hwndCmdlist,
6923 LM_QUERYSELECTION,
6924 MPFROMSHORT(LIT_FIRST),
6925 MPVOID);
6926 if (sSelect >= 0)
6927 WinPostMsg(hwnd,
6928 WM_COMMAND,
6929 MPFROM2SHORT(IDM_COMMANDSTART + sSelect, 0),
6930 MPVOID);
6931 WinSetWindowText(hwndCmdlist,
6932 GetPString(IDS_COMMANDSTEXT));
6933 }
6934 }
6935 }
6936 break;
6937
6938 default:
6939 break;
6940 }
6941 break;
6942
6943 default:
6944 break;
6945 }
6946 return 0;
6947
6948 case WM_HELP:
6949 WinSendMsg(hwndHelp,
6950 HM_HELP_CONTENTS,
6951 MPVOID,
6952 MPVOID);
6953 break;
6954
6955 case UM_COMMAND:
6956 case WM_COMMAND:
6957
6958 return MainWMCommand(hwnd, msg, mp1, mp2);
6959
6960 case WM_CLOSE:
6961 WinSendMsg(WinQueryWindow(hwnd, QW_PARENT),
6962 WM_SYSCOMMAND,
6963 MPFROM2SHORT(SC_RESTORE, 0),
6964 MPVOID);
6965 WinSendMsg(hwnd,
6966 WM_SAVEAPPLICATION,
6967 MPVOID,
6968 MPVOID);
6969 fAmClosing = TRUE;
6970 WinSendMsg(WinQueryWindow(hwnd, QW_PARENT),
6971 WM_SYSCOMMAND,
6972 MPFROM2SHORT(SC_MINIMIZE, 0),
6973 MPVOID);
6974 if (CloseChildren(hwnd))
6975 {
6976 fAmClosing = FALSE;
6977 if (fAutoTile)
6978 PostMsg(hwnd,
6979 WM_COMMAND,
6980 MPFROM2SHORT(IDM_TILE, 0),
6981 MPVOID);
6982 return 0;
6983 }
6984 if (hwndTree)
6985 {
6986 if (!PostMsg(hwndTree,
6987 WM_CLOSE,
6988 MPVOID,
6989 MPVOID))
6990 WinSendMsg(hwndTree,
6991 WM_CLOSE,
6992 MPVOID,
6993 MPVOID);
6994 }
6995 DosSleep(1L);
6996 return 0;
6997
6998 case UM_CLOSE:
6999 HideNote();
7000 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
7001 return 0;
7002
7003 case UM_RESTORE:
7004 {
7005 char *temp;
7006
7007 temp = xstrdup(GetPString(IDS_FM2TEMPTEXT),pszSrcFile,__LINE__);
7008 if (temp) {
7009 if (!PostMsg(MainObjectHwnd,UM_RESTORE,MPFROMP(temp),MPVOID))
7010 free(temp);
7011 }
7012 }
7013 return 0;
7014
7015 case UM_SETDIR:
7016 /* mp1 == name of directory to open */
7017 if (mp1)
7018 return MRFROMLONG(OpenDirCnr((HWND)0,
7019 hwndMain,
7020 hwndTree,
7021 (BOOL) mp2,
7022 (char *) mp1));
7023 return 0;
7024
7025 case WM_DESTROY:
7026 hwndMain = (HWND)0;
7027 if (!PostMsg((HWND)0,WM_QUIT,MPVOID,MPVOID))
7028 WinSendMsg((HWND)0,WM_QUIT,MPVOID,MPVOID);
7029 break;
7030 }
7031
7032 return WinDefWindowProc(hwnd, msg, mp1, mp2);
7033}
Note: See TracBrowser for help on using the repository browser.