source: trunk/dll/seeall.c@ 1433

Last change on this file since 1433 was 1433, checked in by Gregg Young, 16 years ago

Rename different occurences of FIXED_FONT_LCID and give each a different value.

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