source: trunk/dll/seeall.c@ 897

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

Use CommaFmtULL for additional file, EA etc sizes display; Modify/Create TestFDates & TestCDates for comparing/sorting files or CNRITEMS by date/time.

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