source: trunk/dll/seeall.c@ 1158

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

Ticket 187: Draft 1: Functions only

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