source: trunk/dll/mainwnd.c@ 606

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

Drag drop work around for number of files limitation in PM

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