source: trunk/dll/mainwnd.c@ 1520

Last change on this file since 1520 was 1506, checked in by Gregg Young, 15 years ago

Fixed hang and drive tree rescan failure resulting from event sem not being posted.

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