source: trunk/dll/mainwnd.c@ 925

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

Add immediate updates toggle to config menu. Ticket #132.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 174.5 KB
RevLine 
[33]1
2/***********************************************************************
3
4 $Id: mainwnd.c 925 2008-01-17 01:09:24Z stevenhl $
5
[178]6 fm/2 main window
[33]7
8 Copyright (c) 1993-98 M. Kimes
[907]9 Copyright (c) 2001, 2008 Steven H. Levine
[33]10
[130]11 11 Jun 02 SHL Drop obsolete xor code
12 16 Oct 02 SHL Handle large partitions
13 01 Aug 04 SHL Rework lstrip/rstrip usage
14 23 May 05 SHL Use QWL_USER
[133]15 23 May 05 SHL Use datamin.h
[162]16 25 May 05 SHL Use ULONGLONG and CommaFmtULL
[178]17 26 May 05 SHL Comments and localize code
[186]18 05 Jun 05 SHL Use QWL_USER
[200]19 06 Jun 05 SHL Rework MainWMCommand for VAC3.65 compat
[260]20 13 Aug 05 SHL Renames and comments
[297]21 08 Dec 05 SHL DriveProc: disable menu items if drive not ready
22 17 Dec 05 SHL DriveProc: correct my stupid
23 29 May 06 SHL IDM_EDITANYARCHIVER: sanitize code
[352]24 17 Jul 06 SHL Use Runtime_Error
[447]25 17 Aug 06 SHL Complain nicer if state name does not exist
[552]26 18 Feb 07 GKY More drive type and icon support
[557]27 08 Mar 07 SHL SaveDirCnrState: do not save state of NOPRESCAN volumes
[558]28 09 Mar 07 SHL RestoreDirCnrState/SaveDirCnrState: optimize and avoid overflows
[593]29 30 Mar 07 GKY Remove GetPString for window class names
[603]30 06 Apr 07 GKY Work around PM DragInfo and DrgFreeDISH limits
31 06 Apr 07 GKY Add some error checking in drag/drop
[618]32 15 Apr 07 SHL mainwnd MAIN_SETUPLIST restore state not found reporting
33 19 Apr 07 SHL Sync with AcceptOneDrop GetOneDrop mods
34 20 Apr 07 SHL Avoid spurious add_udir error reports
[672]35 12 May 07 SHL Use dcd->ulItemsToUnHilite
[688]36 10 Jun 07 GKY Add CheckPmDrgLimit including IsFm2Window as part of work around PM drag limit
[775]37 06 Aug 07 GKY Reduce DosSleep times (ticket 148)
[773]38 07 Aug 07 SHL Use BldQuotedFileName
[787]39 16 Aug 07 SHL Update IDM_SAVEDIRCNRSTATE logic for ticket# 109
40 18 Aug 07 SHL Rework UM_FILLSETUPLIST for new setups storage
41 19 Aug 07 SHL Move #pragma alloc_text to end of file for OpenWatcom
[789]42 19 Aug 07 SHL Rework SaveDirCnrState to return better error info
[824]43 30 Aug 07 SHL Add accelerator support to quicklist windows
[872]44 22 Nov 07 GKY Use CopyPresParams to fix presparam inconsistencies in menus
[921]45 12 Jan 08 SHL Support drag&drop dialog toggle
[925]46 16 Jan 08 SHL Add sync updates toggle
[33]47
48***********************************************************************/
49
[907]50#include <stdlib.h>
51#include <string.h>
52#include <ctype.h>
53#include <process.h> // _beginthread
54
[2]55#define INCL_DOS
56#define INCL_WIN
[787]57#define INCL_SHLERRORS // PMERR_NOT_IN_IDX
[2]58#define INCL_WINHELP
59#define INCL_GPI
[162]60#define INCL_LONGLONG
[2]61
62#include "fm3dlg.h"
63#include "fm3str.h"
64#include "tools.h"
[907]65#include "comp.h"
[133]66#include "datamin.h"
[907]67#include "arccnrs.h" // BldQuotedFileName
68#include "errutil.h" // Dos_Error...
69#include "strutil.h" // GetPString
70#include "fm3dll.h"
[2]71
72#pragma data_seg(DATA1)
[352]73
[923]74// #define FM2_STATE_AT_CLOSE GetPString(IDS_FM2TEMPTEXT)
75#define FM2_STATE_AT_CLOSE "LastClose"
76//#define JBSDBG size = 1; //
77#define JBSDBG
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,
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),
[551]113 id + 50), sizeof(dv), dv);
[133]114 d = toupper(*dv);
115 if (isalpha(d) && d > 'B' &&
116 !(driveflags[d - 'A'] & (DRIVE_CDROM | DRIVE_INVALID |
117 DRIVE_SLOW)) &&
118 (!hwndBubble ||
119 WinQueryWindowULong(hwndBubble, QWL_USER) != hwndB) &&
[551]120 !WinQueryCapture(HWND_DESKTOP)) {
[2]121
[133]122 FSALLOCATE fsa;
[162]123 CHAR s[90], szQty[38];
[133]124 ULONG ulPctFree;
[162]125 ULONGLONG ullFreeQty;
[2]126
[133]127 if (!DosQueryFSInfo((d - 'A') + 1,
[551]128 FSIL_ALLOC, &fsa, sizeof(FSALLOCATE))) {
129 ullFreeQty = (ULONGLONG) fsa.cUnitAvail *
[133]130 (fsa.cSectorUnit * fsa.cbSector);
131 ulPctFree = (fsa.cUnit && fsa.cUnitAvail) ?
132 (fsa.cUnitAvail * 100) / fsa.cUnit : 0;
[551]133 CommaFmtULL(szQty, sizeof(szQty), ullFreeQty, ' ');
134 sprintf(s, "%s (%lu%%) free", szQty, ulPctFree);
[133]135 }
136 if ((!hwndBubble ||
137 WinQueryWindowULong(hwndBubble, QWL_USER) != hwndB) &&
138 !WinQueryCapture(HWND_DESKTOP))
[551]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,
150 QSV_BOOT_DRIVE,
[551]151 (PVOID) & bd, (ULONG) sizeof(ULONG)))
[133]152 bd = 3L;
153 *s = (CHAR) bd + '@';
[787]154 WinSendMsg(hwndMain, UM_SETDIR, MPFROMP(s), MPFROMLONG(1));
[551]155 if (!mp1) {
[133]156 s[3] = 0;
[551]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:
167 TileChildren(hwndMain, TRUE);
168 break;
169 case 2:
170 CloseDirCnrChildren(hwndMain);
171 break;
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)
[551]181 free((char *)mp1);
[133]182 if (fAutoTile)
183 TileChildren(hwndMain, TRUE);
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,
[593]216 (PSZ) WC_OBJECTWINDOW,
[551]217 MainObjectWndProc, 0, sizeof(PVOID));
[133]218 MainObjectHwnd = WinCreateWindow(HWND_OBJECT,
[593]219 WC_OBJECTWINDOW,
[133]220 (PSZ) NULL,
221 0,
222 0L,
223 0L,
224 0L,
225 0L,
[551]226 0L, HWND_TOP, OBJ_FRAME, NULL, NULL);
[376]227 if (!MainObjectHwnd)
[551]228 Win_Error2(HWND_OBJECT, HWND_DESKTOP, pszSrcFile, __LINE__,
229 IDS_WINCREATEWINDOW);
230 else {
[133]231 WinSetWindowPtr(MainObjectHwnd, QWL_USER, args);
[551]232 while (WinGetMsg(hab2, &qmsg2, (HWND) 0, 0, 0))
[133]233 WinDispatchMsg(hab2, &qmsg2);
234 WinDestroyWindow(MainObjectHwnd);
235 }
236 WinDestroyMsgQueue(hmq2);
237 }
238 WinTerminate(hab2);
239 }
[2]240}
241
[551]242static MRESULT EXPENTRY IdealButtonProc(HWND hwnd, ULONG msg, MPARAM mp1,
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) {
[133]263 id = WinQueryWindowUShort(hwndC, QWS_ID);
264 if (id)
265 break;
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) {
285 // saymsg(MB_ENTER,HWND_DESKTOP,DEBUG_STRING,"Tree = %lu\rExclude = %lu\rFound = %lu",hwndTree,exclude,hwndC);
286 if (hwndC != exclude && hwndC != hwndTree) {
[133]287 id = WinQueryWindowUShort(hwndC, QWS_ID);
[551]288 if (id) {
[133]289 hwndClient = WinWindowFromID(hwndC, FID_CLIENT);
[551]290 if (hwndClient) {
[133]291 hwndDir = WinWindowFromID(hwndClient, DIR_CNR);
[551]292 if (hwndDir) {
293 if (fLookInDir) {
[133]294 pci = (PCNRITEM) WinSendMsg(hwndDir,
295 CM_QUERYRECORDEMPHASIS,
296 MPFROMLONG(CMA_FIRST),
297 MPFROMSHORT(CRA_CURSORED));
[551]298 if (pci && (INT) pci != -1)
[133]299 break;
300 }
301 if (WinSendMsg(hwndClient,
[551]302 UM_CONTAINERDIR, MPFROMP(ret), MPVOID)) {
[133]303 MakeValidDir(ret);
[551]304 // saymsg(MB_ENTER,HWND_DESKTOP,DEBUG_STRING,"Tree = %lu\rExclude = %lu\rFound = %lu\r\"%s\"",hwndTree,exclude,hwndC,ret);
[133]305 WinEndEnumWindows(henum);
306 return hwndC;
[2]307 }
[133]308 }
309 }
310 }
[2]311 }
[133]312 }
313 WinEndEnumWindows(henum);
[551]314 if (!pci || (INT) pci == -1) {
[133]315 hwndC = hwndTree;
[551]316 pci = (PCNRITEM) WinSendMsg(WinWindowFromID(WinWindowFromID(hwndTree,
317 FID_CLIENT),
[133]318 TREE_CNR),
319 CM_QUERYRECORDEMPHASIS,
320 MPFROMLONG(CMA_FIRST),
321 MPFROMSHORT(CRA_CURSORED));
322 }
[551]323 if (pci && (INT) pci != -1) {
[730]324 strcpy(ret, pci->pszFileName);
[133]325 MakeValidDir(ret);
326 }
327 else
328 save_dir2(ret);
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)
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) {
[133]364 hwndDir = WinWindowFromID(hwndC, DIR_CNR);
[551]365 if (hwndDir) {
[69]366 *retstr = 0;
[551]367 WinSendMsg(hwndC, UM_CONTAINERDIR, MPFROMP(retstr), MPVOID);
368 if (*retstr && !stricmp(retstr, directory)) {
[133]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);
[69]378 break;
[133]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)) {
[133]447 swp[x].x = butx;
[551]448 if (fTextTools || (tool->flags & T_TEXT)) {
[133]449 butx += 55L;
450 swp[x].cx = 54L;
451 swp[x].cy = 24L;
452 swp[x].y = 3L;
[2]453 }
[133]454 else
455 butx += 33L;
[551]456 if (tool->flags & T_SEPARATOR)
[133]457 butx += 12;
458 }
459 else
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)) {
469 if (fTextTools || (tool->flags & T_TEXT)) {
[133]470 butx += 55L;
471 swp[x].cx = 54L;
472 swp[x].cy = 24L;
473 swp[x].y = 3L;
474 }
475 else
476 butx += 33L;
[551]477 if (tool->flags & T_SEPARATOR)
[133]478 butx += 12;
479 }
480 else
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++) {
[133]489 if (fTextTools || !fToolTitles)
490 swp[x].fl = noattrib;
[551]491 else {
[133]492 tool = find_tool(WinQueryWindowUShort(swp[x].hwnd, QWS_ID));
[551]493 if (tool && (tool->flags & T_TEXT))
[133]494 swp[x].fl = noattrib;
[551]495 else {
[133]496 swp[x].hwndInsertBehind = HWND_TOP;
497 swp[x].y = 1L;
498 swp[x].cy = 10L;
499 }
500 }
501 swp[x].hwnd = WinWindowFromID(hwnd,
[551]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,
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)) {
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 }
628 }
629 else {
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
645 }
646 }
647 break; // WM_FOCUSCHANGE
648
[133]649 case WM_CONTEXTMENU:
650 {
651 MRESULT ret = MRFROMSHORT(TRUE);
[2]652
[133]653 if (hwndMenu)
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:
659 WinPostMsg(WinWindowFromID(WinQueryWindow(WinQueryWindow(hwnd,
660 QW_PARENT),
661 QW_PARENT),
662 FID_CLIENT),
[551]663 WM_COMMAND, MPFROM2SHORT(IDM_EDITCOMMANDS, 0), MPVOID);
[133]664 break;
665 case MAIN_USERLIST:
666 case MAIN_SETUPLIST:
667 hwndMenu = WinLoadMenu(HWND_DESKTOP, FM3ModHandle, id);
668 if (hwndMenu)
669 PopupMenu(hwnd,
670 WinWindowFromID(WinQueryWindow(WinQueryWindow(hwnd,
671 QW_PARENT),
672 QW_PARENT),
[551]673 FID_CLIENT), hwndMenu);
[133]674 break;
675 default:
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:
686 id = WinQueryWindowUShort(hwnd, QWS_ID);
[551]687 switch (SHORT2FROMMP(mp1)) {
[133]688 case EN_SETFOCUS:
[551]689 switch (id) {
[133]690 case MAIN_CMDLIST:
[551]691 WinSetWindowText(hwndStatus2, GetPString(IDS_CMDLISTHELP));
[133]692 break;
693 case MAIN_SETUPLIST:
[551]694 WinSetWindowText(hwndStatus2, GetPString(IDS_SETUPLISTHELP));
[133]695 break;
696 case MAIN_USERLIST:
[551]697 WinSetWindowText(hwndStatus2, GetPString(IDS_USERLISTHELP));
[133]698 break;
699 case MAIN_DRIVELIST:
[551]700 WinSetWindowText(hwndStatus2, GetPString(IDS_DRIVELISTHELP));
[133]701 break;
702 case MAIN_BUTTONLIST:
[551]703 WinSetWindowText(hwndStatus2, GetPString(IDS_BUTTONLISTHELP));
[133]704 break;
705 default:
706 break;
707 }
708 break;
[2]709
[133]710 default:
711 break;
712 }
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 &&
725 WinQueryWindowUShort(WinQueryWindow(hwnd, QW_PARENT), QWS_ID) ==
[551]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))
[551]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) {
[133]744 emphasized = TRUE;
745 DrawTargetEmphasis(hwnd, emphasized);
746 }
[618]747 if (AcceptOneDrop(hwnd, mp1, mp2))
[551]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) {
[133]757 emphasized = FALSE;
758 DrawTargetEmphasis(hwnd, emphasized);
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) {
[133]778 emphasized = FALSE;
779 DrawTargetEmphasis(hwnd, emphasized);
780 }
[618]781 if (GetOneDrop(hwnd, mp1, mp2, szFrom, sizeof(szFrom))) {
[133]782 MakeValidDir(szFrom);
[551]783 WinSetWindowText(hwnd, szFrom);
[133]784 PostMsg(WinWindowFromID(WinQueryWindow(WinQueryWindow(hwnd,
785 QW_PARENT),
786 QW_PARENT),
787 FID_CLIENT),
[551]788 UM_COMMAND, MPFROM2SHORT(IDM_ADDTOUSERLIST, 0), MPVOID);
[133]789 return 0;
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 ||
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))
832 return;
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"))
838 return;
839 }
840 }
[2]841
842 hwndBubble = WinCreateWindow(HWND_DESKTOP,
[593]843 WC_BUBBLE,
[133]844 help,
845 WS_CLIPSIBLINGS | SS_TEXT |
846 DT_CENTER | DT_VCENTER,
847 0,
848 0,
849 0,
850 0,
[551]851 HWND_DESKTOP, HWND_TOP, MAIN_HELP, NULL, NULL);
[376]852 if (!hwndBubble)
[551]853 Win_Error2(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
854 IDS_WINCREATEWINDOW);
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) {
[133]874 wp = pp;
875 *pp = 0;
876 pp++;
877 }
878 GpiQueryTextBox(hps, strlen(p), p, TXTBOX_COUNT, aptl);
879 tptl.x = max(aptl[TXTBOX_TOPRIGHT].x, tptl.x);
880 if (tptl.y)
881 tptl.y += extra;
882 else
883 extra = aptl[TXTBOX_TOPLEFT].y / 4;
884 tptl.y += aptl[TXTBOX_TOPLEFT].y;
885 if (wp)
886 *wp = '\r';
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) {
[133]896 above = FALSE;
897 sy = ptl.y - (tptl.y + 14);
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)
913 sy = 0;
914 }
915 WinSetWindowPos(hwndBubble, HWND_TOP, sx, sy,
916 tptl.x + 14,
917 tptl.y + 12,
918 SWP_DEACTIVATE | SWP_SHOW | SWP_ZORDER |
919 SWP_MOVE | SWP_SIZE);
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) !=
[551]945 WinQueryWindowULong(hwnd, QWL_USER) || !WinIsWindowVisible(hwnd))
[133]946 WinDestroyWindow(hwnd);
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) {
[133]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);
[551]971 if (tlen) {
972 s = xmalloc(tlen + 2, pszSrcFile, __LINE__);
[352]973 if (s) {
[133]974 WinQueryWindowText(hwnd, tlen + 1, s);
[352]975 if (*s) {
[133]976 p = s;
977 y = swp.cy - 3;
978 extra = WinQueryWindowULong(hwnd, QWL_USER + 4);
979 GpiSetColor(hps, 0);
980 GpiSetMix(hps, FM_OVERPAINT);
[551]981 while (p && *p) {
[133]982 wp = NULL;
983 pp = strchr(p, '\r');
[551]984 if (pp) {
[133]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 }
[551]1004 if (!(swp.fl & (SWP_HIDE | SWP_MINIMIZE)) && swp.cx > 6 && swp.cy > 6) {
[133]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);
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:
1063 hps = WinGetPS(hwnd);
[551]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);
[133]1068 }
[551]1069 else {
1070 hbmLEDon = GpiLoadBitmap(hps, 0, LEDON2_BMP, 12, 12);
1071 hbmLEDoff = GpiLoadBitmap(hps, 0, LEDOFF2_BMP, 12, 12);
[133]1072 }
[551]1073 if (hbmLEDoff && hbmLEDon)
1074 WinSendMsg(hwnd, SM_SETHANDLE, MPFROMLONG(hbmLEDoff), MPVOID);
1075 else {
[133]1076 if (hbmLEDoff)
1077 GpiDeleteBitmap(hbmLEDoff);
1078 if (hbmLEDon)
1079 GpiDeleteBitmap(hbmLEDon);
1080 }
1081 if (hbmold &&
1082 hbmLEDon &&
[551]1083 hbmLEDoff && hbmold != hbmLEDon && hbmold != hbmLEDoff)
[133]1084 GpiDeleteBitmap(hbmold);
1085 if (hps)
1086 WinReleasePS(hps);
1087 break;
1088 default:
1089 SetPresParams(hwnd,
1090 &RGBGREY,
[551]1091 &RGBBLACK, &RGBGREY, GetPString(IDS_6HELVTEXT));
[133]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),
[551]1116 WM_COMMAND, MPFROM2SHORT(IDM_SHOWNOTEWND, 0), MPVOID);
[133]1117 break;
[2]1118
[133]1119 case WM_BUTTON2CLICK:
1120 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
[551]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),
[551]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)
1150 && !WinQueryCapture(HWND_DESKTOP)) {
[133]1151 id = WinQueryWindowUShort(hwnd, QWS_ID);
1152 tool = find_tool(id);
[551]1153 if (tool && tool->help && *tool->help) {
[2]1154
[133]1155 char s[128];
[2]1156
[551]1157 strcpy(s, tool->help);
1158 if (tool->flags & T_DROPABLE)
[133]1159 strcat(s, GetPString(IDS_DROPONMETEXT));
1160 MakeBubble(hwnd, FALSE, s);
1161 }
1162 }
1163 }
1164 break;
[2]1165
[133]1166 case WM_COMMAND:
[551]1167 switch (SHORT1FROMMP(mp1)) {
[133]1168 case IDM_HELP:
1169 if (hwndHelp)
1170 WinSendMsg(hwndHelp,
1171 HM_DISPLAY_HELP,
[551]1172 MPFROM2SHORT(HELP_TOOLBAR, 0), MPFROMSHORT(HM_RESOURCEID));
[133]1173 break;
[2]1174
[133]1175 case IDM_HIDEANYTOOL: /* hide any tool */
1176 case IDM_HIDETOOL: /* hide tool */
1177 if (SHORT1FROMMP(mp1) == IDM_HIDETOOL)
1178 id = WinQueryWindowUShort(hwnd, QWS_ID);
1179 else
1180 id = (USHORT) WinDlgBox(HWND_DESKTOP, hwnd,
1181 PickToolProc, FM3ModHandle,
[551]1182 PICKBTN_FRAME, GetPString(IDS_HIDETEXT));
1183 if (id) {
[133]1184 tool = find_tool(id);
[551]1185 if (tool) {
1186 tool->flags |= T_INVISIBLE;
[133]1187 fToolsChanged = TRUE;
1188 }
1189 }
1190 break;
[2]1191
[558]1192 case IDM_SHOWTOOLS: /* show all tools */
[133]1193 tool = toolhead;
[551]1194 while (tool) {
1195 tool->flags &= (~T_INVISIBLE);
1196 tool = tool->next;
[133]1197 fToolsChanged = TRUE;
1198 }
1199 break;
[2]1200
[133]1201 case IDM_DELETEANYTOOL: /* delete any button */
1202 case IDM_DELETETOOL: /* delete button */
1203 if (SHORT1FROMMP(mp1) == IDM_DELETETOOL)
1204 id = WinQueryWindowUShort(hwnd, QWS_ID);
1205 else
[551]1206 id =
1207 (USHORT) WinDlgBox(HWND_DESKTOP, hwnd, PickToolProc, FM3ModHandle,
1208 PICKBTN_FRAME, GetPString(IDS_DELETETEXT));
[133]1209 if (id)
1210 PostMsg(WinQueryWindow(hwnd, QW_PARENT), UM_SETUP,
1211 MPFROM2SHORT(id, 0), MPVOID);
1212 return 0;
[2]1213
[133]1214 case IDM_EDITANYTOOL: /* edit any button */
1215 case IDM_EDITTOOL: /* edit button */
1216 if (SHORT1FROMMP(mp1) == IDM_EDITTOOL)
1217 id = WinQueryWindowUShort(hwnd, QWS_ID);
1218 else
[551]1219 id =
1220 (USHORT) WinDlgBox(HWND_DESKTOP, hwnd, PickToolProc, FM3ModHandle,
1221 PICKBTN_FRAME, GetPString(IDS_EDITTEXT));
1222 if (id) {
[133]1223 tool = find_tool(id);
[551]1224 if (tool) {
[133]1225 if (WinDlgBox(HWND_DESKTOP, hwnd, AddToolProc, FM3ModHandle,
1226 ADDBTN_FRAME, (PVOID) tool))
1227 WinSendMsg(WinWindowFromID(WinQueryWindow(WinQueryWindow(hwnd,
[551]1228 QW_PARENT),
1229 QW_PARENT), FID_CLIENT),
[133]1230 WM_COMMAND, MPFROM2SHORT(IDM_CREATETOOL, 0),
1231 MPFROM2SHORT(id, 0));
1232 }
1233 }
1234 break;
[2]1235
[133]1236 case IDM_ADDTOOL: /* add tool */
1237 id = (USHORT) WinDlgBox(HWND_DESKTOP, hwnd, AddToolProc, FM3ModHandle,
1238 ADDBTN_FRAME, MPVOID);
1239 if (id && id != (USHORT) - 1)
1240 WinSendMsg(WinWindowFromID(WinQueryWindow(WinQueryWindow(hwnd,
[551]1241 QW_PARENT),
1242 QW_PARENT), FID_CLIENT),
[133]1243 WM_COMMAND, MPFROM2SHORT(IDM_CREATETOOL, 0),
1244 MPFROM2SHORT(id, 0));
1245 break;
[2]1246
[133]1247 case IDM_REORDERTOOLS: /* reorder tools */
1248 WinDlgBox(HWND_DESKTOP,
[551]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,
1255 hwnd,
1256 ToolIODlgProc,
1257 FM3ModHandle,
1258 SVBTN_FRAME,
1259 (PVOID) (SHORT1FROMMP(mp1) == IDM_SAVETOOLS) ?
1260 "TRUE" : NULL))
1261 BuildTools(hwndToolback, TRUE);
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 {
[558]1286 PDRAGINFO pDInfo; /* Pointer to DRAGINFO */
[2]1287
[133]1288 pDInfo = (PDRAGINFO) mp1; /* Get DRAGINFO pointer */
1289 DrgAccessDraginfo(pDInfo); /* Access DRAGINFO */
1290 id = WinQueryWindowUShort(hwnd, QWS_ID);
1291 tool = find_tool(id);
[551]1292 if (!tool) {
[133]1293 DrgFreeDraginfo(pDInfo);
[178]1294 return (MRFROM2SHORT(DOR_NEVERDROP, 0)); /* Drop not valid */
[133]1295 }
[551]1296 if (!(tool->flags & T_DROPABLE)) {
[133]1297 DrgFreeDraginfo(pDInfo);
[178]1298 return (MRFROM2SHORT(DOR_NEVERDROP, 0)); /* Drop not valid */
[133]1299 }
1300 {
[558]1301 PDRAGITEM pDItem; /* Pointer to DRAGITEM */
[2]1302
[133]1303 pDItem = DrgQueryDragitemPtr(pDInfo, /* Access DRAGITEM */
1304 0); /* Index to DRAGITEM */
1305 if (DrgVerifyRMF(pDItem, /* Check valid rendering */
[178]1306 DRM_OS2FILE, /* mechanisms and data */
[551]1307 NULL)) { /* formats */
1308 if (!(tool->flags & T_EMPHASIZED)) {
1309 tool->flags |= T_EMPHASIZED;
1310 DrawTargetEmphasis(hwnd, ((tool->flags & T_EMPHASIZED) != 0));
[133]1311 DrgFreeDraginfo(pDInfo);
1312 }
1313 return (MRFROM2SHORT(DOR_DROP, /* Return okay to drop */
1314 DO_MOVE)); /* Move operation valid */
1315 }
1316 DrgFreeDraginfo(pDInfo);
1317 }
1318 }
[178]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) {
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) {
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) {
1355 li->type = id;
1356 if (!li->list || !li->list[0])
[133]1357 FreeListInfo(li);
[551]1358 else {
[133]1359 HWND hwndActive;
[2]1360
[551]1361 hwndActive = TopWindow(hwndMain, (HWND) 0);
1362 if (hwndActive) {
[133]1363 if (!WinSendMsg(hwndActive, UM_COMMAND, MPFROMP(li), MPVOID))
1364 FreeListInfo(li);
1365 }
1366 else
1367 FreeListInfo(li);
1368 }
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)) {
[133]1405 hwndTool = WinCreateWindow(hwndT,
[593]1406 WC_TOOLBUTTONS,
[133]1407 s,
[69]1408 BS_NOPOINTERFOCUS |
1409 BS_BITMAP | BS_PUSHBUTTON,
[133]1410 ctrlxpos,
1411 14,
1412 32,
[551]1413 32, hwndT, HWND_TOP, tool->id, NULL, NULL);
[376]1414 }
1415 if (!hwndTool) {
[551]1416 HBITMAP hbm = LoadBitmapFromFileNum(tool->id);
1417
[376]1418 if (hbm) {
[133]1419 BTNCDATA btc;
[551]1420
[133]1421 memset(&btc, 0, sizeof(btc));
1422 btc.cb = sizeof(btc);
1423 btc.hImage = hbm;
1424 hwndTool = WinCreateWindow(hwndT,
[593]1425 WC_TOOLBUTTONS,
[133]1426 NullStr,
[69]1427 BS_NOPOINTERFOCUS |
1428 BS_BITMAP | BS_PUSHBUTTON,
[133]1429 ctrlxpos,
1430 14,
1431 32,
1432 32,
[551]1433 hwndT, HWND_TOP, tool->id, &btc, NULL);
[133]1434 if (!hwndTool)
1435 GpiDeleteBitmap(hbm);
1436 }
1437 }
1438 if (hwndTool)
[551]1439 tool->flags &= (~T_TEXT);
[133]1440 }
[376]1441 if (!hwndTool) {
1442 hwndTool = WinCreateWindow(hwndT,
[593]1443 WC_TOOLBUTTONS,
[551]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)
[551]1454 Win_Error2(hwndT, HWND_DESKTOP, pszSrcFile, __LINE__,
1455 IDS_WINCREATEWINDOW);
1456 tool->flags |= T_TEXT;
[133]1457 }
[551]1458 if (fToolTitles && !fTextTools) {
[376]1459 hwndTool = WinCreateWindow(hwndT,
[551]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)
[551]1470 Win_Error2(hwndT, HWND_DESKTOP, pszSrcFile, __LINE__,
1471 IDS_WINCREATEWINDOW);
[376]1472 else {
[551]1473 SetPresParams(hwndTool,
[376]1474 &RGBGREY,
[551]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),
1480 NULL, NULL, NULL, GetPString(IDS_8HELVTEXT));
1481 tool = tool->next;
1482 } // while tool
[376]1483
1484 hwndTool = WinCreateWindow(hwndT,
[551]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__,
1495 IDS_WINCREATEWINDOW);
1496 hwndTool =
1497 WinCreateWindow(hwndT, WC_BUTTON, "#6011",
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__,
1502 IDS_WINCREATEWINDOW);
[133]1503 if (resize)
1504 ResizeTools(hwndT);
[2]1505}
1506
[551]1507static MRESULT EXPENTRY CommandLineProc(HWND hwnd, ULONG msg, MPARAM mp1,
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)
[133]1525 break;
[551]1526 if (!WinQueryWindowProcess((HWND) mp1, &pid, &tid) || pid == mypid)
[133]1527 WinDestroyWindow(hwnd);
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,
1538 hwnd,
1539 CmdLine2DlgProc,
[551]1540 FM3ModHandle, EXEC2_FRAME, MPFROMP(cl))) {
[133]1541 lstrip(cl);
1542 WinSetWindowText(hwnd, cl);
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)
[551]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) {
[133]1580 WinSendMsg(WinQueryWindow(hwnd, QW_PARENT),
[551]1581 UM_SETUP, MPFROMP(cl + len), MPVOID);
1582 WinQueryWindowText(hwndStatus, CCHMAXPATH, directory);
[133]1583 bstrip(directory);
[551]1584 if (*directory && (IsRoot(directory) || !IsFile(directory))) {
1585 if (!FM2Command(directory, cl + len)) {
1586 hwndCnr = TopWindow(hwndMain, (HWND) 0);
1587 if (hwndCnr) {
[133]1588 hwndCnr = WinWindowFromID(hwndCnr, FID_CLIENT);
[551]1589 if (hwndCnr) {
[133]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),
[888]1602 directory, list, NULL, pszSrcFile, __LINE__);
[133]1603 if (list)
1604 free(list);
1605 WinDestroyWindow(hwnd);
1606 break;
1607 }
1608 }
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) {
[133]1617 if ((SHORT1FROMMP(mp2) & 255) == '\r')
1618 PostMsg(hwnd, UM_OPENWINDOWFORME, MPVOID, MPVOID);
1619 else if ((SHORT1FROMMP(mp2) & 0xff) == 0x1b)
1620 WinDestroyWindow(hwnd);
[551]1621 else if (SHORT2FROMMP(mp2) == VK_UP || SHORT2FROMMP(mp2) == VK_DOWN)
[133]1622 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
1623 }
1624 }
1625 else if ((SHORT1FROMMP(mp1) & KC_VIRTUALKEY) &&
1626 ((SHORT2FROMMP(mp2) == VK_UP ||
1627 SHORT2FROMMP(mp2) == VK_DOWN) ||
[551]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,
[551]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 &&
1684 (SHORT1FROMMP(mp1) >= IDM_DRIVEA &&
1685 SHORT1FROMMP(mp1) < IDM_DRIVEA + 26))
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),
[551]1695 2, dv);
1696 if (isalpha(*dv)) {
[2]1697
[133]1698 HWND hwndActive;
[2]1699
[133]1700 dv[1] = ':';
1701 dv[2] = '\\';
1702 dv[3] = 0;
[551]1703 hwndActive = TopWindow(hwnd, (HWND) 0);
[133]1704 if (hwndActive)
1705 WinSendMsg(WinWindowFromID(hwndActive, FID_CLIENT),
[551]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 &&
1734 (!hwndBubble ||
1735 WinQueryWindowULong(hwndBubble, QWL_USER) != hwnd) &&
[551]1736 !WinQueryCapture(HWND_DESKTOP)) {
[133]1737 id = WinQueryWindowUShort(hwnd, QWS_ID);
[551]1738 if (helpid != id) {
[133]1739 helpid = id;
[551]1740 PostMsg(MainObjectHwnd, UM_SETUP6, MPFROMLONG((ULONG) hwnd), MPVOID);
[2]1741 }
[133]1742 else
1743 helpid = 0;
1744 }
1745 break;
[2]1746
[133]1747 case UM_SETUP6:
[551]1748 if (helpid == WinQueryWindowUShort(hwnd, QWS_ID)) {
1749 if ((char *)mp1 &&
[133]1750 (!hwndBubble ||
1751 WinQueryWindowULong(hwndBubble, QWL_USER) != hwnd) &&
[551]1752 !WinQueryCapture(HWND_DESKTOP)) {
[2]1753
[133]1754 RECTL rcl;
1755 POINTL ptl;
[2]1756
[551]1757 WinQueryPointerPos(HWND_DESKTOP, &ptl);
1758 WinMapWindowPoints(HWND_DESKTOP, hwnd, &ptl, 1);
[133]1759 WinQueryWindowRect(hwnd, &rcl);
[551]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),
[551]1780 id + 50), sizeof(szDrv), szDrv);
1781 if (isalpha(*szDrv)) {
1782 hwndMenu = WinLoadMenu(HWND_DESKTOP, FM3ModHandle, MAIN_DRIVES);
1783 if (hwndMenu) {
[297]1784 BOOL rdy;
1785 CHAR chDrv = *szDrv;
1786 UINT iDrv;
[551]1787
[297]1788 strcpy(szDrv + 2, "\\");
1789 MakeValidDir(szDrv);
[551]1790 // Disable menus if MakeValidDir changes drive letter fixme this section doesn't do anything see treecnt.c
[297]1791 rdy = toupper(*szDrv) == toupper(chDrv);
1792 iDrv = toupper(*szDrv) - 'A';
1793 if (!rdy || ~driveflags[iDrv] & DRIVE_REMOTE)
[551]1794 WinEnableMenuItem(hwndMenu, IDM_DETACH, FALSE);
[549]1795
[551]1796 if (!rdy || driveflags[iDrv] & DRIVE_NOTWRITEABLE) {
[297]1797 WinEnableMenuItem(hwndMenu, IDM_MKDIR, FALSE);
1798 WinEnableMenuItem(hwndMenu, IDM_FORMAT, FALSE);
1799 WinEnableMenuItem(hwndMenu, IDM_OPTIMIZE, FALSE);
1800 WinEnableMenuItem(hwndMenu, IDM_UNDELETE, FALSE);
[133]1801 }
[551]1802 if (!rdy || ~driveflags[iDrv] & DRIVE_REMOVABLE) {
[297]1803 WinEnableMenuItem(hwndMenu, IDM_EJECT, FALSE);
1804 WinEnableMenuItem(hwndMenu, IDM_LOCK, FALSE);
1805 WinEnableMenuItem(hwndMenu, IDM_UNLOCK, FALSE);
[133]1806 }
[551]1807 if (!rdy) {
[297]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?
[551]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),
[551]1834 id + 50), sizeof(szDrv), szDrv);
1835 if (isalpha(*szDrv)) {
[297]1836 strcat(szDrv, "\\");
1837 if (!FindDirCnrByName(szDrv, TRUE))
[551]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),
[551]1850 id + 50), sizeof(szDrv), szDrv);
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),
[551]1861 id + 50), sizeof(szDrv), szDrv);
[297]1862 if (isalpha(*szDrv) &&
[551]1863 !(driveflags[toupper(*szDrv) - 'A'] & DRIVE_NOTWRITEABLE)) {
1864 if (!emphasized) {
[133]1865 emphasized = TRUE;
1866 DrawTargetEmphasis(hwnd, emphasized);
1867 }
[618]1868 if (AcceptOneDrop(hwnd, mp1, mp2))
[551]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),
[551]1878 id + 50), sizeof(szDrv), szDrv);
[297]1879 if (isalpha(*szDrv) &&
[551]1880 !(driveflags[toupper(*szDrv) - 'A'] & DRIVE_NOTWRITEABLE)) {
1881 if (emphasized) {
[133]1882 emphasized = FALSE;
1883 DrawTargetEmphasis(hwnd, emphasized);
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),
[297]1892 id + 50), sizeof(szDrv), szDrv);
1893 if (isalpha(*szDrv) &&
[551]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),
[551]1904 id + 50), sizeof(szDrv), szDrv);
[297]1905 if (isalpha(*szDrv) &&
[551]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) {
[133]1913 emphasized = FALSE;
1914 DrawTargetEmphasis(hwnd, emphasized);
1915 }
1916 memset(&cnd, 0, sizeof(cnd));
1917 cnd.pDragInfo = (PDRAGINFO) mp1;
1918 cnd.pRecord = NULL;
1919 li = DoFileDrop(hwnd,
1920 NULL,
[773]1921 TRUE, MPFROM2SHORT(TREE_CNR, CN_DROP), MPFROMP(&cnd));
[687]1922 CheckPmDrgLimit(cnd.pDragInfo);
[551]1923 if (li) {
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
[133]1930 CHECKLIST cl;
[2]1931
[133]1932 memset(&cl, 0, sizeof(cl));
1933 cl.size = sizeof(cl);
[551]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,
[672]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) {
[133]1946 FreeListInfo(li);
1947 return 0;
1948 }
[551]1949 li->list = cl.list;
[672]1950 if (!li->list || !li->list[0]) {
[133]1951 FreeListInfo(li);
1952 return 0;
1953 }
1954 }
[551]1955 else {
[133]1956 if (!WinDlgBox(HWND_DESKTOP,
1957 hwndMain,
1958 WalkDlgProc,
1959 FM3ModHandle,
1960 WALK_FRAME,
[551]1961 MPFROMP(li->targetpath)) || !*li->targetpath) {
[133]1962 FreeListInfo(li);
1963 return 0;
1964 }
1965 }
[551]1966 switch (li->type) {
[133]1967 case DND_LAUNCH:
[551]1968 strcat(li->targetpath, " %a");
[133]1969 ExecOnList(hwndMain,
[917]1970 li->targetpath, PROMPT | WINDOWED, NULL, li->list, NULL,
1971 pszSrcFile, __LINE__);
[551]1972 FreeList(li->list);
1973 li->list = NULL;
[133]1974 break;
1975 case DO_LINK:
[551]1976 if (fLinkSetsIcon) {
1977 li->type = IDM_SETICON;
[133]1978 action = UM_MASSACTION;
1979 }
1980 else
[551]1981 li->type = IDM_COMPARE;
[133]1982 break;
1983 case DND_EXTRACT:
[551]1984 if (*li->targetpath && !IsFile(li->targetpath))
1985 li->type = IDM_EXTRACT;
[133]1986 break;
1987 case DND_MOVE:
[551]1988 li->type = IDM_MOVE;
1989 if (*li->targetpath && IsFile(li->targetpath) == 1) {
[133]1990 action = UM_MASSACTION;
[551]1991 li->type = IDM_ARCHIVEM;
[133]1992 }
1993 break;
1994 case DND_WILDMOVE:
[551]1995 li->type = IDM_WILDMOVE;
1996 if (*li->targetpath && IsFile(li->targetpath) == 1) {
[133]1997 action = UM_MASSACTION;
[551]1998 li->type = IDM_ARCHIVEM;
[133]1999 }
2000 break;
2001 case DND_OBJECT:
[551]2002 li->type = IDM_OBJECT;
[133]2003 action = UM_MASSACTION;
2004 break;
2005 case DND_SHADOW:
[551]2006 li->type = IDM_SHADOW;
[133]2007 action = UM_MASSACTION;
2008 break;
2009 case DND_COMPARE:
[551]2010 li->type = IDM_COMPARE;
[133]2011 break;
2012 case DND_SETICON:
2013 action = UM_MASSACTION;
[551]2014 li->type = IDM_SETICON;
[133]2015 break;
2016 case DND_COPY:
[551]2017 li->type = IDM_COPY;
2018 if (*li->targetpath && IsFile(li->targetpath) == 1) {
[133]2019 action = UM_MASSACTION;
[551]2020 li->type = IDM_ARCHIVE;
[133]2021 }
2022 break;
2023 case DND_WILDCOPY:
[551]2024 li->type = IDM_WILDCOPY;
2025 if (*li->targetpath && IsFile(li->targetpath) == 1) {
[133]2026 action = UM_MASSACTION;
[551]2027 li->type = IDM_ARCHIVE;
[133]2028 }
2029 break;
2030 default:
[551]2031 if (*li->arcname && li->info) {
[133]2032 action = UM_MASSACTION;
[551]2033 li->type = (li->type == DO_MOVE) ? IDM_FAKEEXTRACTM :
[133]2034 IDM_FAKEEXTRACT;
2035 }
[551]2036 else if (*li->targetpath && IsFile(li->targetpath) == 1) {
[133]2037 action = UM_MASSACTION;
[551]2038 li->type = (li->type == DO_MOVE) ? IDM_ARCHIVEM : IDM_ARCHIVE;
[133]2039 }
2040 else
[551]2041 li->type = (li->type == DO_MOVE) ? IDM_MOVE : IDM_COPY;
[133]2042 break;
2043 }
[551]2044 if (!li->list || !li->list[0])
[133]2045 FreeListInfo(li);
2046 else
[551]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)) {
2081 if (x > 1) {
[133]2082 if (driveflags[x] & DRIVE_CDROM)
2083 iconid = CDROM_ICON;
2084 else
2085 iconid = (driveflags[x] & DRIVE_REMOVABLE) ?
2086 REMOVABLE_ICON :
[558]2087 (driveflags[x] & DRIVE_VIRTUAL) ?
2088 VIRTUAL_ICON :
[133]2089 (driveflags[x] & DRIVE_REMOTE) ?
2090 REMOTE_ICON :
[558]2091 (driveflags[x] & DRIVE_RAMDISK) ?
2092 RAMDISK_ICON :
2093 (driveflags[x] & DRIVE_ZIPSTREAM) ?
2094 ZIPSTREAM_ICON :DRIVE_ICON;
[2]2095 }
[133]2096 else
2097 iconid = FLOPPY_ICON;
2098 sprintf(s, "#%lu", iconid);
2099 hwndB = WinCreateWindow(hwndT,
[593]2100 WC_DRIVEBUTTONS,
[133]2101 s,
[551]2102 BS_NOPOINTERFOCUS | BS_BITMAP | BS_PUSHBUTTON,
[133]2103 0,
2104 0,
2105 28,
2106 18,
[551]2107 hwndT, HWND_TOP, y + IDM_DRIVEA, NULL, NULL);
[376]2108 if (!hwndB)
[551]2109 Win_Error2(hwndT, HWND_DESKTOP, pszSrcFile, __LINE__,
2110 IDS_WINCREATEWINDOW);
[376]2111 else {
[551]2112 WinSetWindowPos(hwndB, HWND_BOTTOM, 0, 0, 0, 0, SWP_ZORDER);
[133]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,
[551]2123 HWND_TOP, y + IDM_DRIVEATEXT, NULL, NULL);
[376]2124 if (!hwndB)
[551]2125 Win_Error2(hwndT, HWND_DESKTOP, pszSrcFile, __LINE__,
2126 IDS_WINCREATEWINDOW);
[376]2127 else {
[133]2128 SetPresParams(hwndB,
2129 &RGBGREY,
[551]2130 &RGBBLACK, &RGBGREY, GetPString(IDS_6HELVTEXT));
2131 WinSetWindowPos(hwndB, HWND_BOTTOM, 0, 0, 0, 0, SWP_ZORDER);
[133]2132 }
2133 y++;
2134 }
2135 }
[551]2136 } // for
2137 } // if drivebar
[133]2138 PostMsg(WinQueryWindow(hwndT, QW_PARENT),
[551]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,
[133]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,
[133]2164 HWND_TOP,
[551]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) ?
[551]2169 256 : 0)) > xwidth) {
[133]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,
[917]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,
2202 (ULONG) mp1,
2203 0,
2204 &AttrFound,
[551]2205 (ULONG) sizeof(AttrValue), &AttrValue, 0);
2206 if (cbRetLen) {
[877]2207 //switch (AttrFound) {
2208 //case PP_FONTNAMESIZE:
[133]2209 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
[551]2210 WM_UPDATEFRAME, MPFROMLONG(FCF_SIZEBORDER), MPVOID);
[923]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))
2229 fl |= SWP_RESTORE;
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) {
2262 if ((!hwndBubble || WinQueryWindowULong(hwndBubble, QWL_USER) != hwnd)
2263 && !WinQueryCapture(HWND_DESKTOP)) {
2264 switch (id) {
[133]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 }
2289 }
[551]2290 switch (id) {
[133]2291 case IDM_ATTRS:
2292 case IDM_INFO:
2293 case IDM_RENAME:
2294 case MAIN_STATUS2:
2295 return CommonTextProc(hwnd, msg, mp1, mp2);
2296 default:
2297 break;
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:
2320 return CommonTextButton(hwnd, msg, mp1, mp2);
2321 default:
[551]2322 PostMsg(hwnd, UM_FOCUSME, MPVOID, MPVOID);
[133]2323 break;
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)
2335 WinSendMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
[133]2336 else
2337 return CommonTextButton(hwnd, msg, mp1, mp2);
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) {
[133]2347 if (SHORT2FROMMP(mp2) & KC_CTRL)
2348 PostMsg(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
2349 FID_CLIENT),
[551]2350 WM_COMMAND, MPFROM2SHORT(IDM_WINDOWDLG, 0), MPVOID);
[133]2351 else if (hwndTree)
[551]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
[133]2365 SWP swp;
2366 CHAR directory[CCHMAXPATH];
2367 PFNWP oldproce;
[2]2368
[133]2369 *directory = 0;
[551]2370 TopWindowName(hwndMain, (HWND) 0, directory);
[133]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,
[551]2381 hwnd, HWND_TOP, COMMAND_BUTTON, NULL, NULL);
[376]2382 if (!hwndB)
[551]2383 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
[133]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,
[551]2392 hwnd, HWND_TOP, COMMAND_LINE, NULL, NULL);
[376]2393 if (!hwndE)
[551]2394 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
[376]2395 if (!hwndE || !hwndB) {
[551]2396 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
[133]2397 return 0;
2398 }
[551]2399 WinSendMsg(hwndE, EM_SETTEXTLIMIT, MPFROM2SHORT(1024, 0), MPVOID);
2400 WinSetWindowText(hwndStatus, directory);
[133]2401 if (*lastcmd)
[551]2402 WinSetWindowText(hwndE, lastcmd);
[133]2403 else
[551]2404 WinSetWindowText(hwndE, GetPString(IDS_HELPCMDTEXT));
2405 oldproce = WinSubclassWindow(hwndE, (PFNWP) CommandLineProc);
[133]2406 if (oldproce)
[551]2407 WinSetWindowPtr(hwndE, QWL_USER, (PVOID) oldproce);
2408 PostMsg(hwndE, UM_FOCUSME, MPVOID, MPVOID);
2409 PostMsg(hwndE, EM_SETSEL, MPFROM2SHORT(0, 1024), MPVOID);
[133]2410 return 0;
2411 }
[551]2412 if (msg == UM_CLICKED3 || (SHORT2FROMMP(mp2) & KC_CTRL)) {
2413 switch (id) {
[133]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 }
2424 }
2425 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
[551]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:
2440 PaintRecessedWindow(hwnd, (HPS) 0, TRUE, FALSE);
2441 break;
2442 default:
2443 PaintRecessedWindow(hwnd, (HPS) 0, FALSE, TRUE);
2444 break;
2445 }
[551]2446 if (id == IDM_RENAME) {
[2]2447
[133]2448 HPS hps;
[2]2449
[133]2450 hps = WinBeginPaint(hwnd, (HPS) 0, NULL);
[551]2451 if (hps) {
[133]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;
2469 SetPresParams(hwnd,
[551]2470 &RGBGREY, &RGBBLACK, &RGBGREY, GetPString(IDS_8HELVTEXT));
[133]2471 break;
[2]2472
[133]2473 case WM_MOUSEMOVE:
2474 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
2475 break;
[2]2476
[133]2477 case WM_CONTROLPOINTER:
[551]2478 if (!fNoFinger && SHORT1FROMMP(mp1) < 25000)
[133]2479 return MRFROMLONG(hptrFinger);
2480 break;
[2]2481
[133]2482 case WM_CHAR:
2483 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
2484 break;
[2]2485
[133]2486 case WM_COMMAND:
2487 case UM_COMMAND:
2488 return WinSendMsg(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
[551]2489 FID_CLIENT), msg, mp1, mp2);
[2]2490
[133]2491 case WM_PAINT:
2492 {
2493 HPS hps;
2494 RECTL rcl;
[2]2495
[133]2496 hps = WinBeginPaint(hwnd, (HPS) 0, NULL);
[551]2497 if (hps) {
[133]2498 WinQueryWindowRect(hwnd, &rcl);
2499 WinFillRect(hps, &rcl, CLR_PALEGRAY);
2500 WinEndPaint(hps);
2501 }
[551]2502 PaintRecessedWindow(hwnd, (HPS) 0, TRUE, FALSE);
[133]2503 }
2504 break;
[2]2505
[133]2506 case UM_SETUP:
2507 {
2508 USHORT id;
2509 TOOL *tool;
[2]2510
[133]2511 id = SHORT1FROMMP(mp1);
2512 tool = find_tool(id);
[551]2513 if (tool) {
[133]2514 del_tool(tool);
2515 WinShowWindow(WinWindowFromID(hwnd, id), FALSE);
2516 if (fToolTitles)
2517 WinShowWindow(WinWindowFromID(hwnd, id + 25000), FALSE);
2518 ResizeTools(hwnd);
2519 }
2520 }
2521 return 0;
[2]2522
[133]2523 case WM_CHORD:
2524 {
2525 USHORT id;
[2]2526
[133]2527 id = (USHORT) WinDlgBox(HWND_DESKTOP,
2528 hwnd,
2529 AddToolProc,
[551]2530 FM3ModHandle, ADDBTN_FRAME, MPVOID);
[133]2531 if (id && id != (USHORT) - 1)
2532 WinSendMsg(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
2533 FID_CLIENT),
2534 WM_COMMAND,
[551]2535 MPFROM2SHORT(IDM_CREATETOOL, 0), MPFROM2SHORT(id, 0));
[133]2536 }
2537 break;
[2]2538
[133]2539 case WM_CONTEXTMENU:
2540 if (WinDlgBox(HWND_DESKTOP,
[551]2541 hwnd, ToolIODlgProc, FM3ModHandle, SVBTN_FRAME, MPVOID))
[133]2542 BuildTools(hwnd, TRUE);
2543 return MRFROMSHORT(TRUE);
[2]2544
[133]2545 case WM_CLOSE:
2546 WinDestroyWindow(hwnd);
2547 return 0;
[2]2548
[133]2549 case WM_DESTROY:
2550 break;
2551 }
2552 return WinDefWindowProc(hwnd, msg, mp1, mp2);
[2]2553}
2554
[178]2555static VOID AdjustSizeOfClient(PSWP pswp, PRECTL prectl)
[133]2556{
2557 SWP swp;
2558 RECTL rectl;
[2]2559
[133]2560 if (fFreeTree)
2561 return;
[551]2562 if (pswp) {
[133]2563 if (WinQueryWindowPos(hwndTree, &swp) &&
[551]2564 !(swp.fl & (SWP_MINIMIZE | SWP_HIDE | SWP_MAXIMIZE))) {
2565 pswp->x = swp.cx;
2566 pswp->cx -= swp.cx;
[133]2567 }
2568 }
[551]2569 if (prectl) {
[133]2570 if (WinQueryWindowPos(hwndTree, &swp) &&
2571 !(swp.fl & (SWP_MINIMIZE | SWP_HIDE | SWP_MAXIMIZE)) &&
[551]2572 WinQueryWindowRect(hwndTree, &rectl)) {
2573 prectl->xLeft = rectl.xRight;
2574 prectl->xRight -= rectl.xRight;
[133]2575 }
2576 }
[2]2577}
2578
[133]2579VOID FillClient(HWND hwndClient, PSWP pswp, PRECTL prectl, BOOL avoidtree)
2580{
2581 ULONG adjust;
[2]2582
[133]2583 adjust = WinQuerySysValue(HWND_DESKTOP, SV_CYICON);
2584 if (pswp)
2585 WinQueryWindowPos(hwndClient, pswp);
2586 if (prectl)
2587 WinQueryWindowRect(hwndClient, prectl);
2588 if (avoidtree && !fFreeTree)
2589 AdjustSizeOfClient(pswp, prectl);
2590 if (prectl)
[551]2591 prectl->yBottom += adjust;
2592 if (pswp) {
[133]2593 if (!avoidtree || fFreeTree)
[551]2594 pswp->x = 0;
2595 pswp->y = adjust;
2596 if (pswp->cy >= adjust)
2597 pswp->cy -= adjust;
[133]2598 else
[551]2599 pswp->cy = 0;
[133]2600 }
[2]2601}
2602
[178]2603static VOID MoveChildrenAwayFromTree(HWND hwndClient)
[133]2604{
2605 SWP swpC, swpT, swp;
2606 USHORT id;
2607 HWND hwndChild;
2608 HENUM henum;
[2]2609
[133]2610 if (fFreeTree)
2611 return;
2612 WinQueryWindowPos(hwndClient, &swpC);
2613 if (swpC.fl & (SWP_MINIMIZE | SWP_HIDE))
2614 return;
2615 WinQueryWindowPos(hwndTree, &swpT);
2616 henum = WinBeginEnumWindows(hwndClient);
[551]2617 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
[133]2618 id = WinQueryWindowUShort(hwndChild, QWS_ID);
2619 if (!id || id == TREE_FRAME)
2620 continue;
2621 WinQueryWindowPos(hwndChild, &swp);
[551]2622 if (!(swp.fl & (SWP_MAXIMIZE | SWP_HIDE | SWP_MINIMIZE))) {
2623 if (swp.x < swpT.cx) {
[133]2624 swp.x = swpT.cx;
2625 if (swp.x + swp.cx > swpC.cx)
2626 swp.cx = swpC.cx - swp.x;
2627 if (swp.cx > 24)
2628 WinSetWindowPos(hwndChild, HWND_TOP, swp.x, swp.y, swp.cx, swp.cy,
2629 SWP_SIZE | SWP_MOVE | SWP_SHOW);
2630 }
2631 }
2632 }
2633 WinEndEnumWindows(henum);
[2]2634}
2635
[178]2636static VOID ArrangeIcons(HWND hwndClient)
[133]2637{
2638 HENUM henum;
2639 HWND hwndChild;
2640 SWP swp;
[2]2641
[133]2642 henum = WinBeginEnumWindows(hwndClient);
[551]2643 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
[133]2644 WinQueryWindowPos(hwndChild, &swp);
[551]2645 if (swp.fl & (SWP_MINIMIZE | SWP_HIDE)) {
[133]2646 WinSetWindowUShort(hwndChild, QWS_XMINIMIZE, (USHORT) - 1);
2647 WinSetWindowUShort(hwndChild, QWS_YMINIMIZE, (USHORT) - 1);
2648 WinSetWindowPos(hwndChild, HWND_TOP, 0, 0, 0, 0,
2649 SWP_MOVE | SWP_SHOW | SWP_FOCUSDEACTIVATE);
2650 }
2651 }
2652 WinEndEnumWindows(henum);
[2]2653}
2654
[178]2655static VOID NextChild(HWND hwndClient, BOOL previous)
[133]2656{
2657 HENUM henum;
[551]2658 HWND hwndActive, hwndNext, hwndPrev = (HWND) 0;
[133]2659 BOOL next = FALSE, once = FALSE;
[2]2660
[133]2661 previous = !previous;
[2]2662
[133]2663 hwndActive = WinQueryActiveWindow(hwndClient);
2664 if (!hwndActive)
2665 next = TRUE;
2666 henum = WinBeginEnumWindows(hwndClient);
[551]2667 for (;;) {
[133]2668 hwndNext = WinGetNextWindow(henum);
[551]2669 if (hwndNext) {
[133]2670 if (!WinQueryWindowUShort(hwndNext, QWS_ID))
2671 continue;
2672 if (next)
2673 break;
[551]2674 if (hwndNext == hwndActive) {
2675 if (!previous && hwndPrev) {
[133]2676 hwndNext = hwndPrev;
2677 break;
[2]2678 }
[133]2679 else if (previous)
2680 next = TRUE;
2681 }
2682 hwndPrev = hwndNext;
2683 }
[551]2684 else {
[133]2685 if ((!next && previous) || once)
2686 break;
[551]2687 else if (!previous) {
[133]2688 hwndNext = hwndPrev;
2689 break;
2690 }
2691 else
2692 once = next = TRUE;
2693 }
2694 }
2695 WinEndEnumWindows(henum);
[2]2696
[551]2697 if (hwndNext && hwndNext != hwndActive) {
2698 WinSetWindowPos(hwndNext, HWND_TOP, 0, 0, 0, 0,
2699 SWP_ZORDER | SWP_ACTIVATE);
2700 WinSetWindowPos(hwndActive, ((previous) ? HWND_BOTTOM : hwndNext), 0, 0,
2701 0, 0, SWP_ZORDER);
[133]2702 }
[2]2703}
2704
[133]2705BOOL CloseChildren(HWND hwndClient)
2706{
2707 HENUM henum;
2708 HWND hwndChild;
2709 BOOL ret = FALSE;
[2]2710
[133]2711 fNoTileUpdate = TRUE;
2712 henum = WinBeginEnumWindows(hwndClient);
[551]2713 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
2714 if (hwndChild != hwndTree) {
[133]2715 WinSendMsg(WinWindowFromID(hwndChild, FID_CLIENT),
[551]2716 WM_SAVEAPPLICATION, MPVOID, MPVOID);
[133]2717 if (WinSendMsg(WinWindowFromID(hwndChild, FID_CLIENT),
[551]2718 WM_CLOSE, MPVOID, MPVOID)) {
[133]2719 ret = TRUE;
2720 break;
2721 }
2722 }
2723 }
2724 WinEndEnumWindows(henum);
2725 fNoTileUpdate = FALSE;
2726 return ret;
[2]2727}
2728
[133]2729BOOL CloseDirCnrChildren(HWND hwndClient)
2730{
2731 /* returns TRUE if a directory container window was told to close */
[2]2732
[133]2733 HENUM henum;
2734 HWND hwndChild, hwndDir, hwndTemp;
2735 BOOL ret = FALSE;
[2]2736
[133]2737 fNoTileUpdate = TRUE;
2738 henum = WinBeginEnumWindows(hwndClient);
[551]2739 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
2740 if (hwndChild != hwndTree) {
[133]2741 hwndTemp = WinWindowFromID(hwndChild, FID_CLIENT);
[551]2742 if (hwndTemp) {
[133]2743 hwndDir = WinWindowFromID(hwndTemp, DIR_CNR);
[551]2744 if (hwndDir) {
[133]2745 WinSendMsg(WinWindowFromID(hwndChild, FID_CLIENT),
[551]2746 WM_CLOSE, MPVOID, MPVOID);
[133]2747 ret = TRUE;
[2]2748 }
[133]2749 }
2750 }
2751 }
2752 WinEndEnumWindows(henum);
2753 fNoTileUpdate = FALSE;
2754 return ret;
[2]2755}
2756
[557]2757/** Save directory container state
2758 * @param hwndClient Client window handle
2759 * @param pszStateName State name to save, NULL to save global state
[789]2760 * @returns Number of directory container windows that were saved or -1 if error
[557]2761 * @seealso RestoreDirCnrState
2762 */
2763
[787]2764#define STATE_NAME_MAX_BYTES 256
2765
[789]2766INT SaveDirCnrState(HWND hwndClient, PSZ pszStateName)
[133]2767{
2768 HENUM henum;
2769 HWND hwndChild, hwndDir, hwndC;
2770 ULONG numsaves = 0, flWindowAttr;
[787]2771 CHAR szPrefix[STATE_NAME_MAX_BYTES + 1];
2772 CHAR szKey[STATE_NAME_MAX_BYTES + 80];
[558]2773 CHAR szDir[CCHMAXPATH];
[133]2774 SWP swp;
[789]2775 INT nSaved = 0;
[133]2776 DIRCNRDATA *dcd;
[2]2777
[558]2778 if (!pszStateName)
2779 strcpy(szPrefix, NullStr);
2780 else {
2781 if (strlen(pszStateName) > sizeof(szPrefix) - 2) {
2782 Runtime_Error(pszSrcFile, __LINE__, "SaveDirCnrState");
[789]2783 return -1;
[558]2784 }
2785 sprintf(szPrefix, "%s.", pszStateName);
2786 }
2787
[133]2788 henum = WinBeginEnumWindows(hwndClient);
[551]2789 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
2790 if (hwndChild != hwndTree) {
[133]2791 hwndC = WinWindowFromID(hwndChild, FID_CLIENT);
[551]2792 if (hwndC) {
[133]2793 hwndDir = WinWindowFromID(hwndC, DIR_CNR);
[551]2794 if (hwndDir) {
[133]2795 WinQueryWindowPos(hwndChild, &swp);
[558]2796 *szDir = 0;
2797 WinSendMsg(hwndC, UM_CONTAINERDIR, MPFROMP(szDir), MPVOID);
2798 if (*szDir) {
2799 if (driveflags[toupper(*szDir) - 'A'] & DRIVE_NOPRESCAN)
[557]2800 continue;
[787]2801 sprintf(szKey, "%sDirCnrPos.%lu", szPrefix, numsaves);
2802 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & swp,
[133]2803 sizeof(SWP));
[551]2804 dcd =
2805 WinQueryWindowPtr(WinWindowFromID(hwndC, DIR_CNR), QWL_USER);
2806 if (dcd) {
[787]2807 sprintf(szKey, "%sDirCnrSort.%lu", szPrefix, numsaves);
2808 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & dcd->sortFlags,
[133]2809 sizeof(INT));
[787]2810 sprintf(szKey, "%sDirCnrFilter.%lu", szPrefix, numsaves);
2811 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & dcd->mask,
[133]2812 sizeof(MASK));
[787]2813 sprintf(szKey, "%sDirCnrView.%lu", szPrefix, numsaves);
[551]2814 flWindowAttr = dcd->flWindowAttr;
2815 if (!fLeaveTree && (flWindowAttr & CV_TREE)) {
[133]2816 flWindowAttr &= (~(CV_TREE | CV_ICON | CV_DETAIL | CV_TEXT));
[551]2817 if (dcd->lastattr) {
2818 if (dcd->lastattr & CV_TEXT)
[133]2819 flWindowAttr |= CV_TEXT;
[551]2820 else if (dcd->lastattr & CV_DETAIL)
[133]2821 flWindowAttr |= CV_DETAIL;
[551]2822 else if (dcd->lastattr & CV_ICON)
[133]2823 flWindowAttr |= CV_ICON;
2824 else
2825 flWindowAttr |= CV_NAME;
[2]2826 }
[133]2827 else
2828 flWindowAttr |= CV_NAME;
2829 }
[787]2830 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & flWindowAttr,
[133]2831 sizeof(ULONG));
[923]2832 sprintf(szKey, "%sDirCnr.%lu.DetailsLongname", szPrefix, numsaves);
2833 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & dcd->detailslongname,
2834 sizeof(BOOL));
2835 sprintf(szKey, "%sDirCnr.%lu.DetailsSubject", szPrefix, numsaves);
2836 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & dcd->detailssubject,
2837 sizeof(BOOL));
2838 sprintf(szKey, "%sDirCnr.%lu.DetailsSize", szPrefix, numsaves);
2839 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & dcd->detailssize,
2840 sizeof(BOOL));
2841 sprintf(szKey, "%sDirCnr.%lu.DetailsEA", szPrefix, numsaves);
2842 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & dcd->detailsea,
2843 sizeof(BOOL));
2844 sprintf(szKey, "%sDirCnr.%lu.DetailsAttr", szPrefix, numsaves);
2845 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & dcd->detailsattr,
2846 sizeof(BOOL));
2847 sprintf(szKey, "%sDirCnr.%lu.DetailsIcon", szPrefix, numsaves);
2848 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & dcd->detailsicon,
2849 sizeof(BOOL));
2850 sprintf(szKey, "%sDirCnr.%lu.DetailsLWDate", szPrefix, numsaves);
2851 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & dcd->detailslwdate,
2852 sizeof(BOOL));
2853 sprintf(szKey, "%sDirCnr.%lu.DetailsLWTime", szPrefix, numsaves);
2854 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & dcd->detailslwtime,
2855 sizeof(BOOL));
2856 sprintf(szKey, "%sDirCnr.%lu.DetailsLADate", szPrefix, numsaves);
2857 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & dcd->detailsladate,
2858 sizeof(BOOL));
2859 sprintf(szKey, "%sDirCnr.%lu.DetailsLATime", szPrefix, numsaves);
2860 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & dcd->detailslatime,
2861 sizeof(BOOL));
2862 sprintf(szKey, "%sDirCnr.%lu.DetailsCRDate", szPrefix, numsaves);
2863 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & dcd->detailscrdate,
2864 sizeof(BOOL));
2865 sprintf(szKey, "%sDirCnr.%lu.DetailsCRTime", szPrefix, numsaves);
2866 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & dcd->detailscrtime,
2867 sizeof(BOOL));
[133]2868 }
[787]2869 sprintf(szKey, "%sDirCnrDir.%lu", szPrefix, numsaves++);
2870 PrfWriteProfileString(fmprof, FM3Str, szKey, szDir);
[789]2871 nSaved++;
[133]2872 }
[2]2873 }
[133]2874 }
2875 }
[557]2876 } // while
[133]2877 WinEndEnumWindows(henum);
[558]2878
[789]2879 if (nSaved) {
[551]2880 if (WinQueryWindowPos(hwndTree, &swp)) {
[787]2881 sprintf(szKey, "%sLastTreePos", szPrefix);
2882 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & swp, sizeof(SWP));
[133]2883 }
[787]2884 sprintf(szKey, "%sNumDirsLastTime", szPrefix);
2885 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & numsaves, sizeof(ULONG));
[133]2886 WinQueryWindowPos(WinQueryWindow(hwndClient, QW_PARENT), &swp);
[787]2887 sprintf(szKey, "%sMySizeLastTime", szPrefix);
2888 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & swp, sizeof(SWP));
[133]2889 }
[558]2890
[789]2891 return nSaved;
[2]2892}
2893
[178]2894static VOID TransformSwp(PSWP pswp, double xtrans, double ytrans)
[133]2895{
2896 SWP swp;
2897 HWND hwnd;
[2]2898
[551]2899 if ((LONG) pswp->x < 0L) {
2900 pswp->cx -= abs(pswp->x);
2901 pswp->x = 0;
[133]2902 }
[551]2903 if ((LONG) pswp->y < 0L) {
2904 pswp->cy -= abs(pswp->y);
2905 pswp->y = 0;
[133]2906 }
[551]2907 pswp->x = (LONG) (((double)pswp->x * 100.0) / xtrans);
2908 pswp->cx = (LONG) (((double)pswp->cx * 100.0) / xtrans);
2909 pswp->y = (LONG) (((double)pswp->y * 100.0) / ytrans);
2910 pswp->cy = (LONG) (((double)pswp->cy * 100.0) / ytrans);
2911 if (pswp->hwnd) {
2912 hwnd = WinQueryWindow(pswp->hwnd, QW_PARENT);
2913 if (hwnd) {
2914 if (WinQueryWindowPos(hwnd, &swp)) {
2915 if (pswp->x > swp.cx)
2916 pswp->x = (swp.cx > 24) ? swp.cx - 24 : swp.cx;
2917 if (pswp->y > swp.cy)
2918 pswp->y = (swp.cy > 24) ? swp.cy - 24 : swp.cy;
2919 if (pswp->x + pswp->cx > swp.cx)
2920 pswp->cx = swp.cx - pswp->x;
2921 if (pswp->y + pswp->cy > swp.cy)
2922 pswp->cy = swp.cy - pswp->y;
[133]2923 }
2924 }
2925 }
[2]2926}
2927
[557]2928/** Restore directory container state
2929 * @param hwndClient Client window handle
2930 * @param pszStateName State name to restore, NULL to restore global state
2931 * @returns TRUE if one or more directory containers were opened
2932 * @seealso SaveDirCnrState
2933 */
2934
2935static BOOL RestoreDirCnrState(HWND hwndClient, PSZ pszStateName, BOOL noview)
[133]2936{
[787]2937 CHAR szKey[STATE_NAME_MAX_BYTES + 80];
[558]2938 CHAR szDir[CCHMAXPATH];
[787]2939 CHAR szPrefix[STATE_NAME_MAX_BYTES + 2];
[133]2940 HWND hwndDir, hwndC;
2941 SWP swp, swpO, swpN;
2942 ULONG size, numsaves = 0L, x;
2943 double xtrans, ytrans;
[558]2944 BOOL fRestored = FALSE;
[923]2945 DIRCNRDATA localdcd, *dcd;
[2]2946
[558]2947 if (!pszStateName)
2948 strcpy(szPrefix, NullStr);
2949 else {
2950 if (strlen(pszStateName) > sizeof(szPrefix) - 2) {
2951 Runtime_Error(pszSrcFile, __LINE__, "RestoreDirCnrState");
2952 return fRestored;
2953 }
2954 sprintf(szPrefix, "%s.", pszStateName);
2955 }
2956
[133]2957 size = sizeof(SWP);
[787]2958 sprintf(szKey, "%sMySizeLastTime", szPrefix);
[133]2959 if (!PrfQueryProfileData(fmprof,
2960 FM3Str,
[787]2961 szKey,
[133]2962 (PVOID) & swpO,
2963 &size) ||
2964 size != sizeof(SWP) || !swp.cx || !swp.cy)
[558]2965 {
[133]2966 WinQueryWindowPos(WinQueryWindow(hwndClient, QW_PARENT), &swpO);
[558]2967 }
[557]2968 if (!pszStateName || !strcmp(pszStateName, GetPString(IDS_FM2TEMPTEXT)))
[787]2969 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
[133]2970 WinQueryWindowPos(WinQueryWindow(hwndClient, QW_PARENT), &swpN);
2971 if (swpN.fl & (SWP_MINIMIZE | SWP_HIDE))
2972 swpN = swpO;
[551]2973 xtrans = ((double)swpO.cx * 100.0) / (double)swpN.cx;
2974 ytrans = ((double)swpO.cy * 100.0) / (double)swpN.cy;
[133]2975 size = sizeof(SWP);
[787]2976 sprintf(szKey, "%sLastTreePos", szPrefix);
2977 if (PrfQueryProfileData(fmprof, FM3Str, szKey, (PVOID) & swp, &size)) {
[557]2978 if (!pszStateName || !strcmp(pszStateName, GetPString(IDS_FM2TEMPTEXT)))
[787]2979 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
[133]2980 swp.hwnd = hwndTree;
[551]2981 TransformSwp(&swp, xtrans, ytrans);
2982 if (!fFreeTree) {
[133]2983 WinQueryWindowPos(hwndClient, &swpN);
2984 swp.x = 0;
2985 swp.y = (swpN.cy - swp.cy);
2986 }
[551]2987 if (!(swp.fl & (SWP_MINIMIZE | SWP_HIDE))) {
[133]2988 swp.fl &= (~SWP_ACTIVATE);
[2]2989 WinSetWindowPos(hwndTree,
[133]2990 HWND_TOP,
2991 swp.x,
2992 swp.y,
2993 swp.cx,
2994 swp.cy,
[551]2995 swp.fl | SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_ZORDER);
[133]2996 }
[551]2997 else {
[2]2998 WinSetWindowPos(hwndTree,
[551]2999 HWND_TOP, 0, 0, 0, 0, SWP_MINIMIZE | SWP_SHOW);
3000 WinSetWindowUShort(hwndTree, QWS_XRESTORE, (USHORT) swp.x);
3001 WinSetWindowUShort(hwndTree, QWS_CXRESTORE, (USHORT) swp.cx);
3002 WinSetWindowUShort(hwndTree, QWS_YRESTORE, (USHORT) swp.y);
3003 WinSetWindowUShort(hwndTree, QWS_CYRESTORE, (USHORT) swp.cy);
[133]3004 }
3005 }
3006 size = sizeof(ULONG);
[787]3007 sprintf(szKey, "%sNumDirsLastTime", szPrefix);
[133]3008 if (PrfQueryProfileData(fmprof,
[787]3009 FM3Str, szKey, (PVOID) & numsaves, &size) && numsaves) {
[557]3010 if (!pszStateName || !strcmp(pszStateName, GetPString(IDS_FM2TEMPTEXT)))
[787]3011 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
[551]3012 for (x = 0; x < numsaves; x++) {
[787]3013 sprintf(szKey, "%sDirCnrPos.%lu", szPrefix, x);
[133]3014 size = sizeof(SWP);
[787]3015 if (PrfQueryProfileData(fmprof, FM3Str, szKey, (PVOID) & swp, &size)) {
[557]3016 if (!pszStateName || !strcmp(pszStateName, GetPString(IDS_FM2TEMPTEXT)))
[787]3017 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3018 sprintf(szKey, "%sDirCnrDir.%lu", szPrefix, x);
[558]3019 size = sizeof(szDir);
[787]3020 if (PrfQueryProfileData(fmprof, FM3Str, szKey, (PVOID) szDir, &size)) {
[557]3021 if (!pszStateName || !strcmp(pszStateName, GetPString(IDS_FM2TEMPTEXT)))
[787]3022 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
[558]3023 if (driveflags[toupper(*szDir) - 'A'] & DRIVE_NOPRESCAN) {
[787]3024 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
[558]3025 continue;
3026 }
[923]3027 localdcd.detailslongname = detailslongname; // Set default
3028 size = sizeof(BOOL);
3029 sprintf(szKey, "%sDirCnr.%lu.DetailsLongname", szPrefix, x);
3030 if (PrfQueryProfileData(fmprof,
3031 FM3Str,
3032 szKey,
3033 (PVOID) & localdcd.detailslongname,
3034 &size) && size == sizeof(BOOL))
3035 {
3036 if (!pszStateName || !strcmp(pszStateName, FM2_STATE_AT_CLOSE))
3037 JBSDBG PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3038 }
3039 localdcd.detailssubject = detailssubject; // Set default
3040 size = sizeof(BOOL);
3041 sprintf(szKey, "%sDirCnr.%lu.DetailsSubject", szPrefix, x);
3042 if (PrfQueryProfileData(fmprof,
3043 FM3Str,
3044 szKey,
3045 (PVOID) & localdcd.detailssubject,
3046 &size) && size == sizeof(BOOL))
3047 {
3048 if (!pszStateName || !strcmp(pszStateName, FM2_STATE_AT_CLOSE))
3049 JBSDBG PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3050 }
3051 localdcd.detailsea = detailsea; // Set default
3052 size = sizeof(BOOL);
3053 sprintf(szKey, "%sDirCnr.%lu.DetailsEA", szPrefix, x);
3054 if (PrfQueryProfileData(fmprof,
3055 FM3Str,
3056 szKey,
3057 (PVOID) & localdcd.detailsea,
3058 &size) && size == sizeof(BOOL))
3059 {
3060 if (!pszStateName || !strcmp(pszStateName, FM2_STATE_AT_CLOSE))
3061 JBSDBG PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3062 }
3063 localdcd.detailssize = detailssize; // Set default
3064 size = sizeof(BOOL);
3065 sprintf(szKey, "%sDirCnr.%lu.DetailsSize", szPrefix, x);
3066 if (PrfQueryProfileData(fmprof,
3067 FM3Str,
3068 szKey,
3069 (PVOID) & localdcd.detailssize,
3070 &size) && size == sizeof(BOOL))
3071 {
3072 if (!pszStateName || !strcmp(pszStateName, FM2_STATE_AT_CLOSE))
3073 JBSDBG PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3074 }
3075 localdcd.detailsicon = detailsicon; // Set default
3076 size = sizeof(BOOL);
3077 sprintf(szKey, "%sDirCnr.%lu.DetailsIcon", szPrefix, x);
3078 if (PrfQueryProfileData(fmprof,
3079 FM3Str,
3080 szKey,
3081 (PVOID) & localdcd.detailsicon,
3082 &size) && size == sizeof(BOOL))
3083 {
3084 if (!pszStateName || !strcmp(pszStateName, FM2_STATE_AT_CLOSE))
3085 JBSDBG PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3086 }
3087 localdcd.detailsattr = detailsattr; // Set default
3088 size = sizeof(BOOL);
3089 sprintf(szKey, "%sDirCnr.%lu.DetailsAttr", szPrefix, x);
3090 if (PrfQueryProfileData(fmprof,
3091 FM3Str,
3092 szKey,
3093 (PVOID) & localdcd.detailsattr,
3094 &size) && size == sizeof(BOOL))
3095 {
3096 if (!pszStateName || !strcmp(pszStateName, FM2_STATE_AT_CLOSE))
3097 JBSDBG PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3098 }
3099 localdcd.detailscrdate = detailscrdate; // Set default
3100 size = sizeof(BOOL);
3101 sprintf(szKey, "%sDirCnr.%lu.DetailsCRDate", szPrefix, x);
3102 if (PrfQueryProfileData(fmprof,
3103 FM3Str,
3104 szKey,
3105 (PVOID) & localdcd.detailscrdate,
3106 &size) && size == sizeof(BOOL))
3107 {
3108 if (!pszStateName || !strcmp(pszStateName, FM2_STATE_AT_CLOSE))
3109 JBSDBG PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3110 }
3111 localdcd.detailscrtime = detailscrtime; // Set default
3112 size = sizeof(BOOL);
3113 sprintf(szKey, "%sDirCnr.%lu.DetailsCRTime", szPrefix, x);
3114 if (PrfQueryProfileData(fmprof,
3115 FM3Str,
3116 szKey,
3117 (PVOID) & localdcd.detailscrtime,
3118 &size) && size == sizeof(BOOL))
3119 {
3120 if (!pszStateName || !strcmp(pszStateName, FM2_STATE_AT_CLOSE))
3121 JBSDBG PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3122 }
3123 localdcd.detailslwdate = detailslwdate; // Set default
3124 size = sizeof(BOOL);
3125 sprintf(szKey, "%sDirCnr.%lu.DetailsLWDate", szPrefix, x);
3126 if (PrfQueryProfileData(fmprof,
3127 FM3Str,
3128 szKey,
3129 (PVOID) & localdcd.detailslwdate,
3130 &size) && size == sizeof(BOOL))
3131 {
3132 if (!pszStateName || !strcmp(pszStateName, FM2_STATE_AT_CLOSE))
3133 JBSDBG PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3134 }
3135 localdcd.detailslwtime = detailslwtime; // Set default
3136 size = sizeof(BOOL);
3137 sprintf(szKey, "%sDirCnr.%lu.DetailsLWTime", szPrefix, x);
3138 if (PrfQueryProfileData(fmprof,
3139 FM3Str,
3140 szKey,
3141 (PVOID) & localdcd.detailslwtime,
3142 &size) && size == sizeof(BOOL))
3143 {
3144 if (!pszStateName || !strcmp(pszStateName, FM2_STATE_AT_CLOSE))
3145 JBSDBG PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3146 }
3147 localdcd.detailsladate = detailsladate; // Set default
3148 size = sizeof(BOOL);
3149 sprintf(szKey, "%sDirCnr.%lu.DetailsLADate", szPrefix, x);
3150 if (PrfQueryProfileData(fmprof,
3151 FM3Str,
3152 szKey,
3153 (PVOID) & localdcd.detailsladate,
3154 &size) && size == sizeof(BOOL))
3155 {
3156 if (!pszStateName || !strcmp(pszStateName, FM2_STATE_AT_CLOSE))
3157 JBSDBG PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3158 }
3159 localdcd.detailslatime = detailslatime; // Set default
3160 size = sizeof(BOOL);
3161 sprintf(szKey, "%sDirCnr.%lu.DetailsLATime", szPrefix, x);
3162 if (PrfQueryProfileData(fmprof,
3163 FM3Str,
3164 szKey,
3165 (PVOID) & localdcd.detailslatime,
3166 &size) && size == sizeof(BOOL))
3167 {
3168 if (!pszStateName || !strcmp(pszStateName, FM2_STATE_AT_CLOSE))
3169 JBSDBG PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3170 }
[551]3171 hwndDir = (HWND) WinSendMsg(hwndClient,
[133]3172 UM_SETDIR,
[787]3173 MPFROMP(szDir), MPFROMLONG(1));
[551]3174 if (hwndDir) {
3175 hwndC = WinWindowFromID(hwndDir, FID_CLIENT);
3176 if (hwndC) {
[923]3177 HWND hwndCnr = WinWindowFromID(hwndC, DIR_CNR);
3178 dcd = WinQueryWindowPtr(hwndCnr, QWL_USER);
[551]3179 if (dcd) {
[923]3180 dcd->detailslongname = localdcd.detailslongname;
3181 dcd->detailssubject = localdcd.detailssubject ;
3182 dcd->detailsattr = localdcd.detailsattr ;
3183 dcd->detailsea = localdcd.detailsea ;
3184 dcd->detailssize = localdcd.detailssize ;
3185 dcd->detailsicon = localdcd.detailsicon ;
3186 dcd->detailscrdate = localdcd.detailscrdate ;
3187 dcd->detailscrtime = localdcd.detailscrtime ;
3188 dcd->detailsladate = localdcd.detailsladate ;
3189 dcd->detailslatime = localdcd.detailslatime ;
3190 dcd->detailslwdate = localdcd.detailslwdate ;
3191 dcd->detailslwtime = localdcd.detailslwtime ;
[133]3192 size = sizeof(INT);
[787]3193 sprintf(szKey, "%sDirCnrSort.%lu", szPrefix, x);
[133]3194 if (PrfQueryProfileData(fmprof,
3195 FM3Str,
[787]3196 szKey,
[551]3197 (PVOID) & dcd->sortFlags,
3198 &size) && size == sizeof(INT)) {
3199 if (!dcd->sortFlags)
3200 dcd->sortFlags = SORT_PATHNAME;
[133]3201 }
[557]3202 if (!pszStateName || !strcmp(pszStateName, GetPString(IDS_FM2TEMPTEXT)))
[787]3203 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
[133]3204 size = sizeof(MASK);
[787]3205 sprintf(szKey, "%sDirCnrFilter.%lu", szPrefix, x);
[133]3206 if (PrfQueryProfileData(fmprof,
3207 FM3Str,
[787]3208 szKey,
[551]3209 (PVOID) & dcd->mask, &size) && size) {
3210 if (*dcd->mask.szMask)
[133]3211 WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
[551]3212 UM_FILTER, MPFROMP(dcd->mask.szMask), MPVOID);
[133]3213 }
[551]3214 *(dcd->mask.prompt) = 0;
[557]3215 if (!pszStateName || !strcmp(pszStateName, GetPString(IDS_FM2TEMPTEXT)))
[787]3216 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
[133]3217 size = sizeof(ULONG);
[787]3218 sprintf(szKey, "%sDirCnrView.%lu", szPrefix, x);
[551]3219 if (!noview) {
[133]3220 if (PrfQueryProfileData(fmprof,
3221 FM3Str,
[787]3222 szKey,
[551]3223 (PVOID) & dcd->flWindowAttr,
3224 &size) && size == sizeof(ULONG)) {
[2]3225
[133]3226 CNRINFO cnri;
[2]3227
[133]3228 memset(&cnri, 0, sizeof(CNRINFO));
3229 cnri.cb = sizeof(CNRINFO);
3230 if (WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
3231 CM_QUERYCNRINFO,
3232 MPFROMP(&cnri),
[551]3233 MPFROMLONG(sizeof(CNRINFO)))) {
3234 cnri.flWindowAttr = dcd->flWindowAttr;
[133]3235 WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
3236 CM_SETCNRINFO,
3237 MPFROMP(&cnri),
3238 MPFROMLONG(CMA_FLWINDOWATTR));
3239 }
3240 }
[2]3241 }
[557]3242 if (!pszStateName || !strcmp(pszStateName, GetPString(IDS_FM2TEMPTEXT)))
[787]3243 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
[923]3244 if (!PostMsg(hwndCnr, UM_SETUP2, NULL, NULL))
3245 WinSendMsg(hwndCnr, UM_SETUP2, NULL, NULL);
[133]3246 }
3247 }
[558]3248 fRestored = TRUE;
[133]3249 swp.hwnd = hwndDir;
[551]3250 TransformSwp(&swp, xtrans, ytrans);
3251 if (!fAutoTile && !(swp.fl & (SWP_HIDE | SWP_MINIMIZE)))
[133]3252 WinSetWindowPos(hwndDir,
3253 HWND_TOP,
3254 swp.x,
3255 swp.y,
3256 swp.cx,
3257 swp.cy,
3258 swp.fl | SWP_MOVE |
[551]3259 SWP_SIZE | SWP_SHOW | SWP_ZORDER |
3260 SWP_ACTIVATE);
3261 else if (swp.fl & (SWP_HIDE | SWP_MINIMIZE)) {
[133]3262 WinSetWindowPos(hwndDir,
[551]3263 HWND_TOP, 0, 0, 0, 0, SWP_MINIMIZE | SWP_SHOW);
3264 WinSetWindowUShort(hwndDir, QWS_XRESTORE, (USHORT) swp.x);
3265 WinSetWindowUShort(hwndDir, QWS_CXRESTORE, (USHORT) swp.cx);
3266 WinSetWindowUShort(hwndDir, QWS_YRESTORE, (USHORT) swp.y);
3267 WinSetWindowUShort(hwndDir, QWS_CYRESTORE, (USHORT) swp.cy);
[133]3268 }
3269 else
3270 WinSetWindowPos(hwndDir,
3271 HWND_TOP,
[551]3272 0, 0, 0, 0, SWP_ZORDER | SWP_ACTIVATE);
[133]3273 }
[2]3274 }
[133]3275 }
[557]3276 } // for
[133]3277 }
[558]3278 return fRestored;
[2]3279}
3280
[178]3281static ULONG CountChildren(HWND hwndClient, ULONG * ulNumMinChildren)
[133]3282{
3283 HENUM henum;
3284 HWND hwndChild;
3285 SWP swp;
3286 register ULONG ulCnt = 0L;
3287 USHORT id;
[2]3288
[133]3289 if (ulNumMinChildren)
3290 *ulNumMinChildren = 0L;
3291 henum = WinBeginEnumWindows(hwndClient);
[551]3292 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
[133]3293 id = WinQueryWindowUShort(hwndChild, QWS_ID);
3294 if (!id || (!fFreeTree && id == TREE_FRAME))
3295 continue;
3296 ulCnt++;
[551]3297 if (ulNumMinChildren) {
3298 if (WinQueryWindowPos(hwndChild, &swp) && (swp.fl & SWP_MINIMIZE))
[133]3299 (*ulNumMinChildren)++;
3300 }
3301 }
3302 WinEndEnumWindows(henum);
3303 return ulCnt;
[2]3304}
3305
[133]3306VOID GetNextWindowPos(HWND hwndClient, PSWP pswp, ULONG * ulCntR,
3307 ULONG * ulNumMinChildrenR)
3308{
3309 register ULONG ulCnt;
3310 ULONG ulNumMinChildren;
3311 RECTL Rectl;
3312 register ULONG ulXDiff, ulYDiff, ulWindowsPerStack;
[2]3313
[133]3314 if (!ulCntR || !ulNumMinChildrenR)
3315 ulCnt = CountChildren(hwndClient, &ulNumMinChildren);
[551]3316 else {
[133]3317 ulCnt = *ulCntR;
3318 ulNumMinChildren = *ulNumMinChildrenR;
[787]3319 if (ulCnt == (ULONG) - 1) {
[133]3320 ulCnt = CountChildren(hwndClient, &ulNumMinChildren);
3321 /* return these values to the caller for later use */
3322 *ulCntR = ulCnt;
3323 *ulNumMinChildrenR = ulNumMinChildren;
3324 }
3325 }
3326 WinQueryWindowRect(hwndClient, &Rectl);
3327 AdjustSizeOfClient(NULL, &Rectl);
[551]3328 if (!fFreeTree) {
[2]3329
[133]3330 SWP swp;
[2]3331
[133]3332 WinQueryWindowPos(hwndTree, &swp);
3333 if (ulNumMinChildren || (swp.fl & (SWP_HIDE | SWP_MINIMIZE)))
3334 Rectl.yBottom += WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2;
3335 }
3336 else if (ulNumMinChildren)
3337 Rectl.yBottom += WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2;
[2]3338
[133]3339 ulXDiff = WinQuerySysValue(HWND_DESKTOP, SV_CXSIZEBORDER) +
3340 WinQuerySysValue(HWND_DESKTOP, SV_CXMINMAXBUTTON) / 2;
3341 ulYDiff = WinQuerySysValue(HWND_DESKTOP, SV_CYSIZEBORDER) +
3342 WinQuerySysValue(HWND_DESKTOP, SV_CYMINMAXBUTTON);
3343 ulWindowsPerStack = (Rectl.yTop - Rectl.yBottom) / (3 * ulYDiff);
[551]3344 pswp->cx = Rectl.xRight - (ulWindowsPerStack * ulXDiff);
3345 pswp->cy = (Rectl.yTop - Rectl.yBottom) - (ulWindowsPerStack * ulYDiff);
[133]3346 ulWindowsPerStack++;
[551]3347 pswp->x = Rectl.xLeft + ((ulCnt % ulWindowsPerStack) * ulXDiff);
3348 pswp->y = (Rectl.yTop - pswp->cy - ((ulCnt % ulWindowsPerStack) * ulYDiff));
[2]3349}
3350
[178]3351static VOID CascadeChildren(HWND hwndClient)
[133]3352{
3353 ULONG ulCnt = 0L, ulNumMinChildren;
3354 HWND hwndChild;
3355 HENUM henum;
3356 SWP swp;
3357 USHORT id;
3358 RECTL Rectl;
[2]3359
[133]3360 WinQueryWindowPos(hwndClient, &swp);
3361 if (swp.fl & (SWP_HIDE | SWP_MINIMIZE))
3362 return;
[2]3363
[133]3364 CountChildren(hwndClient, &ulNumMinChildren);
[551]3365 if (!fFreeTree) {
[133]3366 WinQueryWindowRect(hwndClient, &Rectl);
3367 AdjustSizeOfClient(NULL, &Rectl);
3368 WinQueryWindowPos(hwndTree, &swp);
[551]3369 if (!(swp.fl & (SWP_MAXIMIZE | SWP_HIDE | SWP_MINIMIZE))) {
[133]3370 if (swp.y + swp.cy < Rectl.yTop - Rectl.yBottom)
3371 swp.cy = (Rectl.yTop - Rectl.yBottom) - swp.y;
3372 if (swp.x != 0)
3373 swp.x = 0;
3374 if (swp.y < 0)
3375 swp.y = 0;
3376 if (swp.x + swp.cx > Rectl.xRight - Rectl.xLeft)
3377 swp.cx = Rectl.xRight - Rectl.xLeft;
3378 WinSetWindowPos(hwndTree, HWND_TOP, swp.x, swp.y, swp.cx, swp.cy,
3379 SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_RESTORE);
3380 }
3381 }
3382 henum = WinBeginEnumWindows(hwndClient);
[551]3383 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
[133]3384 id = WinQueryWindowUShort(hwndChild, QWS_ID);
3385 if (!id || (!fFreeTree && id == TREE_FRAME))
3386 continue;
3387 WinQueryWindowPos(hwndChild, &swp);
[551]3388 if (!(swp.fl & (SWP_MINIMIZE | SWP_HIDE))) {
[133]3389 GetNextWindowPos(hwndClient, &swp, &ulCnt, &ulNumMinChildren);
3390 WinSetWindowPos(hwndChild, HWND_TOP, swp.x, swp.y, swp.cx, swp.cy,
3391 SWP_SIZE | SWP_MOVE | SWP_SHOW | SWP_RESTORE |
3392 SWP_ZORDER | SWP_ACTIVATE);
3393 ulCnt++;
3394 }
3395 }
3396 WinEndEnumWindows(henum);
[2]3397}
3398
[133]3399VOID TileChildren(HWND hwndClient, BOOL absolute)
3400{
3401 register ULONG ulChildCnt, ulSquare, ulNumRows, ulNumCols, ulExtraCols,
[551]3402 ulWidth, ulHeight;
[133]3403 ULONG ulNumMinChildren;
3404 RECTL Rectl;
3405 HWND hwndChild;
[2]3406
[133]3407 if (fNoTileUpdate || hwndClient == HWND_DESKTOP)
3408 return;
3409 {
3410 SWP swp;
[2]3411
[133]3412 WinQueryWindowPos(hwndClient, &swp);
3413 if (swp.fl & (SWP_HIDE | SWP_MINIMIZE))
3414 return;
3415 }
[551]3416 ulChildCnt = CountChildren(hwndClient, &ulNumMinChildren);
[133]3417 ulChildCnt -= ulNumMinChildren;
3418 if (!ulChildCnt)
3419 return;
[2]3420
[133]3421 fNoTileUpdate = TRUE;
[2]3422
[551]3423 for (ulSquare = 2; ulSquare * ulSquare <= ulChildCnt; ulSquare++) {
[133]3424 ;
[200]3425 }
[551]3426 if (!fTileBackwards) {
[787]3427 ulNumCols = ulSquare - 1;
[133]3428 ulNumRows = ulChildCnt / ulNumCols;
3429 }
[551]3430 else {
[787]3431 ulNumRows = ulSquare - 1;
[133]3432 ulNumCols = ulChildCnt / ulNumRows;
3433 }
3434 ulExtraCols = ulChildCnt % ulNumCols;
[2]3435
[551]3436 WinQueryWindowRect(hwndClient, &Rectl);
[2]3437
[551]3438 if (!fFreeTree) {
[2]3439
[133]3440 SWP swp;
[2]3441
[133]3442 WinQueryWindowPos(hwndTree, &swp);
[551]3443 if (!(swp.fl & (SWP_MAXIMIZE | SWP_HIDE | SWP_MINIMIZE))) {
[133]3444 if (swp.y < 0)
3445 swp.y = 0;
3446 if (swp.y + swp.cy < Rectl.yTop - Rectl.yBottom)
3447 swp.cy = (Rectl.yTop - Rectl.yBottom) - swp.y;
3448 if (swp.x != 0)
3449 swp.x = 0;
3450 if (swp.x + swp.cx > Rectl.xRight - Rectl.xLeft)
3451 swp.cx = Rectl.xRight - Rectl.xLeft;
[2]3452 WinSetWindowPos(hwndTree,
[133]3453 HWND_TOP,
3454 swp.x,
3455 swp.y,
3456 swp.cx,
[551]3457 swp.cy, SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_RESTORE);
[133]3458 WinQueryWindowPos(hwndTree, &swp);
3459 }
[551]3460 if (ulNumMinChildren || (swp.fl & (SWP_HIDE | SWP_MINIMIZE)))
[133]3461 Rectl.yBottom += WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2;
3462 }
3463 else if (ulNumMinChildren)
3464 Rectl.yBottom += WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2;
[2]3465
[551]3466 AdjustSizeOfClient(NULL, &Rectl);
[2]3467
[551]3468 if (Rectl.xRight > 0L && (Rectl.yBottom < Rectl.yTop)) {
[2]3469
[133]3470 HENUM henum;
[2]3471
[133]3472 henum = WinBeginEnumWindows(hwndClient);
[551]3473 if ((hwndChild = WinGetNextWindow(henum)) != (HWND) 0) {
[2]3474
[133]3475 ULONG ulCurRow, ulCurCol;
3476 SWP swp;
3477 USHORT id;
[2]3478
[133]3479 ulHeight = (Rectl.yTop - Rectl.yBottom) / ulNumRows;
[2]3480
[551]3481 for (ulCurRow = 0; ulCurRow < ulNumRows; ulCurRow++) {
[133]3482 if ((ulNumRows - ulCurRow) <= ulExtraCols)
3483 ulNumCols++;
[551]3484 for (ulCurCol = 0; ulCurCol < ulNumCols; ulCurCol++) {
[133]3485 ulWidth = Rectl.xRight / ulNumCols;
[2]3486
[551]3487 while (hwndChild) {
[133]3488 id = WinQueryWindowUShort(hwndChild, QWS_ID);
[551]3489 if (id && (id != TREE_FRAME || fFreeTree)) {
[133]3490 WinQueryWindowPos(hwndChild, &swp);
3491 if (!(swp.fl & (SWP_HIDE | SWP_MINIMIZE)))
3492 break;
3493 }
3494 hwndChild = WinGetNextWindow(henum);
3495 }
[2]3496
[551]3497 if (hwndChild) {
3498 if (!absolute && (swp.fl & SWP_MAXIMIZE)) {
[133]3499 WinGetMaxPosition(hwndChild, &swp);
3500 WinSetWindowPos(hwndChild,
3501 HWND_TOP,
3502 swp.x,
3503 swp.y,
[551]3504 swp.cx, swp.cy, SWP_MOVE | SWP_SIZE | SWP_SHOW);
[133]3505 WinSetWindowUShort(hwndChild,
3506 QWS_XRESTORE,
[551]3507 (USHORT) (ulWidth * ulCurCol) + Rectl.xLeft);
[133]3508 WinSetWindowUShort(hwndChild,
3509 QWS_YRESTORE,
3510 (USHORT) (Rectl.yTop -
[787]3511 (ulHeight * (ulCurRow + 1))));
[551]3512 WinSetWindowUShort(hwndChild, QWS_CXRESTORE, (USHORT) ulWidth);
3513 WinSetWindowUShort(hwndChild, QWS_CYRESTORE, (USHORT) ulHeight);
[133]3514 }
3515 else
3516 WinSetWindowPos(hwndChild,
3517 HWND_TOP,
3518 (ulWidth * ulCurCol) + Rectl.xLeft,
[787]3519 Rectl.yTop - (ulHeight * (ulCurRow + 1)),
[133]3520 ulWidth,
3521 ulHeight,
3522 SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_RESTORE);
3523 hwndChild = WinGetNextWindow(henum);
3524 }
[2]3525 }
[551]3526 if ((ulNumRows - ulCurRow) <= ulExtraCols) {
[133]3527 ulNumCols--;
3528 ulExtraCols--;
3529 }
3530 }
3531 }
3532 WinEndEnumWindows(henum);
3533 }
[2]3534
[133]3535 fNoTileUpdate = FALSE;
[2]3536}
3537
[551]3538static VOID ResizeChildren(HWND hwndClient, SHORT oldcx, SHORT oldcy,
3539 SHORT newcx, SHORT newcy)
[133]3540{
3541 /*
3542 * resize all children of the client to maintain their proportional
3543 * sizes and positions
3544 */
[2]3545
[551]3546 if (!newcx || !newcy || !oldcx || !oldcy)
[133]3547 return;
3548 {
3549 HENUM henum;
3550 HWND hwndChild;
3551 register LONG x, y, cx, cy, ucx, ucy, ux, uy;
3552 SWP swp;
[2]3553
[133]3554 henum = WinBeginEnumWindows(hwndClient);
[551]3555 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
[133]3556 if (!WinQueryWindowUShort(hwndChild, QWS_ID))
3557 continue;
[551]3558 if (WinQueryWindowPos(hwndChild, &swp)) {
3559 if (swp.fl & (SWP_MINIMIZE | SWP_HIDE)) {
[133]3560 swp.x = WinQueryWindowUShort(hwndChild, QWS_XRESTORE);
3561 swp.y = WinQueryWindowUShort(hwndChild, QWS_YRESTORE);
3562 swp.cx = WinQueryWindowUShort(hwndChild, QWS_CXRESTORE);
3563 swp.cy = WinQueryWindowUShort(hwndChild, QWS_CYRESTORE);
3564 }
[551]3565 else if (swp.fl & SWP_MAXIMIZE) {
[133]3566 swp.x = WinQueryWindowUShort(hwndChild, QWS_XRESTORE);
3567 swp.y = WinQueryWindowUShort(hwndChild, QWS_YRESTORE);
3568 swp.cx = WinQueryWindowUShort(hwndChild, QWS_CXRESTORE);
3569 swp.cy = WinQueryWindowUShort(hwndChild, QWS_CYRESTORE);
3570 }
[551]3571 cx = (swp.cx) ? (LONG) (((double)oldcx * 100.0) / (double)swp.cx) : 0;
3572 cy = (swp.cy) ? (LONG) (((double)oldcy * 100.0) / (double)swp.cy) : 0;
3573 x = (swp.x) ? (LONG) (((double)oldcx * 100.0) / (double)swp.x) : 0;
3574 y = (swp.y) ? (LONG) (((double)oldcy * 100.0) / (double)swp.y) : 0;
[133]3575 if (x < 0)
3576 x = 0;
3577 if (y < 0)
3578 y = 0;
[551]3579 ux = (x) ? (LONG) (((double)newcx * 100.0) / (double)x) : 0;
3580 uy = (y) ? (LONG) (((double)newcy * 100.0) / (double)y) : 0;
3581 ucx = (cx) ? (LONG) (((double)newcx * 100.0) / (double)cx) : 0;
3582 ucy = (cy) ? (LONG) (((double)newcy * 100.0) / (double)cy) : 0;
[133]3583 if (ux + ucx > newcx)
3584 ucx = newcx - ux;
3585 if (uy + ucy > newcy)
3586 ucy = newcy - uy;
[2]3587
[133]3588 if (!(swp.fl & (SWP_MINIMIZE | SWP_HIDE | SWP_MAXIMIZE)))
3589 WinSetWindowPos(hwndChild, HWND_TOP, ux, uy, ucx, ucy,
3590 SWP_MOVE | SWP_SIZE | SWP_SHOW);
[551]3591 else if (swp.fl & (SWP_HIDE | SWP_MINIMIZE)) {
[133]3592 WinSetWindowUShort(hwndChild, QWS_XMINIMIZE, (USHORT) - 1);
3593 WinSetWindowUShort(hwndChild, QWS_YMINIMIZE, (USHORT) - 1);
3594 WinSetWindowPos(hwndChild, HWND_TOP, 0, 0, 0, 0,
3595 SWP_SIZE | SWP_MOVE | SWP_FOCUSDEACTIVATE);
3596 WinSetWindowUShort(hwndChild, QWS_XRESTORE, ux);
3597 WinSetWindowUShort(hwndChild, QWS_YRESTORE, uy);
3598 WinSetWindowUShort(hwndChild, QWS_CXRESTORE, ucx);
3599 WinSetWindowUShort(hwndChild, QWS_CYRESTORE, ucy);
[2]3600 }
[551]3601 else {
[133]3602 WinGetMaxPosition(hwndChild, &swp);
3603 WinSetWindowPos(hwndChild, HWND_TOP, swp.x, swp.y, swp.cx, swp.cy,
3604 SWP_MOVE | SWP_SIZE | SWP_SHOW);
3605 WinSetWindowUShort(hwndChild, QWS_XRESTORE, ux);
3606 WinSetWindowUShort(hwndChild, QWS_YRESTORE, uy);
3607 WinSetWindowUShort(hwndChild, QWS_CXRESTORE, ucx);
3608 WinSetWindowUShort(hwndChild, QWS_CYRESTORE, ucy);
3609 }
3610 }
3611 }
3612 WinEndEnumWindows(henum);
3613 }
[551]3614 if (!fFreeTree) {
[2]3615
[133]3616 RECTL Rectl;
3617 SWP swp;
[2]3618
[133]3619 WinQueryWindowRect(hwndClient, &Rectl);
3620 AdjustSizeOfClient(NULL, &Rectl);
3621 WinQueryWindowPos(hwndTree, &swp);
[551]3622 if (!(swp.fl & (SWP_MAXIMIZE | SWP_HIDE | SWP_MINIMIZE))) {
[133]3623 if (swp.y + swp.cy < Rectl.yTop - Rectl.yBottom)
3624 swp.cy = (Rectl.yTop - Rectl.yBottom) - swp.y;
3625 if (swp.x != 0)
3626 swp.x = 0;
3627 if (swp.y < 0)
3628 swp.y = 0;
3629 if (swp.x + swp.cx > Rectl.xRight - Rectl.xLeft)
3630 swp.cx = Rectl.xRight - Rectl.xLeft;
3631 WinSetWindowPos(hwndTree, HWND_TOP, swp.x, swp.y, swp.cx, swp.cy,
3632 SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_RESTORE);
3633 }
3634 }
[2]3635}
3636
[178]3637static VOID MinResChildren(HWND hwndClient, ULONG cmd)
[133]3638{
3639 HENUM henum;
3640 HWND hwndChild;
[2]3641
[133]3642 {
3643 SWP swp;
[2]3644
[133]3645 WinQueryWindowPos(hwndClient, &swp);
3646 if (swp.fl & (SWP_HIDE | SWP_MINIMIZE))
3647 return;
3648 }
3649 henum = WinBeginEnumWindows(hwndClient);
[551]3650 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
[133]3651 if (!WinQueryWindowUShort(hwndChild, QWS_ID))
3652 continue;
3653 WinSetWindowPos(hwndChild, HWND_TOP, 0, 0, 0, 0, cmd);
3654 }
[2]3655}
3656
[178]3657//=== ChildFrameButtonProc: subclass handler for WALKBUTTON and QUICKBUTTON windows ===
3658
3659static MRESULT EXPENTRY ChildFrameButtonProc(HWND hwnd,
3660 ULONG msg,
[551]3661 MPARAM mp1, MPARAM mp2)
[133]3662{
3663 USHORT id;
3664 static BOOL emphasized = FALSE;
[2]3665
[551]3666 switch (msg) {
[133]3667 case WM_BUTTON1CLICK:
3668 case WM_CHORD:
3669 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
3670 break;
[2]3671
[133]3672 case WM_MOUSEMOVE:
[551]3673 if (fOtherHelp) {
3674 if ((!hwndBubble || WinQueryWindowULong(hwndBubble, QWL_USER) != hwnd)
3675 && !WinQueryCapture(HWND_DESKTOP)) {
[133]3676 id = WinQueryWindowUShort(hwnd, QWS_ID);
[551]3677 switch (id) {
[133]3678 case IDM_OPENWALK:
[551]3679 MakeBubble(hwnd, FALSE, GetPString(IDS_WALKBUTTONHELP));
[133]3680 break;
3681 case IDM_USERLIST:
[551]3682 MakeBubble(hwnd, FALSE, GetPString(IDS_QUICKBUTTONHELP));
[133]3683 break;
3684 }
3685 }
3686 }
3687 break;
[2]3688
[133]3689 case WM_BUTTON3CLICK:
3690 case WM_BUTTON2CLICK:
3691 {
3692 USHORT cmd = 0;
[2]3693
[133]3694 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
3695 id = WinQueryWindowUShort(hwnd, QWS_ID);
[551]3696 switch (id) {
[133]3697 case IDM_OPENWALK:
[551]3698 switch (msg) {
[133]3699 case WM_BUTTON2CLICK:
3700 if ((shiftstate & (KC_ALT | KC_SHIFT | KC_CTRL)) ==
3701 (KC_ALT | KC_SHIFT | KC_CTRL))
3702 cmd = IDM_GREP;
[551]3703 else if ((shiftstate & (KC_ALT | KC_CTRL)) == (KC_ALT | KC_CTRL))
[133]3704 CascadeChildren(hwndMain);
[2]3705
3706#ifdef NEVER
[551]3707 else if ((shiftstate & (KC_ALT | KC_SHIFT)) == (KC_ALT | KC_SHIFT))
[133]3708 cmd = IDM_SYSINFO;
[2]3709#endif
[133]3710
3711 else if (shiftstate & KC_SHIFT)
3712 cmd = IDM_WINDOWDLG;
3713 else if (shiftstate & KC_CTRL)
3714 cmd = IDM_SEEALL;
3715 else if (shiftstate & KC_ALT)
3716 TileChildren(hwndMain, TRUE);
3717 else
3718 cmd = IDM_WALKDIR;
3719 break;
3720 case WM_BUTTON3CLICK:
3721 TileChildren(hwndMain, TRUE);
3722 break;
3723 }
3724 break;
3725 case IDM_USERLIST:
[551]3726 switch (msg) {
[133]3727 case WM_BUTTON2CLICK:
3728 if ((shiftstate & (KC_ALT | KC_SHIFT | KC_CTRL)) ==
3729 (KC_ALT | KC_SHIFT | KC_CTRL))
3730 cmd = IDM_COLORPALETTE;
[551]3731 else if ((shiftstate & (KC_ALT | KC_CTRL)) == (KC_ALT | KC_CTRL))
[133]3732 cmd = IDM_HIDEMENU;
[551]3733 else if ((shiftstate & (KC_ALT | KC_SHIFT)) == (KC_ALT | KC_SHIFT))
[133]3734 cmd = IDM_NOTEBOOK;
3735 else if (shiftstate & KC_SHIFT)
3736 cmd = IDM_TOOLTITLES;
3737 else if (shiftstate & KC_CTRL)
3738 cmd = IDM_TEXTTOOLS;
3739 else if (shiftstate & KC_ALT)
3740 cmd = IDM_FONTPALETTE;
3741 else
3742 cmd = IDM_TOOLBAR;
3743 break;
3744 case WM_BUTTON3CLICK:
3745 cmd = IDM_DRIVEBAR;
3746 break;
3747 }
3748 break;
[551]3749 } // switch id
[200]3750
[551]3751 if (cmd) {
[133]3752 PostMsg(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT), FID_CLIENT),
[551]3753 WM_COMMAND, MPFROM2SHORT(cmd, 0), MPVOID);
[200]3754 }
[133]3755 }
3756 break;
[2]3757
[133]3758 case DM_DRAGOVER:
3759 id = WinQueryWindowUShort(hwnd, QWS_ID);
[551]3760 if (id == IDM_OPENWALK) {
3761 if (!emphasized) {
[133]3762 emphasized = TRUE;
3763 DrawTargetEmphasis(hwnd, emphasized);
3764 }
[618]3765 if (AcceptOneDrop(hwnd, mp1, mp2))
[551]3766 return MRFROM2SHORT(DOR_DROP, DO_MOVE);
[133]3767 }
3768 return MRFROM2SHORT(DOR_NEVERDROP, 0);
[2]3769
[133]3770 case DM_DRAGLEAVE:
[551]3771 if (emphasized) {
[133]3772 emphasized = FALSE;
3773 DrawTargetEmphasis(hwnd, emphasized);
3774 }
3775 break;
[2]3776
[133]3777 case DM_DROPHELP:
3778 DropHelp(mp1, mp2, hwnd, GetPString(IDS_OPENDROPHELP));
3779 return 0;
[2]3780
[133]3781 case DM_DROP:
3782 {
3783 char szFrom[CCHMAXPATH + 2];
[2]3784
[551]3785 if (emphasized) {
[133]3786 emphasized = FALSE;
[551]3787 DrawTargetEmphasis(hwnd, emphasized);
[133]3788 }
[618]3789 if (GetOneDrop(hwnd, mp1, mp2, szFrom, sizeof(szFrom))) {
[551]3790 if (MakeValidDir(szFrom) && !FindDirCnrByName(szFrom, TRUE)) {
3791 OpenDirCnr((HWND) 0, hwndMain, hwndTree, FALSE, szFrom);
[133]3792 }
3793 }
3794 }
3795 return 0;
[2]3796
[133]3797 case WM_CLOSE:
3798 WinDestroyWindow(hwnd);
3799 return 0;
3800 }
3801 return PFNWPButton(hwnd, msg, mp1, mp2);
[2]3802}
3803
[551]3804static MRESULT EXPENTRY MainFrameWndProc(HWND hwnd, ULONG msg, MPARAM mp1,
3805 MPARAM mp2)
[133]3806{
3807 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
3808 static ULONG aheight = 0L;
[2]3809
[551]3810 switch (msg) {
[133]3811 case WM_ADJUSTWINDOWPOS:
3812 {
3813 SWP *pswp;
[2]3814
[133]3815 pswp = (SWP *) mp1;
[551]3816 if (fDataMin && !fAmClosing) {
3817 if (pswp->fl & (SWP_HIDE | SWP_MINIMIZE)) {
[2]3818
[133]3819 SWP swp;
[2]3820
[133]3821 WinQueryWindowPos(hwnd, &swp);
[551]3822 PostMsg(hwnd, UM_FOCUSME, MPFROMLONG(swp.fl), MPVOID);
[133]3823 HideNote();
3824 }
[551]3825 else if (pswp->fl & (SWP_SHOW | SWP_RESTORE)) {
[133]3826 if (DataHwnd)
[551]3827 PostMsg(DataHwnd, WM_CLOSE, MPVOID, MPVOID);
[133]3828 }
3829 }
[551]3830 if (!fAmClosing) {
3831 if (pswp->fl & (SWP_HIDE | SWP_MINIMIZE))
[133]3832 HideNote();
3833 }
3834 }
3835 break;
[2]3836
[133]3837 case UM_FOCUSME:
3838 CreateDataBar(HWND_DESKTOP, (ULONG) mp1);
3839 return 0;
[2]3840
[133]3841 case WM_BUTTON1UP:
3842 case WM_BUTTON2UP:
3843 case WM_BUTTON3UP:
3844 case WM_MOUSEMOVE:
3845 case WM_CHORD:
3846 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
3847 break;
[2]3848
[133]3849 case WM_CHAR:
3850 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
3851 break;
[2]3852
[133]3853 case WM_CONTROL:
[551]3854 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), UM_CONTROL, mp1,
3855 mp2);
[2]3856
[133]3857 case WM_COMMAND:
3858 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
[2]3859
[133]3860 case WM_CALCFRAMERECT:
3861 {
3862 MRESULT mr;
3863 PRECTL prectl;
3864 LONG sheight = 20, bheight = 20;
[2]3865
[133]3866 mr = oldproc(hwnd, msg, mp1, mp2);
[2]3867
[133]3868 /*
3869 * Calculate the position of the client rectangle.
[178]3870 * Otherwise, we'll see a lot of redraw when we move the
[133]3871 * client during WM_FORMATFRAME.
3872 */
[2]3873
[551]3874 if (mr && mp2) {
[133]3875 prectl = (PRECTL) mp1;
[551]3876 if (prectl->yBottom != prectl->yTop) {
[133]3877 {
3878 HPS hps;
3879 POINTL aptl[TXTBOX_COUNT];
[2]3880
[133]3881 hps = WinGetPS(hwndStatus);
[551]3882 if (hps) {
[133]3883 GpiQueryTextBox(hps, 6, "$`WjgT", TXTBOX_COUNT, aptl);
3884 bheight = sheight = aptl[TXTBOX_TOPLEFT].y + 6;
3885 WinReleasePS(hps);
3886 }
3887 }
[551]3888 prectl->yBottom += (sheight + 4);
3889 prectl->yTop -= (sheight + 4);
3890 if (fMoreButtons) {
[2]3891
[133]3892 HPS hps;
3893 POINTL aptl[TXTBOX_COUNT];
[2]3894
[133]3895 hps = WinGetPS(hwndName);
[551]3896 if (hps) {
3897 GpiQueryTextBox(hps, 6, "$`WjgT", TXTBOX_COUNT, aptl);
[133]3898 bheight = aptl[TXTBOX_TOPLEFT].y + 6;
3899 WinReleasePS(hps);
3900 }
[551]3901 prectl->yBottom += (bheight + 4);
3902 prectl->yTop -= (bheight + 4);
[133]3903 }
[551]3904 if (fToolbar) {
[133]3905 if (!fTextTools)
[551]3906 prectl->yTop -= ((fToolTitles) ? 50 : 40);
[133]3907 else
[551]3908 prectl->yTop -= 32;
[133]3909 }
[551]3910 if (fDrivebar) {
[133]3911 ResizeDrives(WinWindowFromID(hwnd, MAIN_DRIVES),
[551]3912 ((prectl->xRight -
[133]3913 (WinQuerySysValue(HWND_DESKTOP,
3914 SV_CYSIZEBORDER) * 2)) - 4));
[551]3915 prectl->yTop -= (16 * (DriveLines * 18));
[133]3916 }
[551]3917 if (fUserComboBox) {
3918 if (!aheight) {
[2]3919
[133]3920 SWP swpTemp;
[2]3921
[133]3922 WinQueryWindowPos(WinWindowFromID(hwndDrivelist, CBID_EDIT),
3923 &swpTemp);
3924 aheight = swpTemp.cy;
3925 }
[551]3926 prectl->yTop -= (aheight + 6L);
[133]3927 }
[551]3928 if (fAutoView) {
[133]3929 AutoviewHeight = min(AutoviewHeight,
[551]3930 (prectl->yTop - prectl->yBottom) - 116);
[133]3931 AutoviewHeight = max(AutoviewHeight, 36);
[551]3932 prectl->yBottom += (AutoviewHeight + 6);
[133]3933 }
3934 }
3935 }
3936 return mr;
3937 }
[2]3938
[133]3939 case WM_FORMATFRAME:
3940 {
3941 SHORT sCount, soldCount;
3942 PSWP pswp, pswpClient, pswpNew;
3943 SWP swpClient;
3944 LONG theight = 48L, dheight = 20L, width, sheight = 20, bheight = 20;
[2]3945
[133]3946 sCount = (SHORT) oldproc(hwnd, msg, mp1, mp2);
3947 soldCount = sCount;
[2]3948
[133]3949 /*
3950 * Reformat the frame to "squeeze" the client
3951 * and make room for status window sibling beneath
3952 * and toolbar above (if toolbar's on) and userlists
3953 * (if userlists are on).
3954 */
[2]3955
[133]3956 pswp = (PSWP) mp1;
3957 {
3958 SHORT x;
[2]3959
[551]3960 for (x = 0; x < soldCount; x++) {
3961 if (WinQueryWindowUShort(pswp->hwnd, QWS_ID) == FID_CLIENT) {
[133]3962 pswpClient = pswp;
3963 break;
3964 }
3965 pswp++;
3966 }
3967 }
[2]3968
[133]3969 {
3970 HPS hps;
3971 POINTL aptl[TXTBOX_COUNT];
[2]3972
[133]3973 hps = WinGetPS(hwndStatus);
[551]3974 if (hps) {
3975 GpiQueryTextBox(hps, 6, "$`WjgT", TXTBOX_COUNT, aptl);
[133]3976 bheight = sheight = aptl[TXTBOX_TOPLEFT].y + 6;
3977 WinReleasePS(hps);
3978 }
[551]3979 if (fMoreButtons) {
[133]3980 hps = WinGetPS(hwndName);
[551]3981 if (hps) {
3982 GpiQueryTextBox(hps, 6, "$`WjgT", TXTBOX_COUNT, aptl);
[133]3983 bheight = aptl[TXTBOX_TOPLEFT].y + 6;
3984 WinReleasePS(hps);
3985 }
3986 }
3987 }
3988 pswpNew = (PSWP) mp1 + soldCount;
3989 *pswpNew = *pswpClient;
3990 swpClient = *pswpClient;
[551]3991 pswpNew->hwnd = hwndStatus;
3992 pswpNew->hwndInsertBehind = HWND_BOTTOM;
3993 pswpNew->x = swpClient.x + 3;
3994 pswpNew->y = swpClient.y + 2;
[133]3995 if (!fSplitStatus)
3996 width = swpClient.cx - (16 + (sheight * 2) + 4);
3997 else
3998 width = (swpClient.cx - (16 + (sheight * 2) + 4)) / 2;
3999 width = max(width, 10);
4000 if (fSplitStatus)
[551]4001 pswpNew->cx = width - 6;
[133]4002 else
[551]4003 pswpNew->cx = width - 8;
4004 pswpNew->cy = sheight;
4005 pswpClient->y = pswpNew->y + pswpNew->cy + 3;
4006 pswpClient->cy = (swpClient.cy - pswpNew->cy) - 3;
[133]4007 sCount++;
[2]4008
[551]4009 if (fSplitStatus) {
[133]4010 pswpNew = (PSWP) mp1 + (soldCount + 1);
4011 *pswpNew = *pswpClient;
[551]4012 pswpNew->hwnd = hwndStatus2;
4013 pswpNew->hwndInsertBehind = HWND_BOTTOM;
4014 pswpNew->x = width + 8;
4015 pswpNew->y = swpClient.y + 2;
4016 pswpNew->cx = width - 6;
4017 pswpNew->cy = sheight;
[133]4018 sCount++;
4019 }
[551]4020 else {
[133]4021 WinShowWindow(hwndStatus2, FALSE);
[551]4022 WinSetWindowText(hwndStatus2, NullStr);
[133]4023 }
[2]4024
[551]4025 if (fToolbar) {
[133]4026 if (fTextTools)
4027 theight = 32L;
4028 else if (!fToolTitles)
4029 theight = 40L;
[551]4030 pswpNew = (PSWP) mp1 + (soldCount + 1 + (fSplitStatus != FALSE));
[133]4031 *pswpNew = *pswpClient;
[551]4032 pswpNew->hwnd = WinWindowFromID(hwnd, MAIN_TOOLS);
4033 pswpNew->hwndInsertBehind = HWND_BOTTOM;
4034 pswpNew->x = swpClient.x + 2;
4035 pswpNew->y = (swpClient.y + swpClient.cy) - (theight - 2);
4036 pswpNew->cx = swpClient.cx - 4;
4037 pswpNew->cy = theight - 4;
4038 pswpClient->cy -= theight;
[133]4039 sCount++;
4040 }
4041 else
4042 WinShowWindow(WinWindowFromID(hwnd, MAIN_TOOLS), FALSE);
[2]4043
[551]4044 if (fDrivebar) {
4045 ResizeDrives(WinWindowFromID(hwnd, MAIN_DRIVES), pswpClient->cx - 4);
[133]4046 pswpNew = (PSWP) mp1 + (soldCount + 1 +
4047 (fSplitStatus != FALSE) +
4048 (fToolbar != FALSE));
4049 *pswpNew = *pswpClient;
[551]4050 pswpNew->hwnd = WinWindowFromID(hwnd, MAIN_DRIVES);
4051 pswpNew->hwndInsertBehind = HWND_BOTTOM;
4052 pswpNew->x = swpClient.x + 2;
[133]4053 dheight += ((dheight - 2) * DriveLines);
[551]4054 pswpNew->y = (swpClient.y + swpClient.cy) - (dheight - 2);
[133]4055 if (fToolbar)
[551]4056 pswpNew->y -= theight;
4057 pswpNew->cx = swpClient.cx - 4;
4058 pswpNew->cy = dheight - 4;
4059 pswpClient->cy -= dheight;
[133]4060 sCount++;
4061 }
4062 else
4063 WinShowWindow(WinWindowFromID(hwnd, MAIN_DRIVES), FALSE);
[2]4064
[551]4065 if (fAutoView) {
[133]4066 pswpNew = (PSWP) mp1 + (soldCount + 1 +
4067 (fToolbar != FALSE) +
4068 (fDrivebar != FALSE) +
4069 (fSplitStatus != FALSE));
4070 *pswpNew = *pswpClient;
[551]4071 pswpNew->hwnd = (fComments) ? hwndAutoMLE : hwndAutoview;
4072 pswpNew->x = pswpClient->x + 3;
4073 pswpNew->y = pswpClient->y + 3;
[133]4074 if (fMoreButtons)
[551]4075 pswpNew->y += (bheight + 4);
4076 pswpNew->cx = pswpClient->cx - 6;
4077 AutoviewHeight = min(AutoviewHeight, pswpClient->cy - 116);
[133]4078 AutoviewHeight = max(AutoviewHeight, 36);
[551]4079 pswpNew->cy = AutoviewHeight;
4080 pswpClient->y += (AutoviewHeight + 6);
4081 pswpClient->cy -= (AutoviewHeight + 6);
[133]4082 sCount++;
4083 WinShowWindow((fComments) ? hwndAutoview : hwndAutoMLE, FALSE);
4084 }
[551]4085 else {
[133]4086 WinShowWindow(hwndAutoview, FALSE);
4087 WinShowWindow(hwndAutoMLE, FALSE);
4088 }
[2]4089
[133]4090 pswpNew = (PSWP) mp1 + (soldCount + 1 +
4091 (fToolbar != FALSE) +
4092 (fDrivebar != FALSE) +
[551]4093 (fSplitStatus != FALSE) + (fAutoView != FALSE));
[133]4094 *pswpNew = *pswpClient;
[551]4095 pswpNew->hwnd = WinWindowFromID(hwnd, IDM_OPENWALK);
4096 pswpNew->x = swpClient.cx - ((sheight * 2) + 4);
4097 pswpNew->y = swpClient.y;
4098 pswpNew->cx = sheight + 4;
4099 pswpNew->cy = sheight + 4;
[133]4100 sCount++;
4101 pswpNew = (PSWP) mp1 + (soldCount + 2 +
4102 (fToolbar != FALSE) +
4103 (fDrivebar != FALSE) +
[551]4104 (fSplitStatus != FALSE) + (fAutoView != FALSE));
[133]4105 *pswpNew = *pswpClient;
[551]4106 pswpNew->hwnd = WinWindowFromID(hwnd, IDM_USERLIST);
4107 pswpNew->x = swpClient.cx - (sheight + 2);
4108 pswpNew->y = swpClient.y;
4109 pswpNew->cx = sheight + 4;
4110 pswpNew->cy = sheight + 4;
[133]4111 sCount++;
4112 pswpNew = (PSWP) mp1 + (soldCount + 3 +
4113 (fToolbar != FALSE) +
4114 (fDrivebar != FALSE) +
[551]4115 (fSplitStatus != FALSE) + (fAutoView != FALSE));
[133]4116 *pswpNew = *pswpClient;
[551]4117 pswpNew->hwnd = WinWindowFromID(hwnd, MAIN_LED);
4118 pswpNew->x = swpClient.cx - ((sheight * 2) + 16);
4119 pswpNew->y = swpClient.y;
4120 pswpNew->cx = 12;
4121 pswpNew->cy = 12;
[133]4122 sCount++;
4123 pswpNew = (PSWP) mp1 + (soldCount + 4 +
4124 (fToolbar != FALSE) +
4125 (fDrivebar != FALSE) +
[551]4126 (fSplitStatus != FALSE) + (fAutoView != FALSE));
[133]4127 *pswpNew = *pswpClient;
[551]4128 pswpNew->hwnd = WinWindowFromID(hwnd, MAIN_LEDHDR);
4129 pswpNew->x = swpClient.cx - ((sheight * 2) + 16);
4130 pswpNew->y = swpClient.y + 12;
4131 pswpNew->cx = 12;
4132 pswpNew->cy = sheight - 8;
[133]4133 sCount++;
[551]4134 if (fUserComboBox) {
4135 if (!aheight) {
[2]4136
[133]4137 SWP swpTemp;
[2]4138
[133]4139 WinQueryWindowPos(WinWindowFromID(hwndDrivelist, CBID_EDIT),
4140 &swpTemp);
4141 aheight = swpTemp.cy;
4142 }
4143 pswpNew = (PSWP) mp1 + (soldCount + 5 +
4144 (fToolbar != FALSE) +
4145 (fSplitStatus != FALSE) +
[551]4146 (fDrivebar != FALSE) + (fAutoView != FALSE));
[133]4147 *pswpNew = *pswpClient;
[551]4148 pswpNew->hwnd = hwndDrivelist;
4149 pswpNew->x = swpClient.x;
4150 pswpNew->cx = 48;
4151 pswpClient->cy -= (aheight + 6L);
4152 pswpNew->y = pswpClient->y;
4153 pswpNew->cy = pswpClient->cy + (aheight + 5L);
[133]4154 sCount++;
4155 pswpNew = (PSWP) mp1 + (soldCount + 6 +
4156 (fToolbar != FALSE) +
4157 (fDrivebar != FALSE) +
4158 (fSplitStatus != FALSE) +
4159 (fAutoView != FALSE));
4160 *pswpNew = *pswpClient;
[551]4161 pswpNew->hwnd = hwndStatelist;
4162 pswpNew->x = swpClient.x + 48;
4163 pswpNew->cx = (swpClient.cx - 48) / 7;
4164 pswpNew->y = pswpClient->y;
4165 pswpNew->cy = pswpClient->cy + (aheight + 5L);
[133]4166 sCount++;
4167 pswpNew = (PSWP) mp1 + (soldCount + 7 +
4168 (fToolbar != FALSE) +
4169 (fDrivebar != FALSE) +
4170 (fSplitStatus != FALSE) +
4171 (fAutoView != FALSE));
4172 *pswpNew = *pswpClient;
[551]4173 pswpNew->hwnd = hwndCmdlist;
4174 pswpNew->x = swpClient.x + 48 + ((swpClient.cx - 48) / 7);
4175 pswpNew->cx = (swpClient.cx - 48) / 5 +
[133]4176 ((swpClient.cx - 48) / 5) - ((swpClient.cx - 48) / 7);
[551]4177 pswpNew->y = pswpClient->y;
4178 pswpNew->cy = pswpClient->cy + (aheight + 5L);
[133]4179 sCount++;
4180 pswpNew = (PSWP) mp1 + (soldCount + 8 +
4181 (fToolbar != FALSE) +
4182 (fDrivebar != FALSE) +
4183 (fSplitStatus != FALSE) +
4184 (fAutoView != FALSE));
4185 *pswpNew = *pswpClient;
[551]4186 pswpNew->hwnd = hwndUserlist;
4187 pswpNew->x = swpClient.x + 48 + (((swpClient.cx - 48) / 5) * 2);
4188 pswpNew->cx = ((swpClient.x + swpClient.cx) - pswpNew->x) -
4189 ((fToolbar) ? ((swpClient.cx - 48) / 7) : 0);
4190 pswpNew->y = pswpClient->y;
4191 pswpNew->cy = pswpClient->cy + (aheight + 5L);
[133]4192 sCount++;
[551]4193 if (fToolbar) {
[133]4194 pswpNew = (PSWP) mp1 + (soldCount + 9 +
4195 (fToolbar != FALSE) +
4196 (fDrivebar != FALSE) +
4197 (fSplitStatus != FALSE) +
4198 (fAutoView != FALSE));
4199 *pswpNew = *pswpClient;
[551]4200 pswpNew->hwnd = hwndButtonlist;
4201 pswpNew->x = swpClient.cx - ((swpClient.cx - 48) / 7) + 4;
4202 pswpNew->cx = (swpClient.x + swpClient.cx) - pswpNew->x;
4203 pswpNew->y = pswpClient->y;
4204 pswpNew->cy = pswpClient->cy + (aheight + 5L);
[133]4205 sCount++;
4206 }
4207 else
4208 WinShowWindow(hwndButtonlist, FALSE);
4209 }
[551]4210 else {
[133]4211 WinShowWindow(hwndUserlist, FALSE);
4212 WinShowWindow(hwndDrivelist, FALSE);
4213 WinShowWindow(hwndStatelist, FALSE);
4214 WinShowWindow(hwndButtonlist, FALSE);
4215 WinShowWindow(hwndCmdlist, FALSE);
4216 }
4217 {
4218 PSWP pswpTitlebar = (PSWP) 0, pswpMinbutton = (PSWP) 0;
4219 SHORT x;
[2]4220
[133]4221 pswpNew = (PSWP) mp1 + (soldCount + 5 +
4222 (fToolbar != FALSE) +
4223 (fDrivebar != FALSE) +
4224 (fSplitStatus != FALSE) +
4225 (fAutoView != FALSE) +
4226 ((fUserComboBox != FALSE) * 4) +
4227 (fUserComboBox != FALSE &&
4228 fToolbar != FALSE));
4229 pswp = (PSWP) mp1;
[551]4230 for (x = 0; x < soldCount; x++) {
[133]4231 if (!pswpTitlebar &&
[551]4232 WinQueryWindowUShort(pswp->hwnd, QWS_ID) == FID_TITLEBAR)
[133]4233 pswpTitlebar = pswp;
4234 else if (!pswpMinbutton &&
[551]4235 WinQueryWindowUShort(pswp->hwnd, QWS_ID) == FID_MINMAX)
[133]4236 pswpMinbutton = pswp;
[551]4237 if (pswpTitlebar && pswpMinbutton)
[133]4238 break;
4239 pswp++;
4240 }
[551]4241 if (pswpMinbutton && pswpTitlebar) {
[133]4242 *pswpNew = *pswpMinbutton;
[551]4243 pswpNew->hwnd = WinWindowFromID(hwnd, IDM_IDEALSIZE);
4244 pswpNew->cy = pswpMinbutton->cy + 3;
4245 pswpNew->cx = min(pswpNew->cy, (pswpMinbutton->cx / 2) + 3);
4246 pswpTitlebar->cx -= (pswpNew->cx - 1);
4247 pswpNew->x = pswpTitlebar->x + (pswpTitlebar->cx);
4248 pswpNew->y = pswpMinbutton->y - 1;
[133]4249 sCount++;
4250 }
4251 else
4252 WinShowWindow(WinWindowFromID(hwnd, IDM_IDEALSIZE), FALSE);
4253 }
[2]4254
[551]4255 if (fMoreButtons) {
[2]4256
[133]4257 LONG lastx;
[2]4258
[133]4259 pswpNew = (PSWP) mp1 + (soldCount + 6 +
4260 (fToolbar != FALSE) +
4261 (fDrivebar != FALSE) +
4262 (fSplitStatus != FALSE) +
4263 (fAutoView != FALSE) +
4264 ((fUserComboBox != FALSE) * 4) +
4265 (fUserComboBox != FALSE &&
4266 fToolbar != FALSE));
4267 *pswpNew = *pswpClient;
[551]4268 pswpNew->hwnd = hwndName;
4269 pswpNew->x = swpClient.x + 3;
4270 pswpNew->y = swpClient.y + (sheight + 6);
4271 pswpNew->cx = ((swpClient.cx / 2) + (swpClient.cx / 5)) - 3;
4272 lastx = pswpNew->x + pswpNew->cx;
4273 pswpNew->cy = bheight;
4274 pswpClient->y += (bheight + 4);
4275 pswpClient->cy -= (bheight + 4);
[133]4276 sCount++;
4277 pswpNew = (PSWP) mp1 + (soldCount + 7 +
4278 (fToolbar != FALSE) +
4279 (fDrivebar != FALSE) +
4280 (fSplitStatus != FALSE) +
4281 (fAutoView != FALSE) +
4282 ((fUserComboBox != FALSE) * 4) +
4283 (fUserComboBox != FALSE &&
4284 fToolbar != FALSE));
4285 *pswpNew = *pswpClient;
[551]4286 pswpNew->hwnd = hwndDate;
4287 pswpNew->x = lastx + 3;
4288 pswpNew->y = swpClient.y + (sheight + 6);
4289 pswpNew->cx = (swpClient.cx / 6) + (swpClient.cx / 16) - 3;
4290 lastx = pswpNew->x + pswpNew->cx;
4291 pswpNew->cy = bheight;
[133]4292 sCount++;
4293 pswpNew = (PSWP) mp1 + (soldCount + 8 +
4294 (fToolbar != FALSE) +
4295 (fDrivebar != FALSE) +
4296 (fSplitStatus != FALSE) +
4297 (fAutoView != FALSE) +
4298 ((fUserComboBox != FALSE) * 4) +
4299 (fUserComboBox != FALSE &&
4300 fToolbar != FALSE));
4301 *pswpNew = *pswpClient;
[551]4302 pswpNew->hwnd = hwndAttr;
4303 pswpNew->x = lastx + 3;
4304 pswpNew->y = swpClient.y + (sheight + 6);
4305 pswpNew->cx = (swpClient.cx - pswpNew->x) - 1;
4306 pswpNew->cy = bheight;
[133]4307 sCount++;
4308 }
[551]4309 else {
[133]4310 WinShowWindow(hwndAttr, FALSE);
4311 WinShowWindow(hwndName, FALSE);
4312 WinShowWindow(hwndDate, FALSE);
4313 }
4314 return MRFROMSHORT(sCount);
4315 }
[2]4316
[133]4317 case WM_QUERYFRAMECTLCOUNT:
4318 {
4319 SHORT sCount;
[2]4320
[133]4321 sCount = (SHORT) oldproc(hwnd, msg, mp1, mp2);
[2]4322
[133]4323 sCount += 6;
4324 if (fSplitStatus)
4325 sCount++;
4326 if (fToolbar)
4327 sCount++;
[551]4328 if (fUserComboBox) {
[133]4329 sCount += 4;
4330 if (fToolbar)
4331 sCount++;
4332 }
4333 if (fDrivebar)
4334 sCount++;
4335 if (fAutoView)
4336 sCount++;
4337 if (fMoreButtons)
4338 sCount += 3;
4339 return MRFROMSHORT(sCount);
4340 }
[2]4341
[133]4342 case WM_CLOSE:
4343 WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
4344 return 0;
4345 }
4346 return oldproc(hwnd, msg, mp1, mp2);
[2]4347}
4348
[133]4349MRESULT EXPENTRY MainWMCommand(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[130]4350{
[2]4351 SetShiftState();
[551]4352 switch (SHORT1FROMMP(mp1)) {
[824]4353
4354 case IDM_CONTEXTMENU:
4355 {
4356 HWND hwnd = WinQueryFocus(HWND_DESKTOP);
4357 // DbgMsg(pszSrcFile, __LINE__, "IDM_CONTEXTMENU %x", hwnd);
4358 if (hwnd != NULLHANDLE) {
4359 HWND hwndParent = WinQueryWindow(hwnd, QW_PARENT);
4360 USHORT id = WinQueryWindowUShort(hwndParent, QWS_ID);
4361 switch (id) {
4362 case MAIN_SETUPLIST:
4363 case MAIN_USERLIST:
4364 case MAIN_CMDLIST:
4365 // DbgMsg(pszSrcFile, __LINE__, "WM_CONTEXTMENU");
4366 WinPostMsg(hwnd, WM_CONTEXTMENU, 0, 0);
4367 }
4368 }
4369 }
4370 break;
4371
[133]4372 case IDM_SETTARGET:
4373 SetTargetDir(hwnd, FALSE);
4374 break;
[2]4375
[133]4376 case IDM_TOAUTOMLE:
4377 if (fComments && fAutoView)
[551]4378 WinSetFocus(HWND_DESKTOP, hwndAutoMLE);
[133]4379 break;
[2]4380
[133]4381 case IDM_HIDENOTEWND:
4382 HideNote();
4383 break;
4384 case IDM_SHOWNOTEWND:
4385 ShowNote();
4386 break;
[2]4387
[133]4388 case IDM_COMPARE:
4389 {
4390 WALK2 wa;
4391 PCNRITEM pci;
4392
4393 memset(&wa, 0, sizeof(wa));
4394 wa.size = sizeof(wa);
[551]4395 pci =
4396 (PCNRITEM)
4397 WinSendMsg(WinWindowFromID
4398 (WinWindowFromID(hwndTree, FID_CLIENT), TREE_CNR),
4399 CM_QUERYRECORDEMPHASIS, MPFROMLONG(CMA_FIRST),
4400 MPFROMSHORT(CRA_CURSORED));
4401 if (pci && (INT) pci != -1) {
[730]4402 strcpy(wa.szCurrentPath1, pci->pszFileName);
[133]4403 MakeValidDir(wa.szCurrentPath1);
4404 }
4405 else
4406 save_dir2(wa.szCurrentPath1);
[551]4407 TopWindowName(hwndMain, (HWND) 0, wa.szCurrentPath2);
[133]4408 if (!*wa.szCurrentPath2)
4409 strcpy(wa.szCurrentPath2, wa.szCurrentPath1);
4410 MakeValidDir(wa.szCurrentPath2);
4411 if (WinDlgBox(HWND_DESKTOP,
4412 hwnd,
4413 WalkTwoCmpDlgProc,
4414 FM3ModHandle,
4415 WALK2_FRAME,
4416 MPFROMP(&wa)) &&
[551]4417 !IsFile(wa.szCurrentPath1) && !IsFile(wa.szCurrentPath2)) {
4418 if (!*dircompare) {
[2]4419
[133]4420 COMPARE *cmp;
[2]4421
[551]4422 cmp = xmallocz(sizeof(COMPARE), pszSrcFile, __LINE__);
[352]4423 if (cmp) {
[551]4424 cmp->size = sizeof(COMPARE);
4425 strcpy(cmp->leftdir, wa.szCurrentPath1);
4426 strcpy(cmp->rightdir, wa.szCurrentPath2);
4427 cmp->hwndParent = hwnd;
4428 cmp->dcd.hwndParent = hwnd;
[133]4429 WinDlgBox(HWND_DESKTOP,
4430 HWND_DESKTOP,
[551]4431 CompareDlgProc, FM3ModHandle, COMP_FRAME, MPFROMP(cmp));
[133]4432 }
4433 }
[551]4434 else {
[2]4435
[773]4436 CHAR szPath1[CCHMAXPATH];
4437 CHAR szPath2[CCHMAXPATH];
[133]4438 runemf2(SEPARATE,
[917]4439 HWND_DESKTOP, pszSrcFile, __LINE__,
4440 NULL, NULL,
[773]4441 "%s %s %s",
[133]4442 dircompare,
[773]4443 BldQuotedFileName(szPath1, wa.szCurrentPath1),
4444 BldQuotedFileName(szPath2, wa.szCurrentPath2));
[133]4445 }
[2]4446 }
[133]4447 }
4448 break;
[2]4449
[133]4450 case IDM_EXIT:
4451 case IDM_KILLME:
[551]4452 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
[133]4453 break;
[2]4454
[133]4455 case IDM_CLI:
4456 if (fSplitStatus &&
4457 hwndStatus2 &&
4458 !WinIsWindow(WinQueryAnchorBlock(hwnd),
4459 WinWindowFromID(hwndStatus2, COMMAND_LINE)))
[551]4460 PostMsg(hwndStatus2, UM_CLICKED, MPVOID, MPVOID);
[133]4461 break;
[2]4462
[133]4463 case IDM_ADDTOUSERLIST:
4464 case IDM_DELETEFROMUSERLIST:
4465 {
4466 CHAR temp[CCHMAXPATH], path[CCHMAXPATH];
4467
4468 *temp = 0;
[551]4469 WinQueryWindowText(hwndUserlist, CCHMAXPATH, temp);
[133]4470 bstrip(temp);
4471 if (*temp &&
[551]4472 !DosQueryPathInfo(temp, FIL_QUERYFULLNAME, path, sizeof(path))) {
4473 if (SHORT1FROMMP(mp1) == IDM_ADDTOUSERLIST) {
[618]4474 add_udir(TRUE, path);
4475 if (fUdirsChanged)
4476 save_udirs();
4477 WinSendMsg(hwnd, UM_FILLUSERLIST, MPVOID, MPVOID);
[133]4478 }
[551]4479 else {
[352]4480 if (!remove_udir(path))
[551]4481 Runtime_Error(pszSrcFile, __LINE__, "remove_udir");
[352]4482 else {
[133]4483 if (fUdirsChanged)
4484 save_udirs();
4485 WinSendMsg(hwnd, UM_FILLUSERLIST, MPVOID, MPVOID);
4486 }
4487 }
[2]4488 }
[133]4489 }
4490 break;
[2]4491
[133]4492 case IDM_SAVEDIRCNRSTATE:
4493 case IDM_DELETEDIRCNRSTATE:
4494 {
[787]4495 CHAR szStateName[STATE_NAME_MAX_BYTES + 1];
[133]4496
[558]4497 *szStateName = 0;
[787]4498 WinQueryWindowText(hwndStatelist, STATE_NAME_MAX_BYTES, szStateName);
[558]4499 bstrip(szStateName);
[618]4500 // Ignore request if blank or attempting to using illegal name
4501 if (*szStateName && stricmp(szStateName, GetPString(IDS_STATETEXT))) {
[447]4502 if (SHORT1FROMMP(mp1) == IDM_SAVEDIRCNRSTATE) {
4503 // Save
[789]4504 INT nSaved = SaveDirCnrState(hwnd, szStateName);
4505 if (nSaved > 0) {
[787]4506 INT ret = add_setup(szStateName);
4507 if (ret == 0) {
[133]4508 WinSendMsg(hwndStatelist, LM_INSERTITEM,
[558]4509 MPFROM2SHORT(LIT_SORTASCENDING, 0), MPFROMP(szStateName));
[133]4510 save_setups();
4511 }
[787]4512 else if (ret != 1) {
[618]4513 saymsg(MB_ENTER | MB_ICONASTERISK, hwnd,
4514 GetPString(IDS_WARNINGTEXT),
[787]4515 "\"%s\" state name add failed", szStateName); // 15 Apr 07 SHL failed
[618]4516 WinSetWindowText(hwndStatelist, GetPString(IDS_STATETEXT));
4517 }
[133]4518 }
[618]4519 else {
[789]4520 saymsg(MB_ENTER | MB_ICONASTERISK,
4521 hwnd,
[618]4522 GetPString(IDS_WARNINGTEXT),
[789]4523 nSaved == 0 ?
4524 "Nothing to save" :
4525 "State data save failed");
[618]4526 WinSetWindowText(hwndStatelist, GetPString(IDS_STATETEXT));
4527 }
[133]4528 }
[447]4529 else {
4530 // Delete
[133]4531 ULONG numsaves = 0, size, x;
[787]4532 CHAR s[STATE_NAME_MAX_BYTES + 80];
[2]4533
[787]4534 INT ret = remove_setup(szStateName);
4535 if (ret == 1)
[133]4536 save_setups();
[558]4537 sprintf(s, "%s.NumDirsLastTime", szStateName);
[133]4538 size = sizeof(ULONG);
[787]4539 if (!PrfQueryProfileData(fmprof,
4540 FM3Str,
4541 s,
4542 (PVOID)&numsaves,
4543 &size)) {
[551]4544 saymsg(MB_ENTER | MB_ICONASTERISK, hwnd,
4545 GetPString(IDS_WARNINGTEXT),
[558]4546 GetPString(IDS_DOESNTEXISTTEXT), szStateName);
[447]4547 }
[352]4548 else if (!size)
[551]4549 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
[352]4550 else {
[133]4551 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0L);
[551]4552 for (x = 0; x < numsaves; x++) {
[558]4553 sprintf(s, "%s.DirCnrPos.%lu", szStateName, x);
[133]4554 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
[558]4555 sprintf(s, "%s.DirCnrDir.%lu", szStateName, x);
[133]4556 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
[558]4557 sprintf(s, "%s.DirCnrSort.%lu", szStateName, x);
[133]4558 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
[558]4559 sprintf(s, "%s.DirCnrFilter.%lu", szStateName, x);
[133]4560 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
[558]4561 sprintf(s, "%s.DirCnrView.%lu", szStateName, x);
[133]4562 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
[923]4563 sprintf(s, "%s.DirCnr.%lu.DetailsLongname", szStateName, x);
4564 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4565 sprintf(s, "%s.DirCnr.%lu.DetailsSubject", szStateName, x);
4566 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4567 sprintf(s, "%s.DirCnr.%lu.DetailsSize", szStateName, x);
4568 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4569 sprintf(s, "%s.DirCnr.%lu.DetailsEA", szStateName, x);
4570 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4571 sprintf(s, "%s.DirCnr.%lu.DetailsAttr", szStateName, x);
4572 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4573 sprintf(s, "%s.DirCnr.%lu.DetailsLWDate", szStateName, x);
4574 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4575 sprintf(s, "%s.DirCnr.%lu.DetailsLWTime", szStateName, x);
4576 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4577 sprintf(s, "%s.DirCnr.%lu.DetailsLADate", szStateName, x);
4578 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4579 sprintf(s, "%s.DirCnr.%lu.DetailsLATime", szStateName, x);
4580 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4581 sprintf(s, "%s.DirCnr.%lu.DetailsCRDate", szStateName, x);
4582 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4583 sprintf(s, "%s.DirCnr.%lu.DetailsCRTime", szStateName, x);
4584 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
[133]4585 }
[558]4586 sprintf(s, "%s.LastTreePos", szStateName);
[133]4587 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
[558]4588 sprintf(s, "%s.MySizeLastTime", szStateName);
[133]4589 PrfWriteProfileData(fmprof, FM3Str, s, NULL, 0);
4590 }
4591 PostMsg(hwnd, UM_FILLSETUPLIST, MPVOID, MPVOID);
4592 }
[2]4593 }
[133]4594 }
4595 break;
[2]4596
[133]4597 case IDM_IDEALSIZE:
4598 {
4599 SWP swp, swpD;
4600 ULONG icz = WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2L;
4601 ULONG bsz = WinQuerySysValue(HWND_DESKTOP, SV_CYSIZEBORDER);
4602
4603 WinQueryWindowPos(WinQueryWindow(hwnd, QW_PARENT), &swp);
[551]4604 if (swp.fl & SWP_MAXIMIZE) {
[133]4605 WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_SYSCOMMAND,
4606 MPFROM2SHORT(SC_RESTORE, 0), MPVOID);
4607 WinQueryWindowPos(WinQueryWindow(hwnd, QW_PARENT), &swp);
[2]4608 }
[133]4609 WinGetMaxPosition(WinQueryWindow(hwnd, QW_PARENT), &swpD);
4610 swpD.x += bsz;
4611 swpD.cx -= (bsz * 2);
4612 swpD.y += icz;
4613 swpD.cy -= (icz + bsz);
4614 if (swp.x == swpD.x && swp.y == swpD.y &&
[551]4615 swp.cx == swpD.cx && swp.cy == swpD.cy &&
4616 // fixme to be #defined someday
[133]4617 WinQueryWindowUShort(hwnd, QWL_USER + 10) &&
[551]4618 WinQueryWindowUShort(hwnd, QWL_USER + 14)) {
[133]4619 swpD.x = WinQueryWindowUShort(hwnd, QWL_USER + 8);
4620 swpD.cx = WinQueryWindowUShort(hwnd, QWL_USER + 10);
4621 swpD.y = WinQueryWindowUShort(hwnd, QWL_USER + 12);
4622 swpD.cy = WinQueryWindowUShort(hwnd, QWL_USER + 14);
4623 }
[551]4624 else {
[133]4625 WinSetWindowUShort(hwnd, QWL_USER + 8, (USHORT) swp.x);
4626 WinSetWindowUShort(hwnd, QWL_USER + 10, (USHORT) swp.cx);
4627 WinSetWindowUShort(hwnd, QWL_USER + 12, (USHORT) swp.y);
4628 WinSetWindowUShort(hwnd, QWL_USER + 14, (USHORT) swp.cy);
4629 }
4630 WinSetWindowPos(WinQueryWindow(hwnd, QW_PARENT), HWND_TOP,
[551]4631 swpD.x, swpD.y, swpD.cx, swpD.cy, SWP_MOVE | SWP_SIZE);
[133]4632 }
4633 break;
[2]4634
[133]4635 case IDM_BLINK:
4636 WinSetWindowPos(WinQueryWindow(hwnd, QW_PARENT), HWND_TOP, 0, 0, 0, 0,
4637 SWP_MINIMIZE);
4638 WinSetWindowPos(WinQueryWindow(hwnd, QW_PARENT), HWND_TOP, 0, 0, 0, 0,
4639 SWP_RESTORE | SWP_ZORDER);
4640 break;
[2]4641
[133]4642 case DID_CANCEL:
4643 {
[551]4644 HWND hwndTop = TopWindow(hwndMain, (HWND) 0);
[2]4645
[133]4646 if (hwndTop)
[551]4647 WinSetFocus(HWND_DESKTOP, hwndTop);
[133]4648 }
4649 break;
[2]4650
[133]4651 case IDM_NOTEBOOK:
[917]4652 case IDM_DIRCNRSETTINGS:
4653 case IDM_COLLECTORSETTINGS:
4654 case IDM_TREECNRSETTINGS:
4655 case IDM_ARCHIVERSETTINGS:
4656 case IDM_VIEWERSETTINGS:
4657 case IDM_COMPARESETTINGS:
4658 case IDM_QUICKSETTINGS:
[133]4659 WinDlgBox(HWND_DESKTOP,
[917]4660 hwnd, CfgDlgProc, FM3ModHandle, CFG_FRAME, MPFROMLONG(mp1));
[133]4661 break;
[2]4662
[133]4663 case IDM_VIEWHELPS:
4664 case IDM_VIEWINFS:
4665 WinDlgBox(HWND_DESKTOP,
4666 HWND_DESKTOP,
4667 ViewInfProc,
4668 FM3ModHandle,
4669 VINF_FRAME,
4670 ((SHORT1FROMMP(mp1) == IDM_VIEWHELPS) ?
[551]4671 MPFROMP(NullStr) : MPVOID));
[133]4672 break;
[2]4673
[133]4674 case IDM_OPENWALK:
4675 {
4676 char newpath[CCHMAXPATH];
[2]4677
[133]4678 *newpath = 0;
[551]4679 TopWindowName(hwnd, (HWND) 0, newpath);
[133]4680 if (WinDlgBox(HWND_DESKTOP,
4681 hwnd,
4682 WalkAllDlgProc,
[551]4683 FM3ModHandle, WALK_FRAME, MPFROMP(newpath)) && *newpath)
4684 OpenDirCnr((HWND) 0, hwndMain, hwndTree, FALSE, newpath);
[133]4685 }
4686 break;
[2]4687
[133]4688 case IDM_WINDOWDLG:
4689 WindowList(hwnd);
4690 break;
[2]4691
[133]4692 case IDM_HELPMOUSE:
4693 case IDM_HELPCONTEXT:
4694 case IDM_HELPHINTS:
4695 case IDM_HELPPIX:
4696 case IDM_HELPTUTOR:
4697 case IDM_HELPUSERLIST:
4698 case IDM_HELP:
4699 case IDM_HELPCONTENTS:
4700 case IDM_HELPKEYS:
4701 case IDM_HELPGENERAL:
[551]4702 if (hwndHelp) {
4703 if (SHORT1FROMMP(mp2) == CMDSRC_MENU) {
[2]4704
[133]4705 RECTL rcl;
4706 ULONG icz = WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2L;
[2]4707
[133]4708 WinQueryWindowRect(HWND_DESKTOP, &rcl);
4709 rcl.yBottom += icz;
4710 rcl.yTop -= icz;
4711 rcl.xLeft += icz;
4712 rcl.xRight -= icz;
[551]4713 WinSendMsg(hwndHelp, HM_SET_COVERPAGE_SIZE, MPFROMP(&rcl), MPVOID);
[133]4714 }
[551]4715 else {
[2]4716
[133]4717 RECTL rcl;
[2]4718
[133]4719 WinQueryWindowRect(HWND_DESKTOP, &rcl);
4720 rcl.yBottom += 8;
4721 rcl.yTop = (rcl.yTop / 2) + (rcl.yTop / 7);
4722 rcl.xLeft = (rcl.xRight / 2) - (rcl.xRight / 7);
4723 rcl.xRight -= 8;
[551]4724 WinSendMsg(hwndHelp, HM_SET_COVERPAGE_SIZE, MPFROMP(&rcl), MPVOID);
[133]4725 }
[551]4726 switch (SHORT1FROMMP(mp1)) {
[133]4727 case IDM_HELPCONTEXT:
4728 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
[551]4729 MPFROM2SHORT(HELP_CONTEXT, 0), MPFROMSHORT(HM_RESOURCEID));
[133]4730 break;
[2]4731
[133]4732 case IDM_HELPMOUSE:
4733 if (hwndHelp)
4734 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
[551]4735 MPFROM2SHORT(HELP_MOUSE, 0), MPFROMSHORT(HM_RESOURCEID));
[133]4736 break;
[2]4737
[133]4738 case IDM_HELPPIX:
4739 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
[551]4740 MPFROM2SHORT(HELP_BITMAP1, 0), MPFROMSHORT(HM_RESOURCEID));
[133]4741 break;
[2]4742
[133]4743 case IDM_HELPTUTOR:
4744 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
4745 MPFROM2SHORT(HELP_TUTORIAL, 0),
4746 MPFROMSHORT(HM_RESOURCEID));
4747 break;
[2]4748
[133]4749 case IDM_HELPHINTS:
4750 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
[551]4751 MPFROM2SHORT(HELP_HINTS, 0), MPFROMSHORT(HM_RESOURCEID));
[133]4752 break;
[2]4753
[133]4754 case IDM_HELPGENERAL:
4755 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
[551]4756 MPFROM2SHORT(HELP_MAIN, 0), MPFROMSHORT(HM_RESOURCEID));
[133]4757 break;
4758 case IDM_HELPKEYS:
4759 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
[551]4760 MPFROM2SHORT(HELP_KEYS, 0), MPFROMSHORT(HM_RESOURCEID));
[133]4761 break;
[2]4762
[133]4763 case IDM_HELP:
4764 case IDM_HELPCONTENTS:
4765 WinSendMsg(hwndHelp, HM_HELP_CONTENTS, MPVOID, MPVOID);
4766 break;
[2]4767
[133]4768 case IDM_HELPUSERLIST:
4769 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
4770 MPFROM2SHORT(HELP_USERLISTS, 0),
4771 MPFROMSHORT(HM_RESOURCEID));
4772 break;
[2]4773 }
[133]4774 }
4775 break;
[2]4776
[133]4777 case IDM_EDITANYARCHIVER:
[419]4778 EditArchiverDefinition(hwnd);
[133]4779 break;
[2]4780
[133]4781 case IDM_ABOUT:
4782 WinDlgBox(HWND_DESKTOP, hwnd, AboutDlgProc, FM3ModHandle,
4783 ABT_FRAME, MPVOID);
4784 break;
[2]4785
[133]4786 case IDM_FONTPALETTE:
4787 OpenObject("<WP_FNTPAL>", Default, hwnd);
4788 break;
[2]4789
[133]4790 case IDM_HICOLORPALETTE:
4791 case IDM_COLORPALETTE:
4792 {
4793 CHAR *palette = "<WP_CLRPAL>";
4794 ULONG version[2];
4795
4796 if (!DosQuerySysInfo(QSV_VERSION_MAJOR, QSV_VERSION_MINOR,
[551]4797 (PVOID) & version, (ULONG) sizeof(version))) {
4798 if (version[0] > 20L || (version[0] == 20L && version[1] > 29L)) {
[133]4799 if (SHORT1FROMMP(mp1) == IDM_HICOLORPALETTE)
4800 palette = "<WP_HIRESCLRPAL>";
4801 else
4802 palette = "<WP_LORESCLRPAL>";
4803 }
[2]4804 }
[133]4805 OpenObject(palette, Default, hwnd);
4806 }
4807 break;
[2]4808
[133]4809 case IDM_SYSTEMSETUP:
4810 OpenObject("<WP_CONFIG>", Default, hwnd);
4811 break;
[2]4812
[133]4813 case IDM_SCHEMEPALETTE:
4814 {
4815 HOBJECT hWPSObject;
[2]4816
[133]4817 hWPSObject = WinQueryObject("<WP_SCHPAL>");
4818 if (hWPSObject != NULLHANDLE)
4819 WinSetObjectData(hWPSObject, "SCHEMES=Winter:PM_Winter,"
4820 "Spring:PM_Spring,Summer:PM_Summer,"
4821 "System:PM_System,Windows:PM_Windows;"
4822 "OPEN=DEFAULT");
4823 }
4824 break;
[2]4825
[133]4826 case IDM_SYSTEMCLOCK:
4827 OpenObject("<WP_CLOCK>", Default, hwnd);
4828 break;
[2]4829
4830#ifdef NEVER
[133]4831 case IDM_SYSINFO:
4832 WinDlgBox(HWND_DESKTOP, HWND_DESKTOP, SysInfoDlgProc, FM3ModHandle,
4833 SYS_FRAME, NULL);
4834 break;
[2]4835#endif
4836
[133]4837 case IDM_INSTANT:
4838 {
4839 CHAR path[CCHMAXPATH];
4840 PCNRITEM pci = (PCNRITEM) 0;
4841
4842 if (hwndTree)
4843 pci = (PCNRITEM) WinSendMsg(hwndTree, CM_QUERYRECORDEMPHASIS,
4844 MPFROMLONG(CMA_FIRST),
4845 MPFROMSHORT(CRA_CURSORED));
[551]4846 if (pci && (INT) pci != -1) {
[730]4847 strcpy(path, pci->pszFileName);
[133]4848 MakeValidDir(path);
[2]4849 }
[133]4850 else
4851 save_dir2(path);
4852 WinDlgBox(HWND_DESKTOP, hwnd, InstantDlgProc, FM3ModHandle,
4853 BAT_FRAME, MPFROMP(path));
4854 }
4855 break;
[2]4856
[133]4857 case IDM_WINFULLSCREEN:
4858 case IDM_DOSCOMMANDLINE:
4859 case IDM_COMMANDLINE:
4860 {
4861 CHAR *env = GetCmdSpec(FALSE), path[CCHMAXPATH];
4862 INT type = SEPARATE | WINDOWED;
4863
4864 *path = 0;
[551]4865 TopWindowName(hwnd, (HWND) 0, path);
[133]4866 if (SHORT1FROMMP(mp1) == IDM_DOSCOMMANDLINE)
4867 env = GetCmdSpec(TRUE);
[551]4868 else if (SHORT1FROMMP(mp1) != IDM_COMMANDLINE) {
[133]4869 env = "WINOS2.COM";
4870 type = SEPARATE | FULLSCREEN;
[2]4871 }
[888]4872 runemf2(type, hwnd, pszSrcFile, __LINE__,
[917]4873 path, NULL, "%s", env);
[133]4874 }
4875 break;
[2]4876
[133]4877 case IDM_KILLPROC:
4878 WinDlgBox(HWND_DESKTOP, hwnd, KillDlgProc, FM3ModHandle,
4879 KILL_FRAME, NULL);
4880 break;
[2]4881
[133]4882 case IDM_AUTOVIEWCOMMENTS:
4883 case IDM_AUTOVIEWFILE:
4884 if (SHORT1FROMMP(mp1) == IDM_AUTOVIEWFILE)
4885 fComments = FALSE;
4886 else
4887 fComments = TRUE;
[551]4888 PrfWriteProfileData(fmprof, FM3Str, "Comments", &fComments, sizeof(BOOL));
[133]4889 WinSetWindowText((fComments) ? hwndAutoview : hwndAutoMLE, NullStr);
4890 goto AutoChange;
[2]4891
[133]4892 case IDM_AUTOVIEW:
4893 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER), SHORT1FROMMP(mp1),
4894 &fAutoView, TRUE, "AutoView");
4895 AutoChange:
4896 PostMsg(WinQueryWindow(hwnd, QW_PARENT), WM_UPDATEFRAME,
4897 MPFROMLONG(FCF_SIZEBORDER), MPVOID);
[551]4898 if (fAutoView) {
[2]4899
[133]4900 CHAR s[CCHMAXPATH];
4901 HWND hwndDir;
4902 PCNRITEM pci;
[2]4903
[551]4904 hwndDir = TopWindowName(hwnd, (HWND) 0, s);
4905 if (hwndDir) {
[133]4906 hwndDir = WinWindowFromID(hwndDir, FID_CLIENT);
[551]4907 if (hwndDir) {
[133]4908 hwndDir = WinWindowFromID(hwndDir, DIR_CNR);
[551]4909 if (hwndDir) {
[133]4910 pci = (PCNRITEM) WinSendMsg(hwndDir, CM_QUERYRECORDEMPHASIS,
4911 MPFROMLONG(CMA_FIRST),
4912 MPFROMSHORT(CRA_CURSORED));
4913 if (pci && (INT) pci != -1 &&
[730]4914 (!(driveflags[toupper(*pci->pszFileName) - 'A'] & DRIVE_SLOW)))
[133]4915 WinSendMsg(hwnd,
4916 UM_LOADFILE,
[730]4917 MPFROMP(pci->pszFileName),
[133]4918 (SHORT1FROMMP(mp1) == IDM_AUTOVIEW) ?
[787]4919 MPVOID : MPFROMLONG(1));
[133]4920 }
4921 }
[2]4922 }
[133]4923 }
4924 break;
[2]4925
[133]4926 case IDM_TEXTTOOLS:
4927 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER), SHORT1FROMMP(mp1),
4928 &fTextTools, TRUE, "TextTools");
4929 BuildTools(hwndToolback, TRUE);
4930 PostMsg(WinQueryWindow(hwnd, QW_PARENT), WM_UPDATEFRAME,
4931 MPFROMLONG(FCF_SIZEBORDER), MPVOID);
4932 break;
[2]4933
[133]4934 case IDM_TOOLTITLES:
4935 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER), SHORT1FROMMP(mp1),
4936 &fToolTitles, TRUE, "ToolTitles");
4937 BuildTools(hwndToolback, TRUE);
4938 PostMsg(WinQueryWindow(hwnd, QW_PARENT), WM_UPDATEFRAME,
4939 MPFROMLONG(FCF_SIZEBORDER), MPVOID);
4940 break;
[2]4941
[133]4942 case IDM_HIDEMENU:
4943 {
4944 HWND hwndMenu;
4945
4946 hwndMenu = WinQueryWindowULong(hwnd, QWL_USER);
4947 MenuInvisible = (MenuInvisible) ? FALSE : TRUE;
[551]4948 if (MenuInvisible) {
[133]4949 WinSetParent(hwndMenu, HWND_OBJECT, FALSE);
4950 WinSetMenuItemText(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
4951 FID_SYSMENU), IDM_HIDEMENU,
4952 GetPString(IDS_UNHIDEMENUTEXT));
[2]4953 }
[551]4954 else {
[133]4955 WinSetParent(hwndMenu, WinQueryWindow(hwnd, QW_PARENT), FALSE);
4956 WinSetMenuItemText(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
4957 FID_SYSMENU), IDM_HIDEMENU,
4958 GetPString(IDS_HIDEMENUTEXT));
4959 }
4960 PostMsg(WinQueryWindow(hwnd, QW_PARENT), WM_UPDATEFRAME,
4961 MPFROMLONG(FCF_MENU), MPVOID);
4962 PrfWriteProfileData(fmprof, FM3Str, "MenuInvisible",
4963 &MenuInvisible, sizeof(BOOL));
4964 }
4965 break;
[2]4966
[133]4967 case IDM_SEEALL:
4968 case IDM_GREP:
4969 case IDM_COLLECTOR:
4970 {
4971 HWND hwndC;
4972 SWP swp;
4973 BOOL already = FALSE;
4974
4975 if (Collector)
4976 already = TRUE;
4977 if (!already && !fAutoTile && !fExternalCollector)
4978 GetNextWindowPos(hwnd, &swp, NULL, NULL);
[735]4979 hwndC = StartCollector(fExternalCollector ? HWND_DESKTOP : hwnd, 4);
[551]4980 if (hwndC) {
[133]4981 if (!already && !fAutoTile && !fExternalCollector)
[735]4982 WinSetWindowPos(hwndC, HWND_TOP,
4983 swp.x, swp.y, swp.cx, swp.cy,
4984 SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_ZORDER);
[133]4985 else if (fAutoTile && !already)
4986 TileChildren(hwnd, TRUE);
4987 WinSetWindowPos(hwndC, HWND_TOP, 0, 0, 0, 0, SWP_SHOW | SWP_RESTORE |
4988 SWP_ACTIVATE);
4989 if (SHORT1FROMMP(mp1) == IDM_GREP)
4990 PostMsg(WinWindowFromID(hwndC, FID_CLIENT), WM_COMMAND,
4991 MPFROM2SHORT(IDM_GREP, 0), MPVOID);
4992 if (SHORT1FROMMP(mp1) == IDM_SEEALL)
4993 PostMsg(WinWindowFromID(hwndC, FID_CLIENT), WM_COMMAND,
4994 MPFROM2SHORT(IDM_SEEALL, 0), MPVOID);
[2]4995 }
[133]4996 }
4997 break;
[2]4998
[133]4999 case IDM_TOOLLEFT:
5000 case IDM_TOOLRIGHT:
5001 {
5002 TOOL *tool;
5003
[551]5004 if (!toolhead || !toolhead->next) {
5005 firsttool = (toolhead) ? toolhead->id : 0;
[133]5006 break;
[2]5007 }
[133]5008 tool = find_tool(firsttool);
5009 if (!tool)
5010 tool = toolhead;
[551]5011 if (SHORT1FROMMP(mp1) == IDM_TOOLRIGHT) {
[133]5012 tool = prev_tool(tool, TRUE);
[551]5013 firsttool = tool->id;
[133]5014 }
[551]5015 else {
[133]5016 tool = next_tool(tool, TRUE);
[551]5017 firsttool = tool->id;
[133]5018 }
5019 ResizeTools(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
5020 MAIN_TOOLS));
5021 }
5022 break;
[2]5023
[133]5024 case IDM_CREATETOOL:
[551]5025 BuildTools(hwndToolback, TRUE);
[133]5026 break;
[2]5027
[133]5028 case IDM_TOOLBAR:
5029 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
[551]5030 IDM_TOOLSUBMENU, &fToolbar, TRUE, "Toolbar");
5031 BuildTools(hwndToolback, TRUE);
[133]5032 WinShowWindow(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
[551]5033 MAIN_TOOLS), fToolbar);
[133]5034 WinSendMsg(WinQueryWindow(hwnd, QW_PARENT),
[551]5035 WM_UPDATEFRAME, MPFROMLONG(FCF_SIZEBORDER), MPVOID);
[133]5036 if (fDrivebar)
5037 WinInvalidateRect(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
[551]5038 MAIN_DRIVES), NULL, TRUE);
[133]5039 break;
[2]5040
[133]5041 case IDM_DRIVEBAR:
5042 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
[551]5043 IDM_DRIVEBAR, &fDrivebar, TRUE, "Drivebar");
[133]5044 WinShowWindow(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
[551]5045 MAIN_DRIVES), fDrivebar);
[133]5046 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
[551]5047 WM_UPDATEFRAME, MPFROMLONG(FCF_SIZEBORDER), MPVOID);
5048 PostMsg(hwnd, UM_BUILDDRIVEBAR, MPVOID, MPVOID);
[133]5049 break;
[2]5050
[133]5051 case IDM_USERLIST:
5052 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
[551]5053 SHORT1FROMMP(mp1), &fUserComboBox, TRUE, "UserComboBox");
[133]5054 WinShowWindow(hwndUserlist, fUserComboBox);
5055 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
[551]5056 WM_UPDATEFRAME, MPFROMLONG(FCF_SIZEBORDER), MPVOID);
5057 PostMsg(hwnd, UM_FILLUSERLIST, MPVOID, MPVOID);
5058 PostMsg(hwnd, UM_FILLSETUPLIST, MPVOID, MPVOID);
5059 PostMsg(hwnd, UM_FILLCMDLIST, MPVOID, MPVOID);
5060 PostMsg(hwnd, UM_FILLBUTTONLIST, MPVOID, MPVOID);
[133]5061 break;
[2]5062
[133]5063 case IDM_MOREBUTTONS:
5064 WinSetWindowText(hwndName, NullStr);
5065 WinSetWindowText(hwndDate, NullStr);
5066 WinSetWindowText(hwndAttr, NullStr);
5067 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
[551]5068 SHORT1FROMMP(mp1), &fMoreButtons, TRUE, "MoreButtons");
5069 if (fMoreButtons) {
[2]5070
[133]5071 HWND hwndTemp;
[2]5072
[551]5073 hwndTemp = TopWindow(hwnd, (HWND) 0);
[2]5074
[551]5075 if (hwndTemp) {
5076 WinSetFocus(HWND_DESKTOP, hwnd);
5077 WinSetFocus(HWND_DESKTOP, hwndTemp);
[2]5078 }
[133]5079 }
5080 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
[551]5081 WM_UPDATEFRAME, MPFROMLONG(FCF_SIZEBORDER), MPVOID);
[133]5082 break;
[2]5083
[921]5084 case IDM_TOGGLEDRAGDIALOG:
5085 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
5086 IDM_TOGGLEDRAGDIALOG,
5087 &fDragndropDlg,
5088 TRUE,
5089 "Drag&DropDlg");
5090 break;
5091
[925]5092 case IDM_SYNCUPDATES:
5093 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
5094 IDM_SYNCUPDATES,
5095 &fSyncUpdates,
5096 TRUE,
5097 "SyncUpdates");
5098 break;
5099
[133]5100 case IDM_FREETREE:
[551]5101 if (fFreeTree) {
[133]5102 SWP swp, swpT;
[2]5103
[133]5104 WinQueryWindowPos(hwndTree, &swpT);
5105 WinQueryWindowPos(hwnd, &swp);
[551]5106 WinSetWindowPos(hwndTree, HWND_TOP, 0, swp.cy - swpT.cy, 0, 0,
5107 SWP_MOVE);
[133]5108 }
5109 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER), SHORT1FROMMP(mp1),
5110 &fFreeTree, TRUE, "FreeTree");
5111 if (fAutoTile)
5112 TileChildren(hwnd, TRUE);
5113 break;
[2]5114
[133]5115 case IDM_AUTOTILE:
5116 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
[551]5117 SHORT1FROMMP(mp1), &fAutoTile, TRUE, "AutoTile");
[133]5118 if (fAutoTile)
5119 TileChildren(hwnd, TRUE);
5120 break;
[2]5121
[133]5122 case IDM_TILEBACKWARDS:
5123 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
[551]5124 SHORT1FROMMP(mp1), &fTileBackwards, TRUE, "TileBackwards");
[133]5125 if (fAutoTile)
5126 TileChildren(hwnd, TRUE);
5127 break;
[2]5128
[133]5129 case IDM_NEXTWINDOW:
5130 case IDM_PREVWINDOW:
[551]5131 NextChild(hwnd, (SHORT1FROMMP(mp1) == IDM_PREVWINDOW));
[133]5132 break;
[2]5133
[133]5134 case IDM_CASCADE:
5135 CascadeChildren(hwnd);
5136 break;
[2]5137
[133]5138 case IDM_TILE:
5139 TileChildren(hwnd, TRUE);
5140 break;
[2]5141
[133]5142 case IDM_RESTORE:
[551]5143 MinResChildren(hwnd, SWP_RESTORE);
[133]5144 break;
[2]5145
[133]5146 case IDM_MINIMIZE:
[551]5147 MinResChildren(hwnd, SWP_MINIMIZE);
[133]5148 break;
[2]5149
[133]5150 case IDM_ARRANGEICONS:
5151 ArrangeIcons(hwnd);
5152 break;
[2]5153
[133]5154 case IDM_INIVIEWER:
5155 StartIniEditor(hwnd, NULL, 4);
5156 break;
[2]5157
[133]5158 case IDM_EDITASSOC:
5159 EditAssociations(hwnd);
5160 break;
[2]5161
[133]5162 case IDM_EDITCOMMANDS:
5163 EditCommands(hwnd);
[551]5164 PostMsg(hwnd, UM_FILLCMDLIST, MPVOID, MPVOID);
[133]5165 break;
[2]5166
[133]5167 default:
[551]5168 if (!SwitchCommand((HWND) WinQueryWindowULong(hwnd, QWL_USER),
5169 SHORT1FROMMP(mp1))) {
[133]5170 if (SHORT1FROMMP(mp1) >= IDM_COMMANDSTART &&
[551]5171 SHORT1FROMMP(mp1) < IDM_QUICKTOOLSTART) {
[2]5172
[133]5173 INT x;
5174 HWND hwndCnr;
[2]5175
[133]5176 if (!cmdloaded)
5177 load_commands();
[551]5178 hwndCnr = TopWindow(hwnd, (HWND) 0);
5179 hwndCnr = (HWND) WinSendMsg(WinWindowFromID(hwndCnr, FID_CLIENT),
5180 UM_CONTAINERHWND, MPVOID, MPVOID);
[352]5181 if (!hwndCnr) {
[551]5182 Runtime_Error2(pszSrcFile, __LINE__, IDS_NOWINDOWTEXT);
[133]5183 break;
5184 }
5185 x = SHORT1FROMMP(mp1) - IDM_COMMANDSTART;
[551]5186 if (x >= 0) {
[133]5187 x++;
5188 RunCommand(hwndCnr, x);
[551]5189 if (fUnHilite) {
[2]5190
[133]5191 PCNRITEM pci;
5192 DIRCNRDATA *dcd = NULL;
[2]5193
[773]5194 // 12 May 07 SHL fixme to understand? backwards maybe? looking for DIR_CNR?
[133]5195 if (WinQueryWindowUShort(hwndCnr, QWS_ID) != TREE_CNR)
5196 dcd = INSTDATA(hwndCnr);
5197 pci = (PCNRITEM) WinSendMsg(hwndCnr,
5198 CM_QUERYRECORDEMPHASIS,
5199 MPFROMLONG(CMA_FIRST),
5200 MPFROMSHORT(CRA_CURSORED));
5201 if (pci && (INT) pci != -1 &&
[551]5202 (pci->rc.flRecordAttr & CRA_SELECTED))
[672]5203 {
5204 UnHilite(hwnd,
5205 TRUE,
5206 dcd ? &dcd->lastselection : NULL,
5207 dcd ? dcd ->ulItemsToUnHilite : 0);
5208 }
[133]5209 }
5210 }
5211 }
5212 else if (SHORT1FROMMP(mp1) >= IDM_QUICKTOOLSTART &&
[551]5213 SHORT1FROMMP(mp1) < IDM_QUICKTOOLSTART + 50) {
[133]5214 if (!qtloaded)
5215 load_quicktools();
[551]5216 if (quicktool[SHORT1FROMMP(mp1) - IDM_QUICKTOOLSTART]) {
[133]5217 if (fToolsChanged)
5218 save_tools(NULL);
5219 if (!load_tools(quicktool[SHORT1FROMMP(mp1) - IDM_QUICKTOOLSTART]))
5220 load_tools(NULL);
[551]5221 else {
[133]5222 strcpy(lasttoolbox,
5223 quicktool[SHORT1FROMMP(mp1) - IDM_QUICKTOOLSTART]);
[551]5224 PrfWriteProfileString(fmprof, FM3Str, "LastToolBox", lasttoolbox);
[133]5225 }
[551]5226 BuildTools(hwndToolback, TRUE);
[133]5227 }
5228 }
[551]5229 else {
[2]5230
[133]5231 HWND hwndActive;
[2]5232
[551]5233 hwndActive = TopWindow(hwnd, (HWND) 0);
[133]5234 if (hwndActive)
5235 PostMsg(WinWindowFromID(hwndActive, FID_CLIENT),
[551]5236 WM_COMMAND, mp1, mp2);
[2]5237 }
[133]5238 }
[824]5239 break; // default
5240 } // switch mp1
[2]5241 return 0;
5242}
5243
[551]5244static MRESULT EXPENTRY MainWMOnce(HWND hwnd, ULONG msg, MPARAM mp1,
5245 MPARAM mp2)
[133]5246{
[376]5247 TID tid;
5248 SWP swp;
5249 PFNWP oldproc;
5250 HWND hwndTmp;
5251 HWND hwndFrame;
5252 HWND hwndSysMenu, hwndSysSubMenu, hwndMenu;
5253 USHORT idSysMenu;
5254 MENUITEM mi, mit;
5255 ULONG size;
5256 BOOL temp = FALSE;
5257
5258 switch (msg) {
[133]5259 case WM_CREATE:
[551]5260 WinQueryWindowProcess(hwnd, &mypid, &tid);
[133]5261 hwndMain = hwnd;
5262 WinSetWindowUShort(hwnd, QWL_USER + 8, 0);
5263 WinSetWindowUShort(hwnd, QWL_USER + 10, 0);
5264 WinSetWindowUShort(hwnd, QWL_USER + 12, 0);
5265 WinSetWindowUShort(hwnd, QWL_USER + 16, 0);
[551]5266 if (_beginthread(MakeMainObjWin, NULL, 245760, MPVOID) == -1) {
5267 Runtime_Error(pszSrcFile, __LINE__,
5268 GetPString(IDS_COULDNTSTARTTHREADTEXT));
5269 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
[133]5270 return 0;
5271 }
5272 else
[771]5273 DosSleep(32);//05 Aug 07 GKY 64
[133]5274
[376]5275 hwndFrame = WinQueryWindow(hwnd, QW_PARENT);
[133]5276
[376]5277 /*
5278 * create frame children (not client children, frame children)
5279 */
[771]5280 DosSleep(1);
[376]5281 WinQueryWindowPos(hwndFrame, &swp);
[551]5282 oldproc = WinSubclassWindow(hwndFrame, MainFrameWndProc);
5283 WinSetWindowPtr(hwndFrame, QWL_USER, (PVOID) oldproc);
[376]5284 CommonCreateMainChildren(hwnd, &swp);
5285
5286 if (!WinCreateWindow(hwndFrame,
[551]5287 WC_BUTTON,
5288 "I",
5289 WS_VISIBLE | BS_PUSHBUTTON | BS_NOPOINTERFOCUS,
5290 ((swp.cx -
5291 WinQuerySysValue(HWND_DESKTOP,
5292 SV_CXMINMAXBUTTON)) -
[133]5293 WinQuerySysValue(HWND_DESKTOP,
[551]5294 SV_CXMINMAXBUTTON) / 2) -
[376]5295 WinQuerySysValue(HWND_DESKTOP,
[551]5296 SV_CXSIZEBORDER),
5297 (swp.cy - WinQuerySysValue(HWND_DESKTOP,
5298 SV_CYMINMAXBUTTON)) -
5299 WinQuerySysValue(HWND_DESKTOP,
5300 SV_CYSIZEBORDER),
5301 WinQuerySysValue(HWND_DESKTOP,
5302 SV_CXMINMAXBUTTON) / 2,
5303 WinQuerySysValue(HWND_DESKTOP,
5304 SV_CYMINMAXBUTTON),
5305 hwnd, HWND_TOP, IDM_IDEALSIZE, NULL, NULL)) {
5306 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
[376]5307 }
5308 else {
[551]5309 WinSubclassWindow(WinWindowFromID(hwndFrame, IDM_IDEALSIZE),
[376]5310 IdealButtonProc);
5311 SetPresParams(WinWindowFromID(hwndFrame,
5312 IDM_IDEALSIZE),
[551]5313 NULL, NULL, NULL, GetPString(IDS_10SYSTEMVIOTEXT));
[376]5314 }
[2]5315
[376]5316 hwndTmp = WinCreateWindow(hwndFrame,
[551]5317 WC_BUTTON,
5318 "#1019",
5319 WS_VISIBLE | BS_PUSHBUTTON | BS_NOPOINTERFOCUS |
5320 BS_BITMAP,
5321 swp.cx - 46,
5322 swp.y + 2,
5323 24,
5324 22, hwnd, HWND_TOP, IDM_OPENWALK, NULL, NULL);
[376]5325 if (!hwndTmp)
[551]5326 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
[2]5327
[376]5328 hwndTmp = WinCreateWindow(hwndFrame,
[551]5329 WC_BUTTON,
5330 "#3062",
5331 WS_VISIBLE | BS_PUSHBUTTON | BS_NOPOINTERFOCUS |
5332 BS_BITMAP,
5333 swp.cx - 22,
5334 swp.y + 2,
5335 24,
5336 22, hwnd, HWND_TOP, IDM_USERLIST, NULL, NULL);
[376]5337 if (!hwndTmp)
[551]5338 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
[376]5339
5340 hwndUserlist = WinCreateWindow(hwndFrame,
5341 WC_COMBOBOX,
5342 (PSZ) NULL,
5343 WS_VISIBLE | CBS_DROPDOWN |
5344 LS_HORZSCROLL,
5345 (swp.x +
5346 WinQuerySysValue(HWND_DESKTOP,
[551]5347 SV_CXSIZEBORDER) + 48L),
[376]5348 (swp.cy -
5349 WinQuerySysValue(HWND_DESKTOP,
[551]5350 SV_CYSIZEBORDER)) - 60,
[376]5351 ((swp.cx -
5352 (WinQuerySysValue(HWND_DESKTOP,
[551]5353 SV_CXSIZEBORDER) *
5354 2)) - 64L), 60L, hwndFrame, HWND_TOP,
5355 MAIN_USERLIST, NULL, NULL);
[376]5356 if (!hwndUserlist)
[551]5357 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
[376]5358 hwndCmdlist = WinCreateWindow(hwndFrame,
5359 WC_COMBOBOX,
5360 (PSZ) NULL,
5361 WS_VISIBLE | CBS_DROPDOWN |
5362 LS_HORZSCROLL,
5363 (swp.x +
5364 WinQuerySysValue(HWND_DESKTOP,
[551]5365 SV_CXSIZEBORDER) + 48L),
[376]5366 (swp.cy -
5367 WinQuerySysValue(HWND_DESKTOP,
5368 SV_CYSIZEBORDER)) - 60,
5369 ((swp.cx -
5370 (WinQuerySysValue(HWND_DESKTOP,
[551]5371 SV_CXSIZEBORDER) * 2)) -
5372 64L), 60L, hwndFrame, HWND_TOP,
5373 MAIN_CMDLIST, NULL, NULL);
[376]5374 if (!hwndCmdlist)
[551]5375 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
5376 WinSetWindowText(hwndCmdlist, GetPString(IDS_COMMANDSTEXT));
[376]5377 hwndStatelist = WinCreateWindow(hwndFrame,
[133]5378 WC_COMBOBOX,
5379 (PSZ) NULL,
5380 WS_VISIBLE | CBS_DROPDOWN |
5381 LS_HORZSCROLL,
5382 (swp.x +
5383 WinQuerySysValue(HWND_DESKTOP,
[551]5384 SV_CXSIZEBORDER) + 48L),
[133]5385 (swp.cy -
5386 WinQuerySysValue(HWND_DESKTOP,
[551]5387 SV_CYSIZEBORDER)) - 60,
[133]5388 ((swp.cx -
5389 (WinQuerySysValue(HWND_DESKTOP,
[551]5390 SV_CXSIZEBORDER) *
5391 2)) - 64L), 60L, hwndFrame, HWND_TOP,
5392 MAIN_SETUPLIST, NULL, NULL);
[376]5393 if (!hwndStatelist)
[551]5394 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
[824]5395
[376]5396 hwndDrivelist = WinCreateWindow(hwndFrame,
5397 WC_COMBOBOX,
5398 (PSZ) NULL,
5399 WS_VISIBLE | CBS_DROPDOWN,
5400 (swp.x +
5401 WinQuerySysValue(HWND_DESKTOP,
5402 SV_CXSIZEBORDER)),
5403 (swp.cy -
5404 WinQuerySysValue(HWND_DESKTOP,
[551]5405 SV_CYSIZEBORDER)) - 60,
[376]5406 48L,
5407 60L,
5408 hwndFrame,
[551]5409 HWND_TOP, MAIN_DRIVELIST, NULL, NULL);
[376]5410 if (!hwndDrivelist)
[551]5411 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
[376]5412 SetPresParams(hwndDrivelist,
[551]5413 NULL, NULL, NULL, GetPString(IDS_10SYSTEMMONOTEXT));
[376]5414 hwndButtonlist = WinCreateWindow(hwndFrame,
5415 WC_COMBOBOX,
5416 (PSZ) NULL,
5417 WS_VISIBLE | CBS_DROPDOWN |
5418 LS_HORZSCROLL,
5419 (swp.cx -
5420 WinQuerySysValue(HWND_DESKTOP,
[551]5421 SV_CXSIZEBORDER)) -
5422 164L,
[376]5423 (swp.cy -
5424 WinQuerySysValue(HWND_DESKTOP,
[551]5425 SV_CYSIZEBORDER)) - 60,
5426 164L, 60L, hwndFrame, HWND_TOP,
5427 MAIN_BUTTONLIST, NULL, NULL);
[376]5428 if (!hwndButtonlist)
[551]5429 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
[376]5430 WinSendMsg(WinWindowFromID(hwndUserlist, CBID_EDIT),
[551]5431 EM_SETTEXTLIMIT, MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
[376]5432 WinSendMsg(WinWindowFromID(hwndStatelist, CBID_EDIT),
[787]5433 EM_SETTEXTLIMIT, MPFROM2SHORT(STATE_NAME_MAX_BYTES, 0), MPVOID);
[376]5434 WinSendMsg(WinWindowFromID(hwndDrivelist, CBID_EDIT),
[551]5435 EM_SETREADONLY, MPFROM2SHORT(TRUE, 0), MPVOID);
[376]5436 WinSendMsg(WinWindowFromID(hwndButtonlist, CBID_EDIT),
[551]5437 EM_SETREADONLY, MPFROM2SHORT(TRUE, 0), MPVOID);
[376]5438 WinSendMsg(WinWindowFromID(hwndCmdlist, CBID_EDIT),
[551]5439 EM_SETREADONLY, MPFROM2SHORT(TRUE, 0), MPVOID);
[376]5440
5441 oldproc = WinSubclassWindow(WinWindowFromID(hwndUserlist, CBID_EDIT),
5442 DropDownListProc);
5443 WinSetWindowPtr(WinWindowFromID(hwndUserlist, CBID_EDIT),
[551]5444 QWL_USER, (PVOID) oldproc);
[376]5445 oldproc = WinSubclassWindow(WinWindowFromID(hwndCmdlist, CBID_EDIT),
5446 DropDownListProc);
5447 WinSetWindowPtr(WinWindowFromID(hwndCmdlist, CBID_EDIT),
[551]5448 QWL_USER, (PVOID) oldproc);
[376]5449 oldproc = WinSubclassWindow(WinWindowFromID(hwndButtonlist, CBID_EDIT),
5450 DropDownListProc);
5451 WinSetWindowPtr(WinWindowFromID(hwndButtonlist, CBID_EDIT),
[551]5452 QWL_USER, (PVOID) oldproc);
[376]5453 oldproc = WinSubclassWindow(WinWindowFromID(hwndStatelist, CBID_EDIT),
5454 DropDownListProc);
5455 WinSetWindowPtr(WinWindowFromID(hwndStatelist, CBID_EDIT),
[551]5456 QWL_USER, (PVOID) oldproc);
[376]5457 oldproc = WinSubclassWindow(WinWindowFromID(hwndDrivelist, CBID_EDIT),
5458 DropDownListProc);
5459 WinSetWindowPtr(WinWindowFromID(hwndDrivelist, CBID_EDIT),
[551]5460 QWL_USER, (PVOID) oldproc);
5461 oldproc = WinSubclassWindow(hwndUserlist, DropDownListProc);
5462 WinSetWindowPtr(hwndUserlist, QWL_USER, (PVOID) oldproc);
5463 oldproc = WinSubclassWindow(hwndCmdlist, DropDownListProc);
5464 WinSetWindowPtr(hwndCmdlist, QWL_USER, (PVOID) oldproc);
5465 oldproc = WinSubclassWindow(hwndStatelist, DropDownListProc);
5466 WinSetWindowPtr(hwndStatelist, QWL_USER, (PVOID) oldproc);
5467 oldproc = WinSubclassWindow(hwndDrivelist, DropDownListProc);
[376]5468 WinSetWindowPtr(hwndDrivelist, QWL_USER, (PVOID) oldproc);
[551]5469 oldproc = WinSubclassWindow(hwndButtonlist, DropDownListProc);
5470 WinSetWindowPtr(hwndButtonlist, QWL_USER, (PVOID) oldproc);
5471 oldproc = WinSubclassWindow(WinWindowFromID(hwndFrame, IDM_USERLIST),
[376]5472 ChildFrameButtonProc);
[551]5473 WinSetWindowPtr(WinWindowFromID(hwndFrame, IDM_USERLIST),
5474 QWL_USER, (PVOID) oldproc);
5475 oldproc = WinSubclassWindow(WinWindowFromID(hwndFrame, IDM_OPENWALK),
[376]5476 ChildFrameButtonProc);
[551]5477 WinSetWindowPtr(WinWindowFromID(hwndFrame, IDM_OPENWALK),
5478 QWL_USER, (PVOID) oldproc);
5479 hwndMenu = WinWindowFromID(hwndFrame, FID_MENU);
5480 WinSendMsg(hwnd, UM_ADDTOMENU, MPVOID, MPVOID);
[376]5481 SetToggleChecks(hwndMenu);
[551]5482 SetConditionalCascade(hwndMenu, IDM_TOOLSUBMENU, IDM_TOOLBAR);
5483 SetConditionalCascade(hwndMenu, IDM_AUTOVIEWSUBMENU, IDM_AUTOVIEW);
5484 SetConditionalCascade(hwndMenu, IDM_TILEMENU, IDM_TILE);
5485 WinSetWindowULong(hwnd, QWL_USER, hwndMenu);
[376]5486 memset(&mi, 0, sizeof(mi));
5487 memset(&mit, 0, sizeof(mit));
[551]5488 hwndSysMenu = WinWindowFromID(hwndFrame, FID_SYSMENU);
[376]5489 idSysMenu = SHORT1FROMMR(WinSendMsg(hwndSysMenu,
5490 MM_ITEMIDFROMPOSITION,
[551]5491 MPVOID, MPVOID));
[376]5492 WinSendMsg(hwndSysMenu,
[551]5493 MM_QUERYITEM, MPFROM2SHORT(idSysMenu, 0), MPFROMP(&mit));
[376]5494 hwndSysSubMenu = mit.hwndSubMenu;
5495 mi.iPosition = MIT_END;
5496 mi.afStyle = MIS_SEPARATOR;
[551]5497 mi.id = (USHORT) - 1;
5498 WinSendMsg(hwndSysSubMenu, MM_INSERTITEM, MPFROMP(&mi), MPFROMP(NULL));
[376]5499 mi.afStyle = MIS_TEXT;
5500 mi.id = IDM_IDEALSIZE;
5501 WinSendMsg(hwndSysSubMenu,
5502 MM_INSERTITEM,
[551]5503 MPFROMP(&mi), MPFROMP(GetPString(IDS_IDEALMENUTEXT)));
[376]5504 mi.afStyle = MIS_TEXT;
5505 mi.id = IDM_HIDEMENU;
5506 WinSendMsg(hwndSysSubMenu,
5507 MM_INSERTITEM,
[551]5508 MPFROMP(&mi), MPFROMP(GetPString(IDS_HIDEMENUTEXT)));
[376]5509 SetSysMenu(hwndSysMenu);
5510
5511 size = sizeof(BOOL);
5512 if (PrfQueryProfileData(fmprof,
[551]5513 FM3Str,
5514 "MenuInvisible", &temp, &size) && size && temp)
5515 WinSendMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_HIDEMENU, 0), MPVOID);
[376]5516 size = sizeof(BOOL);
5517 if (PrfQueryProfileData(fmprof,
[551]5518 FM3Str, "FreeTree", &temp, &size) && size && temp)
5519 WinSendMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_FREETREE, 0), MPVOID);
[376]5520 size = sizeof(BOOL);
5521 if (PrfQueryProfileData(fmprof,
5522 FM3Str,
[551]5523 "AutoTile", &temp, &size) && size && !temp)
5524 WinSendMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_AUTOTILE, 0), MPVOID);
[376]5525 size = sizeof(BOOL);
5526 if (PrfQueryProfileData(fmprof,
[551]5527 FM3Str, "Toolbar", &temp, &size) && size && !temp)
5528 WinSendMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_TOOLBAR, 0), MPVOID);
[2]5529
[551]5530 WinSetWindowText(WinWindowFromID(hwndFrame, FID_TITLEBAR), "FM/2");
5531 FixSwitchList(hwndFrame, NULL);
5532 break; // WM_CREATE
[2]5533
[133]5534 case UM_SETUP:
5535 /*
5536 * start up some initial children
5537 */
5538 load_tools(NULL);
[551]5539 BuildTools(hwndToolback, TRUE);
5540 WinShowWindow(WinQueryWindow(hwnd, QW_PARENT), TRUE);
5541 PostMsg(MainObjectHwnd, UM_SETUP2, mp1, mp2);
[133]5542 return 0;
[2]5543
[133]5544 case UM_SETUP2:
5545 {
5546 SWP swp;
5547 ULONG size = sizeof(SWP);
[2]5548
[133]5549 WinQueryWindowPos(hwnd, &swp);
5550 hwndTree = StartTreeCnr(hwnd, 0);
5551 if (!hwndTree)
5552 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
[551]5553 else {
[133]5554 if (!fSaveState ||
5555 !PrfQueryProfileData(fmprof,
5556 FM3Str,
5557 "LastTreePos",
[551]5558 &swp, &size) || size != sizeof(SWP)) {
[2]5559
[133]5560 INT ratio, height = 0;
[2]5561
[133]5562 if (!fNoTreeGap)
5563 height = WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2;
5564 size = sizeof(ratio);
5565 if (!PrfQueryProfileData(fmprof,
5566 FM3Str,
5567 "TreeWindowRatio",
5568 (PVOID) & ratio,
[551]5569 &size) || size < sizeof(ratio))
[133]5570 ratio = 400;
5571 WinSetWindowPos(hwndTree,
5572 HWND_TOP,
5573 0,
5574 height,
5575 (swp.cx * 100) / ratio,
5576 swp.cy - height,
5577 SWP_SHOW | SWP_SIZE | SWP_MOVE |
5578 SWP_ACTIVATE | SWP_ZORDER);
5579 }
5580 else
5581 WinSetWindowPos(hwndTree,
5582 HWND_TOP,
5583 swp.x,
5584 swp.y,
5585 swp.cx,
5586 swp.cy,
5587 swp.fl | SWP_MOVE | SWP_SIZE | SWP_SHOW |
5588 SWP_ZORDER | SWP_ACTIVATE);
5589 }
5590 ResizeTools(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
5591 MAIN_TOOLS));
5592 }
[551]5593 PostMsg(MainObjectHwnd, UM_SETUP3, mp1, mp2);
[133]5594 return 0;
[2]5595
[133]5596 case UM_SETUP3:
5597 /* start remaining child windows */
[376]5598 if (!fNoSaveState && fSaveState)
[923]5599// JBS PostMsg(MainObjectHwnd, UM_RESTORE, MPVOID, MPVOID);
5600 PostMsg(MainObjectHwnd, UM_RESTORE, MPFROMP(FM2_STATE_AT_CLOSE), MPVOID);
[551]5601 PostMsg(MainObjectHwnd, UM_SETUP4, mp1, mp2);
[133]5602 return 0;
[2]5603
[133]5604 case UM_SETUP4:
5605 {
5606 INT argc = (INT) mp1, x;
5607 CHAR **argv = (CHAR **) mp2;
[2]5608
[376]5609 for (x = 1; x < argc; x++) {
[133]5610 if (*argv[x] == '/' || *argv[x] == ';')
5611 continue;
[551]5612 if (!IsFile(argv[x]) && !FindDirCnrByName(argv[x], FALSE))
5613 OpenDirCnr((HWND) 0, hwndMain, hwndTree, TRUE, argv[x]);
[2]5614 }
[133]5615 }
[551]5616 PostMsg(MainObjectHwnd, UM_SETUP5, MPVOID, MPVOID);
[133]5617 return 0;
[2]5618
[133]5619 case UM_SETUP5:
5620 if (fAutoTile)
5621 TileChildren(hwnd, TRUE);
[551]5622 PostMsg(hwnd, UM_FILLUSERLIST, MPVOID, MPVOID);
5623 PostMsg(hwnd, UM_FILLSETUPLIST, MPVOID, MPVOID);
5624 PostMsg(hwnd, UM_FILLCMDLIST, MPVOID, MPVOID);
5625 PostMsg(hwnd, UM_FILLBUTTONLIST, MPVOID, MPVOID);
[133]5626 {
5627 HWND hwndActive;
[2]5628
[133]5629 hwndActive = TopWindow(hwnd, hwndTree);
5630 if (hwndActive)
[551]5631 WinSetWindowPos(hwndActive, HWND_TOP, 0, 0, 0, 0, SWP_ACTIVATE);
[133]5632 }
[376]5633 if (fStartMinimized || fReminimize)
[551]5634 PostMsg(hwndTree, UM_MINIMIZE, MPVOID, MPVOID);
[133]5635 else if (fStartMaximized)
[551]5636 PostMsg(hwndTree, UM_MAXIMIZE, MPVOID, MPVOID);
[133]5637 fRunning = TRUE;
[917]5638 if (fWantFirstTimeInit) {
5639 fWantFirstTimeInit = FALSE;
5640 PostMsg(hwnd, WM_COMMAND, MPFROMLONG(IDM_QUICKSETTINGS), MPVOID);
5641 }
[133]5642 return 0;
[2]5643 }
5644
[133]5645 return WinDefWindowProc(hwnd, msg, mp1, mp2);
[2]5646}
5647
[133]5648MRESULT EXPENTRY MainWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
5649{
[551]5650 switch (msg) {
[133]5651 case WM_CREATE:
5652 case UM_SETUP:
5653 case UM_SETUP2:
5654 case UM_SETUP3:
5655 case UM_SETUP4:
5656 case UM_SETUP5:
5657 return MainWMOnce(hwnd, msg, mp1, mp2);
[2]5658
[133]5659 case WM_CONTROLPOINTER:
5660 if (!fNoFinger &&
5661 (SHORT1FROMMP(mp1) == IDM_OPENWALK ||
5662 SHORT1FROMMP(mp1) == IDM_USERLIST))
5663 return MRFROMLONG(hptrFinger);
5664 break;
[2]5665
[133]5666 case UM_LOADFILE:
5667 case UM_THREADUSE:
[260]5668 case UM_BUILDDRIVEBAR:
[133]5669 return CommonMainWndProc(hwnd, msg, mp1, mp2);
[2]5670
[133]5671 case WM_BUTTON1UP:
5672 case WM_BUTTON2UP:
5673 case WM_BUTTON3UP:
5674 case WM_MOUSEMOVE:
5675 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
5676 break;
[2]5677
[133]5678 case WM_CHAR:
5679 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
5680 break;
[2]5681
[133]5682 case WM_MENUEND:
[551]5683 if ((HWND) mp2 == MainPopupMenu) {
[133]5684 WinDestroyWindow(MainPopupMenu);
[551]5685 MainPopupMenu = (HWND) 0;
[133]5686 }
5687 break;
[2]5688
[133]5689 case UM_CONTEXTMENU:
5690 case WM_CONTEXTMENU:
[875]5691 if (CheckMenu(hwndMainMenu, &MainPopupMenu, MAIN_POPUP)) {
[133]5692 SetToggleChecks(MainPopupMenu);
5693 PopupMenu(hwnd, hwnd, MainPopupMenu);
5694 }
5695 if (msg == UM_CONTEXTMENU)
5696 return 0;
5697 return MRFROMSHORT(TRUE);
[2]5698
[133]5699 case UM_SETUSERLISTNAME:
[551]5700 if (mp1) {
[133]5701 if (fUserComboBox)
5702 WinSetWindowText(WinWindowFromID(hwndUserlist, CBID_EDIT),
5703 (CHAR *) mp1);
[551]5704 if (add_udir(FALSE, (CHAR *) mp1)) {
[618]5705 if (fUserComboBox && fAutoAddDirs) {
5706 WinSendMsg(hwndUserlist, LM_INSERTITEM,
5707 MPFROM2SHORT(LIT_SORTASCENDING, 0),
5708 MPFROMP((CHAR *) mp1));
[133]5709 }
5710 }
5711 }
5712 return 0;
[2]5713
[133]5714 case UM_ARRANGEICONS:
5715 ArrangeIcons(hwnd);
5716 return 0;
[2]5717
[133]5718 case WM_CHORD:
[551]5719 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_WINDOWDLG, 0), MPVOID);
[133]5720 break;
[2]5721
[133]5722 case WM_SETFOCUS:
5723 if (mp2)
[551]5724 PostMsg(hwnd, UM_FOCUSME, MPVOID, MPVOID);
[133]5725 break;
[2]5726
[133]5727 case UM_FOCUSME:
[551]5728 WinSetFocus(hwndTree, TRUE);
[133]5729 return 0;
[2]5730
[133]5731 case UM_RESCAN:
5732 TileChildren(hwnd, TRUE);
5733 return 0;
[2]5734
[133]5735 case WM_SAVEAPPLICATION:
5736 {
5737 SWP swp;
[2]5738
[133]5739 WinQueryWindowPos(WinQueryWindow(hwnd, QW_PARENT), &swp);
[551]5740 if (!(swp.fl & (SWP_HIDE | SWP_MINIMIZE))) {
[133]5741 WinStoreWindowPos(FM2Str,
[551]5742 "MainWindowPos", WinQueryWindow(hwnd, QW_PARENT));
[133]5743 if (!fNoSaveState && fSaveState)
[923]5744// JBS SaveDirCnrState(hwnd, NULL);
5745 SaveDirCnrState(hwnd, FM2_STATE_AT_CLOSE);
[133]5746 }
5747 }
5748 break;
[2]5749
[133]5750 case MM_PORTHOLEINIT:
[551]5751 switch (SHORT1FROMMP(mp1)) {
[133]5752 case 0:
5753 case 1:
5754 {
5755 HWND hwndCurrent;
5756 ULONG wmsg;
[2]5757
[133]5758 wmsg = (SHORT1FROMMP(mp1) == 0) ? UM_FILESMENU : UM_VIEWSMENU;
[551]5759 hwndCurrent = TopWindow(hwnd, (HWND) 0);
5760 PortholeInit((HWND) WinSendMsg(WinWindowFromID(hwndCurrent,
5761 FID_CLIENT), wmsg,
5762 MPVOID, MPVOID), mp1, mp2);
[133]5763 }
5764 break;
5765 }
5766 break;
[2]5767
[133]5768 case WM_INITMENU:
[551]5769 switch (SHORT1FROMMP(mp1)) {
[133]5770 case IDM_CONFIGMENU:
[551]5771 SetToggleChecks((HWND) WinQueryWindowULong(hwnd, QWL_USER));
[133]5772 break;
[2]5773
[133]5774 case IDM_WINDOWSMENU:
5775 /*
5776 * add child windows of client
5777 * and switchlist entries to end of pulldown menu
5778 */
5779 {
5780 HWND hwndMenu, hwndSubMenu;
5781 MENUITEM mi;
[2]5782
[133]5783 hwndMenu = WinQueryWindowULong(hwnd, QWL_USER);
5784 memset(&mi, 0, sizeof(mi));
5785 mi.iPosition = MIT_END;
5786 mi.afStyle = MIS_TEXT;
5787 if (!WinSendMsg(hwndMenu, MM_QUERYITEM,
[551]5788 MPFROM2SHORT(IDM_WINDOWSMENU, TRUE), MPFROMP(&mi)))
[133]5789 break;
5790 hwndSubMenu = mi.hwndSubMenu;
[551]5791 SetupWinList(hwndSubMenu, hwnd, WinQueryWindow(hwnd, QW_PARENT));
[133]5792 }
5793 break;
[2]5794
[133]5795 default:
5796 {
5797 HWND hwndCurrent;
[2]5798
[551]5799 hwndCurrent = TopWindow(hwnd, (HWND) 0);
[133]5800 if (hwndCurrent)
5801 WinSendMsg(hwndCurrent, UM_INITMENU, mp1, mp2);
5802 }
5803 break;
5804 }
5805 break;
[2]5806
[133]5807 case UM_ADDTOMENU:
5808 AddToMenu((CHAR *) mp1, WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
5809 FID_MENU));
5810 return 0;
[2]5811
[133]5812 case UM_FILLCMDLIST:
5813 WinSendMsg(hwndCmdlist, LM_DELETEALL, MPVOID, MPVOID);
5814 if (!cmdloaded)
5815 load_commands();
[551]5816 if (cmdhead) {
[2]5817
[133]5818 LINKCMDS *info;
[2]5819
[133]5820 info = cmdhead;
[551]5821 while (info) {
[133]5822 WinSendMsg(hwndCmdlist, LM_INSERTITEM,
[551]5823 MPFROM2SHORT(LIT_END, 0), MPFROMP(info->title));
5824 info = info->next;
[133]5825 }
5826 }
5827 return 0;
[2]5828
[133]5829 case UM_FILLSETUPLIST:
[787]5830 fill_setups_list();
[133]5831 return 0;
[2]5832
[133]5833 case UM_FILLBUTTONLIST:
5834 WinSendMsg(hwndButtonlist, LM_DELETEALL, MPVOID, MPVOID);
[551]5835 if (fUserComboBox) {
[2]5836
[133]5837 BOOL foundit = FALSE, thisone;
5838 ULONG ulSearchCount;
5839 SHORT sSelect;
[847]5840 FILEFINDBUF3 findbuf;
[133]5841 HDIR hDir;
5842 CHAR *p;
[2]5843
[133]5844 DosError(FERR_DISABLEHARDERR);
5845 hDir = HDIR_CREATE;
[787]5846 ulSearchCount = 1;
[847]5847 if (!DosFindFirst("*.TLS", &hDir, FILE_READONLY | FILE_ARCHIVED,
[917]5848 &findbuf, sizeof(FILEFINDBUF3),
5849 &ulSearchCount, FIL_STANDARD)) {
[551]5850 do {
[133]5851 priority_bumped();
[551]5852 if (!foundit) {
[133]5853 thisone = FALSE;
5854 p = strrchr(lasttoolbox, '\\');
5855 if (!p)
5856 p = lasttoolbox;
5857 else
5858 p++;
5859 if (!stricmp(findbuf.achName, p))
5860 thisone = TRUE;
5861 }
5862 p = strrchr(findbuf.achName, '.');
5863 if (p)
5864 *p = 0;
5865 sSelect = (SHORT) WinSendMsg(hwndButtonlist, LM_INSERTITEM,
5866 MPFROM2SHORT(LIT_SORTASCENDING, 0),
5867 MPFROMP(findbuf.achName));
[551]5868 if (!foundit && thisone && sSelect >= 0) {
5869 WinSendMsg(hwndButtonlist, LM_SELECTITEM,
5870 MPFROM2SHORT(sSelect, 0), MPFROMLONG(TRUE));
[133]5871 foundit = TRUE;
5872 }
5873 }
[847]5874 while (!DosFindNext(hDir, &findbuf, sizeof(FILEFINDBUF3),
5875 &ulSearchCount));
[133]5876 DosFindClose(hDir);
5877 priority_bumped();
5878 }
5879 WinSetWindowText(hwndButtonlist, GetPString(IDS_TOOLBOXTEXT));
5880 }
5881 return 0;
[2]5882
[133]5883 case UM_FILLUSERLIST:
5884 WinSendMsg(hwndUserlist, LM_DELETEALL, MPVOID, MPVOID);
[551]5885 if (fUserComboBox) {
[260]5886 ULONG ulDriveNum;
5887 ULONG ulDriveMap;
[133]5888 ULONG ulSearchCount;
[847]5889 FILEFINDBUF3 findbuf;
[133]5890 HDIR hDir;
5891 APIRET rc;
[260]5892 LINKDIRS *info;
5893 LINKDIRS *temp;
[2]5894
[133]5895 if (!loadedudirs)
5896 load_udirs();
5897 DosError(FERR_DISABLEHARDERR);
5898 DosQCurDisk(&ulDriveNum, &ulDriveMap);
5899 info = udirhead;
[551]5900 while (info) {
5901 if (IsFullName(info->path) &&
5902 !(driveflags[toupper(*info->path) - 'A'] &
5903 (DRIVE_IGNORE | DRIVE_INVALID))) {
[133]5904 DosError(FERR_DISABLEHARDERR);
5905 hDir = HDIR_CREATE;
[787]5906 ulSearchCount = 1;
[551]5907 if (!IsRoot(info->path))
[847]5908 rc = DosFindFirst(info->path, &hDir, FILE_DIRECTORY |
5909 MUST_HAVE_DIRECTORY | FILE_READONLY |
5910 FILE_ARCHIVED | FILE_SYSTEM | FILE_HIDDEN,
5911 &findbuf, sizeof(FILEFINDBUF3),
5912 &ulSearchCount, FIL_STANDARD);
[551]5913 else {
[133]5914 rc = 0;
5915 findbuf.attrFile = FILE_DIRECTORY;
5916 }
5917 priority_bumped();
[551]5918 if (!rc) {
5919 if (!IsRoot(info->path))
[133]5920 DosFindClose(hDir);
5921 if (findbuf.attrFile & FILE_DIRECTORY)
5922 WinSendMsg(hwndUserlist, LM_INSERTITEM,
5923 MPFROM2SHORT(LIT_SORTASCENDING, 0),
[551]5924 MPFROMP(info->path));
5925 else {
5926 temp = info->next;
5927 remove_udir(info->path);
[133]5928 info = temp;
5929 continue;
5930 }
5931 }
[847]5932 else if (!(ulDriveMap & (1 << (toupper(*info->path) - 'A')))) {
[551]5933 temp = info->next;
5934 remove_udir(info->path);
[133]5935 info = temp;
5936 continue;
5937 }
5938 }
[551]5939 info = info->next;
[133]5940 }
5941 info = ldirhead;
[551]5942 while (info) {
5943 if (IsFullName(info->path) &&
5944 !(driveflags[toupper(*info->path) - 'A'] &
5945 (DRIVE_IGNORE | DRIVE_INVALID))) {
[133]5946 DosError(FERR_DISABLEHARDERR);
5947 hDir = HDIR_CREATE;
[787]5948 ulSearchCount = 1;
[551]5949 if (!IsRoot(info->path))
[847]5950 rc = DosFindFirst(info->path, &hDir, FILE_DIRECTORY |
5951 MUST_HAVE_DIRECTORY | FILE_READONLY |
5952 FILE_ARCHIVED | FILE_SYSTEM | FILE_HIDDEN,
5953 &findbuf, sizeof(FILEFINDBUF3),
5954 &ulSearchCount, FIL_STANDARD);
[551]5955 else {
[133]5956 rc = 0;
5957 findbuf.attrFile = FILE_DIRECTORY;
5958 }
5959 priority_bumped();
[551]5960 if (!rc) {
5961 if (!IsRoot(info->path))
[133]5962 DosFindClose(hDir);
5963 if (findbuf.attrFile & FILE_DIRECTORY)
5964 WinSendMsg(hwndUserlist, LM_INSERTITEM,
5965 MPFROM2SHORT(LIT_SORTASCENDING, 0),
[551]5966 MPFROMP(info->path));
5967 else {
5968 temp = info->next;
5969 remove_udir(info->path);
[133]5970 info = temp;
5971 continue;
5972 }
5973 }
[847]5974 else if (!(ulDriveMap & (1 << (toupper(*info->path) - 'A')))) {
[551]5975 temp = info->next;
5976 remove_udir(info->path);
[133]5977 info = temp;
5978 continue;
5979 }
5980 }
[551]5981 info = info->next;
[133]5982 }
5983 WinSendMsg(hwndUserlist, LM_INSERTITEM,
5984 MPFROM2SHORT(0, 0),
5985 MPFROMP(GetPString(IDS_NEWDIRECTORYTEXT)));
5986 WinSetWindowText(hwndUserlist, GetPString(IDS_COMMONDIRTEXT));
5987 }
5988 return 0;
[2]5989
[133]5990 case UM_SIZE:
5991 if (fAutoTile)
5992 TileChildren(hwnd, FALSE);
5993 else
5994 MoveChildrenAwayFromTree(hwnd);
5995 return 0;
[2]5996
[133]5997 case WM_SIZE:
5998 ResizeChildren(hwnd, SHORT1FROMMP(mp1), SHORT2FROMMP(mp1),
5999 SHORT1FROMMP(mp2), SHORT2FROMMP(mp2));
6000 break;
[2]6001
[133]6002 case WM_ERASEBACKGROUND:
6003 WinFillRect((HPS) mp1, (PRECTL) mp2, 0x00d0d0d0);
6004 return 0;
[2]6005
[133]6006 case WM_PAINT:
6007 {
6008 HPS hps;
6009 RECTL rcl;
[2]6010
[133]6011 hps = WinBeginPaint(hwnd, (HPS) 0, NULL);
[551]6012 if (hps) {
[133]6013 WinQueryWindowRect(hwnd, &rcl);
6014 WinFillRect(hps, &rcl, CLR_PALEGRAY);
6015 WinEndPaint(hps);
6016 }
6017 }
6018 break;
[2]6019
[133]6020 case UM_CONTROL:
[551]6021 switch (SHORT1FROMMP(mp1)) {
[133]6022 case MAIN_CMDLIST:
6023 case MAIN_SETUPLIST:
6024 case MAIN_DRIVELIST:
6025 case MAIN_USERLIST:
6026 case MAIN_BUTTONLIST:
[551]6027 switch (SHORT2FROMMP(mp1)) {
[133]6028 case CBN_ENTER:
6029 {
6030 HWND hwndUL = WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
6031 SHORT1FROMMP(mp1));
6032 CHAR path[CCHMAXPATH];
[787]6033 ULONG ul;
[2]6034
[787]6035 switch (SHORT1FROMMP(mp1)) {
6036 case MAIN_USERLIST:
6037 ul = CCHMAXPATH;
6038 break;
6039 case MAIN_SETUPLIST:
6040 ul = STATE_NAME_MAX_BYTES;
6041 break;
6042 default:
6043 ul = 13; // fixme to not be hardcoded
6044 }
6045
[133]6046 SetShiftState();
[787]6047 WinQueryWindowText(WinWindowFromID(hwndUL, CBID_EDIT), ul, path);
[133]6048 bstrip(path);
[551]6049 if (*path) {
6050 if (SHORT1FROMMP(mp1) == MAIN_USERLIST) {
6051 if (!strcmp(path, GetPString(IDS_NEWDIRECTORYTEXT))) {
[133]6052 if (!LastDir ||
6053 !WinSendMsg(WinQueryWindow(LastDir, QW_PARENT),
[551]6054 UM_CONTAINERDIR, MPFROMP(path), MPVOID))
[133]6055 save_dir2(path);
[551]6056 if (!PMMkDir(hwnd, path, TRUE)) {
6057 WinSetWindowText(hwndUL, GetPString(IDS_COMMONDIRTEXT));
[133]6058 break;
6059 }
6060 }
[551]6061 if (!IsFile(path) && !FindDirCnrByName(path, TRUE)) {
[2]6062
[133]6063 HWND hwndDir;
[2]6064
[133]6065 if ((fUserListSwitches &&
6066 !(shiftstate & KC_SHIFT)) ||
[551]6067 (!fUserListSwitches && (shiftstate & KC_SHIFT))) {
[133]6068 hwndDir = FindDirCnr(hwnd);
[551]6069 if (hwndDir) {
6070 WinSendMsg(LastDir, UM_SETDIR, MPFROMP(path), MPVOID);
[133]6071 break;
6072 }
6073 }
[551]6074 OpenDirCnr((HWND) 0, hwndMain, hwndTree, FALSE, path);
[133]6075 }
6076 }
[551]6077 else if (SHORT1FROMMP(mp1) == MAIN_DRIVELIST) {
[133]6078 ShowTreeRec(WinWindowFromID(WinWindowFromID(hwndTree,
6079 FID_CLIENT),
[551]6080 TREE_CNR), path, FALSE, TRUE);
6081 WinSetFocus(HWND_DESKTOP, hwndTree);
[133]6082 }
[551]6083 else if (SHORT1FROMMP(mp1) == MAIN_BUTTONLIST) {
[133]6084 strcat(path, ".TLS");
6085 load_tools(path);
6086 PrfWriteProfileString(fmprof,
[551]6087 FM3Str, "LastToolBox", lasttoolbox);
6088 BuildTools(hwndToolback, TRUE);
6089 WinSetWindowText(hwndButtonlist, GetPString(IDS_TOOLBOXTEXT));
[133]6090 }
[551]6091 else if (SHORT1FROMMP(mp1) == MAIN_SETUPLIST) {
[2]6092
[787]6093 CHAR szKey[80];
[133]6094 ULONG size, numsaves = 0;
[2]6095
[133]6096 SetShiftState();
6097 size = sizeof(ULONG);
[787]6098 sprintf(szKey, "%s.NumDirsLastTime", path); // path is state name
6099 if (!PrfQueryProfileData(fmprof,
6100 FM3Str,
6101 szKey,
6102 (PVOID)&numsaves,
6103 &size))
[618]6104 {
6105 if ((WinGetLastError(WinQueryAnchorBlock(hwnd)) & 0xffff) == PMERR_NOT_IN_IDX) {
[672]6106 saymsg(MB_ENTER | MB_ICONASTERISK, hwnd,
6107 GetPString(IDS_WARNINGTEXT),
6108 GetPString(IDS_DOESNTEXISTTEXT), path);
[618]6109 }
6110 else {
6111 Win_Error2(hwnd, hwnd, __FILE__, __LINE__,
6112 IDS_PRFQUERYPROFILEDATA);
6113 }
6114 }
[352]6115 else if (!numsaves)
[551]6116 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
[352]6117 else {
[133]6118 if ((shiftstate & KC_SHIFT) == 0)
[551]6119 PostMsg(MainObjectHwnd, UM_RESTORE, MPVOID, MPFROMLONG(2L));
[133]6120 {
6121 char *temp;
[2]6122
[551]6123 temp = xstrdup(path, pszSrcFile, __LINE__);
6124 if (!temp) {
[352]6125 if ((shiftstate & KC_SHIFT) != 0 || fAutoTile)
[551]6126 PostMsg(MainObjectHwnd, UM_RESTORE, MPVOID,
[787]6127 MPFROMLONG(1));
[352]6128 }
6129 else {
[551]6130 if (!PostMsg
6131 (MainObjectHwnd, UM_RESTORE, MPFROMP(temp), MPVOID))
[133]6132 free(temp);
6133 }
6134 }
6135 }
[618]6136 // fixme to hold restored state name for a while
6137 // WinSetWindowText(hwndStatelist, GetPString(IDS_STATETEXT)); // 15 Apr 07 SHL
[133]6138 }
[551]6139 else if (SHORT1FROMMP(mp1) == MAIN_CMDLIST) {
[2]6140
[133]6141 SHORT sSelect;
[2]6142
[133]6143 sSelect = (SHORT) WinSendMsg(hwndCmdlist,
6144 LM_QUERYSELECTION,
[551]6145 MPFROMSHORT(LIT_FIRST), MPVOID);
[133]6146 if (sSelect >= 0)
6147 WinPostMsg(hwnd,
6148 WM_COMMAND,
6149 MPFROM2SHORT(IDM_COMMANDSTART + sSelect, 0),
6150 MPVOID);
[551]6151 WinSetWindowText(hwndCmdlist, GetPString(IDS_COMMANDSTEXT));
[133]6152 }
6153 }
6154 }
6155 break;
[2]6156
[133]6157 default:
6158 break;
6159 }
6160 break;
[2]6161
[133]6162 default:
6163 break;
6164 }
6165 return 0;
[2]6166
[133]6167 case WM_HELP:
[551]6168 WinSendMsg(hwndHelp, HM_HELP_CONTENTS, MPVOID, MPVOID);
[133]6169 break;
[2]6170
[133]6171 case UM_COMMAND:
6172 case WM_COMMAND:
[2]6173
[133]6174 return MainWMCommand(hwnd, msg, mp1, mp2);
[2]6175
[133]6176 case WM_CLOSE:
6177 WinSendMsg(WinQueryWindow(hwnd, QW_PARENT),
[551]6178 WM_SYSCOMMAND, MPFROM2SHORT(SC_RESTORE, 0), MPVOID);
6179 WinSendMsg(hwnd, WM_SAVEAPPLICATION, MPVOID, MPVOID);
[133]6180 fAmClosing = TRUE;
6181 WinSendMsg(WinQueryWindow(hwnd, QW_PARENT),
[551]6182 WM_SYSCOMMAND, MPFROM2SHORT(SC_MINIMIZE, 0), MPVOID);
6183 if (CloseChildren(hwnd)) {
[133]6184 fAmClosing = FALSE;
6185 if (fAutoTile)
[551]6186 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_TILE, 0), MPVOID);
[133]6187 return 0;
6188 }
[551]6189 if (hwndTree) {
6190 if (!PostMsg(hwndTree, WM_CLOSE, MPVOID, MPVOID))
6191 WinSendMsg(hwndTree, WM_CLOSE, MPVOID, MPVOID);
[133]6192 }
[771]6193 DosSleep(1);
[735]6194 return 0; // Hold off WM_QUIT
[2]6195
[133]6196 case UM_CLOSE:
6197 HideNote();
6198 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
6199 return 0;
[2]6200
[133]6201 case UM_RESTORE:
6202 {
6203 char *temp;
[2]6204
[551]6205 temp = xstrdup(GetPString(IDS_FM2TEMPTEXT), pszSrcFile, __LINE__);
[352]6206 if (temp) {
[551]6207 if (!PostMsg(MainObjectHwnd, UM_RESTORE, MPFROMP(temp), MPVOID))
[133]6208 free(temp);
6209 }
6210 }
6211 return 0;
[2]6212
[133]6213 case UM_SETDIR:
[352]6214 /* mp1 == name of directory to open */
6215 if (mp1)
[551]6216 return MRFROMLONG(OpenDirCnr((HWND) 0,
[133]6217 hwndMain,
[551]6218 hwndTree, (BOOL) mp2, (char *)mp1));
[133]6219 return 0;
[2]6220
[133]6221 case WM_DESTROY:
[551]6222 hwndMain = (HWND) 0;
6223 if (!PostMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID))
6224 WinSendMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID);
[133]6225 break;
6226 }
[2]6227
[133]6228 return WinDefWindowProc(hwnd, msg, mp1, mp2);
[2]6229}
[787]6230
6231#pragma alloc_text(MISC8,SetToggleChecks,FindDirCnrByName,TopWindow)
6232#pragma alloc_text(MISC8,TopWindowName,CountDirCnrs)
6233#pragma alloc_text(MAINWND,AdjustSizeOfClient,FillClient,ChildButtonProc)
6234#pragma alloc_text(MAINWND,ToolBackProc,StatusProc)
6235#pragma alloc_text(MAINWND,MoveChildrenAwayFromTree,ArrangeIcons,NextChild)
6236#pragma alloc_text(MAINWND,ChildFrameButtonProc)
6237#pragma alloc_text(MAINWND2,CloseChildren,CountChildren,GetNextWindowPos)
6238#pragma alloc_text(MAINWND2,CascadeChildren,TileChildren,ResizeChildren)
6239#pragma alloc_text(MAINWND2,MinResChildren,MainFrameWndProc,MainWndProc)
6240#pragma alloc_text(MAINWND2,DropDownListProc)
6241#pragma alloc_text(MAINWND3,RestoreDirCnrState,SaveDirCnrState)
6242#pragma alloc_text(MAINWND3,CloseDirCnrChildren,TransformSwp)
6243#pragma alloc_text(MAINWND3,ResizeTools,BuildTools,CommandLineProc)
6244#pragma alloc_text(MAINWND4,DriveProc,DriveBackProc,BuildDriveBarButtons,ResizeDrives)
6245#pragma alloc_text(MAINWND4,LEDProc,IdealButtonProc)
6246#pragma alloc_text(MAINWND5,MainWMOnce)
6247#pragma alloc_text(MAINWND6,MainWMCommand)
6248#pragma alloc_text(BUBBLE,MakeBubble,BubbleProc,BubbleHelp)
6249#pragma alloc_text(MAINOBJ,MainObjectWndProc,MakeMainObjWin)
6250
Note: See TracBrowser for help on using the repository browser.