source: trunk/dll/seeall.c@ 574

Last change on this file since 574 was 551, checked in by Gregg Young, 19 years ago

Indentation cleanup

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