source: trunk/dll/seeall.c@ 1358

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

Comments for CS 1354/55

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