source: trunk/dll/mainwnd.c@ 558

Last change on this file since 558 was 558, checked in by Steven Levine, 18 years ago

Add rest of SaveDirCnrState RestoreDirCnrState mode

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