source: trunk/dll/seeall.c@ 858

Last change on this file since 858 was 850, checked in by Steven Levine, 18 years ago

Rework large file support wrappers (ticket #41)
Add code to avoid NTFS driver small file read defect (ticket #159)
Add debug code to try to catch David's drive bar exception
Another attempt to correct newview fast viewer text load failure

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