source: trunk/dll/seeall.c@ 961

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

Restore SaveDirCnrState internal state save logic - accidentally removed
Move save shutdown state name to strings (IDS_SHUTDOWNSTATE, ShutdownState)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 117.5 KB
Line 
1
2/***********************************************************************
3
4 $Id: seeall.c 961 2008-02-18 07:25:13Z stevenhl $
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 FilterAll(HWND hwnd, ALLDATA *ad);
1750
1751static VOID FilterList(HWND hwnd)
1752{
1753 ULONG x;
1754 ALLDATA *ad = WinQueryWindowPtr(hwnd, QWL_USER);
1755 CHAR *p;
1756
1757 if (ad->cursored <= ad->afindexcnt) {
1758 x = ad->cursored - 1;
1759 x = (ad->invertsort) ? (ad->afindexcnt - 1) - x : x;
1760 p = strrchr(ad->afindex[x]->filename, '.');
1761 if (p) {
1762 strcpy(ad->mask.szMask, "*");
1763 strcat(ad->mask.szMask, p);
1764 }
1765 }
1766 *(ad->mask.prompt) = 0;
1767 ad->mask.fIsSeeAll = TRUE;
1768 if (WinDlgBox(HWND_DESKTOP, hwnd, PickMaskDlgProc,
1769 FM3ModHandle, MSK_FRAME, MPFROMP(&ad->mask)))
1770 FilterAll(hwnd, ad);
1771}
1772
1773static VOID FilterAll(HWND hwnd, ALLDATA *ad)
1774{
1775 ULONG x, z;
1776 BOOL ret;
1777
1778 if (ad) {
1779 for (x = 0; x < ad->afheadcnt; x++) {
1780 ret = FALSE;
1781 if (ad->mask.pszMasks[1]) {
1782 for (z = 0; ad->mask.pszMasks[z]; z++) {
1783 if (*ad->mask.pszMasks[z]) {
1784 if (*ad->mask.pszMasks[z] != '/') {
1785 if (wildcard((strchr(ad->mask.pszMasks[z], '\\') ||
1786 strchr(ad->mask.pszMasks[z], ':')) ?
1787 ad->afhead[x].fullname : ad->afhead[x].filename,
1788 ad->mask.pszMasks[z], FALSE))
1789 ret = TRUE;
1790 }
1791 else {
1792 if (wildcard((strchr(ad->mask.pszMasks[z], '\\') ||
1793 strchr(ad->mask.pszMasks[z], ':')) ?
1794 ad->afhead[x].fullname : ad->afhead[x].filename,
1795 ad->mask.pszMasks[z] + 1, FALSE)) {
1796 ret = FALSE;
1797 break;
1798 }
1799 }
1800 }
1801 }
1802 }
1803 else if (*ad->mask.szMask) {
1804 if (wildcard((strchr(ad->mask.szMask, '\\') ||
1805 strchr(ad->mask.szMask, ':')) ?
1806 ad->afhead[x].fullname : ad->afhead[x].filename,
1807 ad->mask.szMask, FALSE))
1808 ret = TRUE;
1809 }
1810 else
1811 ret = TRUE;
1812
1813 if (ret) {
1814 if ((!(ad->mask.attrFile & FILE_HIDDEN)
1815 && (ad->afhead[x].attrFile & FILE_HIDDEN))
1816 || (!(ad->mask.attrFile & FILE_SYSTEM)
1817 && (ad->afhead[x].attrFile & FILE_SYSTEM))
1818 || (!(ad->mask.attrFile & FILE_READONLY)
1819 && (ad->afhead[x].attrFile & FILE_READONLY))
1820 || (!(ad->mask.attrFile & FILE_ARCHIVED)
1821 && (ad->afhead[x].attrFile & FILE_ARCHIVED)))
1822 ret = FALSE;
1823 else
1824 if (((ad->mask.antiattr & FILE_HIDDEN)
1825 && !(ad->afhead[x].attrFile & FILE_HIDDEN))
1826 || ((ad->mask.antiattr & FILE_SYSTEM)
1827 && !(ad->afhead[x].attrFile & FILE_SYSTEM))
1828 || ((ad->mask.antiattr & FILE_READONLY)
1829 && !(ad->afhead[x].attrFile & FILE_READONLY))
1830 || ((ad->mask.antiattr & FILE_ARCHIVED)
1831 && !(ad->afhead[x].attrFile & FILE_ARCHIVED)))
1832 ret = FALSE;
1833 }
1834
1835 if (!ret)
1836 ad->afhead[x].flags |= AF_FILTERED;
1837 else
1838 ad->afhead[x].flags &= (~AF_FILTERED);
1839 }
1840 ReSort(hwnd);
1841 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
1842 WinInvalidateRect(hwnd, NULL, FALSE);
1843 }
1844}
1845
1846static ULONG RemoveDeleted(HWND hwnd)
1847{
1848 ALLDATA *pAD = WinQueryWindowPtr(hwnd, QWL_USER);
1849 ULONG oldafheadcnt = pAD->afheadcnt;
1850 register ULONG x, y;
1851
1852 for (x = 0; x < pAD->afheadcnt; x++) {
1853 if (pAD->afhead[x].flags & AF_DELETED) {
1854 for (y = x; y < pAD->afheadcnt; y++) {
1855 if (~pAD->afhead[y].flags & AF_DELETED)
1856 break;
1857 if (pAD->afhead[y].flags & AF_SELECTED &&
1858 ~pAD->afhead[y].flags & AF_FILTERED) {
1859 pAD->selected--;
1860 pAD->ullSelectedBytes -= pAD->afhead[y].cbFile;
1861 }
1862 free(pAD->afhead[y].fullname);
1863 }
1864 memmove(&(pAD->afhead[x]), &(pAD->afhead[y]),
1865 (pAD->afheadcnt - y) * sizeof(ALLFILES));
1866 pAD->afheadcnt -= (y - x);
1867 }
1868 } // for x
1869 if (pAD->afheadcnt != oldafheadcnt) {
1870
1871 ALLFILES *tempa, **templ;
1872
1873 if (!pAD->afheadcnt)
1874 FreeAllFilesList(hwnd);
1875 else {
1876 tempa =
1877 xrealloc(pAD->afhead, pAD->afheadcnt * sizeof(ALLFILES), pszSrcFile,
1878 __LINE__);
1879 if (tempa) {
1880 pAD->afhead = tempa;
1881 pAD->afalloc = pAD->afheadcnt;
1882 }
1883 templ =
1884 xrealloc(pAD->afindex, pAD->afheadcnt * sizeof(ALLFILES *), pszSrcFile,
1885 __LINE__);
1886 if (templ)
1887 pAD->afindex = templ;
1888 DosPostEventSem(CompactSem);
1889 ReSort(hwnd);
1890 }
1891 }
1892 return pAD->afheadcnt;
1893}
1894
1895static VOID DoADir(HWND hwnd, CHAR * pathname)
1896{
1897 ALLDATA *ad = WinQueryWindowPtr(hwnd, QWL_USER);
1898 CHAR *filename, *enddir;
1899 PFILEFINDBUF3L pffbArray, pffbFile;
1900 HDIR hdir = HDIR_CREATE;
1901 ULONG ulFindCnt;
1902 ULONG ulFindMax;
1903 ULONG ulBufBytes;
1904 ULONG x;
1905 APIRET rc;
1906 static BOOL fDone;
1907
1908 filename = xmalloc(CCHMAXPATH + 100, pszSrcFile, __LINE__);
1909 if (!filename)
1910 return;
1911
1912 ulFindMax = FilesToGet;
1913 if (fRemoteBug && isalpha(*pathname) && pathname[1] == ':' &&
1914 pathname[2] == '\\' &&
1915 (driveflags[toupper(*pathname) - 'A'] & DRIVE_REMOTE))
1916 ulFindMax = 1;
1917
1918 ulBufBytes = sizeof(FILEFINDBUF3L) * ulFindMax;
1919 pffbArray = xmalloc(ulBufBytes, pszSrcFile, __LINE__);
1920 if (!pffbArray) {
1921 free(filename);
1922 return;
1923 }
1924
1925 strcpy(filename, pathname);
1926 enddir = &filename[strlen(filename) - 1];
1927 if (*enddir != '\\') {
1928 enddir++;
1929 *enddir = '\\';
1930 }
1931 enddir++;
1932 strcpy(enddir, "*");
1933 DosError(FERR_DISABLEHARDERR);
1934 ulFindCnt = ulFindMax;
1935 rc = xDosFindFirst(filename, &hdir, FILE_NORMAL | FILE_ARCHIVED |
1936 FILE_READONLY | FILE_DIRECTORY | FILE_SYSTEM |
1937 FILE_HIDDEN,
1938 pffbArray, ulBufBytes, &ulFindCnt, FIL_STANDARDL);
1939 if (!rc) {
1940 do {
1941 priority_normal();
1942 pffbFile = pffbArray;
1943 for (x = 0; x < ulFindCnt; x++) {
1944 if (pffbFile->attrFile & FILE_DIRECTORY) {
1945 // Skip . and ..
1946 if (pffbFile->achName[0] != '.' ||
1947 (pffbFile->achName[1] &&
1948 (pffbFile->achName[1] != '.' || pffbFile->achName[2]))) {
1949 strcpy(enddir, pffbFile->achName);
1950 DoADir(hwnd, filename);
1951 }
1952 }
1953 else {
1954 *enddir = 0;
1955 strcpy(enddir, pffbFile->achName);
1956 if (strlen(filename) > CCHMAXPATH) {
1957 // Complain if pathnames exceeds max
1958 DosFindClose(hdir);
1959 free(pffbArray);
1960 free(filename);
1961 if (!fDone) {
1962 fDone = TRUE;
1963 saymsg(MB_OK | MB_ICONASTERISK,
1964 HWND_DESKTOP,
1965 GetPString(IDS_WARNINGTEXT),
1966 "One or more of your files has a full path name that exceeds the OS/2 maximum");
1967 }
1968 return;
1969 }
1970 if (!ad->afalloc || ad->afheadcnt > ad->afalloc - 1) {
1971
1972 ALLFILES *temp;
1973
1974 temp = xrealloc(ad->afhead, (ad->afalloc + 1000) *
1975 sizeof(ALLFILES), pszSrcFile, __LINE__);
1976 if (!temp) {
1977 ad->stopflag = 1;
1978 break;
1979 }
1980 else {
1981 ad->afhead = temp;
1982 if (ad->stopflag)
1983 break;
1984 ad->afalloc += 1000;
1985 }
1986 }
1987 ad->afhead[ad->afheadcnt].fullname =
1988 xstrdup(filename, pszSrcFile, __LINE__);
1989 if (!ad->afhead[ad->afheadcnt].fullname) {
1990 ad->stopflag = 1;
1991 break;
1992 }
1993 else {
1994 ad->afhead[ad->afheadcnt].filename =
1995 ad->afhead[ad->afheadcnt].fullname + (enddir - filename);
1996 ad->afhead[ad->afheadcnt].cbFile = pffbFile->cbFile;
1997 ad->afhead[ad->afheadcnt].date = pffbFile->fdateLastWrite;
1998 ad->afhead[ad->afheadcnt].time = pffbFile->ftimeLastWrite;
1999 ad->afhead[ad->afheadcnt].attrFile = (USHORT) pffbFile->attrFile;
2000 ad->afhead[ad->afheadcnt].flags = 0;
2001 ad->afheadcnt++;
2002 if (ad->longest < pffbFile->cchName)
2003 ad->longest = pffbFile->cchName;
2004 if (ad->longestw < pffbFile->cchName + (enddir - filename))
2005 ad->longestw = pffbFile->cchName + (enddir - filename);
2006 }
2007 }
2008 pffbFile = (PFILEFINDBUF3L)((PBYTE)pffbFile + pffbFile->oNextEntryOffset);
2009 } // for
2010 if (ad->stopflag)
2011 break;
2012 ulFindCnt = ulFindMax;
2013 rc = xDosFindNext(hdir,
2014 pffbArray,
2015 sizeof(FILEFINDBUF3L) * ulFindCnt,
2016 &ulFindCnt,
2017 FIL_STANDARDL);
2018 } while (!rc);
2019 DosFindClose(hdir);
2020 }
2021
2022 if (rc && rc != ERROR_NO_MORE_FILES) {
2023 Dos_Error(MB_ENTER, rc, HWND_DESKTOP, pszSrcFile, __LINE__,
2024 GetPString(IDS_CANTFINDDIRTEXT), filename);
2025 }
2026
2027 free(pffbArray);
2028 free(filename);
2029}
2030
2031static VOID FindAllThread(VOID * args)
2032{
2033 ULONG ulDriveNum, ulDriveMap, x;
2034 CHAR startname[] = " :\\";
2035 HWND hwnd = (HWND) args;
2036 HAB hab2 = (HAB) 0;
2037 HMQ hmq2 = (HMQ) 0;
2038 ALLDATA *ad = WinQueryWindowPtr(hwnd, QWL_USER);
2039
2040 if (!DosRequestMutexSem(ad->hmtxScan, SEM_INDEFINITE_WAIT)) {
2041 priority_normal();
2042 hab2 = WinInitialize(0);
2043 if (hab2) {
2044 hmq2 = WinCreateMsgQueue(hab2, 0);
2045 if (hmq2) {
2046 WinCancelShutdown(hmq2, TRUE);
2047 IncrThreadUsage();
2048 if (!*ad->szFindPath) {
2049 DosError(FERR_DISABLEHARDERR);
2050 if (!DosQCurDisk(&ulDriveNum, &ulDriveMap)) {
2051 for (x = 2; x < 26 && !ad->stopflag; x++) {
2052 if ((ulDriveMap & (1 << x)) && ad->abDrvFlags[x]) {
2053 *startname = (CHAR) (x + 'A');
2054 DoADir(hwnd, startname);
2055 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
2056 DosSleep(0); //26 Aug 07 GKY 1
2057 }
2058 }
2059 }
2060 }
2061 else
2062 DoADir(hwnd, ad->szFindPath);
2063 DosPostEventSem(CompactSem);
2064 }
2065 }
2066 if (ad->afalloc != ad->afheadcnt) {
2067
2068 ALLFILES *tempa, **templ;
2069
2070 tempa =
2071 xrealloc(ad->afhead, sizeof(ALLFILES) * ad->afheadcnt, pszSrcFile,
2072 __LINE__);
2073 if (tempa) {
2074 ad->afhead = tempa;
2075 ad->afalloc = ad->afheadcnt;
2076 }
2077 templ =
2078 xrealloc(ad->afindex, sizeof(ALLFILES *) * ad->afheadcnt, pszSrcFile,
2079 __LINE__);
2080 if (templ)
2081 ad->afindex = templ;
2082 DosPostEventSem(CompactSem);
2083 }
2084
2085 if (!ad->stopflag) {
2086 PostMsg(hwnd, UM_RESCAN, MPFROMLONG(1), MPVOID);
2087 ReSort(hwnd);
2088 }
2089 DosReleaseMutexSem(ad->hmtxScan);
2090 }
2091 if (hmq2) {
2092 PostMsg(hwnd, UM_CONTAINER_FILLED, MPVOID, MPVOID);
2093 WinDestroyMsgQueue(hmq2);
2094 }
2095 if (hab2) {
2096 DecrThreadUsage();
2097 WinTerminate(hab2);
2098 }
2099}
2100
2101MRESULT EXPENTRY AFDrvsWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
2102{
2103 switch (msg) {
2104 case WM_INITDLG:
2105 if (mp2) {
2106
2107 ULONG ulDriveNum, ulDriveMap, x;
2108 CHAR startname[] = " :";
2109 SHORT sSelect;
2110 ALLDATA *ad;
2111
2112 ad = (ALLDATA *) mp2;
2113 WinSetWindowPtr(hwnd, QWL_USER, mp2);
2114 DosError(FERR_DISABLEHARDERR);
2115 if (!DosQCurDisk(&ulDriveNum, &ulDriveMap)) {
2116 for (x = 2; x < 26 && !ad->stopflag; x++) {
2117 if (!(driveflags[x] & (DRIVE_IGNORE | DRIVE_INVALID))) {
2118 if (ulDriveMap & (1 << x)) {
2119 *startname = (CHAR) (x + 'A');
2120 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, DRVS_LISTBOX,
2121 LM_INSERTITEM,
2122 MPFROM2SHORT(LIT_END, 0),
2123 MPFROMP(startname));
2124 if (sSelect >= 0 && ad->abDrvFlags[x])
2125 WinSendDlgItemMsg(hwnd, DRVS_LISTBOX, LM_SELECTITEM,
2126 MPFROM2SHORT(sSelect, 0), MPFROMLONG(TRUE));
2127 }
2128 }
2129 }
2130 }
2131 }
2132 else
2133 WinDismissDlg(hwnd, 0);
2134 break;
2135
2136 case WM_CONTROL:
2137 switch (SHORT1FROMMP(mp1)) {
2138 case DRVS_LISTBOX:
2139 switch (SHORT2FROMMP(mp1)) {
2140 case LN_ENTER:
2141 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(DID_OK, 0), MPVOID);
2142 break;
2143 }
2144 break;
2145 }
2146 return 0;
2147
2148 case WM_COMMAND:
2149 switch (SHORT1FROMMP(mp1)) {
2150 case DID_OK:
2151 {
2152 INT x;
2153 SHORT sSelect;
2154 CHAR filename[3];
2155 ALLDATA *ad = WinQueryWindowPtr(hwnd, QWL_USER);
2156
2157 memset(ad->abDrvFlags, 0, sizeof(ad->abDrvFlags));
2158 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, DRVS_LISTBOX,
2159 LM_QUERYSELECTION,
2160 MPFROM2SHORT(LIT_FIRST, 0),
2161 MPVOID);
2162 while (sSelect >= 0) {
2163 *filename = 0;
2164 if (WinSendDlgItemMsg(hwnd, DRVS_LISTBOX, LM_QUERYITEMTEXT,
2165 MPFROM2SHORT(sSelect, 2),
2166 MPFROMP(filename)) && *filename)
2167 ad->abDrvFlags[*filename - 'A'] = 1;
2168 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, DRVS_LISTBOX,
2169 LM_QUERYSELECTION,
2170 MPFROM2SHORT(sSelect, 0),
2171 MPVOID);
2172 }
2173 for (x = 2; x < 26; x++) {
2174 if (ad->abDrvFlags[x]) {
2175 WinDismissDlg(hwnd, 1);
2176 return 0;
2177 }
2178 }
2179 }
2180 WinDismissDlg(hwnd, 0);
2181 break;
2182
2183 case IDM_HELP:
2184 if (hwndHelp)
2185 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
2186 MPFROM2SHORT(HELP_DRVSWND, 0), MPFROMSHORT(HM_RESOURCEID));
2187 break;
2188
2189 case DID_CANCEL:
2190 WinDismissDlg(hwnd, 0);
2191 break;
2192 }
2193 return 0;
2194 }
2195 return WinDefDlgProc(hwnd, msg, mp1, mp2);
2196}
2197
2198static HPS InitWindow(HWND hwnd)
2199{
2200 ALLDATA *ad = WinQueryWindowPtr(hwnd, QWL_USER);
2201 HPS hps = (HPS) 0;
2202 SIZEL sizel;
2203 FONTMETRICS FontMetrics;
2204
2205 if (ad) {
2206 sizel.cx = sizel.cy = 0;
2207 hps = GpiCreatePS(WinQueryAnchorBlock(hwnd), WinOpenWindowDC(hwnd),
2208 (PSIZEL) & sizel, PU_PELS | GPIF_DEFAULT | GPIT_MICRO |
2209 GPIA_ASSOC);
2210 if (hps) {
2211 GpiSetCp(hps, (ULONG) ad->fattrs.usCodePage);
2212 GpiCreateLogFont(hps, NULL, FIXED_FONT_LCID, &ad->fattrs);
2213 GpiSetCharSet(hps, FIXED_FONT_LCID);
2214 GpiQueryFontMetrics(hps, sizeof(FontMetrics), &FontMetrics);
2215 ad->fattrs.lAveCharWidth = FontMetrics.lAveCharWidth;
2216 ad->fattrs.lMaxBaselineExt = FontMetrics.lMaxBaselineExt;
2217 ad->lMaxAscender = max(FontMetrics.lMaxAscender, 0);
2218 ad->lMaxDescender = max(FontMetrics.lMaxDescender, 0);
2219 ad->lMaxHeight = ad->lMaxDescender + ad->lMaxAscender;
2220 if (ad->fattrs.usCodePage != FontMetrics.usCodePage) {
2221 ad->fattrs.usCodePage = FontMetrics.usCodePage;
2222 Codepage = ad->fattrs.usCodePage;
2223 PrfWriteProfileData(fmprof,
2224 appname,
2225 "Seeall.Codepage",
2226 &ad->fattrs.usCodePage, sizeof(USHORT));
2227 }
2228 else if (ad->fattrs.usCodePage) {
2229
2230 HMQ hmq;
2231 ULONG cps[50], len, x;
2232
2233 if (!DosQueryCp(sizeof(cps), cps, &len)) {
2234 for (x = 0; x < len / sizeof(ULONG); x++) {
2235 if (cps[x] == (ULONG) ad->fattrs.usCodePage) {
2236 hmq = WinQueryWindowULong(hwnd, QWL_HMQ);
2237 WinSetCp(hmq, ad->fattrs.usCodePage);
2238 break;
2239 }
2240 }
2241 }
2242 DosSetProcessCp((ULONG) ad->fattrs.usCodePage);
2243 }
2244 GpiSetBackMix(hps, BM_OVERPAINT);
2245 }
2246 }
2247 return (hps);
2248}
2249
2250static VOID PaintLine(HWND hwnd, HPS hps, ULONG whichfile, ULONG topfile,
2251 RECTL * Rectl)
2252{
2253 ALLDATA *ad = WinQueryWindowPtr(hwnd, QWL_USER);
2254 POINTL ptl;
2255 CHAR szBuff[CCHMAXPATH + 80], szCmmaFmtFileSize[81];
2256 ULONG len, y;
2257
2258 y = (ad->invertsort) ? (ad->afindexcnt - 1) - whichfile : whichfile;
2259 ptl.y = (Rectl->yTop -
2260 (ad->lMaxHeight * (((whichfile + 1) - topfile) + 1)));
2261 ptl.x = ad->horzscroll;
2262 if (ptl.y < Rectl->yBottom || ptl.y > Rectl->yTop || y > ad->afindexcnt)
2263 return;
2264 GpiSetBackMix(hps, BM_OVERPAINT);
2265 if (ad->afindex[y]->flags & AF_SELECTED) {
2266 GpiSetColor(hps, standardcolors[Colors[COLORS_SELECTEDNORMALFORE]]);
2267 GpiSetBackColor(hps, (whichfile == ad->cursored - 1) ?
2268 standardcolors[Colors[COLORS_CURSOREDSELECTEDBACK]] :
2269 standardcolors[Colors[COLORS_SELECTEDBACK]]);
2270 }
2271 else {
2272 GpiSetColor(hps,
2273 ((ad->afindex[y]->attrFile & (FILE_SYSTEM | FILE_HIDDEN)) !=
2274 0) ? standardcolors[Colors[COLORS_SYSTEMFORE]] : ((ad->
2275 afindex
2276 [y]->
2277 attrFile &
2278 FILE_READONLY)
2279 !=
2280 0) ?
2281 standardcolors[Colors[COLORS_READONLYFORE]] :
2282 standardcolors[Colors[COLORS_NORMALFORE]]);
2283 GpiSetBackColor(hps,
2284 (whichfile ==
2285 ad->cursored -
2286 1) ? standardcolors[Colors[COLORS_CURSOREDNORMALBACK]] :
2287 standardcolors[Colors[COLORS_NORMALBACK]]);
2288 }
2289 CommaFmtULL(szCmmaFmtFileSize,
2290 sizeof(szCmmaFmtFileSize), ad->afindex[y]->cbFile, ' ');
2291 len = sprintf(szBuff,
2292 "%c%-*.*s %-12s %c%c%c%c%c %04u/%02u/%02u %02u:%02u:%02u ",
2293 whichfile == ad->cursored - 1 ? '>' : ' ',
2294 ad->fullnames ? ad->longestw : ad->longest,
2295 ad->fullnames ? ad->longestw : ad->longest,
2296 ad->fullnames ? ad->afindex[y]->fullname :
2297 ad->afindex[y]->filename,
2298 szCmmaFmtFileSize,
2299 "-A"[((ad->afindex[y]->attrFile & FILE_ARCHIVED) != 0)],
2300 "-R"[((ad->afindex[y]->attrFile & FILE_READONLY) != 0)],
2301 "-H"[((ad->afindex[y]->attrFile & FILE_HIDDEN) != 0)],
2302 "-S"[((ad->afindex[y]->attrFile & FILE_SYSTEM) != 0)],
2303 "-D"[((ad->afindex[y]->attrFile & FILE_DIRECTORY) != 0)],
2304 ad->afindex[y]->date.year + 1980,
2305 ad->afindex[y]->date.month,
2306 ad->afindex[y]->date.day,
2307 ad->afindex[y]->time.hours,
2308 ad->afindex[y]->time.minutes,
2309 ad->afindex[y]->time.twosecs * 2);
2310 GpiCharStringAt(hps, &ptl, len, szBuff);
2311 GpiQueryCurrentPosition(hps, &ptl);
2312 if (ptl.x + abs(ad->horzscroll) > ad->maxx) {
2313 ad->maxx = ptl.x + abs(ad->horzscroll);
2314 WinSendMsg(ad->hhscroll, SBM_SETTHUMBSIZE,
2315 MPFROM2SHORT((SHORT) Rectl->xRight, (SHORT) ad->maxx), MPVOID);
2316 }
2317}
2318
2319MRESULT EXPENTRY SeeStatusProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
2320{
2321 switch (msg) {
2322 case WM_CREATE:
2323 return CommonTextProc(hwnd, msg, mp1, mp2);
2324
2325 case WM_SETFOCUS:
2326 if (mp2)
2327 PostMsg(hwnd, UM_FOCUSME, MPVOID, MPVOID);
2328 break;
2329
2330 case WM_PAINT:
2331 {
2332 SWP swp;
2333 POINTL ptl;
2334 HPS hps;
2335
2336 PaintRecessedWindow(hwnd, (HPS) 0, FALSE, FALSE);
2337 hps = WinGetPS(WinQueryWindow(hwnd, QW_PARENT));
2338 if (hps) {
2339 WinQueryWindowPos(hwnd, &swp);
2340 ptl.x = swp.x - 1;
2341 ptl.y = swp.y + swp.cy + 2;
2342 GpiMove(hps, &ptl);
2343 GpiSetColor(hps, CLR_WHITE);
2344 ptl.x = swp.x + swp.cx;
2345 GpiLine(hps, &ptl);
2346 WinReleasePS(hps);
2347 }
2348 }
2349 break;
2350
2351 case UM_FOCUSME:
2352 WinSetFocus(HWND_DESKTOP, WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
2353 FID_CLIENT));
2354 return 0;
2355 }
2356 return PFNWPStatic(hwnd, msg, mp1, mp2);
2357}
2358
2359MRESULT EXPENTRY SeeFrameWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
2360{
2361 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
2362
2363 switch (msg) {
2364 case WM_BUTTON1UP:
2365 case WM_BUTTON2UP:
2366 case WM_BUTTON3UP:
2367 case WM_MOUSEMOVE:
2368 case WM_CHORD:
2369 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
2370 break;
2371
2372 case WM_CHAR:
2373 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
2374 break;
2375
2376 case WM_CALCFRAMERECT:
2377 {
2378 MRESULT mr;
2379 PRECTL prectl;
2380
2381 mr = oldproc(hwnd, msg, mp1, mp2);
2382
2383 /*
2384 * Calculate the position of the client rectangle.
2385 * Otherwise, we'll see a lot of redraw when we move the
2386 * client during WM_FORMATFRAME.
2387 */
2388
2389 if (mr && mp2) {
2390 prectl = (PRECTL) mp1;
2391 prectl->yBottom += 22;
2392 prectl->yTop -= 24;
2393 }
2394 return mr;
2395 }
2396
2397 case WM_FORMATFRAME:
2398 {
2399 SHORT sCount;
2400 PSWP pswp, pswpClient, pswpNew;
2401
2402 sCount = (SHORT) oldproc(hwnd, msg, mp1, mp2);
2403
2404 /*
2405 * Reformat the frame to "squeeze" the client
2406 * and make room for status window sibling beneath
2407 */
2408
2409 pswp = (PSWP) mp1;
2410 {
2411 SHORT x;
2412
2413 for (x = 0; x < sCount; x++) {
2414 if (WinQueryWindowUShort(pswp->hwnd, QWS_ID) == FID_CLIENT) {
2415 pswpClient = pswp;
2416 break;
2417 }
2418 pswp++;
2419 }
2420 }
2421 pswpNew = (PSWP) mp1 + sCount;
2422 *pswpNew = *pswpClient;
2423 pswpNew->hwnd = WinWindowFromID(hwnd, SEEALL_STATUS);
2424 pswpNew->x = pswpClient->x + 2;
2425 pswpNew->y = pswpClient->y + 2;
2426 pswpNew->cx = pswpClient->cx - 3;
2427 pswpNew->cy = 20;
2428 pswpClient->y = pswpNew->y + pswpNew->cy + 3;
2429 pswpClient->cy = (pswpClient->cy - pswpNew->cy) - 5;
2430 sCount++;
2431 return MRFROMSHORT(sCount);
2432 }
2433
2434 case WM_QUERYFRAMECTLCOUNT:
2435 {
2436 SHORT sCount;
2437
2438 sCount = (SHORT) oldproc(hwnd, msg, mp1, mp2);
2439 sCount++;
2440 return MRFROMSHORT(sCount);
2441 }
2442 }
2443 return oldproc(hwnd, msg, mp1, mp2);
2444}
2445
2446MRESULT EXPENTRY SeeAllWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
2447{
2448 ALLDATA *pAD = WinQueryWindowPtr(hwnd, QWL_USER);
2449
2450 switch (msg) {
2451 case WM_CREATE:
2452 // fprintf(stderr,"Seeall: WM_CREATE\n");
2453 WinSetWindowPtr(hwnd, QWL_USER, NULL);
2454 pAD = xmallocz(sizeof(ALLDATA), pszSrcFile, __LINE__);
2455 if (pAD) {
2456 HWND hwndFrame;
2457
2458 pAD->size = sizeof(ALLDATA);
2459 hwndFrame = WinQueryWindow(hwnd, QW_PARENT);
2460 pAD->hwndFrame = hwndFrame;
2461 pAD->mask.attrFile = FILE_READONLY | FILE_HIDDEN |
2462 FILE_SYSTEM | FILE_ARCHIVED;
2463 pAD->mask.fNoDirs = TRUE;
2464 *(pAD->mask.prompt) = 0;
2465 WinSetWindowPtr(hwnd, QWL_USER, (PVOID) pAD);
2466 pAD->pfnCompare = comparenames;
2467 if (Firsttime) {
2468
2469 ULONG size;
2470
2471 size = sizeof(USHORT);
2472 PrfQueryProfileData(fmprof,
2473 appname,
2474 "Seeall.Codepage", (PVOID) & Codepage, &size);
2475 size = sizeof(BOOL);
2476 PrfQueryProfileData(fmprof,
2477 appname,
2478 "Seeall.Fullnames", (PVOID) & Fullnames, &size);
2479 size = sizeof(USHORT);
2480 PrfQueryProfileData(fmprof,
2481 appname,
2482 "Seeall.Sort", (PVOID) & SortType, &size);
2483 size = sizeof(BOOL);
2484 PrfQueryProfileData(fmprof,
2485 appname,
2486 "Seeall.SortReverse",
2487 (PVOID) & SortReverse, &size);
2488 memset(&Fattrs, 0, sizeof(Fattrs));
2489 size = sizeof(Fattrs);
2490 Fattrs.usRecordLength = sizeof(Fattrs);
2491 Fattrs.lMaxBaselineExt = 16;
2492 Fattrs.lAveCharWidth = 8;
2493 Fattrs.usCodePage = Codepage;
2494 strcpy(Fattrs.szFacename, GetPString(IDS_SYSMONOTEXT));
2495 PrfQueryProfileData(fmprof,
2496 appname,
2497 "Seeall.Fattrs", (PVOID) & Fattrs, &size);
2498 size = sizeof(LONG) * COLORS_MAX;
2499 PrfQueryProfileData(fmprof,
2500 appname, "Seeall.Colors", (PVOID) Colors, &size);
2501 Firsttime = FALSE;
2502 }
2503 switch (SortType) {
2504 case IDM_SORTEASIZE:
2505 pAD->pfnCompare = (PFNSORT) NULL;
2506 break;
2507 case IDM_SORTNAME:
2508 pAD->pfnCompare = comparefullnames;
2509 break;
2510 case IDM_SORTFILENAME:
2511 pAD->pfnCompare = comparenames;
2512 break;
2513 case IDM_SORTSIZE:
2514 pAD->pfnCompare = comparesizes;
2515 break;
2516 case IDM_SORTLWDATE:
2517 pAD->pfnCompare = comparedates;
2518 break;
2519 case IDM_SORTFIRST:
2520 pAD->pfnCompare = compareexts;
2521 break;
2522 }
2523 pAD->invertsort = SortReverse;
2524 pAD->fattrs = Fattrs;
2525 pAD->fullnames = Fullnames;
2526 pAD->stopflag = 0;
2527 pAD->cursored = pAD->topfile = 1;
2528 pAD->fattrs.usCodePage = Codepage;
2529 memcpy(pAD->aulColors, Colors, sizeof(LONG) * COLORS_MAX);
2530 pAD->hwndMenu = WinWindowFromID(hwndFrame, FID_MENU);
2531 SetConditionalCascade(pAD->hwndMenu, IDM_DELETESUBMENU,
2532 (fDefaultDeletePerm) ?
2533 IDM_PERMDELETE : IDM_DELETE);
2534 SetConditionalCascade(pAD->hwndMenu, IDM_MOVEMENU, IDM_MOVE);
2535 SetConditionalCascade(pAD->hwndMenu, IDM_COPYMENU, IDM_COPY);
2536 SetConditionalCascade(pAD->hwndMenu, IDM_OPENSUBMENU, IDM_OPENDEFAULT);
2537 SetConditionalCascade(pAD->hwndMenu, IDM_OBJECTSUBMENU, IDM_SHADOW);
2538 if (fWorkPlace) {
2539 WinSendMsg(pAD->hwndMenu, MM_DELETEITEM,
2540 MPFROM2SHORT(IDM_OPENSUBMENU, TRUE), MPVOID);
2541 WinSendMsg(pAD->hwndMenu, MM_DELETEITEM,
2542 MPFROM2SHORT(IDM_OBJECTSUBMENU, TRUE), MPVOID);
2543 }
2544 pAD->hwndClient = hwnd;
2545 pAD->hps = InitWindow(hwnd);
2546 pAD->hvscroll = WinWindowFromID(hwndFrame, FID_VERTSCROLL);
2547 pAD->hhscroll = WinWindowFromID(hwndFrame, FID_HORZSCROLL);
2548 pAD->multiplier = 1;
2549 if (_beginthread(MakeSeeObjWinThread, NULL, 122880, (PVOID) pAD) == -1)
2550 Runtime_Error(pszSrcFile, __LINE__,
2551 GetPString(IDS_COULDNTSTARTTHREADTEXT));
2552 else {
2553 if (!DosCreateMutexSem(NULL, &pAD->hmtxScan, 0, FALSE)) {
2554 pAD->hwndStatus = WinCreateWindow(hwndFrame,
2555 WC_SEESTATUS,
2556 NullStr,
2557 WS_VISIBLE | SS_TEXT |
2558 DT_LEFT | DT_VCENTER,
2559 0,
2560 0,
2561 0,
2562 0,
2563 hwndFrame,
2564 HWND_TOP,
2565 SEEALL_STATUS, NULL, NULL);
2566 if (!pAD->hwndStatus)
2567 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__,
2568 IDS_WINCREATEWINDOW);
2569 else {
2570 PFNWP oldproc;
2571
2572 oldproc = WinSubclassWindow(hwndFrame, SeeFrameWndProc);
2573 WinSetWindowPtr(hwndFrame, QWL_USER, (PVOID) oldproc);
2574 }
2575 break;
2576 }
2577 }
2578 }
2579 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
2580 break;
2581
2582 case UM_SETUP5:
2583 // fprintf(stderr,"Seeall: UM_SETUP5\n");
2584 if (pAD) {
2585 if (mp1 && *((CHAR *) mp1))
2586 strcpy(pAD->szFindPath, (CHAR *) mp1);
2587 else {
2588 if (!WinDlgBox(HWND_DESKTOP, hwnd, AFDrvsWndProc,
2589 FM3ModHandle, DRVS_FRAME, (PVOID) pAD)) {
2590 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
2591 return 0;
2592 }
2593 }
2594 if (_beginthread(FindAllThread, NULL, 524288, (PVOID) hwnd) == -1) {
2595 Runtime_Error(pszSrcFile, __LINE__,
2596 GetPString(IDS_COULDNTSTARTTHREADTEXT));
2597 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
2598 }
2599 else {
2600 DosSleep(50);//05 Aug 07 GKY 100
2601 PostMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
2602 PostMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
2603 }
2604 }
2605 else
2606 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
2607 return 0;
2608
2609 case UM_UPDATERECORDLIST:
2610 if (mp1) {
2611
2612 APIRET rc;
2613
2614 rc = DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN);
2615 if (!rc) {
2616 WinSetPointer(HWND_DESKTOP, hptrBusy);
2617 if (UpdateList(hwnd, mp1)) {
2618 FreeList(mp1);
2619 RemoveDeleted(hwnd);
2620 ReSort(hwnd);
2621 WinInvalidateRect(hwnd, NULL, FALSE);
2622 }
2623 DosReleaseMutexSem(pAD->hmtxScan);
2624 WinSetPointer(HWND_DESKTOP, hptrArrow);
2625 }
2626 }
2627 return 0;
2628
2629 case UM_SETUP2:
2630// fprintf(stderr,"Seeall: UM_SETUP2\n");
2631 if (pAD) {
2632
2633 CHAR s[256];
2634 BOOL once = FALSE;
2635 ULONG x, ulDriveNum, ulDriveMap;
2636
2637 strcpy(s, GetPString(IDS_SEEALLTITLETEXT));
2638 if (!*pAD->szFindPath) {
2639 DosError(FERR_DISABLEHARDERR);
2640 if (!DosQCurDisk(&ulDriveNum, &ulDriveMap)) {
2641 for (x = 2; x < 26 && !pAD->stopflag; x++) {
2642 if ((ulDriveMap & (1 << x)) && pAD->abDrvFlags[x]) {
2643 sprintf(&s[strlen(s)], "%s%c:", (once) ? ", " : " (", x + 'A');
2644 once = TRUE;
2645 }
2646 }
2647 if (once)
2648 strcat(s, ")");
2649 }
2650 }
2651 else {
2652 strcat(s, " (");
2653 strcat(s, pAD->szFindPath);
2654 strcat(s, ")");
2655 }
2656 WinSetWindowText(WinQueryWindow(hwnd, QW_PARENT), s);
2657 }
2658 return 0;
2659
2660 case UM_SETUP3:
2661// fprintf(stderr,"Seeall: UM_SETUP3\n");
2662 if (pAD) {
2663 pAD->multiplier = pAD->afindexcnt / 32767;
2664 if (pAD->multiplier * 32767 != pAD->afindexcnt)
2665 pAD->multiplier++;
2666 if (!pAD->multiplier)
2667 pAD->multiplier++;
2668 {
2669 RECTL Rectl;
2670 ULONG numlines;
2671
2672 WinQueryWindowRect(hwnd, &Rectl);
2673 numlines = NumLines(&Rectl, pAD);
2674 if (numlines) {
2675 WinSendMsg(pAD->hhscroll, SBM_SETTHUMBSIZE,
2676 MPFROM2SHORT((SHORT) Rectl.xRight, (SHORT) pAD->maxx),
2677 MPVOID);
2678 WinSendMsg(pAD->hvscroll, SBM_SETTHUMBSIZE,
2679 MPFROM2SHORT((SHORT) numlines,
2680 (SHORT) min(pAD->afindexcnt, 32767)),
2681 MPFROM2SHORT(1, pAD->afindexcnt + 1));
2682 WinSendMsg(pAD->hhscroll, SBM_SETSCROLLBAR,
2683 MPFROMSHORT((SHORT) abs(pAD->horzscroll)),
2684 MPFROM2SHORT(0, (SHORT) (pAD->maxx - Rectl.xRight)));
2685 WinSendMsg(pAD->hvscroll, SBM_SETSCROLLBAR,
2686 MPFROMSHORT((SHORT) (pAD->topfile / pAD->multiplier)),
2687 MPFROM2SHORT(1,
2688 (SHORT) (pAD->afindexcnt / pAD->multiplier) -
2689 (numlines - 1)));
2690 if (pAD->afindexcnt - pAD->topfile < numlines) {
2691 pAD->topfile = ((pAD->afindexcnt - pAD->topfile) - numlines);
2692 WinInvalidateRect(hwnd, NULL, FALSE);
2693 }
2694 }
2695 }
2696 }
2697 return 0;
2698
2699 case UM_SETUP4:
2700 // fprintf(stderr,"Seeall: UM_SETUP4\n");
2701 if (pAD)
2702 pAD->killme = TRUE;
2703 else
2704 PostMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID);
2705 return 0;
2706
2707 case UM_RESCAN:
2708 // fprintf(stderr,"Seeall: UM_RESCAN\n");
2709 if (pAD && !pAD->stopflag) {
2710 if (DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN)) {
2711 CHAR s[CCHMAXPATH + 80], tm[34];
2712
2713 if (mp1) {
2714 strcpy(s, GetPString(IDS_SORTINGTEXT));
2715 if (pAD->afindexcnt) {
2716 commafmt(tm, sizeof(tm), pAD->afindexcnt);
2717 strcat(s, tm);
2718 }
2719 }
2720 else {
2721 strcpy(s, GetPString(IDS_WORKINGTEXT));
2722 if (pAD->afheadcnt) {
2723 commafmt(tm, sizeof(tm), pAD->afheadcnt);
2724 strcat(s, tm);
2725 }
2726 }
2727 if (mp2) {
2728 strcat(s, " ");
2729 strcat(s, (CHAR *) mp2);
2730 }
2731 WinSetWindowText(pAD->hwndStatus, s);
2732 }
2733 else {
2734 CHAR s[(CCHMAXPATH * 2) + 80], tm[34], ts[34], tb[34];
2735 ULONG y;
2736
2737 if (mp1) {
2738 strcpy(s, GetPString(IDS_SORTINGTEXT));
2739 if (pAD->afindexcnt) {
2740 commafmt(tm, sizeof(tm), pAD->afindexcnt);
2741 strcat(s, tm);
2742 }
2743 if (mp2) {
2744 strcat(s, " ");
2745 strcat(s, (CHAR *) mp2);
2746 }
2747 }
2748 else if (pAD->afindexcnt) {
2749 y = (pAD->invertsort) ? (pAD->afindexcnt - 1) - (pAD->cursored - 1) :
2750 pAD->cursored - 1;
2751 commafmt(tm, sizeof(tm), pAD->afindexcnt);
2752 commafmt(ts, sizeof(ts), pAD->selected);
2753 CommaFmtULL(tb, sizeof(tb), pAD->ullSelectedBytes, ' ');
2754 sprintf(s,
2755 " %s %s%s%s %s %s (%s) %s %s",
2756 tm,
2757 GetPString(IDS_FILETEXT),
2758 &"s"[pAD->afindexcnt == 1],
2759 (*pAD->mask.szMask ||
2760 (pAD->mask.attrFile & (~FILE_DIRECTORY)) !=
2761 (ALLATTRS & (~FILE_DIRECTORY)) ||
2762 pAD->mask.antiattr) ?
2763 GetPString(IDS_FILTEREDTEXT) :
2764 NullStr,
2765 ts,
2766 GetPString(IDS_SELECTEDTEXT),
2767 tb, GetPString(IDS_CURRTEXT), pAD->afindex[y]->fullname);
2768 }
2769 else
2770 sprintf(s,
2771 GetPString(IDS_NOFILESPSTEXT),
2772 (*pAD->mask.szMask ||
2773 (pAD->mask.attrFile & (~FILE_DIRECTORY)) !=
2774 (ALLATTRS & (~FILE_DIRECTORY)) ||
2775 pAD->mask.antiattr) ?
2776 GetPString(IDS_FILTEREDTEXT) : NullStr);
2777 WinSetWindowText(pAD->hwndStatus, s);
2778 DosReleaseMutexSem(pAD->hmtxScan);
2779 }
2780 }
2781 return 0;
2782
2783 case UM_SETUP:
2784 // fprintf(stderr,"Seeall: UM_SETUP\n");
2785 if (pAD) {
2786 WinSendMsg(pAD->hvscroll, SBM_SETTHUMBSIZE, MPFROM2SHORT(1, 1), MPVOID);
2787 WinSendMsg(pAD->hhscroll, SBM_SETTHUMBSIZE, MPFROM2SHORT(1, 1), MPVOID);
2788 WinSetActiveWindow(HWND_DESKTOP, WinQueryWindow(hwnd, QW_PARENT));
2789 }
2790 return 0;
2791
2792 case WM_CHAR:
2793 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
2794 if (pAD && !(SHORT1FROMMP(mp1) & KC_KEYUP)) {
2795
2796 register ULONG x;
2797 ULONG numlines, y, wascursored = pAD->cursored, thistime, len;
2798 BOOL found = FALSE;
2799 RECTL rcl;
2800
2801 WinQueryWindowRect(hwnd, &rcl);
2802 numlines = NumLines(&rcl, pAD);
2803 if (numlines) {
2804 if (SHORT1FROMMP(mp1) & KC_VIRTUALKEY) {
2805 pAD->lasttime = 0;
2806 *pAD->szCommonName = 0;
2807 switch (SHORT2FROMMP(mp2)) {
2808 case VK_DELETE:
2809 if ((shiftstate & KC_CTRL) == KC_CTRL)
2810 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_PERMDELETE, 0),
2811 MPVOID);
2812 else if ((shiftstate & KC_SHIFT) == KC_SHIFT)
2813 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_SAVETOCLIP, 0),
2814 MPVOID);
2815 else
2816 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_DELETE, 0), MPVOID);
2817 break;
2818 case VK_LEFT:
2819 WinSendMsg(hwnd, WM_HSCROLL, MPFROM2SHORT(FID_HORZSCROLL, 0),
2820 MPFROM2SHORT(0, SB_LINELEFT));
2821 break;
2822 case VK_RIGHT:
2823 WinSendMsg(hwnd, WM_HSCROLL, MPFROM2SHORT(FID_HORZSCROLL, 0),
2824 MPFROM2SHORT(0, SB_LINERIGHT));
2825 break;
2826 case VK_PAGEUP:
2827 WinSendMsg(hwnd, WM_VSCROLL, MPFROM2SHORT(FID_VERTSCROLL, 0),
2828 MPFROM2SHORT(0, SB_PAGEUP));
2829 break;
2830 case VK_PAGEDOWN:
2831 WinSendMsg(hwnd, WM_VSCROLL, MPFROM2SHORT(FID_VERTSCROLL, 0),
2832 MPFROM2SHORT(0, SB_PAGEDOWN));
2833 break;
2834 case VK_UP:
2835 if (pAD->cursored > 1) {
2836 if (shiftstate & KC_SHIFT)
2837 WinSendMsg(hwnd, WM_BUTTON1CLICK,
2838 MPFROM2SHORT(pAD->fattrs.lAveCharWidth + 2,
2839 ((rcl.yTop - (pAD->lMaxHeight *
2840 ((pAD->cursored) -
2841 pAD->topfile))) -
2842 pAD->lMaxDescender) - 1),
2843 MPFROM2SHORT(TRUE, 0));
2844 pAD->cursored--;
2845 if (pAD->cursored < pAD->topfile) {
2846 PaintLine(hwnd, pAD->hps, pAD->cursored, pAD->topfile, &rcl);
2847 WinSendMsg(hwnd, WM_VSCROLL, MPFROM2SHORT(FID_VERTSCROLL, 0),
2848 MPFROM2SHORT(0, SB_LINEUP));
2849 }
2850 else {
2851 PaintLine(hwnd, pAD->hps, pAD->cursored - 1, pAD->topfile,
2852 &rcl);
2853 PaintLine(hwnd, pAD->hps, pAD->cursored, pAD->topfile, &rcl);
2854 }
2855 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
2856 }
2857 break;
2858 case VK_DOWN:
2859 if (pAD->cursored < pAD->afindexcnt
2860 && pAD->cursored < pAD->topfile + numlines) {
2861 if (shiftstate & KC_SHIFT)
2862 WinSendMsg(hwnd, WM_BUTTON1CLICK,
2863 MPFROM2SHORT(pAD->fattrs.lAveCharWidth + 2,
2864 ((rcl.yTop - (pAD->lMaxHeight *
2865 ((pAD->cursored) -
2866 pAD->topfile))) -
2867 pAD->lMaxDescender) - 1),
2868 MPFROM2SHORT(TRUE, 0));
2869 pAD->cursored++;
2870 if (pAD->cursored >= pAD->topfile + numlines) {
2871 PaintLine(hwnd, pAD->hps, pAD->cursored - 2, pAD->topfile,
2872 &rcl);
2873 WinSendMsg(hwnd, WM_VSCROLL, MPFROM2SHORT(FID_VERTSCROLL, 0),
2874 MPFROM2SHORT(0, SB_LINEDOWN));
2875 }
2876 else {
2877 PaintLine(hwnd, pAD->hps, pAD->cursored - 1, pAD->topfile,
2878 &rcl);
2879 PaintLine(hwnd, pAD->hps, pAD->cursored - 2, pAD->topfile,
2880 &rcl);
2881 }
2882 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
2883 }
2884 break;
2885 case VK_END:
2886 if ((shiftstate & KC_CTRL) ||
2887 pAD->cursored == (pAD->topfile - 1) + numlines) {
2888 pAD->cursored = pAD->afindexcnt;
2889 pAD->topfile = (pAD->afindexcnt + 1) - numlines;
2890 if (pAD->topfile > pAD->afindexcnt)
2891 pAD->topfile = 1;
2892 WinInvalidateRect(hwnd, NULL, FALSE);
2893 }
2894 else {
2895 pAD->cursored = (pAD->topfile - 1) + numlines;
2896 if (pAD->cursored > pAD->afindexcnt)
2897 pAD->cursored = pAD->afindexcnt;
2898 PaintLine(hwnd, pAD->hps, pAD->cursored - 1, pAD->topfile,
2899 &rcl);
2900 PaintLine(hwnd, pAD->hps, wascursored - 1, pAD->topfile, &rcl);
2901 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
2902 }
2903 break;
2904 case VK_HOME:
2905 if ((shiftstate & KC_CTRL) || pAD->cursored == pAD->topfile) {
2906 pAD->topfile = 1;
2907 pAD->cursored = 1;
2908 WinInvalidateRect(hwnd, NULL, FALSE);
2909 }
2910 else {
2911 pAD->cursored = pAD->topfile;
2912 PaintLine(hwnd, pAD->hps, pAD->cursored - 1, pAD->topfile,
2913 &rcl);
2914 PaintLine(hwnd, pAD->hps, wascursored - 1, pAD->topfile, &rcl);
2915 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
2916 }
2917 break;
2918 case VK_SPACE:
2919 WinSendMsg(hwnd, WM_BUTTON1CLICK,
2920 MPFROM2SHORT(pAD->fattrs.lAveCharWidth + 2,
2921 ((rcl.yTop - (pAD->lMaxHeight *
2922 ((pAD->cursored) -
2923 pAD->topfile))) -
2924 pAD->lMaxDescender) - 1),
2925 MPFROM2SHORT(TRUE, 0));
2926 break;
2927 case VK_NEWLINE:
2928 case VK_ENTER:
2929 WinSendMsg(hwnd, WM_BUTTON1DBLCLK,
2930 MPFROM2SHORT(pAD->fattrs.lAveCharWidth + 2,
2931 ((rcl.yTop - (pAD->lMaxHeight *
2932 ((pAD->cursored) -
2933 pAD->topfile))) -
2934 pAD->lMaxDescender) - 1), MPFROM2SHORT(0,
2935 0));
2936 break;
2937 }
2938 }
2939 else if (SHORT1FROMMP(mp1) & KC_CHAR) {
2940 switch (SHORT1FROMMP(mp2)) {
2941 case '\x1b':
2942 case '\r':
2943 case '\n':
2944 WinSendMsg(hwnd, WM_BUTTON1DBLCLK,
2945 MPFROM2SHORT(pAD->fattrs.lAveCharWidth + 2,
2946 (rcl.yTop - (pAD->lMaxHeight *
2947 ((pAD->cursored) -
2948 pAD->topfile))) - 1),
2949 MPFROM2SHORT(0, 0));
2950 pAD->lasttime = 0;
2951 *pAD->szCommonName = 0;
2952 break;
2953 default:
2954 thistime = WinQueryMsgTime(WinQueryAnchorBlock(hwnd));
2955 if (thistime > pAD->lasttime + 1000)
2956 *pAD->szCommonName = 0;
2957 pAD->lasttime = thistime;
2958 KbdRetry:
2959 len = strlen(pAD->szCommonName);
2960 if (len >= CCHMAXPATH - 1) {
2961 *pAD->szCommonName = 0;
2962 len = 0;
2963 }
2964 pAD->szCommonName[len] = toupper(SHORT1FROMMP(mp2));
2965 pAD->szCommonName[len + 1] = 0;
2966 for (x = pAD->cursored - (len > 0); x < pAD->afindexcnt; x++) {
2967 y = (pAD->invertsort) ? (pAD->afindexcnt - 1) - x : x;
2968 if (pAD->fullnames) {
2969 if (!strnicmp(pAD->afindex[y]->fullname, pAD->szCommonName,
2970 len + 1)) {
2971 found = TRUE;
2972 break;
2973 }
2974 }
2975 else {
2976 if (!strnicmp(pAD->afindex[y]->filename, pAD->szCommonName,
2977 len + 1)) {
2978 found = TRUE;
2979 break;
2980 }
2981 }
2982 }
2983 if (!found) {
2984 for (x = 0; x < pAD->cursored - (len > 0); x++) {
2985 y = (pAD->invertsort) ? (pAD->afindexcnt - 1) - x : x;
2986 if (pAD->fullnames) {
2987 if (!strnicmp(pAD->afindex[y]->fullname, pAD->szCommonName,
2988 len + 1)) {
2989 found = TRUE;
2990 break;
2991 }
2992 }
2993 else {
2994 if (!strnicmp(pAD->afindex[y]->filename, pAD->szCommonName,
2995 len + 1)) {
2996 found = TRUE;
2997 break;
2998 }
2999 }
3000 }
3001 }
3002 if (found) {
3003 if (x + 1 != pAD->cursored) {
3004 pAD->cursored = x + 1;
3005 if (pAD->cursored >= pAD->topfile &&
3006 pAD->cursored < pAD->topfile + numlines &&
3007 wascursored != pAD->cursored) {
3008 PaintLine(hwnd, pAD->hps, pAD->cursored - 1, pAD->topfile,
3009 &rcl);
3010 PaintLine(hwnd, pAD->hps, wascursored - 1, pAD->topfile,
3011 &rcl);
3012 }
3013 else {
3014 if (pAD->cursored < numlines)
3015 pAD->topfile = 1;
3016 else if (pAD->cursored >
3017 (pAD->afindexcnt + 1) - (numlines / 2))
3018 pAD->topfile = (pAD->afindexcnt + 1) - numlines;
3019 else
3020 pAD->topfile = pAD->cursored - (numlines / 2);
3021 WinInvalidateRect(hwnd, NULL, FALSE);
3022 }
3023 }
3024 }
3025 else {
3026 *pAD->szCommonName = 0;
3027 pAD->lasttime = 0;
3028 if (len) // retry as first letter if no match
3029 goto KbdRetry;
3030 }
3031 break;
3032 }
3033 }
3034 }
3035 }
3036 break;
3037
3038 case DM_PRINTOBJECT:
3039 return MRFROMLONG(DRR_TARGET);
3040
3041 case DM_DISCARDOBJECT:
3042 return MRFROMLONG(DRR_TARGET);
3043
3044 case WM_BEGINDRAG:
3045 {
3046 CHAR **list;
3047
3048 list = BuildAList(hwnd);
3049 if (!list)
3050 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
3051 else {
3052 WinSetWindowText(pAD->hwndStatus, GetPString(IDS_DRAGGINGFILESTEXT));
3053 DragList(hwnd, (HWND) 0, list, TRUE);
3054 FreeList(list);
3055 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
3056 }
3057 }
3058 break;
3059
3060 case WM_BUTTON1MOTIONSTART:
3061 if (pAD && !pAD->stopflag &&
3062 !DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN)) {
3063 pAD->mousecaptured = TRUE;
3064 pAD->lastselected = (ULONG) - 1;
3065 pAD->lastdirection = 0;
3066 WinSetCapture(HWND_DESKTOP, hwnd);
3067 DosReleaseMutexSem(pAD->hmtxScan);
3068 WinSendMsg(hwnd, WM_BUTTON1CLICK, mp1, MPFROM2SHORT(TRUE, 0));
3069 }
3070 break;
3071
3072 case WM_MOUSEMOVE:
3073 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
3074 if (pAD && pAD->mousecaptured) {
3075
3076 ULONG numlines, whichfile, y, x;
3077 LONG inc;
3078 RECTL Rectl;
3079 POINTS pts;
3080 BOOL outofwindow = FALSE;
3081
3082 WinQueryWindowRect(hwnd, &Rectl);
3083 numlines = NumLines(&Rectl, pAD);
3084 if (numlines) {
3085 pts.x = SHORT1FROMMP(mp1);
3086 pts.y = SHORT2FROMMP(mp1);
3087 if (pts.y < 0) {
3088 WinSendMsg(hwnd, WM_VSCROLL, MPFROM2SHORT(FID_VERTSCROLL, 0),
3089 MPFROM2SHORT(0, SB_LINEDOWN));
3090 pts.y = 1;
3091 outofwindow = TRUE;
3092 }
3093 else if (pts.y > Rectl.yTop - Rectl.yBottom) {
3094 WinSendMsg(hwnd, WM_VSCROLL, MPFROM2SHORT(FID_VERTSCROLL, 0),
3095 MPFROM2SHORT(0, SB_LINEUP));
3096 pts.y = (Rectl.yTop - Rectl.yBottom) - 1;
3097 outofwindow = TRUE;
3098 }
3099 whichfile = ((Rectl.yTop - Rectl.yBottom) -
3100 ((LONG) pts.y + pAD->lMaxDescender)) / pAD->lMaxHeight;
3101 if (whichfile > numlines - 1)
3102 whichfile = numlines - 1;
3103 whichfile += (pAD->topfile - 1);
3104 y = (pAD->invertsort) ? (pAD->afindexcnt - 1) - whichfile : whichfile;
3105 if (y < pAD->afindexcnt && pAD->lastselected != whichfile) {
3106 if (pAD->lastselected != (ULONG) - 1) {
3107 inc = (pAD->lastselected < whichfile) ? 1 : -1;
3108 for (x = pAD->lastselected + inc;
3109 x != whichfile && x < pAD->afindexcnt;
3110 (pAD->lastselected < whichfile) ? x++ : x--) {
3111 y = (pAD->invertsort) ? (pAD->afindexcnt - 1) - x : x;
3112 if (pAD->afindex[y]->flags & AF_SELECTED) {
3113 pAD->afindex[y]->flags &= ~AF_SELECTED;
3114 pAD->selected--;
3115 pAD->ullSelectedBytes -= pAD->afindex[y]->cbFile;
3116 }
3117 else {
3118 pAD->afindex[y]->flags |= AF_SELECTED;
3119 pAD->selected++;
3120 pAD->ullSelectedBytes += pAD->afindex[y]->cbFile;
3121 }
3122 PaintLine(hwnd, pAD->hps, x, pAD->topfile, &Rectl);
3123 }
3124 }
3125 WinSendMsg(hwnd, WM_BUTTON1CLICK, MPFROM2SHORT(pts.x, pts.y),
3126 MPFROM2SHORT(TRUE, 0));
3127 }
3128 }
3129 if (outofwindow) {
3130
3131 POINTL ptl;
3132
3133 WinQueryPointerPos(HWND_DESKTOP, &ptl);
3134 WinMapWindowPoints(HWND_DESKTOP, hwnd, &ptl, 1);
3135 if ((SHORT) ptl.y == (SHORT) SHORT2FROMMP(mp1) &&
3136 (SHORT) ptl.x == (SHORT) SHORT1FROMMP(mp1) &&
3137 ((SHORT) ptl.y < 0 || ptl.y > (Rectl.yTop - Rectl.yBottom))) {
3138 PostMsg(hwnd, UM_MOUSEMOVE, mp1, MPVOID);
3139 DosSleep(1);
3140 }
3141 }
3142 }
3143 break;
3144
3145 case UM_MOUSEMOVE:
3146 if (pAD && pAD->mousecaptured) {
3147
3148 POINTL ptl;
3149 RECTL Rectl;
3150
3151 WinQueryWindowRect(hwnd, &Rectl);
3152 WinQueryPointerPos(HWND_DESKTOP, &ptl);
3153 WinMapWindowPoints(HWND_DESKTOP, hwnd, &ptl, 1);
3154 if ((SHORT) ptl.y == (SHORT) SHORT2FROMMP(mp1) &&
3155 (SHORT) ptl.x == (SHORT) SHORT1FROMMP(mp1) &&
3156 ((SHORT) ptl.y < 0 || ptl.y > (Rectl.yTop - Rectl.yBottom))) {
3157 DosSleep(1);
3158 PostMsg(hwnd, WM_MOUSEMOVE, mp1, MPFROM2SHORT(TRUE, 0));
3159 }
3160 }
3161 return 0;
3162
3163 case WM_BUTTON1UP:
3164 case WM_BUTTON1MOTIONEND:
3165 if (pAD) {
3166 pAD->mousecaptured = FALSE;
3167 pAD->lastselected = (ULONG) - 1;
3168 pAD->lastdirection = 0;
3169 WinSetCapture(HWND_DESKTOP, NULLHANDLE);
3170 }
3171 break;
3172
3173 case WM_BUTTON1CLICK:
3174 case WM_BUTTON1DBLCLK:
3175 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
3176 if (pAD && !pAD->stopflag &&
3177 !DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN)) {
3178
3179 ULONG numlines, whichfile, y, wascursored;
3180 RECTL Rectl;
3181 POINTS pts;
3182
3183 if (pAD->afindexcnt) {
3184 WinQueryWindowRect(hwnd, &Rectl);
3185 numlines = NumLines(&Rectl, pAD);
3186 if (numlines) {
3187 pts.x = SHORT1FROMMP(mp1);
3188 pts.y = SHORT2FROMMP(mp1);
3189 whichfile = ((Rectl.yTop - Rectl.yBottom) -
3190 ((LONG) pts.y + pAD->lMaxDescender)) / pAD->lMaxHeight;
3191 if (whichfile > numlines - 1)
3192 whichfile = numlines - 1;
3193 whichfile += (pAD->topfile - 1);
3194 if (whichfile + 1 > pAD->afindexcnt)
3195 break;
3196 y = (pAD->invertsort) ? (pAD->afindexcnt - 1) - whichfile : whichfile;
3197 wascursored = pAD->cursored;
3198 pAD->cursored = whichfile + 1;
3199 if (pAD->cursored != wascursored)
3200 PaintLine(hwnd, pAD->hps, wascursored - 1, pAD->topfile, &Rectl);
3201 if (y < pAD->afindexcnt) {
3202 if (msg == WM_BUTTON1CLICK || fUnHilite) {
3203 if (pAD->afindex[y]->flags & AF_SELECTED) {
3204 pAD->afindex[y]->flags &= ~AF_SELECTED;
3205 pAD->selected--;
3206 pAD->ullSelectedBytes -= pAD->afindex[y]->cbFile;
3207 }
3208 else {
3209 pAD->afindex[y]->flags |= AF_SELECTED;
3210 pAD->selected++;
3211 pAD->ullSelectedBytes += pAD->afindex[y]->cbFile;
3212 }
3213 PaintLine(hwnd, pAD->hps, whichfile, pAD->topfile, &Rectl);
3214 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
3215 }
3216 }
3217 if (msg == WM_BUTTON1CLICK) {
3218 if (pAD->lastselected != (ULONG) - 1) {
3219 if (whichfile > pAD->lastselected)
3220 pAD->lastdirection = 1;
3221 else
3222 pAD->lastdirection = 2;
3223 }
3224 else
3225 pAD->lastdirection = 0;
3226 pAD->lastselected = whichfile;
3227 }
3228 else
3229 DefaultViewKeys(hwnd, pAD->hwndFrame, HWND_DESKTOP, NULL,
3230 pAD->afindex[y]->fullname);
3231 }
3232 }
3233 DosReleaseMutexSem(pAD->hmtxScan);
3234 }
3235 break;
3236
3237 case WM_MENUEND:
3238 if (pAD && (HWND) mp2 == pAD->hwndPopup) {
3239 WinDestroyWindow(pAD->hwndPopup);
3240 pAD->hwndPopup = (HWND) 0;
3241 }
3242 break;
3243
3244 case WM_CONTEXTMENU:
3245 if (pAD) {
3246 if (!pAD->hwndPopup) {
3247 pAD->hwndPopup =
3248 WinLoadMenu(HWND_DESKTOP, FM3ModHandle, SEEALL_POPUP);
3249 if (pAD->hwndPopup) {
3250 WinSetPresParam(pAD->hwndPopup, PP_FONTNAMESIZE,
3251 (ULONG) strlen(GetPString(IDS_8HELVTEXT)) + 1,
3252 (PVOID) GetPString(IDS_8HELVTEXT));
3253 SetConditionalCascade(pAD->hwndPopup,
3254 IDM_DELETESUBMENU,
3255 (fDefaultDeletePerm) ?
3256 IDM_PERMDELETE : IDM_DELETE);
3257 SetConditionalCascade(pAD->hwndPopup, IDM_MOVEMENU, IDM_MOVE);
3258 SetConditionalCascade(pAD->hwndPopup, IDM_COPYMENU, IDM_COPY);
3259 SetConditionalCascade(pAD->hwndPopup, IDM_OPENSUBMENU,
3260 IDM_OPENDEFAULT);
3261 SetConditionalCascade(pAD->hwndMenu, IDM_OBJECTSUBMENU, IDM_SHADOW);
3262 if (fWorkPlace) {
3263 WinSendMsg(pAD->hwndPopup, MM_DELETEITEM,
3264 MPFROM2SHORT(IDM_OPENSUBMENU, TRUE), MPVOID);
3265 WinSendMsg(pAD->hwndPopup, MM_DELETEITEM,
3266 MPFROM2SHORT(IDM_OBJECTSUBMENU, TRUE), MPVOID);
3267 }
3268 }
3269 }
3270 if (pAD->hwndPopup) {
3271
3272 APIRET rc;
3273
3274 rc = DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN);
3275 WinEnableMenuItem(pAD->hwndPopup, IDM_EAS, (rc == 0 &&
3276 pAD->selected != 0));
3277 WinEnableMenuItem(pAD->hwndPopup, IDM_UUDECODE, (rc == 0 &&
3278 pAD->selected != 0));
3279 WinEnableMenuItem(pAD->hwndPopup, IDM_EXTRACT, (rc == 0 &&
3280 pAD->selected != 0));
3281 WinEnableMenuItem(pAD->hwndPopup, IDM_ARCHIVE, (rc == 0 &&
3282 pAD->selected != 0));
3283 WinEnableMenuItem(pAD->hwndPopup, IDM_MOVEMENU, (rc == 0 &&
3284 pAD->selected != 0));
3285 WinEnableMenuItem(pAD->hwndPopup, IDM_COPYMENU, (rc == 0 &&
3286 pAD->selected != 0));
3287 WinEnableMenuItem(pAD->hwndPopup, IDM_RENAME, (rc == 0 &&
3288 pAD->selected != 0));
3289 WinEnableMenuItem(pAD->hwndPopup, IDM_PRINT, (rc == 0 &&
3290 pAD->selected != 0));
3291 WinEnableMenuItem(pAD->hwndPopup, IDM_SUBJECT, (rc == 0 &&
3292 pAD->selected != 0));
3293 WinEnableMenuItem(pAD->hwndPopup, IDM_OPENSUBMENU, (rc == 0 &&
3294 pAD->selected !=
3295 0));
3296 WinEnableMenuItem(pAD->hwndPopup, IDM_OBJECTSUBMENU,
3297 (rc == 0 && pAD->selected != 0));
3298 WinEnableMenuItem(pAD->hwndPopup, IDM_DELETESUBMENU,
3299 (rc == 0 && pAD->selected != 0));
3300 WinEnableMenuItem(pAD->hwndPopup, IDM_INFO,
3301 (rc == 0 && pAD->selected != 0));
3302 WinEnableMenuItem(pAD->hwndPopup, IDM_ATTRS,
3303 (rc == 0 && pAD->selected != 0));
3304 WinEnableMenuItem(pAD->hwndPopup, IDM_COLLECT,
3305 (rc == 0 && pAD->selected != 0));
3306 WinEnableMenuItem(pAD->hwndPopup, IDM_SAVETOCLIP,
3307 (rc == 0 && pAD->selected != 0));
3308 WinEnableMenuItem(pAD->hwndPopup, IDM_APPENDTOCLIP,
3309 (rc == 0 && pAD->selected != 0));
3310 WinEnableMenuItem(pAD->hwndPopup, IDM_SAVETOLIST,
3311 (rc == 0 && pAD->selected != 0));
3312 WinEnableMenuItem(pAD->hwndPopup, IDM_REMOVE,
3313 (rc == 0 && pAD->selected != 0));
3314 WinEnableMenuItem(pAD->hwndPopup, IDM_HIDEALL,
3315 (rc == 0 && pAD->selected != 0));
3316 WinEnableMenuItem(pAD->hwndPopup, IDM_SELECTALL,
3317 (rc == 0 && pAD->afindexcnt != 0));
3318 WinEnableMenuItem(pAD->hwndPopup, IDM_SELECTMASK,
3319 (rc == 0 && pAD->afindexcnt != 0));
3320 WinEnableMenuItem(pAD->hwndPopup, IDM_DESELECTALL,
3321 (rc == 0 && pAD->afindexcnt != 0));
3322 WinEnableMenuItem(pAD->hwndPopup, IDM_DESELECTMASK,
3323 (rc == 0 && pAD->afindexcnt != 0));
3324 WinEnableMenuItem(pAD->hwndPopup, IDM_INVERT,
3325 (rc == 0 && pAD->afindexcnt != 0));
3326 WinEnableMenuItem(pAD->hwndPopup, IDM_FILTER,
3327 (rc == 0 && pAD->afheadcnt != 0));
3328 if (!rc)
3329 DosReleaseMutexSem(pAD->hmtxScan);
3330 if (WinPopupMenu(hwnd, hwnd, pAD->hwndPopup, SHORT1FROMMP(mp1),
3331 SHORT2FROMMP(mp1), 0,
3332 PU_HCONSTRAIN | PU_VCONSTRAIN |
3333 PU_KEYBOARD | PU_MOUSEBUTTON1))
3334 CenterOverWindow(pAD->hwndPopup);
3335 }
3336 }
3337 break;
3338
3339 case UM_CONTAINER_FILLED:
3340 if (pAD) {
3341 pAD->stopflag = 0;
3342 pAD->topfile = 1;
3343 pAD->cursored = 1;
3344 pAD->multiplier = 1;
3345 if (!pAD->afindexcnt) {
3346 DosBeep(250, 50);
3347 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
3348 }
3349 else {
3350 DosBeep(1000, 25);
3351 WinInvalidateRect(hwnd, NULL, FALSE);
3352 PostMsg(hwnd, UM_SETUP3, MPVOID, MPVOID);
3353 }
3354 WinSetWindowPos(WinQueryWindow(hwnd, QW_PARENT), HWND_TOP, 0, 0, 0, 0,
3355 SWP_SHOW | SWP_RESTORE | SWP_ACTIVATE | SWP_ZORDER);
3356 }
3357 return 0;
3358
3359 case WM_ERASEBACKGROUND:
3360 WinFillRect((HPS) mp1, (PRECTL) mp2,
3361 standardcolors[Colors[COLORS_NORMALBACK]]);
3362 return 0;
3363
3364 case WM_PAINT:
3365 // fprintf(stderr,"Seeall: WM_PAINT\n");
3366 if (pAD) {
3367
3368 HPS hpsp;
3369 RECTL Rectl;
3370 POINTL ptl;
3371 register ULONG x;
3372 ULONG y, len, numlines;
3373 CHAR szBuff[CCHMAXPATH + 80], szCmmaFmtFileSize[81];
3374 BOOL inverted, hidsys, reado, wascursored;
3375
3376 hpsp = WinBeginPaint(hwnd, pAD->hps, &Rectl);
3377 WinFillRect(hpsp, &Rectl, standardcolors[Colors[COLORS_NORMALBACK]]);
3378 if (!pAD->stopflag &&
3379 !DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN)) {
3380 WinQueryWindowRect(hwnd, &Rectl);
3381 numlines = NumLines(&Rectl, pAD);
3382 if (pAD->afindexcnt && numlines) {
3383 if (pAD->topfile > (pAD->afindexcnt + 1) - numlines)
3384 pAD->topfile = (pAD->afindexcnt + 1) - numlines;
3385 if (pAD->topfile > pAD->afindexcnt)
3386 pAD->topfile = 1;
3387 if (!pAD->topfile)
3388 pAD->topfile = 1;
3389 if (pAD->cursored < pAD->topfile)
3390 pAD->cursored = pAD->topfile;
3391 else if (pAD->cursored > (pAD->topfile + numlines) - 1)
3392 pAD->cursored = (pAD->topfile + numlines) - 1;
3393 if (pAD->cursored > pAD->afindexcnt)
3394 pAD->cursored = pAD->afindexcnt;
3395 }
3396 else
3397 pAD->topfile = pAD->cursored = 1;
3398 if (numlines && pAD->afindexcnt) {
3399 GpiSetBackMix(hpsp, BM_OVERPAINT);
3400 wascursored = TRUE;
3401 for (x = pAD->topfile - 1; x < pAD->afindexcnt; x++) {
3402 ptl.x = pAD->horzscroll;
3403 if (wascursored) { /* reestablish normal colors */
3404 GpiSetColor(pAD->hps,
3405 standardcolors[Colors[COLORS_NORMALFORE]]);
3406 GpiSetBackColor(pAD->hps,
3407 standardcolors[Colors[COLORS_NORMALBACK]]);
3408 wascursored = inverted = hidsys = reado = FALSE;
3409 }
3410 if (x == pAD->cursored - 1)
3411 wascursored = TRUE;
3412 y = (pAD->invertsort) ? (pAD->afindexcnt - 1) - x : x;
3413 ptl.y = (Rectl.yTop -
3414 (pAD->lMaxHeight * (((x + 1) - pAD->topfile) + 1)));
3415 if (ptl.y - pAD->lMaxDescender <= 0)
3416 break;
3417 if (pAD->afindex[y]->flags & AF_SELECTED) {
3418 if (!inverted) {
3419 GpiSetColor(pAD->hps,
3420 standardcolors[Colors
3421 [COLORS_SELECTEDNORMALFORE]]);
3422 GpiSetBackColor(pAD->hps,
3423 (wascursored) ?
3424 standardcolors[Colors
3425 [COLORS_CURSOREDSELECTEDBACK]]
3426 :
3427 standardcolors[Colors[COLORS_SELECTEDBACK]]);
3428 inverted = TRUE;
3429 }
3430 }
3431 else if (inverted ||
3432 ((pAD->afindex[y]->attrFile &
3433 (FILE_SYSTEM | FILE_HIDDEN)) != 0) != hidsys ||
3434 ((pAD->afindex[y]->attrFile & FILE_READONLY) != 0) !=
3435 reado) {
3436 if (pAD->afindex[y]->attrFile & (FILE_SYSTEM | FILE_HIDDEN)) {
3437 GpiSetColor(pAD->hps,
3438 standardcolors[Colors[COLORS_SYSTEMFORE]]);
3439 hidsys = TRUE;
3440 }
3441 else if ((pAD->afindex[y]->attrFile & FILE_READONLY) != 0) {
3442 GpiSetColor(pAD->hps,
3443 standardcolors[Colors[COLORS_READONLYFORE]]);
3444 reado = TRUE;
3445 }
3446 else
3447 GpiSetColor(pAD->hps,
3448 standardcolors[Colors[COLORS_NORMALFORE]]);
3449 GpiSetBackColor(pAD->hps,
3450 (wascursored) ?
3451 standardcolors[Colors
3452 [COLORS_CURSOREDNORMALBACK]] :
3453 standardcolors[Colors[COLORS_NORMALBACK]]);
3454 inverted = FALSE;
3455 }
3456 else if (wascursored)
3457 GpiSetBackColor(pAD->hps,
3458 standardcolors[Colors
3459 [COLORS_CURSOREDNORMALBACK]]);
3460 CommaFmtULL(szCmmaFmtFileSize,
3461 sizeof(szCmmaFmtFileSize), pAD->afindex[y]->cbFile, ' ');
3462 len =
3463 sprintf(szBuff,
3464 "%c%-*.*s %-12s %c%c%c%c%c %04u/%02u/%02u %02u:%02u:%02u ",
3465 wascursored ? '>' : ' ',
3466 pAD->fullnames ? pAD->longestw : pAD->longest,
3467 pAD->fullnames ? pAD->longestw : pAD->longest,
3468 (pAD->fullnames) ? pAD->afindex[y]->fullname : pAD->
3469 afindex[y]->filename, szCmmaFmtFileSize,
3470 "-A"[((pAD->afindex[y]->attrFile & FILE_ARCHIVED) !=
3471 0)],
3472 "-R"[((pAD->afindex[y]->attrFile & FILE_READONLY) !=
3473 0)],
3474 "-H"[((pAD->afindex[y]->attrFile & FILE_HIDDEN) != 0)],
3475 "-S"[((pAD->afindex[y]->attrFile & FILE_SYSTEM) != 0)],
3476 "-D"[((pAD->afindex[y]->attrFile & FILE_DIRECTORY) !=
3477 0)], pAD->afindex[y]->date.year + 1980,
3478 pAD->afindex[y]->date.month, pAD->afindex[y]->date.day,
3479 pAD->afindex[y]->time.hours,
3480 pAD->afindex[y]->time.minutes,
3481 pAD->afindex[y]->time.twosecs * 2);
3482 GpiCharStringAt(hpsp, &ptl, len, szBuff);
3483 GpiQueryCurrentPosition(hpsp, &ptl);
3484 if (ptl.x + abs(pAD->horzscroll) > pAD->maxx) {
3485 pAD->maxx = ptl.x + abs(pAD->horzscroll);
3486 WinSendMsg(pAD->hhscroll, SBM_SETTHUMBSIZE,
3487 MPFROM2SHORT((SHORT) Rectl.xRight,
3488 (SHORT) pAD->maxx), MPVOID);
3489 }
3490 }
3491 }
3492 DosReleaseMutexSem(pAD->hmtxScan);
3493 }
3494 WinEndPaint(hpsp);
3495 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
3496 if (!pAD->stopflag)
3497 WinSendMsg(pAD->hvscroll, SBM_SETSCROLLBAR,
3498 MPFROMSHORT((SHORT) (pAD->topfile / pAD->multiplier)),
3499 MPFROM2SHORT(1,
3500 (SHORT) (pAD->afindexcnt / pAD->multiplier) -
3501 (numlines - 1)));
3502 WinSendMsg(pAD->hhscroll, SBM_SETSCROLLBAR,
3503 MPFROMSHORT((SHORT) abs(pAD->horzscroll)),
3504 MPFROM2SHORT(0, (SHORT) (pAD->maxx - Rectl.xRight)));
3505 WinSendMsg(pAD->hhscroll, SBM_SETTHUMBSIZE,
3506 MPFROM2SHORT((SHORT) Rectl.xRight, (SHORT) pAD->maxx),
3507 MPVOID);
3508 }
3509 break;
3510
3511 case WM_HSCROLL:
3512 {
3513 RECTL rectl;
3514 BOOL invalidate = TRUE;
3515
3516 WinQueryWindowRect(hwnd, &rectl);
3517 switch (SHORT2FROMMP(mp2)) {
3518 case SB_PAGERIGHT:
3519 if (abs(pAD->horzscroll) < pAD->maxx - rectl.xRight) {
3520 pAD->horzscroll -= rectl.xRight;
3521 if (abs(pAD->horzscroll) > pAD->maxx - rectl.xRight)
3522 pAD->horzscroll = -(pAD->maxx - rectl.xRight);
3523 }
3524 break;
3525
3526 case SB_PAGELEFT:
3527 if (pAD->horzscroll < 0) {
3528 pAD->horzscroll += rectl.xRight;
3529 if (pAD->horzscroll > 0)
3530 pAD->horzscroll = 0;
3531 }
3532 break;
3533
3534 case SB_LINERIGHT:
3535 if (abs(pAD->horzscroll) < pAD->maxx - rectl.xRight)
3536 pAD->horzscroll -= pAD->fattrs.lAveCharWidth;
3537 break;
3538
3539 case SB_LINELEFT:
3540 if (pAD->horzscroll < 0)
3541 pAD->horzscroll += pAD->fattrs.lAveCharWidth;
3542 break;
3543
3544 case SB_SLIDERTRACK:
3545 pAD->horzscroll = SHORT1FROMMP(mp2);
3546 pAD->horzscroll = -(pAD->horzscroll);
3547 if (pAD->horzscroll > 0)
3548 pAD->horzscroll = 0;
3549 if (abs(pAD->horzscroll) > pAD->maxx - rectl.xRight)
3550 pAD->horzscroll = -(pAD->maxx - rectl.xRight);
3551 break;
3552
3553 default:
3554 invalidate = FALSE;
3555 break;
3556 }
3557 if (invalidate)
3558 WinInvalidateRect(hwnd, NULL, FALSE);
3559 }
3560 break;
3561
3562 case WM_VSCROLL:
3563// fprintf(stderr,"Seeall: WM_VSCROLL\n");
3564 if (pAD && !pAD->stopflag &&
3565 !DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN)) {
3566
3567 ULONG numlines, wascursored;
3568 RECTL rcl;
3569
3570 if (pAD->afindexcnt) {
3571 WinQueryWindowRect(hwnd, &rcl);
3572 numlines = NumLines(&rcl, pAD);
3573 if (numlines) {
3574 wascursored = pAD->cursored;
3575 switch (SHORT2FROMMP(mp2)) {
3576 case SB_PAGEUP:
3577 if (pAD->topfile > 1) {
3578 pAD->topfile -= numlines;
3579 if (pAD->topfile > pAD->afindexcnt ||
3580 pAD->topfile > (pAD->afindexcnt + 1) - numlines)
3581 pAD->topfile = 1;
3582 if (pAD->cursored > pAD->topfile + numlines)
3583 pAD->cursored = pAD->topfile + numlines;
3584 if (pAD->cursored > pAD->afindexcnt)
3585 pAD->cursored = pAD->afindexcnt;
3586 WinInvalidateRect(hwnd, NULL, FALSE);
3587 }
3588 break;
3589 case SB_PAGEDOWN:
3590 if (pAD->topfile <= pAD->afindexcnt - numlines) {
3591 pAD->topfile += numlines;
3592 if (pAD->topfile > (pAD->afindexcnt + 1) - numlines)
3593 pAD->topfile = (pAD->afindexcnt + 1) - numlines;
3594 if (pAD->cursored < pAD->topfile)
3595 pAD->cursored = pAD->topfile;
3596 if (pAD->cursored > (pAD->topfile + numlines) - 1)
3597 pAD->cursored = (pAD->topfile + numlines) - 1;
3598 if (pAD->cursored > pAD->afindexcnt)
3599 pAD->cursored = pAD->afindexcnt;
3600 WinInvalidateRect(hwnd, NULL, FALSE);
3601 }
3602 break;
3603 case SB_LINEDOWN:
3604 if (pAD->topfile <= pAD->afindexcnt - numlines) {
3605
3606 RECTL Rectl, iRectl;
3607
3608 pAD->topfile++;
3609 if (pAD->cursored < pAD->topfile)
3610 pAD->cursored = pAD->topfile;
3611 else if (pAD->cursored > (pAD->topfile + numlines) - 1)
3612 pAD->cursored = (pAD->topfile + numlines) - 1;
3613 if (pAD->cursored > pAD->afindexcnt)
3614 pAD->cursored = pAD->afindexcnt;
3615 WinQueryWindowRect(hwnd, &Rectl);
3616 WinScrollWindow(hwnd, 0, pAD->lMaxHeight,
3617 NULL, NULL, NULLHANDLE, &iRectl, 0);
3618 WinFillRect(pAD->hps, &iRectl,
3619 standardcolors[Colors[COLORS_NORMALBACK]]);
3620 PaintLine(hwnd, pAD->hps, (pAD->topfile + numlines) - 2,
3621 pAD->topfile, &Rectl);
3622 if (pAD->cursored != pAD->topfile + numlines)
3623 PaintLine(hwnd, pAD->hps, pAD->cursored - 1, pAD->topfile,
3624 &Rectl);
3625 if (wascursored != pAD->cursored
3626 && wascursored < pAD->topfile + numlines
3627 && wascursored >= pAD->topfile)
3628 PaintLine(hwnd, pAD->hps, wascursored - 1, pAD->topfile,
3629 &Rectl);
3630 if (wascursored != pAD->cursored)
3631 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
3632 WinSendMsg(pAD->hhscroll, SBM_SETSCROLLBAR,
3633 MPFROMSHORT((SHORT) abs(pAD->horzscroll)),
3634 MPFROM2SHORT(0, (SHORT) (pAD->maxx - Rectl.xRight)));
3635 WinSendMsg(pAD->hvscroll, SBM_SETSCROLLBAR,
3636 MPFROMSHORT((SHORT) (pAD->topfile /
3637 pAD->multiplier)),
3638 MPFROM2SHORT(1, (SHORT) (pAD->afindexcnt /
3639 pAD->multiplier) -
3640 (numlines - 1)));
3641 }
3642 break;
3643 case SB_LINEUP:
3644 if (pAD->topfile > 1) {
3645
3646 RECTL Rectl, iRectl;
3647
3648 pAD->topfile--;
3649 if (pAD->cursored < pAD->topfile)
3650 pAD->cursored = pAD->topfile;
3651 else if (pAD->cursored > (pAD->topfile + numlines) - 1)
3652 pAD->cursored = (pAD->topfile + numlines) - 1;
3653 if (pAD->cursored > pAD->afindexcnt)
3654 pAD->cursored = pAD->afindexcnt;
3655 WinQueryWindowRect(hwnd, &Rectl);
3656 WinScrollWindow(hwnd, 0, -pAD->lMaxHeight,
3657 NULL, NULL, NULLHANDLE, &iRectl, 0);
3658 WinFillRect(pAD->hps, &iRectl,
3659 standardcolors[Colors[COLORS_NORMALBACK]]);
3660 iRectl = Rectl;
3661 iRectl.yTop -= ((numlines * pAD->lMaxHeight) +
3662 pAD->lMaxDescender);
3663 WinFillRect(pAD->hps, &iRectl,
3664 standardcolors[pAD->aulColors[COLORS_NORMALBACK]]);
3665 PaintLine(hwnd, pAD->hps, pAD->topfile - 1, pAD->topfile,
3666 &Rectl);
3667 if (pAD->cursored != pAD->topfile)
3668 PaintLine(hwnd, pAD->hps, pAD->cursored - 1, pAD->topfile,
3669 &Rectl);
3670 if (pAD->cursored != wascursored && wascursored >= pAD->topfile
3671 && wascursored < pAD->topfile + numlines)
3672 PaintLine(hwnd, pAD->hps, wascursored - 1, pAD->topfile,
3673 &Rectl);
3674 if (pAD->cursored != wascursored)
3675 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
3676 WinSendMsg(pAD->hhscroll, SBM_SETSCROLLBAR,
3677 MPFROMSHORT((SHORT) abs(pAD->horzscroll)),
3678 MPFROM2SHORT(0, (SHORT) (pAD->maxx - Rectl.xRight)));
3679 WinSendMsg(pAD->hvscroll, SBM_SETSCROLLBAR,
3680 MPFROMSHORT((SHORT) (pAD->topfile /
3681 pAD->multiplier)),
3682 MPFROM2SHORT(1, (SHORT) (pAD->afindexcnt /
3683 pAD->multiplier) -
3684 (numlines - 1)));
3685 }
3686 break;
3687 case SB_SLIDERTRACK:
3688 if ((SHORT1FROMMP(mp2) >= 1) ||
3689 (SHORT1FROMMP(mp2)) <= pAD->afindexcnt) {
3690 pAD->topfile = (ULONG) SHORT1FROMMP(mp2) * pAD->multiplier;
3691 if (pAD->topfile > (pAD->afindexcnt + 1) - numlines)
3692 pAD->topfile = (pAD->afindexcnt + 1) - numlines;
3693 if (!pAD->topfile)
3694 pAD->topfile = 1;
3695 if (pAD->cursored < pAD->topfile)
3696 pAD->cursored = pAD->topfile;
3697 else if (pAD->cursored > pAD->topfile + numlines)
3698 pAD->cursored = pAD->topfile + numlines;
3699 if (pAD->cursored > pAD->afindexcnt)
3700 pAD->cursored = pAD->afindexcnt;
3701 WinInvalidateRect(hwnd, NULL, FALSE);
3702 }
3703 else
3704 WinAlarm(HWND_DESKTOP, WA_NOTE);
3705 break;
3706 }
3707 }
3708 }
3709 DosReleaseMutexSem(pAD->hmtxScan);
3710 }
3711 break;
3712
3713 case WM_INITMENU:
3714 if (pAD) {
3715 switch (SHORT1FROMMP(mp1)) {
3716 case IDM_FILESMENU:
3717 {
3718 APIRET rc;
3719
3720 rc = DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN);
3721 WinEnableMenuItem((HWND) mp2, IDM_DUPES, (rc == 0));
3722 WinEnableMenuItem((HWND) mp2, IDM_COLLECT, (rc == 0 &&
3723 pAD->selected != 0));
3724 WinEnableMenuItem((HWND) mp2, IDM_SAVETOCLIP, (rc == 0 &&
3725 pAD->selected != 0));
3726 WinEnableMenuItem((HWND) mp2, IDM_APPENDTOCLIP, (rc == 0 &&
3727 pAD->selected !=
3728 0));
3729 WinEnableMenuItem((HWND) mp2, IDM_SAVETOLIST,
3730 (rc == 0 && pAD->selected != 0));
3731 WinEnableMenuItem((HWND) mp2, IDM_REMOVE,
3732 (rc == 0 && pAD->selected != 0));
3733 WinEnableMenuItem((HWND) mp2, IDM_HIDEALL,
3734 (rc == 0 && pAD->selected != 0));
3735 WinEnableMenuItem((HWND) mp2, IDM_DELETESUBMENU,
3736 (rc == 0 && pAD->selected != 0));
3737 WinEnableMenuItem((HWND) mp2, IDM_INFO,
3738 (rc == 0 && pAD->selected != 0));
3739 WinEnableMenuItem((HWND) mp2, IDM_ATTRS,
3740 (rc == 0 && pAD->selected != 0));
3741 WinEnableMenuItem((HWND) mp2, IDM_EAS,
3742 (rc == 0 && pAD->selected != 0));
3743 WinEnableMenuItem((HWND) mp2, IDM_UUDECODE,
3744 (rc == 0 && pAD->selected != 0));
3745 WinEnableMenuItem((HWND) mp2, IDM_EXTRACT,
3746 (rc == 0 && pAD->selected != 0));
3747 WinEnableMenuItem((HWND) mp2, IDM_ARCHIVE,
3748 (rc == 0 && pAD->selected != 0));
3749 WinEnableMenuItem((HWND) mp2, IDM_MOVEMENU,
3750 (rc == 0 && pAD->selected != 0));
3751 WinEnableMenuItem((HWND) mp2, IDM_COPYMENU,
3752 (rc == 0 && pAD->selected != 0));
3753 WinEnableMenuItem((HWND) mp2, IDM_RENAME,
3754 (rc == 0 && pAD->selected != 0));
3755 WinEnableMenuItem((HWND) mp2, IDM_PRINT,
3756 (rc == 0 && pAD->selected != 0));
3757 WinEnableMenuItem((HWND) mp2, IDM_SUBJECT,
3758 (rc == 0 && pAD->selected != 0));
3759 WinEnableMenuItem((HWND) mp2, IDM_OPENSUBMENU,
3760 (rc == 0 && pAD->selected != 0));
3761 WinEnableMenuItem((HWND) mp2, IDM_OBJECTSUBMENU,
3762 (rc == 0 && pAD->selected != 0));
3763 if (!rc)
3764 DosReleaseMutexSem(pAD->hmtxScan);
3765 }
3766 break;
3767
3768 case IDM_SELECTSUBMENU:
3769 {
3770 APIRET rc;
3771
3772 rc = DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN);
3773 WinEnableMenuItem((HWND) mp2, IDM_SELECTALL, (rc == 0 &&
3774 pAD->afindexcnt != 0 &&
3775 (pAD->afindexcnt !=
3776 pAD->selected ||
3777 !pAD->selected)));
3778 WinEnableMenuItem((HWND) mp2, IDM_SELECTMASK, (rc == 0 &&
3779 pAD->afindexcnt != 0 &&
3780 (pAD->afindexcnt !=
3781 pAD->selected ||
3782 !pAD->selected)));
3783 WinEnableMenuItem((HWND) mp2, IDM_DESELECTALL, (rc == 0 &&
3784 pAD->afindexcnt != 0
3785 && pAD->selected));
3786 WinEnableMenuItem((HWND) mp2, IDM_DESELECTMASK,
3787 (rc == 0 && pAD->afindexcnt != 0) && pAD->selected);
3788 WinEnableMenuItem((HWND) mp2, IDM_INVERT,
3789 (rc == 0 && pAD->afindexcnt != 0));
3790 if (!rc)
3791 DosReleaseMutexSem(pAD->hmtxScan);
3792 }
3793 break;
3794
3795 case IDM_SORTSUBMENU:
3796 {
3797 APIRET rc;
3798
3799 rc = DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN);
3800 WinEnableMenuItem((HWND) mp2, IDM_SORTNAME, (rc == 0));
3801 WinEnableMenuItem((HWND) mp2, IDM_SORTEASIZE, (rc == 0));
3802 WinEnableMenuItem((HWND) mp2, IDM_SORTSIZE, (rc == 0));
3803 WinEnableMenuItem((HWND) mp2, IDM_SORTLWDATE, (rc == 0));
3804 WinEnableMenuItem((HWND) mp2, IDM_SORTFILENAME, (rc == 0));
3805 WinEnableMenuItem((HWND) mp2, IDM_SORTFIRST, (rc == 0));
3806 if (!rc)
3807 DosReleaseMutexSem(pAD->hmtxScan);
3808 }
3809 WinCheckMenuItem((HWND) mp2, IDM_SORTNAME,
3810 (pAD->pfnCompare == comparefullnames));
3811 WinCheckMenuItem((HWND) mp2, IDM_SORTEASIZE,
3812 (pAD->pfnCompare == (PFNSORT) NULL));
3813 WinCheckMenuItem((HWND) mp2, IDM_SORTSIZE,
3814 (pAD->pfnCompare == comparesizes));
3815 WinCheckMenuItem((HWND) mp2, IDM_SORTLWDATE,
3816 (pAD->pfnCompare == comparedates));
3817 WinCheckMenuItem((HWND) mp2, IDM_SORTFILENAME,
3818 (pAD->pfnCompare == comparenames));
3819 WinCheckMenuItem((HWND) mp2, IDM_SORTREVERSE, pAD->invertsort);
3820 WinCheckMenuItem((HWND) mp2, IDM_SORTFIRST,
3821 (pAD->pfnCompare == compareexts));
3822 break;
3823
3824 case IDM_VIEWSMENU:
3825 {
3826 APIRET rc;
3827
3828 rc = DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN);
3829 WinEnableMenuItem((HWND) mp2, IDM_RESCAN, (rc == 0));
3830 WinEnableMenuItem((HWND) mp2, IDM_FILTER, (rc == 0 &&
3831 pAD->afheadcnt != 0));
3832 if (!rc)
3833 DosReleaseMutexSem(pAD->hmtxScan);
3834 }
3835 WinCheckMenuItem((HWND) mp2, IDM_SHOWLNAMES, pAD->fullnames);
3836 break;
3837 }
3838 }
3839 break;
3840
3841 case WM_COMMAND:
3842 if (!pAD) {
3843 Runtime_Error(pszSrcFile, __LINE__, "no data");
3844 return 0;
3845 }
3846 switch (SHORT1FROMMP(mp1)) {
3847 case IDM_SETTARGET:
3848 SetTargetDir(hwnd, FALSE);
3849 break;
3850
3851 case IDM_DUPES:
3852 if (!pAD->stopflag &&
3853 !DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN)) {
3854 pAD->dupeflags = (USHORT) WinDlgBox(HWND_DESKTOP,
3855 hwnd,
3856 DupeDlgProc,
3857 FM3ModHandle,
3858 DUPE_FRAME,
3859 MPFROM2SHORT(pAD->dupeflags, 0));
3860 if (pAD->dupeflags) {
3861 if (_beginthread(FindDupesThread, NULL, 65536, (PVOID) hwnd) == -1)
3862 Runtime_Error(pszSrcFile, __LINE__,
3863 GetPString(IDS_COULDNTSTARTTHREADTEXT));
3864 }
3865 DosReleaseMutexSem(pAD->hmtxScan);
3866 }
3867 break;
3868
3869 case IDM_COLORPALETTE:
3870 {
3871 COLORS co;
3872 LONG temp[COLORS_MAX];
3873
3874 memset(&co, 0, sizeof(co));
3875 co.size = sizeof(co);
3876 co.numcolors = COLORS_MAX;
3877 co.colors = pAD->aulColors;
3878 co.descriptions = IDS_SACOLORS1TEXT;
3879 co.origs = temp;
3880 co.prompt = IDS_SACOLORSPROMPTTEXT;
3881 memcpy(temp, pAD->aulColors, sizeof(LONG) * COLORS_MAX);
3882 if (WinDlgBox(HWND_DESKTOP,
3883 hwnd,
3884 ColorDlgProc,
3885 FM3ModHandle, COLOR_FRAME, (PVOID) & co)) {
3886 memcpy(Colors, pAD->aulColors, sizeof(LONG) * COLORS_MAX);
3887 PrfWriteProfileData(fmprof,
3888 appname,
3889 "Seeall.Colors",
3890 &pAD->aulColors, sizeof(LONG) * COLORS_MAX);
3891 WinInvalidateRect(hwnd, NULL, FALSE);
3892 }
3893 }
3894 break;
3895
3896 case IDM_CODEPAGE:
3897 {
3898 INT cp;
3899
3900 cp = PickCodepage(hwnd);
3901 if (cp != -1) {
3902 pAD->fattrs.usCodePage = (USHORT) cp;
3903 Codepage = pAD->fattrs.usCodePage;
3904 PrfWriteProfileData(fmprof,
3905 appname,
3906 "Seeall.Codepage",
3907 &pAD->fattrs.usCodePage, sizeof(USHORT));
3908 GpiDeleteSetId(pAD->hps, FIXED_FONT_LCID);
3909 GpiAssociate(pAD->hps, 0);
3910 GpiDestroyPS(pAD->hps);
3911 pAD->hps = InitWindow(hwnd);
3912 pAD->maxx = pAD->horzscroll = 0;
3913 WinInvalidateRect(hwnd, NULL, FALSE);
3914 }
3915 }
3916 break;
3917
3918 case IDM_FONTPALETTE:
3919 SetMLEFont(hwnd, &pAD->fattrs, 11);
3920 PrfWriteProfileData(fmprof,
3921 appname,
3922 "Seeall.Fattrs", &pAD->fattrs, sizeof(pAD->fattrs));
3923 Fattrs = pAD->fattrs;
3924 GpiDeleteSetId(pAD->hps, FIXED_FONT_LCID);
3925 GpiAssociate(pAD->hps, 0);
3926 GpiDestroyPS(pAD->hps);
3927 pAD->hps = InitWindow(hwnd);
3928 pAD->maxx = pAD->horzscroll = 0;
3929 WinInvalidateRect(hwnd, NULL, FALSE);
3930 break;
3931
3932 case IDM_SHOWLNAMES:
3933 pAD->fullnames = (pAD->fullnames) ? FALSE : TRUE;
3934 PrfWriteProfileData(fmprof,
3935 appname,
3936 "Seeall.Fullnames", &pAD->fullnames, sizeof(BOOL));
3937 Fullnames = pAD->fullnames;
3938 pAD->maxx = pAD->horzscroll = 0;
3939 WinInvalidateRect(hwnd, NULL, FALSE);
3940 break;
3941
3942 case IDM_SORTREVERSE:
3943 pAD->invertsort = (pAD->invertsort) ? FALSE : TRUE;
3944 SortReverse = pAD->invertsort;
3945 PrfWriteProfileData(fmprof,
3946 appname,
3947 "Seeall.SortReverse",
3948 (PVOID) & pAD->invertsort, sizeof(BOOL));
3949 WinInvalidateRect(hwnd, NULL, FALSE);
3950 break;
3951
3952 case IDM_SORTEASIZE:
3953 case IDM_SORTNAME:
3954 case IDM_SORTFILENAME:
3955 case IDM_SORTSIZE:
3956 case IDM_SORTLWDATE:
3957 case IDM_SORTFIRST:
3958 if (!pAD->stopflag &&
3959 !DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN)) {
3960 {
3961 USHORT dummy = SHORT1FROMMP(mp1);
3962
3963 PrfWriteProfileData(fmprof,
3964 appname,
3965 "Seeall.Sort", (PVOID) & dummy, sizeof(USHORT));
3966 SortType = SHORT1FROMMP(mp1);
3967 }
3968 WinSetPointer(HWND_DESKTOP, hptrBusy);
3969 WinSendMsg(hwnd, UM_RESCAN, MPFROMLONG(1), MPVOID);
3970 switch (SHORT1FROMMP(mp1)) {
3971 case IDM_SORTEASIZE:
3972 pAD->pfnCompare = (PFNSORT) NULL;
3973 ReSort(hwnd);
3974 break;
3975
3976 case IDM_SORTNAME:
3977 pAD->pfnCompare = comparefullnames;
3978 ReSort(hwnd);
3979 break;
3980
3981 case IDM_SORTFILENAME:
3982 pAD->pfnCompare = comparenames;
3983 ReSort(hwnd);
3984 break;
3985
3986 case IDM_SORTSIZE:
3987 pAD->pfnCompare = comparesizes;
3988 ReSort(hwnd);
3989 break;
3990
3991 case IDM_SORTLWDATE:
3992 pAD->pfnCompare = comparedates;
3993 ReSort(hwnd);
3994 break;
3995
3996 case IDM_SORTFIRST:
3997 pAD->pfnCompare = compareexts;
3998 ReSort(hwnd);
3999 break;
4000 }
4001 WinSetPointer(HWND_DESKTOP, hptrArrow);
4002 DosReleaseMutexSem(pAD->hmtxScan);
4003 WinInvalidateRect(hwnd, NULL, FALSE);
4004 }
4005 break;
4006
4007 case IDM_FILTER:
4008 if (!pAD->stopflag &&
4009 !DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN)) {
4010 FilterList(hwnd);
4011 DosReleaseMutexSem(pAD->hmtxScan);
4012 }
4013 break;
4014
4015 case IDM_RESCAN:
4016 if (!pAD->stopflag &&
4017 !DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN)) {
4018
4019 CHAR tempflags[26];
4020
4021 memcpy(tempflags, pAD->abDrvFlags, sizeof(tempflags));
4022 if (!WinDlgBox(HWND_DESKTOP, hwnd, AFDrvsWndProc, FM3ModHandle,
4023 DRVS_FRAME, (PVOID) pAD)) {
4024 memcpy(pAD->abDrvFlags, tempflags, sizeof(tempflags));
4025 *pAD->szFindPath = 0;
4026 DosReleaseMutexSem(pAD->hmtxScan);
4027 break;
4028 }
4029 WinSendMsg(pAD->hhscroll, SBM_SETTHUMBSIZE, MPFROM2SHORT(1, 1),
4030 MPVOID);
4031 WinSendMsg(pAD->hvscroll, SBM_SETTHUMBSIZE, MPFROM2SHORT(1, 1),
4032 MPVOID);
4033 pAD->topfile = 1;
4034 pAD->cursored = 1;
4035 pAD->selected = 0;
4036 pAD->ullSelectedBytes = 0;
4037 pAD->maxx = pAD->horzscroll = 0;
4038 FreeAllFilesList(hwnd);
4039 pAD->stopflag = 0;
4040 if (_beginthread(FindAllThread, NULL, 524288, (PVOID) hwnd) == -1) {
4041 Runtime_Error(pszSrcFile, __LINE__,
4042 GetPString(IDS_COULDNTSTARTTHREADTEXT));
4043 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
4044 DosReleaseMutexSem(pAD->hmtxScan);
4045 }
4046 else {
4047 DosReleaseMutexSem(pAD->hmtxScan);
4048 DosSleep(50);//05 Aug 07 GKY 100
4049 WinInvalidateRect(hwnd, NULL, FALSE);
4050 PostMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
4051 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
4052 }
4053 }
4054 break;
4055 case IDM_UNHIDEALL:
4056 {
4057 ALLDATA *ad = WinQueryWindowPtr(hwnd, QWL_USER);
4058 FilterAll(hwnd, ad);
4059 }
4060 break;
4061
4062 case IDM_DELETE:
4063 case IDM_PERMDELETE:
4064 case IDM_SELECTALL:
4065 case IDM_DESELECTALL:
4066 case IDM_INVERT:
4067 case IDM_SELECTMASK:
4068 case IDM_DESELECTMASK:
4069 case IDM_REMOVE:
4070 case IDM_HIDEALL:
4071 case IDM_COLLECT:
4072 case IDM_COLLECTOR:
4073 case IDM_SAVETOCLIP:
4074 case IDM_APPENDTOCLIP:
4075 case IDM_SAVETOLIST:
4076 case IDM_INFO:
4077 case IDM_ATTRS:
4078 case IDM_MOVE:
4079 case IDM_COPY:
4080 case IDM_RENAME:
4081 case IDM_MOVEPRESERVE:
4082 case IDM_COPYPRESERVE:
4083 case IDM_WILDMOVE:
4084 case IDM_WILDCOPY:
4085 case IDM_SUBJECT:
4086 case IDM_EAS:
4087 case IDM_PRINT:
4088 case IDM_ARCHIVE:
4089 case IDM_EXTRACT:
4090 case IDM_UUDECODE:
4091 case IDM_SHADOW:
4092 case IDM_OBJECT:
4093 case IDM_OPENSETTINGS:
4094 case IDM_OPENDEFAULT:
4095 if (!pAD->stopflag &&
4096 !DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN)) {
4097 switch (SHORT1FROMMP(mp1)) {
4098 case IDM_SELECTALL:
4099 case IDM_DESELECTALL:
4100 case IDM_INVERT:
4101 case IDM_HIDEALL:
4102 case IDM_REMOVE:
4103 Mark(hwnd, (SHORT1FROMMP(mp1) == IDM_DESELECTALL) ?
4104 AFM_UNMARK : (SHORT1FROMMP(mp1) == IDM_INVERT) ?
4105 AFM_INVERT : (SHORT1FROMMP(mp1) == IDM_HIDEALL) ?
4106 AFM_FILTER : (SHORT1FROMMP(mp1) == IDM_REMOVE) ?
4107 AFM_MARKDELETED : 0, NULL);
4108 if (SHORT1FROMMP(mp1) == IDM_REMOVE ||
4109 SHORT1FROMMP(mp1) == IDM_HIDEALL) {
4110 if (SHORT1FROMMP(mp1) == IDM_REMOVE)
4111 RemoveDeleted(hwnd);
4112 else
4113 ReSort(hwnd);
4114 }
4115 WinInvalidateRect(hwnd, NULL, FALSE);
4116 break;
4117
4118 case IDM_SELECTMASK:
4119 case IDM_DESELECTMASK:
4120 SelectMask(hwnd, (SHORT1FROMMP(mp1) == IDM_DESELECTMASK));
4121 WinInvalidateRect(hwnd, NULL, FALSE);
4122 break;
4123
4124 case IDM_DELETE:
4125 case IDM_PERMDELETE:
4126 case IDM_APPENDTOCLIP:
4127 case IDM_SAVETOCLIP:
4128 case IDM_SAVETOLIST:
4129 case IDM_COLLECT:
4130 case IDM_INFO:
4131 case IDM_ATTRS:
4132 case IDM_MOVE:
4133 case IDM_COPY:
4134 case IDM_RENAME:
4135 case IDM_MOVEPRESERVE:
4136 case IDM_COPYPRESERVE:
4137 case IDM_WILDMOVE:
4138 case IDM_WILDCOPY:
4139 case IDM_SUBJECT:
4140 case IDM_PRINT:
4141 case IDM_EAS:
4142 case IDM_ARCHIVE:
4143 case IDM_EXTRACT:
4144 case IDM_SHADOW:
4145 case IDM_OBJECT:
4146 case IDM_OPENSETTINGS:
4147 case IDM_OPENDEFAULT:
4148 case IDM_UUDECODE:
4149 {
4150 CHAR **list = BuildAList(hwnd);
4151
4152 if (!list)
4153 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
4154 else {
4155 switch (SHORT1FROMMP(mp1)) {
4156 case IDM_COLLECT:
4157 CollectList(hwnd, list);
4158 break;
4159 case IDM_DELETE:
4160 case IDM_PERMDELETE:
4161 case IDM_APPENDTOCLIP:
4162 case IDM_SAVETOCLIP:
4163 case IDM_SAVETOLIST:
4164 case IDM_INFO:
4165 case IDM_ATTRS:
4166 case IDM_MOVE:
4167 case IDM_COPY:
4168 case IDM_RENAME:
4169 case IDM_MOVEPRESERVE:
4170 case IDM_COPYPRESERVE:
4171 case IDM_WILDMOVE:
4172 case IDM_WILDCOPY:
4173 case IDM_SUBJECT:
4174 case IDM_PRINT:
4175 case IDM_EAS:
4176 case IDM_ARCHIVE:
4177 case IDM_EXTRACT:
4178 case IDM_UUDECODE:
4179 case IDM_OBJECT:
4180 case IDM_SHADOW:
4181 case IDM_OPENSETTINGS:
4182 case IDM_OPENDEFAULT:
4183 if (!PostMsg(pAD->hwndObj, UM_MASSACTION, mp1, MPFROMP(list)))
4184 FreeList(list);
4185 break;
4186 }
4187 if (fUnHilite) {
4188 Mark(hwnd, AFM_UNMARK, NULL);
4189 WinInvalidateRect(hwnd, NULL, FALSE);
4190 }
4191 }
4192 }
4193 break;
4194
4195 case IDM_COLLECTOR:
4196 if (mp2) {
4197
4198 CHAR **list = mp2;
4199
4200 if (Collector) {
4201 if (!PostMsg(Collector, WM_COMMAND,
4202 MPFROM2SHORT(IDM_COLLECTOR, 0), MPFROMP(list)))
4203 FreeList(list);
4204 else if (fUnHilite) {
4205 Mark(hwnd, AFM_UNMARK, NULL);
4206 WinInvalidateRect(hwnd, NULL, FALSE);
4207 }
4208 }
4209 else
4210 FreeList(list);
4211 }
4212 break;
4213 }
4214 DosReleaseMutexSem(pAD->hmtxScan);
4215 }
4216 else if (SHORT1FROMMP(mp1) == IDM_COLLECTOR) {
4217 DosSleep(50);//05 Aug 07 GKY 100
4218 if (!PostMsg(hwnd, msg, mp1, mp2))
4219 WinSendMsg(hwnd, msg, mp1, mp2);
4220 }
4221 break;
4222
4223 case IDM_HELP:
4224 if (hwndHelp)
4225 WinSendMsg(hwndHelp,
4226 HM_DISPLAY_HELP,
4227 MPFROM2SHORT(HELP_SEEALL, 0), MPFROMSHORT(HM_RESOURCEID));
4228 break;
4229 }
4230 return 0;
4231
4232 case WM_SIZE:
4233// fprintf(stderr,"Seeall: WM_SIZE\n");
4234 PostMsg(hwnd, UM_SETUP3, MPVOID, MPVOID);
4235 break;
4236
4237 case WM_CLOSE:
4238// fprintf(stderr,"Seeall: WM_CLOSE\n");
4239 if (pAD)
4240 pAD->stopflag = 1;
4241 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
4242 return 0;
4243
4244 case WM_DESTROY:
4245// fprintf(stderr,"Seeall: WM_DESTROY\n");
4246 if (pAD) {
4247 pAD->stopflag = 1;
4248 if (pAD->hmtxScan) {
4249 DosRequestMutexSem(pAD->hmtxScan, 15000);
4250 DosCloseMutexSem(pAD->hmtxScan);
4251 }
4252 if (pAD->hwndPopup)
4253 WinDestroyWindow(pAD->hwndPopup);
4254 if (pAD->hwndObj) {
4255 if (!PostMsg(pAD->hwndObj, WM_CLOSE, MPVOID, MPVOID))
4256 WinSendMsg(pAD->hwndObj, WM_CLOSE, MPVOID, MPVOID);
4257 }
4258 if (pAD->hps) {
4259 GpiDeleteSetId(pAD->hps, FIXED_FONT_LCID);
4260 GpiAssociate(pAD->hps, 0);
4261 GpiDestroyPS(pAD->hps);
4262 }
4263 if (pAD->killme) {
4264 if (!PostMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID))
4265 WinSendMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID);
4266 }
4267 FreeAllFilesList(hwnd);
4268 free(pAD);
4269 }
4270 break;
4271 }
4272
4273 return WinDefWindowProc(hwnd, msg, mp1, mp2);
4274}
4275
4276HWND StartSeeAll(HWND hwndParent, BOOL standalone, // called by applet
4277 CHAR * pszStartPath) // pathname or NULL
4278{
4279 HWND hwndFrame = (HWND) 0, hwndClient;
4280 ULONG FrameFlags = FCF_TITLEBAR | FCF_SYSMENU |
4281 FCF_SIZEBORDER | FCF_MINMAX |
4282 FCF_NOBYTEALIGN | FCF_VERTSCROLL |
4283 FCF_MENU | FCF_ICON | FCF_ACCELTABLE | FCF_HORZSCROLL;
4284
4285 if (ParentIsDesktop(hwndParent, hwndParent))
4286 FrameFlags |= (FCF_TASKLIST | FCF_SHELLPOSITION);
4287 hwndFrame = WinCreateStdWindow(hwndParent,
4288 WS_VISIBLE,
4289 &FrameFlags,
4290 WC_SEEALL,
4291 GetPString(IDS_SEEALLTITLETEXT),
4292 WS_VISIBLE | fwsAnimate,
4293 FM3ModHandle, SEEALL_FRAME, &hwndClient);
4294 if (hwndFrame) {
4295 static CHAR *pszDir;
4296
4297 if (standalone) {
4298 if (!PostMsg(WinWindowFromID(hwndFrame, FID_CLIENT),
4299 UM_SETUP4, MPVOID, MPVOID)) {
4300 PostMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID);
4301 return (HWND) 0;
4302 }
4303 }
4304 if (pszStartPath) {
4305 // Needs to be static for other thread
4306 if (!pszDir)
4307 pszDir = xmalloc(CCHMAXPATH, pszSrcFile, __LINE__);
4308 if (pszDir) {
4309 strcpy(pszDir, pszStartPath);
4310 pszStartPath = pszDir;
4311 }
4312 }
4313 PostMsg(WinWindowFromID(hwndFrame, FID_CLIENT),
4314 UM_SETUP5, MPFROMP(pszStartPath), MPVOID);
4315 }
4316 else if (standalone)
4317 PostMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID);
4318 return hwndFrame;
4319}
4320
4321#pragma alloc_text(SEEALL,comparefullnames,comparenames,comparesizes)
4322#pragma alloc_text(SEEALL,comparedates,compareexts,SeeStatusProc)
4323#pragma alloc_text(SEEALL,InitWindow,PaintLine,SeeAllWndProc)
4324#pragma alloc_text(SEEALL,UpdateList,CollectList,ReSort,Mark)
4325#pragma alloc_text(SEEALL,BuildAList,RemoveDeleted,SeeFrameWndProc,FilterList)
4326#pragma alloc_text(SEEALL2,SeeObjWndProc,MakeSeeObjWinThread,FindDupesThread,DupeDlgProc)
4327#pragma alloc_text(SEEALL3,FreeAllFilesList,DoADir,FindAllThread,AFDrvsWndProc)
4328#pragma alloc_text(SEEALL3,StartSeeAll)
4329
Note: See TracBrowser for help on using the repository browser.