source: trunk/dll/seeall.c@ 1212

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

Ticket 187: Move data declarations/definitions out of fm3dll.h

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