source: trunk/dll/seeall.c@ 858

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

Rework large file support wrappers (ticket #41)
Add code to avoid NTFS driver small file read defect (ticket #159)
Add debug code to try to catch David's drive bar exception
Another attempt to correct newview fast viewer text load failure

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