source: trunk/dll/seeall.c@ 888

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

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

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