source: trunk/dll/seeall.c@ 787

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

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

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