source: trunk/dll/mainwnd.c@ 1489

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

Initial changes to commands handling. Allows you to reorder commands menu without breaking toolbars and changing hotkeys. Fixes the environment so it is used and so it is deleted if the command is deleted. Allows for user defined bitmaps in toolbars which are named based on the text or the the ID of the command.The new commands.dat will not be usable with earlier versions of FM/2

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