source: trunk/dll/mainwnd.c@ 1028

Last change on this file since 1028 was 1027, checked in by John Small, 17 years ago

Ticket 227: Code cleanup and comments

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