source: trunk/dll/seeall.c@ 1084

Last change on this file since 1084 was 1084, checked in by Gregg Young, 17 years ago

Added ability to save/append either the full path name (already present) or just the filename to the clipboard. Changed the menu text to make these easier to find. Removed the final return/newline from the list. Ticket 137

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