source: trunk/dll/mainwnd.c@ 888

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

runemf2 now quotes executable strings if needed (Ticket 180); it also reports where it was called from on errors

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