source: trunk/dll/seeall.c@ 1880

Last change on this file since 1880 was 1880, checked in by Gregg Young, 10 years ago

Remove dead code and comments from remaining c files. #if 0 and #if NEVER were not addressed

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