source: trunk/dll/seeall.c@ 1394

Last change on this file since 1394 was 1394, checked in by Steven Levine, 17 years ago

Ticket 340: Convert GetPString to use STRINGTABLE.

Drop fm3dll.str and mkstr.exe from makefiles and wpi builders

Convert many functions to expect PCSZ arguments.
Correct walk, compare and dirsizes dialog setups to ignore saved dialog size
Drop copyright.c logic from makefile

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