source: trunk/dll/mainwnd.c@ 1400

Last change on this file since 1400 was 1400, checked in by Gregg Young, 17 years ago

Remainder of changes to rename commafmt.h/c (Ticket 28, 82); Additional strings moved to PCSZs in init.c (Ticket 6); Added WriteDetailsSwitches used it and LoadDetailsSwitches to consolidate inline code (Ticket 343, 344)

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