source: trunk/dll/mainwnd.c@ 1434

Last change on this file since 1434 was 1429, checked in by Gregg Young, 16 years ago

Comments and documentation for previous 5 change sets

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