source: trunk/dll/seeall.c@ 1395

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

Allow user to turn off alert and/or error beeps in settings notebook. Ticket 341 Move repeated strings to PCSZs. Ticket 6 Add *DateFormat functions to format dates based on locale Ticket 28 Eliminate Win_Error2 by moving function names to PCSZs used in Win_Error Ticket 6

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