source: trunk/dll/mainwnd.c@ 352

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

Use Runtime_Error

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