source: trunk/dll/mainwnd.c@ 676

Last change on this file since 676 was 675, checked in by Gregg Young, 19 years ago

Change drag limit message box to MB_OK | MB_INFORMATION

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