source: trunk/dll/mainwnd.c@ 1022

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

fortify updates for threads dble free fix

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