source: trunk/dll/seeall.c@ 1712

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

Added comments

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