source: trunk/dll/mainwnd.c@ 985

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

Update sizes dialog (ticket 44); Make max command line length user settable (ticket 199); use xfree for free in most cases (ticket 212); initial code to check for valid ini file (ticket 102); Some additional refactoring and structure rework; Some documentation updates;

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