source: trunk/dll/mainwnd.c@ 433

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

Rename EditArchiverData to EditArchiverDefinition

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