source: trunk/dll/seeall.c@ 1682

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

Added optional confirmation dialogs for delete move and copy to compare dir Ticket 277; Added EA compare option to compare dir Ticket 80; Minor code cleanup.

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