source: trunk/dll/seeall.c@ 1846

Last change on this file since 1846 was 1846, checked in by John Small, 10 years ago

Ticket #524: Ensure no "highmem-unsafe" functions are called directly
Calls to unsafe Dos... functions have been changed to call the wrapped xDos... functions.

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