source: trunk/dll/seeall.c@ 1710

Last change on this file since 1710 was 1710, checked in by Gregg Young, 12 years ago

Actually commit the fix for suppressing the readonly warning on temp archive files. Ticket 497

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