source: trunk/dll/seeall.c@ 888

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

runemf2 now quotes executable strings if needed (Ticket 180); it also reports where it was called from on errors

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