source: trunk/dll/seeall.c@ 783

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

Rework DosFindFirst/Next loops to optimize memory allocation and code paths
Adjust FilesToGet limits
Update configuration notebook scanning page
Start updating #pragma alloc_text positioning for OpenWatcom compatibility

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