source: trunk/dll/common.c@ 1777

Last change on this file since 1777 was 1777, checked in by Steven Levine, 11 years ago

Rework FM/2 Config menu. Add confirm delete toggle. (Steven)
Rework FM/2 Lite Config menu. Add drag&drop dialog toggle and confirm delete toggles. (Steven)
Correct View, Sort and Filter button initialization. (Steven)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 25.1 KB
Line 
1
2/***********************************************************************
3
4 $Id: common.c 1777 2014-06-13 01:51:31Z stevenhl $
5
6 Common window functions
7
8 Copyright (c) 1993, 1998 M. Kimes
9 Copyright (c) 2001, 2010 Steven H. Levine
10
11 13 Aug 05 SHL Renames
12 22 Jul 06 SHL Check more run time errors
13 15 Aug 06 SHL Use Dos_Error
14 03 Nov 06 SHL Rework thread usage count logic
15 07 Jan 07 GKY Move error strings etc. to string file
16 07 Jan 07 GKY Updated Helv font to vector font Helvetica
17 22 Mar 07 GKY Use QWL_USER
18 30 Mar 07 GKY Remove GetPString for window class names
19 02 Aug 07 SHL Sync with CNRITEM mods
20 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
21 26 Aug 07 SHL Change to DosSleep(0)
22 29 Feb 08 GKY Use xfree where appropriate
23 06 Jul 08 GKY Update delete/undelete to include move to and open XWP trashcan
24 01 Jan 09 GKY Add option to rescan tree container on eject of removable media
25 11 Jan 09 GKY Replace font names in the string file with global set at compile in init.c
26 07 Feb 09 GKY Eliminate Win_Error2 by moving function names to PCSZs used in Win_Error
27 08 Mar 09 GKY Additional strings move to PCSZs in init.c
28 22 Jul 09 GKY Drivebar enhancements add refresh removable, rescan all drives, drive button
29 22 Jul 09 GKY Drivebar enhancements add refresh removable, rescan all drives, drive button
30 loads drive root directory in directory container or expands drive tree
31 and rescans drive in tree container depending on container focus, greyed out
32 inappropriate menu context choices
33 14 Sep 09 SHL Blink thread LEDs while threads working
34 17 JAN 10 GKY Changes to get working with Watcom 1.9 Beta (1/16/10). Mostly cast CHAR CONSTANT * as CHAR *.
35
36***********************************************************************/
37
38#include <stdlib.h>
39#include <string.h>
40#include <ctype.h>
41
42#define INCL_DOS
43#define INCL_DOSERRORS
44#define INCL_WIN
45#define INCL_GPI
46#define INCL_LONGLONG // dircnrs.h
47
48#include "fm3dll.h"
49#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
50#include "mainwnd2.h" // Data declaration(s)
51#include "killproc.h" // Data declaration(s)
52#include "collect.h" // Data declaration(s)
53#include "grep.h" // Data declaration(s)
54#include "dircnrs.h" // Data declaration(s)
55#include "notebook.h" // Data declaration(s)
56#include "inis.h" // Data declaration(s)
57#include "init.h" // Data declaration(s)
58#include "treecnr.h" // Data declaration(s)
59#include "fm3dlg.h"
60#include "fm3str.h"
61#include "mle.h"
62#include "filldir.h" // RemoveCnrItems
63#include "errutil.h" // Dos_Error...
64#include "strutil.h" // GetPString
65#include "autoview.h" // AutoViewProc
66#include "mainwnd.h" // BuildDriveBarButtons, GetNextWindowPos, TopWindow
67#include "common.h"
68#include "dirsize.h" // DirSizeProc
69#include "info.h" // DrvInfoProc, SetDrvProc
70#include "seeall.h" // StartSeeAll
71#include "misc.h" // Broadcast
72#include "valid.h" // CheckDrive
73#include "mkdir.h" // PMMkDir
74#include "presparm.h" // SetPresParams
75#include "undel.h" // UndeleteDlgProc
76#include "systemf.h" // runemf2
77#include "wrappers.h" // xfree
78#include "fortify.h"
79
80// Data definitions
81#pragma data_seg(DATA1)
82static PSZ pszSrcFile = __FILE__;
83static HWND hwndLED;
84static HWND hwndLEDHdr;
85
86#pragma data_seg(GLOBAL1)
87HWND hwndBack;
88
89MRESULT EXPENTRY CommonFrameWndProc(USHORT id,
90 HWND hwnd,
91 ULONG msg, MPARAM mp1, MPARAM mp2)
92{
93 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
94
95 switch (msg) {
96 case UM_TIMER:
97 case UM_ACTION:
98 case UM_SHOWME:
99 case UM_OPENWINDOWFORME:
100 case UM_MINIMIZE:
101 case UM_MAXIMIZE:
102 case UM_CONTAINERDIR:
103 case UM_FILTER:
104 case UM_INITMENU:
105 case UM_COMMAND:
106 case UM_UPDATERECORD:
107 case UM_UPDATERECORDLIST:
108 case WM_COMMAND:
109 case MM_PORTHOLEINIT:
110 case WM_INITMENU:
111 case UM_CONTAINER_FILLED:
112 case UM_FILESMENU:
113 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
114
115 case UM_CONTEXTMENU:
116 PostMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
117 return 0;
118
119 case UM_CONTAINERHWND:
120 return MRFROMLONG(WinWindowFromID(hwnd, id));
121
122 case DM_DROP:
123 case DM_DRAGOVER:
124 case DM_DRAGLEAVE:
125 case DM_DROPHELP:
126 {
127 CNRDRAGINFO cnd;
128 USHORT dcmd;
129
130 switch (msg) {
131 case DM_DROP:
132 dcmd = CN_DROP;
133 break;
134 case DM_DRAGOVER:
135 dcmd = CN_DRAGOVER;
136 break;
137 case DM_DRAGLEAVE:
138 dcmd = CN_DRAGLEAVE;
139 break;
140 case DM_DROPHELP:
141 dcmd = CN_DROPHELP;
142 break;
143 }
144 cnd.pDragInfo = (PDRAGINFO) mp1;
145 cnd.pRecord = NULL;
146 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT),
147 WM_CONTROL, MPFROM2SHORT(id, dcmd), MPFROMP(&cnd));
148 }
149
150 case UM_RESCAN:
151 if (fAutoTile &&
152 !fAmClosing && !fNoTileUpdate && !ParentIsDesktop(hwnd, (HWND) 0))
153 PostMsg(WinQueryWindow(hwnd, QW_PARENT), UM_RESCAN, MPVOID, MPVOID);
154 return 0;
155
156 case WM_MINMAXFRAME:
157 {
158 PSWP pswp = (PSWP) mp1;
159 MRESULT rc;
160
161 rc = oldproc(hwnd, msg, mp1, mp2);
162 if (pswp->fl & (SWP_MINIMIZE | SWP_HIDE | SWP_RESTORE))
163 WinSendMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
164 return rc;
165 }
166
167 case WM_DESTROY:
168 WinSendMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
169 break;
170 }
171 return oldproc(hwnd, msg, mp1, mp2);
172}
173
174MRESULT EXPENTRY CommonTextProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
175{
176 switch (msg) {
177 case WM_CREATE:
178 {
179 MRESULT rc;
180
181 rc = PFNWPStatic(hwnd, msg, mp1, mp2);
182 // 2014-06-11 SHL
183 switch (WinQueryWindowUShort(hwnd, QWS_ID)) {
184 case DIR_SORT:
185 case DIR_VIEW:
186 case DIR_FILTER:
187 //fixme to allow user to change presparams 1-10-09 GKY
188 SetPresParams(hwnd, &RGBGREY, &RGBBLACK, &RGBBLACK, FNT_8HELVETICA);
189 return rc;
190 }
191 }
192 } // switch msg
193 return PFNWPStatic(hwnd, msg, mp1, mp2);
194}
195
196void CommonTextPaint(HWND hwnd, HPS hps)
197{
198 int x;
199 USHORT ids[] = { DIR_FOLDERICON, DIR_TOTALS, DIR_SELECTED, DIR_VIEW,
200 DIR_FILTER, DIR_SORT, DIR_MAX, 0
201 };
202 BOOL bools[] = { TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE };
203
204 for (x = 0; ids[x]; x++) {
205 if (WinWindowFromID(hwnd, ids[x]) != (HWND) 0)
206 PaintRecessedWindow(WinWindowFromID(hwnd, ids[x]), hps,
207 bools[x], FALSE);
208 }
209}
210
211void CommonCreateTextChildren(HWND hwnd, PCSZ class, USHORT * ids)
212{
213 int x;
214 CHAR s[33];
215 ULONG attrs;
216 HWND hwndTmp;
217
218 if (!hwnd || !class || !ids) {
219 Runtime_Error(pszSrcFile, __LINE__, NULL);
220 return;
221 }
222
223 for (x = 0; ids[x]; x++) {
224 *s = 0;
225 switch (ids[x]) {
226 case DIR_SORT:
227 case DIR_FILTER:
228 case DIR_VIEW:
229 attrs = SS_TEXT | DT_LEFT | DT_VCENTER;
230 break;
231 case DIR_FOLDERICON:
232 case DIR_MAX:
233 attrs = SS_BITMAP;
234 sprintf(s, "#%d", ids[x]);
235 break;
236 default:
237 attrs = SS_TEXT | DT_CENTER | DT_VCENTER;
238 break;
239 }
240 hwndTmp = WinCreateWindow(hwnd, (CHAR *) class, s, attrs, 0, 0, 0, 0, hwnd,
241 HWND_TOP, ids[x], NULL, NULL);
242 if (!hwndTmp)
243 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__,
244 PCSZ_WINCREATEWINDOW);
245 } // for
246}
247
248void CommonDriveCmd(HWND hwnd, char *drive, USHORT cmd)
249{
250 char dv[CCHMAXPATH];
251
252 if (!drive || !*drive)
253 return;
254 strcpy(dv, drive);
255 MakeValidDir(dv);
256
257 switch (cmd) {
258 case IDM_MKDIR:
259 PMMkDir(hwnd, dv, FALSE);
260 break;
261 case IDM_INFO:
262 WinDlgBox(HWND_DESKTOP,
263 HWND_DESKTOP,
264 DrvInfoProc, FM3ModHandle, INFO_FRAME, (PVOID) dv);
265 break;
266 case IDM_DRVFLAGS:
267 strcpy(dv, drive); // Must use original drive letter
268 if (WinDlgBox(HWND_DESKTOP,
269 hwnd,
270 SetDrvProc,
271 FM3ModHandle, DVS_FRAME, MPFROMP(dv)) && hwndTree)
272 if (!PostMsg(hwndTree, UM_SHOWME, MPFROMP(dv), MPVOID))
273 PostMsg(hwndTree, WM_COMMAND, MPFROM2SHORT(IDM_UPDATE, 0), MPVOID);
274 break;
275 case IDM_SIZES:
276 WinDlgBox(HWND_DESKTOP,
277 HWND_DESKTOP, DirSizeProc, FM3ModHandle, DSZ_FRAME, dv);
278 break;
279 case IDM_SHOWALLFILES:
280 StartSeeAll(HWND_DESKTOP, FALSE, dv);
281 break;
282 case IDM_UNDELETE:
283 {
284 HOBJECT hObject;
285 HWND hwndDesktop;
286
287 hObject = WinQueryObject("<XWP_TRASHCAN>");
288 if (hObject != NULLHANDLE && fTrashCan) {
289 hwndDesktop = WinQueryDesktopWindow((HAB) 0, NULLHANDLE);
290 WinSetFocus(HWND_DESKTOP, hwndDesktop);
291 WinOpenObject(hObject, 0, TRUE);
292 }
293 else
294 WinDlgBox(HWND_DESKTOP,
295 hwnd,
296 UndeleteDlgProc,
297 FM3ModHandle, UNDEL_FRAME, MPFROMP(dv));
298 }
299 break;
300 case IDM_CHKDSK:
301 runemf2(SEPARATE | WINDOWED,
302 hwnd, pszSrcFile, __LINE__, NULL, NULL,
303 "PMCHKDSK.EXE %c:", toupper(*dv));
304 break;
305 case IDM_OPTIMIZE:
306 {
307 CHAR FileSystem[CCHMAXPATH];
308 ULONG type;
309
310 CheckDrive(*dv, FileSystem, &type);
311 if (*FileSystem) {
312 strcat(FileSystem, "OPT.CMD");
313 runemf2(SEPARATE | WINDOWED,
314 hwnd, pszSrcFile, __LINE__,
315 NULL,
316 NULL,
317 "%s /C %s %c:", GetCmdSpec(FALSE), FileSystem, toupper(*dv));
318 }
319 }
320 break;
321 case IDM_FORMAT:
322 runemf2(SEPARATE | WINDOWED,
323 hwnd, pszSrcFile, __LINE__, NULL, NULL,
324 "PMFORMAT.EXE %c:", toupper(*dv));
325 break;
326
327#if 0 // fixme to be gone?
328
329 case IDM_CLOSETRAY:
330 if (driveflags[*dv - 'A'] & DRIVE_CDROM) {
331
332 BYTE parm[4] = { "CD01" };
333 ULONGLONG dlen;
334 ULONG plen;
335 HFILE hfile;
336 APIRET rc;
337
338 dv[2] = 0;
339 rc = DosOpen(dv,
340 &hfile,
341 &dlen,
342 0,
343 0,
344 OPEN_ACTION_OPEN_IF_EXISTS |
345 OPEN_ACTION_CREATE_IF_NEW,
346 OPEN_FLAGS_DASD |
347 OPEN_FLAGS_FAIL_ON_ERROR | OPEN_SHARE_DENYNONE, NULL);
348 if (rc)
349 Dos_Error(MB_CANCEL, rc, hwnd, pszSrcFile, __LINE__, "DosOpen");
350 else {
351 dlen = 0;
352 plen = sizeof(parm);
353 rc = DosDevIOCtl(hfile,
354 0x80,
355 0x45, &parm, sizeof(parm), &plen, NULL, 0, &dlen);
356 DosClose(hfile);
357 if (rc)
358 Dos_Error(MB_CANCEL, rc, hwnd, pszSrcFile, __LINE__, "DosDevIOCtl");
359 }
360 }
361 break;
362#endif // fixme to be gone?
363
364 case IDM_LOCK:
365 case IDM_UNLOCK:
366 case IDM_EJECT:
367 {
368 UCHAR parm[2];
369 ULONG plen = sizeof(parm), dlen = 0L;
370 APIRET rc;
371
372 switch (SHORT1FROMMP(cmd)) {
373 case IDM_LOCK:
374 parm[0] = 1;
375 break;
376 case IDM_UNLOCK:
377 parm[0] = 0;
378 break;
379 case IDM_EJECT:
380 parm[0] = 2;
381 break;
382 }
383 parm[1] = *dv - 'A';
384 DosError(FERR_DISABLEHARDERR);
385 rc = DosDevIOCtl(-1L, 8L, 0x40L, &parm, sizeof(parm), &plen, NULL, 0L, &dlen);
386 if (cmd == IDM_EJECT &&
387 (fEjectFlpyScan ? TRUE : parm[1] > 1) &&
388 (fEjectCDScan ? TRUE : !(driveflags[parm[1]] & DRIVE_CDROM)) &&
389 (fEjectRemovableScan ? TRUE : (parm[1] < 2 || driveflags[parm[1]] & DRIVE_CDROM))) {
390 BOOL toggleTree = FALSE;
391
392 if (!hwndTree) {
393 WinSendMsg(hwndMain, WM_COMMAND, MPFROM2SHORT(IDM_VTREE, 0), MPVOID);
394 toggleTree = TRUE;
395 }
396 WinSendMsg(hwndTree, WM_COMMAND, MPFROM2SHORT(IDM_RESCAN, 0), MPVOID);
397 if (toggleTree)
398 WinSendMsg(hwndMain, WM_COMMAND, MPFROM2SHORT(IDM_VTREE, 0), MPVOID);
399 }
400 }
401 break;
402
403 case IDM_RESCAN:
404 {
405 BOOL toggleTree = FALSE;
406
407 if (!hwndTree) {
408 WinSendMsg(hwndMain, WM_COMMAND, MPFROM2SHORT(IDM_VTREE, 0), MPVOID);
409 toggleTree = TRUE;
410 }
411 WinSendMsg(hwndTree, WM_COMMAND, MPFROM2SHORT(IDM_RESCAN, 0), MPVOID);
412 if (toggleTree)
413 WinSendMsg(hwndMain, WM_COMMAND, MPFROM2SHORT(IDM_VTREE, 0), MPVOID);
414 }
415 break;
416
417 case IDM_REFRESHREMOVABLES:
418 {
419 BOOL toggleTree = FALSE;
420
421 if (!hwndTree) {
422 WinSendMsg(hwndMain, WM_COMMAND, MPFROM2SHORT(IDM_VTREE, 0), MPVOID);
423 toggleTree = TRUE;
424 }
425 WinSendMsg(hwndTree, WM_COMMAND, MPFROM2SHORT(IDM_REFRESHREMOVABLES, 0), MPVOID);
426 if (toggleTree)
427 WinSendMsg(hwndMain, WM_COMMAND, MPFROM2SHORT(IDM_VTREE, 0), MPVOID);
428 }
429 break;
430 }
431}
432
433void CommonCreateMainChildren(HWND hwnd, SWP * swp)
434{
435 HWND hwndFrame = WinQueryWindow(hwnd, QW_PARENT);
436 HWND hwndTmp;
437 PFNWP oldproc;
438
439 // Create a children of frame window
440 // Left status window
441 hwndStatus = WinCreateWindow(hwndFrame,
442 (CHAR *) WC_STATUS,
443 "Status",
444 WS_VISIBLE | SS_TEXT | DT_LEFT |
445 DT_VCENTER,
446 swp->x + 4 +
447 WinQuerySysValue(HWND_DESKTOP,
448 SV_CXSIZEBORDER),
449 swp->y + 4 +
450 WinQuerySysValue(HWND_DESKTOP,
451 SV_CYSIZEBORDER),
452 ((swp->cx / 2) - 8) -
453 (WinQuerySysValue(HWND_DESKTOP,
454 SV_CXSIZEBORDER) * 2),
455 20,
456 hwndFrame, HWND_TOP, MAIN_STATUS, NULL, NULL);
457 if (!hwndStatus)
458 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
459 PCSZ_WINCREATEWINDOW);
460
461 // Right status window
462 hwndStatus2 = WinCreateWindow(hwndFrame,
463 (CHAR *) WC_STATUS,
464 "Status2",
465 WS_VISIBLE | SS_TEXT | DT_LEFT |
466 DT_VCENTER,
467 ((swp->cx / 2) + 4) +
468 WinQuerySysValue(HWND_DESKTOP,
469 SV_CXSIZEBORDER),
470 ((swp->cy / 2) + 4) +
471 WinQuerySysValue(HWND_DESKTOP,
472 SV_CYSIZEBORDER),
473 ((swp->cx / 2) - 8) -
474 (WinQuerySysValue(HWND_DESKTOP,
475 SV_CXSIZEBORDER) * 2),
476 20,
477 hwndFrame,
478 HWND_TOP, MAIN_STATUS2, NULL, NULL);
479 if (!hwndStatus2)
480 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
481 PCSZ_WINCREATEWINDOW);
482
483 hwndAttr = WinCreateWindow(hwndFrame,
484 (CHAR *) WC_STATUS,
485 "Attr",
486 WS_VISIBLE | SS_TEXT | DT_CENTER |
487 DT_VCENTER,
488 swp->x + 4 +
489 WinQuerySysValue(HWND_DESKTOP,
490 SV_CXSIZEBORDER),
491 swp->y + 4 + 24 +
492 WinQuerySysValue(HWND_DESKTOP,
493 SV_CYSIZEBORDER),
494 ((swp->cx / 4) - 8) -
495 (WinQuerySysValue(HWND_DESKTOP,
496 SV_CXSIZEBORDER) * 2),
497 20, hwndFrame, HWND_TOP, IDM_ATTRS, NULL, NULL);
498 if (!hwndAttr)
499 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
500 PCSZ_WINCREATEWINDOW);
501
502 hwndDate = WinCreateWindow(hwndFrame,
503 (CHAR *) WC_STATUS,
504 "Date",
505 WS_VISIBLE | SS_TEXT | DT_CENTER |
506 DT_VCENTER,
507 ((swp->x / 4) * 2) + 4 +
508 WinQuerySysValue(HWND_DESKTOP,
509 SV_CXSIZEBORDER),
510 swp->y + 4 + 24 +
511 WinQuerySysValue(HWND_DESKTOP,
512 SV_CYSIZEBORDER),
513 ((swp->cx / 4) - 8) -
514 (WinQuerySysValue(HWND_DESKTOP,
515 SV_CXSIZEBORDER) * 2),
516 20, hwndFrame, HWND_TOP, IDM_INFO, NULL, NULL);
517 if (!hwndDate)
518 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
519 PCSZ_WINCREATEWINDOW);
520
521 hwndName = WinCreateWindow(hwndFrame,
522 (CHAR *) WC_STATUS,
523 "Name",
524 WS_VISIBLE | SS_TEXT | DT_LEFT |
525 DT_VCENTER,
526 ((swp->x / 4) * 3) + 4 +
527 WinQuerySysValue(HWND_DESKTOP,
528 SV_CXSIZEBORDER),
529 swp->y + 4 +
530 WinQuerySysValue(HWND_DESKTOP,
531 SV_CYSIZEBORDER),
532 ((swp->cx / 4) - 8) -
533 (WinQuerySysValue(HWND_DESKTOP,
534 SV_CXSIZEBORDER) * 2),
535 20, hwndFrame, HWND_TOP, IDM_RENAME, NULL, NULL);
536 if (!hwndName)
537 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
538 PCSZ_WINCREATEWINDOW);
539
540 hwndTmp = WinCreateWindow(hwndFrame,
541 (CHAR *) WC_TOOLBACK,
542 NullStr,
543 WS_VISIBLE | SS_TEXT | DT_CENTER | DT_VCENTER,
544 swp->x +
545 WinQuerySysValue(HWND_DESKTOP,
546 SV_CXSIZEBORDER),
547 (swp->cy -
548 WinQuerySysValue(HWND_DESKTOP,
549 SV_CYSIZEBORDER)) - 30,
550 swp->cx -
551 (WinQuerySysValue(HWND_DESKTOP,
552 SV_CXSIZEBORDER) * 2),
553 30, hwndFrame, HWND_TOP, MAIN_TOOLS, NULL, NULL);
554 if (!hwndTmp)
555 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
556 PCSZ_WINCREATEWINDOW);
557
558 hwndBack = WinCreateWindow(hwndFrame,
559 (CHAR *) WC_DRIVEBACK,
560 NullStr,
561 WS_VISIBLE | SS_TEXT | DT_RIGHT | DT_BOTTOM,
562 swp->x +
563 WinQuerySysValue(HWND_DESKTOP,
564 SV_CXSIZEBORDER),
565 (swp->cy -
566 WinQuerySysValue(HWND_DESKTOP,
567 SV_CYSIZEBORDER)) -
568 (DRIVE_BUTTON_HEIGHT),
569 swp->cx -
570 (WinQuerySysValue(HWND_DESKTOP,
571 SV_CXSIZEBORDER) * 2),
572 DRIVE_BUTTON_HEIGHT,
573 hwndFrame, HWND_TOP, MAIN_DRIVES, NULL, NULL);
574
575 if (!hwndBack)
576 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
577 PCSZ_WINCREATEWINDOW);
578
579 hwndLED = WinCreateWindow(hwndFrame,
580 (CHAR *) WC_LED,
581 "#920", // LEDOFF_BMP
582 WS_VISIBLE | SS_BITMAP,
583 swp->cx - 58,
584 swp->y,
585 12,
586 12, hwndFrame, HWND_TOP, MAIN_LED, NULL, NULL);
587 if (!hwndLED)
588 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
589 PCSZ_WINCREATEWINDOW);
590
591 hwndLEDHdr = WinCreateWindow(hwndFrame,
592 (CHAR *) WC_LED,
593 "0",
594 WS_VISIBLE | SS_TEXT | DT_VCENTER |
595 DT_CENTER,
596 swp->cx - 58,
597 swp->y + 12,
598 12,
599 12,
600 hwndFrame, HWND_TOP, MAIN_LEDHDR, NULL, NULL);
601 if (!hwndLEDHdr)
602 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
603 PCSZ_WINCREATEWINDOW);
604
605 hwndAutoview = WinCreateWindow(hwndFrame,
606 (CHAR *) WC_AUTOVIEW,
607 NullStr,
608 WS_VISIBLE | SS_TEXT | DT_LEFT |
609 DT_TOP | DT_WORDBREAK,
610 swp->x + 4 +
611 WinQuerySysValue(HWND_DESKTOP,
612 SV_CXSIZEBORDER),
613 swp->y + 4 +
614 WinQuerySysValue(HWND_DESKTOP,
615 SV_CYSIZEBORDER) + 16,
616 (swp->cx - 8) -
617 (WinQuerySysValue(HWND_DESKTOP,
618 SV_CXSIZEBORDER) * 2),
619 48,
620 hwndFrame,
621 HWND_TOP, MAIN_AUTOVIEW, NULL, NULL);
622 if (!hwndAutoview)
623 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
624 PCSZ_WINCREATEWINDOW);
625
626 hwndAutoMLE = WinCreateWindow(hwndFrame,
627 // GetPString(IDS_WCAUTOVIEW),
628 (CHAR *) WC_MLE,
629 NullStr,
630 WS_VISIBLE | MLS_HSCROLL |
631 MLS_VSCROLL | MLS_BORDER,
632 swp->x + 4 +
633 WinQuerySysValue(HWND_DESKTOP,
634 SV_CXSIZEBORDER),
635 swp->y + 4 +
636 WinQuerySysValue(HWND_DESKTOP,
637 SV_CYSIZEBORDER) + 16,
638 (swp->cx - 8) -
639 (WinQuerySysValue(HWND_DESKTOP,
640 SV_CXSIZEBORDER) * 2),
641 48,
642 hwndFrame,
643 HWND_TOP, MAIN_AUTOVIEWMLE, NULL, NULL);
644 if (!hwndAutoMLE)
645 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
646 PCSZ_WINCREATEWINDOW);
647
648 oldproc = WinSubclassWindow(hwndAutoMLE, AutoViewProc);
649 WinSetWindowPtr(hwndAutoMLE, QWL_USER, (PVOID) oldproc);
650 PostMsg(hwndAutoMLE, UM_SETUP, MPVOID, MPVOID);
651}
652
653/**
654 * Called by MainWndProc and MainWndProc2 to process messages
655 * common to both fm/2 and fm/2 lite main window
656 */
657
658MRESULT EXPENTRY CommonMainWndProc(HWND hwnd, ULONG msg, MPARAM mp1,
659 MPARAM mp2)
660{
661 static BOOL fLedOn;
662 static LONG cWorkerThreads;
663
664 switch (msg) {
665 case UM_THREADUSE:
666 if (hbmLEDon && hbmLEDoff) {
667 CHAR sz[33];
668 if (mp1) {
669 cWorkerThreads++;
670 // 13 Sep 09 SHL fixme to be SMP safe
671 if (cWorkerThreads == 1) {
672 if (!WinStartTimer(WinQueryAnchorBlock(hwnd), hwnd, ID_LED_TIMER, 500))
673 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__, "WinStartTimer");
674 fLedOn = TRUE;
675 WinSendMsg(hwndLED, SM_SETHANDLE, MPFROMLONG(hbmLEDon), MPVOID);
676 }
677 }
678 else if (cWorkerThreads > 0)
679 cWorkerThreads--;
680
681 ltoa(cWorkerThreads, sz, 10);
682 WinSetWindowText(hwndLEDHdr, sz);
683 DosSleep(0);
684 }
685 return 0;
686
687 case WM_TIMER:
688 fLedOn = !fLedOn;
689 WinSendMsg(hwndLED,
690 SM_SETHANDLE,
691 fLedOn ? MPFROMLONG(hbmLEDon) : MPFROMLONG(hbmLEDoff),
692 MPVOID);
693 if (!fLedOn && cWorkerThreads == 0) {
694 if (!WinStopTimer(WinQueryAnchorBlock(hwnd), hwnd, ID_LED_TIMER))
695 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__, "WinStartTimer");
696 }
697 break;
698
699 case UM_LOADFILE:
700 {
701 CHAR *s = NULL;
702 static CHAR lastfile[CCHMAXPATH] = "";
703
704 if (!fAutoView) {
705 if (*lastfile)
706 PostMsg((fComments) ? hwndAutoMLE : hwndAutoview,
707 UM_LOADFILE, MPVOID, MPVOID);
708 *lastfile = 0;
709 }
710 else {
711 if (mp1) {
712 if (!mp2 && !stricmp(lastfile, (CHAR *)mp1))
713 return 0;
714 strcpy(lastfile, (CHAR *)mp1);
715 s = xstrdup(lastfile, pszSrcFile, __LINE__);
716 }
717 else
718 *lastfile = 0;
719 if (!PostMsg((fComments) ? hwndAutoMLE : hwndAutoview,
720 UM_LOADFILE, MPFROMP(s), MPVOID)) {
721 xfree(s, pszSrcFile, __LINE__);
722 }
723 }
724 }
725 return 0;
726
727 case UM_BUILDDRIVEBAR:
728 BuildDriveBarButtons(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
729 MAIN_DRIVES));
730 return 0;
731 }
732 return WinDefWindowProc(hwnd, msg, mp1, mp2);
733}
734
735MRESULT EXPENTRY CommonTextButton(HWND hwnd, ULONG msg, MPARAM mp1,
736 MPARAM mp2)
737{
738 static HWND hwndLast = (HWND) 0;
739 static ULONG lastclick = 0;
740
741 switch (msg) {
742 case WM_MOUSEMOVE:
743 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
744 if (!fNoFinger) {
745 WinSetPointer(HWND_DESKTOP, hptrFinger);
746 return MRFROMLONG(TRUE);
747 }
748 break;
749
750 case WM_BUTTON1DOWN:
751 case WM_BUTTON3DOWN:
752 if (hwndBubble)
753 WinDestroyWindow(hwndBubble);
754 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
755 WinSetCapture(HWND_DESKTOP, hwnd);
756 PaintRecessedWindow(hwnd, (HPS) 0, FALSE, FALSE);
757 break;
758
759 case WM_BUTTON2UP:
760 case WM_BUTTON2DOWN:
761 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
762 if (msg == WM_BUTTON2UP && hwndLast) {
763 PostMsg(hwnd, UM_FOCUSME, MPFROMP(hwndLast), MPVOID);
764 hwndLast = (HWND) 0;
765 }
766 break;
767
768 case WM_BUTTON1UP:
769 case WM_BUTTON3UP:
770 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
771 WinSetCapture(HWND_DESKTOP, (HWND) 0);
772 PaintRecessedWindow(hwnd, (HPS) 0, TRUE, FALSE);
773 {
774 ULONG check;
775
776 DosQuerySysInfo(QSV_MS_COUNT, QSV_MS_COUNT, &check, sizeof(check));
777 if (check > lastclick + 500) {
778
779 RECTL rcl;
780 POINTS pts;
781
782 pts.x = SHORT1FROMMP(mp1);
783 pts.y = SHORT2FROMMP(mp1);
784 WinQueryWindowRect(hwnd, &rcl);
785 if (pts.x > 0 && pts.y > 0 && pts.x < rcl.xRight && pts.y < rcl.yTop)
786 PostMsg(hwnd, UM_CLICKED + (msg == WM_BUTTON3UP), mp1, mp2);
787 }
788 lastclick = check;
789 }
790 PostMsg(hwnd, UM_FOCUSME, MPFROMP(hwndLast), MPVOID);
791 hwndLast = (HWND) 0;
792 break;
793
794 case WM_SETFOCUS:
795 if (mp2)
796 hwndLast = (HWND) mp1;
797 break;
798
799 case UM_FOCUSME:
800 if (mp1) {
801
802 PID pid;
803 TID tid;
804
805 if (WinIsWindow(WinQueryAnchorBlock(hwnd), (HWND) mp1) &&
806 WinQueryWindowProcess((HWND) mp1, &pid, &tid) && pid == mypid) {
807 WinSetFocus(HWND_DESKTOP, (HWND) mp1);
808 return 0;
809 }
810 }
811 {
812 HWND htemp = (HWND) 0;
813
814 if (hwndMain)
815 htemp = TopWindow(hwndMain, (HWND) 0);
816 if (!htemp)
817 htemp = hwndTree;
818 if (htemp)
819 WinSetFocus(HWND_DESKTOP, htemp);
820 else
821 WinSetFocus(HWND_DESKTOP, WinQueryWindow(hwnd, QW_PARENT));
822 }
823 return 0;
824 }
825
826 return PFNWPStatic(hwnd, msg, mp1, mp2);
827}
828
829MRESULT EXPENTRY CommonCnrProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
830{
831 DIRCNRDATA *dcd = WinQueryWindowPtr(hwnd, QWL_USER);
832
833 switch (msg) {
834 case UM_FIXCNRMLE:
835 if (dcd) {
836
837 SWP swp, swpC;
838
839 if (WinQueryWindowPos(WinWindowFromID(hwnd, CID_MLE), &swp)) {
840 if (WinQueryWindowPos(hwnd, &swpC)) {
841 swpC.cx -= (WinQuerySysValue(HWND_DESKTOP, SV_CXVSCROLL) + 4);
842 swpC.cx -= swp.x;
843 WinSetWindowPos(WinWindowFromID(hwnd, CID_MLE),
844 HWND_TOP, 0, 0, swpC.cx, swp.cy + 2, SWP_SIZE);
845 }
846 }
847 if (mp1)
848 WinSendMsg(WinWindowFromID(hwnd, CID_MLE),
849 MLM_SETTEXTLIMIT, mp1, MPVOID);
850 }
851 return 0;
852
853 case UM_FIXEDITNAME:
854 if (dcd) {
855 if (mp1 && (INT) mp1 != -1) {
856
857 CHAR *p;
858
859 WinSendMsg(hwnd, UM_FIXCNRMLE, MPFROMLONG(CCHMAXPATH), MPVOID);
860 MLEdelete(WinWindowFromID(hwnd, CID_MLE),
861 0, strlen((CHAR *)mp1) + 1);
862 WinSetDlgItemText(hwnd, CID_MLE, (CHAR *)mp1);
863 p = strrchr((CHAR *)mp1, '\\');
864 if (p) {
865 p++;
866 MLEsetcurposa(WinWindowFromID(hwnd, CID_MLE), (p - (CHAR *)mp1));
867 MLEsetcurposc(WinWindowFromID(hwnd, CID_MLE), strlen((CHAR *)mp1));
868 }
869 else
870 MLEsetcurpos(WinWindowFromID(hwnd, CID_MLE), strlen((CHAR *)mp1));
871 }
872 else if (mp2) {
873 if ((INT) mp1 == -1) {
874 PCNRITEM pci = (PCNRITEM) mp2;
875 RemoveCnrItems(hwnd, pci, 1, CMA_FREE | CMA_INVALIDATE);
876 }
877 else {
878 Broadcast(WinQueryAnchorBlock(hwnd),
879 dcd->hwndParent, UM_UPDATERECORD, mp2, MPVOID);
880 free(mp2);
881 }
882 }
883 }
884 return 0;
885 }
886 return PFNWPCnr(hwnd, msg, mp1, mp2);
887}
888
889HWND OpenDirCnr(HWND hwnd, HWND hwndParent, HWND hwndRestore,
890 BOOL noautotile, char *directory)
891{
892 SWP swp;
893 HWND hwndDir;
894
895 if (ParentIsDesktop(hwnd, hwndParent) || *(ULONG *) realappname != FM3UL)
896 StartDirCnr(HWND_DESKTOP, directory, hwndRestore, 1);
897 else if (*(ULONG *) realappname == FM3UL) {
898 if (!fAutoTile)
899 GetNextWindowPos(hwndParent, &swp, NULL, NULL);
900 hwndDir = StartDirCnr(hwndParent, directory, hwndRestore, 1);
901 if (hwndDir) {
902 if (!fAutoTile)
903 WinSetWindowPos(hwndDir,
904 HWND_TOP,
905 swp.x,
906 swp.y,
907 swp.cx,
908 swp.cy, SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_ZORDER);
909 else if (!noautotile)
910 TileChildren(hwndParent, TRUE);
911 WinSetWindowPos(hwndDir,
912 HWND_TOP,
913 0, 0, 0, 0, SWP_RESTORE | SWP_SHOW | SWP_ACTIVATE);
914 }
915 }
916 else {
917
918 char s[256];
919
920 assign_ignores(s);
921 runemf2(WINDOWED | SEPARATE,
922 hwnd, pszSrcFile, __LINE__,
923 NULL,
924 NULL,
925 "VDIR.EXE %s%s\"%s%s\"",
926 (*s) ? s : NullStr, (*s) ? " " : NullStr,
927 directory,
928 (directory[strlen(directory) - 1] == '\\') ? PCSZ_BACKSLASH : NullStr);
929 }
930 return hwndDir;
931}
932
933//= IncrThreadUsage() Increment thread usage counter ==
934
935VOID IncrThreadUsage(VOID)
936{
937 if (hwndMain)
938 WinPostMsg(hwndMain, UM_THREADUSE, MPFROMLONG(1), MPVOID);
939}
940
941//= DecrThreadUsage() Decrement thread usage counter ==
942
943VOID DecrThreadUsage(VOID)
944{
945 if (hwndMain)
946 WinPostMsg(hwndMain, UM_THREADUSE, MPVOID, MPVOID);
947}
948
949#pragma alloc_text(COMMON,CommonFrameWndProc,CommonTextProc,CommonTextPaint)
950#pragma alloc_text(COMMON1,CommonCreateTextChildren,CommonCreateMainChildren)
951#pragma alloc_text(COMMON2,CommonDriveCmd,CommonTextButton)
952#pragma alloc_text(COMMON3,CommonMainWndProc,IncrThreadUsage,DecrThreadUsage)
953#pragma alloc_text(COMMON4,CommonCnrProc)
954#pragma alloc_text(COMMON5,OpenDirCnr)
Note: See TracBrowser for help on using the repository browser.