source: trunk/dll/seeall.c@ 1878

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

Remove debug code

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