source: trunk/dll/seeall.c@ 1401

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

Remainder of changes to rename commafmt.h/c (Ticket 28, 82); Additional strings moved to PCSZs in init.c (Ticket 6); Added WriteDetailsSwitches used it and LoadDetailsSwitches to consolidate inline code (Ticket 343, 344)

  • 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 1400 2009-03-08 17:50:25Z 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
50***********************************************************************/
51
52#include <stdlib.h>
53#include <string.h>
54#include <ctype.h>
55// #include <process.h>
56
57#define INCL_DOS
58#define INCL_DOSERRORS
59#define INCL_WIN
60#define INCL_GPI
61#define INCL_LONGLONG
62
63#include "fm3dll.h"
64#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
65#include "seeall.h"
66#include "mainwnd2.h" // Data declaration(s)
67#include "grep.h" // Data declaration(s)
68#include "arccnrs.h" // Data declaration(s)
69#include "init.h" // Data declaration(s)
70#include "worker.h" // Data declaration(s)
71#include "newview.h" // Data declarations
72#include "fm3dlg.h"
73#include "fm3str.h"
74#include "pathutil.h" // BldQuotedFullPathName...
75#include "makelist.h" // AddToList
76#include "errutil.h" // Dos_Error...
77#include "strutil.h" // GetPString
78#include "notebook.h" // targetdirectory
79#include "copyf.h" // AdjustWildcardName, make_deleteable
80#include "attribs.h" // AttrListDlgProc
81#include "chklist.h" // CenterOverWindow, CheckListProc
82#include "colors.h" // ColorDlgProc
83#include "draglist.h" // DragList
84#include "extract.h" // ExtractDlgProc
85#include "info.h" // FileInfoProc
86#include "valid.h" // GetDesktopName, IsNewer, TestFDates
87#include "saveclip.h" // ListToClipboardHab, SaveAllListDlgProc
88#include "shadow.h" // MakeShadows
89#include "mkdir.h" // MassMkdir
90#include "objcnr.h" // ObjCnrDlgProc
91#include "codepage.h" // PickCodepage
92#include "printer.h" // PrintDlgProc, PrintListThread
93#include "rename.h" // RenameProc
94#include "uudecode.h" // UUD
95#include "walkem.h" // WalkCopyDlgProc, WalkMoveDlgProc
96#include "archive.h" // ArchiveDlgProc
97#include "common.h" // CommonTextProc, DecrThreadUsage, IncrThreadUsage
98#include "defview.h" // DefaultViewKeys
99#include "eas.h" // DisplayEAsProc
100#include "mainwnd.h" // GetNextWindowPos
101#include "filter.h" // PickMaskDlgProc
102#include "avl.h" // SBoxDlgProc
103#include "collect.h" // StartCollector
104#include "subj.h" // Subject
105#include "i18nutil.h" // commafmt
106#include "literal.h" // wildcard
107#include "wrappers.h" // xDosFindNext
108#include "misc.h" // SetConditionalCascade
109#include "fonts.h" // SetMLEFont
110#include "stristr.h" // stristr
111#include "systemf.h" // runemf2
112#include "fortify.h"
113#include "excputil.h" // xbeginthread
114
115#pragma data_seg(DATA2)
116
117static PSZ pszSrcFile = __FILE__;
118
119typedef struct
120{
121 CHAR *fullname, *filename;
122 USHORT attrFile, flags;
123 FDATE date;
124 FTIME time;
125 ULONGLONG cbFile;
126 ULONG CRC;
127}
128ALLFILES;
129
130#define AF_SELECTED 0x0001
131#define AF_DELETED 0x0002
132#define AF_FILTERED 0x0004
133#define AF_DUPE 0x0008
134#define AF_CRCED 0x0010
135
136#define AFM_MARK 0
137#define AFM_UNMARK 1
138#define AFM_INVERT 2
139#define AFM_MARKDELETED 3
140#define AFM_FILTER 4
141
142#define DP_NAMES 0x0001
143#define DP_DATES 0x0002
144#define DP_SIZES 0x0004
145#define DP_CRCS 0x0008
146#define DP_EXTS 0x0010
147
148#define FIXED_FONT_LCID 5
149
150#define COLORS_MAX 8
151
152#define COLORS_CURSOREDNORMALBACK 0
153#define COLORS_CURSOREDSELECTEDBACK 1
154#define COLORS_NORMALBACK 2
155#define COLORS_SELECTEDBACK 3
156#define COLORS_SELECTEDNORMALFORE 4
157#define COLORS_NORMALFORE 5
158#define COLORS_READONLYFORE 6
159#define COLORS_SYSTEMFORE 7
160
161static LONG Colors[COLORS_MAX] = { COLR_WHITE, COLR_DARKGRAY, COLR_PALEGRAY,
162 COLR_BLACK, COLR_WHITE, COLR_BLACK,
163 COLR_DARKBLUE, COLR_DARKRED
164};
165
166typedef int (FNSORT) (const void *, const void *);
167typedef FNSORT *PFNSORT;
168
169typedef struct
170{
171 USHORT size;
172 USHORT dupeflags;
173 ALLFILES *afhead;
174 ALLFILES **afindex;
175 ULONG afheadcnt;
176 ULONG afalloc;
177 ULONG longest;
178 ULONG longestw;
179 ULONG topfile;
180 ULONG cursored;
181 ULONG selected;
182 ULONGLONG ullSelectedBytes;
183 ULONG afindexcnt;
184 ULONG lastselected;
185 ULONG lastdirection;
186 ULONG multiplier;
187 ULONG lasttime;
188 CHAR stopflag;
189 CHAR abDrvFlags[26];
190 CHAR szCommonName[CCHMAXPATH];
191 CHAR szFindPath[CCHMAXPATH];
192 LONG lMaxAscender;
193 LONG lMaxDescender;
194 LONG lMaxHeight;
195 LONG maxx;
196 LONG horzscroll;
197 BOOL fullnames;
198 BOOL invertsort;
199 BOOL mousecaptured;
200 HMTX hmtxScan;
201 HWND hvscroll;
202 HWND hhscroll;
203 HWND hwndMenu;
204 HWND hwndObj;
205 HWND hwndClient;
206 HWND hwndPopup;
207 HWND hwndStatus;
208 HWND hwndFrame;
209 HPS hps;
210 PFNSORT pfnCompare;
211 MASK mask;
212 FATTRS fattrs;
213 LONG aulColors[8];
214 BOOL killme;
215}
216ALLDATA;
217
218static BOOL Fullnames = FALSE;
219static BOOL Firsttime = TRUE;
220static BOOL SortReverse;
221static USHORT Codepage, SortType;
222static FATTRS Fattrs;
223
224extern LONG CRCFile(CHAR * filename, INT * error);
225
226MRESULT EXPENTRY DupeDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
227{
228 switch (msg) {
229 case WM_INITDLG:
230 {
231 USHORT flags = SHORT1FROMMP(mp2);
232
233 WinCheckButton(hwnd, DUPE_NAMES, ((flags & DP_NAMES) != 0));
234 WinCheckButton(hwnd, DUPE_DATES, ((flags & DP_NAMES) != 0));
235 WinCheckButton(hwnd, DUPE_SIZES, ((flags & DP_NAMES) != 0));
236 WinCheckButton(hwnd, DUPE_CRCS, ((flags & DP_NAMES) != 0));
237 if (!(flags & DP_NAMES))
238 WinEnableWindow(WinWindowFromID(hwnd, DUPE_EXTS), FALSE);
239 }
240 break;
241
242 case WM_CONTROL:
243 switch (SHORT1FROMMP(mp1)) {
244 case DUPE_NAMES:
245 if (WinQueryButtonCheckstate(hwnd, DUPE_NAMES))
246 WinEnableWindow(WinWindowFromID(hwnd, DUPE_EXTS), TRUE);
247 else {
248 WinCheckButton(hwnd, DUPE_EXTS, FALSE);
249 WinEnableWindow(WinWindowFromID(hwnd, DUPE_EXTS), FALSE);
250 }
251 break;
252 case DUPE_SIZES:
253 if (!WinQueryButtonCheckstate(hwnd, DUPE_SIZES))
254 WinCheckButton(hwnd, DUPE_CRCS, FALSE);
255 break;
256 case DUPE_CRCS:
257 if (WinQueryButtonCheckstate(hwnd, DUPE_CRCS))
258 WinCheckButton(hwnd, DUPE_SIZES, TRUE);
259 break;
260 }
261 return 0;
262
263 case WM_COMMAND:
264 switch (SHORT1FROMMP(mp1)) {
265 case DID_OK:
266 {
267 USHORT flags = 0;
268
269 if (WinQueryButtonCheckstate(hwnd, DUPE_NAMES)) {
270 flags |= DP_NAMES;
271 if (WinQueryButtonCheckstate(hwnd, DUPE_EXTS))
272 flags |= DP_EXTS;
273 }
274 if (WinQueryButtonCheckstate(hwnd, DUPE_DATES))
275 flags |= DP_DATES;
276 if (WinQueryButtonCheckstate(hwnd, DUPE_SIZES)) {
277 flags |= DP_SIZES;
278 if (WinQueryButtonCheckstate(hwnd, DUPE_CRCS))
279 flags |= (DP_CRCS | DP_SIZES);
280 }
281 if (!flags)
282 saymsg(MB_ENTER,
283 hwnd,
284 GetPString(IDS_ERRORTEXT),
285 "%s", GetPString(IDS_CHECKONETEXT));
286 else
287 WinDismissDlg(hwnd, flags);
288 }
289 break;
290
291 case DID_CANCEL:
292 WinDismissDlg(hwnd, 0);
293 break;
294
295 case IDM_HELP:
296 if (hwndHelp)
297 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
298 MPFROM2SHORT(HELP_DUPES, 0), MPFROMSHORT(HM_RESOURCEID));
299 break;
300 }
301 return 0;
302 }
303 return WinDefDlgProc(hwnd, msg, mp1, mp2);
304}
305
306static ULONG NumLines(RECTL * rcl, ALLDATA * ad)
307{
308 ULONG numlines;
309
310 numlines = (rcl->yTop - rcl->yBottom) / ad->lMaxHeight;
311 if (ad->lMaxDescender && numlines &&
312 ((rcl->yTop - rcl->yBottom) -
313 (numlines * ad->lMaxHeight) <= ad->lMaxDescender))
314 numlines--;
315 return numlines;
316}
317
318MRESULT EXPENTRY SeeObjWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
319{
320 switch (msg) {
321 case UM_MASSACTION:
322 {
323 CHAR **files = NULL, **list = (CHAR **) mp2, path[CCHMAXPATH];
324 UINT numfiles = 0, numalloc = 0;
325 INT plen = 0;
326 HWND hwndFrame = WinQueryWindowULong(hwnd, QWL_USER);
327 CHAR message[CCHMAXPATH * 2], wildname[CCHMAXPATH];
328 register INT x;
329 register CHAR *p, *pp;
330 BOOL dontask = FALSE, wildcarding = FALSE,
331 overold = FALSE, overnew = FALSE;
332
333 if (!list || !list[0])
334 goto Abort;
335 *path = *wildname = 0;
336
337 switch (SHORT1FROMMP(mp1)) {
338 case IDM_MOVEPRESERVE:
339 {
340 CHAR preserve[CCHMAXPATH], *end;
341
342 mp1 = MPFROM2SHORT(IDM_MOVE, SHORT2FROMMP(mp1));
343 strcpy(preserve, list[0] + 2);
344 end = strrchr(preserve, '\\');
345 if (end) {
346 end++;
347 for (x = 1; list[x]; x++) {
348 p = preserve;
349 pp = list[x] + 2;
350 while (p < end && toupper(*p) == toupper(*pp)) {
351 p++;
352 pp++;
353 }
354 if (*p == '\\')
355 p++;
356 if (p < end)
357 end = p;
358 }
359 *end = 0;
360 }
361 else
362 *preserve = 0;
363 plen = strlen(preserve);
364 if (plen)
365 plen += 2;
366 }
367 break;
368 case IDM_COPYPRESERVE:
369 {
370 CHAR preserve[CCHMAXPATH], *end;
371
372 mp1 = MPFROM2SHORT(IDM_COPY, SHORT2FROMMP(mp1));
373 strcpy(preserve, list[0] + 2);
374 end = strrchr(preserve, '\\');
375 if (end) {
376 end++;
377 for (x = 1; list[x]; x++) {
378 p = preserve;
379 pp = list[x] + 2;
380 while (p < end && toupper(*p) == toupper(*pp)) {
381 p++;
382 pp++;
383 }
384 if (*p == '\\')
385 p++;
386 if (p < end)
387 end = p;
388 }
389 *end = 0;
390 }
391 else
392 *preserve = 0;
393 plen = strlen(preserve);
394 if (plen)
395 plen += 2;
396 }
397 break;
398 case IDM_WILDMOVE:
399 wildcarding = TRUE;
400 mp1 = MPFROM2SHORT(IDM_MOVE, SHORT2FROMMP(mp1));
401 break;
402 case IDM_WILDRENAME:
403 wildcarding = TRUE;
404 mp1 = MPFROM2SHORT(IDM_RENAME, SHORT2FROMMP(mp1));
405 break;
406 case IDM_WILDCOPY:
407 wildcarding = TRUE;
408 mp1 = MPFROM2SHORT(IDM_COPY, SHORT2FROMMP(mp1));
409 break;
410 }
411
412 switch (SHORT1FROMMP(mp1)) {
413 case IDM_OBJECT:
414 case IDM_SHADOW:
415 {
416 APIRET rc;
417
418 GetDesktopName(path, sizeof(path));
419 rc = WinDlgBox(HWND_DESKTOP,
420 hwndFrame,
421 ObjCnrDlgProc,
422 FM3ModHandle, OBJCNR_FRAME, MPFROMP(path));
423 if (rc) {
424 if (rc > 1)
425 strcpy(path, "<WP_DESKTOP>");
426 }
427 else {
428 FreeList(list);
429 break;
430 }
431 MakeShadows(hwndFrame,
432 list, (SHORT1FROMMP(mp1) == IDM_SHADOW), path, NULL);
433 }
434 FreeList(list);
435 break;
436
437 case IDM_PRINT:
438 {
439 LISTINFO *li;
440# ifdef FORTIFY
441 Fortify_EnterScope();
442# endif
443 li = xmallocz(sizeof(LISTINFO), pszSrcFile, __LINE__);
444 if (li) {
445 li->hwndS = WinWindowFromID(hwndFrame, FID_CLIENT);
446 li->type = IDM_PRINT;
447 li->list = list;
448 if (WinDlgBox(HWND_DESKTOP,
449 li->hwndS,
450 PrintDlgProc,
451 FM3ModHandle, PRN_FRAME, MPFROMP(li))) {
452 if (li && li->list && li->list[0]) {
453 strcpy(li->targetpath, printer);
454 if (xbeginthread(PrintListThread,
455 65536,
456 li,
457 pszSrcFile,
458 __LINE__) == -1)
459 {
460 FreeListInfo(li);
461 }
462 }
463 }
464 }
465 }
466 break;
467
468 case IDM_EAS:
469 if (WinDlgBox(HWND_DESKTOP,
470 hwndFrame,
471 DisplayEAsProc, FM3ModHandle, EA_FRAME, (PVOID) list)) {
472 if (!PostMsg(WinWindowFromID(hwndFrame, FID_CLIENT),
473 UM_UPDATERECORDLIST, MPFROMP(list), MPVOID))
474 FreeList(list);
475 }
476 else
477 FreeList(list);
478 break;
479
480 case IDM_INFO:
481 if (WinDlgBox(HWND_DESKTOP,
482 hwndFrame,
483 FileInfoProc,
484 FM3ModHandle, FLE_FRAME, (PVOID) list) == 2) {
485 if (!PostMsg(WinWindowFromID(hwndFrame, FID_CLIENT),
486 UM_UPDATERECORDLIST, MPFROMP(list), MPVOID))
487 FreeList(list);
488 }
489 else
490 FreeList(list);
491 break;
492
493 case IDM_ARCHIVE:
494 {
495 DIRCNRDATA ad;
496 CHAR szBuffer[1025];
497
498 memset(&ad, 0, sizeof(ad));
499 ad.namecanchange = 1;
500 ad.info = arcsighead; // Hide dups
501 if (!WinDlgBox(HWND_DESKTOP,
502 hwndFrame,
503 SBoxDlgProc,
504 FM3ModHandle,
505 ASEL_FRAME, (PVOID) & ad.info) || !ad.info) {
506 // we blew it
507 FreeList(list);
508 break;
509 }
510 if (!ad.info->create &&
511 !ad.info->move &&
512 !ad.info->createwdirs &&
513 !ad.info->movewdirs && !ad.info->createrecurse) {
514 // 14 Aug 07 SHL fixme to tell user why we failed
515 FreeList(list);
516 break;
517 }
518 if (!WinDlgBox(HWND_DESKTOP, hwndFrame, ArchiveDlgProc, FM3ModHandle, ARCH_FRAME, (PVOID) & ad) || !*ad.arcname || !*ad.command) { /* we blew it */
519 FreeList(list);
520 break;
521 }
522 // Build archiver command line
523 strcpy(szBuffer, ad.command);
524 strcat(szBuffer, " ");
525 strcat(szBuffer, ad.arcname);
526 p = &szBuffer[strlen(szBuffer)];
527 if (ad.mask.szMask) {
528 strcat(szBuffer, " ");
529 strcat(szBuffer, ad.mask.szMask);
530 }
531 strcat(szBuffer, " ");
532 x = 0;
533 while (list[x]) {
534 FILESTATUS3 fsa;
535 memset(&fsa, 0, sizeof(fsa));
536 DosError(FERR_DISABLEHARDERR);
537 DosQueryPathInfo(list[x], FIL_STANDARD, &fsa, sizeof(fsa));
538 if (fsa.attrFile & FILE_DIRECTORY) {
539 BldQuotedFullPathName(szBuffer + strlen(szBuffer),
540 list[x], "*");
541 }
542 else
543 BldQuotedFileName(szBuffer + strlen(szBuffer), list[x]);
544 x++;
545 if (!list[x] || strlen(szBuffer) + strlen(list[x]) + 5 > 1024) {
546 runemf2(SEPARATE | WINDOWED | WAIT |
547 (fArcStuffVisible ? 0 : (BACKGROUND | MINIMIZED)),
548 HWND_DESKTOP, pszSrcFile, __LINE__,
549 NULL, NULL, "%s", szBuffer);
550 DosSleep(1); // Let archiver get started
551 *p = 0;
552 }
553 strcat(szBuffer, " ");
554 } // while
555 AddToList(ad.arcname, &files, &numfiles, &numalloc);
556 }
557 if (!PostMsg(WinWindowFromID(hwndFrame, FID_CLIENT),
558 UM_UPDATERECORDLIST, MPFROMP(list), MPVOID))
559 FreeList(list);
560 break;
561
562 case IDM_ATTRS:
563 {
564 LISTINFO li;
565
566 memset(&li, 0, sizeof(li));
567 li.list = list;
568 if (WinDlgBox(HWND_DESKTOP,
569 hwndFrame,
570 AttrListDlgProc,
571 FM3ModHandle, ATR_FRAME, MPFROMP(&li))) {
572 if (li.list && li.list[0]) {
573 if (!PostMsg(WinWindowFromID(hwndFrame, FID_CLIENT),
574 UM_UPDATERECORDLIST, MPFROMP(li.list), MPVOID))
575 FreeList(li.list);
576 }
577 }
578 else
579 FreeList(list);
580 }
581 break;
582
583 case IDM_MOVE:
584 case IDM_COPY:
585 if (!*path)
586 strcpy(path, targetdir);
587 if (!*path)
588 strcpy(path, list[0]);
589 MakeValidDir(path);
590 RetryPath:
591 if (SHORT1FROMMP(mp1) == IDM_MOVE) {
592 if (!WinDlgBox(HWND_DESKTOP,
593 hwndFrame,
594 WalkMoveDlgProc,
595 FM3ModHandle, WALK_FRAME, MPFROMP(path)) || !*path) {
596 FreeList(list);
597 goto Abort;
598 }
599 }
600 else {
601 if (!WinDlgBox(HWND_DESKTOP,
602 hwndFrame,
603 WalkCopyDlgProc,
604 FM3ModHandle, WALK_FRAME, MPFROMP(path)) || !*path) {
605 FreeList(list);
606 goto Abort;
607 }
608 }
609 if (driveflags[toupper(*path) - 'A'] & DRIVE_NOTWRITEABLE) {
610 saymsg(MB_CANCEL,
611 hwndFrame,
612 GetPString(IDS_ERRORTEXT),
613 "%s", GetPString(IDS_NOTWRITENOTARGETTEXT));
614 goto RetryPath;
615 }
616 /* intentional fallthru */
617 case IDM_RENAME:
618 {
619 CHAR newname[CCHMAXPATH];
620 PCSZ moving, move, moved;
621 APIRET rc;
622 INT type;
623 FILESTATUS4L fs4;
624 BOOL isnewer, existed, fResetVerify = FALSE;
625
626 for (x = 0; list[x]; x++) {
627 Retry:
628 type = (SHORT1FROMMP(mp1) == IDM_RENAME) ? MOVE :
629 (SHORT1FROMMP(mp1) == IDM_MOVE) ? MOVE :
630 (SHORT1FROMMP(mp1) == IDM_WPSMOVE) ? WPSMOVE :
631 (SHORT1FROMMP(mp1) == IDM_WPSCOPY) ? WPSCOPY : COPY;
632 moving = (SHORT1FROMMP(mp1) == IDM_RENAME) ?
633 GetPString(IDS_RENAMINGTEXT) :
634 (SHORT1FROMMP(mp1) == IDM_MOVE ||
635 SHORT1FROMMP(mp1) == IDM_WPSMOVE) ?
636 GetPString(IDS_MOVINGTEXT) : GetPString(IDS_COPYINGTEXT);
637 move = (SHORT1FROMMP(mp1) == IDM_RENAME) ?
638 GetPString(IDS_RENAMETEXT) :
639 (SHORT1FROMMP(mp1) == IDM_MOVE ||
640 SHORT1FROMMP(mp1) == IDM_WPSMOVE) ?
641 GetPString(IDS_MOVETEXT) : GetPString(IDS_COPYTEXT);
642 moved = (SHORT1FROMMP(mp1) == IDM_RENAME) ?
643 GetPString(IDS_RENAMEDTEXT) :
644 (SHORT1FROMMP(mp1) == IDM_MOVE ||
645 SHORT1FROMMP(mp1) == IDM_WPSMOVE) ?
646 GetPString(IDS_MOVEDTEXT) : GetPString(IDS_COPIEDTEXT);
647 if (*path) {
648 strcpy(newname, path);
649 if (newname[strlen(newname) - 1] != '\\')
650 strcat(newname, "\\");
651 if (plen)
652 p = list[x] + plen;
653 else {
654 p = strrchr(list[x], '\\');
655 if (p)
656 p++;
657 else
658 p = list[x];
659 }
660 strcat(newname, p);
661 }
662 else
663 strcpy(newname, list[x]);
664 if ((wildcarding || SHORT1FROMMP(mp1) == IDM_RENAME) && *wildname) {
665
666 CHAR testname[CCHMAXPATH];
667
668 strcpy(testname, wildname);
669 if (AdjustWildcardName(newname, testname))
670 strcpy(newname, testname);
671 }
672 existed = (IsFile(newname) != -1);
673 isnewer = IsNewer(list[x], newname);
674 if (existed && SHORT1FROMMP(mp1) != IDM_RENAME && dontask) {
675 if (!overold && !overnew)
676 break;
677 if (!overold && !isnewer)
678 break;
679 if (!overnew && isnewer)
680 break;
681 }
682 if ((SHORT1FROMMP(mp1) == IDM_RENAME &&
683 (!dontask || !*wildname)) ||
684 (!dontask && existed) ||
685 (!dontask && wildcarding) ||
686 (IsFile(newname) == 0 && IsFile(list[x]) == 1)) {
687
688 MOVEIT mv;
689
690 memset(&mv, 0, sizeof(mv));
691 mv.rename = (SHORT1FROMMP(mp1) == IDM_RENAME);
692 mv.source = list[x];
693 strcpy(mv.target, newname);
694 rc = WinDlgBox(HWND_DESKTOP,
695 hwndFrame,
696 RenameProc,
697 FM3ModHandle, REN_FRAME, (PVOID) & mv);
698 if (!rc) {
699 FreeList(list);
700 goto Abort;
701 }
702 DosSleep(0); //26 Aug 07 GKY 1
703 if (mv.skip || !*mv.target)
704 break;
705 if (mv.dontask)
706 dontask = TRUE;
707 if (mv.overold)
708 overold = TRUE;
709 if (mv.overnew)
710 overnew = TRUE;
711 if (wildcarding || SHORT1FROMMP(mp1) == IDM_RENAME) {
712 p = strrchr(mv.target, '\\');
713 if (p && (strchr(p, '*') || strchr(p, '?'))) {
714 strcpy(wildname, mv.target);
715 AdjustWildcardName(list[x], mv.target);
716 }
717 else
718 *wildname = 0;
719 }
720 strcpy(newname, mv.target);
721 existed = (IsFile(newname) != -1);
722 isnewer = IsNewer(list[x], newname);
723 if (!mv.overwrite) {
724 if (existed && SHORT1FROMMP(mp1) != IDM_RENAME && dontask) {
725 if (!overold && !overnew)
726 break;
727 if (!overold && !isnewer)
728 break;
729 if (!overnew && isnewer)
730 break;
731 }
732 }
733 }
734 if (!stricmp(list[x], newname))
735 break;
736 sprintf(message,
737 " %s \"%s\" %s \"%s\"",
738 moving, list[x], GetPString(IDS_TOTEXT), newname);
739 WinSetWindowText(WinWindowFromID(hwndFrame, SEEALL_STATUS),
740 message);
741 if (fRealIdle)
742 priority_idle();
743 if (fVerify && (driveflags[toupper(*list[x]) - 'A'] & DRIVE_WRITEVERIFYOFF ||
744 driveflags[toupper(*newname) - 'A'] & DRIVE_WRITEVERIFYOFF)) {
745 DosSetVerify(FALSE);
746 fResetVerify = TRUE;
747 }
748 if (plen) {
749 /* make directory/ies, if required */
750
751 CHAR dirpart[CCHMAXPATH];
752
753 strcpy(dirpart, newname);
754 p = strrchr(dirpart, '\\');
755 if (p) {
756 *p = 0;
757 if (p > dirpart + 3)
758 MassMkdir((hwndMain) ? hwndMain : (HWND) 0, dirpart);
759 }
760 }
761 rc = docopyf(type, list[x], "%s", newname);
762 if (fResetVerify) {
763 DosSetVerify(fVerify);
764 fResetVerify = FALSE;
765 }
766 priority_normal();
767 if (rc) {
768 if ((rc == ERROR_DISK_FULL ||
769 rc == ERROR_HANDLE_DISK_FULL) &&
770 isalpha(*newname) &&
771 (driveflags[toupper(*newname) - 'A'] & DRIVE_REMOVABLE) &&
772 !(driveflags[toupper(*newname) - 'A'] & DRIVE_NOTWRITEABLE)
773 && toupper(*newname) != toupper(*list[x])
774 && !DosQueryPathInfo(list[x], FIL_QUERYEASIZEL, &fs4,
775 sizeof(fs4))
776 && !(fs4.attrFile & FILE_DIRECTORY)) {
777
778 FSALLOCATE fsa;
779 ULONGLONG ullFreeBytes;
780 CHAR *ptr;
781 INT cntr;
782
783 WinSetWindowText(WinWindowFromID(hwndFrame, SEEALL_STATUS),
784 GetPString(IDS_FITTINGTEXT));
785 DosError(FERR_DISABLEHARDERR);
786 if (!DosQueryFSInfo(toupper(*newname) - '@',
787 FSIL_ALLOC, &fsa, sizeof(fsa))) {
788 // Assume large file support
789 ullFreeBytes = (ULONGLONG) fsa.cUnitAvail * fsa.cSectorUnit *
790 fsa.cbSector;
791 if (ullFreeBytes) {
792 // Find item that will fit in available space
793 for (cntr = x + 1; list[cntr]; cntr++) {
794 DosError(FERR_DISABLEHARDERR);
795 if (!DosQueryPathInfo(list[cntr],
796 FIL_QUERYEASIZEL,
797 &fs4, sizeof(fs4)) &&
798 !(fs4.attrFile & FILE_DIRECTORY) &&
799 // fixme to use CBLIST_TO_EASIZE?
800 fs4.cbFile + fs4.cbList <= ullFreeBytes) {
801 // Swap with failing item
802 ptr = list[x];
803 list[x] = list[cntr];
804 list[cntr] = ptr;
805 goto Retry;
806 }
807 }
808 WinSetWindowText(WinWindowFromID(hwndFrame,
809 SEEALL_STATUS),
810 GetPString(IDS_COULDNTFITTEXT));
811 }
812 }
813 rc = saymsg(MB_ABORTRETRYIGNORE | MB_ICONEXCLAMATION,
814 hwndFrame,
815 GetPString(IDS_DISKFULLTEXT),
816 "%s", GetPString(IDS_ANOTHERDISKTEXT));
817 if (rc == MBID_RETRY)
818 goto Retry;
819 if (rc == MBID_ABORT) {
820 FreeList(list);
821 goto Abort;
822 }
823 }
824 else {
825 if (LogFileHandle)
826 fprintf(LogFileHandle,
827 GetPString(IDS_LOGTOFAILEDTEXT),
828 move, list[x], newname, rc);
829 rc = Dos_Error(MB_ENTERCANCEL,
830 rc,
831 hwndFrame,
832 pszSrcFile,
833 __LINE__,
834 "%s %s \"%s\" %s\"%s\" %s.",
835 move,
836 GetPString(IDS_OFTEXT),
837 list[x],
838 GetPString(IDS_TOTEXT),
839 newname, GetPString(IDS_FAILEDTEXT));
840 if (rc == MBID_CANCEL) {
841 FreeList(list);
842 goto Abort;
843 }
844 }
845 }
846 else {
847 if (LogFileHandle)
848 fprintf(LogFileHandle,
849 "%s \"%s\" %s \"%s\"\n",
850 moved, list[x], GetPString(IDS_TOTEXT), newname);
851 AddToList(newname, &files, &numfiles, &numalloc);
852 }
853 }
854 }
855 if (SHORT1FROMMP(mp1) != IDM_COPY) {
856 if (!PostMsg(WinWindowFromID(hwndFrame, FID_CLIENT),
857 UM_UPDATERECORDLIST, MPFROMP(list), MPVOID))
858 FreeList(list);
859 }
860 else
861 FreeList(list);
862 break;
863
864 case IDM_UUDECODE:
865 for (x = 0; list[x]; x++)
866 UUD(list[x], NULL);
867 break;
868
869 case IDM_EXTRACT:
870 for (x = 0; list[x]; x++) {
871
872 EXTRDATA ex;
873 BOOL maskspaces = FALSE;
874
875 memset(&ex, 0, sizeof(ex));
876 ex.info = find_type(list[x], NULL);
877 if (!ex.info || (!ex.info->extract && !ex.info->exwdirs))
878 break;
879 ex.size = sizeof(ex);
880 ex.arcname = list[x];
881 strcpy(ex.masks, "*");
882 if (!WinDlgBox(HWND_DESKTOP,
883 hwndFrame,
884 ExtractDlgProc,
885 FM3ModHandle,
886 EXT_FRAME,
887 (PVOID) & ex) ||
888 !ex.ret || !*ex.command || !*ex.arcname || !*ex.extractdir)
889 break;
890 if (IsFile(ex.extractdir) != 0)
891 Runtime_Error(pszSrcFile, __LINE__, "directory expected");
892 else {
893 if (needs_quoting(ex.masks) && !strchr(ex.masks, '\"'))
894 maskspaces = TRUE;
895 runemf2(SEPARATE | WINDOWED |
896 (fArcStuffVisible ? 0 : (BACKGROUND | MINIMIZED)),
897 HWND_DESKTOP, pszSrcFile, __LINE__,
898 ex.extractdir, NULL,
899 "%s %s %s%s%s",
900 ex.command,
901 ex.arcname,
902 maskspaces ? "\"" : NullStr,
903 *ex.masks ? ex.masks : "*",
904 maskspaces ? "\"" : NullStr);
905 }
906 }
907 // fixme to not leak?
908 if (!PostMsg(WinWindowFromID(hwndFrame, FID_CLIENT),
909 UM_UPDATERECORDLIST, MPFROMP(list), MPVOID))
910 FreeList(list);
911 break;
912
913 case IDM_SUBJECT:
914 for (x = 0; list[x]; x++) {
915
916 INT ret;
917
918 if (IsFile(list[x]) == 1) {
919 ret = Subject(hwndFrame, list[x]);
920 if (!ret)
921 break;
922 }
923 }
924 if (!PostMsg(WinWindowFromID(hwndFrame, FID_CLIENT),
925 UM_UPDATERECORDLIST, MPFROMP(list), MPVOID))
926 FreeList(list);
927 break;
928
929 case IDM_OPENDEFAULT:
930 case IDM_OPENSETTINGS:
931 for (x = 0; list[x]; x++) {
932 if (IsFile(list[x]) != -1) {
933
934 CHAR *s;
935
936 switch (SHORT1FROMMP(mp1)) {
937 case IDM_OPENSETTINGS:
938 s = Settings;
939 break;
940 default:
941 s = Default;
942 break;
943 }
944 OpenObject(list[x], s, hwndFrame);
945 }
946 }
947 FreeList(list);
948 break;
949
950 case IDM_DELETE:
951 case IDM_PERMDELETE:
952 {
953 CHECKLIST cl;
954 INT isdir = 0, sysdir = 0, ro = 0, hs = 0;
955 FILESTATUS3 fsa;
956 CHAR prompt[CCHMAXPATH * 3];
957 APIRET error;
958
959 for (x = 0; list[x]; x++) {
960 if (IsRoot(list[x])) {
961 list = RemoveFromList(list, list[x]);
962 if (!list)
963 break;
964 x--;
965 continue;
966 }
967 DosError(FERR_DISABLEHARDERR);
968 if (DosQueryPathInfo(list[x], FIL_STANDARD, &fsa, sizeof(fsa))) {
969 list = RemoveFromList(list, list[x]);
970 if (!list)
971 break;
972 x--;
973 continue;
974 }
975 if (fsa.attrFile & FILE_DIRECTORY) {
976 isdir++;
977 if (stristr(list[x], ":\\OS2\\") ||
978 !stricmp(list[x] + 1, ":\\OS2"))
979 sysdir++;
980 }
981 else {
982 if (fsa.attrFile & (FILE_HIDDEN | FILE_SYSTEM))
983 hs++;
984 if (fsa.attrFile & FILE_READONLY)
985 ro++;
986 }
987 }
988 if (!list)
989 break;
990 if (fConfirmDelete || isdir) {
991 memset(&cl, 0, sizeof(cl));
992 cl.size = sizeof(cl);
993 cl.list = list;
994 cl.prompt = prompt;
995 cl.flags |= CHECK_FILES;
996 cl.cmd = SHORT1FROMMP(mp1);
997 sprintf(prompt,
998 GetPString(IDS_DELPROMPT1TEXT),
999 (SHORT1FROMMP(mp1) == IDM_DELETE) ?
1000 NullStr :
1001 GetPString(IDS_PERMANENTLYTEXT), &"s"[list[1] == NULL]);
1002 if (isdir) {
1003 sprintf(&prompt[strlen(prompt)],
1004 GetPString(IDS_DELPROMPT2TEXT),
1005 isdir,
1006 (isdir > 1) ?
1007 GetPString(IDS_ARETEXT) :
1008 GetPString(IDS_ISTEXT),
1009 (isdir == 1) ?
1010 GetPString(IDS_ATEXT) :
1011 NullStr,
1012 (isdir > 1) ?
1013 GetPString(IDS_IESTEXT) : GetPString(IDS_YTEXT));
1014 if (sysdir)
1015 sprintf(&prompt[strlen(prompt)],
1016 GetPString(IDS_DELPROMPT3TEXT),
1017 sysdir,
1018 (sysdir == 1) ?
1019 GetPString(IDS_YTEXT) : GetPString(IDS_IESTEXT));
1020 }
1021 if (ro)
1022 sprintf(&prompt[strlen(prompt)],
1023 GetPString(IDS_DELPROMPT4TEXT),
1024 ro,
1025 &"s"[ro == 1],
1026 (ro > 1) ?
1027 GetPString(IDS_ARETEXT) : GetPString(IDS_ISTEXT));
1028 if (hs)
1029 sprintf(&prompt[strlen(prompt)],
1030 GetPString(IDS_DELPROMPT5TEXT),
1031 hs,
1032 &"s"[hs == 1],
1033 (hs > 1) ?
1034 GetPString(IDS_ARETEXT) : GetPString(IDS_ISTEXT));
1035 if ((ro || hs || sysdir) && !fAlertBeepOff)
1036 DosBeep(300, 100);
1037 strcat(prompt, GetPString(IDS_DELPROMPT6TEXT));
1038 if (!WinDlgBox(HWND_DESKTOP,
1039 WinWindowFromID(hwndFrame, FID_CLIENT),
1040 CheckListProc,
1041 FM3ModHandle, CHECK_FRAME, MPFROMP(&cl)))
1042 break;
1043 list = cl.list;
1044 if (!list || !list[0])
1045 break;
1046 }
1047 for (x = 0; list[x]; x++) {
1048 fsa.attrFile = 0;
1049 DosError(FERR_DISABLEHARDERR);
1050 DosQueryPathInfo(list[x], FIL_STANDARD, &fsa, sizeof(fsa));
1051 if (fsa.attrFile & FILE_DIRECTORY) {
1052 sprintf(prompt, GetPString(IDS_DELETINGTEXT), list[x]);
1053 WinSetWindowText(WinWindowFromID(hwndFrame, SEEALL_STATUS),
1054 prompt);
1055 error = (APIRET) wipeallf("%s%s*",
1056 list[x],
1057 (*list[x] &&
1058 list[x][strlen(list[x]) - 1] !=
1059 '\\') ? "\\" : NullStr);
1060 DosError(FERR_DISABLEHARDERR);
1061 if (!error)
1062 error = DosDeleteDir(list[x]);
1063 else
1064 DosDeleteDir(list[x]);
1065 }
1066 else {
1067 DosError(FERR_DISABLEHARDERR);
1068 if (SHORT1FROMMP(mp1) == IDM_DELETE)
1069 error = DosDelete(list[x]);
1070 else
1071 error = DosForceDelete(list[x]);
1072 if (error) {
1073 DosError(FERR_DISABLEHARDERR);
1074 make_deleteable(list[x]);
1075 if (SHORT1FROMMP(mp1) == IDM_DELETE)
1076 error = DosDelete(list[x]);
1077 else
1078 error = DosForceDelete(list[x]);
1079 }
1080 }
1081 if (error) {
1082 if (LogFileHandle)
1083 fprintf(LogFileHandle,
1084 GetPString(IDS_DELETEFAILED1TEXT), list[x], error);
1085 if (Dos_Error(MB_ENTERCANCEL,
1086 error,
1087 hwndFrame,
1088 pszSrcFile,
1089 __LINE__,
1090 GetPString(IDS_DELETEFAILED2TEXT),
1091 list[x]) == MBID_CANCEL)
1092 break;
1093 }
1094 else if (LogFileHandle)
1095 fprintf(LogFileHandle,
1096 "%s\n", GetPString(IDS_DELETEDTEXT), list[x]);
1097 AddToList(list[x], &files, &numfiles, &numalloc);
1098 }
1099 }
1100 FreeList(list);
1101 break;
1102
1103 case IDM_SAVETOLIST:
1104 if (list) {
1105 WinDlgBox(HWND_DESKTOP,
1106 WinWindowFromID(hwndFrame, FID_CLIENT),
1107 SaveAllListDlgProc,
1108 FM3ModHandle, SAV_FRAME, MPFROMP(list));
1109 FreeList(list);
1110 }
1111 break;
1112
1113 case IDM_SAVETOCLIP:
1114 case IDM_APPENDTOCLIP:
1115 case IDM_SAVETOCLIPFILENAME:
1116 case IDM_APPENDTOCLIPFILENAME:
1117 if (list) {
1118 ListToClipboardHab(WinQueryAnchorBlock(hwnd),
1119 list, SHORT1FROMMP(mp1));
1120 FreeList(list);
1121 }
1122 break;
1123
1124 default:
1125 if (list)
1126 FreeList(list);
1127 break;
1128 }
1129
1130 switch (SHORT1FROMMP(mp1)) {
1131 case IDM_MOVE:
1132 case IDM_COPY:
1133 case IDM_RENAME:
1134 sprintf(message,
1135 GetPString(IDS_OPSCOMPLETETEXT),
1136 SHORT1FROMMP(mp1) == IDM_MOVE ?
1137 GetPString(IDS_MOVETEXT) :
1138 SHORT1FROMMP(mp1) == IDM_COPY ?
1139 GetPString(IDS_COPYTEXT) :
1140 SHORT1FROMMP(mp1) == IDM_WPSMOVE ?
1141 GetPString(IDS_WPSMOVETEXT) :
1142 SHORT1FROMMP(mp1) == IDM_WPSCOPY ?
1143 GetPString(IDS_WPSCOPYTEXT) :
1144 GetPString(IDS_RENAMETEXT),
1145 &"s"[x == 1],
1146 SHORT1FROMMP(mp1) == IDM_MOVE ||
1147 SHORT1FROMMP(mp1) == IDM_COPY ||
1148 SHORT1FROMMP(mp1) == IDM_WPSMOVE ||
1149 SHORT1FROMMP(mp1) == IDM_WPSCOPY ?
1150 GetPString(IDS_TOTEXT) : NullStr,
1151 SHORT1FROMMP(mp1) == IDM_MOVE ||
1152 SHORT1FROMMP(mp1) == IDM_COPY ||
1153 SHORT1FROMMP(mp1) == IDM_WPSCOPY ?
1154 path : NullStr,
1155 x != 1 ? GetPString(IDS_ARETEXT) : GetPString(IDS_ISTEXT));
1156 WinSetWindowText(WinWindowFromID(hwndFrame, SEEALL_STATUS), message);
1157 if (toupper(*path) < 'C' && !fAlertBeepOff)
1158 DosBeep(1000, 25);
1159 DosSleep(16); // 05 Aug 07 GKY 33
1160 break;
1161
1162 default:
1163 break;
1164 }
1165 Abort:
1166 if (files) {
1167 if (!PostMsg(WinWindowFromID(hwndFrame, FID_CLIENT),
1168 UM_UPDATERECORDLIST, MPFROMP(files), MPVOID))
1169 FreeList(files);
1170 }
1171 PostMsg(WinWindowFromID(hwndFrame, FID_CLIENT),
1172 UM_RESCAN, MPVOID, MPVOID);
1173 }
1174 return 0;
1175
1176 case WM_CLOSE:
1177 WinDestroyWindow(hwnd);
1178 break;
1179
1180 case WM_DESTROY:
1181 if (!PostMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID))
1182 WinSendMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID);
1183 break;
1184 }
1185 return WinDefWindowProc(hwnd, msg, mp1, mp2);
1186}
1187
1188static VOID MakeSeeObjWinThread(VOID * args)
1189{
1190 HAB hab2;
1191 HMQ hmq2;
1192 HWND hwndObj;
1193 ALLDATA *ad = (ALLDATA *) args;
1194 QMSG qmsg2;
1195
1196 if (ad) {
1197# ifdef FORTIFY
1198 Fortify_EnterScope();
1199# endif
1200 hab2 = WinInitialize(0);
1201 if (hab2) {
1202 hmq2 = WinCreateMsgQueue(hab2, 256);
1203 if (hmq2) {
1204 DosError(FERR_DISABLEHARDERR);
1205 WinRegisterClass(hab2,
1206 WC_OBJECTWINDOW,
1207 SeeObjWndProc, 0, sizeof(PVOID));
1208 hwndObj = WinCreateWindow(HWND_OBJECT,
1209 WC_OBJECTWINDOW,
1210 (PSZ) NULL,
1211 0,
1212 0,
1213 0,
1214 0,
1215 0, 0, HWND_TOP, SEEALL_OBJ, NULL, NULL);
1216 if (!hwndObj) {
1217 Win_Error(HWND_OBJECT, HWND_DESKTOP, pszSrcFile, __LINE__,
1218 PCSZ_WINCREATEWINDOW);
1219 if (!PostMsg(ad->hwndClient, WM_CLOSE, MPVOID, MPVOID))
1220 WinSendMsg(ad->hwndClient, WM_CLOSE, MPVOID, MPVOID);
1221 }
1222 else {
1223 ad->hwndObj = hwndObj;
1224 WinSetWindowULong(hwndObj, QWL_USER, ad->hwndFrame);
1225 priority_normal();
1226 while (WinGetMsg(hab2, &qmsg2, (HWND) 0, 0, 0))
1227 WinDispatchMsg(hab2, &qmsg2);
1228 WinDestroyWindow(hwndObj);
1229 }
1230 WinDestroyMsgQueue(hmq2);
1231 }
1232 else
1233 WinTerminate(hab2);
1234 }
1235# ifdef FORTIFY
1236 Fortify_LeaveScope();
1237# endif
1238 }
1239}
1240
1241static VOID SelectMask(HWND hwnd, BOOL deselect)
1242{
1243 MASK mask;
1244 register ULONG x, y, z;
1245 BOOL ret;
1246 ALLDATA *pAD = WinQueryWindowPtr(hwnd, QWL_USER);
1247
1248 memset(&mask, 0, sizeof(mask));
1249 mask.fNoAttribs = FALSE;
1250 mask.fNoDirs = TRUE;
1251 mask.attrFile = pAD->mask.attrFile;
1252 mask.antiattr = pAD->mask.antiattr;
1253 mask.fIsSeeAll = TRUE;
1254 strcpy(mask.prompt,
1255 GetPString((!deselect) ?
1256 IDS_SELECTFILTERTEXT : IDS_DESELECTFILTERTEXT));
1257 if (WinDlgBox(HWND_DESKTOP,
1258 hwnd,
1259 PickMaskDlgProc,
1260 FM3ModHandle,
1261 MSK_FRAME,
1262 MPFROMP(&mask)) &&
1263 (*mask.szMask ||
1264 mask.attrFile != pAD->mask.attrFile ||
1265 mask.antiattr != pAD->mask.antiattr)) {
1266 for (x = 0; x < pAD->afindexcnt; x++) {
1267 y = (pAD->invertsort) ? (pAD->afindexcnt - 1) - x : x;
1268 ret = FALSE;
1269 if (mask.pszMasks[1]) {
1270 for (z = 0; mask.pszMasks[z]; z++) {
1271 if (*mask.pszMasks[z]) {
1272 if (*mask.pszMasks[z] != '/') {
1273 if (wildcard((strchr(mask.pszMasks[z], '\\') ||
1274 strchr(mask.pszMasks[z], ':')) ?
1275 pAD->afindex[y]->fullname : pAD->afindex[y]->
1276 filename, mask.pszMasks[z], FALSE))
1277 ret = TRUE;
1278 }
1279 else {
1280 if (wildcard((strchr(mask.pszMasks[z], '\\') ||
1281 strchr(mask.pszMasks[z], ':')) ?
1282 pAD->afindex[y]->fullname : pAD->afindex[y]->
1283 filename, mask.pszMasks[y] + 1, FALSE)) {
1284 ret = FALSE;
1285 break;
1286 }
1287 }
1288 }
1289 }
1290 }
1291 else if (*mask.szMask) {
1292 if (wildcard((strchr(mask.szMask, '\\') ||
1293 strchr(mask.szMask, ':')) ?
1294 pAD->afindex[y]->fullname : pAD->afindex[y]->filename,
1295 mask.szMask, FALSE))
1296 ret = TRUE;
1297 }
1298 else
1299 ret = TRUE;
1300 if (ret) {
1301 if ((!(mask.attrFile & FILE_HIDDEN)
1302 && (pAD->afindex[y]->attrFile & FILE_HIDDEN))
1303 || (!(mask.attrFile & FILE_SYSTEM)
1304 && (pAD->afindex[y]->attrFile & FILE_SYSTEM))
1305 || (!(mask.attrFile & FILE_READONLY)
1306 && (pAD->afindex[y]->attrFile & FILE_READONLY))
1307 || (!(mask.attrFile & FILE_ARCHIVED)
1308 && (pAD->afindex[y]->attrFile & FILE_ARCHIVED)))
1309 ret = FALSE;
1310 else
1311 if (((mask.antiattr & FILE_HIDDEN)
1312 && !(pAD->afindex[y]->attrFile & FILE_HIDDEN))
1313 || ((mask.antiattr & FILE_SYSTEM)
1314 && !(pAD->afindex[y]->attrFile & FILE_SYSTEM))
1315 || ((mask.antiattr & FILE_READONLY)
1316 && !(pAD->afindex[y]->attrFile & FILE_READONLY))
1317 || ((mask.antiattr & FILE_ARCHIVED)
1318 && !(pAD->afindex[y]->attrFile & FILE_ARCHIVED)))
1319 ret = FALSE;
1320 }
1321 if (ret) {
1322 if (deselect) {
1323 if (pAD->afindex[y]->flags & AF_SELECTED) {
1324 pAD->selected--;
1325 pAD->ullSelectedBytes -= pAD->afindex[y]->cbFile;
1326 pAD->afindex[y]->flags &= ~AF_SELECTED;
1327 }
1328 }
1329 else {
1330 if (~pAD->afindex[y]->flags & AF_SELECTED) {
1331 pAD->selected++;
1332 pAD->ullSelectedBytes += pAD->afindex[y]->cbFile;
1333 pAD->afindex[y]->flags |= AF_SELECTED;
1334 }
1335 }
1336 }
1337 } // for
1338 }
1339}
1340
1341static VOID CollectList(HWND hwnd, CHAR ** list)
1342{
1343 if (!Collector) {
1344 if (hwndMain && !fExternalCollector && !strcmp(realappname, FM3Str)) {
1345
1346 HWND hwndC;
1347 SWP swp;
1348
1349 if (!fAutoTile)
1350 GetNextWindowPos(hwndMain, &swp, NULL, NULL);
1351 hwndC = StartCollector(hwndMain, 4);
1352 if (hwndC) {
1353 if (!fAutoTile)
1354 WinSetWindowPos(hwndC, HWND_TOP, swp.x, swp.y,
1355 swp.cx, swp.cy, SWP_MOVE | SWP_SIZE |
1356 SWP_SHOW | SWP_ZORDER);
1357 else
1358 TileChildren(hwndMain, TRUE);
1359 WinSetWindowPos(hwndC, HWND_TOP, 0, 0, 0, 0, SWP_ACTIVATE);
1360 DosSleep(100);//05 Aug 07 GKY 250
1361 }
1362 }
1363 else {
1364 StartCollector(HWND_DESKTOP, 4);
1365 DosSleep(100);//05 Aug 07 GKY 250
1366 }
1367 }
1368 if (!PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_COLLECTOR, 0),
1369 MPFROMP(list)))
1370 FreeList(list);
1371}
1372
1373static VOID FreeAllFilesList(HWND hwnd)
1374{
1375 ALLDATA *ad = WinQueryWindowPtr(hwnd, QWL_USER);
1376 register ULONG x;
1377
1378 if (ad->afhead && ad->afheadcnt) {
1379 for (x = 0; x < ad->afheadcnt; x++) {
1380 xfree(ad->afhead[x].fullname, pszSrcFile, __LINE__);
1381 }
1382 free(ad->afhead);
1383 ad->afhead = NULL;
1384 xfree(ad->afindex, pszSrcFile, __LINE__);
1385 ad->afindex = NULL;
1386 }
1387 DosPostEventSem(CompactSem);
1388 ad->afalloc = ad->afindexcnt = ad->afheadcnt = ad->longest = ad->longestw =
1389 ad->maxx = ad->horzscroll = 0;
1390}
1391
1392static CHAR **BuildAList(HWND hwnd)
1393{
1394 ALLDATA *ad = WinQueryWindowPtr(hwnd, QWL_USER);
1395 ULONG x;
1396 ULONG y;
1397 ULONG z = 0;
1398 CHAR **list = NULL;
1399 UINT numfiles = 0;
1400 UINT numalloc = 0;
1401 INT error;
1402
1403 if (ad->selected) {
1404 for (x = 0; x < ad->afindexcnt; x++) {
1405 y = (ad->invertsort) ? (ad->afindexcnt - 1) - x : x;
1406 if (ad->afindex[y]->flags & AF_SELECTED) {
1407 error = AddToList(ad->afindex[y]->fullname, &list,
1408 &numfiles, &numalloc);
1409 if (error)
1410 break;
1411 z++;
1412 if (z >= ad->selected)
1413 break;
1414 }
1415 }
1416 }
1417 return list;
1418}
1419
1420static BOOL Mark(HWND hwnd, INT command, CHAR ** list)
1421{
1422 /* Marks only unfiltered files */
1423
1424 ALLDATA *pAD = WinQueryWindowPtr(hwnd, QWL_USER);
1425 register ULONG x, y, z;
1426 BOOL ret = TRUE;
1427 BOOL didone = FALSE;
1428
1429 for (x = 0; x < pAD->afindexcnt; x++) {
1430 y = (pAD->invertsort) ? (pAD->afindexcnt - 1) - x : x;
1431 if (list) {
1432 ret = FALSE;
1433 for (z = 0; list[z]; z++) {
1434 if (!stricmp(list[z], pAD->afindex[y]->fullname)) {
1435 ret = TRUE;
1436 break;
1437 }
1438 }
1439 }
1440 if (ret) {
1441 didone = TRUE;
1442 if (command == AFM_UNMARK) {
1443 if (pAD->afindex[y]->flags & AF_SELECTED) {
1444 pAD->selected--;
1445 pAD->ullSelectedBytes -= pAD->afindex[y]->cbFile;
1446 pAD->afindex[y]->flags &= ~AF_SELECTED;
1447 }
1448 }
1449 else if (command == AFM_MARK) {
1450 if (~pAD->afindex[y]->flags & AF_SELECTED) {
1451 pAD->selected++;
1452 pAD->ullSelectedBytes += pAD->afindex[y]->cbFile;
1453 pAD->afindex[y]->flags |= AF_SELECTED;
1454 }
1455 }
1456 else if (command == AFM_INVERT) {
1457 if (pAD->afindex[y]->flags & AF_SELECTED) {
1458 pAD->selected--;
1459 pAD->ullSelectedBytes -= pAD->afindex[y]->cbFile;
1460 pAD->afindex[y]->flags &= ~AF_SELECTED;
1461 }
1462 else {
1463 pAD->selected++;
1464 pAD->ullSelectedBytes += pAD->afindex[y]->cbFile;
1465 pAD->afindex[y]->flags |= AF_SELECTED;
1466 }
1467 }
1468 else if (command == AFM_MARKDELETED) {
1469 if (pAD->afindex[y]->flags & AF_SELECTED)
1470 pAD->afindex[y]->flags |= AF_DELETED;
1471 }
1472 else if (command == AFM_FILTER) {
1473 if (pAD->afindex[y]->flags & AF_SELECTED)
1474 pAD->afindex[y]->flags |= AF_FILTERED;
1475 }
1476 }
1477 } // for x
1478 return didone;
1479}
1480
1481static BOOL UpdateList(HWND hwnd, CHAR **list)
1482{
1483 /* Updates files in the list */
1484
1485 ALLDATA *ad = WinQueryWindowPtr(hwnd, QWL_USER);
1486 ULONG x, z;
1487 BOOL ret, didone = FALSE;
1488 FILEFINDBUF3L ffb;
1489 ULONG ulFindCnt;
1490 HDIR hdir;
1491 CHAR *p;
1492
1493 if (list) {
1494 for (z = 0; list[z] && !ad->stopflag; z++) {
1495 ret = FALSE;
1496 for (x = 0; x < ad->afheadcnt; x++) {
1497 if (!stricmp(list[z], ad->afhead[x].fullname)) {
1498 ret = TRUE;
1499 break;
1500 }
1501 }
1502 if (ret) {
1503 didone = TRUE;
1504 hdir = HDIR_CREATE;
1505 ulFindCnt = 1;
1506 if (!xDosFindFirst(list[z], &hdir, FILE_NORMAL | FILE_ARCHIVED |
1507 FILE_DIRECTORY | FILE_READONLY | FILE_SYSTEM |
1508 FILE_HIDDEN, &ffb, sizeof(ffb), &ulFindCnt,
1509 FIL_STANDARDL)) {
1510 DosFindClose(hdir);
1511 if (!(ffb.attrFile & FILE_DIRECTORY)) {
1512 ad->afhead[x].attrFile = (USHORT) ffb.attrFile;
1513 ad->afhead[x].cbFile = ffb.cbFile;
1514 ad->afhead[x].date = ffb.fdateLastWrite;
1515 ad->afhead[x].time = ffb.ftimeLastWrite;
1516 }
1517 else
1518 ad->afhead[x].flags |= AF_DELETED;
1519 }
1520 else
1521 ad->afhead[x].flags |= AF_DELETED;
1522 }
1523 else if (isalpha(*list[z]) && ad->abDrvFlags[toupper(*list[z]) - 'A']) {
1524 didone = TRUE;
1525 hdir = HDIR_CREATE;
1526 ulFindCnt = 1;
1527 if (!xDosFindFirst(list[z], &hdir, FILE_NORMAL | FILE_ARCHIVED |
1528 FILE_DIRECTORY | FILE_READONLY | FILE_SYSTEM |
1529 FILE_HIDDEN, &ffb, sizeof(ffb), &ulFindCnt,
1530 FIL_STANDARDL)) {
1531 DosFindClose(hdir);
1532 if (!(ffb.attrFile & FILE_DIRECTORY)) {
1533 if (!ad->afalloc || ad->afheadcnt > ad->afalloc - 1) {
1534
1535 ALLFILES *temp, **templ;
1536
1537 temp =
1538 xrealloc(ad->afhead, (ad->afalloc + 1) * sizeof(ALLFILES),
1539 pszSrcFile, __LINE__);
1540 if (!temp) {
1541 ad->stopflag = 1;
1542 break;
1543 }
1544 else {
1545 ad->afhead = temp;
1546 templ =
1547 xrealloc(ad->afindex,
1548 (ad->afalloc + 1) * sizeof(ALLFILES *), pszSrcFile,
1549 __LINE__);
1550 if (!templ) {
1551 ad->stopflag = 1;
1552 break;
1553 }
1554 else
1555 ad->afindex = templ;
1556 ad->afalloc++;
1557 }
1558 }
1559 ad->afhead[ad->afheadcnt].fullname =
1560 xstrdup(list[z], pszSrcFile, __LINE__);
1561 if (ad->afhead[ad->afheadcnt].fullname) {
1562 p = strrchr(ad->afhead[ad->afheadcnt].fullname, '\\');
1563 if (!p)
1564 p = ad->afhead[ad->afheadcnt].fullname;
1565 else
1566 p++;
1567 ad->afhead[ad->afheadcnt].filename = p;
1568 ad->afhead[ad->afheadcnt].cbFile = ffb.cbFile;
1569 ad->afhead[ad->afheadcnt].date = ffb.fdateLastWrite;
1570 ad->afhead[ad->afheadcnt].time = ffb.ftimeLastWrite;
1571 ad->afhead[ad->afheadcnt].attrFile = (USHORT) ffb.attrFile;
1572 ad->afhead[ad->afheadcnt].flags = 0;
1573 if (ad->longest < strlen(ad->afhead[ad->afheadcnt].filename))
1574 ad->longest = strlen(ad->afhead[ad->afheadcnt].filename);
1575 if (ad->longestw < strlen(ad->afhead[ad->afheadcnt].fullname))
1576 ad->longestw = strlen(ad->afhead[ad->afheadcnt].fullname);
1577
1578 ad->afheadcnt++;
1579 }
1580 else {
1581 // saymsg(MB_ENTER,HWND_DESKTOP,DEBUG_STRING,"Strdup failed.");
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 "One or more of your files has a full path name that exceeds the OS/2 maximum");
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, FIXED_FONT_LCID, &ad->fattrs);
2289 GpiSetCharSet(hps, FIXED_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, FIXED_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, FIXED_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, FIXED_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.