source: trunk/dll/seeall.c@ 1878

Last change on this file since 1878 was 1877, checked in by Gregg Young, 10 years ago

Remove debug code

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