source: trunk/dll/mainwnd.c@ 1437

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

Drive letter incorporated into bitmaps for drivebar buttons. (tickets 13 & 91)

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