source: trunk/dll/seeall.c@ 1354

Last change on this file since 1354 was 1354, checked in by Gregg Young, 17 years ago

Added driveflags to over ride write verify for USB removable drives that fail when it is on (Ticket 323); A flag to prevent directory name from being broadcast to drives in the tree cnr prior to a recursive scan of the drive (causes dbl directory names Ticket 321) Add option for multithreaded recursive scan of user selected drives at startup (Ticket 322).

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