source: trunk/dll/mainwnd.c@ 1438

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

Improved drivebar changes; Added AddBackslashToPath() to remove repeatative code. replaced "
" with PCSZ variable; ANY_OBJ added the DosAlloc... (experimental)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 176.1 KB
Line 
1
2/***********************************************************************
3
4 $Id: mainwnd.c 1438 2009-06-28 20:47:00Z 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_HEIGHT - 1,
1894 0, 0, DRIVE_BUTTON_WIDTH - 1, DRIVE_BUTTON_HEIGHT - 1};
1895 //The last 2 numbers should be the width and height of the bitmap
1896 HBITMAP hbm;
1897 PBITMAPINFOHEADER pbmpData;
1898 POINTL ptlStart;
1899 ULONG x, iconid;
1900 FATTRS fat;
1901 SIZEF sizfCharBox;
1902
1903 id = WinQueryWindowUShort(hwnd, QWS_ID);
1904 *szDrv = 0;
1905 x = id - IDM_DRIVEA;
1906 *szDrv = x + 'A';
1907 strcpy(szDrv + 1, ":");
1908 if (x > 1) {
1909 if (driveflags[x] & DRIVE_CDROM)
1910 iconid = CDROM_ICON;
1911 else
1912 iconid = (driveflags[x] & DRIVE_REMOVABLE) ?
1913 REMOVABLE_ICON :
1914 (driveflags[x] & DRIVE_VIRTUAL) ?
1915 VIRTUAL_ICON :
1916 (driveflags[x] & DRIVE_REMOTE) ?
1917 REMOTE_ICON :
1918 (driveflags[x] & DRIVE_RAMDISK) ?
1919 RAMDISK_ICON :
1920 (driveflags[x] & DRIVE_ZIPSTREAM) ?
1921 ZIPSTREAM_ICON : DRIVE_ICON;
1922 }
1923 else
1924 iconid = FLOPPY_ICON;
1925 hps = WinBeginPaint(hwnd, (HPS) 0, NULL);
1926 if (hps) {
1927 hbm = GpiLoadBitmap(hps, 0, iconid, 0, 0);
1928 if (hbm) {
1929 pbmpData = xmallocz(sizeof(PBITMAPINFOHEADER), pszSrcFile, __LINE__);
1930 if (pbmpData) {
1931 GpiQueryBitmapParameters(hbm, pbmpData);
1932 aptl[1].x = pbmpData->cx;
1933 aptl[1].y = pbmpData->cy;
1934 aptl[3].x = pbmpData->cx;
1935 aptl[3].y = pbmpData->cy;
1936 free(pbmpData);
1937 }
1938 GpiWCBitBlt(hps, hbm, 4L, aptl, ROP_SRCCOPY, BBO_PAL_COLORS);
1939 }
1940 memset(&fat, 0, sizeof(fat));
1941 fat.usRecordLength = sizeof(FATTRS);
1942 fat.fsSelection = FATTR_SEL_BOLD ;
1943 fat.usCodePage = 850;
1944 fat.fsFontUse = FATTR_FONTUSE_NOMIX;
1945 strcpy(fat.szFacename , FNT_HELVETICA);
1946 x = GpiCreateLogFont(hps, NULL, DRIVEBAR_FONT_LCID, &fat);
1947 if (x != GPI_ERROR) {
1948 GpiSetCharSet(hps, DRIVEBAR_FONT_LCID);
1949 sizfCharBox.cx = MAKEFIXED(10,0); //Font size
1950 sizfCharBox.cy = MAKEFIXED(14,0);
1951 GpiSetCharBox( hps, &sizfCharBox );
1952 GpiSetColor(hps, iconid == RAMDISK_ICON ? CLR_YELLOW : CLR_DARKBLUE);
1953 ptlStart.x = 1L; //Char box position
1954 ptlStart.y = 8L;
1955 GpiCharStringAt(hps, &ptlStart, strlen(szDrv), szDrv);
1956 GpiDeleteSetId(hps, DRIVEBAR_FONT_LCID);
1957 }
1958 WinEndPaint(hps);
1959 }
1960 }
1961 break;
1962
1963 case UM_SETUP6:
1964 if (helpid == WinQueryWindowUShort(hwnd, QWS_ID)) {
1965 if ((char *)mp1 &&
1966 (!hwndBubble ||
1967 WinQueryWindowULong(hwndBubble, QWL_USER) != hwnd) &&
1968 !WinQueryCapture(HWND_DESKTOP)) {
1969
1970 RECTL rcl;
1971 POINTL ptl;
1972
1973 WinQueryPointerPos(HWND_DESKTOP, &ptl);
1974 WinMapWindowPoints(HWND_DESKTOP, hwnd, &ptl, 1);
1975 WinQueryWindowRect(hwnd, &rcl);
1976 if (WinPtInRect(WinQueryAnchorBlock(hwnd), &rcl, &ptl))
1977 BubbleHelp(hwnd, FALSE, TRUE, FALSE, (char *)mp1);
1978 }
1979 }
1980 return 0;
1981
1982 case WM_MENUEND:
1983 if (hwndMenu == (HWND) mp2) {
1984 WinDestroyWindow(hwndMenu);
1985 hwndMenu = (HWND) 0;
1986 }
1987 break;
1988
1989 case WM_CONTEXTMENU:
1990 if (hwndMenu)
1991 WinDestroyWindow(hwndMenu);
1992 hwndMenu = (HWND) 0;
1993 id = WinQueryWindowUShort(hwnd, QWS_ID);
1994 *szDrv = id - IDM_DRIVEA + 'A';
1995 strcpy(szDrv + 1, ":");
1996 if (isalpha(*szDrv)) {
1997 hwndMenu = WinLoadMenu(HWND_DESKTOP, FM3ModHandle, MAIN_DRIVES);
1998 if (hwndMenu) {
1999 BOOL rdy;
2000 CHAR chDrv = *szDrv;
2001 UINT iDrv;
2002
2003 strcat(szDrv, PCSZ_BACKSLASH);
2004 MakeValidDir(szDrv);
2005 // Disable menus if MakeValidDir changes drive letter fixme this section doesn't do anything see treecnt.c
2006 rdy = toupper(*szDrv) == toupper(chDrv);
2007 iDrv = toupper(*szDrv) - 'A';
2008 if (!rdy || ~driveflags[iDrv] & DRIVE_REMOTE)
2009 WinEnableMenuItem(hwndMenu, IDM_DETACH, FALSE);
2010
2011 if (!rdy || driveflags[iDrv] & DRIVE_NOTWRITEABLE) {
2012 WinEnableMenuItem(hwndMenu, IDM_MKDIR, FALSE);
2013 WinEnableMenuItem(hwndMenu, IDM_FORMAT, FALSE);
2014 WinEnableMenuItem(hwndMenu, IDM_OPTIMIZE, FALSE);
2015 WinEnableMenuItem(hwndMenu, IDM_UNDELETE, FALSE);
2016 }
2017 if (!rdy || ~driveflags[iDrv] & DRIVE_REMOVABLE) {
2018 WinEnableMenuItem(hwndMenu, IDM_EJECT, FALSE);
2019 WinEnableMenuItem(hwndMenu, IDM_LOCK, FALSE);
2020 WinEnableMenuItem(hwndMenu, IDM_UNLOCK, FALSE);
2021 }
2022 if (!rdy) {
2023 WinEnableMenuItem(hwndMenu, IDM_INFO, FALSE);
2024 WinEnableMenuItem(hwndMenu, IDM_ARCHIVE, FALSE);
2025 WinEnableMenuItem(hwndMenu, IDM_SIZES, FALSE);
2026 WinEnableMenuItem(hwndMenu, IDM_SHOWALLFILES, FALSE);
2027 WinEnableMenuItem(hwndMenu, IDM_CHKDSK, FALSE);
2028 }
2029 /* fixme to be gone?
2030 if (!rdy || ~driveflags[iDrv] & DRIVE_CDROM) {
2031 WinEnableMenuItem(hwndMenu, IDM_CLOSETRAY, FALSE);
2032 }
2033 */
2034 PopupMenu(hwnd, hwnd, hwndMenu);
2035 }
2036 }
2037 return MRFROMSHORT(TRUE);
2038
2039 case WM_BUTTON2CLICK:
2040 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
2041 if (!(shiftstate & KC_CTRL))
2042 break;
2043
2044 case WM_CHORD:
2045 case WM_BUTTON3CLICK:
2046 id = WinQueryWindowUShort(hwnd, QWS_ID);
2047 *szDrv = id - IDM_DRIVEA + 'A';
2048 strcpy(szDrv + 1, ":");
2049 if (isalpha(*szDrv)) {
2050 strcat(szDrv, PCSZ_BACKSLASH);
2051 if (!FindDirCnrByName(szDrv, TRUE))
2052 OpenDirCnr((HWND) 0, hwndMain, hwndTree, FALSE, szDrv);
2053 }
2054 break;
2055
2056 case WM_COMMAND:
2057 PostMsg(hwnd, UM_COMMAND, mp1, mp2);
2058 return 0;
2059
2060 case UM_COMMAND:
2061 id = WinQueryWindowUShort(hwnd, QWS_ID);
2062 *szDrv = id - IDM_DRIVEA + 'A';
2063 strcpy(szDrv + 1, ":");
2064 if (isalpha(*szDrv)) {
2065 strcat(szDrv, PCSZ_BACKSLASH);
2066 CommonDriveCmd(hwnd, szDrv, SHORT1FROMMP(mp1));
2067 }
2068 return 0;
2069
2070 case DM_DRAGOVER:
2071 id = WinQueryWindowUShort(hwnd, QWS_ID);
2072 *szDrv = id - IDM_DRIVEA + 'A';
2073 strcpy(szDrv + 1, ":");
2074 if (isalpha(*szDrv) &&
2075 !(driveflags[toupper(*szDrv) - 'A'] & DRIVE_NOTWRITEABLE)) {
2076 if (!emphasized) {
2077 emphasized = TRUE;
2078 DrawTargetEmphasis(hwnd, emphasized);
2079 }
2080 if (AcceptOneDrop(hwnd, mp1, mp2))
2081 return MRFROM2SHORT(DOR_DROP, DO_MOVE);
2082 return MRFROM2SHORT(DOR_NEVERDROP, 0);
2083 }
2084 break;
2085
2086 case DM_DRAGLEAVE:
2087 id = WinQueryWindowUShort(hwnd, QWS_ID);
2088 *szDrv = id - IDM_DRIVEA + 'A';
2089 strcpy(szDrv + 1, ":");
2090 if (isalpha(*szDrv) &&
2091 !(driveflags[toupper(*szDrv) - 'A'] & DRIVE_NOTWRITEABLE)) {
2092 if (emphasized) {
2093 emphasized = FALSE;
2094 DrawTargetEmphasis(hwnd, emphasized);
2095 }
2096 }
2097 break;
2098
2099 case DM_DROPHELP:
2100 id = WinQueryWindowUShort(hwnd, QWS_ID);
2101 *szDrv = id - IDM_DRIVEA + 'A';
2102 strcpy(szDrv + 1, ":");
2103 if (isalpha(*szDrv) &&
2104 !(driveflags[toupper(*szDrv) - 'A'] & DRIVE_NOTWRITEABLE)) {
2105 DropHelp(mp1, mp2, hwnd, GetPString(IDS_DRIVEDROPHELP));
2106 return 0;
2107 }
2108 break;
2109
2110 case DM_DROP:
2111 id = WinQueryWindowUShort(hwnd, QWS_ID);
2112 *szDrv = id - IDM_DRIVEA + 'A';
2113 strcpy(szDrv + 1, ":");
2114 if (isalpha(*szDrv) &&
2115 !(driveflags[toupper(*szDrv) - 'A'] & DRIVE_NOTWRITEABLE)) {
2116
2117 CNRDRAGINFO cnd;
2118 LISTINFO *li;
2119 ULONG action = UM_ACTION;
2120
2121 if (emphasized) {
2122 emphasized = FALSE;
2123 DrawTargetEmphasis(hwnd, emphasized);
2124 }
2125 memset(&cnd, 0, sizeof(cnd));
2126 cnd.pDragInfo = (PDRAGINFO) mp1;
2127 cnd.pRecord = NULL;
2128 li = DoFileDrop(hwnd,
2129 NULL,
2130 TRUE, MPFROM2SHORT(TREE_CNR, CN_DROP), MPFROMP(&cnd));
2131 CheckPmDrgLimit(cnd.pDragInfo);
2132 if (li) {
2133 strcpy(li->targetpath, szDrv);
2134 strcat(li->targetpath, PCSZ_BACKSLASH);
2135 if (li->list && li->list[0] && IsRoot(li->list[0]))
2136 li->type = DO_LINK;
2137 else if (fDragndropDlg && (!*li->arcname || !li->info)) {
2138
2139 CHECKLIST cl;
2140
2141 memset(&cl, 0, sizeof(cl));
2142 cl.size = sizeof(cl);
2143 cl.flags = li->type;
2144 cl.list = li->list;
2145 cl.cmd = li->type;
2146 cl.prompt = li->targetpath;
2147 li->type = WinDlgBox(HWND_DESKTOP,
2148 hwndMain,
2149 DropListProc,
2150 FM3ModHandle, DND_FRAME, MPFROMP(&cl));
2151 if (li->type == DID_ERROR)
2152 Win_Error(DND_FRAME, HWND_DESKTOP, pszSrcFile, __LINE__,
2153 GetPString(IDS_DRAGDROPDIALOGTEXT));
2154 if (!li->type) {
2155 FreeListInfo(li);
2156 return 0;
2157 }
2158 li->list = cl.list;
2159 if (!li->list || !li->list[0]) {
2160 FreeListInfo(li);
2161 return 0;
2162 }
2163 }
2164 else {
2165 if (!WinDlgBox(HWND_DESKTOP,
2166 hwndMain,
2167 WalkDlgProc,
2168 FM3ModHandle,
2169 WALK_FRAME,
2170 MPFROMP(li->targetpath)) || !*li->targetpath) {
2171 FreeListInfo(li);
2172 return 0;
2173 }
2174 }
2175 switch (li->type) {
2176 case DND_LAUNCH:
2177 strcat(li->targetpath, " %a");
2178 ExecOnList(hwndMain,
2179 li->targetpath, PROMPT | WINDOWED, NULL, li->list, NULL,
2180 pszSrcFile, __LINE__);
2181 FreeList(li->list);
2182 li->list = NULL;
2183 break;
2184 case DO_LINK:
2185 if (fLinkSetsIcon) {
2186 li->type = IDM_SETICON;
2187 action = UM_MASSACTION;
2188 }
2189 else
2190 li->type = IDM_COMPARE;
2191 break;
2192 case DND_EXTRACT:
2193 if (*li->targetpath && !IsFile(li->targetpath))
2194 li->type = IDM_EXTRACT;
2195 break;
2196 case DND_MOVE:
2197 li->type = IDM_MOVE;
2198 if (*li->targetpath && IsFile(li->targetpath) == 1) {
2199 action = UM_MASSACTION;
2200 li->type = IDM_ARCHIVEM;
2201 }
2202 break;
2203 case DND_WILDMOVE:
2204 li->type = IDM_WILDMOVE;
2205 if (*li->targetpath && IsFile(li->targetpath) == 1) {
2206 action = UM_MASSACTION;
2207 li->type = IDM_ARCHIVEM;
2208 }
2209 break;
2210 case DND_OBJECT:
2211 li->type = IDM_OBJECT;
2212 action = UM_MASSACTION;
2213 break;
2214 case DND_SHADOW:
2215 li->type = IDM_SHADOW;
2216 action = UM_MASSACTION;
2217 break;
2218 case DND_COMPARE:
2219 li->type = IDM_COMPARE;
2220 break;
2221 case DND_SETICON:
2222 action = UM_MASSACTION;
2223 li->type = IDM_SETICON;
2224 break;
2225 case DND_COPY:
2226 li->type = IDM_COPY;
2227 if (*li->targetpath && IsFile(li->targetpath) == 1) {
2228 action = UM_MASSACTION;
2229 li->type = IDM_ARCHIVE;
2230 }
2231 break;
2232 case DND_WILDCOPY:
2233 li->type = IDM_WILDCOPY;
2234 if (*li->targetpath && IsFile(li->targetpath) == 1) {
2235 action = UM_MASSACTION;
2236 li->type = IDM_ARCHIVE;
2237 }
2238 break;
2239 default:
2240 if (*li->arcname && li->info) {
2241 action = UM_MASSACTION;
2242 li->type = (li->type == DO_MOVE) ? IDM_FAKEEXTRACTM :
2243 IDM_FAKEEXTRACT;
2244 }
2245 else if (*li->targetpath && IsFile(li->targetpath) == 1) {
2246 action = UM_MASSACTION;
2247 li->type = (li->type == DO_MOVE) ? IDM_ARCHIVEM : IDM_ARCHIVE;
2248 }
2249 else
2250 li->type = (li->type == DO_MOVE) ? IDM_MOVE : IDM_COPY;
2251 break;
2252 }
2253 if (!li->list || !li->list[0])
2254 FreeListInfo(li);
2255 else
2256 WinSendMsg(hwndTree, UM_ACTION, MPFROMP(li), MPFROMLONG(action));
2257 }
2258 return 0;
2259 }
2260 break;
2261
2262 case WM_DESTROY:
2263 if (hwndMenu)
2264 WinDestroyWindow(hwndMenu);
2265 hwndMenu = (HWND) 0;
2266 break;
2267 }
2268 return PFNWPButton(hwnd, msg, mp1, mp2);
2269}
2270
2271VOID BuildDriveBarButtons(HWND hwndT)
2272{
2273 register ULONG x;
2274 ULONG ulDriveNum, ulDriveMap;
2275 HENUM henum;
2276 HWND hwndB;
2277
2278 henum = WinBeginEnumWindows(hwndT);
2279
2280 while ((hwndB = WinGetNextWindow(henum)) != NULLHANDLE)
2281 WinDestroyWindow(hwndB);
2282
2283 WinEndEnumWindows(henum);
2284 if (fDrivebar) {
2285 DosError(FERR_DISABLEHARDERR);
2286 DosQCurDisk(&ulDriveNum, &ulDriveMap);
2287 for (x = 0; x < 26; x++) {
2288 if ((ulDriveMap & (1L << x)) && !(driveflags[x] & DRIVE_IGNORE)) {
2289 hwndB = WinCreateWindow(hwndT,
2290 WC_DRIVEBUTTONS,
2291 0,
2292 BS_NOPOINTERFOCUS | BS_USERBUTTON,
2293 0,
2294 0,
2295 DRIVE_BUTTON_WIDTH,
2296 DRIVE_BUTTON_HEIGHT,
2297 hwndT, HWND_TOP, x + IDM_DRIVEA, NULL, NULL);
2298 if (!hwndB)
2299 Win_Error(hwndT, HWND_DESKTOP, pszSrcFile, __LINE__,
2300 PCSZ_WINCREATEWINDOW);
2301 else {
2302 WinSetWindowPos(hwndB, HWND_BOTTOM, 0, 0, 0, 0, SWP_ZORDER);
2303 }
2304 }
2305 } // for
2306 } // if drivebar
2307 PostMsg(WinQueryWindow(hwndT, QW_PARENT),
2308 WM_UPDATEFRAME, MPFROMLONG(FCF_SIZEBORDER), MPVOID);
2309}
2310
2311VOID ResizeDrives(HWND hwndT, long xwidth)
2312{
2313 register ULONG ctrlxpos = 1, ctrlypos = 0, ctrlxsize;
2314 HENUM henum;
2315 HWND hwndB;
2316 RECTL rcl;
2317
2318 DriveLines = 0;
2319 if (!fDrivebar)
2320 return;
2321 if (!xwidth) {
2322 WinQueryWindowRect(hwndT, &rcl);
2323 xwidth = rcl.xRight - ((WinQuerySysValue(HWND_DESKTOP,
2324 SV_CYSIZEBORDER) * 2) + 1);
2325 }
2326 henum = WinBeginEnumWindows(hwndT);
2327 while ((hwndB = WinGetNextWindow(henum)) != NULLHANDLE) {
2328 ctrlxsize = DRIVE_BUTTON_WIDTH;
2329 WinSetWindowPos(hwndB,
2330 HWND_TOP,
2331 ctrlxpos, ctrlypos, ctrlxsize, DRIVE_BUTTON_HEIGHT, SWP_MOVE | SWP_SHOW);
2332 ctrlxpos += (ctrlxsize + 2);
2333 if (ctrlxpos + (DRIVE_BUTTON_WIDTH + 2 + ((fShowTarget && DriveLines == 0) ?
2334 256 : 0)) > xwidth) {
2335 ctrlxpos = 1;
2336 ctrlypos += DRIVE_BUTTON_HEIGHT;
2337 DriveLines++;
2338 }
2339 }
2340 if (ctrlxpos == 2 && DriveLines)
2341 DriveLines--;
2342}
2343
2344MRESULT EXPENTRY StatusProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
2345{
2346 static HWND hwndE = (HWND) 0, hwndB = (HWND) 0;
2347 static CHAR lastcmd[1024] = "";
2348
2349 switch (msg) {
2350 case WM_CREATE:
2351 {
2352 MRESULT mr = PFNWPStatic(hwnd, msg, mp1, mp2);
2353 //fixme to allow user to change presparams 1-10-09 GKY
2354 SetPresParams(hwnd,
2355 &RGBGREY,
2356 &RGBBLACK, &RGBGREY, FNT_8HELVETICABOLD);
2357 return mr;
2358 }
2359
2360 case WM_PRESPARAMCHANGED:
2361 if (fRunning) {
2362
2363 ULONG AttrFound, AttrValue[64], cbRetLen;
2364
2365 cbRetLen = WinQueryPresParam(hwnd,
2366 (ULONG) mp1,
2367 0,
2368 &AttrFound,
2369 (ULONG) sizeof(AttrValue), &AttrValue, 0);
2370 if (cbRetLen) {
2371 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
2372 WM_UPDATEFRAME, MPFROMLONG(FCF_SIZEBORDER), MPVOID);
2373 }
2374 }
2375 break;
2376
2377 case WM_CONTEXTMENU:
2378 PostMsg(hwndMain, UM_CONTEXTMENU, MPVOID, MPVOID);
2379 return MRFROMSHORT(TRUE);
2380
2381 case WM_BEGINDRAG:
2382 if (hwndTree) {
2383
2384 SWP swp;
2385 ULONG fl = SWP_ACTIVATE | SWP_SHOW | SWP_ZORDER;
2386
2387 WinQueryWindowPos(hwndTree, &swp);
2388 if (!(swp.fl & SWP_MAXIMIZE))
2389 fl |= SWP_RESTORE;
2390 WinSetWindowPos(hwndTree, HWND_TOP, 0, 0, 0, 0, fl);
2391 }
2392 break;
2393
2394 case UM_SETUP:
2395 if (mp1)
2396 strcpy(lastcmd, (CHAR *)mp1);
2397 return 0;
2398
2399 case UM_RESCAN:
2400 if (hwndE && WinIsWindow(WinQueryAnchorBlock(hwnd), hwndE))
2401 WinDestroyWindow(hwndE);
2402 if (hwndB && WinIsWindow(WinQueryAnchorBlock(hwnd), hwndB))
2403 WinDestroyWindow(hwndB);
2404 hwndE = hwndB = (HWND) 0;
2405 return 0;
2406
2407 case WM_COMMAND:
2408 switch (SHORT1FROMMP(mp1)) {
2409 case COMMAND_BUTTON:
2410 PostMsg(hwndE, msg, mp1, mp2);
2411 break;
2412 }
2413 return 0;
2414
2415 case WM_MOUSEMOVE:
2416 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
2417 {
2418 USHORT id = WinQueryWindowUShort(hwnd, QWS_ID);
2419 PCSZ s = NULL;
2420
2421 if (fOtherHelp) {
2422 if ((!hwndBubble || WinQueryWindowULong(hwndBubble, QWL_USER) != hwnd)
2423 && !WinQueryCapture(HWND_DESKTOP)) {
2424 switch (id) {
2425 case IDM_ATTRS:
2426 if (WinQueryWindowTextLength(hwnd))
2427 s = GetPString(IDS_ATTRSBUTTONHELP);
2428 break;
2429 case IDM_INFO:
2430 if (WinQueryWindowTextLength(hwnd))
2431 s = GetPString(IDS_INFOBUTTONHELP);
2432 break;
2433 case IDM_RENAME:
2434 if (WinQueryWindowTextLength(hwnd))
2435 s = GetPString(IDS_NAMEBUTTONHELP);
2436 break;
2437 case MAIN_STATUS2:
2438 if (!hwndE)
2439 s = GetPString(IDS_STATUS2HELP);
2440 break;
2441 default:
2442 break;
2443 }
2444 if (s)
2445 MakeBubble(hwnd, FALSE, s);
2446 else if (hwndBubble)
2447 WinDestroyWindow(hwndBubble);
2448 }
2449 }
2450 switch (id) {
2451 case IDM_ATTRS:
2452 case IDM_INFO:
2453 case IDM_RENAME:
2454 case MAIN_STATUS2:
2455 return CommonTextProc(hwnd, msg, mp1, mp2);
2456 default:
2457 break;
2458 }
2459 }
2460 break;
2461
2462 case WM_BUTTON2DOWN:
2463 case WM_BUTTON2UP:
2464 case UM_FOCUSME:
2465 return CommonTextButton(hwnd, msg, mp1, mp2);
2466
2467 case WM_BUTTON1DOWN:
2468 case WM_BUTTON1UP:
2469 case WM_BUTTON3DOWN:
2470 case WM_BUTTON3UP:
2471 {
2472 USHORT id;
2473
2474 id = WinQueryWindowUShort(hwnd, QWS_ID);
2475 switch (id) {
2476 case IDM_ATTRS:
2477 case IDM_INFO:
2478 case IDM_RENAME:
2479 case MAIN_STATUS2:
2480 return CommonTextButton(hwnd, msg, mp1, mp2);
2481 default:
2482 PostMsg(hwnd, UM_FOCUSME, MPVOID, MPVOID);
2483 break;
2484 }
2485 }
2486 break;
2487
2488 case WM_SETFOCUS:
2489 if (mp2) {
2490
2491 USHORT id;
2492
2493 id = WinQueryWindowUShort(hwnd, QWS_ID);
2494 if (id == MAIN_STATUS2 && hwndE)
2495 WinSendMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
2496 else
2497 return CommonTextButton(hwnd, msg, mp1, mp2);
2498 }
2499 break;
2500
2501 case WM_BUTTON1CLICK:
2502 {
2503 USHORT id;
2504
2505 id = WinQueryWindowUShort(hwnd, QWS_ID);
2506 if (id == MAIN_STATUS) {
2507 if (SHORT2FROMMP(mp2) & KC_CTRL)
2508 PostMsg(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
2509 FID_CLIENT),
2510 WM_COMMAND, MPFROM2SHORT(IDM_WINDOWDLG, 0), MPVOID);
2511 else if (hwndTree)
2512 PostMsg(hwndTree, UM_TIMER, MPVOID, MPVOID);
2513 }
2514 }
2515 break;
2516
2517 case UM_CLICKED:
2518 case UM_CLICKED3:
2519 {
2520 USHORT id;
2521
2522 id = WinQueryWindowUShort(hwnd, QWS_ID);
2523 if (id == MAIN_STATUS2 && !hwndE) {
2524
2525 SWP swp;
2526 CHAR directory[CCHMAXPATH];
2527 PFNWP oldproce;
2528
2529 *directory = 0;
2530 TopWindowName(hwndMain, (HWND) 0, directory);
2531 WinQueryWindowPos(hwnd, &swp);
2532 hwndB = WinCreateWindow(hwnd,
2533 WC_BUTTON,
2534 "+",
2535 WS_VISIBLE | BS_PUSHBUTTON |
2536 BS_NOPOINTERFOCUS,
2537 swp.cx - swp.cy,
2538 0,
2539 swp.cy,
2540 swp.cy,
2541 hwnd, HWND_TOP, COMMAND_BUTTON, NULL, NULL);
2542 if (!hwndB)
2543 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__,
2544 PCSZ_WINCREATEWINDOW);
2545 hwndE = WinCreateWindow(hwnd,
2546 WC_ENTRYFIELD,
2547 NULL,
2548 WS_VISIBLE | ES_AUTOSCROLL,
2549 0,
2550 0,
2551 swp.cx - swp.cy,
2552 swp.cy,
2553 hwnd, HWND_TOP, COMMAND_LINE, NULL, NULL);
2554 if (!hwndE)
2555 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__,
2556 PCSZ_WINCREATEWINDOW);
2557 if (!hwndE || !hwndB) {
2558 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
2559 return 0;
2560 }
2561 WinSendMsg(hwndE, EM_SETTEXTLIMIT, MPFROM2SHORT(1024, 0), MPVOID);
2562 WinSetWindowText(hwndStatus, directory);
2563 if (*lastcmd)
2564 WinSetWindowText(hwndE, lastcmd);
2565 else
2566 WinSetWindowText(hwndE, GetPString(IDS_HELPCMDTEXT));
2567 oldproce = WinSubclassWindow(hwndE, (PFNWP) CommandLineProc);
2568 if (oldproce)
2569 WinSetWindowPtr(hwndE, QWL_USER, (PVOID) oldproce);
2570 PostMsg(hwndE, UM_FOCUSME, MPVOID, MPVOID);
2571 PostMsg(hwndE, EM_SETSEL, MPFROM2SHORT(0, 1024), MPVOID);
2572 return 0;
2573 }
2574 if (msg == UM_CLICKED3 || (SHORT2FROMMP(mp2) & KC_CTRL)) {
2575 switch (id) {
2576 case IDM_ATTRS:
2577 id = IDM_SORTSIZE;
2578 break;
2579 case IDM_INFO:
2580 id = IDM_SORTLWDATE;
2581 break;
2582 case IDM_RENAME:
2583 id = IDM_SORTFILENAME;
2584 break;
2585 }
2586 }
2587 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
2588 WM_COMMAND, MPFROM2SHORT(id, 0), MPVOID);
2589 }
2590 return 0;
2591
2592 case WM_PAINT:
2593 {
2594 USHORT id;
2595
2596 id = WinQueryWindowUShort(hwnd, QWS_ID);
2597 switch (id) {
2598 case IDM_ATTRS:
2599 case IDM_INFO:
2600 case IDM_RENAME:
2601 case MAIN_STATUS2:
2602 PaintRecessedWindow(hwnd, (HPS) 0, TRUE, FALSE);
2603 break;
2604 default:
2605 PaintRecessedWindow(hwnd, (HPS) 0, FALSE, TRUE);
2606 break;
2607 }
2608 if (id == IDM_RENAME) {
2609
2610 HPS hps;
2611
2612 hps = WinBeginPaint(hwnd, (HPS) 0, NULL);
2613 if (hps) {
2614 PaintSTextWindow(hwnd, hps);
2615 WinEndPaint(hps);
2616 }
2617 return 0;
2618 }
2619 }
2620 break;
2621
2622 }
2623 return PFNWPStatic(hwnd, msg, mp1, mp2);
2624}
2625
2626MRESULT EXPENTRY ToolBackProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
2627{
2628 switch (msg) {
2629 case WM_CREATE:
2630 hwndToolback = hwnd;
2631 break;
2632
2633 case WM_MOUSEMOVE:
2634 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
2635 break;
2636
2637 case WM_CONTROLPOINTER:
2638 if (!fNoFinger && SHORT1FROMMP(mp1) < 25000)
2639 return MRFROMLONG(hptrFinger);
2640 break;
2641
2642 case WM_CHAR:
2643 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
2644 break;
2645
2646 case WM_COMMAND:
2647 case UM_COMMAND:
2648 return WinSendMsg(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
2649 FID_CLIENT), msg, mp1, mp2);
2650
2651 case WM_PAINT:
2652 {
2653 HPS hps;
2654 RECTL rcl;
2655 ULONG lColor = 0L;
2656
2657 hps = WinBeginPaint(hwnd, (HPS)0, NULL);
2658 if (hps) {
2659 GpiCreateLogColorTable(hps, 0, LCOLF_RGB, 0, 0, NULL);
2660 if (!WinQueryPresParam(hwnd, PP_BACKGROUNDCOLOR, 0, NULL,
2661 sizeof(lColor), &lColor, 0))
2662 lColor = 0x00CCCCCCL; //Palegray
2663 WinQueryWindowRect(hwnd, &rcl);
2664 WinFillRect(hps, &rcl, lColor);
2665 WinEndPaint(hps);
2666 }
2667
2668 }
2669 break;
2670
2671 case WM_PRESPARAMCHANGED:
2672 PresParamChanged(hwnd, PCSZ_TOOLBAR, mp1, mp2);
2673 WinInvalidateRect(hwnd, NULL, TRUE);
2674 break;
2675
2676 case UM_SETUP:
2677 {
2678 USHORT id;
2679 TOOL *tool;
2680
2681 RestorePresParams(hwnd, PCSZ_TOOLBAR);
2682 id = SHORT1FROMMP(mp1);
2683 tool = find_tool(id);
2684 if (tool) {
2685 del_tool(tool);
2686 WinShowWindow(WinWindowFromID(hwnd, id), FALSE);
2687 if (fToolTitles)
2688 WinShowWindow(WinWindowFromID(hwnd, id + 25000), FALSE);
2689 ResizeTools(hwnd);
2690 save_tools(NULL);
2691 }
2692 }
2693 return 0;
2694
2695 case UM_SETUP2: /* Used to load a new a toolbar */
2696 BuildTools(hwnd, TRUE);
2697 return 0;
2698
2699 case WM_CHORD:
2700 {
2701 USHORT id;
2702
2703 id = (USHORT) WinDlgBox(HWND_DESKTOP,
2704 hwnd,
2705 AddToolProc,
2706 FM3ModHandle, ADDBTN_FRAME, MPVOID);
2707 if (id && id != (USHORT) - 1)
2708 WinSendMsg(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
2709 FID_CLIENT),
2710 WM_COMMAND,
2711 MPFROM2SHORT(IDM_CREATETOOL, 0), MPFROM2SHORT(id, 0));
2712 }
2713 break;
2714
2715 case WM_CONTEXTMENU:
2716 if (WinDlgBox(HWND_DESKTOP,
2717 hwnd, ToolIODlgProc, FM3ModHandle, SVBTN_FRAME, MPVOID))
2718 PostMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
2719 return MRFROMSHORT(TRUE);
2720
2721 case WM_CLOSE:
2722 WinDestroyWindow(hwnd);
2723 return 0;
2724
2725 case WM_DESTROY:
2726 break;
2727 }
2728 return WinDefWindowProc(hwnd, msg, mp1, mp2);
2729}
2730
2731static VOID AdjustSizeOfClient(PSWP pswp, PRECTL prectl)
2732{
2733 SWP swp;
2734 RECTL rectl;
2735
2736 if (fFreeTree)
2737 return;
2738 if (pswp) {
2739 if (WinQueryWindowPos(hwndTree, &swp) &&
2740 !(swp.fl & (SWP_MINIMIZE | SWP_HIDE | SWP_MAXIMIZE))) {
2741 pswp->x = swp.cx;
2742 pswp->cx -= swp.cx;
2743 }
2744 }
2745 if (prectl) {
2746 if (WinQueryWindowPos(hwndTree, &swp) &&
2747 !(swp.fl & (SWP_MINIMIZE | SWP_HIDE | SWP_MAXIMIZE)) &&
2748 WinQueryWindowRect(hwndTree, &rectl)) {
2749 prectl->xLeft = rectl.xRight;
2750 prectl->xRight -= rectl.xRight;
2751 }
2752 }
2753}
2754
2755VOID FillClient(HWND hwndClient, PSWP pswp, PRECTL prectl, BOOL avoidtree)
2756{
2757 ULONG adjust;
2758
2759 adjust = WinQuerySysValue(HWND_DESKTOP, SV_CYICON);
2760 if (pswp)
2761 WinQueryWindowPos(hwndClient, pswp);
2762 if (prectl)
2763 WinQueryWindowRect(hwndClient, prectl);
2764 if (avoidtree && !fFreeTree)
2765 AdjustSizeOfClient(pswp, prectl);
2766 if (prectl)
2767 prectl->yBottom += adjust;
2768 if (pswp) {
2769 if (!avoidtree || fFreeTree)
2770 pswp->x = 0;
2771 pswp->y = adjust;
2772 if (pswp->cy >= adjust)
2773 pswp->cy -= adjust;
2774 else
2775 pswp->cy = 0;
2776 }
2777}
2778
2779static VOID MoveChildrenAwayFromTree(HWND hwndClient)
2780{
2781 SWP swpC, swpT, swp;
2782 USHORT id;
2783 HWND hwndChild;
2784 HENUM henum;
2785
2786 if (fFreeTree)
2787 return;
2788 WinQueryWindowPos(hwndClient, &swpC);
2789 if (swpC.fl & (SWP_MINIMIZE | SWP_HIDE))
2790 return;
2791 WinQueryWindowPos(hwndTree, &swpT);
2792 henum = WinBeginEnumWindows(hwndClient);
2793 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
2794 id = WinQueryWindowUShort(hwndChild, QWS_ID);
2795 if (!id || id == TREE_FRAME)
2796 continue;
2797 WinQueryWindowPos(hwndChild, &swp);
2798 if (!(swp.fl & (SWP_MAXIMIZE | SWP_HIDE | SWP_MINIMIZE))) {
2799 if (swp.x < swpT.cx) {
2800 swp.x = swpT.cx;
2801 if (swp.x + swp.cx > swpC.cx)
2802 swp.cx = swpC.cx - swp.x;
2803 if (swp.cx > 24)
2804 WinSetWindowPos(hwndChild, HWND_TOP, swp.x, swp.y, swp.cx, swp.cy,
2805 SWP_SIZE | SWP_MOVE | SWP_SHOW);
2806 }
2807 }
2808 }
2809 WinEndEnumWindows(henum);
2810}
2811
2812static VOID ArrangeIcons(HWND hwndClient)
2813{
2814 HENUM henum;
2815 HWND hwndChild;
2816 SWP swp;
2817
2818 henum = WinBeginEnumWindows(hwndClient);
2819 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
2820 WinQueryWindowPos(hwndChild, &swp);
2821 if (swp.fl & (SWP_MINIMIZE | SWP_HIDE)) {
2822 WinSetWindowUShort(hwndChild, QWS_XMINIMIZE, (USHORT) - 1);
2823 WinSetWindowUShort(hwndChild, QWS_YMINIMIZE, (USHORT) - 1);
2824 WinSetWindowPos(hwndChild, HWND_TOP, 0, 0, 0, 0,
2825 SWP_MOVE | SWP_SHOW | SWP_FOCUSDEACTIVATE);
2826 }
2827 }
2828 WinEndEnumWindows(henum);
2829}
2830
2831static VOID NextChild(HWND hwndClient, BOOL previous)
2832{
2833 HENUM henum;
2834 HWND hwndActive, hwndNext, hwndPrev = (HWND) 0;
2835 BOOL next = FALSE, once = FALSE;
2836
2837 previous = !previous;
2838
2839 hwndActive = WinQueryActiveWindow(hwndClient);
2840 if (!hwndActive)
2841 next = TRUE;
2842 henum = WinBeginEnumWindows(hwndClient);
2843 for (;;) {
2844 hwndNext = WinGetNextWindow(henum);
2845 if (hwndNext) {
2846 if (!WinQueryWindowUShort(hwndNext, QWS_ID))
2847 continue;
2848 if (next)
2849 break;
2850 if (hwndNext == hwndActive) {
2851 if (!previous && hwndPrev) {
2852 hwndNext = hwndPrev;
2853 break;
2854 }
2855 else if (previous)
2856 next = TRUE;
2857 }
2858 hwndPrev = hwndNext;
2859 }
2860 else {
2861 if ((!next && previous) || once)
2862 break;
2863 else if (!previous) {
2864 hwndNext = hwndPrev;
2865 break;
2866 }
2867 else
2868 once = next = TRUE;
2869 }
2870 }
2871 WinEndEnumWindows(henum);
2872
2873 if (hwndNext && hwndNext != hwndActive) {
2874 WinSetWindowPos(hwndNext, HWND_TOP, 0, 0, 0, 0,
2875 SWP_ZORDER | SWP_ACTIVATE);
2876 WinSetWindowPos(hwndActive, ((previous) ? HWND_BOTTOM : hwndNext), 0, 0,
2877 0, 0, SWP_ZORDER);
2878 }
2879}
2880
2881BOOL CloseChildren(HWND hwndClient)
2882{
2883 HENUM henum;
2884 HWND hwndChild;
2885 BOOL ret = FALSE;
2886
2887 fNoTileUpdate = TRUE;
2888 henum = WinBeginEnumWindows(hwndClient);
2889 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
2890 if (hwndChild != hwndTree) {
2891 WinSendMsg(WinWindowFromID(hwndChild, FID_CLIENT),
2892 WM_SAVEAPPLICATION, MPVOID, MPVOID);
2893 if (WinSendMsg(WinWindowFromID(hwndChild, FID_CLIENT),
2894 WM_CLOSE, MPVOID, MPVOID)) {
2895 ret = TRUE;
2896 break;
2897 }
2898 }
2899 }
2900 WinEndEnumWindows(henum);
2901 fNoTileUpdate = FALSE;
2902 return ret;
2903}
2904
2905BOOL CloseDirCnrChildren(HWND hwndClient)
2906{
2907 /* returns TRUE if a directory container window was told to close */
2908
2909 HENUM henum;
2910 HWND hwndChild, hwndDir, hwndTemp;
2911 BOOL ret = FALSE;
2912
2913 fNoTileUpdate = TRUE;
2914 henum = WinBeginEnumWindows(hwndClient);
2915 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
2916 if (hwndChild != hwndTree) {
2917 hwndTemp = WinWindowFromID(hwndChild, FID_CLIENT);
2918 if (hwndTemp) {
2919 hwndDir = WinWindowFromID(hwndTemp, DIR_CNR);
2920 if (hwndDir) {
2921 WinSendMsg(WinWindowFromID(hwndChild, FID_CLIENT),
2922 WM_CLOSE, MPVOID, MPVOID);
2923 ret = TRUE;
2924 }
2925 }
2926 }
2927 }
2928 WinEndEnumWindows(henum);
2929 fNoTileUpdate = FALSE;
2930 return ret;
2931}
2932
2933/** Save directory container state
2934 * @param hwndClient Client window handle
2935 * @param pszStateName State name to save, NULL to save global state
2936 * @returns Number of directory container windows that were saved or -1 if error
2937 * @seealso RestoreDirCnrState
2938 */
2939
2940INT SaveDirCnrState(HWND hwndClient, PCSZ pszStateName)
2941{
2942 HENUM henum;
2943 HWND hwndChild, hwndDir, hwndC;
2944 ULONG numsaves = 0, flWindowAttr;
2945 ULONG previous_numsaves, ulTemp = sizeof(ULONG);
2946 CHAR szPrefix[STATE_NAME_MAX_BYTES + 1];
2947 CHAR szKey[STATE_NAME_MAX_BYTES + 80], szKeyBase[STATE_NAME_MAX_BYTES + 80], *eos;
2948 CHAR szDir[CCHMAXPATH];
2949 SWP swp;
2950 DIRCNRDATA *dcd;
2951 BOOL fIsShutDownState;
2952
2953 if (!pszStateName || !*pszStateName) {
2954 Runtime_Error(pszSrcFile, __LINE__, NULL);
2955 return -1;
2956 }
2957 if (strlen(pszStateName) > sizeof(szPrefix) - 2) {
2958 Runtime_Error(pszSrcFile, __LINE__, "SaveDirCnrState");
2959 return -1;
2960 }
2961
2962 fIsShutDownState = strcmp(pszStateName, PCSZ_SHUTDOWNSTATE) == 0;
2963 sprintf(szPrefix, "%s.", pszStateName);
2964
2965 if (*lasttoolbar) {
2966 sprintf(szKey, "%sToolbar", szPrefix);
2967 PrfWriteProfileString(fmprof, FM3Str, szKey, lasttoolbar);
2968 }
2969
2970 if (!fIsShutDownState) {
2971 sprintf(szKey, "%sTargetDir", szPrefix);
2972 PrfWriteProfileString(fmprof, FM3Str, szKey, targetdir);
2973 sprintf(szKey, "%sVersion", szPrefix);
2974 PrfWriteProfileString(fmprof, FM3Str, szKey, "3.16");
2975 }
2976
2977 henum = WinBeginEnumWindows(hwndClient);
2978 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
2979 if (hwndChild != hwndTree) {
2980 hwndC = WinWindowFromID(hwndChild, FID_CLIENT);
2981 if (hwndC) {
2982 hwndDir = WinWindowFromID(hwndC, DIR_CNR);
2983 if (hwndDir) {
2984 WinQueryWindowPos(hwndChild, &swp);
2985 *szDir = 0;
2986 WinSendMsg(hwndC, UM_CONTAINERDIR, MPFROMP(szDir), MPVOID);
2987 if (*szDir) {
2988 // If saving shutdown state skip no prescan drives
2989 if (fIsShutDownState &&
2990 driveflags[toupper(*szDir) - 'A'] & DRIVE_NOPRESCAN) {
2991 continue;
2992 }
2993 sprintf(szKeyBase, "%sDirCnr.%lu", szPrefix, numsaves);
2994 strcpy(szKey, szKeyBase);
2995 strcat(szKey, ".");
2996 eos = &szKey[strlen(szKey)];
2997 strcpy(eos, "Pos");
2998 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & swp,
2999 sizeof(SWP));
3000 dcd = WinQueryWindowPtr(WinWindowFromID(hwndC, DIR_CNR), QWL_USER);
3001 if (dcd) {
3002 strcpy(eos, "Sort");
3003 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & dcd->sortFlags,
3004 sizeof(INT));
3005 strcpy(eos, "Filter");
3006 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & dcd->mask,
3007 sizeof(MASK));
3008 strcpy(eos, "View");
3009 flWindowAttr = dcd->flWindowAttr;
3010 if (!fLeaveTree && (flWindowAttr & CV_TREE)) {
3011 flWindowAttr &= (~(CV_TREE | CV_ICON | CV_DETAIL | CV_TEXT));
3012 if (dcd->lastattr) {
3013 if (dcd->lastattr & CV_TEXT)
3014 flWindowAttr |= CV_TEXT;
3015 else if (dcd->lastattr & CV_DETAIL)
3016 flWindowAttr |= CV_DETAIL;
3017 else if (dcd->lastattr & CV_ICON)
3018 flWindowAttr |= CV_ICON;
3019 else
3020 flWindowAttr |= CV_NAME;
3021 }
3022 else
3023 flWindowAttr |= CV_NAME;
3024 }
3025 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) &flWindowAttr,
3026 sizeof(ULONG));
3027 WriteDetailsSwitches(szKeyBase, &dcd->ds, TRUE);
3028 SavePresParams(hwndDir, szKeyBase);
3029 }
3030 strcpy(eos, "Dir");
3031 PrfWriteProfileString(fmprof, FM3Str, szKey, szDir);
3032 numsaves++;
3033 }
3034 }
3035 }
3036 }
3037 } // while
3038 WinEndEnumWindows(henum);
3039
3040 sprintf(szKey, "%sNumDirsLastTime", szPrefix);
3041 if (PrfQueryProfileData(fmprof, FM3Str, szKey, (PVOID) &previous_numsaves, &ulTemp)) {
3042 ULONG size = 0;
3043
3044 sprintf(szKey, "%sVersion", szPrefix);
3045 PrfQueryProfileSize(fmprof, FM3Str, szKey, &size);
3046 if (!size && fSaveState) {
3047 for (ulTemp = 0; ulTemp < previous_numsaves; ulTemp++)
3048 RemoveOldCnrSwitches(szPrefix, ulTemp);
3049 sprintf(szKey, "%sVersion", szPrefix);
3050 PrfWriteProfileString(fmprof, FM3Str, szKey, "3.16");
3051 }
3052 for (ulTemp = numsaves; ulTemp < previous_numsaves; ulTemp++) {
3053 sprintf(szKeyBase, "%sDirCnr.%lu", szPrefix, ulTemp);
3054 RemoveCnrSwitches(szKeyBase, NULL);
3055 }
3056 }
3057 sprintf(szKey, "%sNumDirsLastTime", szPrefix);
3058 if (numsaves) {
3059 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) &numsaves, sizeof(ULONG));
3060 WinQueryWindowPos(WinQueryWindow(hwndClient, QW_PARENT), &swp);
3061 sprintf(szKey, "%sMySizeLastTime", szPrefix);
3062 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) &swp, sizeof(SWP));
3063 if (WinQueryWindowPos(hwndTree, &swp)) {
3064 sprintf(szKey, "%sLastTreePos", szPrefix);
3065 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) &swp, sizeof(SWP));
3066 }
3067 }
3068 else if (fIsShutDownState) {
3069 PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) &numsaves, sizeof(ULONG));
3070 }
3071 return numsaves;
3072}
3073
3074static VOID TransformSwp(PSWP pswp, double xtrans, double ytrans)
3075{
3076 SWP swp;
3077 HWND hwnd;
3078
3079 if ((LONG) pswp->x < 0L) {
3080 pswp->cx -= abs(pswp->x);
3081 pswp->x = 0;
3082 }
3083 if ((LONG) pswp->y < 0L) {
3084 pswp->cy -= abs(pswp->y);
3085 pswp->y = 0;
3086 }
3087 pswp->x = (LONG) (((double)pswp->x * 100.0) / xtrans);
3088 pswp->cx = (LONG) (((double)pswp->cx * 100.0) / xtrans);
3089 pswp->y = (LONG) (((double)pswp->y * 100.0) / ytrans);
3090 pswp->cy = (LONG) (((double)pswp->cy * 100.0) / ytrans);
3091 if (pswp->hwnd) {
3092 hwnd = WinQueryWindow(pswp->hwnd, QW_PARENT);
3093 if (hwnd) {
3094 if (WinQueryWindowPos(hwnd, &swp)) {
3095 if (pswp->x > swp.cx)
3096 pswp->x = (swp.cx > 24) ? swp.cx - 24 : swp.cx;
3097 if (pswp->y > swp.cy)
3098 pswp->y = (swp.cy > 24) ? swp.cy - 24 : swp.cy;
3099 if (pswp->x + pswp->cx > swp.cx)
3100 pswp->cx = swp.cx - pswp->x;
3101 if (pswp->y + pswp->cy > swp.cy)
3102 pswp->cy = swp.cy - pswp->y;
3103 }
3104 }
3105 }
3106}
3107
3108/** Restore directory container state
3109 * @param hwndClient Client window handle
3110 * @param pszStateName State name to restore, NULL to restore global state
3111 * @param noview request view state restore bypass
3112 * @returns TRUE if one or more directory containers were opened
3113 * @seealso SaveDirCnrState
3114 */
3115
3116static BOOL RestoreDirCnrState(HWND hwndClient, PSZ pszStateName, BOOL noview)
3117{
3118 CHAR szKey[STATE_NAME_MAX_BYTES + 80], szKeyBase[STATE_NAME_MAX_BYTES + 80];
3119 CHAR szDir[CCHMAXPATH];
3120 CHAR szPrefix[STATE_NAME_MAX_BYTES + 2];
3121 HWND hwndDir, hwndC, hwndPPSave = NULLHANDLE;
3122 SWP swp, swpO, swpN;
3123 ULONG size, numsaves = 0;
3124 LONG x;
3125 double xtrans, ytrans;
3126 BOOL fRestored = FALSE;
3127 DIRCNRDATA localdcd, *dcd;
3128 BOOL fIsShutDownState;
3129 BOOL fDeleteState;
3130
3131 if (!pszStateName || !*pszStateName) {
3132 Runtime_Error(pszSrcFile, __LINE__, "no name");
3133 return fRestored;
3134 }
3135 if (strlen(pszStateName) > sizeof(szPrefix) - 2) {
3136 Runtime_Error(pszSrcFile, __LINE__, "name too long");
3137 return fRestored;
3138 }
3139
3140 sprintf(szPrefix, "%s.", pszStateName);
3141
3142 // If restoring shutdown state bypass no-prescan drives
3143 fIsShutDownState = strcmp(pszStateName, PCSZ_SHUTDOWNSTATE) == 0;
3144 // Delete saved state if internally saved state
3145 fDeleteState = strcmp(pszStateName, PCSZ_FM2TEMPTEXT) == 0;
3146
3147 //size = (ULONG)0;
3148 sprintf(szKey, "%sToolbar", szPrefix);
3149 //if (PrfQueryProfileSize(fmprof, FM3Str, szKey, &size) && size)
3150 {
3151 if (fToolsChanged)
3152 save_tools(NULL);
3153 PrfQueryProfileString(fmprof, FM3Str, szKey, NULL, lasttoolbar, sizeof(lasttoolbar));
3154 PrfWriteProfileString(fmprof, FM3Str, "LastToolbar", lasttoolbar);
3155 load_tools(NULL);
3156 PostMsg(hwndToolback, UM_SETUP2, MPVOID, MPVOID);
3157 }
3158 //size = (ULONG)0;
3159 sprintf(szKey, "%sTargetDir", szPrefix);
3160 //if (PrfQueryProfileSize(fmprof, FM3Str, szKey, &size) && size)
3161 {
3162 PrfQueryProfileString(fmprof, FM3Str, szKey, NULL, targetdir, sizeof(targetdir));
3163 PrfWriteProfileString(fmprof, FM3Str, "TargetDir", targetdir);
3164 SetTargetDir(NULLHANDLE, TRUE);
3165 }
3166 size = sizeof(SWP);
3167 sprintf(szKey, "%sMySizeLastTime", szPrefix);
3168 if (!PrfQueryProfileData(fmprof,
3169 FM3Str,
3170 szKey,
3171 (PVOID) &swpO,
3172 &size) ||
3173 size != sizeof(SWP) || !swp.cx || !swp.cy)
3174 {
3175 WinQueryWindowPos(WinQueryWindow(hwndClient, QW_PARENT), &swpO);
3176 }
3177 // If restoring internally saved state, forget info
3178 if (fDeleteState)
3179 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3180 WinQueryWindowPos(WinQueryWindow(hwndClient, QW_PARENT), &swpN);
3181 if (swpN.fl & (SWP_MINIMIZE | SWP_HIDE))
3182 swpN = swpO;
3183 xtrans = ((double)swpO.cx * 100.0) / (double)swpN.cx;
3184 ytrans = ((double)swpO.cy * 100.0) / (double)swpN.cy;
3185 size = sizeof(SWP);
3186 sprintf(szKey, "%sLastTreePos", szPrefix);
3187 if (PrfQueryProfileData(fmprof, FM3Str, szKey, (PVOID) &swp, &size)) {
3188 if (fDeleteState)
3189 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3190 swp.hwnd = hwndTree;
3191 TransformSwp(&swp, xtrans, ytrans);
3192 if (!fFreeTree) {
3193 WinQueryWindowPos(hwndClient, &swpN);
3194 swp.x = 0;
3195 swp.y = (swpN.cy - swp.cy);
3196 }
3197 if (!(swp.fl & (SWP_MINIMIZE | SWP_HIDE))) {
3198 swp.fl &= (~SWP_ACTIVATE);
3199 WinSetWindowPos(hwndTree,
3200 HWND_TOP,
3201 swp.x,
3202 swp.y,
3203 swp.cx,
3204 swp.cy,
3205 swp.fl | SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_ZORDER);
3206 }
3207 else {
3208 WinSetWindowPos(hwndTree,
3209 HWND_TOP, 0, 0, 0, 0, SWP_MINIMIZE | SWP_SHOW);
3210 WinSetWindowUShort(hwndTree, QWS_XRESTORE, (USHORT) swp.x);
3211 WinSetWindowUShort(hwndTree, QWS_CXRESTORE, (USHORT) swp.cx);
3212 WinSetWindowUShort(hwndTree, QWS_YRESTORE, (USHORT) swp.y);
3213 WinSetWindowUShort(hwndTree, QWS_CYRESTORE, (USHORT) swp.cy);
3214 }
3215 }
3216 sprintf(szKey, "%sNumDirsLastTime", szPrefix);
3217 size = sizeof(ULONG);
3218 if (PrfQueryProfileData(fmprof,
3219 FM3Str, szKey, (PVOID) &numsaves, &size)) {
3220 if (fDeleteState)
3221 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
3222 for (x = numsaves - 1; x >= 0; x--) {
3223 CHAR *eos = szKey;
3224
3225 sprintf(szKeyBase, "%sDirCnr.%lu", szPrefix, x);
3226 strcpy(szKey, szKeyBase);
3227 strcat(szKey, ".");
3228 eos = &szKey[strlen(szKey)];
3229 strcpy(eos, "Pos");
3230 size = sizeof(SWP);
3231 if (PrfQueryProfileData(fmprof, FM3Str, szKey, (PVOID) &swp, &size)) {
3232 strcpy(eos, "Dir"); ;
3233 size = sizeof(szDir);
3234 if (PrfQueryProfileData(fmprof, FM3Str, szKey, (PVOID) szDir, &size)) {
3235 // If restoring shutdown state and drive marked no prescan
3236 // bypass window restore
3237 if (fIsShutDownState &&
3238 driveflags[toupper(*szDir) - 'A'] & DRIVE_NOPRESCAN) {
3239 RemoveCnrSwitches(szKeyBase, NULL);
3240 RemoveOldCnrSwitches(szPrefix, x);
3241 continue;
3242 }
3243 LoadDetailsSwitches(szKeyBase, &localdcd.ds, TRUE);
3244 hwndDir = (HWND) WinSendMsg(hwndClient,
3245 UM_SETDIR,
3246 MPFROMP(szDir), MPFROMLONG(1));
3247 if (hwndDir) {
3248 hwndC = WinWindowFromID(hwndDir, FID_CLIENT);
3249 if (hwndC) {
3250 HWND hwndCnr = WinWindowFromID(hwndC, DIR_CNR);
3251 if (!hwndPPSave) {
3252 hwndPPSave = WinCreateWindow(hwndCnr, // Create a window (used to save default presparams)
3253 WC_CONTAINER,
3254 NULL,
3255 CCS_AUTOPOSITION | CCS_MINIICONS |
3256 CCS_MINIRECORDCORE | ulCnrType,
3257 0,
3258 0,
3259 0,
3260 0,
3261 hwndCnr,
3262 HWND_TOP, (ULONG) -1, NULL, NULL);
3263 CopyPresParams(hwndPPSave, hwndC);
3264 RestorePresParams(hwndPPSave, PCSZ_DIRCNR);
3265 }
3266 RestorePresParams(hwndCnr, szKeyBase);
3267 dcd = WinQueryWindowPtr(hwndCnr, QWL_USER);
3268 if (dcd) {
3269 dcd->ds.detailslongname = localdcd.ds.detailslongname;
3270 dcd->ds.detailssubject = localdcd.ds.detailssubject ;
3271 dcd->ds.detailsattr = localdcd.ds.detailsattr ;
3272 dcd->ds.detailsea = localdcd.ds.detailsea ;
3273 dcd->ds.detailssize = localdcd.ds.detailssize ;
3274 dcd->ds.detailsicon = localdcd.ds.detailsicon ;
3275 dcd->ds.detailscrdate = localdcd.ds.detailscrdate ;
3276 dcd->ds.detailscrtime = localdcd.ds.detailscrtime ;
3277 dcd->ds.detailsladate = localdcd.ds.detailsladate ;
3278 dcd->ds.detailslatime = localdcd.ds.detailslatime ;
3279 dcd->ds.detailslwdate = localdcd.ds.detailslwdate ;
3280 dcd->ds.detailslwtime = localdcd.ds.detailslwtime ;
3281 strcpy(eos, "Sort");
3282 size = sizeof(INT);
3283 if (PrfQueryProfileData(fmprof,
3284 FM3Str,
3285 szKey,
3286 (PVOID) &dcd->sortFlags,
3287 &size)) {
3288 if (!dcd->sortFlags)
3289 dcd->sortFlags = SORT_PATHNAME;
3290 }
3291 size = sizeof(MASK);
3292 strcpy(eos, "Filter");
3293 if (PrfQueryProfileData(fmprof,
3294 FM3Str,
3295 szKey,
3296 (PVOID) &dcd->mask, &size)) {
3297 if (*dcd->mask.szMask)
3298 WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
3299 UM_FILTER, MPFROMP(dcd->mask.szMask), MPVOID);
3300 }
3301 *(dcd->mask.prompt) = 0;
3302 strcpy(eos, "View");
3303 if (!noview) {
3304 size = sizeof(ULONG);
3305 if (PrfQueryProfileData(fmprof,
3306 FM3Str,
3307 szKey,
3308 (PVOID) &dcd->flWindowAttr,
3309 &size)) {
3310
3311 CNRINFO cnri;
3312
3313 memset(&cnri, 0, sizeof(CNRINFO));
3314 cnri.cb = sizeof(CNRINFO);
3315 if (WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
3316 CM_QUERYCNRINFO,
3317 MPFROMP(&cnri),
3318 MPFROMLONG(sizeof(CNRINFO)))) {
3319 cnri.flWindowAttr = dcd->flWindowAttr;
3320 WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
3321 CM_SETCNRINFO,
3322 MPFROMP(&cnri),
3323 MPFROMLONG(CMA_FLWINDOWATTR));
3324 }
3325 }
3326 }
3327 if (!PostMsg(hwndCnr, UM_SETUP2, NULL, NULL))
3328 WinSendMsg(hwndCnr, UM_SETUP2, NULL, NULL);
3329 }
3330 }
3331 fRestored = TRUE;
3332 swp.hwnd = hwndDir;
3333 TransformSwp(&swp, xtrans, ytrans);
3334 if (swp.fl & (SWP_HIDE | SWP_MINIMIZE)) {
3335 WinSetWindowPos(hwndDir,
3336 HWND_TOP, 0, 0, 0, 0, SWP_MINIMIZE | SWP_SHOW);
3337 WinSetWindowUShort(hwndDir, QWS_XRESTORE, (USHORT) swp.x);
3338 WinSetWindowUShort(hwndDir, QWS_CXRESTORE, (USHORT) swp.cx);
3339 WinSetWindowUShort(hwndDir, QWS_YRESTORE, (USHORT) swp.y);
3340 WinSetWindowUShort(hwndDir, QWS_CYRESTORE, (USHORT) swp.cy);
3341 } else
3342 WinSetWindowPos(hwndDir,
3343 HWND_TOP,
3344 swp.x,
3345 swp.y,
3346 swp.cx,
3347 swp.cy,
3348 swp.fl | SWP_MOVE |
3349 SWP_SIZE | SWP_SHOW | SWP_ZORDER |
3350 SWP_ACTIVATE);
3351 }
3352 if (fDeleteState)
3353 RemoveCnrSwitches(szKeyBase, pszStateName);
3354 }
3355 }
3356 } // for
3357 if (hwndPPSave) {
3358 SavePresParams(hwndPPSave, PCSZ_DIRCNR);
3359 WinDestroyWindow(hwndPPSave);
3360 }
3361 }
3362 return fRestored;
3363}
3364
3365static ULONG CountChildren(HWND hwndClient, ULONG * ulNumMinChildren)
3366{
3367 HENUM henum;
3368 HWND hwndChild;
3369 SWP swp;
3370 register ULONG ulCnt = 0L;
3371 USHORT id;
3372
3373 if (ulNumMinChildren)
3374 *ulNumMinChildren = 0L;
3375 henum = WinBeginEnumWindows(hwndClient);
3376 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
3377 id = WinQueryWindowUShort(hwndChild, QWS_ID);
3378 if (!id || (!fFreeTree && id == TREE_FRAME))
3379 continue;
3380 ulCnt++;
3381 if (ulNumMinChildren) {
3382 if (WinQueryWindowPos(hwndChild, &swp) && (swp.fl & SWP_MINIMIZE))
3383 (*ulNumMinChildren)++;
3384 }
3385 }
3386 WinEndEnumWindows(henum);
3387 return ulCnt;
3388}
3389
3390VOID GetNextWindowPos(HWND hwndClient, PSWP pswp, ULONG * ulCntR,
3391 ULONG * ulNumMinChildrenR)
3392{
3393 register ULONG ulCnt;
3394 ULONG ulNumMinChildren;
3395 RECTL Rectl;
3396 register ULONG ulXDiff, ulYDiff, ulWindowsPerStack;
3397
3398 if (!ulCntR || !ulNumMinChildrenR)
3399 ulCnt = CountChildren(hwndClient, &ulNumMinChildren);
3400 else {
3401 ulCnt = *ulCntR;
3402 ulNumMinChildren = *ulNumMinChildrenR;
3403 if (ulCnt == (ULONG) - 1) {
3404 ulCnt = CountChildren(hwndClient, &ulNumMinChildren);
3405 /* return these values to the caller for later use */
3406 *ulCntR = ulCnt;
3407 *ulNumMinChildrenR = ulNumMinChildren;
3408 }
3409 }
3410 WinQueryWindowRect(hwndClient, &Rectl);
3411 AdjustSizeOfClient(NULL, &Rectl);
3412 if (!fFreeTree) {
3413
3414 SWP swp;
3415
3416 WinQueryWindowPos(hwndTree, &swp);
3417 if (ulNumMinChildren || (swp.fl & (SWP_HIDE | SWP_MINIMIZE)))
3418 Rectl.yBottom += WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2;
3419 }
3420 else if (ulNumMinChildren)
3421 Rectl.yBottom += WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2;
3422
3423 ulXDiff = WinQuerySysValue(HWND_DESKTOP, SV_CXSIZEBORDER) +
3424 WinQuerySysValue(HWND_DESKTOP, SV_CXMINMAXBUTTON) / 2;
3425 ulYDiff = WinQuerySysValue(HWND_DESKTOP, SV_CYSIZEBORDER) +
3426 WinQuerySysValue(HWND_DESKTOP, SV_CYMINMAXBUTTON);
3427 ulWindowsPerStack = (Rectl.yTop - Rectl.yBottom) / (3 * ulYDiff);
3428 pswp->cx = Rectl.xRight - (ulWindowsPerStack * ulXDiff);
3429 pswp->cy = (Rectl.yTop - Rectl.yBottom) - (ulWindowsPerStack * ulYDiff);
3430 ulWindowsPerStack++;
3431 pswp->x = Rectl.xLeft + ((ulCnt % ulWindowsPerStack) * ulXDiff);
3432 pswp->y = (Rectl.yTop - pswp->cy - ((ulCnt % ulWindowsPerStack) * ulYDiff));
3433}
3434
3435static VOID CascadeChildren(HWND hwndClient)
3436{
3437 ULONG ulCnt = 0L, ulNumMinChildren;
3438 HWND hwndChild;
3439 HENUM henum;
3440 SWP swp;
3441 USHORT id;
3442 RECTL Rectl;
3443
3444 WinQueryWindowPos(hwndClient, &swp);
3445 if (swp.fl & (SWP_HIDE | SWP_MINIMIZE))
3446 return;
3447
3448 CountChildren(hwndClient, &ulNumMinChildren);
3449 if (!fFreeTree) {
3450 WinQueryWindowRect(hwndClient, &Rectl);
3451 AdjustSizeOfClient(NULL, &Rectl);
3452 WinQueryWindowPos(hwndTree, &swp);
3453 if (!(swp.fl & (SWP_MAXIMIZE | SWP_HIDE | SWP_MINIMIZE))) {
3454 if (swp.y + swp.cy < Rectl.yTop - Rectl.yBottom)
3455 swp.cy = (Rectl.yTop - Rectl.yBottom) - swp.y;
3456 if (swp.x != 0)
3457 swp.x = 0;
3458 if (swp.y < 0)
3459 swp.y = 0;
3460 if (swp.x + swp.cx > Rectl.xRight - Rectl.xLeft)
3461 swp.cx = Rectl.xRight - Rectl.xLeft;
3462 WinSetWindowPos(hwndTree, HWND_TOP, swp.x, swp.y, swp.cx, swp.cy,
3463 SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_RESTORE);
3464 }
3465 }
3466 henum = WinBeginEnumWindows(hwndClient);
3467 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
3468 id = WinQueryWindowUShort(hwndChild, QWS_ID);
3469 if (!id || (!fFreeTree && id == TREE_FRAME))
3470 continue;
3471 WinQueryWindowPos(hwndChild, &swp);
3472 if (!(swp.fl & (SWP_MINIMIZE | SWP_HIDE))) {
3473 GetNextWindowPos(hwndClient, &swp, &ulCnt, &ulNumMinChildren);
3474 WinSetWindowPos(hwndChild, HWND_TOP, swp.x, swp.y, swp.cx, swp.cy,
3475 SWP_SIZE | SWP_MOVE | SWP_SHOW | SWP_RESTORE |
3476 SWP_ZORDER | SWP_ACTIVATE);
3477 ulCnt++;
3478 }
3479 }
3480 WinEndEnumWindows(henum);
3481}
3482
3483VOID TileChildren(HWND hwndClient, BOOL absolute)
3484{
3485 register ULONG ulChildCnt, ulSquare, ulNumRows, ulNumCols, ulExtraCols,
3486 ulWidth, ulHeight;
3487 ULONG ulNumMinChildren;
3488 RECTL Rectl;
3489 HWND hwndChild;
3490
3491 if (fNoTileUpdate || hwndClient == HWND_DESKTOP)
3492 return;
3493 {
3494 SWP swp;
3495
3496 WinQueryWindowPos(hwndClient, &swp);
3497 if (swp.fl & (SWP_HIDE | SWP_MINIMIZE))
3498 return;
3499 }
3500 ulChildCnt = CountChildren(hwndClient, &ulNumMinChildren);
3501 ulChildCnt -= ulNumMinChildren;
3502 if (!ulChildCnt)
3503 return;
3504
3505 fNoTileUpdate = TRUE;
3506
3507 for (ulSquare = 2; ulSquare * ulSquare <= ulChildCnt; ulSquare++) {
3508 ;
3509 }
3510 if (!fTileBackwards) {
3511 ulNumCols = ulSquare - 1;
3512 ulNumRows = ulChildCnt / ulNumCols;
3513 }
3514 else {
3515 ulNumRows = ulSquare - 1;
3516 ulNumCols = ulChildCnt / ulNumRows;
3517 }
3518 ulExtraCols = ulChildCnt % ulNumCols;
3519
3520 WinQueryWindowRect(hwndClient, &Rectl);
3521
3522 if (!fFreeTree) {
3523
3524 SWP swp;
3525
3526 WinQueryWindowPos(hwndTree, &swp);
3527 if (!(swp.fl & (SWP_MAXIMIZE | SWP_HIDE | SWP_MINIMIZE))) {
3528 if (swp.y < 0)
3529 swp.y = 0;
3530 if (swp.y + swp.cy < Rectl.yTop - Rectl.yBottom)
3531 swp.cy = (Rectl.yTop - Rectl.yBottom) - swp.y;
3532 if (swp.x != 0)
3533 swp.x = 0;
3534 if (swp.x + swp.cx > Rectl.xRight - Rectl.xLeft)
3535 swp.cx = Rectl.xRight - Rectl.xLeft;
3536 WinSetWindowPos(hwndTree,
3537 HWND_TOP,
3538 swp.x,
3539 swp.y,
3540 swp.cx,
3541 swp.cy, SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_RESTORE);
3542 WinQueryWindowPos(hwndTree, &swp);
3543 }
3544 if (ulNumMinChildren || (swp.fl & (SWP_HIDE | SWP_MINIMIZE)))
3545 Rectl.yBottom += WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2;
3546 }
3547 else if (ulNumMinChildren)
3548 Rectl.yBottom += WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2;
3549
3550 AdjustSizeOfClient(NULL, &Rectl);
3551
3552 if (Rectl.xRight > 0L && (Rectl.yBottom < Rectl.yTop)) {
3553
3554 HENUM henum;
3555
3556 henum = WinBeginEnumWindows(hwndClient);
3557 if ((hwndChild = WinGetNextWindow(henum)) != (HWND) 0) {
3558
3559 ULONG ulCurRow, ulCurCol;
3560 SWP swp;
3561 USHORT id;
3562
3563 ulHeight = (Rectl.yTop - Rectl.yBottom) / ulNumRows;
3564
3565 for (ulCurRow = 0; ulCurRow < ulNumRows; ulCurRow++) {
3566 if ((ulNumRows - ulCurRow) <= ulExtraCols)
3567 ulNumCols++;
3568 for (ulCurCol = 0; ulCurCol < ulNumCols; ulCurCol++) {
3569 ulWidth = Rectl.xRight / ulNumCols;
3570
3571 while (hwndChild) {
3572 id = WinQueryWindowUShort(hwndChild, QWS_ID);
3573 if (id && (id != TREE_FRAME || fFreeTree)) {
3574 WinQueryWindowPos(hwndChild, &swp);
3575 if (!(swp.fl & (SWP_HIDE | SWP_MINIMIZE)))
3576 break;
3577 }
3578 hwndChild = WinGetNextWindow(henum);
3579 }
3580
3581 if (hwndChild) {
3582 if (!absolute && (swp.fl & SWP_MAXIMIZE)) {
3583 WinGetMaxPosition(hwndChild, &swp);
3584 WinSetWindowPos(hwndChild,
3585 HWND_TOP,
3586 swp.x,
3587 swp.y,
3588 swp.cx, swp.cy, SWP_MOVE | SWP_SIZE | SWP_SHOW);
3589 WinSetWindowUShort(hwndChild,
3590 QWS_XRESTORE,
3591 (USHORT) (ulWidth * ulCurCol) + Rectl.xLeft);
3592 WinSetWindowUShort(hwndChild,
3593 QWS_YRESTORE,
3594 (USHORT) (Rectl.yTop -
3595 (ulHeight * (ulCurRow + 1))));
3596 WinSetWindowUShort(hwndChild, QWS_CXRESTORE, (USHORT) ulWidth);
3597 WinSetWindowUShort(hwndChild, QWS_CYRESTORE, (USHORT) ulHeight);
3598 }
3599 else
3600 WinSetWindowPos(hwndChild,
3601 HWND_TOP,
3602 (ulWidth * ulCurCol) + Rectl.xLeft,
3603 Rectl.yTop - (ulHeight * (ulCurRow + 1)),
3604 ulWidth,
3605 ulHeight,
3606 SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_RESTORE);
3607 hwndChild = WinGetNextWindow(henum);
3608 }
3609 }
3610 if ((ulNumRows - ulCurRow) <= ulExtraCols) {
3611 ulNumCols--;
3612 ulExtraCols--;
3613 }
3614 }
3615 }
3616 WinEndEnumWindows(henum);
3617 }
3618
3619 fNoTileUpdate = FALSE;
3620}
3621
3622static VOID ResizeChildren(HWND hwndClient, SHORT oldcx, SHORT oldcy,
3623 SHORT newcx, SHORT newcy)
3624{
3625 /*
3626 * resize all children of the client to maintain their proportional
3627 * sizes and positions
3628 */
3629
3630 if (!newcx || !newcy || !oldcx || !oldcy)
3631 return;
3632 {
3633 HENUM henum;
3634 HWND hwndChild;
3635 register LONG x, y, cx, cy, ucx, ucy, ux, uy;
3636 SWP swp;
3637
3638 henum = WinBeginEnumWindows(hwndClient);
3639 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
3640 if (!WinQueryWindowUShort(hwndChild, QWS_ID))
3641 continue;
3642 if (WinQueryWindowPos(hwndChild, &swp)) {
3643 if (swp.fl & (SWP_MINIMIZE | SWP_HIDE)) {
3644 swp.x = WinQueryWindowUShort(hwndChild, QWS_XRESTORE);
3645 swp.y = WinQueryWindowUShort(hwndChild, QWS_YRESTORE);
3646 swp.cx = WinQueryWindowUShort(hwndChild, QWS_CXRESTORE);
3647 swp.cy = WinQueryWindowUShort(hwndChild, QWS_CYRESTORE);
3648 }
3649 else if (swp.fl & SWP_MAXIMIZE) {
3650 swp.x = WinQueryWindowUShort(hwndChild, QWS_XRESTORE);
3651 swp.y = WinQueryWindowUShort(hwndChild, QWS_YRESTORE);
3652 swp.cx = WinQueryWindowUShort(hwndChild, QWS_CXRESTORE);
3653 swp.cy = WinQueryWindowUShort(hwndChild, QWS_CYRESTORE);
3654 }
3655 cx = (swp.cx) ? (LONG) (((double)oldcx * 100.0) / (double)swp.cx) : 0;
3656 cy = (swp.cy) ? (LONG) (((double)oldcy * 100.0) / (double)swp.cy) : 0;
3657 x = (swp.x) ? (LONG) (((double)oldcx * 100.0) / (double)swp.x) : 0;
3658 y = (swp.y) ? (LONG) (((double)oldcy * 100.0) / (double)swp.y) : 0;
3659 if (x < 0)
3660 x = 0;
3661 if (y < 0)
3662 y = 0;
3663 ux = (x) ? (LONG) (((double)newcx * 100.0) / (double)x) : 0;
3664 uy = (y) ? (LONG) (((double)newcy * 100.0) / (double)y) : 0;
3665 ucx = (cx) ? (LONG) (((double)newcx * 100.0) / (double)cx) : 0;
3666 ucy = (cy) ? (LONG) (((double)newcy * 100.0) / (double)cy) : 0;
3667 if (ux + ucx > newcx)
3668 ucx = newcx - ux;
3669 if (uy + ucy > newcy)
3670 ucy = newcy - uy;
3671
3672 if (!(swp.fl & (SWP_MINIMIZE | SWP_HIDE | SWP_MAXIMIZE)))
3673 WinSetWindowPos(hwndChild, HWND_TOP, ux, uy, ucx, ucy,
3674 SWP_MOVE | SWP_SIZE | SWP_SHOW);
3675 else if (swp.fl & (SWP_HIDE | SWP_MINIMIZE)) {
3676 WinSetWindowUShort(hwndChild, QWS_XMINIMIZE, (USHORT) - 1);
3677 WinSetWindowUShort(hwndChild, QWS_YMINIMIZE, (USHORT) - 1);
3678 WinSetWindowPos(hwndChild, HWND_TOP, 0, 0, 0, 0,
3679 SWP_SIZE | SWP_MOVE | SWP_FOCUSDEACTIVATE);
3680 WinSetWindowUShort(hwndChild, QWS_XRESTORE, ux);
3681 WinSetWindowUShort(hwndChild, QWS_YRESTORE, uy);
3682 WinSetWindowUShort(hwndChild, QWS_CXRESTORE, ucx);
3683 WinSetWindowUShort(hwndChild, QWS_CYRESTORE, ucy);
3684 }
3685 else {
3686 WinGetMaxPosition(hwndChild, &swp);
3687 WinSetWindowPos(hwndChild, HWND_TOP, swp.x, swp.y, swp.cx, swp.cy,
3688 SWP_MOVE | SWP_SIZE | SWP_SHOW);
3689 WinSetWindowUShort(hwndChild, QWS_XRESTORE, ux);
3690 WinSetWindowUShort(hwndChild, QWS_YRESTORE, uy);
3691 WinSetWindowUShort(hwndChild, QWS_CXRESTORE, ucx);
3692 WinSetWindowUShort(hwndChild, QWS_CYRESTORE, ucy);
3693 }
3694 }
3695 }
3696 WinEndEnumWindows(henum);
3697 }
3698 if (!fFreeTree) {
3699
3700 RECTL Rectl;
3701 SWP swp;
3702
3703 WinQueryWindowRect(hwndClient, &Rectl);
3704 AdjustSizeOfClient(NULL, &Rectl);
3705 WinQueryWindowPos(hwndTree, &swp);
3706 if (!(swp.fl & (SWP_MAXIMIZE | SWP_HIDE | SWP_MINIMIZE))) {
3707
3708 if (!fNoTreeGap) {
3709 INT height = WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2;
3710 if (swp.y < height)
3711 swp.y = height; // Force bottom to position
3712 }
3713 else
3714 swp.y = 0; // Force bottom to position
3715
3716 swp.cy = (Rectl.yTop - Rectl.yBottom) - swp.y;
3717 if (swp.cy < 0)
3718 swp.cy = 0;
3719
3720 if (swp.x != 0)
3721 swp.x = 0; // Left align
3722
3723 // AdjustSizeOfClient can return bogus xRight values - fixme someday
3724 if (Rectl.xRight >= Rectl.xLeft) {
3725 if (swp.x + swp.cx > Rectl.xRight - Rectl.xLeft)
3726 swp.cx = Rectl.xRight - Rectl.xLeft;
3727 }
3728 WinSetWindowPos(hwndTree, HWND_TOP, swp.x, swp.y, swp.cx, swp.cy,
3729 SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_RESTORE);
3730 }
3731 }
3732}
3733
3734static VOID MinResChildren(HWND hwndClient, ULONG cmd)
3735{
3736 HENUM henum;
3737 HWND hwndChild;
3738
3739 {
3740 SWP swp;
3741
3742 WinQueryWindowPos(hwndClient, &swp);
3743 if (swp.fl & (SWP_HIDE | SWP_MINIMIZE))
3744 return;
3745 }
3746 henum = WinBeginEnumWindows(hwndClient);
3747 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
3748 if (!WinQueryWindowUShort(hwndChild, QWS_ID))
3749 continue;
3750 WinSetWindowPos(hwndChild, HWND_TOP, 0, 0, 0, 0, cmd);
3751 }
3752}
3753
3754//=== ChildFrameButtonProc: subclass handler for WALKBUTTON and QUICKBUTTON windows ===
3755
3756static MRESULT EXPENTRY ChildFrameButtonProc(HWND hwnd,
3757 ULONG msg,
3758 MPARAM mp1, MPARAM mp2)
3759{
3760 USHORT id;
3761 static BOOL emphasized = FALSE;
3762
3763 switch (msg) {
3764 case WM_BUTTON1CLICK:
3765 case WM_CHORD:
3766 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
3767 break;
3768
3769 case WM_MOUSEMOVE:
3770 if (fOtherHelp) {
3771 if ((!hwndBubble || WinQueryWindowULong(hwndBubble, QWL_USER) != hwnd)
3772 && !WinQueryCapture(HWND_DESKTOP)) {
3773 id = WinQueryWindowUShort(hwnd, QWS_ID);
3774 switch (id) {
3775 case IDM_OPENWALK:
3776 MakeBubble(hwnd, FALSE, GetPString(IDS_WALKBUTTONHELP));
3777 break;
3778 case IDM_USERLIST:
3779 MakeBubble(hwnd, FALSE, GetPString(IDS_QUICKBUTTONHELP));
3780 break;
3781 }
3782 }
3783 }
3784 break;
3785
3786 case WM_BUTTON3CLICK:
3787 case WM_BUTTON2CLICK:
3788 {
3789 USHORT cmd = 0;
3790
3791 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
3792 id = WinQueryWindowUShort(hwnd, QWS_ID);
3793 switch (id) {
3794 case IDM_OPENWALK:
3795 switch (msg) {
3796 case WM_BUTTON2CLICK:
3797 if ((shiftstate & (KC_ALT | KC_SHIFT | KC_CTRL)) ==
3798 (KC_ALT | KC_SHIFT | KC_CTRL))
3799 cmd = IDM_GREP;
3800 else if ((shiftstate & (KC_ALT | KC_CTRL)) == (KC_ALT | KC_CTRL))
3801 CascadeChildren(hwndMain);
3802
3803#ifdef NEVER
3804 else if ((shiftstate & (KC_ALT | KC_SHIFT)) == (KC_ALT | KC_SHIFT))
3805 cmd = IDM_SYSINFO;
3806#endif
3807
3808 else if (shiftstate & KC_SHIFT)
3809 cmd = IDM_WINDOWDLG;
3810 else if (shiftstate & KC_CTRL)
3811 cmd = IDM_SEEALL;
3812 else if (shiftstate & KC_ALT)
3813 TileChildren(hwndMain, TRUE);
3814 else
3815 cmd = IDM_WALKDIR;
3816 break;
3817 case WM_BUTTON3CLICK:
3818 TileChildren(hwndMain, TRUE);
3819 break;
3820 }
3821 break;
3822 case IDM_USERLIST:
3823 switch (msg) {
3824 case WM_BUTTON2CLICK:
3825 if ((shiftstate & (KC_ALT | KC_SHIFT | KC_CTRL)) ==
3826 (KC_ALT | KC_SHIFT | KC_CTRL))
3827 cmd = IDM_COLORPALETTE;
3828 else if ((shiftstate & (KC_ALT | KC_CTRL)) == (KC_ALT | KC_CTRL))
3829 cmd = IDM_HIDEMENU;
3830 else if ((shiftstate & (KC_ALT | KC_SHIFT)) == (KC_ALT | KC_SHIFT))
3831 cmd = IDM_NOTEBOOK;
3832 else if (shiftstate & KC_SHIFT)
3833 cmd = IDM_TOOLTITLES;
3834 else if (shiftstate & KC_CTRL)
3835 cmd = IDM_TEXTTOOLS;
3836 else if (shiftstate & KC_ALT)
3837 cmd = IDM_FONTPALETTE;
3838 else
3839 cmd = IDM_TOOLBAR;
3840 break;
3841 case WM_BUTTON3CLICK:
3842 cmd = IDM_DRIVEBAR;
3843 break;
3844 }
3845 break;
3846 } // switch id
3847
3848 if (cmd) {
3849 PostMsg(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT), FID_CLIENT),
3850 WM_COMMAND, MPFROM2SHORT(cmd, 0), MPVOID);
3851 }
3852 }
3853 break;
3854
3855 case DM_DRAGOVER:
3856 id = WinQueryWindowUShort(hwnd, QWS_ID);
3857 if (id == IDM_OPENWALK) {
3858 if (!emphasized) {
3859 emphasized = TRUE;
3860 DrawTargetEmphasis(hwnd, emphasized);
3861 }
3862 if (AcceptOneDrop(hwnd, mp1, mp2))
3863 return MRFROM2SHORT(DOR_DROP, DO_MOVE);
3864 }
3865 return MRFROM2SHORT(DOR_NEVERDROP, 0);
3866
3867 case DM_DRAGLEAVE:
3868 if (emphasized) {
3869 emphasized = FALSE;
3870 DrawTargetEmphasis(hwnd, emphasized);
3871 }
3872 break;
3873
3874 case DM_DROPHELP:
3875 DropHelp(mp1, mp2, hwnd, GetPString(IDS_OPENDROPHELP));
3876 return 0;
3877
3878 case DM_DROP:
3879 {
3880 char szFrom[CCHMAXPATH + 2];
3881
3882 if (emphasized) {
3883 emphasized = FALSE;
3884 DrawTargetEmphasis(hwnd, emphasized);
3885 }
3886 if (GetOneDrop(hwnd, mp1, mp2, szFrom, sizeof(szFrom))) {
3887 if (MakeValidDir(szFrom) && !FindDirCnrByName(szFrom, TRUE)) {
3888 OpenDirCnr((HWND) 0, hwndMain, hwndTree, FALSE, szFrom);
3889 }
3890 }
3891 }
3892 return 0;
3893
3894 case WM_CLOSE:
3895 WinDestroyWindow(hwnd);
3896 return 0;
3897 }
3898 return PFNWPButton(hwnd, msg, mp1, mp2);
3899}
3900
3901static MRESULT EXPENTRY MainFrameWndProc(HWND hwnd, ULONG msg, MPARAM mp1,
3902 MPARAM mp2)
3903{
3904 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
3905 static ULONG aheight = 0L;
3906
3907 switch (msg) {
3908 case WM_ADJUSTWINDOWPOS:
3909 {
3910 SWP *pswp;
3911
3912 pswp = (SWP *) mp1;
3913 if (fDataMin && !fAmClosing) {
3914 if (pswp->fl & (SWP_HIDE | SWP_MINIMIZE)) {
3915
3916 SWP swp;
3917
3918 WinQueryWindowPos(hwnd, &swp);
3919 PostMsg(hwnd, UM_FOCUSME, MPFROMLONG(swp.fl), MPVOID);
3920 HideNote();
3921 }
3922 else if (pswp->fl & (SWP_SHOW | SWP_RESTORE)) {
3923 if (DataHwnd)
3924 PostMsg(DataHwnd, WM_CLOSE, MPVOID, MPVOID);
3925 }
3926 }
3927 if (!fAmClosing) {
3928 if (pswp->fl & (SWP_HIDE | SWP_MINIMIZE))
3929 HideNote();
3930 }
3931 }
3932 break;
3933
3934 case UM_FOCUSME:
3935 CreateDataBar(HWND_DESKTOP, (ULONG) mp1);
3936 return 0;
3937
3938 case WM_BUTTON1UP:
3939 case WM_BUTTON2UP:
3940 case WM_BUTTON3UP:
3941 case WM_MOUSEMOVE:
3942 case WM_CHORD:
3943 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
3944 break;
3945
3946 case WM_CHAR:
3947 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
3948 break;
3949
3950 case WM_CONTROL:
3951 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), UM_CONTROL, mp1,
3952 mp2);
3953
3954 case WM_COMMAND:
3955 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
3956
3957 case WM_CALCFRAMERECT:
3958 {
3959 MRESULT mr;
3960 PRECTL prectl;
3961 LONG sheight = 20, bheight = 20;
3962
3963 mr = oldproc(hwnd, msg, mp1, mp2);
3964
3965 /*
3966 * Calculate the position of the client rectangle.
3967 * Otherwise, we'll see a lot of redraw when we move the
3968 * client during WM_FORMATFRAME.
3969 */
3970
3971 if (mr && mp2) {
3972 prectl = (PRECTL) mp1;
3973 if (prectl->yBottom != prectl->yTop) {
3974 {
3975 HPS hps;
3976 POINTL aptl[TXTBOX_COUNT];
3977
3978 hps = WinGetPS(hwndStatus);
3979 if (hps) {
3980 GpiQueryTextBox(hps, 6, "$`WjgT", TXTBOX_COUNT, aptl);
3981 bheight = sheight = aptl[TXTBOX_TOPLEFT].y + 6;
3982 WinReleasePS(hps);
3983 }
3984 }
3985 prectl->yBottom += (sheight + 4);
3986 prectl->yTop -= (sheight + 4);
3987 if (fMoreButtons) {
3988
3989 HPS hps;
3990 POINTL aptl[TXTBOX_COUNT];
3991
3992 hps = WinGetPS(hwndName);
3993 if (hps) {
3994 GpiQueryTextBox(hps, 6, "$`WjgT", TXTBOX_COUNT, aptl);
3995 bheight = aptl[TXTBOX_TOPLEFT].y + 6;
3996 WinReleasePS(hps);
3997 }
3998 prectl->yBottom += (bheight + 4);
3999 prectl->yTop -= (bheight + 4);
4000 }
4001 if (fToolbar) {
4002 if (!fTextTools)
4003 prectl->yTop -= ((fToolTitles) ? 50 : 40);
4004 else
4005 prectl->yTop -= 32;
4006 }
4007 if (fDrivebar) {
4008 ResizeDrives(WinWindowFromID(hwnd, MAIN_DRIVES),
4009 ((prectl->xRight -
4010 (WinQuerySysValue(HWND_DESKTOP,
4011 SV_CYSIZEBORDER) * 2)) - 4));
4012 prectl->yTop -= (16 * (DriveLines * DRIVE_BUTTON_HEIGHT));
4013 }
4014 if (fUserComboBox) {
4015 if (!aheight) {
4016
4017 SWP swpTemp;
4018
4019 WinQueryWindowPos(WinWindowFromID(hwndDrivelist, CBID_EDIT),
4020 &swpTemp);
4021 aheight = swpTemp.cy;
4022 }
4023 prectl->yTop -= (aheight + 6L);
4024 }
4025 if (fAutoView) {
4026 AutoviewHeight = min(AutoviewHeight,
4027 (prectl->yTop - prectl->yBottom) - 116);
4028 AutoviewHeight = max(AutoviewHeight, 36);
4029 prectl->yBottom += (AutoviewHeight + 6);
4030 }
4031 }
4032 }
4033 return mr;
4034 }
4035
4036 case WM_FORMATFRAME:
4037 {
4038 SHORT sCount, soldCount;
4039 PSWP pswp, pswpClient, pswpNew;
4040 SWP swpClient;
4041 LONG theight = 48L, dheight = DRIVE_BUTTON_HEIGHT, width, sheight = 20, bheight = 20;
4042
4043 sCount = (SHORT) oldproc(hwnd, msg, mp1, mp2);
4044 soldCount = sCount;
4045
4046 /*
4047 * Reformat the frame to "squeeze" the client
4048 * and make room for status window sibling beneath
4049 * and toolbar above (if toolbar's on) and userlists
4050 * (if userlists are on).
4051 */
4052
4053 pswp = (PSWP) mp1;
4054 {
4055 SHORT x;
4056
4057 for (x = 0; x < soldCount; x++) {
4058 if (WinQueryWindowUShort(pswp->hwnd, QWS_ID) == FID_CLIENT) {
4059 pswpClient = pswp;
4060 break;
4061 }
4062 pswp++;
4063 }
4064 }
4065
4066 {
4067 HPS hps;
4068 POINTL aptl[TXTBOX_COUNT];
4069
4070 hps = WinGetPS(hwndStatus);
4071 if (hps) {
4072 GpiQueryTextBox(hps, 6, "$`WjgT", TXTBOX_COUNT, aptl);
4073 bheight = sheight = aptl[TXTBOX_TOPLEFT].y + 6;
4074 WinReleasePS(hps);
4075 }
4076 if (fMoreButtons) {
4077 hps = WinGetPS(hwndName);
4078 if (hps) {
4079 GpiQueryTextBox(hps, 6, "$`WjgT", TXTBOX_COUNT, aptl);
4080 bheight = aptl[TXTBOX_TOPLEFT].y + 6;
4081 WinReleasePS(hps);
4082 }
4083 }
4084 }
4085 pswpNew = (PSWP) mp1 + soldCount;
4086 *pswpNew = *pswpClient;
4087 swpClient = *pswpClient;
4088 pswpNew->hwnd = hwndStatus;
4089 pswpNew->hwndInsertBehind = HWND_BOTTOM;
4090 pswpNew->x = swpClient.x + 3;
4091 pswpNew->y = swpClient.y + 2;
4092 if (!fSplitStatus)
4093 width = swpClient.cx - (16 + (sheight * 2) + 4);
4094 else
4095 width = (swpClient.cx - (16 + (sheight * 2) + 4)) / 2;
4096 width = max(width, 10);
4097 if (fSplitStatus)
4098 pswpNew->cx = width - 6;
4099 else
4100 pswpNew->cx = width - 8;
4101 pswpNew->cy = sheight;
4102 pswpClient->y = pswpNew->y + pswpNew->cy + 3;
4103 pswpClient->cy = (swpClient.cy - pswpNew->cy) - 3;
4104 sCount++;
4105
4106 if (fSplitStatus) {
4107 pswpNew = (PSWP) mp1 + (soldCount + 1);
4108 *pswpNew = *pswpClient;
4109 pswpNew->hwnd = hwndStatus2;
4110 pswpNew->hwndInsertBehind = HWND_BOTTOM;
4111 pswpNew->x = width + 8;
4112 pswpNew->y = swpClient.y + 2;
4113 pswpNew->cx = width - 6;
4114 pswpNew->cy = sheight;
4115 sCount++;
4116 }
4117 else {
4118 WinShowWindow(hwndStatus2, FALSE);
4119 WinSetWindowText(hwndStatus2, NullStr);
4120 }
4121
4122 if (fToolbar) {
4123 if (fTextTools)
4124 theight = 32L;
4125 else if (!fToolTitles)
4126 theight = 40L;
4127 pswpNew = (PSWP) mp1 + (soldCount + 1 + (fSplitStatus != FALSE));
4128 *pswpNew = *pswpClient;
4129 pswpNew->hwnd = WinWindowFromID(hwnd, MAIN_TOOLS);
4130 pswpNew->hwndInsertBehind = HWND_BOTTOM;
4131 pswpNew->x = swpClient.x + 2;
4132 pswpNew->y = (swpClient.y + swpClient.cy) - (theight - 2);
4133 pswpNew->cx = swpClient.cx - 4;
4134 pswpNew->cy = theight - 4;
4135 pswpClient->cy -= theight;
4136 sCount++;
4137 }
4138 else
4139 WinShowWindow(WinWindowFromID(hwnd, MAIN_TOOLS), FALSE);
4140
4141 if (fDrivebar) {
4142 ResizeDrives(WinWindowFromID(hwnd, MAIN_DRIVES), pswpClient->cx - 4);
4143 pswpNew = (PSWP) mp1 + (soldCount + 1 +
4144 (fSplitStatus != FALSE) +
4145 (fToolbar != FALSE));
4146 *pswpNew = *pswpClient;
4147 pswpNew->hwnd = WinWindowFromID(hwnd, MAIN_DRIVES);
4148 pswpNew->hwndInsertBehind = HWND_BOTTOM;
4149 pswpNew->x = swpClient.x + 2;
4150 dheight += ((dheight) * DriveLines);
4151 pswpNew->y = (swpClient.y + swpClient.cy) - (dheight);
4152 if (fToolbar)
4153 pswpNew->y -= theight;
4154 pswpNew->cx = swpClient.cx - 4;
4155 pswpNew->cy = dheight;
4156 pswpClient->cy -= dheight;
4157 sCount++;
4158 }
4159 else
4160 WinShowWindow(WinWindowFromID(hwnd, MAIN_DRIVES), FALSE);
4161
4162 if (fAutoView) {
4163 pswpNew = (PSWP) mp1 + (soldCount + 1 +
4164 (fToolbar != FALSE) +
4165 (fDrivebar != FALSE) +
4166 (fSplitStatus != FALSE));
4167 *pswpNew = *pswpClient;
4168 pswpNew->hwnd = (fComments) ? hwndAutoMLE : hwndAutoview;
4169 pswpNew->x = pswpClient->x + 3;
4170 pswpNew->y = pswpClient->y + 3;
4171 if (fMoreButtons)
4172 pswpNew->y += (bheight + 4);
4173 pswpNew->cx = pswpClient->cx - 6;
4174 AutoviewHeight = min(AutoviewHeight, pswpClient->cy - 116);
4175 AutoviewHeight = max(AutoviewHeight, 40);
4176 pswpNew->cy = AutoviewHeight;
4177 pswpClient->y += (AutoviewHeight + 6);
4178 pswpClient->cy -= (AutoviewHeight + 6);
4179 sCount++;
4180 WinShowWindow((fComments) ? hwndAutoview : hwndAutoMLE, FALSE);
4181 }
4182 else {
4183 WinShowWindow(hwndAutoview, FALSE);
4184 WinShowWindow(hwndAutoMLE, FALSE);
4185 }
4186
4187 pswpNew = (PSWP) mp1 + (soldCount + 1 +
4188 (fToolbar != FALSE) +
4189 (fDrivebar != FALSE) +
4190 (fSplitStatus != FALSE) + (fAutoView != FALSE));
4191 *pswpNew = *pswpClient;
4192 pswpNew->hwnd = WinWindowFromID(hwnd, IDM_OPENWALK);
4193 pswpNew->x = swpClient.cx - ((sheight * 2) + 4);
4194 pswpNew->y = swpClient.y;
4195 pswpNew->cx = sheight + 4;
4196 pswpNew->cy = sheight + 4;
4197 sCount++;
4198 pswpNew = (PSWP) mp1 + (soldCount + 2 +
4199 (fToolbar != FALSE) +
4200 (fDrivebar != FALSE) +
4201 (fSplitStatus != FALSE) + (fAutoView != FALSE));
4202 *pswpNew = *pswpClient;
4203 pswpNew->hwnd = WinWindowFromID(hwnd, IDM_USERLIST);
4204 pswpNew->x = swpClient.cx - (sheight + 2);
4205 pswpNew->y = swpClient.y;
4206 pswpNew->cx = sheight + 4;
4207 pswpNew->cy = sheight + 4;
4208 sCount++;
4209 pswpNew = (PSWP) mp1 + (soldCount + 3 +
4210 (fToolbar != FALSE) +
4211 (fDrivebar != FALSE) +
4212 (fSplitStatus != FALSE) + (fAutoView != FALSE));
4213 *pswpNew = *pswpClient;
4214 pswpNew->hwnd = WinWindowFromID(hwnd, MAIN_LED);
4215 pswpNew->x = swpClient.cx - ((sheight * 2) + 16);
4216 pswpNew->y = swpClient.y;
4217 pswpNew->cx = 12;
4218 pswpNew->cy = 12;
4219 sCount++;
4220 pswpNew = (PSWP) mp1 + (soldCount + 4 +
4221 (fToolbar != FALSE) +
4222 (fDrivebar != FALSE) +
4223 (fSplitStatus != FALSE) + (fAutoView != FALSE));
4224 *pswpNew = *pswpClient;
4225 pswpNew->hwnd = WinWindowFromID(hwnd, MAIN_LEDHDR);
4226 pswpNew->x = swpClient.cx - ((sheight * 2) + 16);
4227 pswpNew->y = swpClient.y + 12;
4228 pswpNew->cx = 12;
4229 pswpNew->cy = sheight - 8;
4230 sCount++;
4231 if (fUserComboBox) {
4232 if (!aheight) {
4233
4234 SWP swpTemp;
4235
4236 WinQueryWindowPos(WinWindowFromID(hwndDrivelist, CBID_EDIT),
4237 &swpTemp);
4238 aheight = swpTemp.cy;
4239 }
4240 pswpNew = (PSWP) mp1 + (soldCount + 5 +
4241 (fToolbar != FALSE) +
4242 (fSplitStatus != FALSE) +
4243 (fDrivebar != FALSE) + (fAutoView != FALSE));
4244 *pswpNew = *pswpClient;
4245 pswpNew->hwnd = hwndDrivelist;
4246 pswpNew->x = swpClient.x;
4247 pswpNew->cx = 48;
4248 pswpClient->cy -= (aheight + 6L);
4249 pswpNew->y = pswpClient->y;
4250 pswpNew->cy = pswpClient->cy + (aheight + 5L);
4251 sCount++;
4252 pswpNew = (PSWP) mp1 + (soldCount + 6 +
4253 (fToolbar != FALSE) +
4254 (fDrivebar != FALSE) +
4255 (fSplitStatus != FALSE) +
4256 (fAutoView != FALSE));
4257 *pswpNew = *pswpClient;
4258 pswpNew->hwnd = hwndStatelist;
4259 pswpNew->x = swpClient.x + 48;
4260 pswpNew->cx = (swpClient.cx - 48) / 7;
4261 pswpNew->y = pswpClient->y;
4262 pswpNew->cy = pswpClient->cy + (aheight + 5L);
4263 sCount++;
4264 pswpNew = (PSWP) mp1 + (soldCount + 7 +
4265 (fToolbar != FALSE) +
4266 (fDrivebar != FALSE) +
4267 (fSplitStatus != FALSE) +
4268 (fAutoView != FALSE));
4269 *pswpNew = *pswpClient;
4270 pswpNew->hwnd = hwndCmdlist;
4271 pswpNew->x = swpClient.x + 48 + ((swpClient.cx - 48) / 7);
4272 pswpNew->cx = (swpClient.cx - 48) / 5 +
4273 ((swpClient.cx - 48) / 5) - ((swpClient.cx - 48) / 7);
4274 pswpNew->y = pswpClient->y;
4275 pswpNew->cy = pswpClient->cy + (aheight + 5L);
4276 sCount++;
4277 pswpNew = (PSWP) mp1 + (soldCount + 8 +
4278 (fToolbar != FALSE) +
4279 (fDrivebar != FALSE) +
4280 (fSplitStatus != FALSE) +
4281 (fAutoView != FALSE));
4282 *pswpNew = *pswpClient;
4283 pswpNew->hwnd = hwndUserlist;
4284 pswpNew->x = swpClient.x + 48 + (((swpClient.cx - 48) / 5) * 2);
4285 pswpNew->cx = ((swpClient.x + swpClient.cx) - pswpNew->x) -
4286 ((fToolbar) ? ((swpClient.cx - 48) / 7) : 0);
4287 pswpNew->y = pswpClient->y;
4288 pswpNew->cy = pswpClient->cy + (aheight + 5L);
4289 sCount++;
4290 if (fToolbar) {
4291 pswpNew = (PSWP) mp1 + (soldCount + 9 +
4292 (fToolbar != FALSE) +
4293 (fDrivebar != FALSE) +
4294 (fSplitStatus != FALSE) +
4295 (fAutoView != FALSE));
4296 *pswpNew = *pswpClient;
4297 pswpNew->hwnd = hwndButtonlist;
4298 pswpNew->x = swpClient.cx - ((swpClient.cx - 48) / 7) + 4;
4299 pswpNew->cx = (swpClient.x + swpClient.cx) - pswpNew->x;
4300 pswpNew->y = pswpClient->y;
4301 pswpNew->cy = pswpClient->cy + (aheight + 5L);
4302 sCount++;
4303 }
4304 else
4305 WinShowWindow(hwndButtonlist, FALSE);
4306 }
4307 else {
4308 WinShowWindow(hwndUserlist, FALSE);
4309 WinShowWindow(hwndDrivelist, FALSE);
4310 WinShowWindow(hwndStatelist, FALSE);
4311 WinShowWindow(hwndButtonlist, FALSE);
4312 WinShowWindow(hwndCmdlist, FALSE);
4313 }
4314 {
4315 PSWP pswpTitlebar = (PSWP) 0, pswpMinbutton = (PSWP) 0;
4316 SHORT x;
4317
4318 pswpNew = (PSWP) mp1 + (soldCount + 5 +
4319 (fToolbar != FALSE) +
4320 (fDrivebar != FALSE) +
4321 (fSplitStatus != FALSE) +
4322 (fAutoView != FALSE) +
4323 ((fUserComboBox != FALSE) * 4) +
4324 (fUserComboBox != FALSE &&
4325 fToolbar != FALSE));
4326 pswp = (PSWP) mp1;
4327 for (x = 0; x < soldCount; x++) {
4328 if (!pswpTitlebar &&
4329 WinQueryWindowUShort(pswp->hwnd, QWS_ID) == FID_TITLEBAR)
4330 pswpTitlebar = pswp;
4331 else if (!pswpMinbutton &&
4332 WinQueryWindowUShort(pswp->hwnd, QWS_ID) == FID_MINMAX)
4333 pswpMinbutton = pswp;
4334 if (pswpTitlebar && pswpMinbutton)
4335 break;
4336 pswp++;
4337 }
4338 if (pswpMinbutton && pswpTitlebar) {
4339 *pswpNew = *pswpMinbutton;
4340 pswpNew->hwnd = WinWindowFromID(hwnd, IDM_IDEALSIZE);
4341 pswpNew->cy = pswpMinbutton->cy + 3;
4342 pswpNew->cx = min(pswpNew->cy, (pswpMinbutton->cx / 2) + 3);
4343 pswpTitlebar->cx -= (pswpNew->cx - 1);
4344 pswpNew->x = pswpTitlebar->x + (pswpTitlebar->cx);
4345 pswpNew->y = pswpMinbutton->y - 1;
4346 sCount++;
4347 }
4348 else
4349 WinShowWindow(WinWindowFromID(hwnd, IDM_IDEALSIZE), FALSE);
4350 }
4351
4352 if (fMoreButtons) {
4353
4354 LONG lastx;
4355
4356 pswpNew = (PSWP) mp1 + (soldCount + 6 +
4357 (fToolbar != FALSE) +
4358 (fDrivebar != FALSE) +
4359 (fSplitStatus != FALSE) +
4360 (fAutoView != FALSE) +
4361 ((fUserComboBox != FALSE) * 4) +
4362 (fUserComboBox != FALSE &&
4363 fToolbar != FALSE));
4364 *pswpNew = *pswpClient;
4365 pswpNew->hwnd = hwndName;
4366 pswpNew->x = swpClient.x + 3;
4367 pswpNew->y = swpClient.y + (sheight + 6);
4368 pswpNew->cx = ((swpClient.cx / 2) + (swpClient.cx / 5)) - 3;
4369 lastx = pswpNew->x + pswpNew->cx;
4370 pswpNew->cy = bheight;
4371 pswpClient->y += (bheight + 4);
4372 pswpClient->cy -= (bheight + 4);
4373 sCount++;
4374 pswpNew = (PSWP) mp1 + (soldCount + 7 +
4375 (fToolbar != FALSE) +
4376 (fDrivebar != FALSE) +
4377 (fSplitStatus != FALSE) +
4378 (fAutoView != FALSE) +
4379 ((fUserComboBox != FALSE) * 4) +
4380 (fUserComboBox != FALSE &&
4381 fToolbar != FALSE));
4382 *pswpNew = *pswpClient;
4383 pswpNew->hwnd = hwndDate;
4384 pswpNew->x = lastx + 3;
4385 pswpNew->y = swpClient.y + (sheight + 6);
4386 pswpNew->cx = (swpClient.cx / 6) + (swpClient.cx / 16) - 3;
4387 lastx = pswpNew->x + pswpNew->cx;
4388 pswpNew->cy = bheight;
4389 sCount++;
4390 pswpNew = (PSWP) mp1 + (soldCount + 8 +
4391 (fToolbar != FALSE) +
4392 (fDrivebar != FALSE) +
4393 (fSplitStatus != FALSE) +
4394 (fAutoView != FALSE) +
4395 ((fUserComboBox != FALSE) * 4) +
4396 (fUserComboBox != FALSE &&
4397 fToolbar != FALSE));
4398 *pswpNew = *pswpClient;
4399 pswpNew->hwnd = hwndAttr;
4400 pswpNew->x = lastx + 3;
4401 pswpNew->y = swpClient.y + (sheight + 6);
4402 pswpNew->cx = (swpClient.cx - pswpNew->x) - 1;
4403 pswpNew->cy = bheight;
4404 sCount++;
4405 }
4406 else {
4407 WinShowWindow(hwndAttr, FALSE);
4408 WinShowWindow(hwndName, FALSE);
4409 WinShowWindow(hwndDate, FALSE);
4410 }
4411 return MRFROMSHORT(sCount);
4412 }
4413
4414 case WM_QUERYFRAMECTLCOUNT:
4415 {
4416 SHORT sCount;
4417
4418 sCount = (SHORT) oldproc(hwnd, msg, mp1, mp2);
4419
4420 sCount += 6;
4421 if (fSplitStatus)
4422 sCount++;
4423 if (fToolbar)
4424 sCount++;
4425 if (fUserComboBox) {
4426 sCount += 4;
4427 if (fToolbar)
4428 sCount++;
4429 }
4430 if (fDrivebar)
4431 sCount++;
4432 if (fAutoView)
4433 sCount++;
4434 if (fMoreButtons)
4435 sCount += 3;
4436 return MRFROMSHORT(sCount);
4437 }
4438
4439 case WM_CLOSE:
4440 WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
4441 return 0;
4442 }
4443 return oldproc(hwnd, msg, mp1, mp2);
4444}
4445
4446MRESULT EXPENTRY MainWMCommand(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
4447{
4448 SetShiftState();
4449 switch (SHORT1FROMMP(mp1)) {
4450
4451 case IDM_CONTEXTMENU:
4452 {
4453 HWND hwnd = WinQueryFocus(HWND_DESKTOP);
4454 // DbgMsg(pszSrcFile, __LINE__, "IDM_CONTEXTMENU %x", hwnd);
4455 if (hwnd != NULLHANDLE) {
4456 HWND hwndParent = WinQueryWindow(hwnd, QW_PARENT);
4457 USHORT id = WinQueryWindowUShort(hwndParent, QWS_ID);
4458 switch (id) {
4459 case MAIN_SETUPLIST:
4460 case MAIN_USERLIST:
4461 case MAIN_CMDLIST:
4462 // DbgMsg(pszSrcFile, __LINE__, "WM_CONTEXTMENU");
4463 WinPostMsg(hwnd, WM_CONTEXTMENU, 0, 0);
4464 }
4465 }
4466 }
4467 break;
4468
4469 case IDM_SETTARGET:
4470 SetTargetDir(hwnd, FALSE);
4471 break;
4472
4473 case IDM_TOAUTOMLE:
4474 if (fComments && fAutoView)
4475 WinSetFocus(HWND_DESKTOP, hwndAutoMLE);
4476 break;
4477
4478 case IDM_HIDENOTEWND:
4479 HideNote();
4480 break;
4481 case IDM_SHOWNOTEWND:
4482 ShowNote();
4483 break;
4484
4485 case IDM_COMPARE:
4486 {
4487 WALK2 wa;
4488 PCNRITEM pci;
4489
4490 memset(&wa, 0, sizeof(wa));
4491 wa.size = sizeof(wa);
4492 pci =
4493 (PCNRITEM)
4494 WinSendMsg(WinWindowFromID
4495 (WinWindowFromID(hwndTree, FID_CLIENT), TREE_CNR),
4496 CM_QUERYRECORDEMPHASIS, MPFROMLONG(CMA_FIRST),
4497 MPFROMSHORT(CRA_CURSORED));
4498 if (pci && (INT) pci != -1) {
4499 strcpy(wa.szCurrentPath1, pci->pszFileName);
4500 MakeValidDir(wa.szCurrentPath1);
4501 }
4502 else
4503 strcpy(wa.szCurrentPath1, pFM2SaveDirectory);
4504 TopWindowName(hwndMain, (HWND) 0, wa.szCurrentPath2);
4505 if (!*wa.szCurrentPath2)
4506 strcpy(wa.szCurrentPath2, wa.szCurrentPath1);
4507 MakeValidDir(wa.szCurrentPath2);
4508 if (WinDlgBox(HWND_DESKTOP,
4509 hwnd,
4510 WalkTwoCmpDlgProc,
4511 FM3ModHandle,
4512 WALK2_FRAME,
4513 MPFROMP(&wa)) &&
4514 !IsFile(wa.szCurrentPath1) && !IsFile(wa.szCurrentPath2)) {
4515 if (!*dircompare) {
4516
4517 COMPARE *cmp;
4518
4519 cmp = xmallocz(sizeof(COMPARE), pszSrcFile, __LINE__);
4520 if (cmp) {
4521 cmp->size = sizeof(COMPARE);
4522 strcpy(cmp->leftdir, wa.szCurrentPath1);
4523 strcpy(cmp->rightdir, wa.szCurrentPath2);
4524 cmp->hwndParent = hwnd;
4525 cmp->dcd.hwndParent = hwnd;
4526 WinDlgBox(HWND_DESKTOP,
4527 HWND_DESKTOP,
4528 CompareDlgProc, FM3ModHandle, COMP_FRAME, MPFROMP(cmp));
4529 }
4530 }
4531 else {
4532
4533 CHAR szPath1[CCHMAXPATH];
4534 CHAR szPath2[CCHMAXPATH];
4535 runemf2(SEPARATE,
4536 HWND_DESKTOP, pszSrcFile, __LINE__,
4537 NULL, NULL,
4538 "%s %s %s",
4539 dircompare,
4540 BldQuotedFileName(szPath1, wa.szCurrentPath1),
4541 BldQuotedFileName(szPath2, wa.szCurrentPath2));
4542 }
4543 }
4544 }
4545 break;
4546
4547 case IDM_EXIT:
4548 case IDM_KILLME:
4549 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
4550 break;
4551
4552 case IDM_CLI:
4553 if (fSplitStatus &&
4554 hwndStatus2 &&
4555 !WinIsWindow(WinQueryAnchorBlock(hwnd),
4556 WinWindowFromID(hwndStatus2, COMMAND_LINE)))
4557 PostMsg(hwndStatus2, UM_CLICKED, MPVOID, MPVOID);
4558 break;
4559
4560 case IDM_ADDTOUSERLIST:
4561 case IDM_DELETEFROMUSERLIST:
4562 {
4563 CHAR temp[CCHMAXPATH], path[CCHMAXPATH];
4564
4565 *temp = 0;
4566 WinQueryWindowText(hwndUserlist, CCHMAXPATH, temp);
4567 bstrip(temp);
4568 if (*temp &&
4569 !DosQueryPathInfo(temp, FIL_QUERYFULLNAME, path, sizeof(path))) {
4570 if (SHORT1FROMMP(mp1) == IDM_ADDTOUSERLIST) {
4571 add_udir(TRUE, path);
4572 if (fUdirsChanged)
4573 save_udirs();
4574 WinSendMsg(hwnd, UM_FILLUSERLIST, MPVOID, MPVOID);
4575 }
4576 else {
4577 if (!remove_udir(path))
4578 Runtime_Error(pszSrcFile, __LINE__, "remove_udir");
4579 else {
4580 if (fUdirsChanged)
4581 save_udirs();
4582 WinSendMsg(hwnd, UM_FILLUSERLIST, MPVOID, MPVOID);
4583 }
4584 }
4585 }
4586 }
4587 break;
4588
4589 case IDM_SAVEDIRCNRSTATE:
4590 case IDM_DELETEDIRCNRSTATE:
4591 {
4592 CHAR szStateName[STATE_NAME_MAX_BYTES + 1], szKeyBase[STATE_NAME_MAX_BYTES + 1];
4593
4594 *szStateName = 0;
4595 WinQueryWindowText(hwndStatelist, STATE_NAME_MAX_BYTES, szStateName);
4596 bstrip(szStateName);
4597 // Complain if attempting to use reserved name
4598 if (stricmp(szStateName, GetPString(IDS_STATETEXT)) == 0 ||
4599 stricmp(szStateName, PCSZ_FM2TEMPTEXT) == 0)
4600 {
4601 saymsg(MB_ENTER | MB_ICONASTERISK, hwnd,
4602 GetPString(IDS_WARNINGTEXT),
4603 GetPString(IDS_STATERESERVENAMETEXT), szStateName);
4604 }
4605 // Ignore request if blank
4606 else if (*szStateName) {
4607 BOOL fAbortOperation = FALSE;
4608 if (!fNoSaveState && fSaveState && stricmp(szStateName, PCSZ_SHUTDOWNSTATE) == 0)
4609 {
4610 if (saymsg(MB_YESNO | MB_DEFBUTTON2 | MB_ICONASTERISK, hwnd,
4611 GetPString(IDS_WARNINGTEXT),
4612 GetPString(IDS_SHUTDOWNSTATE_WARNING), szStateName) == MBID_NO)
4613 fAbortOperation = TRUE;
4614 }
4615 if (!fAbortOperation) {
4616 if (SHORT1FROMMP(mp1) == IDM_SAVEDIRCNRSTATE) {
4617 // Save
4618 INT nSaved = SaveDirCnrState(hwnd, szStateName);
4619 if (nSaved >= 0) {
4620 INT ret = add_setup(szStateName);
4621 if (ret == 0) {
4622 WinSendMsg(hwndStatelist, LM_INSERTITEM,
4623 MPFROM2SHORT(LIT_SORTASCENDING, 0), MPFROMP(szStateName));
4624 save_setups();
4625 }
4626 else if (ret != 1) {
4627 saymsg(MB_ENTER | MB_ICONASTERISK, hwnd,
4628 GetPString(IDS_WARNINGTEXT),
4629 GetPString(IDS_STATEADDFAILEDTEXT), szStateName); // 15 Apr 07 SHL failed
4630 WinSetWindowText(hwndStatelist, GetPString(IDS_STATETEXT));
4631 }
4632 }
4633 else {
4634 saymsg(MB_ENTER | MB_ICONASTERISK,
4635 hwnd,
4636 GetPString(IDS_WARNINGTEXT),
4637 GetPString(IDS_STATEDATASAVEFAILED));
4638 WinSetWindowText(hwndStatelist, GetPString(IDS_STATETEXT));
4639 }
4640 }
4641 else {
4642 // Delete
4643 ULONG numsaves = 0, size, x;
4644 CHAR szKey[STATE_NAME_MAX_BYTES + 80];
4645
4646 INT ret = remove_setup(szStateName);
4647 if (ret == 1)
4648 save_setups();
4649 sprintf(szKey, "%s.NumDirsLastTime", szStateName);
4650 size = sizeof(ULONG);
4651 if (!PrfQueryProfileData(fmprof,
4652 FM3Str,
4653 szKey,
4654 (PVOID)&numsaves,
4655 &size)) {
4656 saymsg(MB_ENTER | MB_ICONASTERISK, hwnd,
4657 GetPString(IDS_WARNINGTEXT),
4658 GetPString(IDS_DOESNTEXISTTEXT), szStateName);
4659 }
4660 else if (!size)
4661 Runtime_Error(pszSrcFile, __LINE__, NULL);
4662 else {
4663 PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L);
4664 for (x = 0; x < numsaves; x++) {
4665 sprintf(szKeyBase, "%s.DirCnr.%lu", szStateName, x);
4666 RemoveCnrSwitches(szKeyBase, szStateName);
4667 size = 0;
4668 sprintf(szKey, "%sVersion", szStateName);
4669 if (PrfQueryProfileSize(fmprof, FM3Str, szKey, &size) && size)
4670 RemoveOldCnrSwitches(szStateName, x);
4671 }
4672 }
4673 PostMsg(hwnd, UM_FILLSETUPLIST, MPVOID, MPVOID);
4674 }
4675 }
4676 }
4677 }
4678 break;
4679
4680 case IDM_IDEALSIZE:
4681 {
4682 SWP swp, swpD;
4683 ULONG icz = WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2L;
4684 ULONG bsz = WinQuerySysValue(HWND_DESKTOP, SV_CYSIZEBORDER);
4685
4686 WinQueryWindowPos(WinQueryWindow(hwnd, QW_PARENT), &swp);
4687 if (swp.fl & SWP_MAXIMIZE) {
4688 WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_SYSCOMMAND,
4689 MPFROM2SHORT(SC_RESTORE, 0), MPVOID);
4690 WinQueryWindowPos(WinQueryWindow(hwnd, QW_PARENT), &swp);
4691 }
4692 WinGetMaxPosition(WinQueryWindow(hwnd, QW_PARENT), &swpD);
4693 swpD.x += bsz;
4694 swpD.cx -= (bsz * 2);
4695 swpD.y += icz;
4696 swpD.cy -= (icz + bsz);
4697 if (swp.x == swpD.x && swp.y == swpD.y &&
4698 swp.cx == swpD.cx && swp.cy == swpD.cy &&
4699 // fixme to be #defined someday
4700 WinQueryWindowUShort(hwnd, QWL_USER + 10) &&
4701 WinQueryWindowUShort(hwnd, QWL_USER + 14)) {
4702 swpD.x = WinQueryWindowUShort(hwnd, QWL_USER + 8);
4703 swpD.cx = WinQueryWindowUShort(hwnd, QWL_USER + 10);
4704 swpD.y = WinQueryWindowUShort(hwnd, QWL_USER + 12);
4705 swpD.cy = WinQueryWindowUShort(hwnd, QWL_USER + 14);
4706 }
4707 else {
4708 WinSetWindowUShort(hwnd, QWL_USER + 8, (USHORT) swp.x);
4709 WinSetWindowUShort(hwnd, QWL_USER + 10, (USHORT) swp.cx);
4710 WinSetWindowUShort(hwnd, QWL_USER + 12, (USHORT) swp.y);
4711 WinSetWindowUShort(hwnd, QWL_USER + 14, (USHORT) swp.cy);
4712 }
4713 WinSetWindowPos(WinQueryWindow(hwnd, QW_PARENT), HWND_TOP,
4714 swpD.x, swpD.y, swpD.cx, swpD.cy, SWP_MOVE | SWP_SIZE);
4715 }
4716 break;
4717
4718 case IDM_BLINK:
4719 {
4720 BOOL changed = FALSE;
4721
4722 if (fDataMin) {
4723 fDataMin = FALSE;
4724 changed = TRUE;
4725 }
4726 WinSetWindowPos(WinQueryWindow(hwnd, QW_PARENT), HWND_TOP, 0, 0, 0, 0,
4727 SWP_MINIMIZE);
4728 WinSetWindowPos(WinQueryWindow(hwnd, QW_PARENT), HWND_TOP, 0, 0, 0, 0,
4729 SWP_RESTORE | SWP_ZORDER);
4730 if (changed)
4731 fDataMin = TRUE;
4732 break;
4733 }
4734
4735 case DID_CANCEL:
4736 {
4737 HWND hwndTop = TopWindow(hwndMain, (HWND) 0);
4738
4739 if (hwndTop)
4740 WinSetFocus(HWND_DESKTOP, hwndTop);
4741 }
4742 break;
4743
4744 case IDM_NOTEBOOK:
4745 case IDM_DIRCNRSETTINGS:
4746 case IDM_DIRVIEWSETTINGS:
4747 case IDM_DIRSORTSETTINGS:
4748 case IDM_COLLECTORVIEWSETTINGS:
4749 case IDM_COLLECTORSORTSETTINGS:
4750 case IDM_ARCHIVERSETTINGS:
4751 case IDM_TREECNRVIEWSETTINGS:
4752 case IDM_TREECNRSORTSETTINGS:
4753 case IDM_VIEWERSETTINGS:
4754 case IDM_VIEWERSETTINGS2:
4755 case IDM_COMPARESETTINGS:
4756 case IDM_MONOLITHICSETTINGS:
4757 case IDM_GENERALSETTINGS:
4758 case IDM_SCANSETTINGS:
4759 case IDM_BUBBLESSETTINGS:
4760 case IDM_QUICKSETTINGS:
4761 WinDlgBox(HWND_DESKTOP,
4762 hwnd, CfgDlgProc, FM3ModHandle, CFG_FRAME, MPFROMLONG(mp1));
4763 break;
4764
4765 case IDM_VIEWHELPS:
4766 case IDM_VIEWINFS:
4767 WinDlgBox(HWND_DESKTOP,
4768 HWND_DESKTOP,
4769 ViewInfProc,
4770 FM3ModHandle,
4771 VINF_FRAME,
4772 ((SHORT1FROMMP(mp1) == IDM_VIEWHELPS) ?
4773 MPFROMP(NullStr) : MPVOID));
4774 break;
4775
4776 case IDM_OPENWALK:
4777 {
4778 char newpath[CCHMAXPATH];
4779
4780 *newpath = 0;
4781 TopWindowName(hwnd, (HWND) 0, newpath);
4782 if (WinDlgBox(HWND_DESKTOP,
4783 hwnd,
4784 WalkAllDlgProc,
4785 FM3ModHandle, WALK_FRAME, MPFROMP(newpath)) && *newpath)
4786 OpenDirCnr((HWND) 0, hwndMain, hwndTree, FALSE, newpath);
4787 }
4788 break;
4789
4790 case IDM_WINDOWDLG:
4791 WindowList(hwnd);
4792 break;
4793
4794 case IDM_HELPMOUSE:
4795 case IDM_HELPCONTEXT:
4796 case IDM_HELPHINTS:
4797 case IDM_HELPPIX:
4798 case IDM_HELPTUTOR:
4799 case IDM_HELPUSERLIST:
4800 case IDM_HELP:
4801 case IDM_HELPCONTENTS:
4802 case IDM_HELPKEYS:
4803 case IDM_HELPGENERAL:
4804 if (hwndHelp) {
4805 if (SHORT1FROMMP(mp2) == CMDSRC_MENU) {
4806
4807 RECTL rcl;
4808 ULONG icz = WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2L;
4809
4810 WinQueryWindowRect(HWND_DESKTOP, &rcl);
4811 rcl.yBottom += icz;
4812 rcl.yTop -= icz;
4813 rcl.xLeft += icz;
4814 rcl.xRight -= icz;
4815 WinSendMsg(hwndHelp, HM_SET_COVERPAGE_SIZE, MPFROMP(&rcl), MPVOID);
4816 }
4817 else {
4818
4819 RECTL rcl;
4820
4821 WinQueryWindowRect(HWND_DESKTOP, &rcl);
4822 rcl.yBottom += 8;
4823 rcl.yTop = (rcl.yTop / 2) + (rcl.yTop / 7);
4824 rcl.xLeft = (rcl.xRight / 2) - (rcl.xRight / 7);
4825 rcl.xRight -= 8;
4826 WinSendMsg(hwndHelp, HM_SET_COVERPAGE_SIZE, MPFROMP(&rcl), MPVOID);
4827 }
4828 switch (SHORT1FROMMP(mp1)) {
4829 case IDM_HELPCONTEXT:
4830 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
4831 MPFROM2SHORT(HELP_CONTEXT, 0), MPFROMSHORT(HM_RESOURCEID));
4832 break;
4833
4834 case IDM_HELPMOUSE:
4835 if (hwndHelp)
4836 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
4837 MPFROM2SHORT(HELP_MOUSE, 0), MPFROMSHORT(HM_RESOURCEID));
4838 break;
4839
4840 case IDM_HELPPIX:
4841 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
4842 MPFROM2SHORT(HELP_BITMAP1, 0), MPFROMSHORT(HM_RESOURCEID));
4843 break;
4844
4845 case IDM_HELPTUTOR:
4846 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
4847 MPFROM2SHORT(HELP_TUTORIAL, 0),
4848 MPFROMSHORT(HM_RESOURCEID));
4849 break;
4850
4851 case IDM_HELPHINTS:
4852 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
4853 MPFROM2SHORT(HELP_HINTS, 0), MPFROMSHORT(HM_RESOURCEID));
4854 break;
4855
4856 case IDM_HELPGENERAL:
4857 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
4858 MPFROM2SHORT(HELP_MAIN, 0), MPFROMSHORT(HM_RESOURCEID));
4859 break;
4860 case IDM_HELPKEYS:
4861 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
4862 MPFROM2SHORT(HELP_KEYS, 0), MPFROMSHORT(HM_RESOURCEID));
4863 break;
4864
4865 case IDM_HELP:
4866 case IDM_HELPCONTENTS:
4867 WinSendMsg(hwndHelp, HM_HELP_CONTENTS, MPVOID, MPVOID);
4868 break;
4869
4870 case IDM_HELPUSERLIST:
4871 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
4872 MPFROM2SHORT(HELP_USERLISTS, 0),
4873 MPFROMSHORT(HM_RESOURCEID));
4874 break;
4875 }
4876 }
4877 break;
4878
4879 case IDM_EDITANYARCHIVER:
4880 EditArchiverDefinition(hwnd);
4881 break;
4882
4883 case IDM_ABOUT:
4884 WinDlgBox(HWND_DESKTOP, hwnd, AboutDlgProc, FM3ModHandle,
4885 ABT_FRAME, MPVOID);
4886 break;
4887
4888 case IDM_FONTPALETTE:
4889 OpenObject("<WP_FNTPAL>", Default, hwnd);
4890 break;
4891
4892 case IDM_HICOLORPALETTE:
4893 case IDM_COLORPALETTE:
4894 {
4895 CHAR *palette = "<WP_CLRPAL>";
4896 ULONG version[2];
4897
4898 if (!DosQuerySysInfo(QSV_VERSION_MAJOR, QSV_VERSION_MINOR,
4899 (PVOID) & version, (ULONG) sizeof(version))) {
4900 if (version[0] > 20L || (version[0] == 20L && version[1] > 29L)) {
4901 if (SHORT1FROMMP(mp1) == IDM_HICOLORPALETTE)
4902 palette = "<WP_HIRESCLRPAL>";
4903 else
4904 palette = "<WP_LORESCLRPAL>";
4905 }
4906 }
4907 OpenObject(palette, Default, hwnd);
4908 }
4909 break;
4910
4911 case IDM_SYSTEMSETUP:
4912 OpenObject("<WP_CONFIG>", Default, hwnd);
4913 break;
4914
4915 case IDM_SCHEMEPALETTE:
4916 {
4917 HOBJECT hWPSObject;
4918
4919 hWPSObject = WinQueryObject("<WP_SCHPAL>");
4920 if (hWPSObject != NULLHANDLE)
4921 WinSetObjectData(hWPSObject, "SCHEMES=Winter:PM_Winter,"
4922 "Spring:PM_Spring,Summer:PM_Summer,"
4923 "System:PM_System,Windows:PM_Windows;"
4924 "OPEN=DEFAULT");
4925 }
4926 break;
4927
4928 case IDM_SYSTEMCLOCK:
4929 OpenObject("<WP_CLOCK>", Default, hwnd);
4930 break;
4931
4932#ifdef NEVER
4933 case IDM_SYSINFO:
4934 WinDlgBox(HWND_DESKTOP, HWND_DESKTOP, SysInfoDlgProc, FM3ModHandle,
4935 SYS_FRAME, NULL);
4936 break;
4937#endif
4938
4939 case IDM_INSTANT:
4940 {
4941 CHAR path[CCHMAXPATH];
4942 PCNRITEM pci = (PCNRITEM) 0;
4943
4944 if (hwndTree)
4945 pci = (PCNRITEM) WinSendMsg(hwndTree, CM_QUERYRECORDEMPHASIS,
4946 MPFROMLONG(CMA_FIRST),
4947 MPFROMSHORT(CRA_CURSORED));
4948 if (pci && (INT) pci != -1) {
4949 strcpy(path, pci->pszFileName);
4950 MakeValidDir(path);
4951 }
4952 else
4953 strcpy(path, pFM2SaveDirectory);
4954 WinDlgBox(HWND_DESKTOP, hwnd, InstantDlgProc, FM3ModHandle,
4955 BAT_FRAME, MPFROMP(path));
4956 }
4957 break;
4958
4959 case IDM_WINFULLSCREEN:
4960 case IDM_DOSCOMMANDLINE:
4961 case IDM_COMMANDLINE:
4962 {
4963 CHAR *env = GetCmdSpec(FALSE), path[CCHMAXPATH];
4964 INT type = SEPARATE | WINDOWED;
4965
4966 *path = 0;
4967 TopWindowName(hwnd, (HWND) 0, path);
4968 if (SHORT1FROMMP(mp1) == IDM_DOSCOMMANDLINE)
4969 env = GetCmdSpec(TRUE);
4970 else if (SHORT1FROMMP(mp1) != IDM_COMMANDLINE) {
4971 env = "WINOS2.COM";
4972 type = SEPARATE | FULLSCREEN;
4973 }
4974 runemf2(type, hwnd, pszSrcFile, __LINE__,
4975 path, NULL, "%s", env);
4976 }
4977 break;
4978
4979 case IDM_KILLPROC:
4980 WinDlgBox(HWND_DESKTOP, hwnd, KillDlgProc, FM3ModHandle,
4981 KILL_FRAME, NULL);
4982 break;
4983
4984 case IDM_AUTOVIEWCOMMENTS:
4985 case IDM_AUTOVIEWFILE:
4986 if (SHORT1FROMMP(mp1) == IDM_AUTOVIEWFILE)
4987 fComments = FALSE;
4988 else
4989 fComments = TRUE;
4990 PrfWriteProfileData(fmprof, FM3Str, "Comments", &fComments, sizeof(BOOL));
4991 WinSetWindowText((fComments) ? hwndAutoview : hwndAutoMLE, NullStr);
4992 goto AutoChange;
4993
4994 case IDM_AUTOVIEW:
4995 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER), SHORT1FROMMP(mp1),
4996 &fAutoView, TRUE, "AutoView");
4997 AutoChange:
4998 PostMsg(WinQueryWindow(hwnd, QW_PARENT), WM_UPDATEFRAME,
4999 MPFROMLONG(FCF_SIZEBORDER), MPVOID);
5000 if (fAutoView) {
5001
5002 CHAR s[CCHMAXPATH];
5003 HWND hwndDir;
5004 PCNRITEM pci;
5005
5006 hwndDir = TopWindowName(hwnd, (HWND) 0, s);
5007 if (hwndDir) {
5008 hwndDir = WinWindowFromID(hwndDir, FID_CLIENT);
5009 if (hwndDir) {
5010 hwndDir = WinWindowFromID(hwndDir, DIR_CNR);
5011 if (hwndDir) {
5012 pci = (PCNRITEM) WinSendMsg(hwndDir, CM_QUERYRECORDEMPHASIS,
5013 MPFROMLONG(CMA_FIRST),
5014 MPFROMSHORT(CRA_CURSORED));
5015 if (pci && (INT) pci != -1 &&
5016 (!(driveflags[toupper(*pci->pszFileName) - 'A'] & DRIVE_SLOW)))
5017 WinSendMsg(hwnd,
5018 UM_LOADFILE,
5019 MPFROMP(pci->pszFileName),
5020 (SHORT1FROMMP(mp1) == IDM_AUTOVIEW) ?
5021 MPVOID : MPFROMLONG(1));
5022 }
5023 }
5024 }
5025 }
5026 break;
5027
5028 case IDM_TEXTTOOLS:
5029 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER), SHORT1FROMMP(mp1),
5030 &fTextTools, TRUE, "TextTools");
5031 PostMsg(hwndToolback, UM_SETUP2, MPVOID, MPVOID);
5032 PostMsg(WinQueryWindow(hwnd, QW_PARENT), WM_UPDATEFRAME,
5033 MPFROMLONG(FCF_SIZEBORDER), MPVOID);
5034 break;
5035
5036 case IDM_TOOLTITLES:
5037 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER), SHORT1FROMMP(mp1),
5038 &fToolTitles, TRUE, "ToolTitles");
5039 PostMsg(hwndToolback, UM_SETUP2, MPVOID, MPVOID);
5040 PostMsg(WinQueryWindow(hwnd, QW_PARENT), WM_UPDATEFRAME,
5041 MPFROMLONG(FCF_SIZEBORDER), MPVOID);
5042 break;
5043
5044 case IDM_HIDEMENU:
5045 {
5046 HWND hwndMenu = WinQueryWindowULong(hwnd, QWL_USER);
5047 MenuInvisible = MenuInvisible ? FALSE : TRUE;
5048 if (MenuInvisible) {
5049 WinSetParent(hwndMenu, HWND_OBJECT, FALSE);
5050 WinSetMenuItemText(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
5051 FID_SYSMENU), IDM_HIDEMENU,
5052 GetPString(IDS_UNHIDEMENUTEXT));
5053 }
5054 else {
5055 WinSetParent(hwndMenu, WinQueryWindow(hwnd, QW_PARENT), FALSE);
5056 WinSetMenuItemText(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
5057 FID_SYSMENU), IDM_HIDEMENU,
5058 GetPString(IDS_HIDEMENUTEXT));
5059 }
5060 PostMsg(WinQueryWindow(hwnd, QW_PARENT), WM_UPDATEFRAME,
5061 MPFROMLONG(FCF_MENU), MPVOID);
5062 PrfWriteProfileData(fmprof, FM3Str, "MenuInvisible",
5063 &MenuInvisible, sizeof(BOOL));
5064 }
5065 break;
5066
5067 case IDM_SEEALL:
5068 case IDM_GREP:
5069 case IDM_COLLECTOR:
5070 {
5071 HWND hwndC;
5072 SWP swp;
5073 BOOL already = FALSE;
5074
5075 if (Collector)
5076 already = TRUE;
5077 if (!already && !fAutoTile && !fExternalCollector)
5078 GetNextWindowPos(hwnd, &swp, NULL, NULL);
5079 hwndC = StartCollector(fExternalCollector ? HWND_DESKTOP : hwnd, 4);
5080 if (hwndC) {
5081 if (!already && !fAutoTile && !fExternalCollector)
5082 WinSetWindowPos(hwndC, HWND_TOP,
5083 swp.x, swp.y, swp.cx, swp.cy,
5084 SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_ZORDER);
5085 else if (fAutoTile && !already)
5086 TileChildren(hwnd, TRUE);
5087 WinSetWindowPos(hwndC, HWND_TOP, 0, 0, 0, 0, SWP_SHOW | SWP_RESTORE |
5088 SWP_ACTIVATE);
5089 if (SHORT1FROMMP(mp1) == IDM_GREP)
5090 PostMsg(WinWindowFromID(hwndC, FID_CLIENT), WM_COMMAND,
5091 MPFROM2SHORT(IDM_GREP, 0), MPVOID);
5092 if (SHORT1FROMMP(mp1) == IDM_SEEALL)
5093 PostMsg(WinWindowFromID(hwndC, FID_CLIENT), WM_COMMAND,
5094 MPFROM2SHORT(IDM_SEEALL, 0), MPVOID);
5095 }
5096 }
5097 break;
5098
5099 case IDM_DATABAR:
5100 CreateDataBar(HWND_DESKTOP, 0);
5101 break;
5102
5103 case IDM_TOOLLEFT:
5104 case IDM_TOOLRIGHT:
5105 {
5106 TOOL *tool;
5107
5108 if (!toolhead || !toolhead->next) {
5109 firsttool = (toolhead) ? toolhead->id : 0;
5110 break;
5111 }
5112 tool = find_tool(firsttool);
5113 if (!tool)
5114 tool = toolhead;
5115 if (SHORT1FROMMP(mp1) == IDM_TOOLRIGHT) {
5116 tool = prev_tool(tool, TRUE);
5117 firsttool = tool->id;
5118 }
5119 else {
5120 tool = next_tool(tool, TRUE);
5121 firsttool = tool->id;
5122 }
5123 ResizeTools(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
5124 MAIN_TOOLS));
5125 }
5126 break;
5127
5128 case IDM_CREATETOOL:
5129 PostMsg(hwndToolback, UM_SETUP2, MPVOID, MPVOID);
5130 break;
5131
5132 case IDM_TOOLBAR:
5133 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
5134 IDM_TOOLSUBMENU, &fToolbar, TRUE, "Toolbar");
5135 PostMsg(hwndToolback, UM_SETUP2, MPVOID, MPVOID);
5136 WinShowWindow(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
5137 MAIN_TOOLS), fToolbar);
5138 WinSendMsg(WinQueryWindow(hwnd, QW_PARENT),
5139 WM_UPDATEFRAME, MPFROMLONG(FCF_SIZEBORDER), MPVOID);
5140 if (fDrivebar)
5141 WinInvalidateRect(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
5142 MAIN_DRIVES), NULL, TRUE);
5143 break;
5144
5145 case IDM_DRIVEBAR:
5146 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
5147 IDM_DRIVEBAR, &fDrivebar, TRUE, "Drivebar");
5148 WinShowWindow(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
5149 MAIN_DRIVES), fDrivebar);
5150 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
5151 WM_UPDATEFRAME, MPFROMLONG(FCF_SIZEBORDER), MPVOID);
5152 PostMsg(hwnd, UM_BUILDDRIVEBAR, MPVOID, MPVOID);
5153 break;
5154
5155 case IDM_USERLIST:
5156 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
5157 SHORT1FROMMP(mp1), &fUserComboBox, TRUE, "UserComboBox");
5158 WinShowWindow(hwndUserlist, fUserComboBox);
5159 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
5160 WM_UPDATEFRAME, MPFROMLONG(FCF_SIZEBORDER), MPVOID);
5161 PostMsg(hwnd, UM_FILLUSERLIST, MPVOID, MPVOID);
5162 PostMsg(hwnd, UM_FILLSETUPLIST, MPVOID, MPVOID);
5163 PostMsg(hwnd, UM_FILLCMDLIST, MPVOID, MPVOID);
5164 PostMsg(hwnd, UM_FILLBUTTONLIST, MPVOID, MPVOID);
5165 break;
5166
5167 case IDM_MOREBUTTONS:
5168 WinSetWindowText(hwndName, NullStr);
5169 WinSetWindowText(hwndDate, NullStr);
5170 WinSetWindowText(hwndAttr, NullStr);
5171 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
5172 SHORT1FROMMP(mp1), &fMoreButtons, TRUE, "MoreButtons");
5173 if (fMoreButtons) {
5174
5175 HWND hwndTemp;
5176
5177 hwndTemp = TopWindow(hwnd, (HWND) 0);
5178
5179 if (hwndTemp) {
5180 WinSetFocus(HWND_DESKTOP, hwnd);
5181 WinSetFocus(HWND_DESKTOP, hwndTemp);
5182 }
5183 }
5184 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
5185 WM_UPDATEFRAME, MPFROMLONG(FCF_SIZEBORDER), MPVOID);
5186 break;
5187
5188 case IDM_TOGGLEDRAGDIALOG:
5189 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
5190 IDM_TOGGLEDRAGDIALOG,
5191 &fDragndropDlg,
5192 TRUE,
5193 "Drag&DropDlg");
5194 break;
5195
5196 case IDM_SYNCUPDATES:
5197 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
5198 IDM_SYNCUPDATES,
5199 &fSyncUpdates,
5200 TRUE,
5201 "SyncUpdates");
5202 break;
5203
5204 case IDM_FREETREE:
5205 if (fFreeTree) {
5206 SWP swp, swpT;
5207
5208 WinQueryWindowPos(hwndTree, &swpT);
5209 WinQueryWindowPos(hwnd, &swp);
5210 WinSetWindowPos(hwndTree, HWND_TOP, 0, swp.cy - swpT.cy, 0, 0,
5211 SWP_MOVE);
5212 }
5213 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER), SHORT1FROMMP(mp1),
5214 &fFreeTree, TRUE, "FreeTree");
5215 if (fAutoTile)
5216 TileChildren(hwnd, TRUE);
5217 break;
5218
5219 case IDM_AUTOTILE:
5220 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
5221 SHORT1FROMMP(mp1), &fAutoTile, TRUE, "AutoTile");
5222 if (fAutoTile)
5223 TileChildren(hwnd, TRUE);
5224 break;
5225
5226 case IDM_TILEBACKWARDS:
5227 SetMenuCheck(WinQueryWindowULong(hwnd, QWL_USER),
5228 SHORT1FROMMP(mp1), &fTileBackwards, TRUE, "TileBackwards");
5229 if (fAutoTile)
5230 TileChildren(hwnd, TRUE);
5231 break;
5232
5233 case IDM_NEXTWINDOW:
5234 case IDM_PREVWINDOW:
5235 NextChild(hwnd, (SHORT1FROMMP(mp1) == IDM_PREVWINDOW));
5236 break;
5237
5238 case IDM_CASCADE:
5239 CascadeChildren(hwnd);
5240 break;
5241
5242 case IDM_TILE:
5243 TileChildren(hwnd, TRUE);
5244 break;
5245
5246 case IDM_RESTORE:
5247 MinResChildren(hwnd, SWP_RESTORE);
5248 break;
5249
5250 case IDM_MINIMIZE:
5251 MinResChildren(hwnd, SWP_MINIMIZE);
5252 break;
5253
5254 case IDM_ARRANGEICONS:
5255 ArrangeIcons(hwnd);
5256 break;
5257
5258 case IDM_INIVIEWER:
5259 StartIniEditor(hwnd, NULL, 4);
5260 break;
5261
5262 case IDM_EDITASSOC:
5263 EditAssociations(hwnd);
5264 break;
5265
5266 case IDM_EDITCOMMANDS:
5267 EditCommands(hwnd);
5268 PostMsg(hwnd, UM_FILLCMDLIST, MPVOID, MPVOID);
5269 break;
5270
5271 default:
5272 if (!SwitchCommand((HWND) WinQueryWindowULong(hwnd, QWL_USER),
5273 SHORT1FROMMP(mp1))) {
5274 if (SHORT1FROMMP(mp1) >= IDM_COMMANDSTART &&
5275 SHORT1FROMMP(mp1) < IDM_QUICKTOOLSTART) {
5276
5277 INT x;
5278 HWND hwndCnr;
5279
5280 if (!cmdloaded)
5281 load_commands();
5282 hwndCnr = TopWindow(hwnd, (HWND) 0);
5283 hwndCnr = (HWND) WinSendMsg(WinWindowFromID(hwndCnr, FID_CLIENT),
5284 UM_CONTAINERHWND, MPVOID, MPVOID);
5285 if (!hwndCnr) {
5286 Runtime_Error(pszSrcFile, __LINE__, NULL);
5287 break;
5288 }
5289 x = SHORT1FROMMP(mp1) - IDM_COMMANDSTART;
5290 if (x >= 0) {
5291 x++;
5292 RunCommand(hwndCnr, x);
5293 if (fUnHilite) {
5294
5295 PCNRITEM pci;
5296 DIRCNRDATA *dcd = NULL;
5297
5298 // 12 May 07 SHL fixme to understand? backwards maybe? looking for DIR_CNR?
5299 if (WinQueryWindowUShort(hwndCnr, QWS_ID) != TREE_CNR)
5300 dcd = INSTDATA(hwndCnr);
5301 pci = (PCNRITEM) WinSendMsg(hwndCnr,
5302 CM_QUERYRECORDEMPHASIS,
5303 MPFROMLONG(CMA_FIRST),
5304 MPFROMSHORT(CRA_CURSORED));
5305 if (pci && (INT) pci != -1 &&
5306 (pci->rc.flRecordAttr & CRA_SELECTED))
5307 {
5308 UnHilite(hwnd,
5309 TRUE,
5310 dcd ? &dcd->lastselection : NULL,
5311 dcd ? dcd ->ulItemsToUnHilite : 0);
5312 }
5313 }
5314 }
5315 }
5316 else if (SHORT1FROMMP(mp1) >= IDM_QUICKTOOLSTART &&
5317 SHORT1FROMMP(mp1) < IDM_QUICKTOOLSTART + 51) {
5318 if (!qtloaded)
5319 load_quicktools();
5320 if (quicktool[SHORT1FROMMP(mp1) - IDM_QUICKTOOLSTART - 1]) {
5321 if (fToolsChanged)
5322 save_tools(NULL);
5323 if (!load_tools(quicktool[SHORT1FROMMP(mp1) - IDM_QUICKTOOLSTART - 1]))
5324 load_tools(NULL);
5325 else {
5326 strcpy(lasttoolbar,
5327 quicktool[SHORT1FROMMP(mp1) - IDM_QUICKTOOLSTART - 1]);
5328 PrfWriteProfileString(fmprof, FM3Str, "LastToolbar", lasttoolbar);
5329 }
5330 PostMsg(hwndToolback, UM_SETUP2, MPVOID, MPVOID);
5331 }
5332 }
5333 else {
5334
5335 HWND hwndActive;
5336
5337 hwndActive = TopWindow(hwnd, (HWND) 0);
5338 if (hwndActive)
5339 PostMsg(WinWindowFromID(hwndActive, FID_CLIENT),
5340 WM_COMMAND, mp1, mp2);
5341 }
5342 }
5343 break; // default
5344 } // switch mp1
5345 return 0;
5346}
5347
5348static MRESULT EXPENTRY MainWMOnce(HWND hwnd, ULONG msg, MPARAM mp1,
5349 MPARAM mp2)
5350{
5351 TID tid;
5352 SWP swp;
5353 PFNWP oldproc;
5354 HWND hwndTmp;
5355 HWND hwndFrame;
5356 HWND hwndSysMenu, hwndSysSubMenu, hwndMenu;
5357 USHORT idSysMenu;
5358 MENUITEM mi, mit;
5359 ULONG size;
5360 BOOL temp = FALSE;
5361
5362 switch (msg) {
5363 case WM_CREATE:
5364 WinQueryWindowProcess(hwnd, &mypid, &tid);
5365 hwndMain = hwnd;
5366 WinSetWindowUShort(hwnd, QWL_USER + 8, 0);
5367 WinSetWindowUShort(hwnd, QWL_USER + 10, 0);
5368 WinSetWindowUShort(hwnd, QWL_USER + 12, 0);
5369 WinSetWindowUShort(hwnd, QWL_USER + 16, 0);
5370 if (xbeginthread(MakeMainObjWin,
5371 245760,
5372 MPVOID,
5373 pszSrcFile,
5374 __LINE__) == -1)
5375 {
5376 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
5377 return 0;
5378 }
5379 else
5380 DosSleep(32);//05 Aug 07 GKY 64
5381
5382 hwndFrame = WinQueryWindow(hwnd, QW_PARENT);
5383
5384 /*
5385 * create frame children (not client children, frame children)
5386 */
5387 DosSleep(1);
5388 WinQueryWindowPos(hwndFrame, &swp);
5389 oldproc = WinSubclassWindow(hwndFrame, MainFrameWndProc);
5390 WinSetWindowPtr(hwndFrame, QWL_USER, (PVOID) oldproc);
5391 CommonCreateMainChildren(hwnd, &swp);
5392
5393 if (!WinCreateWindow(hwndFrame,
5394 WC_BUTTON,
5395 "I",
5396 WS_VISIBLE | BS_PUSHBUTTON | BS_NOPOINTERFOCUS,
5397 ((swp.cx -
5398 WinQuerySysValue(HWND_DESKTOP,
5399 SV_CXMINMAXBUTTON)) -
5400 WinQuerySysValue(HWND_DESKTOP,
5401 SV_CXMINMAXBUTTON) / 2) -
5402 WinQuerySysValue(HWND_DESKTOP,
5403 SV_CXSIZEBORDER),
5404 (swp.cy - WinQuerySysValue(HWND_DESKTOP,
5405 SV_CYMINMAXBUTTON)) -
5406 WinQuerySysValue(HWND_DESKTOP,
5407 SV_CYSIZEBORDER),
5408 WinQuerySysValue(HWND_DESKTOP,
5409 SV_CXMINMAXBUTTON) / 2,
5410 WinQuerySysValue(HWND_DESKTOP,
5411 SV_CYMINMAXBUTTON),
5412 hwnd, HWND_TOP, IDM_IDEALSIZE, NULL, NULL)) {
5413 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__,
5414 PCSZ_WINCREATEWINDOW);
5415 }
5416 else {
5417 WinSubclassWindow(WinWindowFromID(hwndFrame, IDM_IDEALSIZE),
5418 IdealButtonProc);
5419 //fixme to allow user to change presparams 1-10-09 GKY
5420 SetPresParams(WinWindowFromID(hwndFrame,
5421 IDM_IDEALSIZE),
5422 NULL, NULL, NULL, FNT_10SYSTEMVIO);
5423 }
5424
5425 hwndTmp = WinCreateWindow(hwndFrame,
5426 WC_BUTTON,
5427 "#1019",
5428 WS_VISIBLE | BS_PUSHBUTTON | BS_NOPOINTERFOCUS |
5429 BS_BITMAP,
5430 swp.cx - 46,
5431 swp.y + 2,
5432 24,
5433 22, hwnd, HWND_TOP, IDM_OPENWALK, NULL, NULL);
5434 if (!hwndTmp)
5435 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__,
5436 PCSZ_WINCREATEWINDOW);
5437
5438 hwndTmp = WinCreateWindow(hwndFrame,
5439 WC_BUTTON,
5440 "#3062",
5441 WS_VISIBLE | BS_PUSHBUTTON | BS_NOPOINTERFOCUS |
5442 BS_BITMAP,
5443 swp.cx - 22,
5444 swp.y + 2,
5445 24,
5446 22, hwnd, HWND_TOP, IDM_USERLIST, NULL, NULL);
5447 if (!hwndTmp)
5448 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__,
5449 PCSZ_WINCREATEWINDOW);
5450
5451 hwndUserlist = WinCreateWindow(hwndFrame,
5452 WC_COMBOBOX,
5453 (PSZ) NULL,
5454 WS_VISIBLE | CBS_DROPDOWN |
5455 LS_HORZSCROLL,
5456 (swp.x +
5457 WinQuerySysValue(HWND_DESKTOP,
5458 SV_CXSIZEBORDER) + 48L),
5459 (swp.cy -
5460 WinQuerySysValue(HWND_DESKTOP,
5461 SV_CYSIZEBORDER)) - 60,
5462 ((swp.cx -
5463 (WinQuerySysValue(HWND_DESKTOP,
5464 SV_CXSIZEBORDER) *
5465 2)) - 64L), 60L, hwndFrame, HWND_TOP,
5466 MAIN_USERLIST, NULL, NULL);
5467 if (!hwndUserlist)
5468 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__,
5469 PCSZ_WINCREATEWINDOW);
5470 hwndCmdlist = WinCreateWindow(hwndFrame,
5471 WC_COMBOBOX,
5472 (PSZ) NULL,
5473 WS_VISIBLE | CBS_DROPDOWN |
5474 LS_HORZSCROLL,
5475 (swp.x +
5476 WinQuerySysValue(HWND_DESKTOP,
5477 SV_CXSIZEBORDER) + 48L),
5478 (swp.cy -
5479 WinQuerySysValue(HWND_DESKTOP,
5480 SV_CYSIZEBORDER)) - 60,
5481 ((swp.cx -
5482 (WinQuerySysValue(HWND_DESKTOP,
5483 SV_CXSIZEBORDER) * 2)) -
5484 64L), 60L, hwndFrame, HWND_TOP,
5485 MAIN_CMDLIST, NULL, NULL);
5486 if (!hwndCmdlist)
5487 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__,
5488 PCSZ_WINCREATEWINDOW);
5489 WinSetWindowText(hwndCmdlist, GetPString(IDS_COMMANDSTEXT));
5490 hwndStatelist = WinCreateWindow(hwndFrame,
5491 WC_COMBOBOX,
5492 (PSZ) NULL,
5493 WS_VISIBLE | CBS_DROPDOWN |
5494 LS_HORZSCROLL,
5495 (swp.x +
5496 WinQuerySysValue(HWND_DESKTOP,
5497 SV_CXSIZEBORDER) + 48L),
5498 (swp.cy -
5499 WinQuerySysValue(HWND_DESKTOP,
5500 SV_CYSIZEBORDER)) - 60,
5501 ((swp.cx -
5502 (WinQuerySysValue(HWND_DESKTOP,
5503 SV_CXSIZEBORDER) *
5504 2)) - 64L), 60L, hwndFrame, HWND_TOP,
5505 MAIN_SETUPLIST, NULL, NULL);
5506 if (!hwndStatelist)
5507 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__,
5508 PCSZ_WINCREATEWINDOW);
5509
5510 hwndDrivelist = WinCreateWindow(hwndFrame,
5511 WC_COMBOBOX,
5512 (PSZ) NULL,
5513 //WS_VISIBLE |
5514 CBS_DROPDOWN,
5515 (swp.x +
5516 WinQuerySysValue(HWND_DESKTOP,
5517 SV_CXSIZEBORDER)),
5518 (swp.cy -
5519 WinQuerySysValue(HWND_DESKTOP,
5520 SV_CYSIZEBORDER)) - 60,
5521 48L,
5522 60L,
5523 hwndFrame,
5524 HWND_TOP, MAIN_DRIVELIST, NULL, NULL);
5525 if (!hwndDrivelist)
5526 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__,
5527 PCSZ_WINCREATEWINDOW);
5528 //fixme to allow user to change presparams 1-10-09 GKY
5529 SetPresParams(hwndDrivelist,
5530 NULL, NULL, NULL, FNT_10SYSTEMMONOTEXT);
5531 hwndButtonlist = WinCreateWindow(hwndFrame,
5532 WC_COMBOBOX,
5533 (PSZ) NULL,
5534 WS_VISIBLE | CBS_DROPDOWN |
5535 LS_HORZSCROLL,
5536 (swp.cx -
5537 WinQuerySysValue(HWND_DESKTOP,
5538 SV_CXSIZEBORDER)) -
5539 164L,
5540 (swp.cy -
5541 WinQuerySysValue(HWND_DESKTOP,
5542 SV_CYSIZEBORDER)) - 60,
5543 164L, 60L, hwndFrame, HWND_TOP,
5544 MAIN_BUTTONLIST, NULL, NULL);
5545 if (!hwndButtonlist)
5546 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__,
5547 PCSZ_WINCREATEWINDOW);
5548 WinSendMsg(WinWindowFromID(hwndUserlist, CBID_EDIT),
5549 EM_SETTEXTLIMIT, MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
5550 WinSendMsg(WinWindowFromID(hwndStatelist, CBID_EDIT),
5551 EM_SETTEXTLIMIT, MPFROM2SHORT(STATE_NAME_MAX_BYTES, 0), MPVOID);
5552 WinSendMsg(WinWindowFromID(hwndDrivelist, CBID_EDIT),
5553 EM_SETREADONLY, MPFROM2SHORT(TRUE, 0), MPVOID);
5554 WinSendMsg(WinWindowFromID(hwndButtonlist, CBID_EDIT),
5555 EM_SETREADONLY, MPFROM2SHORT(TRUE, 0), MPVOID);
5556 WinSendMsg(WinWindowFromID(hwndCmdlist, CBID_EDIT),
5557 EM_SETREADONLY, MPFROM2SHORT(TRUE, 0), MPVOID);
5558
5559 oldproc = WinSubclassWindow(WinWindowFromID(hwndUserlist, CBID_EDIT),
5560 DropDownListProc);
5561 WinSetWindowPtr(WinWindowFromID(hwndUserlist, CBID_EDIT),
5562 QWL_USER, (PVOID) oldproc);
5563 oldproc = WinSubclassWindow(WinWindowFromID(hwndCmdlist, CBID_EDIT),
5564 DropDownListProc);
5565 WinSetWindowPtr(WinWindowFromID(hwndCmdlist, CBID_EDIT),
5566 QWL_USER, (PVOID) oldproc);
5567 oldproc = WinSubclassWindow(WinWindowFromID(hwndButtonlist, CBID_EDIT),
5568 DropDownListProc);
5569 WinSetWindowPtr(WinWindowFromID(hwndButtonlist, CBID_EDIT),
5570 QWL_USER, (PVOID) oldproc);
5571 oldproc = WinSubclassWindow(WinWindowFromID(hwndStatelist, CBID_EDIT),
5572 DropDownListProc);
5573 WinSetWindowPtr(WinWindowFromID(hwndStatelist, CBID_EDIT),
5574 QWL_USER, (PVOID) oldproc);
5575 oldproc = WinSubclassWindow(WinWindowFromID(hwndDrivelist, CBID_EDIT),
5576 DropDownListProc);
5577 WinSetWindowPtr(WinWindowFromID(hwndDrivelist, CBID_EDIT),
5578 QWL_USER, (PVOID) oldproc);
5579 oldproc = WinSubclassWindow(hwndUserlist, DropDownListProc);
5580 WinSetWindowPtr(hwndUserlist, QWL_USER, (PVOID) oldproc);
5581 oldproc = WinSubclassWindow(hwndCmdlist, DropDownListProc);
5582 WinSetWindowPtr(hwndCmdlist, QWL_USER, (PVOID) oldproc);
5583 oldproc = WinSubclassWindow(hwndStatelist, DropDownListProc);
5584 WinSetWindowPtr(hwndStatelist, QWL_USER, (PVOID) oldproc);
5585 oldproc = WinSubclassWindow(hwndDrivelist, DropDownListProc);
5586 WinSetWindowPtr(hwndDrivelist, QWL_USER, (PVOID) oldproc);
5587 oldproc = WinSubclassWindow(hwndButtonlist, DropDownListProc);
5588 WinSetWindowPtr(hwndButtonlist, QWL_USER, (PVOID) oldproc);
5589 oldproc = WinSubclassWindow(WinWindowFromID(hwndFrame, IDM_USERLIST),
5590 ChildFrameButtonProc);
5591 WinSetWindowPtr(WinWindowFromID(hwndFrame, IDM_USERLIST),
5592 QWL_USER, (PVOID) oldproc);
5593 oldproc = WinSubclassWindow(WinWindowFromID(hwndFrame, IDM_OPENWALK),
5594 ChildFrameButtonProc);
5595 WinSetWindowPtr(WinWindowFromID(hwndFrame, IDM_OPENWALK),
5596 QWL_USER, (PVOID) oldproc);
5597 hwndMenu = WinWindowFromID(hwndFrame, FID_MENU);
5598 WinSendMsg(hwnd, UM_ADDTOMENU, MPVOID, MPVOID);
5599 SetToggleChecks(hwndMenu);
5600 CfgMenuInit(hwndMenu, FALSE); // 14 Feb 08 SHL
5601 SetConditionalCascade(hwndMenu, IDM_COMMANDLINESUBMENU, IDM_COMMANDLINE);
5602 if (fProtectOnly) {
5603 WinEnableMenuItem(hwndMenu, IDM_DOSCOMMANDLINE, FALSE);
5604 WinEnableMenuItem(hwndMenu, IDM_WINFULLSCREEN, FALSE);
5605 }
5606 SetConditionalCascade(hwndMenu, IDM_TOOLSUBMENU, IDM_TOOLBAR);
5607 SetConditionalCascade(hwndMenu, IDM_AUTOVIEWSUBMENU, IDM_AUTOVIEW);
5608 SetConditionalCascade(hwndMenu, IDM_TILEMENU, IDM_TILE);
5609 WinSetWindowULong(hwnd, QWL_USER, hwndMenu);
5610 memset(&mi, 0, sizeof(mi));
5611 memset(&mit, 0, sizeof(mit));
5612 hwndSysMenu = WinWindowFromID(hwndFrame, FID_SYSMENU);
5613 idSysMenu = SHORT1FROMMR(WinSendMsg(hwndSysMenu,
5614 MM_ITEMIDFROMPOSITION,
5615 MPVOID, MPVOID));
5616 WinSendMsg(hwndSysMenu,
5617 MM_QUERYITEM, MPFROM2SHORT(idSysMenu, 0), MPFROMP(&mit));
5618 hwndSysSubMenu = mit.hwndSubMenu;
5619 mi.iPosition = MIT_END;
5620 mi.afStyle = MIS_SEPARATOR;
5621 mi.id = (USHORT) - 1;
5622 WinSendMsg(hwndSysSubMenu, MM_INSERTITEM, MPFROMP(&mi), MPFROMP(NULL));
5623 mi.afStyle = MIS_TEXT;
5624 mi.id = IDM_IDEALSIZE;
5625 WinSendMsg(hwndSysSubMenu,
5626 MM_INSERTITEM,
5627 MPFROMP(&mi), MPFROMP(GetPString(IDS_IDEALMENUTEXT)));
5628 mi.afStyle = MIS_TEXT;
5629 mi.id = IDM_HIDEMENU;
5630 WinSendMsg(hwndSysSubMenu,
5631 MM_INSERTITEM,
5632 MPFROMP(&mi), MPFROMP(GetPString(IDS_HIDEMENUTEXT)));
5633 SetSysMenu(hwndSysMenu);
5634
5635 size = sizeof(BOOL);
5636 if (PrfQueryProfileData(fmprof,
5637 FM3Str,
5638 "MenuInvisible", &temp, &size) && size && temp)
5639 WinSendMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_HIDEMENU, 0), MPVOID);
5640 size = sizeof(BOOL);
5641 if (PrfQueryProfileData(fmprof,
5642 FM3Str, "FreeTree", &temp, &size) && size && temp)
5643 WinSendMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_FREETREE, 0), MPVOID);
5644 size = sizeof(BOOL);
5645 if (PrfQueryProfileData(fmprof,
5646 FM3Str,
5647 "AutoTile", &temp, &size) && size && !temp)
5648 WinSendMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_AUTOTILE, 0), MPVOID);
5649 size = sizeof(BOOL);
5650 if (PrfQueryProfileData(fmprof,
5651 FM3Str, "Toolbar", &temp, &size) && size && !temp)
5652 WinSendMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_TOOLBAR, 0), MPVOID);
5653
5654 WinSetWindowText(WinWindowFromID(hwndFrame, FID_TITLEBAR), "FM/2");
5655 FixSwitchList(hwndFrame, NULL);
5656 break; // WM_CREATE
5657
5658 case UM_SETUP:
5659 /*
5660 * start up some initial children
5661 */
5662 WinShowWindow(WinQueryWindow(hwnd, QW_PARENT), TRUE);
5663 PostMsg(MainObjectHwnd, UM_SETUP2, mp1, mp2);
5664 return 0;
5665
5666 case UM_SETUP2:
5667 {
5668 SWP swp;
5669 ULONG size = sizeof(SWP);
5670
5671 WinQueryWindowPos(hwnd, &swp);
5672 hwndTree = StartTreeCnr(hwnd, 4);
5673 if (!hwndTree)
5674 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
5675 else {
5676 if (!fSaveState ||
5677 !PrfQueryProfileData(fmprof,
5678 FM3Str,
5679 "LastTreePos",
5680 &swp, &size) || size != sizeof(SWP)) {
5681
5682 INT ratio, height = 0;
5683
5684 if (!fNoTreeGap)
5685 height = WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 2;
5686 size = sizeof(ratio);
5687 if (!PrfQueryProfileData(fmprof,
5688 FM3Str,
5689 "TreeWindowRatio",
5690 (PVOID) & ratio,
5691 &size) || size < sizeof(ratio))
5692 ratio = 400;
5693 WinSetWindowPos(hwndTree,
5694 HWND_TOP,
5695 0,
5696 height,
5697 (swp.cx * 100) / ratio,
5698 swp.cy - height,
5699 SWP_SHOW | SWP_SIZE | SWP_MOVE |
5700 SWP_ACTIVATE | SWP_ZORDER);
5701 }
5702 else
5703 WinSetWindowPos(hwndTree,
5704 HWND_TOP,
5705 swp.x,
5706 swp.y,
5707 swp.cx,
5708 swp.cy,
5709 swp.fl | SWP_MOVE | SWP_SIZE | SWP_SHOW |
5710 SWP_ZORDER | SWP_ACTIVATE);
5711 }
5712// ResizeTools(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
5713// MAIN_TOOLS));
5714 }
5715 PostMsg(MainObjectHwnd, UM_SETUP3, mp1, mp2);
5716 return 0;
5717
5718 case UM_SETUP3:
5719 /* start remaining child windows */
5720 if (!fNoSaveState && fSaveState) {
5721 PCSZ pszStatename = PCSZ_SHUTDOWNSTATE;
5722 PostMsg(MainObjectHwnd, UM_RESTORE, MPFROMP(pszStatename), MPVOID);
5723 if (!add_setup(pszStatename))
5724 save_setups();
5725 } else {
5726 load_tools(NULL);
5727 PostMsg(hwndToolback, UM_SETUP2, MPVOID, MPVOID);
5728 }
5729 PostMsg(MainObjectHwnd, UM_SETUP4, mp1, mp2);
5730 return 0;
5731
5732 case UM_SETUP4:
5733 {
5734 INT argc = (INT) mp1, x;
5735 CHAR **argv = (CHAR **) mp2;
5736
5737 for (x = 1; x < argc; x++) {
5738 if (*argv[x] == '/' || *argv[x] == ';')
5739 continue;
5740 if (!IsFile(argv[x]) && !FindDirCnrByName(argv[x], FALSE)) {
5741 OpenDirCnr((HWND) 0, hwndMain, hwndTree, TRUE, argv[x]);
5742 }
5743 }
5744 }
5745 PostMsg(MainObjectHwnd, UM_SETUP5, MPVOID, MPVOID);
5746 return 0;
5747
5748 case UM_SETUP5:
5749// if (fAutoTile)
5750// TileChildren(hwnd, TRUE);
5751 PostMsg(hwnd, UM_FILLUSERLIST, MPVOID, MPVOID);
5752 PostMsg(hwnd, UM_FILLSETUPLIST, MPVOID, MPVOID);
5753 PostMsg(hwnd, UM_FILLCMDLIST, MPVOID, MPVOID);
5754 PostMsg(hwnd, UM_FILLBUTTONLIST, MPVOID, MPVOID);
5755 {
5756 HWND hwndActive;
5757
5758 hwndActive = TopWindow(hwnd, hwndTree);
5759 if (hwndActive)
5760 WinSetWindowPos(hwndActive, HWND_TOP, 0, 0, 0, 0, SWP_ACTIVATE);
5761 }
5762 if (fStartMinimized || fReminimize)
5763 PostMsg(hwndTree, UM_MINIMIZE, MPVOID, MPVOID);
5764 else if (fStartMaximized)
5765 PostMsg(hwndTree, UM_MAXIMIZE, MPVOID, MPVOID);
5766 fRunning = TRUE;
5767 if (fWantFirstTimeInit) {
5768 fWantFirstTimeInit = FALSE;
5769 PostMsg(hwnd, WM_COMMAND, MPFROMLONG(IDM_QUICKSETTINGS), MPVOID);
5770 }
5771 return 0;
5772 }
5773
5774 return WinDefWindowProc(hwnd, msg, mp1, mp2);
5775}
5776
5777MRESULT EXPENTRY MainWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
5778{
5779 switch (msg) {
5780 case WM_CREATE:
5781# ifdef FORTIFY
5782 Fortify_EnterScope();
5783# endif
5784 case UM_SETUP:
5785 case UM_SETUP2:
5786 case UM_SETUP3:
5787 case UM_SETUP4:
5788 case UM_SETUP5:
5789 return MainWMOnce(hwnd, msg, mp1, mp2);
5790
5791 case WM_CONTROLPOINTER:
5792 if (!fNoFinger &&
5793 (SHORT1FROMMP(mp1) == IDM_OPENWALK ||
5794 SHORT1FROMMP(mp1) == IDM_USERLIST))
5795 return MRFROMLONG(hptrFinger);
5796 break;
5797
5798 case UM_LOADFILE:
5799 case UM_THREADUSE:
5800 case UM_BUILDDRIVEBAR:
5801 return CommonMainWndProc(hwnd, msg, mp1, mp2);
5802
5803 case WM_BUTTON1UP:
5804 case WM_BUTTON2UP:
5805 case WM_BUTTON3UP:
5806 case WM_MOUSEMOVE:
5807 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
5808 break;
5809
5810 case WM_CHAR:
5811 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
5812 break;
5813
5814 case WM_MENUEND:
5815 if ((HWND) mp2 == MainPopupMenu) {
5816 WinDestroyWindow(MainPopupMenu);
5817 MainPopupMenu = (HWND) 0;
5818 }
5819 break;
5820
5821 case UM_CONTEXTMENU:
5822 case WM_CONTEXTMENU:
5823 if (CheckMenu(hwndMainMenu, &MainPopupMenu, MAIN_POPUP)) {
5824 SetToggleChecks(MainPopupMenu);
5825 PopupMenu(hwnd, hwnd, MainPopupMenu);
5826 }
5827 if (msg == UM_CONTEXTMENU)
5828 return 0;
5829 return MRFROMSHORT(TRUE);
5830
5831 case UM_SETUSERLISTNAME:
5832 if (mp1) {
5833 if (fUserComboBox)
5834 WinSetWindowText(WinWindowFromID(hwndUserlist, CBID_EDIT),
5835 (CHAR *)mp1);
5836 if (add_udir(FALSE, (CHAR *)mp1)) {
5837 if (fUserComboBox && fAutoAddDirs) {
5838 WinSendMsg(hwndUserlist, LM_INSERTITEM,
5839 MPFROM2SHORT(LIT_SORTASCENDING, 0),
5840 MPFROMP((CHAR *)mp1));
5841 }
5842 }
5843 }
5844 return 0;
5845
5846 case UM_ARRANGEICONS:
5847 ArrangeIcons(hwnd);
5848 return 0;
5849
5850 case WM_CHORD:
5851 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_WINDOWDLG, 0), MPVOID);
5852 break;
5853
5854 case WM_SETFOCUS:
5855 if (mp2)
5856 PostMsg(hwnd, UM_FOCUSME, MPVOID, MPVOID);
5857 break;
5858
5859 case UM_FOCUSME:
5860 WinSetFocus(hwndTree, TRUE);
5861 return 0;
5862
5863 case UM_RESCAN:
5864 TileChildren(hwnd, TRUE);
5865 return 0;
5866
5867 case WM_SAVEAPPLICATION:
5868 {
5869 SWP swp;
5870
5871 WinQueryWindowPos(WinQueryWindow(hwnd, QW_PARENT), &swp);
5872 if (!(swp.fl & (SWP_HIDE | SWP_MINIMIZE))) {
5873 WinStoreWindowPos(FM2Str,
5874 "MainWindowPos", WinQueryWindow(hwnd, QW_PARENT));
5875 if (!fNoSaveState && fSaveState)
5876 SaveDirCnrState(hwnd, PCSZ_SHUTDOWNSTATE);
5877 }
5878 }
5879 break;
5880
5881 case MM_PORTHOLEINIT:
5882 switch (SHORT1FROMMP(mp1)) {
5883 case 0:
5884 case 1:
5885 {
5886 HWND hwndCurrent;
5887 ULONG wmsg;
5888
5889 wmsg = (SHORT1FROMMP(mp1) == 0) ? UM_FILESMENU : UM_VIEWSMENU;
5890 hwndCurrent = TopWindow(hwnd, (HWND) 0);
5891 PortholeInit((HWND) WinSendMsg(WinWindowFromID(hwndCurrent,
5892 FID_CLIENT), wmsg,
5893 MPVOID, MPVOID), mp1, mp2);
5894 }
5895 break;
5896 }
5897 break;
5898
5899 case WM_INITMENU:
5900 switch (SHORT1FROMMP(mp1)) {
5901 case IDM_CONFIGMENU:
5902 SetToggleChecks((HWND) WinQueryWindowULong(hwnd, QWL_USER));
5903 break;
5904
5905 case IDM_WINDOWSMENU:
5906 /*
5907 * add child windows of client
5908 * and switchlist entries to end of pulldown menu
5909 */
5910 {
5911 HWND hwndMenu, hwndSubMenu;
5912 MENUITEM mi;
5913
5914 hwndMenu = WinQueryWindowULong(hwnd, QWL_USER);
5915 memset(&mi, 0, sizeof(mi));
5916 mi.iPosition = MIT_END;
5917 mi.afStyle = MIS_TEXT;
5918 if (!WinSendMsg(hwndMenu, MM_QUERYITEM,
5919 MPFROM2SHORT(IDM_WINDOWSMENU, TRUE), MPFROMP(&mi)))
5920 break;
5921 hwndSubMenu = mi.hwndSubMenu;
5922 SetupWinList(hwndSubMenu, hwnd, WinQueryWindow(hwnd, QW_PARENT));
5923 }
5924 break;
5925
5926 default:
5927 {
5928 HWND hwndCurrent;
5929
5930 hwndCurrent = TopWindow(hwnd, (HWND) 0);
5931 if (hwndCurrent)
5932 WinSendMsg(hwndCurrent, UM_INITMENU, mp1, mp2);
5933 }
5934 break;
5935 }
5936 break;
5937
5938 case UM_ADDTOMENU:
5939 AddToMenu((CHAR *)mp1, WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
5940 FID_MENU));
5941 return 0;
5942
5943 case UM_FILLCMDLIST:
5944 WinSendMsg(hwndCmdlist, LM_DELETEALL, MPVOID, MPVOID);
5945 if (!cmdloaded)
5946 load_commands();
5947 if (cmdhead) {
5948
5949 LINKCMDS *info;
5950
5951 info = cmdhead;
5952 while (info) {
5953 WinSendMsg(hwndCmdlist, LM_INSERTITEM,
5954 MPFROM2SHORT(LIT_END, 0), MPFROMP(info->title));
5955 info = info->next;
5956 }
5957 }
5958 return 0;
5959
5960 case UM_FILLSETUPLIST:
5961 fill_setups_list();
5962 return 0;
5963
5964 case UM_FILLBUTTONLIST:
5965 WinSendMsg(hwndButtonlist, LM_DELETEALL, MPVOID, MPVOID);
5966 if (fUserComboBox) {
5967
5968 BOOL foundit = FALSE, thisone;
5969 ULONG ulSearchCount;
5970 SHORT sSelect;
5971 FILEFINDBUF3 findbuf;
5972 HDIR hDir;
5973 CHAR *p;
5974
5975 DosError(FERR_DISABLEHARDERR);
5976 hDir = HDIR_CREATE;
5977 ulSearchCount = 1;
5978 if (!DosFindFirst("*.TLS", &hDir, FILE_READONLY | FILE_ARCHIVED,
5979 &findbuf, sizeof(FILEFINDBUF3),
5980 &ulSearchCount, FIL_STANDARD)) {
5981 do {
5982 priority_bumped();
5983 if (!foundit) {
5984 thisone = FALSE;
5985 p = strrchr(lasttoolbar, '\\');
5986 if (!p)
5987 p = lasttoolbar;
5988 else
5989 p++;
5990 if (!stricmp(findbuf.achName, p))
5991 thisone = TRUE;
5992 }
5993 p = strrchr(findbuf.achName, '.');
5994 if (p)
5995 *p = 0;
5996 sSelect = (SHORT) WinSendMsg(hwndButtonlist, LM_INSERTITEM,
5997 MPFROM2SHORT(LIT_SORTASCENDING, 0),
5998 MPFROMP(findbuf.achName));
5999 if (!foundit && thisone && sSelect >= 0) {
6000 WinSendMsg(hwndButtonlist, LM_SELECTITEM,
6001 MPFROM2SHORT(sSelect, 0), MPFROMLONG(TRUE));
6002 foundit = TRUE;
6003 }
6004 }
6005 while (!DosFindNext(hDir, &findbuf, sizeof(FILEFINDBUF3),
6006 &ulSearchCount));
6007 DosFindClose(hDir);
6008 priority_bumped();
6009 }
6010 WinSetWindowText(hwndButtonlist, GetPString(IDS_TOOLBARTEXT));
6011 }
6012 return 0;
6013
6014 case UM_FILLUSERLIST:
6015 WinSendMsg(hwndUserlist, LM_DELETEALL, MPVOID, MPVOID);
6016 if (fUserComboBox) {
6017 ULONG ulDriveNum;
6018 ULONG ulDriveMap;
6019 ULONG ulSearchCount;
6020 FILEFINDBUF3 findbuf;
6021 HDIR hDir;
6022 APIRET rc;
6023 LINKDIRS *info;
6024 LINKDIRS *temp;
6025
6026 if (!loadedudirs)
6027 load_udirs();
6028 DosError(FERR_DISABLEHARDERR);
6029 DosQCurDisk(&ulDriveNum, &ulDriveMap);
6030 info = udirhead;
6031 while (info) {
6032 if (IsFullName(info->path) &&
6033 !(driveflags[toupper(*info->path) - 'A'] &
6034 (DRIVE_IGNORE | DRIVE_INVALID))) {
6035 DosError(FERR_DISABLEHARDERR);
6036 hDir = HDIR_CREATE;
6037 ulSearchCount = 1;
6038 if (!IsRoot(info->path))
6039 rc = DosFindFirst(info->path, &hDir, FILE_DIRECTORY |
6040 MUST_HAVE_DIRECTORY | FILE_READONLY |
6041 FILE_ARCHIVED | FILE_SYSTEM | FILE_HIDDEN,
6042 &findbuf, sizeof(FILEFINDBUF3),
6043 &ulSearchCount, FIL_STANDARD);
6044 else {
6045 rc = 0;
6046 findbuf.attrFile = FILE_DIRECTORY;
6047 }
6048 priority_bumped();
6049 if (!rc) {
6050 if (!IsRoot(info->path))
6051 DosFindClose(hDir);
6052 if (findbuf.attrFile & FILE_DIRECTORY)
6053 WinSendMsg(hwndUserlist, LM_INSERTITEM,
6054 MPFROM2SHORT(LIT_SORTASCENDING, 0),
6055 MPFROMP(info->path));
6056 else {
6057 temp = info->next;
6058 remove_udir(info->path);
6059 info = temp;
6060 continue;
6061 }
6062 }
6063 else if (!(ulDriveMap & (1 << (toupper(*info->path) - 'A')))) {
6064 temp = info->next;
6065 remove_udir(info->path);
6066 info = temp;
6067 continue;
6068 }
6069 }
6070 info = info->next;
6071 }
6072 info = ldirhead;
6073 while (info) {
6074 if (IsFullName(info->path) &&
6075 !(driveflags[toupper(*info->path) - 'A'] &
6076 (DRIVE_IGNORE | DRIVE_INVALID))) {
6077 DosError(FERR_DISABLEHARDERR);
6078 hDir = HDIR_CREATE;
6079 ulSearchCount = 1;
6080 if (!IsRoot(info->path))
6081 rc = DosFindFirst(info->path, &hDir, FILE_DIRECTORY |
6082 MUST_HAVE_DIRECTORY | FILE_READONLY |
6083 FILE_ARCHIVED | FILE_SYSTEM | FILE_HIDDEN,
6084 &findbuf, sizeof(FILEFINDBUF3),
6085 &ulSearchCount, FIL_STANDARD);
6086 else {
6087 rc = 0;
6088 findbuf.attrFile = FILE_DIRECTORY;
6089 }
6090 priority_bumped();
6091 if (!rc) {
6092 if (!IsRoot(info->path))
6093 DosFindClose(hDir);
6094 if (findbuf.attrFile & FILE_DIRECTORY)
6095 WinSendMsg(hwndUserlist, LM_INSERTITEM,
6096 MPFROM2SHORT(LIT_SORTASCENDING, 0),
6097 MPFROMP(info->path));
6098 else {
6099 temp = info->next;
6100 remove_udir(info->path);
6101 info = temp;
6102 continue;
6103 }
6104 }
6105 else if (!(ulDriveMap & (1 << (toupper(*info->path) - 'A')))) {
6106 temp = info->next;
6107 remove_udir(info->path);
6108 info = temp;
6109 continue;
6110 }
6111 }
6112 info = info->next;
6113 }
6114 WinSendMsg(hwndUserlist, LM_INSERTITEM,
6115 MPFROM2SHORT(0, 0),
6116 MPFROMP(GetPString(IDS_NEWDIRECTORYTEXT)));
6117 WinSetWindowText(hwndUserlist, GetPString(IDS_COMMONDIRTEXT));
6118 }
6119 return 0;
6120
6121 case UM_SIZE:
6122 if (fAutoTile)
6123 TileChildren(hwnd, FALSE);
6124 else
6125 MoveChildrenAwayFromTree(hwnd);
6126 return 0;
6127
6128 case WM_SIZE:
6129 ResizeChildren(hwnd, SHORT1FROMMP(mp1), SHORT2FROMMP(mp1),
6130 SHORT1FROMMP(mp2), SHORT2FROMMP(mp2));
6131 break;
6132
6133 case WM_ERASEBACKGROUND:
6134 WinFillRect((HPS) mp1, (PRECTL) mp2, 0x00d0d0d0);
6135 return 0;
6136
6137 case WM_PAINT:
6138 {
6139 HPS hps;
6140 RECTL rcl;
6141
6142 hps = WinBeginPaint(hwnd, (HPS) 0, NULL);
6143 if (hps) {
6144 WinQueryWindowRect(hwnd, &rcl);
6145 WinFillRect(hps, &rcl, CLR_PALEGRAY);
6146 WinEndPaint(hps);
6147 }
6148 }
6149 break;
6150
6151 case UM_CONTROL:
6152 switch (SHORT1FROMMP(mp1)) {
6153 case MAIN_CMDLIST:
6154 case MAIN_SETUPLIST:
6155 case MAIN_DRIVELIST:
6156 case MAIN_USERLIST:
6157 case MAIN_BUTTONLIST:
6158 switch (SHORT2FROMMP(mp1)) {
6159 case CBN_ENTER:
6160 {
6161 HWND hwndUL = WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
6162 SHORT1FROMMP(mp1));
6163 CHAR path[CCHMAXPATH];
6164 ULONG ul;
6165
6166 switch (SHORT1FROMMP(mp1)) {
6167 case MAIN_USERLIST:
6168 ul = CCHMAXPATH;
6169 break;
6170 case MAIN_SETUPLIST:
6171 ul = STATE_NAME_MAX_BYTES;
6172 break;
6173 default:
6174 ul = 13; // fixme to not be hardcoded
6175 }
6176
6177 SetShiftState();
6178 WinQueryWindowText(WinWindowFromID(hwndUL, CBID_EDIT), ul, path);
6179 bstrip(path);
6180 if (*path) {
6181 if (SHORT1FROMMP(mp1) == MAIN_USERLIST) {
6182 if (!strcmp(path, GetPString(IDS_NEWDIRECTORYTEXT))) {
6183 if (!LastDir ||
6184 !WinSendMsg(WinQueryWindow(LastDir, QW_PARENT),
6185 UM_CONTAINERDIR, MPFROMP(path), MPVOID))
6186 strcpy(path, pFM2SaveDirectory);
6187 if (!PMMkDir(hwnd, path, TRUE)) {
6188 WinSetWindowText(hwndUL, GetPString(IDS_COMMONDIRTEXT));
6189 break;
6190 }
6191 }
6192 if (!IsFile(path) && !FindDirCnrByName(path, TRUE)) {
6193
6194 HWND hwndDir;
6195
6196 if ((fUserListSwitches &&
6197 !(shiftstate & KC_SHIFT)) ||
6198 (!fUserListSwitches && (shiftstate & KC_SHIFT))) {
6199 hwndDir = FindDirCnr(hwnd);
6200 if (hwndDir) {
6201 WinSendMsg(LastDir, UM_SETDIR, MPFROMP(path), MPVOID);
6202 break;
6203 }
6204 }
6205 OpenDirCnr((HWND) 0, hwndMain, hwndTree, FALSE, path);
6206 }
6207 }
6208 else if (SHORT1FROMMP(mp1) == MAIN_DRIVELIST) {
6209 ShowTreeRec(WinWindowFromID(WinWindowFromID(hwndTree,
6210 FID_CLIENT),
6211 TREE_CNR), path, FALSE, TRUE);
6212 WinSetFocus(HWND_DESKTOP, hwndTree);
6213 }
6214 else if (SHORT1FROMMP(mp1) == MAIN_BUTTONLIST) {
6215 strcat(path, PCSZ_DOTTLS);
6216 load_tools(path);
6217 PrfWriteProfileString(fmprof,
6218 FM3Str, "LastToolbar", lasttoolbar);
6219 PostMsg(hwndToolback, UM_SETUP2, MPVOID, MPVOID);
6220 WinSetWindowText(hwndButtonlist, GetPString(IDS_TOOLBARTEXT));
6221 }
6222 else if (SHORT1FROMMP(mp1) == MAIN_SETUPLIST) {
6223 CHAR szKey[80];
6224 ULONG size, numsaves = 0;
6225
6226 SetShiftState();
6227 size = sizeof(ULONG);
6228 sprintf(szKey, "%s.NumDirsLastTime", path); // path is state name
6229 if (!PrfQueryProfileData(fmprof,
6230 FM3Str,
6231 szKey,
6232 (PVOID)&numsaves,
6233 &size))
6234 {
6235 if ((WinGetLastError(WinQueryAnchorBlock(hwnd)) & 0xffff) == PMERR_NOT_IN_IDX) {
6236 saymsg(MB_ENTER | MB_ICONASTERISK, hwnd,
6237 GetPString(IDS_WARNINGTEXT),
6238 GetPString(IDS_DOESNTEXISTTEXT), path);
6239 }
6240 else {
6241 Win_Error(hwnd, hwnd, __FILE__, __LINE__,
6242 PCSZ_INIQUERYPRFTEXT);
6243 }
6244 }
6245 else {
6246 char *pszStateName;
6247 if ((shiftstate & KC_SHIFT) == 0)
6248 PostMsg(MainObjectHwnd, UM_RESTORE, MPVOID, MPFROMLONG(2));
6249 pszStateName = xstrdup(path, pszSrcFile, __LINE__);
6250 if (!pszStateName) {
6251 // Fall back if out of memory - already complained
6252 if ((shiftstate & KC_SHIFT) != 0 || fAutoTile) {
6253 // Autotile requested or forced
6254 PostMsg(MainObjectHwnd,
6255 UM_RESTORE,
6256 MPVOID,
6257 MPFROMLONG(1)); // Autotile
6258 }
6259 }
6260 else if (!PostMsg(MainObjectHwnd,
6261 UM_RESTORE,
6262 MPFROMP(pszStateName),
6263 MPVOID)) {
6264 free(pszStateName);
6265 }
6266 }
6267 }
6268 else if (SHORT1FROMMP(mp1) == MAIN_CMDLIST) {
6269
6270 SHORT sSelect;
6271
6272 sSelect = (SHORT) WinSendMsg(hwndCmdlist,
6273 LM_QUERYSELECTION,
6274 MPFROMSHORT(LIT_FIRST), MPVOID);
6275 if (sSelect >= 0)
6276 WinPostMsg(hwnd,
6277 WM_COMMAND,
6278 MPFROM2SHORT(IDM_COMMANDSTART + sSelect, 0),
6279 MPVOID);
6280 WinSetWindowText(hwndCmdlist, GetPString(IDS_COMMANDSTEXT));
6281 }
6282 }
6283 }
6284 break;
6285
6286 default:
6287 break;
6288 }
6289 break;
6290
6291 default:
6292 break;
6293 }
6294 return 0;
6295
6296 case WM_HELP:
6297 WinSendMsg(hwndHelp, HM_HELP_CONTENTS, MPVOID, MPVOID);
6298 break;
6299
6300 case UM_COMMAND:
6301 case WM_COMMAND:
6302
6303 return MainWMCommand(hwnd, msg, mp1, mp2);
6304
6305 case WM_CLOSE:
6306 WinSendMsg(WinQueryWindow(hwnd, QW_PARENT),
6307 WM_SYSCOMMAND, MPFROM2SHORT(SC_RESTORE, 0), MPVOID);
6308 WinSendMsg(hwnd, WM_SAVEAPPLICATION, MPVOID, MPVOID);
6309 fAmClosing = TRUE;
6310 WinSendMsg(WinQueryWindow(hwnd, QW_PARENT),
6311 WM_SYSCOMMAND, MPFROM2SHORT(SC_MINIMIZE, 0), MPVOID);
6312 if (CloseChildren(hwnd)) {
6313 fAmClosing = FALSE;
6314 if (fAutoTile)
6315 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_TILE, 0), MPVOID);
6316 return 0;
6317 }
6318 if (hwndTree) {
6319 if (!PostMsg(hwndTree, WM_CLOSE, MPVOID, MPVOID))
6320 WinSendMsg(hwndTree, WM_CLOSE, MPVOID, MPVOID);
6321 }
6322 DosSleep(1);
6323 return 0; // Hold off WM_QUIT
6324
6325 case UM_CLOSE:
6326 HideNote();
6327 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
6328 return 0;
6329
6330 case UM_RESTORE:
6331 {
6332 // Try to restore saved shutdown state
6333 char *pszDefaultStateName = xstrdup(PCSZ_SHUTDOWNSTATE, pszSrcFile, __LINE__);
6334 if (pszDefaultStateName) {
6335 if (!PostMsg(MainObjectHwnd, UM_RESTORE, MPFROMP(pszDefaultStateName), MPVOID))
6336 // 05 Feb 08 SHL fixme to complain?
6337 free(pszDefaultStateName);
6338 }
6339 }
6340 return 0;
6341
6342 case UM_SETDIR:
6343 /* mp1 == name of directory to open */
6344 if (mp1)
6345 return MRFROMLONG(OpenDirCnr((HWND) 0,
6346 hwndMain,
6347 hwndTree, (BOOL) mp2, (char *)mp1));
6348 return 0;
6349
6350 case WM_DESTROY:
6351# ifdef FORTIFY
6352 DbgMsg(pszSrcFile, __LINE__, "WM_DESTROY hwnd %p TID %u", hwnd, GetTidForThread()); // 22 Jul 08 SHL fixme
6353# endif
6354 hwndMain = (HWND) 0;
6355 if (!PostMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID))
6356 WinSendMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID);
6357# ifdef FORTIFY
6358 free_commands();
6359 free_associations();
6360 free_udirs();
6361 free_ldir();
6362 free_archivers();
6363 free_tools();
6364 free_setups();
6365 Fortify_LeaveScope();
6366# endif
6367 break;
6368 }
6369 return WinDefWindowProc(hwnd, msg, mp1, mp2);
6370}
6371
6372#pragma alloc_text(MISC8,SetToggleChecks,FindDirCnrByName,TopWindow)
6373#pragma alloc_text(MISC8,TopWindowName,CountDirCnrs)
6374#pragma alloc_text(MAINWND,AdjustSizeOfClient,FillClient,ChildButtonProc)
6375#pragma alloc_text(MAINWND,ToolBackProc,StatusProc)
6376#pragma alloc_text(MAINWND,MoveChildrenAwayFromTree,ArrangeIcons,NextChild)
6377#pragma alloc_text(MAINWND,ChildFrameButtonProc)
6378#pragma alloc_text(MAINWND2,CloseChildren,CountChildren,GetNextWindowPos)
6379#pragma alloc_text(MAINWND2,CascadeChildren,TileChildren,ResizeChildren)
6380#pragma alloc_text(MAINWND2,MinResChildren,MainFrameWndProc,MainWndProc)
6381#pragma alloc_text(MAINWND2,DropDownListProc)
6382#pragma alloc_text(MAINWND3,RestoreDirCnrState,SaveDirCnrState)
6383#pragma alloc_text(MAINWND3,CloseDirCnrChildren,TransformSwp)
6384#pragma alloc_text(MAINWND3,ResizeTools,BuildTools,CommandLineProc)
6385#pragma alloc_text(MAINWND4,DriveProc,DriveBackProc,BuildDriveBarButtons,ResizeDrives)
6386#pragma alloc_text(MAINWND4,LEDProc,IdealButtonProc)
6387#pragma alloc_text(MAINWND5,MainWMOnce)
6388#pragma alloc_text(MAINWND6,MainWMCommand)
6389#pragma alloc_text(BUBBLE,MakeBubble,BubbleProc,BubbleHelp)
6390#pragma alloc_text(MAINOBJ,MainObjectWndProc,MakeMainObjWin)
6391
Note: See TracBrowser for help on using the repository browser.