source: trunk/dll/seeall.c@ 1391

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

Move nontranslated strings to init.c and codepage.c; use those strings in place of GetPString calls. Move other strings to a StringTable; minor cleanup and code changes to codepage.c to use a string array instead of GetPString calls. Ticket 340

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