source: trunk/dll/mainwnd.c@ 944

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

Restore no-prescan drives if restoring named state
This reverts to orginal behavior for named states

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