source: trunk/dll/seeall.c@ 1664

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

Changes to use Unlock to unlock files if Unlock.exe is in path both from menu/toolbar and as part of copy, move and delete operations. Changes to allow copy and move over readonly files with a warning dialog; also added a warning dialog for delete of readonly files

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