source: trunk/dll/seeall.c@ 959

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

Add Unhide menu option every place that has hide (Ticket 218). Use additional xfrees where appropriate.

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