source: trunk/dll/seeall.c@ 1712

Last change on this file since 1712 was 1712, checked in by Gregg Young, 12 years ago

Added comments

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