source: trunk/dll/seeall.c@ 787

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

Rework UM_FILLSETUPLIST IDM_SAVEDIRCNRSTATE and ..._setups() logic for ticket# 109 and #31
Add GetMSecTimer()
Use GetMSecTimer in DbgMsg
Tweak notebook.ipf scanning page
Move more #pragma alloc_text statements to end of files for OpenWatcom
Delete obsoletes
Revert ExpandAll() ShowTreeRec() DosSleeps to 0 - DosSleep(1) was slowing down inner loops
Drop afFilesToGet - use FilesToGet directly
Optimze ShowTreeRec() collapse logic - was really slow

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