source: trunk/dll/mainwnd.c@ 789

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

Rework SaveDirCnrState to return better error info
Make FILESTOGET_MIN/MAX to avoid hardcoded numbers
Ensure FilesToGet in valid range on init
Correct load_setups error reporting

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