source: trunk/dll/seeall.c@ 773

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

Correct some compare directories collector nits
Use BldQuoted... functions
Move BldQuoted... functions near primary callers
Add RUNTYPE_MASK
Use Runtime_Error2 more

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