source: trunk/dll/seeall.c@ 1194

Last change on this file since 1194 was 1180, checked in by John Small, 17 years ago

Ticket 187: Draft 2: Move remaining function declarations

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