source: trunk/dll/mainwnd.c@ 938

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

Update Utilities menu add command line, system & bookself submenus; Stop Z order of directory container from being reversed on restart.

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