source: trunk/dll/seeall.c@ 955

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

Prevent trap on scan of drive containing files that exceed maxpath (ticket 215)

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