source: trunk/dll/seeall.c@ 1358

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

Comments for CS 1354/55

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