source: trunk/dll/seeall.c@ 1084

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

Added ability to save/append either the full path name (already present) or just the filename to the clipboard. Changed the menu text to make these easier to find. Removed the final return/newline from the list. Ticket 137

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 119.1 KB
Line 
1
2/***********************************************************************
3
4 $Id: seeall.c 1084 2008-07-20 18:22:12Z gyoung $
5
6 See all matching files
7
8 Copyright (c) 1993-98 M. Kimes
9 Copyright (c) 2001, 2008 Steven H. Levine
10
11 16 Oct 02 SHL Handle large partitions
12 25 Nov 03 SHL StartSeeAll: avoid forgetting startpath
13 06 Dec 03 SHL StartSeeAll: correct malloc arg oops
14 23 May 05 SHL Use QWL_USER
15 25 May 05 SHL Use ULONGLONG and CommaFmtULL
16 05 Jun 05 SHL Use QWL_USER
17 06 Jun 05 SHL Drop unused code
18 29 May 06 SHL Comments
19 17 Jul 06 SHL Use Runtime_Error
20 19 Oct 06 SHL Correct . and .. detect
21 03 Nov 06 SHL Renames
22 03 Nov 06 SHL Count thread usage
23 30 Mar 07 GKY Remove GetPString for window class names
24 03 Aug 07 GKY Enlarged and made setable everywhere Findbuf (speeds file loading)
25 06 Aug 07 GKY Reduce DosSleep times (ticket 148)
26 07 Aug 07 SHL Use BldQuotedFullPathName and BldQuotedFileName
27 13 Aug 07 SHL Sync code with other FilesToGet usage
28 13 Aug 07 SHL Move #pragma alloc_text to end for OpenWatcom compat
29 14 Aug 07 SHL Revert to DosSleep(0) to speed up inner loops
30 14 Aug 07 SHL Drop afFilesToGet
31 26 Aug 07 GKY DosSleep(1) in loops changed to (0)
32 27 Sep 07 SHL Correct ULONGLONG size formatting
33 30 Dec 07 GKY Use CommaFmtULL
34 30 Dec 07 GKY Use TestFDates for comparing by date
35 15 Feb 08 GKY Prevent trap on scan of drive containing files that exceed maxpath
36 29 Feb 08 GKY Use xfree where appropriate
37 29 Feb 08 GKY Refactor global command line variables to notebook.h
38 20 Jul 08 GKY Add save/append filename to clipboard.
39 Change menu wording to make these easier to find
40
41***********************************************************************/
42
43#include <stdlib.h>
44#include <string.h>
45#include <ctype.h>
46#include <process.h>
47
48#define INCL_DOS
49#define INCL_DOSERRORS
50#define INCL_WIN
51#define INCL_GPI
52#define INCL_LONGLONG
53
54#include "fm3dlg.h"
55#include "fm3str.h"
56#include "pathutil.h" // BldQuotedFullPathName...
57#include "makelist.h" // AddToList
58#include "errutil.h" // Dos_Error...
59#include "strutil.h" // GetPString
60#include "notebook.h" // targetdirectory
61#include "fm3dll.h"
62
63#include "fortify.h"
64
65#pragma data_seg(DATA2)
66
67static PSZ pszSrcFile = __FILE__;
68
69typedef struct
70{
71 CHAR *fullname, *filename;
72 USHORT attrFile, flags;
73 FDATE date;
74 FTIME time;
75 ULONGLONG cbFile;
76 ULONG CRC;
77}
78ALLFILES;
79
80#define AF_SELECTED 0x0001
81#define AF_DELETED 0x0002
82#define AF_FILTERED 0x0004
83#define AF_DUPE 0x0008
84#define AF_CRCED 0x0010
85
86#define AFM_MARK 0
87#define AFM_UNMARK 1
88#define AFM_INVERT 2
89#define AFM_MARKDELETED 3
90#define AFM_FILTER 4
91
92#define DP_NAMES 0x0001
93#define DP_DATES 0x0002
94#define DP_SIZES 0x0004
95#define DP_CRCS 0x0008
96#define DP_EXTS 0x0010
97
98#define FIXED_FONT_LCID 5
99
100#define COLORS_MAX 8
101
102#define COLORS_CURSOREDNORMALBACK 0
103#define COLORS_CURSOREDSELECTEDBACK 1
104#define COLORS_NORMALBACK 2
105#define COLORS_SELECTEDBACK 3
106#define COLORS_SELECTEDNORMALFORE 4
107#define COLORS_NORMALFORE 5
108#define COLORS_READONLYFORE 6
109#define COLORS_SYSTEMFORE 7
110
111static LONG Colors[COLORS_MAX] = { COLR_WHITE, COLR_DARKGRAY, COLR_PALEGRAY,
112 COLR_BLACK, COLR_WHITE, COLR_BLACK,
113 COLR_DARKBLUE, COLR_DARKRED
114};
115
116typedef int (FNSORT) (const void *, const void *);
117typedef FNSORT *PFNSORT;
118
119typedef struct
120{
121 USHORT size;
122 USHORT dupeflags;
123 ALLFILES *afhead;
124 ALLFILES **afindex;
125 ULONG afheadcnt;
126 ULONG afalloc;
127 ULONG longest;
128 ULONG longestw;
129 ULONG topfile;
130 ULONG cursored;
131 ULONG selected;
132 ULONGLONG ullSelectedBytes;
133 ULONG afindexcnt;
134 ULONG lastselected;
135 ULONG lastdirection;
136 ULONG multiplier;
137 ULONG lasttime;
138 CHAR stopflag;
139 CHAR abDrvFlags[26];
140 CHAR szCommonName[CCHMAXPATH];
141 CHAR szFindPath[CCHMAXPATH];
142 LONG lMaxAscender;
143 LONG lMaxDescender;
144 LONG lMaxHeight;
145 LONG maxx;
146 LONG horzscroll;
147 BOOL fullnames;
148 BOOL invertsort;
149 BOOL mousecaptured;
150 HMTX hmtxScan;
151 HWND hvscroll;
152 HWND hhscroll;
153 HWND hwndMenu;
154 HWND hwndObj;
155 HWND hwndClient;
156 HWND hwndPopup;
157 HWND hwndStatus;
158 HWND hwndFrame;
159 HPS hps;
160 PFNSORT pfnCompare;
161 MASK mask;
162 FATTRS fattrs;
163 LONG aulColors[8];
164 BOOL killme;
165}
166ALLDATA;
167
168static BOOL Fullnames = FALSE;
169static BOOL Firsttime = TRUE;
170static BOOL SortReverse;
171static USHORT Codepage, SortType;
172static FATTRS Fattrs;
173
174extern LONG CRCFile(CHAR * filename, INT * error);
175
176MRESULT EXPENTRY DupeDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
177{
178 switch (msg) {
179 case WM_INITDLG:
180 {
181 USHORT flags = SHORT1FROMMP(mp2);
182
183 WinCheckButton(hwnd, DUPE_NAMES, ((flags & DP_NAMES) != 0));
184 WinCheckButton(hwnd, DUPE_DATES, ((flags & DP_NAMES) != 0));
185 WinCheckButton(hwnd, DUPE_SIZES, ((flags & DP_NAMES) != 0));
186 WinCheckButton(hwnd, DUPE_CRCS, ((flags & DP_NAMES) != 0));
187 if (!(flags & DP_NAMES))
188 WinEnableWindow(WinWindowFromID(hwnd, DUPE_EXTS), FALSE);
189 }
190 break;
191
192 case WM_CONTROL:
193 switch (SHORT1FROMMP(mp1)) {
194 case DUPE_NAMES:
195 if (WinQueryButtonCheckstate(hwnd, DUPE_NAMES))
196 WinEnableWindow(WinWindowFromID(hwnd, DUPE_EXTS), TRUE);
197 else {
198 WinCheckButton(hwnd, DUPE_EXTS, FALSE);
199 WinEnableWindow(WinWindowFromID(hwnd, DUPE_EXTS), FALSE);
200 }
201 break;
202 case DUPE_SIZES:
203 if (!WinQueryButtonCheckstate(hwnd, DUPE_SIZES))
204 WinCheckButton(hwnd, DUPE_CRCS, FALSE);
205 break;
206 case DUPE_CRCS:
207 if (WinQueryButtonCheckstate(hwnd, DUPE_CRCS))
208 WinCheckButton(hwnd, DUPE_SIZES, TRUE);
209 break;
210 }
211 return 0;
212
213 case WM_COMMAND:
214 switch (SHORT1FROMMP(mp1)) {
215 case DID_OK:
216 {
217 USHORT flags = 0;
218
219 if (WinQueryButtonCheckstate(hwnd, DUPE_NAMES)) {
220 flags |= DP_NAMES;
221 if (WinQueryButtonCheckstate(hwnd, DUPE_EXTS))
222 flags |= DP_EXTS;
223 }
224 if (WinQueryButtonCheckstate(hwnd, DUPE_DATES))
225 flags |= DP_DATES;
226 if (WinQueryButtonCheckstate(hwnd, DUPE_SIZES)) {
227 flags |= DP_SIZES;
228 if (WinQueryButtonCheckstate(hwnd, DUPE_CRCS))
229 flags |= (DP_CRCS | DP_SIZES);
230 }
231 if (!flags)
232 saymsg(MB_ENTER,
233 hwnd,
234 GetPString(IDS_ERRORTEXT),
235 "%s", GetPString(IDS_CHECKONETEXT));
236 else
237 WinDismissDlg(hwnd, flags);
238 }
239 break;
240
241 case DID_CANCEL:
242 WinDismissDlg(hwnd, 0);
243 break;
244
245 case IDM_HELP:
246 if (hwndHelp)
247 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
248 MPFROM2SHORT(HELP_DUPES, 0), MPFROMSHORT(HM_RESOURCEID));
249 break;
250 }
251 return 0;
252 }
253 return WinDefDlgProc(hwnd, msg, mp1, mp2);
254}
255
256static ULONG NumLines(RECTL * rcl, ALLDATA * ad)
257{
258 ULONG numlines;
259
260 numlines = (rcl->yTop - rcl->yBottom) / ad->lMaxHeight;
261 if (ad->lMaxDescender && numlines &&
262 ((rcl->yTop - rcl->yBottom) -
263 (numlines * ad->lMaxHeight) <= ad->lMaxDescender))
264 numlines--;
265 return numlines;
266}
267
268MRESULT EXPENTRY SeeObjWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
269{
270 switch (msg) {
271 case UM_MASSACTION:
272 {
273 CHAR **files = NULL, **list = (CHAR **) mp2, path[CCHMAXPATH];
274 UINT numfiles = 0, numalloc = 0;
275 INT plen = 0;
276 HWND hwndFrame = WinQueryWindowULong(hwnd, QWL_USER);
277 CHAR message[CCHMAXPATH * 2], wildname[CCHMAXPATH];
278 register INT x;
279 register CHAR *p, *pp;
280 BOOL dontask = FALSE, wildcarding = FALSE,
281 overold = FALSE, overnew = FALSE;
282
283 if (!list || !list[0])
284 goto Abort;
285 *path = *wildname = 0;
286
287 switch (SHORT1FROMMP(mp1)) {
288 case IDM_MOVEPRESERVE:
289 {
290 CHAR preserve[CCHMAXPATH], *end;
291
292 mp1 = MPFROM2SHORT(IDM_MOVE, SHORT2FROMMP(mp1));
293 strcpy(preserve, list[0] + 2);
294 end = strrchr(preserve, '\\');
295 if (end) {
296 end++;
297 for (x = 1; list[x]; x++) {
298 p = preserve;
299 pp = list[x] + 2;
300 while (p < end && toupper(*p) == toupper(*pp)) {
301 p++;
302 pp++;
303 }
304 if (*p == '\\')
305 p++;
306 if (p < end)
307 end = p;
308 }
309 *end = 0;
310 }
311 else
312 *preserve = 0;
313 plen = strlen(preserve);
314 if (plen)
315 plen += 2;
316 }
317 break;
318 case IDM_COPYPRESERVE:
319 {
320 CHAR preserve[CCHMAXPATH], *end;
321
322 mp1 = MPFROM2SHORT(IDM_COPY, SHORT2FROMMP(mp1));
323 strcpy(preserve, list[0] + 2);
324 end = strrchr(preserve, '\\');
325 if (end) {
326 end++;
327 for (x = 1; list[x]; x++) {
328 p = preserve;
329 pp = list[x] + 2;
330 while (p < end && toupper(*p) == toupper(*pp)) {
331 p++;
332 pp++;
333 }
334 if (*p == '\\')
335 p++;
336 if (p < end)
337 end = p;
338 }
339 *end = 0;
340 }
341 else
342 *preserve = 0;
343 plen = strlen(preserve);
344 if (plen)
345 plen += 2;
346 }
347 break;
348 case IDM_WILDMOVE:
349 wildcarding = TRUE;
350 mp1 = MPFROM2SHORT(IDM_MOVE, SHORT2FROMMP(mp1));
351 break;
352 case IDM_WILDRENAME:
353 wildcarding = TRUE;
354 mp1 = MPFROM2SHORT(IDM_RENAME, SHORT2FROMMP(mp1));
355 break;
356 case IDM_WILDCOPY:
357 wildcarding = TRUE;
358 mp1 = MPFROM2SHORT(IDM_COPY, SHORT2FROMMP(mp1));
359 break;
360 }
361
362 switch (SHORT1FROMMP(mp1)) {
363 case IDM_OBJECT:
364 case IDM_SHADOW:
365 {
366 APIRET rc;
367
368 GetDesktopName(path, sizeof(path));
369 rc = WinDlgBox(HWND_DESKTOP,
370 hwndFrame,
371 ObjCnrDlgProc,
372 FM3ModHandle, OBJCNR_FRAME, MPFROMP(path));
373 if (rc) {
374 if (rc > 1)
375 strcpy(path, "<WP_DESKTOP>");
376 }
377 else {
378 FreeList(list);
379 break;
380 }
381 MakeShadows(hwndFrame,
382 list, (SHORT1FROMMP(mp1) == IDM_SHADOW), path, NULL);
383 }
384 FreeList(list);
385 break;
386
387 case IDM_PRINT:
388 {
389 LISTINFO *li;
390# ifdef FORTIFY
391 Fortify_EnterScope();
392# endif
393 li = xmallocz(sizeof(LISTINFO), pszSrcFile, __LINE__);
394 if (li) {
395 li->hwndS = WinWindowFromID(hwndFrame, FID_CLIENT);
396 li->type = IDM_PRINT;
397 li->list = list;
398 if (WinDlgBox(HWND_DESKTOP,
399 li->hwndS,
400 PrintDlgProc,
401 FM3ModHandle, PRN_FRAME, MPFROMP(li))) {
402 if (li && li->list && li->list[0]) {
403 strcpy(li->targetpath, printer);
404 if (_beginthread(PrintListThread, NULL, 65536, (PVOID) li) ==
405 -1) {
406 Runtime_Error(pszSrcFile, __LINE__,
407 GetPString(IDS_COULDNTSTARTTHREADTEXT));
408 FreeListInfo(li);
409 }
410 }
411 }
412 }
413 }
414 break;
415
416 case IDM_EAS:
417 if (WinDlgBox(HWND_DESKTOP,
418 hwndFrame,
419 DisplayEAsProc, FM3ModHandle, EA_FRAME, (PVOID) list)) {
420 if (!PostMsg(WinWindowFromID(hwndFrame, FID_CLIENT),
421 UM_UPDATERECORDLIST, MPFROMP(list), MPVOID))
422 FreeList(list);
423 }
424 else
425 FreeList(list);
426 break;
427
428 case IDM_INFO:
429 if (WinDlgBox(HWND_DESKTOP,
430 hwndFrame,
431 FileInfoProc,
432 FM3ModHandle, FLE_FRAME, (PVOID) list) == 2) {
433 if (!PostMsg(WinWindowFromID(hwndFrame, FID_CLIENT),
434 UM_UPDATERECORDLIST, MPFROMP(list), MPVOID))
435 FreeList(list);
436 }
437 else
438 FreeList(list);
439 break;
440
441 case IDM_ARCHIVE:
442 {
443 DIRCNRDATA ad;
444 CHAR szBuffer[1025];
445
446 memset(&ad, 0, sizeof(ad));
447 ad.namecanchange = 1;
448 ad.info = arcsighead; // Hide dups
449 if (!WinDlgBox(HWND_DESKTOP,
450 hwndFrame,
451 SBoxDlgProc,
452 FM3ModHandle,
453 ASEL_FRAME, (PVOID) & ad.info) || !ad.info) {
454 // we blew it
455 FreeList(list);
456 break;
457 }
458 if (!ad.info->create &&
459 !ad.info->move &&
460 !ad.info->createwdirs &&
461 !ad.info->movewdirs && !ad.info->createrecurse) {
462 // 14 Aug 07 SHL fixme to tell user why we failed
463 FreeList(list);
464 break;
465 }
466 if (!WinDlgBox(HWND_DESKTOP, hwndFrame, ArchiveDlgProc, FM3ModHandle, ARCH_FRAME, (PVOID) & ad) || !*ad.arcname || !*ad.command) { /* we blew it */
467 FreeList(list);
468 break;
469 }
470 // Build archiver command line
471 strcpy(szBuffer, ad.command);
472 strcat(szBuffer, " ");
473 strcat(szBuffer, ad.arcname);
474 p = &szBuffer[strlen(szBuffer)];
475 if (ad.mask.szMask) {
476 strcat(szBuffer, " ");
477 strcat(szBuffer, ad.mask.szMask);
478 }
479 strcat(szBuffer, " ");
480 x = 0;
481 while (list[x]) {
482 FILESTATUS3 fsa;
483 memset(&fsa, 0, sizeof(fsa));
484 DosError(FERR_DISABLEHARDERR);
485 DosQueryPathInfo(list[x], FIL_STANDARD, &fsa, sizeof(fsa));
486 if (fsa.attrFile & FILE_DIRECTORY) {
487 BldQuotedFullPathName(szBuffer + strlen(szBuffer),
488 list[x], "*");
489 }
490 else
491 BldQuotedFileName(szBuffer + strlen(szBuffer), list[x]);
492 x++;
493 if (!list[x] || strlen(szBuffer) + strlen(list[x]) + 5 > 1024) {
494 runemf2(SEPARATE | WINDOWED | WAIT |
495 (fArcStuffVisible ? 0 : (BACKGROUND | MINIMIZED)),
496 HWND_DESKTOP, pszSrcFile, __LINE__,
497 NULL, NULL, "%s", szBuffer);
498 DosSleep(1); // Let archiver get started
499 *p = 0;
500 }
501 strcat(szBuffer, " ");
502 } // while
503 AddToList(ad.arcname, &files, &numfiles, &numalloc);
504 }
505 if (!PostMsg(WinWindowFromID(hwndFrame, FID_CLIENT),
506 UM_UPDATERECORDLIST, MPFROMP(list), MPVOID))
507 FreeList(list);
508 break;
509
510 case IDM_ATTRS:
511 {
512 LISTINFO li;
513
514 memset(&li, 0, sizeof(li));
515 li.list = list;
516 if (WinDlgBox(HWND_DESKTOP,
517 hwndFrame,
518 AttrListDlgProc,
519 FM3ModHandle, ATR_FRAME, MPFROMP(&li))) {
520 if (li.list && li.list[0]) {
521 if (!PostMsg(WinWindowFromID(hwndFrame, FID_CLIENT),
522 UM_UPDATERECORDLIST, MPFROMP(li.list), MPVOID))
523 FreeList(li.list);
524 }
525 }
526 else
527 FreeList(list);
528 }
529 break;
530
531 case IDM_MOVE:
532 case IDM_COPY:
533 if (!*path)
534 strcpy(path, targetdir);
535 if (!*path)
536 strcpy(path, list[0]);
537 MakeValidDir(path);
538 RetryPath:
539 if (SHORT1FROMMP(mp1) == IDM_MOVE) {
540 if (!WinDlgBox(HWND_DESKTOP,
541 hwndFrame,
542 WalkMoveDlgProc,
543 FM3ModHandle, WALK_FRAME, MPFROMP(path)) || !*path) {
544 FreeList(list);
545 goto Abort;
546 }
547 }
548 else {
549 if (!WinDlgBox(HWND_DESKTOP,
550 hwndFrame,
551 WalkCopyDlgProc,
552 FM3ModHandle, WALK_FRAME, MPFROMP(path)) || !*path) {
553 FreeList(list);
554 goto Abort;
555 }
556 }
557 if (driveflags[toupper(*path) - 'A'] & DRIVE_NOTWRITEABLE) {
558 saymsg(MB_CANCEL,
559 hwndFrame,
560 GetPString(IDS_ERRORTEXT),
561 "%s", GetPString(IDS_NOTWRITENOTARGETTEXT));
562 goto RetryPath;
563 }
564 /* intentional fallthru */
565 case IDM_RENAME:
566 {
567 CHAR newname[CCHMAXPATH], *moving, *move, *moved;
568 APIRET rc;
569 INT type;
570 FILESTATUS4L fs4;
571 BOOL isnewer, existed;
572
573 for (x = 0; list[x]; x++) {
574 Retry:
575 type = (SHORT1FROMMP(mp1) == IDM_RENAME) ? MOVE :
576 (SHORT1FROMMP(mp1) == IDM_MOVE) ? MOVE :
577 (SHORT1FROMMP(mp1) == IDM_WPSMOVE) ? WPSMOVE :
578 (SHORT1FROMMP(mp1) == IDM_WPSCOPY) ? WPSCOPY : COPY;
579 moving = (SHORT1FROMMP(mp1) == IDM_RENAME) ?
580 GetPString(IDS_RENAMINGTEXT) :
581 (SHORT1FROMMP(mp1) == IDM_MOVE ||
582 SHORT1FROMMP(mp1) == IDM_WPSMOVE) ?
583 GetPString(IDS_MOVINGTEXT) : GetPString(IDS_COPYINGTEXT);
584 move = (SHORT1FROMMP(mp1) == IDM_RENAME) ?
585 GetPString(IDS_RENAMETEXT) :
586 (SHORT1FROMMP(mp1) == IDM_MOVE ||
587 SHORT1FROMMP(mp1) == IDM_WPSMOVE) ?
588 GetPString(IDS_MOVETEXT) : GetPString(IDS_COPYTEXT);
589 moved = (SHORT1FROMMP(mp1) == IDM_RENAME) ?
590 GetPString(IDS_RENAMEDTEXT) :
591 (SHORT1FROMMP(mp1) == IDM_MOVE ||
592 SHORT1FROMMP(mp1) == IDM_WPSMOVE) ?
593 GetPString(IDS_MOVEDTEXT) : GetPString(IDS_COPIEDTEXT);
594 if (*path) {
595 strcpy(newname, path);
596 if (newname[strlen(newname) - 1] != '\\')
597 strcat(newname, "\\");
598 if (plen)
599 p = list[x] + plen;
600 else {
601 p = strrchr(list[x], '\\');
602 if (p)
603 p++;
604 else
605 p = list[x];
606 }
607 strcat(newname, p);
608 }
609 else
610 strcpy(newname, list[x]);
611 if ((wildcarding || SHORT1FROMMP(mp1) == IDM_RENAME) && *wildname) {
612
613 CHAR testname[CCHMAXPATH];
614
615 strcpy(testname, wildname);
616 if (AdjustWildcardName(newname, testname))
617 strcpy(newname, testname);
618 }
619 existed = (IsFile(newname) != -1);
620 isnewer = IsNewer(list[x], newname);
621 if (existed && SHORT1FROMMP(mp1) != IDM_RENAME && dontask) {
622 if (!overold && !overnew)
623 break;
624 if (!overold && !isnewer)
625 break;
626 if (!overnew && isnewer)
627 break;
628 }
629 if ((SHORT1FROMMP(mp1) == IDM_RENAME &&
630 (!dontask || !*wildname)) ||
631 (!dontask && existed) ||
632 (!dontask && wildcarding) ||
633 (IsFile(newname) == 0 && IsFile(list[x]) == 1)) {
634
635 MOVEIT mv;
636
637 memset(&mv, 0, sizeof(mv));
638 mv.rename = (SHORT1FROMMP(mp1) == IDM_RENAME);
639 mv.source = list[x];
640 strcpy(mv.target, newname);
641 rc = WinDlgBox(HWND_DESKTOP,
642 hwndFrame,
643 RenameProc,
644 FM3ModHandle, REN_FRAME, (PVOID) & mv);
645 if (!rc) {
646 FreeList(list);
647 goto Abort;
648 }
649 DosSleep(0); //26 Aug 07 GKY 1
650 if (mv.skip || !*mv.target)
651 break;
652 if (mv.dontask)
653 dontask = TRUE;
654 if (mv.overold)
655 overold = TRUE;
656 if (mv.overnew)
657 overnew = TRUE;
658 if (wildcarding || SHORT1FROMMP(mp1) == IDM_RENAME) {
659 p = strrchr(mv.target, '\\');
660 if (p && (strchr(p, '*') || strchr(p, '?'))) {
661 strcpy(wildname, mv.target);
662 AdjustWildcardName(list[x], mv.target);
663 }
664 else
665 *wildname = 0;
666 }
667 strcpy(newname, mv.target);
668 existed = (IsFile(newname) != -1);
669 isnewer = IsNewer(list[x], newname);
670 if (!mv.overwrite) {
671 if (existed && SHORT1FROMMP(mp1) != IDM_RENAME && dontask) {
672 if (!overold && !overnew)
673 break;
674 if (!overold && !isnewer)
675 break;
676 if (!overnew && isnewer)
677 break;
678 }
679 }
680 }
681 if (!stricmp(list[x], newname))
682 break;
683 sprintf(message,
684 " %s \"%s\" %s \"%s\"",
685 moving, list[x], GetPString(IDS_TOTEXT), newname);
686 WinSetWindowText(WinWindowFromID(hwndFrame, SEEALL_STATUS),
687 message);
688 if (fRealIdle)
689 priority_idle();
690 if (plen) {
691 /* make directory/ies, if required */
692
693 CHAR dirpart[CCHMAXPATH];
694
695 strcpy(dirpart, newname);
696 p = strrchr(dirpart, '\\');
697 if (p) {
698 *p = 0;
699 if (p > dirpart + 3)
700 MassMkdir((hwndMain) ? hwndMain : (HWND) 0, dirpart);
701 }
702 }
703 rc = docopyf(type, list[x], "%s", newname);
704 priority_normal();
705 if (rc) {
706 if ((rc == ERROR_DISK_FULL ||
707 rc == ERROR_HANDLE_DISK_FULL) &&
708 isalpha(*newname) &&
709 (driveflags[toupper(*newname) - 'A'] & DRIVE_REMOVABLE) &&
710 !(driveflags[toupper(*newname) - 'A'] & DRIVE_NOTWRITEABLE)
711 && toupper(*newname) != toupper(*list[x])
712 && !DosQueryPathInfo(list[x], FIL_QUERYEASIZEL, &fs4,
713 sizeof(fs4))
714 && !(fs4.attrFile & FILE_DIRECTORY)) {
715
716 FSALLOCATE fsa;
717 ULONG clFreeBytes;
718 CHAR *ptr;
719 INT cntr;
720
721 WinSetWindowText(WinWindowFromID(hwndFrame, SEEALL_STATUS),
722 GetPString(IDS_FITTINGTEXT));
723 DosError(FERR_DISABLEHARDERR);
724 if (!DosQueryFSInfo(toupper(*newname) - '@',
725 FSIL_ALLOC, &fsa, sizeof(fsa))) {
726 // Assume <2GB since file did not fit
727 clFreeBytes = fsa.cUnitAvail * fsa.cSectorUnit *
728 fsa.cbSector;
729 if (clFreeBytes) {
730 // Find item that will fit in available space
731 for (cntr = x + 1; list[cntr]; cntr++) {
732 DosError(FERR_DISABLEHARDERR);
733 if (!DosQueryPathInfo(list[cntr],
734 FIL_QUERYEASIZEL,
735 &fs4, sizeof(fs4)) &&
736 !(fs4.attrFile & FILE_DIRECTORY) &&
737 // fixme to use CBLIST_TO_EASIZE?
738 fs4.cbFile + fs4.cbList <= clFreeBytes) {
739 // Swap with failing item
740 ptr = list[x];
741 list[x] = list[cntr];
742 list[cntr] = ptr;
743 goto Retry;
744 }
745 }
746 WinSetWindowText(WinWindowFromID(hwndFrame,
747 SEEALL_STATUS),
748 GetPString(IDS_COULDNTFITTEXT));
749 }
750 }
751 rc = saymsg(MB_ABORTRETRYIGNORE | MB_ICONEXCLAMATION,
752 hwndFrame,
753 GetPString(IDS_DISKFULLTEXT),
754 "%s", GetPString(IDS_ANOTHERDISKTEXT));
755 if (rc == MBID_RETRY)
756 goto Retry;
757 if (rc == MBID_ABORT) {
758 FreeList(list);
759 goto Abort;
760 }
761 }
762 else {
763 if (LogFileHandle)
764 fprintf(LogFileHandle,
765 GetPString(IDS_LOGTOFAILEDTEXT),
766 move, list[x], newname, rc);
767 rc = Dos_Error(MB_ENTERCANCEL,
768 rc,
769 hwndFrame,
770 pszSrcFile,
771 __LINE__,
772 "%s %s \"%s\" %s\"%s\" %s.",
773 move,
774 GetPString(IDS_OFTEXT),
775 list[x],
776 GetPString(IDS_TOTEXT),
777 newname, GetPString(IDS_FAILEDTEXT));
778 if (rc == MBID_CANCEL) {
779 FreeList(list);
780 goto Abort;
781 }
782 }
783 }
784 else {
785 if (LogFileHandle)
786 fprintf(LogFileHandle,
787 "%s \"%s\" %s \"%s\"\n",
788 moved, list[x], GetPString(IDS_TOTEXT), newname);
789 AddToList(newname, &files, &numfiles, &numalloc);
790 }
791 }
792 }
793 if (SHORT1FROMMP(mp1) != IDM_COPY) {
794 if (!PostMsg(WinWindowFromID(hwndFrame, FID_CLIENT),
795 UM_UPDATERECORDLIST, MPFROMP(list), MPVOID))
796 FreeList(list);
797 }
798 else
799 FreeList(list);
800 break;
801
802 case IDM_UUDECODE:
803 for (x = 0; list[x]; x++)
804 UUD(list[x], NULL);
805 break;
806
807 case IDM_EXTRACT:
808 for (x = 0; list[x]; x++) {
809
810 EXTRDATA ex;
811 BOOL maskspaces = FALSE;
812
813 memset(&ex, 0, sizeof(ex));
814 ex.info = find_type(list[x], NULL);
815 if (!ex.info || (!ex.info->extract && !ex.info->exwdirs))
816 break;
817 ex.size = sizeof(ex);
818 ex.arcname = list[x];
819 strcpy(ex.masks, "*");
820 if (!WinDlgBox(HWND_DESKTOP,
821 hwndFrame,
822 ExtractDlgProc,
823 FM3ModHandle,
824 EXT_FRAME,
825 (PVOID) & ex) ||
826 !ex.ret || !*ex.command || !*ex.arcname || !*ex.extractdir)
827 break;
828 if (IsFile(ex.extractdir) != 0)
829 Runtime_Error(pszSrcFile, __LINE__, "directory expected");
830 else {
831 if (needs_quoting(ex.masks) && !strchr(ex.masks, '\"'))
832 maskspaces = TRUE;
833 runemf2(SEPARATE | WINDOWED |
834 (fArcStuffVisible ? 0 : (BACKGROUND | MINIMIZED)),
835 HWND_DESKTOP, pszSrcFile, __LINE__,
836 ex.extractdir, NULL,
837 "%s %s %s%s%s",
838 ex.command,
839 ex.arcname,
840 maskspaces ? "\"" : NullStr,
841 *ex.masks ? ex.masks : "*",
842 maskspaces ? "\"" : NullStr);
843 }
844 }
845 // fixme to not leak?
846 if (!PostMsg(WinWindowFromID(hwndFrame, FID_CLIENT),
847 UM_UPDATERECORDLIST, MPFROMP(list), MPVOID))
848 FreeList(list);
849 break;
850
851 case IDM_SUBJECT:
852 for (x = 0; list[x]; x++) {
853
854 INT ret;
855
856 if (IsFile(list[x]) == 1) {
857 ret = Subject(hwndFrame, list[x]);
858 if (!ret)
859 break;
860 }
861 }
862 if (!PostMsg(WinWindowFromID(hwndFrame, FID_CLIENT),
863 UM_UPDATERECORDLIST, MPFROMP(list), MPVOID))
864 FreeList(list);
865 break;
866
867 case IDM_OPENDEFAULT:
868 case IDM_OPENSETTINGS:
869 for (x = 0; list[x]; x++) {
870 if (IsFile(list[x]) != -1) {
871
872 CHAR *s;
873
874 switch (SHORT1FROMMP(mp1)) {
875 case IDM_OPENSETTINGS:
876 s = Settings;
877 break;
878 default:
879 s = Default;
880 break;
881 }
882 OpenObject(list[x], s, hwndFrame);
883 }
884 }
885 FreeList(list);
886 break;
887
888 case IDM_DELETE:
889 case IDM_PERMDELETE:
890 {
891 CHECKLIST cl;
892 INT isdir = 0, sysdir = 0, ro = 0, hs = 0;
893 FILESTATUS3 fsa;
894 CHAR prompt[CCHMAXPATH * 3];
895 APIRET error;
896
897 for (x = 0; list[x]; x++) {
898 if (IsRoot(list[x])) {
899 list = RemoveFromList(list, list[x]);
900 if (!list)
901 break;
902 x--;
903 continue;
904 }
905 DosError(FERR_DISABLEHARDERR);
906 if (DosQueryPathInfo(list[x], FIL_STANDARD, &fsa, sizeof(fsa))) {
907 list = RemoveFromList(list, list[x]);
908 if (!list)
909 break;
910 x--;
911 continue;
912 }
913 if (fsa.attrFile & FILE_DIRECTORY) {
914 isdir++;
915 if (stristr(list[x], ":\\OS2\\") ||
916 !stricmp(list[x] + 1, ":\\OS2"))
917 sysdir++;
918 }
919 else {
920 if (fsa.attrFile & (FILE_HIDDEN | FILE_SYSTEM))
921 hs++;
922 if (fsa.attrFile & FILE_READONLY)
923 ro++;
924 }
925 }
926 if (!list)
927 break;
928 if (fConfirmDelete || isdir) {
929 memset(&cl, 0, sizeof(cl));
930 cl.size = sizeof(cl);
931 cl.list = list;
932 cl.prompt = prompt;
933 cl.flags |= CHECK_FILES;
934 cl.cmd = SHORT1FROMMP(mp1);
935 sprintf(prompt,
936 GetPString(IDS_DELPROMPT1TEXT),
937 (SHORT1FROMMP(mp1) == IDM_DELETE) ?
938 NullStr :
939 GetPString(IDS_PERMANENTLYTEXT), &"s"[list[1] == NULL]);
940 if (isdir) {
941 sprintf(&prompt[strlen(prompt)],
942 GetPString(IDS_DELPROMPT2TEXT),
943 isdir,
944 (isdir > 1) ?
945 GetPString(IDS_ARETEXT) :
946 GetPString(IDS_ISTEXT),
947 (isdir == 1) ?
948 GetPString(IDS_ATEXT) :
949 NullStr,
950 (isdir > 1) ?
951 GetPString(IDS_IESTEXT) : GetPString(IDS_YTEXT));
952 if (sysdir)
953 sprintf(&prompt[strlen(prompt)],
954 GetPString(IDS_DELPROMPT3TEXT),
955 sysdir,
956 (sysdir == 1) ?
957 GetPString(IDS_YTEXT) : GetPString(IDS_IESTEXT));
958 }
959 if (ro)
960 sprintf(&prompt[strlen(prompt)],
961 GetPString(IDS_DELPROMPT4TEXT),
962 ro,
963 &"s"[ro == 1],
964 (ro > 1) ?
965 GetPString(IDS_ARETEXT) : GetPString(IDS_ISTEXT));
966 if (hs)
967 sprintf(&prompt[strlen(prompt)],
968 GetPString(IDS_DELPROMPT5TEXT),
969 hs,
970 &"s"[hs == 1],
971 (hs > 1) ?
972 GetPString(IDS_ARETEXT) : GetPString(IDS_ISTEXT));
973 if (ro || hs || sysdir)
974 DosBeep(300, 100);
975 strcat(prompt, GetPString(IDS_DELPROMPT6TEXT));
976 if (!WinDlgBox(HWND_DESKTOP,
977 WinWindowFromID(hwndFrame, FID_CLIENT),
978 CheckListProc,
979 FM3ModHandle, CHECK_FRAME, MPFROMP(&cl)))
980 break;
981 list = cl.list;
982 if (!list || !list[0])
983 break;
984 }
985 for (x = 0; list[x]; x++) {
986 fsa.attrFile = 0;
987 DosError(FERR_DISABLEHARDERR);
988 DosQueryPathInfo(list[x], FIL_STANDARD, &fsa, sizeof(fsa));
989 if (fsa.attrFile & FILE_DIRECTORY) {
990 sprintf(prompt, GetPString(IDS_DELETINGTEXT), list[x]);
991 WinSetWindowText(WinWindowFromID(hwndFrame, SEEALL_STATUS),
992 prompt);
993 error = (APIRET) wipeallf("%s%s*",
994 list[x],
995 (*list[x] &&
996 list[x][strlen(list[x]) - 1] !=
997 '\\') ? "\\" : NullStr);
998 DosError(FERR_DISABLEHARDERR);
999 if (!error)
1000 error = DosDeleteDir(list[x]);
1001 else
1002 DosDeleteDir(list[x]);
1003 }
1004 else {
1005 DosError(FERR_DISABLEHARDERR);
1006 if (SHORT1FROMMP(mp1) == IDM_DELETE)
1007 error = DosDelete(list[x]);
1008 else
1009 error = DosForceDelete(list[x]);
1010 if (error) {
1011 DosError(FERR_DISABLEHARDERR);
1012 make_deleteable(list[x]);
1013 if (SHORT1FROMMP(mp1) == IDM_DELETE)
1014 error = DosDelete(list[x]);
1015 else
1016 error = DosForceDelete(list[x]);
1017 }
1018 }
1019 if (error) {
1020 if (LogFileHandle)
1021 fprintf(LogFileHandle,
1022 GetPString(IDS_DELETEFAILED1TEXT), list[x], error);
1023 if (Dos_Error(MB_ENTERCANCEL,
1024 error,
1025 hwndFrame,
1026 pszSrcFile,
1027 __LINE__,
1028 GetPString(IDS_DELETEFAILED2TEXT),
1029 list[x]) == MBID_CANCEL)
1030 break;
1031 }
1032 else if (LogFileHandle)
1033 fprintf(LogFileHandle,
1034 "%s\n", GetPString(IDS_DELETEDTEXT), list[x]);
1035 AddToList(list[x], &files, &numfiles, &numalloc);
1036 }
1037 }
1038 FreeList(list);
1039 break;
1040
1041 case IDM_SAVETOLIST:
1042 if (list) {
1043 WinDlgBox(HWND_DESKTOP,
1044 WinWindowFromID(hwndFrame, FID_CLIENT),
1045 SaveAllListDlgProc,
1046 FM3ModHandle, SAV_FRAME, MPFROMP(list));
1047 FreeList(list);
1048 }
1049 break;
1050
1051 case IDM_SAVETOCLIP:
1052 case IDM_APPENDTOCLIP:
1053 case IDM_SAVETOCLIPFILENAME:
1054 case IDM_APPENDTOCLIPFILENAME:
1055 if (list) {
1056 ListToClipboardHab(WinQueryAnchorBlock(hwnd),
1057 list, SHORT1FROMMP(mp1));
1058 FreeList(list);
1059 }
1060 break;
1061
1062 default:
1063 if (list)
1064 FreeList(list);
1065 break;
1066 }
1067
1068 switch (SHORT1FROMMP(mp1)) {
1069 case IDM_MOVE:
1070 case IDM_COPY:
1071 case IDM_RENAME:
1072 sprintf(message,
1073 GetPString(IDS_OPSCOMPLETETEXT),
1074 SHORT1FROMMP(mp1) == IDM_MOVE ?
1075 GetPString(IDS_MOVETEXT) :
1076 SHORT1FROMMP(mp1) == IDM_COPY ?
1077 GetPString(IDS_COPYTEXT) :
1078 SHORT1FROMMP(mp1) == IDM_WPSMOVE ?
1079 GetPString(IDS_WPSMOVETEXT) :
1080 SHORT1FROMMP(mp1) == IDM_WPSCOPY ?
1081 GetPString(IDS_WPSCOPYTEXT) :
1082 GetPString(IDS_RENAMETEXT),
1083 &"s"[x == 1],
1084 SHORT1FROMMP(mp1) == IDM_MOVE ||
1085 SHORT1FROMMP(mp1) == IDM_COPY ||
1086 SHORT1FROMMP(mp1) == IDM_WPSMOVE ||
1087 SHORT1FROMMP(mp1) == IDM_WPSCOPY ?
1088 GetPString(IDS_TOTEXT) : NullStr,
1089 SHORT1FROMMP(mp1) == IDM_MOVE ||
1090 SHORT1FROMMP(mp1) == IDM_COPY ||
1091 SHORT1FROMMP(mp1) == IDM_WPSMOVE ||
1092 SHORT1FROMMP(mp1) == IDM_WPSCOPY ?
1093 path : NullStr,
1094 x != 1 ? GetPString(IDS_ARETEXT) : GetPString(IDS_ISTEXT));
1095 WinSetWindowText(WinWindowFromID(hwndFrame, SEEALL_STATUS), message);
1096 if (toupper(*path) < 'C')
1097 DosBeep(1000, 25);
1098 DosSleep(16); // 05 Aug 07 GKY 33
1099 break;
1100
1101 default:
1102 break;
1103 }
1104 Abort:
1105 if (files) {
1106 if (!PostMsg(WinWindowFromID(hwndFrame, FID_CLIENT),
1107 UM_UPDATERECORDLIST, MPFROMP(files), MPVOID))
1108 FreeList(files);
1109 }
1110 PostMsg(WinWindowFromID(hwndFrame, FID_CLIENT),
1111 UM_RESCAN, MPVOID, MPVOID);
1112 }
1113 return 0;
1114
1115 case WM_CLOSE:
1116 WinDestroyWindow(hwnd);
1117 break;
1118
1119 case WM_DESTROY:
1120 if (!PostMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID))
1121 WinSendMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID);
1122 break;
1123 }
1124 return WinDefWindowProc(hwnd, msg, mp1, mp2);
1125}
1126
1127static VOID MakeSeeObjWinThread(VOID * args)
1128{
1129 HAB hab2;
1130 HMQ hmq2;
1131 HWND hwndObj;
1132 ALLDATA *ad = (ALLDATA *) args;
1133 QMSG qmsg2;
1134
1135 if (ad) {
1136# ifdef FORTIFY
1137 Fortify_EnterScope();
1138# endif
1139 hab2 = WinInitialize(0);
1140 if (hab2) {
1141 hmq2 = WinCreateMsgQueue(hab2, 256);
1142 if (hmq2) {
1143 DosError(FERR_DISABLEHARDERR);
1144 WinRegisterClass(hab2,
1145 WC_OBJECTWINDOW,
1146 SeeObjWndProc, 0, sizeof(PVOID));
1147 hwndObj = WinCreateWindow(HWND_OBJECT,
1148 WC_OBJECTWINDOW,
1149 (PSZ) NULL,
1150 0,
1151 0,
1152 0,
1153 0,
1154 0, 0, HWND_TOP, SEEALL_OBJ, NULL, NULL);
1155 if (!hwndObj) {
1156 Win_Error2(HWND_OBJECT, HWND_DESKTOP, pszSrcFile, __LINE__,
1157 IDS_WINCREATEWINDOW);
1158 if (!PostMsg(ad->hwndClient, WM_CLOSE, MPVOID, MPVOID))
1159 WinSendMsg(ad->hwndClient, WM_CLOSE, MPVOID, MPVOID);
1160 }
1161 else {
1162 ad->hwndObj = hwndObj;
1163 WinSetWindowULong(hwndObj, QWL_USER, ad->hwndFrame);
1164 priority_normal();
1165 while (WinGetMsg(hab2, &qmsg2, (HWND) 0, 0, 0))
1166 WinDispatchMsg(hab2, &qmsg2);
1167 WinDestroyWindow(hwndObj);
1168 }
1169 WinDestroyMsgQueue(hmq2);
1170 }
1171 else
1172 WinTerminate(hab2);
1173 }
1174# ifdef FORTIFY
1175 Fortify_LeaveScope();
1176# endif
1177 }
1178}
1179
1180static VOID SelectMask(HWND hwnd, BOOL deselect)
1181{
1182 MASK mask;
1183 register ULONG x, y, z;
1184 BOOL ret;
1185 ALLDATA *pAD = WinQueryWindowPtr(hwnd, QWL_USER);
1186
1187 memset(&mask, 0, sizeof(mask));
1188 mask.fNoAttribs = FALSE;
1189 mask.fNoDirs = TRUE;
1190 mask.attrFile = pAD->mask.attrFile;
1191 mask.antiattr = pAD->mask.antiattr;
1192 mask.fIsSeeAll = TRUE;
1193 strcpy(mask.prompt,
1194 GetPString((!deselect) ?
1195 IDS_SELECTFILTERTEXT : IDS_DESELECTFILTERTEXT));
1196 if (WinDlgBox(HWND_DESKTOP,
1197 hwnd,
1198 PickMaskDlgProc,
1199 FM3ModHandle,
1200 MSK_FRAME,
1201 MPFROMP(&mask)) &&
1202 (*mask.szMask ||
1203 mask.attrFile != pAD->mask.attrFile ||
1204 mask.antiattr != pAD->mask.antiattr)) {
1205 for (x = 0; x < pAD->afindexcnt; x++) {
1206 y = (pAD->invertsort) ? (pAD->afindexcnt - 1) - x : x;
1207 ret = FALSE;
1208 if (mask.pszMasks[1]) {
1209 for (z = 0; mask.pszMasks[z]; z++) {
1210 if (*mask.pszMasks[z]) {
1211 if (*mask.pszMasks[z] != '/') {
1212 if (wildcard((strchr(mask.pszMasks[z], '\\') ||
1213 strchr(mask.pszMasks[z], ':')) ?
1214 pAD->afindex[y]->fullname : pAD->afindex[y]->
1215 filename, mask.pszMasks[z], FALSE))
1216 ret = TRUE;
1217 }
1218 else {
1219 if (wildcard((strchr(mask.pszMasks[z], '\\') ||
1220 strchr(mask.pszMasks[z], ':')) ?
1221 pAD->afindex[y]->fullname : pAD->afindex[y]->
1222 filename, mask.pszMasks[y] + 1, FALSE)) {
1223 ret = FALSE;
1224 break;
1225 }
1226 }
1227 }
1228 }
1229 }
1230 else if (*mask.szMask) {
1231 if (wildcard((strchr(mask.szMask, '\\') ||
1232 strchr(mask.szMask, ':')) ?
1233 pAD->afindex[y]->fullname : pAD->afindex[y]->filename,
1234 mask.szMask, FALSE))
1235 ret = TRUE;
1236 }
1237 else
1238 ret = TRUE;
1239 if (ret) {
1240 if ((!(mask.attrFile & FILE_HIDDEN)
1241 && (pAD->afindex[y]->attrFile & FILE_HIDDEN))
1242 || (!(mask.attrFile & FILE_SYSTEM)
1243 && (pAD->afindex[y]->attrFile & FILE_SYSTEM))
1244 || (!(mask.attrFile & FILE_READONLY)
1245 && (pAD->afindex[y]->attrFile & FILE_READONLY))
1246 || (!(mask.attrFile & FILE_ARCHIVED)
1247 && (pAD->afindex[y]->attrFile & FILE_ARCHIVED)))
1248 ret = FALSE;
1249 else
1250 if (((mask.antiattr & FILE_HIDDEN)
1251 && !(pAD->afindex[y]->attrFile & FILE_HIDDEN))
1252 || ((mask.antiattr & FILE_SYSTEM)
1253 && !(pAD->afindex[y]->attrFile & FILE_SYSTEM))
1254 || ((mask.antiattr & FILE_READONLY)
1255 && !(pAD->afindex[y]->attrFile & FILE_READONLY))
1256 || ((mask.antiattr & FILE_ARCHIVED)
1257 && !(pAD->afindex[y]->attrFile & FILE_ARCHIVED)))
1258 ret = FALSE;
1259 }
1260 if (ret) {
1261 if (deselect) {
1262 if (pAD->afindex[y]->flags & AF_SELECTED) {
1263 pAD->selected--;
1264 pAD->ullSelectedBytes -= pAD->afindex[y]->cbFile;
1265 pAD->afindex[y]->flags &= ~AF_SELECTED;
1266 }
1267 }
1268 else {
1269 if (~pAD->afindex[y]->flags & AF_SELECTED) {
1270 pAD->selected++;
1271 pAD->ullSelectedBytes += pAD->afindex[y]->cbFile;
1272 pAD->afindex[y]->flags |= AF_SELECTED;
1273 }
1274 }
1275 }
1276 } // for
1277 }
1278}
1279
1280static VOID CollectList(HWND hwnd, CHAR ** list)
1281{
1282 if (!Collector) {
1283 if (hwndMain && !fExternalCollector && !strcmp(realappname, FM3Str)) {
1284
1285 HWND hwndC;
1286 SWP swp;
1287
1288 if (!fAutoTile)
1289 GetNextWindowPos(hwndMain, &swp, NULL, NULL);
1290 hwndC = StartCollector(hwndMain, 4);
1291 if (hwndC) {
1292 if (!fAutoTile)
1293 WinSetWindowPos(hwndC, HWND_TOP, swp.x, swp.y,
1294 swp.cx, swp.cy, SWP_MOVE | SWP_SIZE |
1295 SWP_SHOW | SWP_ZORDER);
1296 else
1297 TileChildren(hwndMain, TRUE);
1298 WinSetWindowPos(hwndC, HWND_TOP, 0, 0, 0, 0, SWP_ACTIVATE);
1299 DosSleep(100);//05 Aug 07 GKY 250
1300 }
1301 }
1302 else {
1303 StartCollector(HWND_DESKTOP, 4);
1304 DosSleep(100);//05 Aug 07 GKY 250
1305 }
1306 }
1307 if (!PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_COLLECTOR, 0),
1308 MPFROMP(list)))
1309 FreeList(list);
1310}
1311
1312static VOID FreeAllFilesList(HWND hwnd)
1313{
1314 ALLDATA *ad = WinQueryWindowPtr(hwnd, QWL_USER);
1315 register ULONG x;
1316
1317 if (ad->afhead && ad->afheadcnt) {
1318 for (x = 0; x < ad->afheadcnt; x++) {
1319 xfree(ad->afhead[x].fullname, pszSrcFile, __LINE__);
1320 }
1321 free(ad->afhead);
1322 ad->afhead = NULL;
1323 xfree(ad->afindex, pszSrcFile, __LINE__);
1324 ad->afindex = NULL;
1325 }
1326 DosPostEventSem(CompactSem);
1327 ad->afalloc = ad->afindexcnt = ad->afheadcnt = ad->longest = ad->longestw =
1328 ad->maxx = ad->horzscroll = 0;
1329}
1330
1331static CHAR **BuildAList(HWND hwnd)
1332{
1333 ALLDATA *ad = WinQueryWindowPtr(hwnd, QWL_USER);
1334 ULONG x;
1335 ULONG y;
1336 ULONG z = 0;
1337 CHAR **list = NULL;
1338 UINT numfiles = 0;
1339 UINT numalloc = 0;
1340 INT error;
1341
1342 if (ad->selected) {
1343 for (x = 0; x < ad->afindexcnt; x++) {
1344 y = (ad->invertsort) ? (ad->afindexcnt - 1) - x : x;
1345 if (ad->afindex[y]->flags & AF_SELECTED) {
1346 error = AddToList(ad->afindex[y]->fullname, &list,
1347 &numfiles, &numalloc);
1348 if (error)
1349 break;
1350 z++;
1351 if (z >= ad->selected)
1352 break;
1353 }
1354 }
1355 }
1356 return list;
1357}
1358
1359static BOOL Mark(HWND hwnd, INT command, CHAR ** list)
1360{
1361 /* Marks only unfiltered files */
1362
1363 ALLDATA *pAD = WinQueryWindowPtr(hwnd, QWL_USER);
1364 register ULONG x, y, z;
1365 BOOL ret = TRUE;
1366 BOOL didone = FALSE;
1367
1368 for (x = 0; x < pAD->afindexcnt; x++) {
1369 y = (pAD->invertsort) ? (pAD->afindexcnt - 1) - x : x;
1370 if (list) {
1371 ret = FALSE;
1372 for (z = 0; list[z]; z++) {
1373 if (!stricmp(list[z], pAD->afindex[y]->fullname)) {
1374 ret = TRUE;
1375 break;
1376 }
1377 }
1378 }
1379 if (ret) {
1380 didone = TRUE;
1381 if (command == AFM_UNMARK) {
1382 if (pAD->afindex[y]->flags & AF_SELECTED) {
1383 pAD->selected--;
1384 pAD->ullSelectedBytes -= pAD->afindex[y]->cbFile;
1385 pAD->afindex[y]->flags &= ~AF_SELECTED;
1386 }
1387 }
1388 else if (command == AFM_MARK) {
1389 if (~pAD->afindex[y]->flags & AF_SELECTED) {
1390 pAD->selected++;
1391 pAD->ullSelectedBytes += pAD->afindex[y]->cbFile;
1392 pAD->afindex[y]->flags |= AF_SELECTED;
1393 }
1394 }
1395 else if (command == AFM_INVERT) {
1396 if (pAD->afindex[y]->flags & AF_SELECTED) {
1397 pAD->selected--;
1398 pAD->ullSelectedBytes -= pAD->afindex[y]->cbFile;
1399 pAD->afindex[y]->flags &= ~AF_SELECTED;
1400 }
1401 else {
1402 pAD->selected++;
1403 pAD->ullSelectedBytes += pAD->afindex[y]->cbFile;
1404 pAD->afindex[y]->flags |= AF_SELECTED;
1405 }
1406 }
1407 else if (command == AFM_MARKDELETED) {
1408 if (pAD->afindex[y]->flags & AF_SELECTED)
1409 pAD->afindex[y]->flags |= AF_DELETED;
1410 }
1411 else if (command == AFM_FILTER) {
1412 if (pAD->afindex[y]->flags & AF_SELECTED)
1413 pAD->afindex[y]->flags |= AF_FILTERED;
1414 }
1415 }
1416 } // for x
1417 return didone;
1418}
1419
1420static BOOL UpdateList(HWND hwnd, CHAR **list)
1421{
1422 /* Updates files in the list */
1423
1424 ALLDATA *ad = WinQueryWindowPtr(hwnd, QWL_USER);
1425 ULONG x, z;
1426 BOOL ret, didone = FALSE;
1427 FILEFINDBUF3L ffb;
1428 ULONG ulFindCnt;
1429 HDIR hdir;
1430 CHAR *p;
1431
1432 if (list) {
1433 for (z = 0; list[z] && !ad->stopflag; z++) {
1434 ret = FALSE;
1435 for (x = 0; x < ad->afheadcnt; x++) {
1436 if (!stricmp(list[z], ad->afhead[x].fullname)) {
1437 ret = TRUE;
1438 break;
1439 }
1440 }
1441 if (ret) {
1442 didone = TRUE;
1443 hdir = HDIR_CREATE;
1444 ulFindCnt = 1;
1445 if (!xDosFindFirst(list[z], &hdir, FILE_NORMAL | FILE_ARCHIVED |
1446 FILE_DIRECTORY | FILE_READONLY | FILE_SYSTEM |
1447 FILE_HIDDEN, &ffb, sizeof(ffb), &ulFindCnt,
1448 FIL_STANDARDL)) {
1449 DosFindClose(hdir);
1450 if (!(ffb.attrFile & FILE_DIRECTORY)) {
1451 ad->afhead[x].attrFile = (USHORT) ffb.attrFile;
1452 ad->afhead[x].cbFile = ffb.cbFile;
1453 ad->afhead[x].date = ffb.fdateLastWrite;
1454 ad->afhead[x].time = ffb.ftimeLastWrite;
1455 }
1456 else
1457 ad->afhead[x].flags |= AF_DELETED;
1458 }
1459 else
1460 ad->afhead[x].flags |= AF_DELETED;
1461 }
1462 else if (isalpha(*list[z]) && ad->abDrvFlags[toupper(*list[z]) - 'A']) {
1463 didone = TRUE;
1464 hdir = HDIR_CREATE;
1465 ulFindCnt = 1;
1466 if (!xDosFindFirst(list[z], &hdir, FILE_NORMAL | FILE_ARCHIVED |
1467 FILE_DIRECTORY | FILE_READONLY | FILE_SYSTEM |
1468 FILE_HIDDEN, &ffb, sizeof(ffb), &ulFindCnt,
1469 FIL_STANDARDL)) {
1470 DosFindClose(hdir);
1471 if (!(ffb.attrFile & FILE_DIRECTORY)) {
1472 if (!ad->afalloc || ad->afheadcnt > ad->afalloc - 1) {
1473
1474 ALLFILES *temp, **templ;
1475
1476 temp =
1477 xrealloc(ad->afhead, (ad->afalloc + 1) * sizeof(ALLFILES),
1478 pszSrcFile, __LINE__);
1479 if (!temp) {
1480 ad->stopflag = 1;
1481 break;
1482 }
1483 else {
1484 ad->afhead = temp;
1485 templ =
1486 xrealloc(ad->afindex,
1487 (ad->afalloc + 1) * sizeof(ALLFILES *), pszSrcFile,
1488 __LINE__);
1489 if (!templ) {
1490 ad->stopflag = 1;
1491 break;
1492 }
1493 else
1494 ad->afindex = templ;
1495 ad->afalloc++;
1496 }
1497 }
1498 ad->afhead[ad->afheadcnt].fullname =
1499 xstrdup(list[z], pszSrcFile, __LINE__);
1500 if (ad->afhead[ad->afheadcnt].fullname) {
1501 p = strrchr(ad->afhead[ad->afheadcnt].fullname, '\\');
1502 if (!p)
1503 p = ad->afhead[ad->afheadcnt].fullname;
1504 else
1505 p++;
1506 ad->afhead[ad->afheadcnt].filename = p;
1507 ad->afhead[ad->afheadcnt].cbFile = ffb.cbFile;
1508 ad->afhead[ad->afheadcnt].date = ffb.fdateLastWrite;
1509 ad->afhead[ad->afheadcnt].time = ffb.ftimeLastWrite;
1510 ad->afhead[ad->afheadcnt].attrFile = (USHORT) ffb.attrFile;
1511 ad->afhead[ad->afheadcnt].flags = 0;
1512 if (ad->longest < strlen(ad->afhead[ad->afheadcnt].filename))
1513 ad->longest = strlen(ad->afhead[ad->afheadcnt].filename);
1514 if (ad->longestw < strlen(ad->afhead[ad->afheadcnt].fullname))
1515 ad->longestw = strlen(ad->afhead[ad->afheadcnt].fullname);
1516
1517 ad->afheadcnt++;
1518 }
1519 else {
1520 // saymsg(MB_ENTER,HWND_DESKTOP,DEBUG_STRING,"Strdup failed.");
1521 ad->stopflag = 1;
1522 break;
1523 }
1524 }
1525 }
1526 }
1527 }
1528 }
1529 return didone;
1530}
1531
1532static int comparefullnames(const void *v1, const void *v2)
1533{
1534 ALLFILES *d1 = *(ALLFILES **) v1;
1535 ALLFILES *d2 = *(ALLFILES **) v2;
1536 int ret;
1537
1538 ret = stricmp(d1->fullname, d2->fullname);
1539 return ret;
1540}
1541
1542static int comparenames(const void *v1, const void *v2)
1543{
1544 ALLFILES *d1 = *(ALLFILES **) v1;
1545 ALLFILES *d2 = *(ALLFILES **) v2;
1546 int ret;
1547
1548 ret = stricmp(d1->filename, d2->filename);
1549 if (!ret)
1550 ret = comparefullnames(v1, v2);
1551 return ret;
1552}
1553
1554static int compareexts(const void *v1, const void *v2)
1555{
1556 ALLFILES *d1 = *(ALLFILES **) v1;
1557 ALLFILES *d2 = *(ALLFILES **) v2;
1558 register CHAR *p1, *p2;
1559 int ret;
1560
1561 p1 = strrchr(d1->filename, '.');
1562 p2 = strrchr(d2->filename, '.');
1563 if (!p1)
1564 p1 = NullStr;
1565 else
1566 p1++;
1567 if (!p2)
1568 p2 = NullStr;
1569 else
1570 p2++;
1571 ret = stricmp(p1, p2);
1572 if (!ret)
1573 ret = comparenames(v1, v2);
1574 return ret;
1575}
1576
1577static int comparesizes(const void *v1, const void *v2)
1578{
1579 ALLFILES *d1 = *(ALLFILES **) v1;
1580 ALLFILES *d2 = *(ALLFILES **) v2;
1581 int ret;
1582
1583 ret = (d1->cbFile > d2->cbFile) ? 1 : (d1->cbFile == d2->cbFile) ? 0 : -1;
1584 if (!ret)
1585 ret = comparenames(v1, v2);
1586 return ret;
1587}
1588
1589static int comparedates(const void *v1, const void *v2)
1590{
1591 ALLFILES *d1 = *(ALLFILES **) v1;
1592 ALLFILES *d2 = *(ALLFILES **) v2;
1593 int ret;
1594
1595 ret = TestFDates(NULL, NULL,
1596 &d2->date, &d2->time,
1597 &d1->date, &d1->time);
1598 /*(d1->date.year > d2->date.year) ? 1 :
1599 (d1->date.year < d2->date.year) ? -1 :
1600 (d1->date.month > d2->date.month) ? 1 :
1601 (d1->date.month < d2->date.month) ? -1 :
1602 (d1->date.day > d2->date.day) ? 1 :
1603 (d1->date.day < d2->date.day) ? -1 :
1604 (d1->time.hours > d2->time.hours) ? 1 :
1605 (d1->time.hours < d2->time.hours) ? -1 :
1606 (d1->time.minutes > d2->time.minutes) ? 1 :
1607 (d1->time.minutes < d2->time.minutes) ? -1 :
1608 (d1->time.twosecs > d2->time.twosecs) ? 1 :
1609 (d1->time.twosecs < d2->time.twosecs) ? -1 : 0;*/
1610
1611 if (!ret)
1612 ret = comparenames(v1, v2);
1613 return ret;
1614}
1615
1616static VOID ReSort(HWND hwnd)
1617{
1618 ALLDATA *pAD = WinQueryWindowPtr(hwnd, QWL_USER);
1619 register ULONG x, y;
1620
1621 pAD->selected = 0;
1622 pAD->ullSelectedBytes = 0;
1623 for (x = 0, y = 0; x < pAD->afheadcnt; x++) {
1624 if (!(pAD->afhead[x].flags & (AF_DELETED | AF_FILTERED))) {
1625 if (pAD->afhead[x].flags & AF_SELECTED) {
1626 pAD->selected++;
1627 pAD->ullSelectedBytes += pAD->afhead[x].cbFile;
1628 }
1629 pAD->afindex[y++] = &(pAD->afhead[x]);
1630 }
1631 } // for x
1632 pAD->afindexcnt = y;
1633 PostMsg(hwnd, UM_SETUP3, MPVOID, MPVOID);
1634 if (!pAD->stopflag && pAD->pfnCompare && pAD->afindexcnt) {
1635 WinSendMsg(hwnd, UM_RESCAN, MPFROMLONG(1), MPVOID);
1636 qsort(pAD->afindex, pAD->afindexcnt, sizeof(ALLFILES *), pAD->pfnCompare);
1637 }
1638}
1639
1640VOID FindDupesThread(VOID * args)
1641{
1642 register ULONG x, z;
1643 register CHAR *px, *pz;
1644 CHAR s[80];
1645 INT error;
1646 HWND hwnd = (HWND) args;
1647 HAB hab2 = (HAB) 0;
1648 HMQ hmq2 = (HMQ) 0;
1649 ALLDATA *ad = WinQueryWindowPtr(hwnd, QWL_USER);
1650
1651# ifdef FORTIFY
1652 Fortify_EnterScope();
1653# endif
1654 if (!DosRequestMutexSem(ad->hmtxScan, SEM_INDEFINITE_WAIT)) {
1655 priority_normal();
1656 hab2 = WinInitialize(0);
1657 if (hab2) {
1658 hmq2 = WinCreateMsgQueue(hab2, 0);
1659 if (hmq2) {
1660 WinCancelShutdown(hmq2, TRUE);
1661 IncrThreadUsage();
1662 if (ad->cursored <= ad->afindexcnt) {
1663 for (x = 0; x < ad->afheadcnt; x++)
1664 ad->afhead[x].flags &= (~(AF_DUPE | AF_SELECTED));
1665 DosSleep(0); //26 Aug 07 GKY 1
1666 for (x = 0; x < ad->afheadcnt && !ad->stopflag; x++) {
1667 if (!(ad->afhead[x].flags & (AF_DUPE | AF_FILTERED))) {
1668 if (!(x % 50)) {
1669 sprintf(s,
1670 GetPString(IDS_DUPECHECKINGOFTEXT), x, ad->afheadcnt);
1671 WinSetWindowText(ad->hwndStatus, s);
1672 }
1673 for (z = 0; z < ad->afheadcnt && !ad->stopflag; z++) {
1674 if (x != z &&
1675 !(ad->afhead[z].flags & (AF_DUPE | AF_FILTERED)))
1676 {
1677 if (ad->dupeflags & DP_SIZES) {
1678 if (ad->afhead[x].cbFile != ad->afhead[z].cbFile)
1679 goto SkipNonDupe;
1680 }
1681 if (ad->dupeflags & DP_DATES) {
1682 if (*(INT *) & ad->afhead[x].date !=
1683 *(INT *) & ad->afhead[z].date ||
1684 *(INT *) & ad->afhead[x].time !=
1685 *(INT *) & ad->afhead[z].time)
1686 goto SkipNonDupe;
1687 }
1688 if (ad->dupeflags & DP_NAMES) {
1689 if (ad->dupeflags & DP_EXTS) {
1690 px = strrchr(ad->afhead[x].filename, '.');
1691 pz = strrchr(ad->afhead[z].filename, '.');
1692 if ((px || pz) && (!px || !pz))
1693 goto SkipNonDupe;
1694 if (px) {
1695 *px = 0;
1696 *pz = 0;
1697 }
1698 }
1699 if (stricmp(ad->afhead[x].filename,
1700 ad->afhead[z].filename)) {
1701 if (ad->dupeflags & DP_EXTS) {
1702 if (px) {
1703 *px = '.';
1704 *pz = '.';
1705 }
1706 }
1707 goto SkipNonDupe;
1708 }
1709 if (ad->dupeflags & DP_EXTS) {
1710 if (px) {
1711 *px = '.';
1712 *pz = '.';
1713 }
1714 }
1715 }
1716 if (ad->dupeflags & DP_CRCS) {
1717 if (!(ad->afhead[x].flags & AF_CRCED)) {
1718 ad->afhead[x].CRC = CRCFile(ad->afhead[x].fullname,
1719 &error);
1720 if (!error)
1721 ad->afhead[x].flags |= AF_CRCED;
1722 }
1723 if (!(ad->afhead[z].flags & AF_CRCED)) {
1724 ad->afhead[z].CRC = CRCFile(ad->afhead[z].fullname,
1725 &error);
1726 if (!error)
1727 ad->afhead[z].flags |= AF_CRCED;
1728 }
1729 if ((ad->afhead[x].flags & AF_CRCED) &&
1730 (ad->afhead[z].flags & AF_CRCED)) {
1731 if (ad->afhead[x].CRC != ad->afhead[z].CRC)
1732 goto SkipNonDupe;
1733 }
1734 DosSleep(0);
1735 }
1736 ad->afhead[x].flags |= AF_DUPE;
1737 ad->afhead[z].flags |= AF_DUPE;
1738 SkipNonDupe:
1739 ;
1740 }
1741 } // for
1742 DosSleep(0);
1743 }
1744 } // for
1745 for (x = 0; x < ad->afheadcnt && !ad->stopflag; x++) {
1746 if (!(ad->afhead[x].flags & AF_DUPE))
1747 ad->afhead[x].flags |= AF_FILTERED;
1748 }
1749 ReSort(hwnd);
1750 WinInvalidateRect(hwnd, NULL, FALSE);
1751 }
1752 }
1753 }
1754 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
1755 DosReleaseMutexSem(ad->hmtxScan);
1756 } // if got sem
1757 if (hmq2) {
1758 PostMsg(hwnd, UM_CONTAINER_FILLED, MPVOID, MPVOID);
1759 WinDestroyMsgQueue(hmq2);
1760 }
1761 if (hab2) {
1762 DecrThreadUsage();
1763 WinTerminate(hab2);
1764 }
1765# ifdef FORTIFY
1766 Fortify_LeaveScope();
1767# endif
1768}
1769
1770static VOID FilterAll(HWND hwnd, ALLDATA *ad);
1771
1772static VOID FilterList(HWND hwnd)
1773{
1774 ULONG x;
1775 ALLDATA *ad = WinQueryWindowPtr(hwnd, QWL_USER);
1776 CHAR *p;
1777
1778 if (ad->cursored <= ad->afindexcnt) {
1779 x = ad->cursored - 1;
1780 x = (ad->invertsort) ? (ad->afindexcnt - 1) - x : x;
1781 p = strrchr(ad->afindex[x]->filename, '.');
1782 if (p) {
1783 strcpy(ad->mask.szMask, "*");
1784 strcat(ad->mask.szMask, p);
1785 }
1786 }
1787 *(ad->mask.prompt) = 0;
1788 ad->mask.fIsSeeAll = TRUE;
1789 if (WinDlgBox(HWND_DESKTOP, hwnd, PickMaskDlgProc,
1790 FM3ModHandle, MSK_FRAME, MPFROMP(&ad->mask)))
1791 FilterAll(hwnd, ad);
1792}
1793
1794static VOID FilterAll(HWND hwnd, ALLDATA *ad)
1795{
1796 ULONG x, z;
1797 BOOL ret;
1798
1799 if (ad) {
1800 for (x = 0; x < ad->afheadcnt; x++) {
1801 ret = FALSE;
1802 if (ad->mask.pszMasks[1]) {
1803 for (z = 0; ad->mask.pszMasks[z]; z++) {
1804 if (*ad->mask.pszMasks[z]) {
1805 if (*ad->mask.pszMasks[z] != '/') {
1806 if (wildcard((strchr(ad->mask.pszMasks[z], '\\') ||
1807 strchr(ad->mask.pszMasks[z], ':')) ?
1808 ad->afhead[x].fullname : ad->afhead[x].filename,
1809 ad->mask.pszMasks[z], FALSE))
1810 ret = TRUE;
1811 }
1812 else {
1813 if (wildcard((strchr(ad->mask.pszMasks[z], '\\') ||
1814 strchr(ad->mask.pszMasks[z], ':')) ?
1815 ad->afhead[x].fullname : ad->afhead[x].filename,
1816 ad->mask.pszMasks[z] + 1, FALSE)) {
1817 ret = FALSE;
1818 break;
1819 }
1820 }
1821 }
1822 }
1823 }
1824 else if (*ad->mask.szMask) {
1825 if (wildcard((strchr(ad->mask.szMask, '\\') ||
1826 strchr(ad->mask.szMask, ':')) ?
1827 ad->afhead[x].fullname : ad->afhead[x].filename,
1828 ad->mask.szMask, FALSE))
1829 ret = TRUE;
1830 }
1831 else
1832 ret = TRUE;
1833
1834 if (ret) {
1835 if ((!(ad->mask.attrFile & FILE_HIDDEN)
1836 && (ad->afhead[x].attrFile & FILE_HIDDEN))
1837 || (!(ad->mask.attrFile & FILE_SYSTEM)
1838 && (ad->afhead[x].attrFile & FILE_SYSTEM))
1839 || (!(ad->mask.attrFile & FILE_READONLY)
1840 && (ad->afhead[x].attrFile & FILE_READONLY))
1841 || (!(ad->mask.attrFile & FILE_ARCHIVED)
1842 && (ad->afhead[x].attrFile & FILE_ARCHIVED)))
1843 ret = FALSE;
1844 else
1845 if (((ad->mask.antiattr & FILE_HIDDEN)
1846 && !(ad->afhead[x].attrFile & FILE_HIDDEN))
1847 || ((ad->mask.antiattr & FILE_SYSTEM)
1848 && !(ad->afhead[x].attrFile & FILE_SYSTEM))
1849 || ((ad->mask.antiattr & FILE_READONLY)
1850 && !(ad->afhead[x].attrFile & FILE_READONLY))
1851 || ((ad->mask.antiattr & FILE_ARCHIVED)
1852 && !(ad->afhead[x].attrFile & FILE_ARCHIVED)))
1853 ret = FALSE;
1854 }
1855
1856 if (!ret)
1857 ad->afhead[x].flags |= AF_FILTERED;
1858 else
1859 ad->afhead[x].flags &= (~AF_FILTERED);
1860 }
1861 ReSort(hwnd);
1862 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
1863 WinInvalidateRect(hwnd, NULL, FALSE);
1864 }
1865}
1866
1867static ULONG RemoveDeleted(HWND hwnd)
1868{
1869 ALLDATA *pAD = WinQueryWindowPtr(hwnd, QWL_USER);
1870 ULONG oldafheadcnt = pAD->afheadcnt;
1871 register ULONG x, y;
1872
1873 for (x = 0; x < pAD->afheadcnt; x++) {
1874 if (pAD->afhead[x].flags & AF_DELETED) {
1875 for (y = x; y < pAD->afheadcnt; y++) {
1876 if (~pAD->afhead[y].flags & AF_DELETED)
1877 break;
1878 if (pAD->afhead[y].flags & AF_SELECTED &&
1879 ~pAD->afhead[y].flags & AF_FILTERED) {
1880 pAD->selected--;
1881 pAD->ullSelectedBytes -= pAD->afhead[y].cbFile;
1882 }
1883 xfree(pAD->afhead[y].fullname, pszSrcFile, __LINE__);
1884 }
1885 memmove(&(pAD->afhead[x]), &(pAD->afhead[y]),
1886 (pAD->afheadcnt - y) * sizeof(ALLFILES));
1887 pAD->afheadcnt -= (y - x);
1888 }
1889 } // for x
1890 if (pAD->afheadcnt != oldafheadcnt) {
1891
1892 ALLFILES *tempa, **templ;
1893
1894 if (!pAD->afheadcnt)
1895 FreeAllFilesList(hwnd);
1896 else {
1897 tempa =
1898 xrealloc(pAD->afhead, pAD->afheadcnt * sizeof(ALLFILES), pszSrcFile,
1899 __LINE__);
1900 if (tempa) {
1901 pAD->afhead = tempa;
1902 pAD->afalloc = pAD->afheadcnt;
1903 }
1904 templ =
1905 xrealloc(pAD->afindex, pAD->afheadcnt * sizeof(ALLFILES *), pszSrcFile,
1906 __LINE__);
1907 if (templ)
1908 pAD->afindex = templ;
1909 DosPostEventSem(CompactSem);
1910 ReSort(hwnd);
1911 }
1912 }
1913 return pAD->afheadcnt;
1914}
1915
1916static VOID DoADir(HWND hwnd, CHAR * pathname)
1917{
1918 ALLDATA *ad = WinQueryWindowPtr(hwnd, QWL_USER);
1919 CHAR *filename, *enddir;
1920 PFILEFINDBUF3L pffbArray, pffbFile;
1921 HDIR hdir = HDIR_CREATE;
1922 ULONG ulFindCnt;
1923 ULONG ulFindMax;
1924 ULONG ulBufBytes;
1925 ULONG x;
1926 APIRET rc;
1927 static BOOL fDone;
1928
1929 filename = xmalloc(CCHMAXPATH + 100, pszSrcFile, __LINE__);
1930 if (!filename)
1931 return;
1932
1933 ulFindMax = FilesToGet;
1934 if (fRemoteBug && isalpha(*pathname) && pathname[1] == ':' &&
1935 pathname[2] == '\\' &&
1936 (driveflags[toupper(*pathname) - 'A'] & DRIVE_REMOTE))
1937 ulFindMax = 1;
1938
1939 ulBufBytes = sizeof(FILEFINDBUF3L) * ulFindMax;
1940 pffbArray = xmalloc(ulBufBytes, pszSrcFile, __LINE__);
1941 if (!pffbArray) {
1942 free(filename);
1943 return;
1944 }
1945
1946 strcpy(filename, pathname);
1947 enddir = &filename[strlen(filename) - 1];
1948 if (*enddir != '\\') {
1949 enddir++;
1950 *enddir = '\\';
1951 }
1952 enddir++;
1953 strcpy(enddir, "*");
1954 DosError(FERR_DISABLEHARDERR);
1955 ulFindCnt = ulFindMax;
1956 rc = xDosFindFirst(filename, &hdir, FILE_NORMAL | FILE_ARCHIVED |
1957 FILE_READONLY | FILE_DIRECTORY | FILE_SYSTEM |
1958 FILE_HIDDEN,
1959 pffbArray, ulBufBytes, &ulFindCnt, FIL_STANDARDL);
1960 if (!rc) {
1961 do {
1962 priority_normal();
1963 pffbFile = pffbArray;
1964 for (x = 0; x < ulFindCnt; x++) {
1965 if (pffbFile->attrFile & FILE_DIRECTORY) {
1966 // Skip . and ..
1967 if (pffbFile->achName[0] != '.' ||
1968 (pffbFile->achName[1] &&
1969 (pffbFile->achName[1] != '.' || pffbFile->achName[2]))) {
1970 strcpy(enddir, pffbFile->achName);
1971 DoADir(hwnd, filename);
1972 }
1973 }
1974 else {
1975 *enddir = 0;
1976 strcpy(enddir, pffbFile->achName);
1977 if (strlen(filename) > CCHMAXPATH) {
1978 // Complain if pathnames exceeds max
1979 DosFindClose(hdir);
1980 free(pffbArray);
1981 free(filename);
1982 if (!fDone) {
1983 fDone = TRUE;
1984 saymsg(MB_OK | MB_ICONASTERISK,
1985 HWND_DESKTOP,
1986 GetPString(IDS_WARNINGTEXT),
1987 "One or more of your files has a full path name that exceeds the OS/2 maximum");
1988 }
1989 return;
1990 }
1991 if (!ad->afalloc || ad->afheadcnt > ad->afalloc - 1) {
1992
1993 ALLFILES *temp;
1994
1995 temp = xrealloc(ad->afhead, (ad->afalloc + 1000) *
1996 sizeof(ALLFILES), pszSrcFile, __LINE__);
1997 if (!temp) {
1998 ad->stopflag = 1;
1999 break;
2000 }
2001 else {
2002 ad->afhead = temp;
2003 if (ad->stopflag)
2004 break;
2005 ad->afalloc += 1000;
2006 }
2007 }
2008 ad->afhead[ad->afheadcnt].fullname =
2009 xstrdup(filename, pszSrcFile, __LINE__);
2010 if (!ad->afhead[ad->afheadcnt].fullname) {
2011 ad->stopflag = 1;
2012 break;
2013 }
2014 else {
2015 ad->afhead[ad->afheadcnt].filename =
2016 ad->afhead[ad->afheadcnt].fullname + (enddir - filename);
2017 ad->afhead[ad->afheadcnt].cbFile = pffbFile->cbFile;
2018 ad->afhead[ad->afheadcnt].date = pffbFile->fdateLastWrite;
2019 ad->afhead[ad->afheadcnt].time = pffbFile->ftimeLastWrite;
2020 ad->afhead[ad->afheadcnt].attrFile = (USHORT) pffbFile->attrFile;
2021 ad->afhead[ad->afheadcnt].flags = 0;
2022 ad->afheadcnt++;
2023 if (ad->longest < pffbFile->cchName)
2024 ad->longest = pffbFile->cchName;
2025 if (ad->longestw < pffbFile->cchName + (enddir - filename))
2026 ad->longestw = pffbFile->cchName + (enddir - filename);
2027 }
2028 }
2029 pffbFile = (PFILEFINDBUF3L)((PBYTE)pffbFile + pffbFile->oNextEntryOffset);
2030 } // for
2031 if (ad->stopflag)
2032 break;
2033 ulFindCnt = ulFindMax;
2034 rc = xDosFindNext(hdir,
2035 pffbArray,
2036 sizeof(FILEFINDBUF3L) * ulFindCnt,
2037 &ulFindCnt,
2038 FIL_STANDARDL);
2039 } while (!rc);
2040 DosFindClose(hdir);
2041 }
2042
2043 if (rc && rc != ERROR_NO_MORE_FILES) {
2044 Dos_Error(MB_ENTER, rc, HWND_DESKTOP, pszSrcFile, __LINE__,
2045 GetPString(IDS_CANTFINDDIRTEXT), filename);
2046 }
2047
2048 free(pffbArray);
2049 free(filename);
2050}
2051
2052static VOID FindAllThread(VOID * args)
2053{
2054 ULONG ulDriveNum, ulDriveMap, x;
2055 CHAR startname[] = " :\\";
2056 HWND hwnd = (HWND) args;
2057 HAB hab2 = (HAB) 0;
2058 HMQ hmq2 = (HMQ) 0;
2059 ALLDATA *ad = WinQueryWindowPtr(hwnd, QWL_USER);
2060
2061# ifdef FORTIFY
2062 Fortify_EnterScope();
2063# endif
2064 if (!DosRequestMutexSem(ad->hmtxScan, SEM_INDEFINITE_WAIT)) {
2065 priority_normal();
2066 hab2 = WinInitialize(0);
2067 if (hab2) {
2068 hmq2 = WinCreateMsgQueue(hab2, 0);
2069 if (hmq2) {
2070 WinCancelShutdown(hmq2, TRUE);
2071 IncrThreadUsage();
2072 if (!*ad->szFindPath) {
2073 DosError(FERR_DISABLEHARDERR);
2074 if (!DosQCurDisk(&ulDriveNum, &ulDriveMap)) {
2075 for (x = 2; x < 26 && !ad->stopflag; x++) {
2076 if ((ulDriveMap & (1 << x)) && ad->abDrvFlags[x]) {
2077 *startname = (CHAR) (x + 'A');
2078 DoADir(hwnd, startname);
2079 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
2080 DosSleep(0); //26 Aug 07 GKY 1
2081 }
2082 }
2083 }
2084 }
2085 else
2086 DoADir(hwnd, ad->szFindPath);
2087 DosPostEventSem(CompactSem);
2088 }
2089 }
2090 if (ad->afalloc != ad->afheadcnt) {
2091
2092 ALLFILES *tempa, **templ;
2093
2094 tempa =
2095 xrealloc(ad->afhead, sizeof(ALLFILES) * ad->afheadcnt, pszSrcFile,
2096 __LINE__);
2097 if (tempa) {
2098 ad->afhead = tempa;
2099 ad->afalloc = ad->afheadcnt;
2100 }
2101 templ =
2102 xrealloc(ad->afindex, sizeof(ALLFILES *) * ad->afheadcnt, pszSrcFile,
2103 __LINE__);
2104 if (templ)
2105 ad->afindex = templ;
2106 DosPostEventSem(CompactSem);
2107 }
2108
2109 if (!ad->stopflag) {
2110 PostMsg(hwnd, UM_RESCAN, MPFROMLONG(1), MPVOID);
2111 ReSort(hwnd);
2112 }
2113 DosReleaseMutexSem(ad->hmtxScan);
2114 }
2115 if (hmq2) {
2116 PostMsg(hwnd, UM_CONTAINER_FILLED, MPVOID, MPVOID);
2117 WinDestroyMsgQueue(hmq2);
2118 }
2119 if (hab2) {
2120 DecrThreadUsage();
2121 WinTerminate(hab2);
2122 }
2123# ifdef FORTIFY
2124 Fortify_LeaveScope();
2125# endif
2126}
2127
2128MRESULT EXPENTRY AFDrvsWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
2129{
2130 switch (msg) {
2131 case WM_INITDLG:
2132 if (mp2) {
2133
2134 ULONG ulDriveNum, ulDriveMap, x;
2135 CHAR startname[] = " :";
2136 SHORT sSelect;
2137 ALLDATA *ad;
2138
2139 ad = (ALLDATA *) mp2;
2140 WinSetWindowPtr(hwnd, QWL_USER, mp2);
2141 DosError(FERR_DISABLEHARDERR);
2142 if (!DosQCurDisk(&ulDriveNum, &ulDriveMap)) {
2143 for (x = 2; x < 26 && !ad->stopflag; x++) {
2144 if (!(driveflags[x] & (DRIVE_IGNORE | DRIVE_INVALID))) {
2145 if (ulDriveMap & (1 << x)) {
2146 *startname = (CHAR) (x + 'A');
2147 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, DRVS_LISTBOX,
2148 LM_INSERTITEM,
2149 MPFROM2SHORT(LIT_END, 0),
2150 MPFROMP(startname));
2151 if (sSelect >= 0 && ad->abDrvFlags[x])
2152 WinSendDlgItemMsg(hwnd, DRVS_LISTBOX, LM_SELECTITEM,
2153 MPFROM2SHORT(sSelect, 0), MPFROMLONG(TRUE));
2154 }
2155 }
2156 }
2157 }
2158 }
2159 else
2160 WinDismissDlg(hwnd, 0);
2161 break;
2162
2163 case WM_CONTROL:
2164 switch (SHORT1FROMMP(mp1)) {
2165 case DRVS_LISTBOX:
2166 switch (SHORT2FROMMP(mp1)) {
2167 case LN_ENTER:
2168 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(DID_OK, 0), MPVOID);
2169 break;
2170 }
2171 break;
2172 }
2173 return 0;
2174
2175 case WM_COMMAND:
2176 switch (SHORT1FROMMP(mp1)) {
2177 case DID_OK:
2178 {
2179 INT x;
2180 SHORT sSelect;
2181 CHAR filename[3];
2182 ALLDATA *ad = WinQueryWindowPtr(hwnd, QWL_USER);
2183
2184 memset(ad->abDrvFlags, 0, sizeof(ad->abDrvFlags));
2185 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, DRVS_LISTBOX,
2186 LM_QUERYSELECTION,
2187 MPFROM2SHORT(LIT_FIRST, 0),
2188 MPVOID);
2189 while (sSelect >= 0) {
2190 *filename = 0;
2191 if (WinSendDlgItemMsg(hwnd, DRVS_LISTBOX, LM_QUERYITEMTEXT,
2192 MPFROM2SHORT(sSelect, 2),
2193 MPFROMP(filename)) && *filename)
2194 ad->abDrvFlags[*filename - 'A'] = 1;
2195 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, DRVS_LISTBOX,
2196 LM_QUERYSELECTION,
2197 MPFROM2SHORT(sSelect, 0),
2198 MPVOID);
2199 }
2200 for (x = 2; x < 26; x++) {
2201 if (ad->abDrvFlags[x]) {
2202 WinDismissDlg(hwnd, 1);
2203 return 0;
2204 }
2205 }
2206 }
2207 WinDismissDlg(hwnd, 0);
2208 break;
2209
2210 case IDM_HELP:
2211 if (hwndHelp)
2212 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
2213 MPFROM2SHORT(HELP_DRVSWND, 0), MPFROMSHORT(HM_RESOURCEID));
2214 break;
2215
2216 case DID_CANCEL:
2217 WinDismissDlg(hwnd, 0);
2218 break;
2219 }
2220 return 0;
2221 }
2222 return WinDefDlgProc(hwnd, msg, mp1, mp2);
2223}
2224
2225static HPS InitWindow(HWND hwnd)
2226{
2227 ALLDATA *ad = WinQueryWindowPtr(hwnd, QWL_USER);
2228 HPS hps = (HPS) 0;
2229 SIZEL sizel;
2230 FONTMETRICS FontMetrics;
2231
2232 if (ad) {
2233 sizel.cx = sizel.cy = 0;
2234 hps = GpiCreatePS(WinQueryAnchorBlock(hwnd), WinOpenWindowDC(hwnd),
2235 (PSIZEL) & sizel, PU_PELS | GPIF_DEFAULT | GPIT_MICRO |
2236 GPIA_ASSOC);
2237 if (hps) {
2238 GpiSetCp(hps, (ULONG) ad->fattrs.usCodePage);
2239 GpiCreateLogFont(hps, NULL, FIXED_FONT_LCID, &ad->fattrs);
2240 GpiSetCharSet(hps, FIXED_FONT_LCID);
2241 GpiQueryFontMetrics(hps, sizeof(FontMetrics), &FontMetrics);
2242 ad->fattrs.lAveCharWidth = FontMetrics.lAveCharWidth;
2243 ad->fattrs.lMaxBaselineExt = FontMetrics.lMaxBaselineExt;
2244 ad->lMaxAscender = max(FontMetrics.lMaxAscender, 0);
2245 ad->lMaxDescender = max(FontMetrics.lMaxDescender, 0);
2246 ad->lMaxHeight = ad->lMaxDescender + ad->lMaxAscender;
2247 if (ad->fattrs.usCodePage != FontMetrics.usCodePage) {
2248 ad->fattrs.usCodePage = FontMetrics.usCodePage;
2249 Codepage = ad->fattrs.usCodePage;
2250 PrfWriteProfileData(fmprof,
2251 appname,
2252 "Seeall.Codepage",
2253 &ad->fattrs.usCodePage, sizeof(USHORT));
2254 }
2255 else if (ad->fattrs.usCodePage) {
2256
2257 HMQ hmq;
2258 ULONG cps[50], len, x;
2259
2260 if (!DosQueryCp(sizeof(cps), cps, &len)) {
2261 for (x = 0; x < len / sizeof(ULONG); x++) {
2262 if (cps[x] == (ULONG) ad->fattrs.usCodePage) {
2263 hmq = WinQueryWindowULong(hwnd, QWL_HMQ);
2264 WinSetCp(hmq, ad->fattrs.usCodePage);
2265 break;
2266 }
2267 }
2268 }
2269 DosSetProcessCp((ULONG) ad->fattrs.usCodePage);
2270 }
2271 GpiSetBackMix(hps, BM_OVERPAINT);
2272 }
2273 }
2274 return (hps);
2275}
2276
2277static VOID PaintLine(HWND hwnd, HPS hps, ULONG whichfile, ULONG topfile,
2278 RECTL * Rectl)
2279{
2280 ALLDATA *ad = WinQueryWindowPtr(hwnd, QWL_USER);
2281 POINTL ptl;
2282 CHAR szBuff[CCHMAXPATH + 80], szCmmaFmtFileSize[81];
2283 ULONG len, y;
2284
2285 y = (ad->invertsort) ? (ad->afindexcnt - 1) - whichfile : whichfile;
2286 ptl.y = (Rectl->yTop -
2287 (ad->lMaxHeight * (((whichfile + 1) - topfile) + 1)));
2288 ptl.x = ad->horzscroll;
2289 if (ptl.y < Rectl->yBottom || ptl.y > Rectl->yTop || y > ad->afindexcnt)
2290 return;
2291 GpiSetBackMix(hps, BM_OVERPAINT);
2292 if (ad->afindex[y]->flags & AF_SELECTED) {
2293 GpiSetColor(hps, standardcolors[Colors[COLORS_SELECTEDNORMALFORE]]);
2294 GpiSetBackColor(hps, (whichfile == ad->cursored - 1) ?
2295 standardcolors[Colors[COLORS_CURSOREDSELECTEDBACK]] :
2296 standardcolors[Colors[COLORS_SELECTEDBACK]]);
2297 }
2298 else {
2299 GpiSetColor(hps,
2300 ((ad->afindex[y]->attrFile & (FILE_SYSTEM | FILE_HIDDEN)) !=
2301 0) ? standardcolors[Colors[COLORS_SYSTEMFORE]] : ((ad->
2302 afindex
2303 [y]->
2304 attrFile &
2305 FILE_READONLY)
2306 !=
2307 0) ?
2308 standardcolors[Colors[COLORS_READONLYFORE]] :
2309 standardcolors[Colors[COLORS_NORMALFORE]]);
2310 GpiSetBackColor(hps,
2311 (whichfile ==
2312 ad->cursored -
2313 1) ? standardcolors[Colors[COLORS_CURSOREDNORMALBACK]] :
2314 standardcolors[Colors[COLORS_NORMALBACK]]);
2315 }
2316 CommaFmtULL(szCmmaFmtFileSize,
2317 sizeof(szCmmaFmtFileSize), ad->afindex[y]->cbFile, ' ');
2318 len = sprintf(szBuff,
2319 "%c%-*.*s %-12s %c%c%c%c%c %04u/%02u/%02u %02u:%02u:%02u ",
2320 whichfile == ad->cursored - 1 ? '>' : ' ',
2321 ad->fullnames ? ad->longestw : ad->longest,
2322 ad->fullnames ? ad->longestw : ad->longest,
2323 ad->fullnames ? ad->afindex[y]->fullname :
2324 ad->afindex[y]->filename,
2325 szCmmaFmtFileSize,
2326 "-A"[((ad->afindex[y]->attrFile & FILE_ARCHIVED) != 0)],
2327 "-R"[((ad->afindex[y]->attrFile & FILE_READONLY) != 0)],
2328 "-H"[((ad->afindex[y]->attrFile & FILE_HIDDEN) != 0)],
2329 "-S"[((ad->afindex[y]->attrFile & FILE_SYSTEM) != 0)],
2330 "-D"[((ad->afindex[y]->attrFile & FILE_DIRECTORY) != 0)],
2331 ad->afindex[y]->date.year + 1980,
2332 ad->afindex[y]->date.month,
2333 ad->afindex[y]->date.day,
2334 ad->afindex[y]->time.hours,
2335 ad->afindex[y]->time.minutes,
2336 ad->afindex[y]->time.twosecs * 2);
2337 GpiCharStringAt(hps, &ptl, len, szBuff);
2338 GpiQueryCurrentPosition(hps, &ptl);
2339 if (ptl.x + abs(ad->horzscroll) > ad->maxx) {
2340 ad->maxx = ptl.x + abs(ad->horzscroll);
2341 WinSendMsg(ad->hhscroll, SBM_SETTHUMBSIZE,
2342 MPFROM2SHORT((SHORT) Rectl->xRight, (SHORT) ad->maxx), MPVOID);
2343 }
2344}
2345
2346MRESULT EXPENTRY SeeStatusProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
2347{
2348 switch (msg) {
2349 case WM_CREATE:
2350 return CommonTextProc(hwnd, msg, mp1, mp2);
2351
2352 case WM_SETFOCUS:
2353 if (mp2)
2354 PostMsg(hwnd, UM_FOCUSME, MPVOID, MPVOID);
2355 break;
2356
2357 case WM_PAINT:
2358 {
2359 SWP swp;
2360 POINTL ptl;
2361 HPS hps;
2362
2363 PaintRecessedWindow(hwnd, (HPS) 0, FALSE, FALSE);
2364 hps = WinGetPS(WinQueryWindow(hwnd, QW_PARENT));
2365 if (hps) {
2366 WinQueryWindowPos(hwnd, &swp);
2367 ptl.x = swp.x - 1;
2368 ptl.y = swp.y + swp.cy + 2;
2369 GpiMove(hps, &ptl);
2370 GpiSetColor(hps, CLR_WHITE);
2371 ptl.x = swp.x + swp.cx;
2372 GpiLine(hps, &ptl);
2373 WinReleasePS(hps);
2374 }
2375 }
2376 break;
2377
2378 case UM_FOCUSME:
2379 WinSetFocus(HWND_DESKTOP, WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
2380 FID_CLIENT));
2381 return 0;
2382 }
2383 return PFNWPStatic(hwnd, msg, mp1, mp2);
2384}
2385
2386MRESULT EXPENTRY SeeFrameWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
2387{
2388 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
2389
2390 switch (msg) {
2391 case WM_BUTTON1UP:
2392 case WM_BUTTON2UP:
2393 case WM_BUTTON3UP:
2394 case WM_MOUSEMOVE:
2395 case WM_CHORD:
2396 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
2397 break;
2398
2399 case WM_CHAR:
2400 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
2401 break;
2402
2403 case WM_CALCFRAMERECT:
2404 {
2405 MRESULT mr;
2406 PRECTL prectl;
2407
2408 mr = oldproc(hwnd, msg, mp1, mp2);
2409
2410 /*
2411 * Calculate the position of the client rectangle.
2412 * Otherwise, we'll see a lot of redraw when we move the
2413 * client during WM_FORMATFRAME.
2414 */
2415
2416 if (mr && mp2) {
2417 prectl = (PRECTL) mp1;
2418 prectl->yBottom += 22;
2419 prectl->yTop -= 24;
2420 }
2421 return mr;
2422 }
2423
2424 case WM_FORMATFRAME:
2425 {
2426 SHORT sCount;
2427 PSWP pswp, pswpClient, pswpNew;
2428
2429 sCount = (SHORT) oldproc(hwnd, msg, mp1, mp2);
2430
2431 /*
2432 * Reformat the frame to "squeeze" the client
2433 * and make room for status window sibling beneath
2434 */
2435
2436 pswp = (PSWP) mp1;
2437 {
2438 SHORT x;
2439
2440 for (x = 0; x < sCount; x++) {
2441 if (WinQueryWindowUShort(pswp->hwnd, QWS_ID) == FID_CLIENT) {
2442 pswpClient = pswp;
2443 break;
2444 }
2445 pswp++;
2446 }
2447 }
2448 pswpNew = (PSWP) mp1 + sCount;
2449 *pswpNew = *pswpClient;
2450 pswpNew->hwnd = WinWindowFromID(hwnd, SEEALL_STATUS);
2451 pswpNew->x = pswpClient->x + 2;
2452 pswpNew->y = pswpClient->y + 2;
2453 pswpNew->cx = pswpClient->cx - 3;
2454 pswpNew->cy = 20;
2455 pswpClient->y = pswpNew->y + pswpNew->cy + 3;
2456 pswpClient->cy = (pswpClient->cy - pswpNew->cy) - 5;
2457 sCount++;
2458 return MRFROMSHORT(sCount);
2459 }
2460
2461 case WM_QUERYFRAMECTLCOUNT:
2462 {
2463 SHORT sCount;
2464
2465 sCount = (SHORT) oldproc(hwnd, msg, mp1, mp2);
2466 sCount++;
2467 return MRFROMSHORT(sCount);
2468 }
2469 }
2470 return oldproc(hwnd, msg, mp1, mp2);
2471}
2472
2473MRESULT EXPENTRY SeeAllWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
2474{
2475 ALLDATA *pAD = WinQueryWindowPtr(hwnd, QWL_USER);
2476
2477 switch (msg) {
2478 case WM_CREATE:
2479 // fprintf(stderr,"Seeall: WM_CREATE\n");
2480 WinSetWindowPtr(hwnd, QWL_USER, NULL);
2481# ifdef FORTIFY
2482 Fortify_EnterScope();
2483# endif
2484 pAD = xmallocz(sizeof(ALLDATA), pszSrcFile, __LINE__);
2485 if (pAD) {
2486 HWND hwndFrame;
2487
2488 pAD->size = sizeof(ALLDATA);
2489 hwndFrame = WinQueryWindow(hwnd, QW_PARENT);
2490 pAD->hwndFrame = hwndFrame;
2491 pAD->mask.attrFile = FILE_READONLY | FILE_HIDDEN |
2492 FILE_SYSTEM | FILE_ARCHIVED;
2493 pAD->mask.fNoDirs = TRUE;
2494 *(pAD->mask.prompt) = 0;
2495 WinSetWindowPtr(hwnd, QWL_USER, (PVOID) pAD);
2496 pAD->pfnCompare = comparenames;
2497 if (Firsttime) {
2498
2499 ULONG size;
2500
2501 size = sizeof(USHORT);
2502 PrfQueryProfileData(fmprof,
2503 appname,
2504 "Seeall.Codepage", (PVOID) & Codepage, &size);
2505 size = sizeof(BOOL);
2506 PrfQueryProfileData(fmprof,
2507 appname,
2508 "Seeall.Fullnames", (PVOID) & Fullnames, &size);
2509 size = sizeof(USHORT);
2510 PrfQueryProfileData(fmprof,
2511 appname,
2512 "Seeall.Sort", (PVOID) & SortType, &size);
2513 size = sizeof(BOOL);
2514 PrfQueryProfileData(fmprof,
2515 appname,
2516 "Seeall.SortReverse",
2517 (PVOID) & SortReverse, &size);
2518 memset(&Fattrs, 0, sizeof(Fattrs));
2519 size = sizeof(Fattrs);
2520 Fattrs.usRecordLength = sizeof(Fattrs);
2521 Fattrs.lMaxBaselineExt = 16;
2522 Fattrs.lAveCharWidth = 8;
2523 Fattrs.usCodePage = Codepage;
2524 strcpy(Fattrs.szFacename, GetPString(IDS_SYSMONOTEXT));
2525 PrfQueryProfileData(fmprof,
2526 appname,
2527 "Seeall.Fattrs", (PVOID) & Fattrs, &size);
2528 size = sizeof(LONG) * COLORS_MAX;
2529 PrfQueryProfileData(fmprof,
2530 appname, "Seeall.Colors", (PVOID) Colors, &size);
2531 Firsttime = FALSE;
2532 }
2533 switch (SortType) {
2534 case IDM_SORTEASIZE:
2535 pAD->pfnCompare = (PFNSORT) NULL;
2536 break;
2537 case IDM_SORTNAME:
2538 pAD->pfnCompare = comparefullnames;
2539 break;
2540 case IDM_SORTFILENAME:
2541 pAD->pfnCompare = comparenames;
2542 break;
2543 case IDM_SORTSIZE:
2544 pAD->pfnCompare = comparesizes;
2545 break;
2546 case IDM_SORTLWDATE:
2547 pAD->pfnCompare = comparedates;
2548 break;
2549 case IDM_SORTFIRST:
2550 pAD->pfnCompare = compareexts;
2551 break;
2552 }
2553 pAD->invertsort = SortReverse;
2554 pAD->fattrs = Fattrs;
2555 pAD->fullnames = Fullnames;
2556 pAD->stopflag = 0;
2557 pAD->cursored = pAD->topfile = 1;
2558 pAD->fattrs.usCodePage = Codepage;
2559 memcpy(pAD->aulColors, Colors, sizeof(LONG) * COLORS_MAX);
2560 pAD->hwndMenu = WinWindowFromID(hwndFrame, FID_MENU);
2561 SetConditionalCascade(pAD->hwndMenu, IDM_DELETESUBMENU,
2562 (fDefaultDeletePerm) ?
2563 IDM_PERMDELETE : IDM_DELETE);
2564 SetConditionalCascade(pAD->hwndMenu, IDM_MOVEMENU, IDM_MOVE);
2565 SetConditionalCascade(pAD->hwndMenu, IDM_COPYMENU, IDM_COPY);
2566 SetConditionalCascade(pAD->hwndMenu, IDM_OPENSUBMENU, IDM_OPENDEFAULT);
2567 SetConditionalCascade(pAD->hwndMenu, IDM_OBJECTSUBMENU, IDM_SHADOW);
2568 if (fWorkPlace) {
2569 WinSendMsg(pAD->hwndMenu, MM_DELETEITEM,
2570 MPFROM2SHORT(IDM_OPENSUBMENU, TRUE), MPVOID);
2571 WinSendMsg(pAD->hwndMenu, MM_DELETEITEM,
2572 MPFROM2SHORT(IDM_OBJECTSUBMENU, TRUE), MPVOID);
2573 }
2574 pAD->hwndClient = hwnd;
2575 pAD->hps = InitWindow(hwnd);
2576 pAD->hvscroll = WinWindowFromID(hwndFrame, FID_VERTSCROLL);
2577 pAD->hhscroll = WinWindowFromID(hwndFrame, FID_HORZSCROLL);
2578 pAD->multiplier = 1;
2579 if (_beginthread(MakeSeeObjWinThread, NULL, 122880, (PVOID) pAD) == -1)
2580 Runtime_Error(pszSrcFile, __LINE__,
2581 GetPString(IDS_COULDNTSTARTTHREADTEXT));
2582 else {
2583 if (!DosCreateMutexSem(NULL, &pAD->hmtxScan, 0, FALSE)) {
2584 pAD->hwndStatus = WinCreateWindow(hwndFrame,
2585 WC_SEESTATUS,
2586 NullStr,
2587 WS_VISIBLE | SS_TEXT |
2588 DT_LEFT | DT_VCENTER,
2589 0,
2590 0,
2591 0,
2592 0,
2593 hwndFrame,
2594 HWND_TOP,
2595 SEEALL_STATUS, NULL, NULL);
2596 if (!pAD->hwndStatus)
2597 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__,
2598 IDS_WINCREATEWINDOW);
2599 else {
2600 PFNWP oldproc;
2601
2602 oldproc = WinSubclassWindow(hwndFrame, SeeFrameWndProc);
2603 WinSetWindowPtr(hwndFrame, QWL_USER, (PVOID) oldproc);
2604 }
2605 break;
2606 }
2607 }
2608 }
2609 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
2610 break;
2611
2612 case UM_SETUP5:
2613 // fprintf(stderr,"Seeall: UM_SETUP5\n");
2614 if (pAD) {
2615 if (mp1 && *((CHAR *)mp1))
2616 strcpy(pAD->szFindPath, (CHAR *)mp1);
2617 else {
2618 if (!WinDlgBox(HWND_DESKTOP, hwnd, AFDrvsWndProc,
2619 FM3ModHandle, DRVS_FRAME, (PVOID) pAD)) {
2620 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
2621 return 0;
2622 }
2623 }
2624 if (_beginthread(FindAllThread, NULL, 524288, (PVOID) hwnd) == -1) {
2625 Runtime_Error(pszSrcFile, __LINE__,
2626 GetPString(IDS_COULDNTSTARTTHREADTEXT));
2627 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
2628 }
2629 else {
2630 DosSleep(50);//05 Aug 07 GKY 100
2631 PostMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
2632 PostMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
2633 }
2634 }
2635 else
2636 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
2637 return 0;
2638
2639 case UM_UPDATERECORDLIST:
2640 if (mp1) {
2641
2642 APIRET rc;
2643
2644 rc = DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN);
2645 if (!rc) {
2646 WinSetPointer(HWND_DESKTOP, hptrBusy);
2647 if (UpdateList(hwnd, mp1)) {
2648 FreeList(mp1);
2649 RemoveDeleted(hwnd);
2650 ReSort(hwnd);
2651 WinInvalidateRect(hwnd, NULL, FALSE);
2652 }
2653 DosReleaseMutexSem(pAD->hmtxScan);
2654 WinSetPointer(HWND_DESKTOP, hptrArrow);
2655 }
2656 }
2657 return 0;
2658
2659 case UM_SETUP2:
2660// fprintf(stderr,"Seeall: UM_SETUP2\n");
2661 if (pAD) {
2662
2663 CHAR s[256];
2664 BOOL once = FALSE;
2665 ULONG x, ulDriveNum, ulDriveMap;
2666
2667 strcpy(s, GetPString(IDS_SEEALLTITLETEXT));
2668 if (!*pAD->szFindPath) {
2669 DosError(FERR_DISABLEHARDERR);
2670 if (!DosQCurDisk(&ulDriveNum, &ulDriveMap)) {
2671 for (x = 2; x < 26 && !pAD->stopflag; x++) {
2672 if ((ulDriveMap & (1 << x)) && pAD->abDrvFlags[x]) {
2673 sprintf(&s[strlen(s)], "%s%c:", (once) ? ", " : " (", x + 'A');
2674 once = TRUE;
2675 }
2676 }
2677 if (once)
2678 strcat(s, ")");
2679 }
2680 }
2681 else {
2682 strcat(s, " (");
2683 strcat(s, pAD->szFindPath);
2684 strcat(s, ")");
2685 }
2686 WinSetWindowText(WinQueryWindow(hwnd, QW_PARENT), s);
2687 }
2688 return 0;
2689
2690 case UM_SETUP3:
2691// fprintf(stderr,"Seeall: UM_SETUP3\n");
2692 if (pAD) {
2693 pAD->multiplier = pAD->afindexcnt / 32767;
2694 if (pAD->multiplier * 32767 != pAD->afindexcnt)
2695 pAD->multiplier++;
2696 if (!pAD->multiplier)
2697 pAD->multiplier++;
2698 {
2699 RECTL Rectl;
2700 ULONG numlines;
2701
2702 WinQueryWindowRect(hwnd, &Rectl);
2703 numlines = NumLines(&Rectl, pAD);
2704 if (numlines) {
2705 WinSendMsg(pAD->hhscroll, SBM_SETTHUMBSIZE,
2706 MPFROM2SHORT((SHORT) Rectl.xRight, (SHORT) pAD->maxx),
2707 MPVOID);
2708 WinSendMsg(pAD->hvscroll, SBM_SETTHUMBSIZE,
2709 MPFROM2SHORT((SHORT) numlines,
2710 (SHORT) min(pAD->afindexcnt, 32767)),
2711 MPFROM2SHORT(1, pAD->afindexcnt + 1));
2712 WinSendMsg(pAD->hhscroll, SBM_SETSCROLLBAR,
2713 MPFROMSHORT((SHORT) abs(pAD->horzscroll)),
2714 MPFROM2SHORT(0, (SHORT) (pAD->maxx - Rectl.xRight)));
2715 WinSendMsg(pAD->hvscroll, SBM_SETSCROLLBAR,
2716 MPFROMSHORT((SHORT) (pAD->topfile / pAD->multiplier)),
2717 MPFROM2SHORT(1,
2718 (SHORT) (pAD->afindexcnt / pAD->multiplier) -
2719 (numlines - 1)));
2720 if (pAD->afindexcnt - pAD->topfile < numlines) {
2721 pAD->topfile = ((pAD->afindexcnt - pAD->topfile) - numlines);
2722 WinInvalidateRect(hwnd, NULL, FALSE);
2723 }
2724 }
2725 }
2726 }
2727 return 0;
2728
2729 case UM_SETUP4:
2730 // fprintf(stderr,"Seeall: UM_SETUP4\n");
2731 if (pAD)
2732 pAD->killme = TRUE;
2733 else
2734 PostMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID);
2735 return 0;
2736
2737 case UM_RESCAN:
2738 // fprintf(stderr,"Seeall: UM_RESCAN\n");
2739 if (pAD && !pAD->stopflag) {
2740 if (DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN)) {
2741 CHAR s[CCHMAXPATH + 80], tm[34];
2742
2743 if (mp1) {
2744 strcpy(s, GetPString(IDS_SORTINGTEXT));
2745 if (pAD->afindexcnt) {
2746 commafmt(tm, sizeof(tm), pAD->afindexcnt);
2747 strcat(s, tm);
2748 }
2749 }
2750 else {
2751 strcpy(s, GetPString(IDS_WORKINGTEXT));
2752 if (pAD->afheadcnt) {
2753 commafmt(tm, sizeof(tm), pAD->afheadcnt);
2754 strcat(s, tm);
2755 }
2756 }
2757 if (mp2) {
2758 strcat(s, " ");
2759 strcat(s, (CHAR *)mp2);
2760 }
2761 WinSetWindowText(pAD->hwndStatus, s);
2762 }
2763 else {
2764 CHAR s[(CCHMAXPATH * 2) + 80], tm[34], ts[34], tb[34];
2765 ULONG y;
2766
2767 if (mp1) {
2768 strcpy(s, GetPString(IDS_SORTINGTEXT));
2769 if (pAD->afindexcnt) {
2770 commafmt(tm, sizeof(tm), pAD->afindexcnt);
2771 strcat(s, tm);
2772 }
2773 if (mp2) {
2774 strcat(s, " ");
2775 strcat(s, (CHAR *)mp2);
2776 }
2777 }
2778 else if (pAD->afindexcnt) {
2779 y = (pAD->invertsort) ? (pAD->afindexcnt - 1) - (pAD->cursored - 1) :
2780 pAD->cursored - 1;
2781 commafmt(tm, sizeof(tm), pAD->afindexcnt);
2782 commafmt(ts, sizeof(ts), pAD->selected);
2783 CommaFmtULL(tb, sizeof(tb), pAD->ullSelectedBytes, ' ');
2784 sprintf(s,
2785 " %s %s%s%s %s %s (%s) %s %s",
2786 tm,
2787 GetPString(IDS_FILETEXT),
2788 &"s"[pAD->afindexcnt == 1],
2789 (*pAD->mask.szMask ||
2790 (pAD->mask.attrFile & (~FILE_DIRECTORY)) !=
2791 (ALLATTRS & (~FILE_DIRECTORY)) ||
2792 pAD->mask.antiattr) ?
2793 GetPString(IDS_FILTEREDTEXT) :
2794 NullStr,
2795 ts,
2796 GetPString(IDS_SELECTEDTEXT),
2797 tb, GetPString(IDS_CURRTEXT), pAD->afindex[y]->fullname);
2798 }
2799 else
2800 sprintf(s,
2801 GetPString(IDS_NOFILESPSTEXT),
2802 (*pAD->mask.szMask ||
2803 (pAD->mask.attrFile & (~FILE_DIRECTORY)) !=
2804 (ALLATTRS & (~FILE_DIRECTORY)) ||
2805 pAD->mask.antiattr) ?
2806 GetPString(IDS_FILTEREDTEXT) : NullStr);
2807 WinSetWindowText(pAD->hwndStatus, s);
2808 DosReleaseMutexSem(pAD->hmtxScan);
2809 }
2810 }
2811 return 0;
2812
2813 case UM_SETUP:
2814 // fprintf(stderr,"Seeall: UM_SETUP\n");
2815 if (pAD) {
2816 WinSendMsg(pAD->hvscroll, SBM_SETTHUMBSIZE, MPFROM2SHORT(1, 1), MPVOID);
2817 WinSendMsg(pAD->hhscroll, SBM_SETTHUMBSIZE, MPFROM2SHORT(1, 1), MPVOID);
2818 WinSetActiveWindow(HWND_DESKTOP, WinQueryWindow(hwnd, QW_PARENT));
2819 }
2820 return 0;
2821
2822 case WM_CHAR:
2823 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
2824 if (pAD && !(SHORT1FROMMP(mp1) & KC_KEYUP)) {
2825
2826 register ULONG x;
2827 ULONG numlines, y, wascursored = pAD->cursored, thistime, len;
2828 BOOL found = FALSE;
2829 RECTL rcl;
2830
2831 WinQueryWindowRect(hwnd, &rcl);
2832 numlines = NumLines(&rcl, pAD);
2833 if (numlines) {
2834 if (SHORT1FROMMP(mp1) & KC_VIRTUALKEY) {
2835 pAD->lasttime = 0;
2836 *pAD->szCommonName = 0;
2837 switch (SHORT2FROMMP(mp2)) {
2838 case VK_DELETE:
2839 if ((shiftstate & KC_CTRL) == KC_CTRL)
2840 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_PERMDELETE, 0),
2841 MPVOID);
2842 else if ((shiftstate & KC_SHIFT) == KC_SHIFT)
2843 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_SAVETOCLIP, 0),
2844 MPVOID);
2845 else
2846 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_DELETE, 0), MPVOID);
2847 break;
2848 case VK_LEFT:
2849 WinSendMsg(hwnd, WM_HSCROLL, MPFROM2SHORT(FID_HORZSCROLL, 0),
2850 MPFROM2SHORT(0, SB_LINELEFT));
2851 break;
2852 case VK_RIGHT:
2853 WinSendMsg(hwnd, WM_HSCROLL, MPFROM2SHORT(FID_HORZSCROLL, 0),
2854 MPFROM2SHORT(0, SB_LINERIGHT));
2855 break;
2856 case VK_PAGEUP:
2857 WinSendMsg(hwnd, WM_VSCROLL, MPFROM2SHORT(FID_VERTSCROLL, 0),
2858 MPFROM2SHORT(0, SB_PAGEUP));
2859 break;
2860 case VK_PAGEDOWN:
2861 WinSendMsg(hwnd, WM_VSCROLL, MPFROM2SHORT(FID_VERTSCROLL, 0),
2862 MPFROM2SHORT(0, SB_PAGEDOWN));
2863 break;
2864 case VK_UP:
2865 if (pAD->cursored > 1) {
2866 if (shiftstate & KC_SHIFT)
2867 WinSendMsg(hwnd, WM_BUTTON1CLICK,
2868 MPFROM2SHORT(pAD->fattrs.lAveCharWidth + 2,
2869 ((rcl.yTop - (pAD->lMaxHeight *
2870 ((pAD->cursored) -
2871 pAD->topfile))) -
2872 pAD->lMaxDescender) - 1),
2873 MPFROM2SHORT(TRUE, 0));
2874 pAD->cursored--;
2875 if (pAD->cursored < pAD->topfile) {
2876 PaintLine(hwnd, pAD->hps, pAD->cursored, pAD->topfile, &rcl);
2877 WinSendMsg(hwnd, WM_VSCROLL, MPFROM2SHORT(FID_VERTSCROLL, 0),
2878 MPFROM2SHORT(0, SB_LINEUP));
2879 }
2880 else {
2881 PaintLine(hwnd, pAD->hps, pAD->cursored - 1, pAD->topfile,
2882 &rcl);
2883 PaintLine(hwnd, pAD->hps, pAD->cursored, pAD->topfile, &rcl);
2884 }
2885 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
2886 }
2887 break;
2888 case VK_DOWN:
2889 if (pAD->cursored < pAD->afindexcnt
2890 && pAD->cursored < pAD->topfile + numlines) {
2891 if (shiftstate & KC_SHIFT)
2892 WinSendMsg(hwnd, WM_BUTTON1CLICK,
2893 MPFROM2SHORT(pAD->fattrs.lAveCharWidth + 2,
2894 ((rcl.yTop - (pAD->lMaxHeight *
2895 ((pAD->cursored) -
2896 pAD->topfile))) -
2897 pAD->lMaxDescender) - 1),
2898 MPFROM2SHORT(TRUE, 0));
2899 pAD->cursored++;
2900 if (pAD->cursored >= pAD->topfile + numlines) {
2901 PaintLine(hwnd, pAD->hps, pAD->cursored - 2, pAD->topfile,
2902 &rcl);
2903 WinSendMsg(hwnd, WM_VSCROLL, MPFROM2SHORT(FID_VERTSCROLL, 0),
2904 MPFROM2SHORT(0, SB_LINEDOWN));
2905 }
2906 else {
2907 PaintLine(hwnd, pAD->hps, pAD->cursored - 1, pAD->topfile,
2908 &rcl);
2909 PaintLine(hwnd, pAD->hps, pAD->cursored - 2, pAD->topfile,
2910 &rcl);
2911 }
2912 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
2913 }
2914 break;
2915 case VK_END:
2916 if ((shiftstate & KC_CTRL) ||
2917 pAD->cursored == (pAD->topfile - 1) + numlines) {
2918 pAD->cursored = pAD->afindexcnt;
2919 pAD->topfile = (pAD->afindexcnt + 1) - numlines;
2920 if (pAD->topfile > pAD->afindexcnt)
2921 pAD->topfile = 1;
2922 WinInvalidateRect(hwnd, NULL, FALSE);
2923 }
2924 else {
2925 pAD->cursored = (pAD->topfile - 1) + numlines;
2926 if (pAD->cursored > pAD->afindexcnt)
2927 pAD->cursored = pAD->afindexcnt;
2928 PaintLine(hwnd, pAD->hps, pAD->cursored - 1, pAD->topfile,
2929 &rcl);
2930 PaintLine(hwnd, pAD->hps, wascursored - 1, pAD->topfile, &rcl);
2931 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
2932 }
2933 break;
2934 case VK_HOME:
2935 if ((shiftstate & KC_CTRL) || pAD->cursored == pAD->topfile) {
2936 pAD->topfile = 1;
2937 pAD->cursored = 1;
2938 WinInvalidateRect(hwnd, NULL, FALSE);
2939 }
2940 else {
2941 pAD->cursored = pAD->topfile;
2942 PaintLine(hwnd, pAD->hps, pAD->cursored - 1, pAD->topfile,
2943 &rcl);
2944 PaintLine(hwnd, pAD->hps, wascursored - 1, pAD->topfile, &rcl);
2945 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
2946 }
2947 break;
2948 case VK_SPACE:
2949 WinSendMsg(hwnd, WM_BUTTON1CLICK,
2950 MPFROM2SHORT(pAD->fattrs.lAveCharWidth + 2,
2951 ((rcl.yTop - (pAD->lMaxHeight *
2952 ((pAD->cursored) -
2953 pAD->topfile))) -
2954 pAD->lMaxDescender) - 1),
2955 MPFROM2SHORT(TRUE, 0));
2956 break;
2957 case VK_NEWLINE:
2958 case VK_ENTER:
2959 WinSendMsg(hwnd, WM_BUTTON1DBLCLK,
2960 MPFROM2SHORT(pAD->fattrs.lAveCharWidth + 2,
2961 ((rcl.yTop - (pAD->lMaxHeight *
2962 ((pAD->cursored) -
2963 pAD->topfile))) -
2964 pAD->lMaxDescender) - 1), MPFROM2SHORT(0,
2965 0));
2966 break;
2967 }
2968 }
2969 else if (SHORT1FROMMP(mp1) & KC_CHAR) {
2970 switch (SHORT1FROMMP(mp2)) {
2971 case '\x1b':
2972 case '\r':
2973 case '\n':
2974 WinSendMsg(hwnd, WM_BUTTON1DBLCLK,
2975 MPFROM2SHORT(pAD->fattrs.lAveCharWidth + 2,
2976 (rcl.yTop - (pAD->lMaxHeight *
2977 ((pAD->cursored) -
2978 pAD->topfile))) - 1),
2979 MPFROM2SHORT(0, 0));
2980 pAD->lasttime = 0;
2981 *pAD->szCommonName = 0;
2982 break;
2983 default:
2984 thistime = WinQueryMsgTime(WinQueryAnchorBlock(hwnd));
2985 if (thistime > pAD->lasttime + 1000)
2986 *pAD->szCommonName = 0;
2987 pAD->lasttime = thistime;
2988 KbdRetry:
2989 len = strlen(pAD->szCommonName);
2990 if (len >= CCHMAXPATH - 1) {
2991 *pAD->szCommonName = 0;
2992 len = 0;
2993 }
2994 pAD->szCommonName[len] = toupper(SHORT1FROMMP(mp2));
2995 pAD->szCommonName[len + 1] = 0;
2996 for (x = pAD->cursored - (len > 0); x < pAD->afindexcnt; x++) {
2997 y = (pAD->invertsort) ? (pAD->afindexcnt - 1) - x : x;
2998 if (pAD->fullnames) {
2999 if (!strnicmp(pAD->afindex[y]->fullname, pAD->szCommonName,
3000 len + 1)) {
3001 found = TRUE;
3002 break;
3003 }
3004 }
3005 else {
3006 if (!strnicmp(pAD->afindex[y]->filename, pAD->szCommonName,
3007 len + 1)) {
3008 found = TRUE;
3009 break;
3010 }
3011 }
3012 }
3013 if (!found) {
3014 for (x = 0; x < pAD->cursored - (len > 0); x++) {
3015 y = (pAD->invertsort) ? (pAD->afindexcnt - 1) - x : x;
3016 if (pAD->fullnames) {
3017 if (!strnicmp(pAD->afindex[y]->fullname, pAD->szCommonName,
3018 len + 1)) {
3019 found = TRUE;
3020 break;
3021 }
3022 }
3023 else {
3024 if (!strnicmp(pAD->afindex[y]->filename, pAD->szCommonName,
3025 len + 1)) {
3026 found = TRUE;
3027 break;
3028 }
3029 }
3030 }
3031 }
3032 if (found) {
3033 if (x + 1 != pAD->cursored) {
3034 pAD->cursored = x + 1;
3035 if (pAD->cursored >= pAD->topfile &&
3036 pAD->cursored < pAD->topfile + numlines &&
3037 wascursored != pAD->cursored) {
3038 PaintLine(hwnd, pAD->hps, pAD->cursored - 1, pAD->topfile,
3039 &rcl);
3040 PaintLine(hwnd, pAD->hps, wascursored - 1, pAD->topfile,
3041 &rcl);
3042 }
3043 else {
3044 if (pAD->cursored < numlines)
3045 pAD->topfile = 1;
3046 else if (pAD->cursored >
3047 (pAD->afindexcnt + 1) - (numlines / 2))
3048 pAD->topfile = (pAD->afindexcnt + 1) - numlines;
3049 else
3050 pAD->topfile = pAD->cursored - (numlines / 2);
3051 WinInvalidateRect(hwnd, NULL, FALSE);
3052 }
3053 }
3054 }
3055 else {
3056 *pAD->szCommonName = 0;
3057 pAD->lasttime = 0;
3058 if (len) // retry as first letter if no match
3059 goto KbdRetry;
3060 }
3061 break;
3062 }
3063 }
3064 }
3065 }
3066 break;
3067
3068 case DM_PRINTOBJECT:
3069 return MRFROMLONG(DRR_TARGET);
3070
3071 case DM_DISCARDOBJECT:
3072 return MRFROMLONG(DRR_TARGET);
3073
3074 case WM_BEGINDRAG:
3075 {
3076 CHAR **list;
3077
3078 list = BuildAList(hwnd);
3079 if (!list)
3080 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
3081 else {
3082 WinSetWindowText(pAD->hwndStatus, GetPString(IDS_DRAGGINGFILESTEXT));
3083 DragList(hwnd, (HWND) 0, list, TRUE);
3084 FreeList(list);
3085 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
3086 }
3087 }
3088 break;
3089
3090 case WM_BUTTON1MOTIONSTART:
3091 if (pAD && !pAD->stopflag &&
3092 !DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN)) {
3093 pAD->mousecaptured = TRUE;
3094 pAD->lastselected = (ULONG) - 1;
3095 pAD->lastdirection = 0;
3096 WinSetCapture(HWND_DESKTOP, hwnd);
3097 DosReleaseMutexSem(pAD->hmtxScan);
3098 WinSendMsg(hwnd, WM_BUTTON1CLICK, mp1, MPFROM2SHORT(TRUE, 0));
3099 }
3100 break;
3101
3102 case WM_MOUSEMOVE:
3103 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
3104 if (pAD && pAD->mousecaptured) {
3105
3106 ULONG numlines, whichfile, y, x;
3107 LONG inc;
3108 RECTL Rectl;
3109 POINTS pts;
3110 BOOL outofwindow = FALSE;
3111
3112 WinQueryWindowRect(hwnd, &Rectl);
3113 numlines = NumLines(&Rectl, pAD);
3114 if (numlines) {
3115 pts.x = SHORT1FROMMP(mp1);
3116 pts.y = SHORT2FROMMP(mp1);
3117 if (pts.y < 0) {
3118 WinSendMsg(hwnd, WM_VSCROLL, MPFROM2SHORT(FID_VERTSCROLL, 0),
3119 MPFROM2SHORT(0, SB_LINEDOWN));
3120 pts.y = 1;
3121 outofwindow = TRUE;
3122 }
3123 else if (pts.y > Rectl.yTop - Rectl.yBottom) {
3124 WinSendMsg(hwnd, WM_VSCROLL, MPFROM2SHORT(FID_VERTSCROLL, 0),
3125 MPFROM2SHORT(0, SB_LINEUP));
3126 pts.y = (Rectl.yTop - Rectl.yBottom) - 1;
3127 outofwindow = TRUE;
3128 }
3129 whichfile = ((Rectl.yTop - Rectl.yBottom) -
3130 ((LONG) pts.y + pAD->lMaxDescender)) / pAD->lMaxHeight;
3131 if (whichfile > numlines - 1)
3132 whichfile = numlines - 1;
3133 whichfile += (pAD->topfile - 1);
3134 y = (pAD->invertsort) ? (pAD->afindexcnt - 1) - whichfile : whichfile;
3135 if (y < pAD->afindexcnt && pAD->lastselected != whichfile) {
3136 if (pAD->lastselected != (ULONG) - 1) {
3137 inc = (pAD->lastselected < whichfile) ? 1 : -1;
3138 for (x = pAD->lastselected + inc;
3139 x != whichfile && x < pAD->afindexcnt;
3140 (pAD->lastselected < whichfile) ? x++ : x--) {
3141 y = (pAD->invertsort) ? (pAD->afindexcnt - 1) - x : x;
3142 if (pAD->afindex[y]->flags & AF_SELECTED) {
3143 pAD->afindex[y]->flags &= ~AF_SELECTED;
3144 pAD->selected--;
3145 pAD->ullSelectedBytes -= pAD->afindex[y]->cbFile;
3146 }
3147 else {
3148 pAD->afindex[y]->flags |= AF_SELECTED;
3149 pAD->selected++;
3150 pAD->ullSelectedBytes += pAD->afindex[y]->cbFile;
3151 }
3152 PaintLine(hwnd, pAD->hps, x, pAD->topfile, &Rectl);
3153 }
3154 }
3155 WinSendMsg(hwnd, WM_BUTTON1CLICK, MPFROM2SHORT(pts.x, pts.y),
3156 MPFROM2SHORT(TRUE, 0));
3157 }
3158 }
3159 if (outofwindow) {
3160
3161 POINTL ptl;
3162
3163 WinQueryPointerPos(HWND_DESKTOP, &ptl);
3164 WinMapWindowPoints(HWND_DESKTOP, hwnd, &ptl, 1);
3165 if ((SHORT) ptl.y == (SHORT) SHORT2FROMMP(mp1) &&
3166 (SHORT) ptl.x == (SHORT) SHORT1FROMMP(mp1) &&
3167 ((SHORT) ptl.y < 0 || ptl.y > (Rectl.yTop - Rectl.yBottom))) {
3168 PostMsg(hwnd, UM_MOUSEMOVE, mp1, MPVOID);
3169 DosSleep(1);
3170 }
3171 }
3172 }
3173 break;
3174
3175 case UM_MOUSEMOVE:
3176 if (pAD && pAD->mousecaptured) {
3177
3178 POINTL ptl;
3179 RECTL Rectl;
3180
3181 WinQueryWindowRect(hwnd, &Rectl);
3182 WinQueryPointerPos(HWND_DESKTOP, &ptl);
3183 WinMapWindowPoints(HWND_DESKTOP, hwnd, &ptl, 1);
3184 if ((SHORT) ptl.y == (SHORT) SHORT2FROMMP(mp1) &&
3185 (SHORT) ptl.x == (SHORT) SHORT1FROMMP(mp1) &&
3186 ((SHORT) ptl.y < 0 || ptl.y > (Rectl.yTop - Rectl.yBottom))) {
3187 DosSleep(1);
3188 PostMsg(hwnd, WM_MOUSEMOVE, mp1, MPFROM2SHORT(TRUE, 0));
3189 }
3190 }
3191 return 0;
3192
3193 case WM_BUTTON1UP:
3194 case WM_BUTTON1MOTIONEND:
3195 if (pAD) {
3196 pAD->mousecaptured = FALSE;
3197 pAD->lastselected = (ULONG) - 1;
3198 pAD->lastdirection = 0;
3199 WinSetCapture(HWND_DESKTOP, NULLHANDLE);
3200 }
3201 break;
3202
3203 case WM_BUTTON1CLICK:
3204 case WM_BUTTON1DBLCLK:
3205 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
3206 if (pAD && !pAD->stopflag &&
3207 !DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN)) {
3208
3209 ULONG numlines, whichfile, y, wascursored;
3210 RECTL Rectl;
3211 POINTS pts;
3212
3213 if (pAD->afindexcnt) {
3214 WinQueryWindowRect(hwnd, &Rectl);
3215 numlines = NumLines(&Rectl, pAD);
3216 if (numlines) {
3217 pts.x = SHORT1FROMMP(mp1);
3218 pts.y = SHORT2FROMMP(mp1);
3219 whichfile = ((Rectl.yTop - Rectl.yBottom) -
3220 ((LONG) pts.y + pAD->lMaxDescender)) / pAD->lMaxHeight;
3221 if (whichfile > numlines - 1)
3222 whichfile = numlines - 1;
3223 whichfile += (pAD->topfile - 1);
3224 if (whichfile + 1 > pAD->afindexcnt)
3225 break;
3226 y = (pAD->invertsort) ? (pAD->afindexcnt - 1) - whichfile : whichfile;
3227 wascursored = pAD->cursored;
3228 pAD->cursored = whichfile + 1;
3229 if (pAD->cursored != wascursored)
3230 PaintLine(hwnd, pAD->hps, wascursored - 1, pAD->topfile, &Rectl);
3231 if (y < pAD->afindexcnt) {
3232 if (msg == WM_BUTTON1CLICK || fUnHilite) {
3233 if (pAD->afindex[y]->flags & AF_SELECTED) {
3234 pAD->afindex[y]->flags &= ~AF_SELECTED;
3235 pAD->selected--;
3236 pAD->ullSelectedBytes -= pAD->afindex[y]->cbFile;
3237 }
3238 else {
3239 pAD->afindex[y]->flags |= AF_SELECTED;
3240 pAD->selected++;
3241 pAD->ullSelectedBytes += pAD->afindex[y]->cbFile;
3242 }
3243 PaintLine(hwnd, pAD->hps, whichfile, pAD->topfile, &Rectl);
3244 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
3245 }
3246 }
3247 if (msg == WM_BUTTON1CLICK) {
3248 if (pAD->lastselected != (ULONG) - 1) {
3249 if (whichfile > pAD->lastselected)
3250 pAD->lastdirection = 1;
3251 else
3252 pAD->lastdirection = 2;
3253 }
3254 else
3255 pAD->lastdirection = 0;
3256 pAD->lastselected = whichfile;
3257 }
3258 else
3259 DefaultViewKeys(hwnd, pAD->hwndFrame, HWND_DESKTOP, NULL,
3260 pAD->afindex[y]->fullname);
3261 }
3262 }
3263 DosReleaseMutexSem(pAD->hmtxScan);
3264 }
3265 break;
3266
3267 case WM_MENUEND:
3268 if (pAD && (HWND) mp2 == pAD->hwndPopup) {
3269 WinDestroyWindow(pAD->hwndPopup);
3270 pAD->hwndPopup = (HWND) 0;
3271 }
3272 break;
3273
3274 case WM_CONTEXTMENU:
3275 if (pAD) {
3276 if (!pAD->hwndPopup) {
3277 pAD->hwndPopup =
3278 WinLoadMenu(HWND_DESKTOP, FM3ModHandle, SEEALL_POPUP);
3279 if (pAD->hwndPopup) {
3280 WinSetPresParam(pAD->hwndPopup, PP_FONTNAMESIZE,
3281 (ULONG) strlen(GetPString(IDS_8HELVTEXT)) + 1,
3282 (PVOID) GetPString(IDS_8HELVTEXT));
3283 SetConditionalCascade(pAD->hwndPopup,
3284 IDM_DELETESUBMENU,
3285 (fDefaultDeletePerm) ?
3286 IDM_PERMDELETE : IDM_DELETE);
3287 SetConditionalCascade(pAD->hwndPopup, IDM_MOVEMENU, IDM_MOVE);
3288 SetConditionalCascade(pAD->hwndPopup, IDM_COPYMENU, IDM_COPY);
3289 SetConditionalCascade(pAD->hwndPopup, IDM_OPENSUBMENU,
3290 IDM_OPENDEFAULT);
3291 SetConditionalCascade(pAD->hwndMenu, IDM_OBJECTSUBMENU, IDM_SHADOW);
3292 if (fWorkPlace) {
3293 WinSendMsg(pAD->hwndPopup, MM_DELETEITEM,
3294 MPFROM2SHORT(IDM_OPENSUBMENU, TRUE), MPVOID);
3295 WinSendMsg(pAD->hwndPopup, MM_DELETEITEM,
3296 MPFROM2SHORT(IDM_OBJECTSUBMENU, TRUE), MPVOID);
3297 }
3298 }
3299 }
3300 if (pAD->hwndPopup) {
3301
3302 APIRET rc;
3303
3304 rc = DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN);
3305 WinEnableMenuItem(pAD->hwndPopup, IDM_EAS, (rc == 0 &&
3306 pAD->selected != 0));
3307 WinEnableMenuItem(pAD->hwndPopup, IDM_UUDECODE, (rc == 0 &&
3308 pAD->selected != 0));
3309 WinEnableMenuItem(pAD->hwndPopup, IDM_EXTRACT, (rc == 0 &&
3310 pAD->selected != 0));
3311 WinEnableMenuItem(pAD->hwndPopup, IDM_ARCHIVE, (rc == 0 &&
3312 pAD->selected != 0));
3313 WinEnableMenuItem(pAD->hwndPopup, IDM_MOVEMENU, (rc == 0 &&
3314 pAD->selected != 0));
3315 WinEnableMenuItem(pAD->hwndPopup, IDM_COPYMENU, (rc == 0 &&
3316 pAD->selected != 0));
3317 WinEnableMenuItem(pAD->hwndPopup, IDM_RENAME, (rc == 0 &&
3318 pAD->selected != 0));
3319 WinEnableMenuItem(pAD->hwndPopup, IDM_PRINT, (rc == 0 &&
3320 pAD->selected != 0));
3321 WinEnableMenuItem(pAD->hwndPopup, IDM_SUBJECT, (rc == 0 &&
3322 pAD->selected != 0));
3323 WinEnableMenuItem(pAD->hwndPopup, IDM_OPENSUBMENU, (rc == 0 &&
3324 pAD->selected !=
3325 0));
3326 WinEnableMenuItem(pAD->hwndPopup, IDM_OBJECTSUBMENU,
3327 (rc == 0 && pAD->selected != 0));
3328 WinEnableMenuItem(pAD->hwndPopup, IDM_DELETESUBMENU,
3329 (rc == 0 && pAD->selected != 0));
3330 WinEnableMenuItem(pAD->hwndPopup, IDM_INFO,
3331 (rc == 0 && pAD->selected != 0));
3332 WinEnableMenuItem(pAD->hwndPopup, IDM_ATTRS,
3333 (rc == 0 && pAD->selected != 0));
3334 WinEnableMenuItem(pAD->hwndPopup, IDM_COLLECT,
3335 (rc == 0 && pAD->selected != 0));
3336 WinEnableMenuItem(pAD->hwndPopup, IDM_SAVETOCLIP,
3337 (rc == 0 && pAD->selected != 0));
3338 WinEnableMenuItem(pAD->hwndPopup, IDM_SAVETOCLIPFILENAME,
3339 (rc == 0 && pAD->selected != 0));
3340 WinEnableMenuItem(pAD->hwndPopup, IDM_APPENDTOCLIP,
3341 (rc == 0 && pAD->selected != 0));
3342 WinEnableMenuItem(pAD->hwndPopup, IDM_APPENDTOCLIPFILENAME,
3343 (rc == 0 && pAD->selected != 0));
3344 WinEnableMenuItem(pAD->hwndPopup, IDM_SAVETOLIST,
3345 (rc == 0 && pAD->selected != 0));
3346 WinEnableMenuItem(pAD->hwndPopup, IDM_REMOVE,
3347 (rc == 0 && pAD->selected != 0));
3348 WinEnableMenuItem(pAD->hwndPopup, IDM_HIDEALL,
3349 (rc == 0 && pAD->selected != 0));
3350 WinEnableMenuItem(pAD->hwndPopup, IDM_SELECTALL,
3351 (rc == 0 && pAD->afindexcnt != 0));
3352 WinEnableMenuItem(pAD->hwndPopup, IDM_SELECTMASK,
3353 (rc == 0 && pAD->afindexcnt != 0));
3354 WinEnableMenuItem(pAD->hwndPopup, IDM_DESELECTALL,
3355 (rc == 0 && pAD->afindexcnt != 0));
3356 WinEnableMenuItem(pAD->hwndPopup, IDM_DESELECTMASK,
3357 (rc == 0 && pAD->afindexcnt != 0));
3358 WinEnableMenuItem(pAD->hwndPopup, IDM_INVERT,
3359 (rc == 0 && pAD->afindexcnt != 0));
3360 WinEnableMenuItem(pAD->hwndPopup, IDM_FILTER,
3361 (rc == 0 && pAD->afheadcnt != 0));
3362 if (!rc)
3363 DosReleaseMutexSem(pAD->hmtxScan);
3364 if (WinPopupMenu(hwnd, hwnd, pAD->hwndPopup, SHORT1FROMMP(mp1),
3365 SHORT2FROMMP(mp1), 0,
3366 PU_HCONSTRAIN | PU_VCONSTRAIN |
3367 PU_KEYBOARD | PU_MOUSEBUTTON1))
3368 CenterOverWindow(pAD->hwndPopup);
3369 }
3370 }
3371 break;
3372
3373 case UM_CONTAINER_FILLED:
3374 if (pAD) {
3375 pAD->stopflag = 0;
3376 pAD->topfile = 1;
3377 pAD->cursored = 1;
3378 pAD->multiplier = 1;
3379 if (!pAD->afindexcnt) {
3380 DosBeep(250, 50);
3381 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
3382 }
3383 else {
3384 DosBeep(1000, 25);
3385 WinInvalidateRect(hwnd, NULL, FALSE);
3386 PostMsg(hwnd, UM_SETUP3, MPVOID, MPVOID);
3387 }
3388 WinSetWindowPos(WinQueryWindow(hwnd, QW_PARENT), HWND_TOP, 0, 0, 0, 0,
3389 SWP_SHOW | SWP_RESTORE | SWP_ACTIVATE | SWP_ZORDER);
3390 }
3391 return 0;
3392
3393 case WM_ERASEBACKGROUND:
3394 WinFillRect((HPS) mp1, (PRECTL) mp2,
3395 standardcolors[Colors[COLORS_NORMALBACK]]);
3396 return 0;
3397
3398 case WM_PAINT:
3399 // fprintf(stderr,"Seeall: WM_PAINT\n");
3400 if (pAD) {
3401
3402 HPS hpsp;
3403 RECTL Rectl;
3404 POINTL ptl;
3405 register ULONG x;
3406 ULONG y, len, numlines;
3407 CHAR szBuff[CCHMAXPATH + 80], szCmmaFmtFileSize[81];
3408 BOOL inverted, hidsys, reado, wascursored;
3409
3410 hpsp = WinBeginPaint(hwnd, pAD->hps, &Rectl);
3411 WinFillRect(hpsp, &Rectl, standardcolors[Colors[COLORS_NORMALBACK]]);
3412 if (!pAD->stopflag &&
3413 !DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN)) {
3414 WinQueryWindowRect(hwnd, &Rectl);
3415 numlines = NumLines(&Rectl, pAD);
3416 if (pAD->afindexcnt && numlines) {
3417 if (pAD->topfile > (pAD->afindexcnt + 1) - numlines)
3418 pAD->topfile = (pAD->afindexcnt + 1) - numlines;
3419 if (pAD->topfile > pAD->afindexcnt)
3420 pAD->topfile = 1;
3421 if (!pAD->topfile)
3422 pAD->topfile = 1;
3423 if (pAD->cursored < pAD->topfile)
3424 pAD->cursored = pAD->topfile;
3425 else if (pAD->cursored > (pAD->topfile + numlines) - 1)
3426 pAD->cursored = (pAD->topfile + numlines) - 1;
3427 if (pAD->cursored > pAD->afindexcnt)
3428 pAD->cursored = pAD->afindexcnt;
3429 }
3430 else
3431 pAD->topfile = pAD->cursored = 1;
3432 if (numlines && pAD->afindexcnt) {
3433 GpiSetBackMix(hpsp, BM_OVERPAINT);
3434 wascursored = TRUE;
3435 for (x = pAD->topfile - 1; x < pAD->afindexcnt; x++) {
3436 ptl.x = pAD->horzscroll;
3437 if (wascursored) { /* reestablish normal colors */
3438 GpiSetColor(pAD->hps,
3439 standardcolors[Colors[COLORS_NORMALFORE]]);
3440 GpiSetBackColor(pAD->hps,
3441 standardcolors[Colors[COLORS_NORMALBACK]]);
3442 wascursored = inverted = hidsys = reado = FALSE;
3443 }
3444 if (x == pAD->cursored - 1)
3445 wascursored = TRUE;
3446 y = (pAD->invertsort) ? (pAD->afindexcnt - 1) - x : x;
3447 ptl.y = (Rectl.yTop -
3448 (pAD->lMaxHeight * (((x + 1) - pAD->topfile) + 1)));
3449 if (ptl.y - pAD->lMaxDescender <= 0)
3450 break;
3451 if (pAD->afindex[y]->flags & AF_SELECTED) {
3452 if (!inverted) {
3453 GpiSetColor(pAD->hps,
3454 standardcolors[Colors
3455 [COLORS_SELECTEDNORMALFORE]]);
3456 GpiSetBackColor(pAD->hps,
3457 (wascursored) ?
3458 standardcolors[Colors
3459 [COLORS_CURSOREDSELECTEDBACK]]
3460 :
3461 standardcolors[Colors[COLORS_SELECTEDBACK]]);
3462 inverted = TRUE;
3463 }
3464 }
3465 else if (inverted ||
3466 ((pAD->afindex[y]->attrFile &
3467 (FILE_SYSTEM | FILE_HIDDEN)) != 0) != hidsys ||
3468 ((pAD->afindex[y]->attrFile & FILE_READONLY) != 0) !=
3469 reado) {
3470 if (pAD->afindex[y]->attrFile & (FILE_SYSTEM | FILE_HIDDEN)) {
3471 GpiSetColor(pAD->hps,
3472 standardcolors[Colors[COLORS_SYSTEMFORE]]);
3473 hidsys = TRUE;
3474 }
3475 else if ((pAD->afindex[y]->attrFile & FILE_READONLY) != 0) {
3476 GpiSetColor(pAD->hps,
3477 standardcolors[Colors[COLORS_READONLYFORE]]);
3478 reado = TRUE;
3479 }
3480 else
3481 GpiSetColor(pAD->hps,
3482 standardcolors[Colors[COLORS_NORMALFORE]]);
3483 GpiSetBackColor(pAD->hps,
3484 (wascursored) ?
3485 standardcolors[Colors
3486 [COLORS_CURSOREDNORMALBACK]] :
3487 standardcolors[Colors[COLORS_NORMALBACK]]);
3488 inverted = FALSE;
3489 }
3490 else if (wascursored)
3491 GpiSetBackColor(pAD->hps,
3492 standardcolors[Colors
3493 [COLORS_CURSOREDNORMALBACK]]);
3494 CommaFmtULL(szCmmaFmtFileSize,
3495 sizeof(szCmmaFmtFileSize), pAD->afindex[y]->cbFile, ' ');
3496 len =
3497 sprintf(szBuff,
3498 "%c%-*.*s %-12s %c%c%c%c%c %04u/%02u/%02u %02u:%02u:%02u ",
3499 wascursored ? '>' : ' ',
3500 pAD->fullnames ? pAD->longestw : pAD->longest,
3501 pAD->fullnames ? pAD->longestw : pAD->longest,
3502 (pAD->fullnames) ? pAD->afindex[y]->fullname : pAD->
3503 afindex[y]->filename, szCmmaFmtFileSize,
3504 "-A"[((pAD->afindex[y]->attrFile & FILE_ARCHIVED) !=
3505 0)],
3506 "-R"[((pAD->afindex[y]->attrFile & FILE_READONLY) !=
3507 0)],
3508 "-H"[((pAD->afindex[y]->attrFile & FILE_HIDDEN) != 0)],
3509 "-S"[((pAD->afindex[y]->attrFile & FILE_SYSTEM) != 0)],
3510 "-D"[((pAD->afindex[y]->attrFile & FILE_DIRECTORY) !=
3511 0)], pAD->afindex[y]->date.year + 1980,
3512 pAD->afindex[y]->date.month, pAD->afindex[y]->date.day,
3513 pAD->afindex[y]->time.hours,
3514 pAD->afindex[y]->time.minutes,
3515 pAD->afindex[y]->time.twosecs * 2);
3516 GpiCharStringAt(hpsp, &ptl, len, szBuff);
3517 GpiQueryCurrentPosition(hpsp, &ptl);
3518 if (ptl.x + abs(pAD->horzscroll) > pAD->maxx) {
3519 pAD->maxx = ptl.x + abs(pAD->horzscroll);
3520 WinSendMsg(pAD->hhscroll, SBM_SETTHUMBSIZE,
3521 MPFROM2SHORT((SHORT) Rectl.xRight,
3522 (SHORT) pAD->maxx), MPVOID);
3523 }
3524 }
3525 }
3526 DosReleaseMutexSem(pAD->hmtxScan);
3527 }
3528 WinEndPaint(hpsp);
3529 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
3530 if (!pAD->stopflag)
3531 WinSendMsg(pAD->hvscroll, SBM_SETSCROLLBAR,
3532 MPFROMSHORT((SHORT) (pAD->topfile / pAD->multiplier)),
3533 MPFROM2SHORT(1,
3534 (SHORT) (pAD->afindexcnt / pAD->multiplier) -
3535 (numlines - 1)));
3536 WinSendMsg(pAD->hhscroll, SBM_SETSCROLLBAR,
3537 MPFROMSHORT((SHORT) abs(pAD->horzscroll)),
3538 MPFROM2SHORT(0, (SHORT) (pAD->maxx - Rectl.xRight)));
3539 WinSendMsg(pAD->hhscroll, SBM_SETTHUMBSIZE,
3540 MPFROM2SHORT((SHORT) Rectl.xRight, (SHORT) pAD->maxx),
3541 MPVOID);
3542 }
3543 break;
3544
3545 case WM_HSCROLL:
3546 {
3547 RECTL rectl;
3548 BOOL invalidate = TRUE;
3549
3550 WinQueryWindowRect(hwnd, &rectl);
3551 switch (SHORT2FROMMP(mp2)) {
3552 case SB_PAGERIGHT:
3553 if (abs(pAD->horzscroll) < pAD->maxx - rectl.xRight) {
3554 pAD->horzscroll -= rectl.xRight;
3555 if (abs(pAD->horzscroll) > pAD->maxx - rectl.xRight)
3556 pAD->horzscroll = -(pAD->maxx - rectl.xRight);
3557 }
3558 break;
3559
3560 case SB_PAGELEFT:
3561 if (pAD->horzscroll < 0) {
3562 pAD->horzscroll += rectl.xRight;
3563 if (pAD->horzscroll > 0)
3564 pAD->horzscroll = 0;
3565 }
3566 break;
3567
3568 case SB_LINERIGHT:
3569 if (abs(pAD->horzscroll) < pAD->maxx - rectl.xRight)
3570 pAD->horzscroll -= pAD->fattrs.lAveCharWidth;
3571 break;
3572
3573 case SB_LINELEFT:
3574 if (pAD->horzscroll < 0)
3575 pAD->horzscroll += pAD->fattrs.lAveCharWidth;
3576 break;
3577
3578 case SB_SLIDERTRACK:
3579 pAD->horzscroll = SHORT1FROMMP(mp2);
3580 pAD->horzscroll = -(pAD->horzscroll);
3581 if (pAD->horzscroll > 0)
3582 pAD->horzscroll = 0;
3583 if (abs(pAD->horzscroll) > pAD->maxx - rectl.xRight)
3584 pAD->horzscroll = -(pAD->maxx - rectl.xRight);
3585 break;
3586
3587 default:
3588 invalidate = FALSE;
3589 break;
3590 }
3591 if (invalidate)
3592 WinInvalidateRect(hwnd, NULL, FALSE);
3593 }
3594 break;
3595
3596 case WM_VSCROLL:
3597// fprintf(stderr,"Seeall: WM_VSCROLL\n");
3598 if (pAD && !pAD->stopflag &&
3599 !DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN)) {
3600
3601 ULONG numlines, wascursored;
3602 RECTL rcl;
3603
3604 if (pAD->afindexcnt) {
3605 WinQueryWindowRect(hwnd, &rcl);
3606 numlines = NumLines(&rcl, pAD);
3607 if (numlines) {
3608 wascursored = pAD->cursored;
3609 switch (SHORT2FROMMP(mp2)) {
3610 case SB_PAGEUP:
3611 if (pAD->topfile > 1) {
3612 pAD->topfile -= numlines;
3613 if (pAD->topfile > pAD->afindexcnt ||
3614 pAD->topfile > (pAD->afindexcnt + 1) - numlines)
3615 pAD->topfile = 1;
3616 if (pAD->cursored > pAD->topfile + numlines)
3617 pAD->cursored = pAD->topfile + numlines;
3618 if (pAD->cursored > pAD->afindexcnt)
3619 pAD->cursored = pAD->afindexcnt;
3620 WinInvalidateRect(hwnd, NULL, FALSE);
3621 }
3622 break;
3623 case SB_PAGEDOWN:
3624 if (pAD->topfile <= pAD->afindexcnt - numlines) {
3625 pAD->topfile += numlines;
3626 if (pAD->topfile > (pAD->afindexcnt + 1) - numlines)
3627 pAD->topfile = (pAD->afindexcnt + 1) - numlines;
3628 if (pAD->cursored < pAD->topfile)
3629 pAD->cursored = pAD->topfile;
3630 if (pAD->cursored > (pAD->topfile + numlines) - 1)
3631 pAD->cursored = (pAD->topfile + numlines) - 1;
3632 if (pAD->cursored > pAD->afindexcnt)
3633 pAD->cursored = pAD->afindexcnt;
3634 WinInvalidateRect(hwnd, NULL, FALSE);
3635 }
3636 break;
3637 case SB_LINEDOWN:
3638 if (pAD->topfile <= pAD->afindexcnt - numlines) {
3639
3640 RECTL Rectl, iRectl;
3641
3642 pAD->topfile++;
3643 if (pAD->cursored < pAD->topfile)
3644 pAD->cursored = pAD->topfile;
3645 else if (pAD->cursored > (pAD->topfile + numlines) - 1)
3646 pAD->cursored = (pAD->topfile + numlines) - 1;
3647 if (pAD->cursored > pAD->afindexcnt)
3648 pAD->cursored = pAD->afindexcnt;
3649 WinQueryWindowRect(hwnd, &Rectl);
3650 WinScrollWindow(hwnd, 0, pAD->lMaxHeight,
3651 NULL, NULL, NULLHANDLE, &iRectl, 0);
3652 WinFillRect(pAD->hps, &iRectl,
3653 standardcolors[Colors[COLORS_NORMALBACK]]);
3654 PaintLine(hwnd, pAD->hps, (pAD->topfile + numlines) - 2,
3655 pAD->topfile, &Rectl);
3656 if (pAD->cursored != pAD->topfile + numlines)
3657 PaintLine(hwnd, pAD->hps, pAD->cursored - 1, pAD->topfile,
3658 &Rectl);
3659 if (wascursored != pAD->cursored
3660 && wascursored < pAD->topfile + numlines
3661 && wascursored >= pAD->topfile)
3662 PaintLine(hwnd, pAD->hps, wascursored - 1, pAD->topfile,
3663 &Rectl);
3664 if (wascursored != pAD->cursored)
3665 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
3666 WinSendMsg(pAD->hhscroll, SBM_SETSCROLLBAR,
3667 MPFROMSHORT((SHORT) abs(pAD->horzscroll)),
3668 MPFROM2SHORT(0, (SHORT) (pAD->maxx - Rectl.xRight)));
3669 WinSendMsg(pAD->hvscroll, SBM_SETSCROLLBAR,
3670 MPFROMSHORT((SHORT) (pAD->topfile /
3671 pAD->multiplier)),
3672 MPFROM2SHORT(1, (SHORT) (pAD->afindexcnt /
3673 pAD->multiplier) -
3674 (numlines - 1)));
3675 }
3676 break;
3677 case SB_LINEUP:
3678 if (pAD->topfile > 1) {
3679
3680 RECTL Rectl, iRectl;
3681
3682 pAD->topfile--;
3683 if (pAD->cursored < pAD->topfile)
3684 pAD->cursored = pAD->topfile;
3685 else if (pAD->cursored > (pAD->topfile + numlines) - 1)
3686 pAD->cursored = (pAD->topfile + numlines) - 1;
3687 if (pAD->cursored > pAD->afindexcnt)
3688 pAD->cursored = pAD->afindexcnt;
3689 WinQueryWindowRect(hwnd, &Rectl);
3690 WinScrollWindow(hwnd, 0, -pAD->lMaxHeight,
3691 NULL, NULL, NULLHANDLE, &iRectl, 0);
3692 WinFillRect(pAD->hps, &iRectl,
3693 standardcolors[Colors[COLORS_NORMALBACK]]);
3694 iRectl = Rectl;
3695 iRectl.yTop -= ((numlines * pAD->lMaxHeight) +
3696 pAD->lMaxDescender);
3697 WinFillRect(pAD->hps, &iRectl,
3698 standardcolors[pAD->aulColors[COLORS_NORMALBACK]]);
3699 PaintLine(hwnd, pAD->hps, pAD->topfile - 1, pAD->topfile,
3700 &Rectl);
3701 if (pAD->cursored != pAD->topfile)
3702 PaintLine(hwnd, pAD->hps, pAD->cursored - 1, pAD->topfile,
3703 &Rectl);
3704 if (pAD->cursored != wascursored && wascursored >= pAD->topfile
3705 && wascursored < pAD->topfile + numlines)
3706 PaintLine(hwnd, pAD->hps, wascursored - 1, pAD->topfile,
3707 &Rectl);
3708 if (pAD->cursored != wascursored)
3709 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
3710 WinSendMsg(pAD->hhscroll, SBM_SETSCROLLBAR,
3711 MPFROMSHORT((SHORT) abs(pAD->horzscroll)),
3712 MPFROM2SHORT(0, (SHORT) (pAD->maxx - Rectl.xRight)));
3713 WinSendMsg(pAD->hvscroll, SBM_SETSCROLLBAR,
3714 MPFROMSHORT((SHORT) (pAD->topfile /
3715 pAD->multiplier)),
3716 MPFROM2SHORT(1, (SHORT) (pAD->afindexcnt /
3717 pAD->multiplier) -
3718 (numlines - 1)));
3719 }
3720 break;
3721 case SB_SLIDERTRACK:
3722 if ((SHORT1FROMMP(mp2) >= 1) ||
3723 (SHORT1FROMMP(mp2)) <= pAD->afindexcnt) {
3724 pAD->topfile = (ULONG) SHORT1FROMMP(mp2) * pAD->multiplier;
3725 if (pAD->topfile > (pAD->afindexcnt + 1) - numlines)
3726 pAD->topfile = (pAD->afindexcnt + 1) - numlines;
3727 if (!pAD->topfile)
3728 pAD->topfile = 1;
3729 if (pAD->cursored < pAD->topfile)
3730 pAD->cursored = pAD->topfile;
3731 else if (pAD->cursored > pAD->topfile + numlines)
3732 pAD->cursored = pAD->topfile + numlines;
3733 if (pAD->cursored > pAD->afindexcnt)
3734 pAD->cursored = pAD->afindexcnt;
3735 WinInvalidateRect(hwnd, NULL, FALSE);
3736 }
3737 else
3738 WinAlarm(HWND_DESKTOP, WA_NOTE);
3739 break;
3740 }
3741 }
3742 }
3743 DosReleaseMutexSem(pAD->hmtxScan);
3744 }
3745 break;
3746
3747 case WM_INITMENU:
3748 if (pAD) {
3749 switch (SHORT1FROMMP(mp1)) {
3750 case IDM_FILESMENU:
3751 {
3752 APIRET rc;
3753
3754 rc = DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN);
3755 WinEnableMenuItem((HWND) mp2, IDM_DUPES, (rc == 0));
3756 WinEnableMenuItem((HWND) mp2, IDM_COLLECT, (rc == 0 &&
3757 pAD->selected != 0));
3758 WinEnableMenuItem((HWND) mp2, IDM_SAVETOCLIP, (rc == 0 &&
3759 pAD->selected != 0));
3760 WinEnableMenuItem((HWND) mp2, IDM_SAVETOCLIPFILENAME,
3761 (rc == 0 && pAD->selected != 0));
3762 WinEnableMenuItem((HWND) mp2, IDM_APPENDTOCLIP,
3763 (rc == 0 && pAD->selected != 0));
3764 WinEnableMenuItem((HWND) mp2, IDM_APPENDTOCLIPFILENAME,
3765 (rc == 0 && pAD->selected != 0));
3766 WinEnableMenuItem((HWND) mp2, IDM_SAVETOLIST,
3767 (rc == 0 && pAD->selected != 0));
3768 WinEnableMenuItem((HWND) mp2, IDM_REMOVE,
3769 (rc == 0 && pAD->selected != 0));
3770 WinEnableMenuItem((HWND) mp2, IDM_HIDEALL,
3771 (rc == 0 && pAD->selected != 0));
3772 WinEnableMenuItem((HWND) mp2, IDM_DELETESUBMENU,
3773 (rc == 0 && pAD->selected != 0));
3774 WinEnableMenuItem((HWND) mp2, IDM_INFO,
3775 (rc == 0 && pAD->selected != 0));
3776 WinEnableMenuItem((HWND) mp2, IDM_ATTRS,
3777 (rc == 0 && pAD->selected != 0));
3778 WinEnableMenuItem((HWND) mp2, IDM_EAS,
3779 (rc == 0 && pAD->selected != 0));
3780 WinEnableMenuItem((HWND) mp2, IDM_UUDECODE,
3781 (rc == 0 && pAD->selected != 0));
3782 WinEnableMenuItem((HWND) mp2, IDM_EXTRACT,
3783 (rc == 0 && pAD->selected != 0));
3784 WinEnableMenuItem((HWND) mp2, IDM_ARCHIVE,
3785 (rc == 0 && pAD->selected != 0));
3786 WinEnableMenuItem((HWND) mp2, IDM_MOVEMENU,
3787 (rc == 0 && pAD->selected != 0));
3788 WinEnableMenuItem((HWND) mp2, IDM_COPYMENU,
3789 (rc == 0 && pAD->selected != 0));
3790 WinEnableMenuItem((HWND) mp2, IDM_RENAME,
3791 (rc == 0 && pAD->selected != 0));
3792 WinEnableMenuItem((HWND) mp2, IDM_PRINT,
3793 (rc == 0 && pAD->selected != 0));
3794 WinEnableMenuItem((HWND) mp2, IDM_SUBJECT,
3795 (rc == 0 && pAD->selected != 0));
3796 WinEnableMenuItem((HWND) mp2, IDM_OPENSUBMENU,
3797 (rc == 0 && pAD->selected != 0));
3798 WinEnableMenuItem((HWND) mp2, IDM_OBJECTSUBMENU,
3799 (rc == 0 && pAD->selected != 0));
3800 if (!rc)
3801 DosReleaseMutexSem(pAD->hmtxScan);
3802 }
3803 break;
3804
3805 case IDM_SELECTSUBMENU:
3806 {
3807 APIRET rc;
3808
3809 rc = DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN);
3810 WinEnableMenuItem((HWND) mp2, IDM_SELECTALL, (rc == 0 &&
3811 pAD->afindexcnt != 0 &&
3812 (pAD->afindexcnt !=
3813 pAD->selected ||
3814 !pAD->selected)));
3815 WinEnableMenuItem((HWND) mp2, IDM_SELECTMASK, (rc == 0 &&
3816 pAD->afindexcnt != 0 &&
3817 (pAD->afindexcnt !=
3818 pAD->selected ||
3819 !pAD->selected)));
3820 WinEnableMenuItem((HWND) mp2, IDM_DESELECTALL, (rc == 0 &&
3821 pAD->afindexcnt != 0
3822 && pAD->selected));
3823 WinEnableMenuItem((HWND) mp2, IDM_DESELECTMASK,
3824 (rc == 0 && pAD->afindexcnt != 0) && pAD->selected);
3825 WinEnableMenuItem((HWND) mp2, IDM_INVERT,
3826 (rc == 0 && pAD->afindexcnt != 0));
3827 if (!rc)
3828 DosReleaseMutexSem(pAD->hmtxScan);
3829 }
3830 break;
3831
3832 case IDM_SORTSUBMENU:
3833 {
3834 APIRET rc;
3835
3836 rc = DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN);
3837 WinEnableMenuItem((HWND) mp2, IDM_SORTNAME, (rc == 0));
3838 WinEnableMenuItem((HWND) mp2, IDM_SORTEASIZE, (rc == 0));
3839 WinEnableMenuItem((HWND) mp2, IDM_SORTSIZE, (rc == 0));
3840 WinEnableMenuItem((HWND) mp2, IDM_SORTLWDATE, (rc == 0));
3841 WinEnableMenuItem((HWND) mp2, IDM_SORTFILENAME, (rc == 0));
3842 WinEnableMenuItem((HWND) mp2, IDM_SORTFIRST, (rc == 0));
3843 if (!rc)
3844 DosReleaseMutexSem(pAD->hmtxScan);
3845 }
3846 WinCheckMenuItem((HWND) mp2, IDM_SORTNAME,
3847 (pAD->pfnCompare == comparefullnames));
3848 WinCheckMenuItem((HWND) mp2, IDM_SORTEASIZE,
3849 (pAD->pfnCompare == (PFNSORT) NULL));
3850 WinCheckMenuItem((HWND) mp2, IDM_SORTSIZE,
3851 (pAD->pfnCompare == comparesizes));
3852 WinCheckMenuItem((HWND) mp2, IDM_SORTLWDATE,
3853 (pAD->pfnCompare == comparedates));
3854 WinCheckMenuItem((HWND) mp2, IDM_SORTFILENAME,
3855 (pAD->pfnCompare == comparenames));
3856 WinCheckMenuItem((HWND) mp2, IDM_SORTREVERSE, pAD->invertsort);
3857 WinCheckMenuItem((HWND) mp2, IDM_SORTFIRST,
3858 (pAD->pfnCompare == compareexts));
3859 break;
3860
3861 case IDM_VIEWSMENU:
3862 {
3863 APIRET rc;
3864
3865 rc = DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN);
3866 WinEnableMenuItem((HWND) mp2, IDM_RESCAN, (rc == 0));
3867 WinEnableMenuItem((HWND) mp2, IDM_FILTER, (rc == 0 &&
3868 pAD->afheadcnt != 0));
3869 if (!rc)
3870 DosReleaseMutexSem(pAD->hmtxScan);
3871 }
3872 WinCheckMenuItem((HWND) mp2, IDM_SHOWLNAMES, pAD->fullnames);
3873 break;
3874 }
3875 }
3876 break;
3877
3878 case WM_COMMAND:
3879 if (!pAD) {
3880 Runtime_Error(pszSrcFile, __LINE__, "no data");
3881 return 0;
3882 }
3883 switch (SHORT1FROMMP(mp1)) {
3884 case IDM_SETTARGET:
3885 SetTargetDir(hwnd, FALSE);
3886 break;
3887
3888 case IDM_DUPES:
3889 if (!pAD->stopflag &&
3890 !DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN)) {
3891 pAD->dupeflags = (USHORT) WinDlgBox(HWND_DESKTOP,
3892 hwnd,
3893 DupeDlgProc,
3894 FM3ModHandle,
3895 DUPE_FRAME,
3896 MPFROM2SHORT(pAD->dupeflags, 0));
3897 if (pAD->dupeflags) {
3898 if (_beginthread(FindDupesThread, NULL, 65536, (PVOID) hwnd) == -1)
3899 Runtime_Error(pszSrcFile, __LINE__,
3900 GetPString(IDS_COULDNTSTARTTHREADTEXT));
3901 }
3902 DosReleaseMutexSem(pAD->hmtxScan);
3903 }
3904 break;
3905
3906 case IDM_COLORPALETTE:
3907 {
3908 COLORS co;
3909 LONG temp[COLORS_MAX];
3910
3911 memset(&co, 0, sizeof(co));
3912 co.size = sizeof(co);
3913 co.numcolors = COLORS_MAX;
3914 co.colors = pAD->aulColors;
3915 co.descriptions = IDS_SACOLORS1TEXT;
3916 co.origs = temp;
3917 co.prompt = IDS_SACOLORSPROMPTTEXT;
3918 memcpy(temp, pAD->aulColors, sizeof(LONG) * COLORS_MAX);
3919 if (WinDlgBox(HWND_DESKTOP,
3920 hwnd,
3921 ColorDlgProc,
3922 FM3ModHandle, COLOR_FRAME, (PVOID) & co)) {
3923 memcpy(Colors, pAD->aulColors, sizeof(LONG) * COLORS_MAX);
3924 PrfWriteProfileData(fmprof,
3925 appname,
3926 "Seeall.Colors",
3927 &pAD->aulColors, sizeof(LONG) * COLORS_MAX);
3928 WinInvalidateRect(hwnd, NULL, FALSE);
3929 }
3930 }
3931 break;
3932
3933 case IDM_CODEPAGE:
3934 {
3935 INT cp;
3936
3937 cp = PickCodepage(hwnd);
3938 if (cp != -1) {
3939 pAD->fattrs.usCodePage = (USHORT) cp;
3940 Codepage = pAD->fattrs.usCodePage;
3941 PrfWriteProfileData(fmprof,
3942 appname,
3943 "Seeall.Codepage",
3944 &pAD->fattrs.usCodePage, sizeof(USHORT));
3945 GpiDeleteSetId(pAD->hps, FIXED_FONT_LCID);
3946 GpiAssociate(pAD->hps, 0);
3947 GpiDestroyPS(pAD->hps);
3948 pAD->hps = InitWindow(hwnd);
3949 pAD->maxx = pAD->horzscroll = 0;
3950 WinInvalidateRect(hwnd, NULL, FALSE);
3951 }
3952 }
3953 break;
3954
3955 case IDM_FONTPALETTE:
3956 SetMLEFont(hwnd, &pAD->fattrs, 11);
3957 PrfWriteProfileData(fmprof,
3958 appname,
3959 "Seeall.Fattrs", &pAD->fattrs, sizeof(pAD->fattrs));
3960 Fattrs = pAD->fattrs;
3961 GpiDeleteSetId(pAD->hps, FIXED_FONT_LCID);
3962 GpiAssociate(pAD->hps, 0);
3963 GpiDestroyPS(pAD->hps);
3964 pAD->hps = InitWindow(hwnd);
3965 pAD->maxx = pAD->horzscroll = 0;
3966 WinInvalidateRect(hwnd, NULL, FALSE);
3967 break;
3968
3969 case IDM_SHOWLNAMES:
3970 pAD->fullnames = (pAD->fullnames) ? FALSE : TRUE;
3971 PrfWriteProfileData(fmprof,
3972 appname,
3973 "Seeall.Fullnames", &pAD->fullnames, sizeof(BOOL));
3974 Fullnames = pAD->fullnames;
3975 pAD->maxx = pAD->horzscroll = 0;
3976 WinInvalidateRect(hwnd, NULL, FALSE);
3977 break;
3978
3979 case IDM_SORTREVERSE:
3980 pAD->invertsort = (pAD->invertsort) ? FALSE : TRUE;
3981 SortReverse = pAD->invertsort;
3982 PrfWriteProfileData(fmprof,
3983 appname,
3984 "Seeall.SortReverse",
3985 (PVOID) & pAD->invertsort, sizeof(BOOL));
3986 WinInvalidateRect(hwnd, NULL, FALSE);
3987 break;
3988
3989 case IDM_SORTEASIZE:
3990 case IDM_SORTNAME:
3991 case IDM_SORTFILENAME:
3992 case IDM_SORTSIZE:
3993 case IDM_SORTLWDATE:
3994 case IDM_SORTFIRST:
3995 if (!pAD->stopflag &&
3996 !DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN)) {
3997 {
3998 USHORT dummy = SHORT1FROMMP(mp1);
3999
4000 PrfWriteProfileData(fmprof,
4001 appname,
4002 "Seeall.Sort", (PVOID) & dummy, sizeof(USHORT));
4003 SortType = SHORT1FROMMP(mp1);
4004 }
4005 WinSetPointer(HWND_DESKTOP, hptrBusy);
4006 WinSendMsg(hwnd, UM_RESCAN, MPFROMLONG(1), MPVOID);
4007 switch (SHORT1FROMMP(mp1)) {
4008 case IDM_SORTEASIZE:
4009 pAD->pfnCompare = (PFNSORT) NULL;
4010 ReSort(hwnd);
4011 break;
4012
4013 case IDM_SORTNAME:
4014 pAD->pfnCompare = comparefullnames;
4015 ReSort(hwnd);
4016 break;
4017
4018 case IDM_SORTFILENAME:
4019 pAD->pfnCompare = comparenames;
4020 ReSort(hwnd);
4021 break;
4022
4023 case IDM_SORTSIZE:
4024 pAD->pfnCompare = comparesizes;
4025 ReSort(hwnd);
4026 break;
4027
4028 case IDM_SORTLWDATE:
4029 pAD->pfnCompare = comparedates;
4030 ReSort(hwnd);
4031 break;
4032
4033 case IDM_SORTFIRST:
4034 pAD->pfnCompare = compareexts;
4035 ReSort(hwnd);
4036 break;
4037 }
4038 WinSetPointer(HWND_DESKTOP, hptrArrow);
4039 DosReleaseMutexSem(pAD->hmtxScan);
4040 WinInvalidateRect(hwnd, NULL, FALSE);
4041 }
4042 break;
4043
4044 case IDM_FILTER:
4045 if (!pAD->stopflag &&
4046 !DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN)) {
4047 FilterList(hwnd);
4048 DosReleaseMutexSem(pAD->hmtxScan);
4049 }
4050 break;
4051
4052 case IDM_RESCAN:
4053 if (!pAD->stopflag &&
4054 !DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN)) {
4055
4056 CHAR tempflags[26];
4057
4058 memcpy(tempflags, pAD->abDrvFlags, sizeof(tempflags));
4059 if (!WinDlgBox(HWND_DESKTOP, hwnd, AFDrvsWndProc, FM3ModHandle,
4060 DRVS_FRAME, (PVOID) pAD)) {
4061 memcpy(pAD->abDrvFlags, tempflags, sizeof(tempflags));
4062 *pAD->szFindPath = 0;
4063 DosReleaseMutexSem(pAD->hmtxScan);
4064 break;
4065 }
4066 WinSendMsg(pAD->hhscroll, SBM_SETTHUMBSIZE, MPFROM2SHORT(1, 1),
4067 MPVOID);
4068 WinSendMsg(pAD->hvscroll, SBM_SETTHUMBSIZE, MPFROM2SHORT(1, 1),
4069 MPVOID);
4070 pAD->topfile = 1;
4071 pAD->cursored = 1;
4072 pAD->selected = 0;
4073 pAD->ullSelectedBytes = 0;
4074 pAD->maxx = pAD->horzscroll = 0;
4075 FreeAllFilesList(hwnd);
4076 pAD->stopflag = 0;
4077 if (_beginthread(FindAllThread, NULL, 524288, (PVOID) hwnd) == -1) {
4078 Runtime_Error(pszSrcFile, __LINE__,
4079 GetPString(IDS_COULDNTSTARTTHREADTEXT));
4080 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
4081 DosReleaseMutexSem(pAD->hmtxScan);
4082 }
4083 else {
4084 DosReleaseMutexSem(pAD->hmtxScan);
4085 DosSleep(50);//05 Aug 07 GKY 100
4086 WinInvalidateRect(hwnd, NULL, FALSE);
4087 PostMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
4088 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
4089 }
4090 }
4091 break;
4092 case IDM_UNHIDEALL:
4093 {
4094 ALLDATA *ad = WinQueryWindowPtr(hwnd, QWL_USER);
4095 FilterAll(hwnd, ad);
4096 }
4097 break;
4098
4099 case IDM_DELETE:
4100 case IDM_PERMDELETE:
4101 case IDM_SELECTALL:
4102 case IDM_DESELECTALL:
4103 case IDM_INVERT:
4104 case IDM_SELECTMASK:
4105 case IDM_DESELECTMASK:
4106 case IDM_REMOVE:
4107 case IDM_HIDEALL:
4108 case IDM_COLLECT:
4109 case IDM_COLLECTOR:
4110 case IDM_SAVETOCLIP:
4111 case IDM_SAVETOCLIPFILENAME:
4112 case IDM_APPENDTOCLIP:
4113 case IDM_APPENDTOCLIPFILENAME:
4114 case IDM_SAVETOLIST:
4115 case IDM_INFO:
4116 case IDM_ATTRS:
4117 case IDM_MOVE:
4118 case IDM_COPY:
4119 case IDM_RENAME:
4120 case IDM_MOVEPRESERVE:
4121 case IDM_COPYPRESERVE:
4122 case IDM_WILDMOVE:
4123 case IDM_WILDCOPY:
4124 case IDM_SUBJECT:
4125 case IDM_EAS:
4126 case IDM_PRINT:
4127 case IDM_ARCHIVE:
4128 case IDM_EXTRACT:
4129 case IDM_UUDECODE:
4130 case IDM_SHADOW:
4131 case IDM_OBJECT:
4132 case IDM_OPENSETTINGS:
4133 case IDM_OPENDEFAULT:
4134 if (!pAD->stopflag &&
4135 !DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN)) {
4136 switch (SHORT1FROMMP(mp1)) {
4137 case IDM_SELECTALL:
4138 case IDM_DESELECTALL:
4139 case IDM_INVERT:
4140 case IDM_HIDEALL:
4141 case IDM_REMOVE:
4142 Mark(hwnd, (SHORT1FROMMP(mp1) == IDM_DESELECTALL) ?
4143 AFM_UNMARK : (SHORT1FROMMP(mp1) == IDM_INVERT) ?
4144 AFM_INVERT : (SHORT1FROMMP(mp1) == IDM_HIDEALL) ?
4145 AFM_FILTER : (SHORT1FROMMP(mp1) == IDM_REMOVE) ?
4146 AFM_MARKDELETED : 0, NULL);
4147 if (SHORT1FROMMP(mp1) == IDM_REMOVE ||
4148 SHORT1FROMMP(mp1) == IDM_HIDEALL) {
4149 if (SHORT1FROMMP(mp1) == IDM_REMOVE)
4150 RemoveDeleted(hwnd);
4151 else
4152 ReSort(hwnd);
4153 }
4154 WinInvalidateRect(hwnd, NULL, FALSE);
4155 break;
4156
4157 case IDM_SELECTMASK:
4158 case IDM_DESELECTMASK:
4159 SelectMask(hwnd, (SHORT1FROMMP(mp1) == IDM_DESELECTMASK));
4160 WinInvalidateRect(hwnd, NULL, FALSE);
4161 break;
4162
4163 case IDM_DELETE:
4164 case IDM_PERMDELETE:
4165 case IDM_APPENDTOCLIP:
4166 case IDM_APPENDTOCLIPFILENAME:
4167 case IDM_SAVETOCLIP:
4168 case IDM_SAVETOCLIPFILENAME:
4169 case IDM_SAVETOLIST:
4170 case IDM_COLLECT:
4171 case IDM_INFO:
4172 case IDM_ATTRS:
4173 case IDM_MOVE:
4174 case IDM_COPY:
4175 case IDM_RENAME:
4176 case IDM_MOVEPRESERVE:
4177 case IDM_COPYPRESERVE:
4178 case IDM_WILDMOVE:
4179 case IDM_WILDCOPY:
4180 case IDM_SUBJECT:
4181 case IDM_PRINT:
4182 case IDM_EAS:
4183 case IDM_ARCHIVE:
4184 case IDM_EXTRACT:
4185 case IDM_SHADOW:
4186 case IDM_OBJECT:
4187 case IDM_OPENSETTINGS:
4188 case IDM_OPENDEFAULT:
4189 case IDM_UUDECODE:
4190 {
4191 CHAR **list = BuildAList(hwnd);
4192
4193 if (!list)
4194 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
4195 else {
4196 switch (SHORT1FROMMP(mp1)) {
4197 case IDM_COLLECT:
4198 CollectList(hwnd, list);
4199 break;
4200 case IDM_DELETE:
4201 case IDM_PERMDELETE:
4202 case IDM_APPENDTOCLIP:
4203 case IDM_APPENDTOCLIPFILENAME:
4204 case IDM_SAVETOCLIP:
4205 case IDM_SAVETOCLIPFILENAME:
4206 case IDM_SAVETOLIST:
4207 case IDM_INFO:
4208 case IDM_ATTRS:
4209 case IDM_MOVE:
4210 case IDM_COPY:
4211 case IDM_RENAME:
4212 case IDM_MOVEPRESERVE:
4213 case IDM_COPYPRESERVE:
4214 case IDM_WILDMOVE:
4215 case IDM_WILDCOPY:
4216 case IDM_SUBJECT:
4217 case IDM_PRINT:
4218 case IDM_EAS:
4219 case IDM_ARCHIVE:
4220 case IDM_EXTRACT:
4221 case IDM_UUDECODE:
4222 case IDM_OBJECT:
4223 case IDM_SHADOW:
4224 case IDM_OPENSETTINGS:
4225 case IDM_OPENDEFAULT:
4226 if (!PostMsg(pAD->hwndObj, UM_MASSACTION, mp1, MPFROMP(list)))
4227 FreeList(list);
4228 break;
4229 }
4230 if (fUnHilite) {
4231 Mark(hwnd, AFM_UNMARK, NULL);
4232 WinInvalidateRect(hwnd, NULL, FALSE);
4233 }
4234 }
4235 }
4236 break;
4237
4238 case IDM_COLLECTOR:
4239 if (mp2) {
4240
4241 CHAR **list = mp2;
4242
4243 if (Collector) {
4244 if (!PostMsg(Collector, WM_COMMAND,
4245 MPFROM2SHORT(IDM_COLLECTOR, 0), MPFROMP(list)))
4246 FreeList(list);
4247 else if (fUnHilite) {
4248 Mark(hwnd, AFM_UNMARK, NULL);
4249 WinInvalidateRect(hwnd, NULL, FALSE);
4250 }
4251 }
4252 else
4253 FreeList(list);
4254 }
4255 break;
4256 }
4257 DosReleaseMutexSem(pAD->hmtxScan);
4258 }
4259 else if (SHORT1FROMMP(mp1) == IDM_COLLECTOR) {
4260 DosSleep(50);//05 Aug 07 GKY 100
4261 if (!PostMsg(hwnd, msg, mp1, mp2))
4262 WinSendMsg(hwnd, msg, mp1, mp2);
4263 }
4264 break;
4265
4266 case IDM_HELP:
4267 if (hwndHelp)
4268 WinSendMsg(hwndHelp,
4269 HM_DISPLAY_HELP,
4270 MPFROM2SHORT(HELP_SEEALL, 0), MPFROMSHORT(HM_RESOURCEID));
4271 break;
4272 }
4273 return 0;
4274
4275 case WM_SIZE:
4276// fprintf(stderr,"Seeall: WM_SIZE\n");
4277 PostMsg(hwnd, UM_SETUP3, MPVOID, MPVOID);
4278 break;
4279
4280 case WM_CLOSE:
4281// fprintf(stderr,"Seeall: WM_CLOSE\n");
4282 if (pAD)
4283 pAD->stopflag = 1;
4284 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
4285 return 0;
4286
4287 case WM_DESTROY:
4288// fprintf(stderr,"Seeall: WM_DESTROY\n");
4289 if (pAD) {
4290 pAD->stopflag = 1;
4291 if (pAD->hmtxScan) {
4292 DosRequestMutexSem(pAD->hmtxScan, 15000);
4293 DosCloseMutexSem(pAD->hmtxScan);
4294 }
4295 if (pAD->hwndPopup)
4296 WinDestroyWindow(pAD->hwndPopup);
4297 if (pAD->hwndObj) {
4298 if (!PostMsg(pAD->hwndObj, WM_CLOSE, MPVOID, MPVOID))
4299 WinSendMsg(pAD->hwndObj, WM_CLOSE, MPVOID, MPVOID);
4300 }
4301 if (pAD->hps) {
4302 GpiDeleteSetId(pAD->hps, FIXED_FONT_LCID);
4303 GpiAssociate(pAD->hps, 0);
4304 GpiDestroyPS(pAD->hps);
4305 }
4306 if (pAD->killme) {
4307 if (!PostMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID))
4308 WinSendMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID);
4309 }
4310 FreeAllFilesList(hwnd);
4311 free(pAD);
4312 }
4313# ifdef FORTIFY
4314 Fortify_LeaveScope();
4315# endif
4316 break;
4317 }
4318
4319 return WinDefWindowProc(hwnd, msg, mp1, mp2);
4320}
4321
4322HWND StartSeeAll(HWND hwndParent, BOOL standalone, // called by applet
4323 CHAR * pszStartPath) // pathname or NULL
4324{
4325 HWND hwndFrame = (HWND) 0, hwndClient;
4326 ULONG FrameFlags = FCF_TITLEBAR | FCF_SYSMENU |
4327 FCF_SIZEBORDER | FCF_MINMAX |
4328 FCF_NOBYTEALIGN | FCF_VERTSCROLL |
4329 FCF_MENU | FCF_ICON | FCF_ACCELTABLE | FCF_HORZSCROLL;
4330
4331 if (ParentIsDesktop(hwndParent, hwndParent))
4332 FrameFlags |= (FCF_TASKLIST | FCF_SHELLPOSITION);
4333 hwndFrame = WinCreateStdWindow(hwndParent,
4334 WS_VISIBLE,
4335 &FrameFlags,
4336 WC_SEEALL,
4337 GetPString(IDS_SEEALLTITLETEXT),
4338 WS_VISIBLE | fwsAnimate,
4339 FM3ModHandle, SEEALL_FRAME, &hwndClient);
4340 if (hwndFrame) {
4341 static CHAR *pszDir;
4342
4343 if (standalone) {
4344 if (!PostMsg(WinWindowFromID(hwndFrame, FID_CLIENT),
4345 UM_SETUP4, MPVOID, MPVOID)) {
4346 PostMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID);
4347 return (HWND) 0;
4348 }
4349 }
4350 if (pszStartPath) {
4351 // Needs to be static for other thread
4352 if (!pszDir)
4353 pszDir = xmalloc(CCHMAXPATH, pszSrcFile, __LINE__);
4354 if (pszDir) {
4355 strcpy(pszDir, pszStartPath);
4356 pszStartPath = pszDir;
4357 }
4358 }
4359 PostMsg(WinWindowFromID(hwndFrame, FID_CLIENT),
4360 UM_SETUP5, MPFROMP(pszStartPath), MPVOID);
4361 }
4362 else if (standalone)
4363 PostMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID);
4364 return hwndFrame;
4365}
4366
4367#pragma alloc_text(SEEALL,comparefullnames,comparenames,comparesizes)
4368#pragma alloc_text(SEEALL,comparedates,compareexts,SeeStatusProc)
4369#pragma alloc_text(SEEALL,InitWindow,PaintLine,SeeAllWndProc)
4370#pragma alloc_text(SEEALL,UpdateList,CollectList,ReSort,Mark)
4371#pragma alloc_text(SEEALL,BuildAList,RemoveDeleted,SeeFrameWndProc,FilterList,FilterAll)
4372#pragma alloc_text(SEEALL2,SeeObjWndProc,MakeSeeObjWinThread,FindDupesThread,DupeDlgProc)
4373#pragma alloc_text(SEEALL3,FreeAllFilesList,DoADir,FindAllThread,AFDrvsWndProc)
4374#pragma alloc_text(SEEALL3,StartSeeAll)
4375
Note: See TracBrowser for help on using the repository browser.