source: trunk/dll/seeall.c@ 897

Last change on this file since 897 was 897, checked in by Gregg Young, 18 years ago

Use CommaFmtULL for additional file, EA etc sizes display; Modify/Create TestFDates & TestCDates for comparing/sorting files or CNRITEMS by date/time.

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