source: trunk/dll/mainwnd.c@ 729

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

Commit more OpenWatcom compatibility updates

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