source: trunk/dll/mainwnd.c@ 783

Last change on this file since 783 was 775, checked in by Gregg Young, 18 years ago

Minor clean up add comments re recent changes

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