source: trunk/dll/seeall.c@ 1570

Last change on this file since 1570 was 1559, checked in by Steven Levine, 15 years ago

Ensure FindAllThread thread quits fast when requested

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