source: trunk/dll/seeall.c@ 1344

Last change on this file since 1344 was 1335, checked in by Steven Levine, 17 years ago

Ticket 26: Add exception handlers to all threads using xbeginthread

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