source: trunk/dll/mainwnd.c@ 1443

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

Fixed 2 memory management problems; changes to get FORTIFY build to work again.

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