source: trunk/dll/seeall.c@ 847

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

Removed large file APIs from code where hey are not needed.

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