source: trunk/dll/seeall.c@ 1673

Last change on this file since 1673 was 1673, checked in by Gregg Young, 13 years ago

Update to Doxygen comment style Ticket 55. Also some minor code cleanup.

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