source: trunk/dll/seeall.c@ 1846

Last change on this file since 1846 was 1846, checked in by John Small, 10 years ago

Ticket #524: Ensure no "highmem-unsafe" functions are called directly
Calls to unsafe Dos... functions have been changed to call the wrapped xDos... functions.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 124.3 KB
RevLine 
[36]1
2/***********************************************************************
3
4 $Id: seeall.c 1846 2015-08-12 20:31:54Z jbs $
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.
[1846]66 12 Aug 15 JBS Ticket #524: Ensure no "highmem-unsafe" functions are called directly
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 // DbgMsg(pszSrcFile, __LINE__, "FindAllThread requesting hmtxScan");
2157 apiret = DosRequestMutexSem(ad->hmtxScan, SEM_INDEFINITE_WAIT);
2158 if (apiret != NO_ERROR)
2159 Dos_Error(MB_CANCEL, apiret, hwnd, pszSrcFile, __LINE__, "DosRequestMutexSem");
2160 else {
[2]2161 priority_normal();
2162 hab2 = WinInitialize(0);
[1559]2163
[551]2164 if (hab2) {
2165 hmq2 = WinCreateMsgQueue(hab2, 0);
2166 if (hmq2) {
[1335]2167 WinCancelShutdown(hmq2, TRUE);
2168 IncrThreadUsage();
2169 if (!*ad->szFindPath) {
2170 DosError(FERR_DISABLEHARDERR);
2171 if (!DosQCurDisk(&ulDriveNum, &ulDriveMap)) {
2172 for (x = 2; x < 26 && !ad->stopflag; x++) {
2173 if ((ulDriveMap & (1 << x)) && ad->abDrvFlags[x]) {
2174 *startname = (CHAR) (x + 'A');
2175 DoADir(hwnd, startname);
[1559]2176 if (ad->stopflag)
2177 break;
[1335]2178 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
2179 DosSleep(0); //26 Aug 07 GKY 1
2180 }
[1559]2181 } // for
[1335]2182 }
2183 }
2184 else
2185 DoADir(hwnd, ad->szFindPath);
[1559]2186
[1335]2187 DosPostEventSem(CompactSem);
[2]2188 }
2189 }
2190
[1559]2191 if (!ad->stopflag) {
2192 if (ad->afalloc != ad->afheadcnt) {
[2]2193
[1559]2194 ALLFILES *tempa, **templ;
2195
2196 tempa =
2197 xrealloc(ad->afhead, sizeof(ALLFILES) * ad->afheadcnt, pszSrcFile,
2198 __LINE__);
2199 if (tempa) {
2200 ad->afhead = tempa;
2201 ad->afalloc = ad->afheadcnt;
2202 }
2203 templ =
2204 xrealloc(ad->afindex, sizeof(ALLFILES *) * ad->afheadcnt, pszSrcFile,
2205 __LINE__);
2206 if (templ)
2207 ad->afindex = templ;
2208 DosPostEventSem(CompactSem);
[2]2209 }
[766]2210 PostMsg(hwnd, UM_RESCAN, MPFROMLONG(1), MPVOID);
[2]2211 ReSort(hwnd);
2212 }
[1559]2213
2214 // DbgMsg(pszSrcFile, __LINE__, "FindAllThread releasing hmtxScan");
[162]2215 DosReleaseMutexSem(ad->hmtxScan);
[2]2216 }
[1559]2217
[551]2218 if (hmq2) {
2219 PostMsg(hwnd, UM_CONTAINER_FILLED, MPVOID, MPVOID);
[2]2220 WinDestroyMsgQueue(hmq2);
[533]2221 }
[1559]2222
[551]2223 if (hab2) {
[533]2224 DecrThreadUsage();
[2]2225 WinTerminate(hab2);
[533]2226 }
[1559]2227
[1038]2228# ifdef FORTIFY
[1063]2229 Fortify_LeaveScope();
2230# endif
[2]2231}
2232
[551]2233MRESULT EXPENTRY AFDrvsWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[162]2234{
[551]2235 switch (msg) {
2236 case WM_INITDLG:
2237 if (mp2) {
[2]2238
[551]2239 ULONG ulDriveNum, ulDriveMap, x;
2240 CHAR startname[] = " :";
2241 SHORT sSelect;
2242 ALLDATA *ad;
[2]2243
[551]2244 ad = (ALLDATA *) mp2;
2245 WinSetWindowPtr(hwnd, QWL_USER, mp2);
2246 DosError(FERR_DISABLEHARDERR);
2247 if (!DosQCurDisk(&ulDriveNum, &ulDriveMap)) {
[1335]2248 for (x = 2; x < 26 && !ad->stopflag; x++) {
2249 if (!(driveflags[x] & (DRIVE_IGNORE | DRIVE_INVALID))) {
2250 if (ulDriveMap & (1 << x)) {
2251 *startname = (CHAR) (x + 'A');
2252 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, DRVS_LISTBOX,
2253 LM_INSERTITEM,
2254 MPFROM2SHORT(LIT_END, 0),
2255 MPFROMP(startname));
2256 if (sSelect >= 0 && ad->abDrvFlags[x])
2257 WinSendDlgItemMsg(hwnd, DRVS_LISTBOX, LM_SELECTITEM,
2258 MPFROM2SHORT(sSelect, 0), MPFROMLONG(TRUE));
2259 }
2260 }
2261 }
[2]2262 }
[551]2263 }
2264 else
2265 WinDismissDlg(hwnd, 0);
2266 break;
[2]2267
[551]2268 case WM_CONTROL:
2269 switch (SHORT1FROMMP(mp1)) {
2270 case DRVS_LISTBOX:
2271 switch (SHORT2FROMMP(mp1)) {
2272 case LN_ENTER:
[1335]2273 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(DID_OK, 0), MPVOID);
2274 break;
[2]2275 }
[551]2276 break;
2277 }
2278 return 0;
[2]2279
[551]2280 case WM_COMMAND:
2281 switch (SHORT1FROMMP(mp1)) {
2282 case DID_OK:
2283 {
[1335]2284 INT x;
2285 SHORT sSelect;
2286 CHAR filename[3];
2287 ALLDATA *ad = WinQueryWindowPtr(hwnd, QWL_USER);
[2]2288
[1335]2289 memset(ad->abDrvFlags, 0, sizeof(ad->abDrvFlags));
2290 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, DRVS_LISTBOX,
2291 LM_QUERYSELECTION,
2292 MPFROM2SHORT(LIT_FIRST, 0),
2293 MPVOID);
2294 while (sSelect >= 0) {
2295 *filename = 0;
2296 if (WinSendDlgItemMsg(hwnd, DRVS_LISTBOX, LM_QUERYITEMTEXT,
2297 MPFROM2SHORT(sSelect, 2),
2298 MPFROMP(filename)) && *filename)
2299 ad->abDrvFlags[*filename - 'A'] = 1;
2300 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, DRVS_LISTBOX,
2301 LM_QUERYSELECTION,
2302 MPFROM2SHORT(sSelect, 0),
2303 MPVOID);
2304 }
2305 for (x = 2; x < 26; x++) {
2306 if (ad->abDrvFlags[x]) {
2307 WinDismissDlg(hwnd, 1);
2308 return 0;
2309 }
2310 }
[551]2311 }
2312 WinDismissDlg(hwnd, 0);
2313 break;
[2]2314
[551]2315 case IDM_HELP:
2316 if (hwndHelp)
[1335]2317 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
2318 MPFROM2SHORT(HELP_DRVSWND, 0), MPFROMSHORT(HM_RESOURCEID));
[551]2319 break;
[2]2320
[551]2321 case DID_CANCEL:
2322 WinDismissDlg(hwnd, 0);
2323 break;
2324 }
2325 return 0;
[2]2326 }
[551]2327 return WinDefDlgProc(hwnd, msg, mp1, mp2);
[2]2328}
2329
[551]2330static HPS InitWindow(HWND hwnd)
[162]2331{
[551]2332 ALLDATA *ad = WinQueryWindowPtr(hwnd, QWL_USER);
2333 HPS hps = (HPS) 0;
2334 SIZEL sizel;
2335 FONTMETRICS FontMetrics;
[2]2336
[551]2337 if (ad) {
[2]2338 sizel.cx = sizel.cy = 0;
[551]2339 hps = GpiCreatePS(WinQueryAnchorBlock(hwnd), WinOpenWindowDC(hwnd),
[1335]2340 (PSIZEL) & sizel, PU_PELS | GPIF_DEFAULT | GPIT_MICRO |
2341 GPIA_ASSOC);
[551]2342 if (hps) {
2343 GpiSetCp(hps, (ULONG) ad->fattrs.usCodePage);
[1433]2344 GpiCreateLogFont(hps, NULL, SEEALLFILECNR_FONT_LCID, &ad->fattrs);
2345 GpiSetCharSet(hps, SEEALLFILECNR_FONT_LCID);
[551]2346 GpiQueryFontMetrics(hps, sizeof(FontMetrics), &FontMetrics);
2347 ad->fattrs.lAveCharWidth = FontMetrics.lAveCharWidth;
[2]2348 ad->fattrs.lMaxBaselineExt = FontMetrics.lMaxBaselineExt;
[551]2349 ad->lMaxAscender = max(FontMetrics.lMaxAscender, 0);
2350 ad->lMaxDescender = max(FontMetrics.lMaxDescender, 0);
[2]2351 ad->lMaxHeight = ad->lMaxDescender + ad->lMaxAscender;
[551]2352 if (ad->fattrs.usCodePage != FontMetrics.usCodePage) {
[1335]2353 ad->fattrs.usCodePage = FontMetrics.usCodePage;
2354 Codepage = ad->fattrs.usCodePage;
2355 PrfWriteProfileData(fmprof,
2356 appname,
2357 "Seeall.Codepage",
2358 &ad->fattrs.usCodePage, sizeof(USHORT));
[2]2359 }
[551]2360 else if (ad->fattrs.usCodePage) {
[2]2361
[1335]2362 HMQ hmq;
2363 ULONG cps[50], len, x;
[2]2364
[1335]2365 if (!DosQueryCp(sizeof(cps), cps, &len)) {
2366 for (x = 0; x < len / sizeof(ULONG); x++) {
2367 if (cps[x] == (ULONG) ad->fattrs.usCodePage) {
2368 hmq = WinQueryWindowULong(hwnd, QWL_HMQ);
2369 WinSetCp(hmq, ad->fattrs.usCodePage);
2370 break;
2371 }
2372 }
2373 }
2374 DosSetProcessCp((ULONG) ad->fattrs.usCodePage);
[2]2375 }
[551]2376 GpiSetBackMix(hps, BM_OVERPAINT);
[2]2377 }
2378 }
2379 return (hps);
2380}
2381
[551]2382static VOID PaintLine(HWND hwnd, HPS hps, ULONG whichfile, ULONG topfile,
[1335]2383 RECTL * Rectl)
[551]2384{
2385 ALLDATA *ad = WinQueryWindowPtr(hwnd, QWL_USER);
2386 POINTL ptl;
[1397]2387 CHAR szBuff[CCHMAXPATH + 80], szCmmaFmtFileSize[81], szDate[DATE_BUF_BYTES];
[551]2388 ULONG len, y;
[2]2389
[943]2390 y = (ad->invertsort) ? (ad->afindexcnt - 1) - whichfile : whichfile;
[2]2391 ptl.y = (Rectl->yTop -
[1335]2392 (ad->lMaxHeight * (((whichfile + 1) - topfile) + 1)));
[2]2393 ptl.x = ad->horzscroll;
[943]2394 if (ptl.y < Rectl->yBottom || ptl.y > Rectl->yTop || y > ad->afindexcnt)
[2]2395 return;
[551]2396 GpiSetBackMix(hps, BM_OVERPAINT);
2397 if (ad->afindex[y]->flags & AF_SELECTED) {
2398 GpiSetColor(hps, standardcolors[Colors[COLORS_SELECTEDNORMALFORE]]);
2399 GpiSetBackColor(hps, (whichfile == ad->cursored - 1) ?
[1335]2400 standardcolors[Colors[COLORS_CURSOREDSELECTEDBACK]] :
2401 standardcolors[Colors[COLORS_SELECTEDBACK]]);
[2]2402 }
2403 else {
2404 GpiSetColor(hps,
[1335]2405 ((ad->afindex[y]->attrFile & (FILE_SYSTEM | FILE_HIDDEN)) !=
2406 0) ? standardcolors[Colors[COLORS_SYSTEMFORE]] : ((ad->
2407 afindex
2408 [y]->
2409 attrFile &
2410 FILE_READONLY)
2411 !=
2412 0) ?
2413 standardcolors[Colors[COLORS_READONLYFORE]] :
2414 standardcolors[Colors[COLORS_NORMALFORE]]);
[551]2415 GpiSetBackColor(hps,
[1335]2416 (whichfile ==
2417 ad->cursored -
2418 1) ? standardcolors[Colors[COLORS_CURSOREDNORMALBACK]] :
2419 standardcolors[Colors[COLORS_NORMALBACK]]);
[2]2420 }
[897]2421 CommaFmtULL(szCmmaFmtFileSize,
[1559]2422 sizeof(szCmmaFmtFileSize), ad->afindex[y]->cbFile, ' ');
[1395]2423 FDateFormat(szDate, ad->afindex[y]->date);
[2]2424 len = sprintf(szBuff,
[1395]2425 "%c%-*.*s %-12s %c%c%c%c%c %s %02u%s%02u%s%02u ",
[1335]2426 whichfile == ad->cursored - 1 ? '>' : ' ',
2427 ad->fullnames ? ad->longestw : ad->longest,
2428 ad->fullnames ? ad->longestw : ad->longest,
2429 ad->fullnames ? ad->afindex[y]->fullname :
2430 ad->afindex[y]->filename,
2431 szCmmaFmtFileSize,
2432 "-A"[((ad->afindex[y]->attrFile & FILE_ARCHIVED) != 0)],
2433 "-R"[((ad->afindex[y]->attrFile & FILE_READONLY) != 0)],
2434 "-H"[((ad->afindex[y]->attrFile & FILE_HIDDEN) != 0)],
2435 "-S"[((ad->afindex[y]->attrFile & FILE_SYSTEM) != 0)],
2436 "-D"[((ad->afindex[y]->attrFile & FILE_DIRECTORY) != 0)],
[1559]2437 szDate,
[1395]2438 ad->afindex[y]->time.hours, TimeSeparator,
2439 ad->afindex[y]->time.minutes, TimeSeparator,
[1335]2440 ad->afindex[y]->time.twosecs * 2);
[551]2441 GpiCharStringAt(hps, &ptl, len, szBuff);
2442 GpiQueryCurrentPosition(hps, &ptl);
2443 if (ptl.x + abs(ad->horzscroll) > ad->maxx) {
[2]2444 ad->maxx = ptl.x + abs(ad->horzscroll);
[551]2445 WinSendMsg(ad->hhscroll, SBM_SETTHUMBSIZE,
[1335]2446 MPFROM2SHORT((SHORT) Rectl->xRight, (SHORT) ad->maxx), MPVOID);
[2]2447 }
2448}
2449
[551]2450MRESULT EXPENTRY SeeStatusProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[162]2451{
[551]2452 switch (msg) {
2453 case WM_CREATE:
2454 return CommonTextProc(hwnd, msg, mp1, mp2);
[2]2455
[551]2456 case WM_SETFOCUS:
2457 if (mp2)
2458 PostMsg(hwnd, UM_FOCUSME, MPVOID, MPVOID);
2459 break;
[2]2460
[551]2461 case WM_PAINT:
2462 {
2463 SWP swp;
2464 POINTL ptl;
2465 HPS hps;
[2]2466
[551]2467 PaintRecessedWindow(hwnd, (HPS) 0, FALSE, FALSE);
2468 hps = WinGetPS(WinQueryWindow(hwnd, QW_PARENT));
2469 if (hps) {
[1335]2470 WinQueryWindowPos(hwnd, &swp);
2471 ptl.x = swp.x - 1;
2472 ptl.y = swp.y + swp.cy + 2;
2473 GpiMove(hps, &ptl);
2474 GpiSetColor(hps, CLR_WHITE);
2475 ptl.x = swp.x + swp.cx;
2476 GpiLine(hps, &ptl);
2477 WinReleasePS(hps);
[2]2478 }
[551]2479 }
2480 break;
[2]2481
[551]2482 case UM_FOCUSME:
2483 WinSetFocus(HWND_DESKTOP, WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
[1335]2484 FID_CLIENT));
[551]2485 return 0;
[2]2486 }
[551]2487 return PFNWPStatic(hwnd, msg, mp1, mp2);
[2]2488}
2489
[551]2490MRESULT EXPENTRY SeeFrameWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[162]2491{
[551]2492 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
[2]2493
[551]2494 switch (msg) {
2495 case WM_BUTTON1UP:
2496 case WM_BUTTON2UP:
2497 case WM_BUTTON3UP:
2498 case WM_MOUSEMOVE:
2499 case WM_CHORD:
2500 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
2501 break;
[2]2502
[551]2503 case WM_CHAR:
2504 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
2505 break;
[2]2506
[551]2507 case WM_CALCFRAMERECT:
2508 {
2509 MRESULT mr;
2510 PRECTL prectl;
[2]2511
[551]2512 mr = oldproc(hwnd, msg, mp1, mp2);
[2]2513
[1673]2514 /**
[551]2515 * Calculate the position of the client rectangle.
2516 * Otherwise, we'll see a lot of redraw when we move the
2517 * client during WM_FORMATFRAME.
2518 */
[2]2519
[551]2520 if (mr && mp2) {
[1335]2521 prectl = (PRECTL) mp1;
2522 prectl->yBottom += 22;
2523 prectl->yTop -= 24;
[2]2524 }
[551]2525 return mr;
2526 }
[2]2527
[551]2528 case WM_FORMATFRAME:
2529 {
2530 SHORT sCount;
2531 PSWP pswp, pswpClient, pswpNew;
[2]2532
[551]2533 sCount = (SHORT) oldproc(hwnd, msg, mp1, mp2);
[2]2534
[1673]2535 /**
[551]2536 * Reformat the frame to "squeeze" the client
2537 * and make room for status window sibling beneath
2538 */
[2]2539
[551]2540 pswp = (PSWP) mp1;
2541 {
[1335]2542 SHORT x;
[2]2543
[1335]2544 for (x = 0; x < sCount; x++) {
2545 if (WinQueryWindowUShort(pswp->hwnd, QWS_ID) == FID_CLIENT) {
2546 pswpClient = pswp;
2547 break;
2548 }
2549 pswp++;
2550 }
[2]2551 }
[551]2552 pswpNew = (PSWP) mp1 + sCount;
2553 *pswpNew = *pswpClient;
2554 pswpNew->hwnd = WinWindowFromID(hwnd, SEEALL_STATUS);
2555 pswpNew->x = pswpClient->x + 2;
2556 pswpNew->y = pswpClient->y + 2;
2557 pswpNew->cx = pswpClient->cx - 3;
2558 pswpNew->cy = 20;
2559 pswpClient->y = pswpNew->y + pswpNew->cy + 3;
2560 pswpClient->cy = (pswpClient->cy - pswpNew->cy) - 5;
2561 sCount++;
2562 return MRFROMSHORT(sCount);
2563 }
[2]2564
[551]2565 case WM_QUERYFRAMECTLCOUNT:
2566 {
2567 SHORT sCount;
[2]2568
[551]2569 sCount = (SHORT) oldproc(hwnd, msg, mp1, mp2);
2570 sCount++;
2571 return MRFROMSHORT(sCount);
2572 }
[2]2573 }
[551]2574 return oldproc(hwnd, msg, mp1, mp2);
[2]2575}
2576
[551]2577MRESULT EXPENTRY SeeAllWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[162]2578{
[551]2579 ALLDATA *pAD = WinQueryWindowPtr(hwnd, QWL_USER);
[1559]2580 APIRET apiret;
[2]2581
2582 switch (msg) {
[551]2583 case WM_CREATE:
[1559]2584 // DbgMsg(pszSrcFile, __LINE__, "SeeAllWndProc WM_CREATE");
[551]2585 WinSetWindowPtr(hwnd, QWL_USER, NULL);
[1063]2586# ifdef FORTIFY
2587 Fortify_EnterScope();
2588# endif
[551]2589 pAD = xmallocz(sizeof(ALLDATA), pszSrcFile, __LINE__);
2590 if (pAD) {
2591 HWND hwndFrame;
2592
2593 pAD->size = sizeof(ALLDATA);
2594 hwndFrame = WinQueryWindow(hwnd, QW_PARENT);
2595 pAD->hwndFrame = hwndFrame;
2596 pAD->mask.attrFile = FILE_READONLY | FILE_HIDDEN |
[1335]2597 FILE_SYSTEM | FILE_ARCHIVED;
[551]2598 pAD->mask.fNoDirs = TRUE;
2599 *(pAD->mask.prompt) = 0;
2600 WinSetWindowPtr(hwnd, QWL_USER, (PVOID) pAD);
2601 pAD->pfnCompare = comparenames;
2602 if (Firsttime) {
2603
[1335]2604 ULONG size;
[551]2605
[1335]2606 size = sizeof(USHORT);
2607 PrfQueryProfileData(fmprof,
2608 appname,
2609 "Seeall.Codepage", (PVOID) & Codepage, &size);
2610 size = sizeof(BOOL);
2611 PrfQueryProfileData(fmprof,
2612 appname,
2613 "Seeall.Fullnames", (PVOID) & Fullnames, &size);
2614 size = sizeof(USHORT);
2615 PrfQueryProfileData(fmprof,
2616 appname,
2617 "Seeall.Sort", (PVOID) & SortType, &size);
2618 size = sizeof(BOOL);
2619 PrfQueryProfileData(fmprof,
2620 appname,
2621 "Seeall.SortReverse",
2622 (PVOID) & SortReverse, &size);
2623 memset(&Fattrs, 0, sizeof(Fattrs));
2624 size = sizeof(Fattrs);
2625 Fattrs.usRecordLength = sizeof(Fattrs);
2626 Fattrs.lMaxBaselineExt = 16;
2627 Fattrs.lAveCharWidth = 8;
2628 Fattrs.usCodePage = Codepage;
2629 strcpy(Fattrs.szFacename, GetPString(IDS_SYSMONOTEXT));
2630 PrfQueryProfileData(fmprof,
2631 appname,
2632 "Seeall.Fattrs", (PVOID) & Fattrs, &size);
2633 size = sizeof(LONG) * COLORS_MAX;
2634 PrfQueryProfileData(fmprof,
2635 appname, "Seeall.Colors", (PVOID) Colors, &size);
2636 Firsttime = FALSE;
[551]2637 }
2638 switch (SortType) {
2639 case IDM_SORTEASIZE:
[1335]2640 pAD->pfnCompare = (PFNSORT) NULL;
2641 break;
[551]2642 case IDM_SORTNAME:
[1335]2643 pAD->pfnCompare = comparefullnames;
2644 break;
[551]2645 case IDM_SORTFILENAME:
[1335]2646 pAD->pfnCompare = comparenames;
2647 break;
[551]2648 case IDM_SORTSIZE:
[1335]2649 pAD->pfnCompare = comparesizes;
2650 break;
[551]2651 case IDM_SORTLWDATE:
[1335]2652 pAD->pfnCompare = comparedates;
2653 break;
[551]2654 case IDM_SORTFIRST:
[1335]2655 pAD->pfnCompare = compareexts;
2656 break;
[551]2657 }
2658 pAD->invertsort = SortReverse;
2659 pAD->fattrs = Fattrs;
2660 pAD->fullnames = Fullnames;
2661 pAD->stopflag = 0;
2662 pAD->cursored = pAD->topfile = 1;
2663 pAD->fattrs.usCodePage = Codepage;
2664 memcpy(pAD->aulColors, Colors, sizeof(LONG) * COLORS_MAX);
2665 pAD->hwndMenu = WinWindowFromID(hwndFrame, FID_MENU);
2666 SetConditionalCascade(pAD->hwndMenu, IDM_DELETESUBMENU,
[1335]2667 (fDefaultDeletePerm) ?
2668 IDM_PERMDELETE : IDM_DELETE);
[551]2669 SetConditionalCascade(pAD->hwndMenu, IDM_MOVEMENU, IDM_MOVE);
2670 SetConditionalCascade(pAD->hwndMenu, IDM_COPYMENU, IDM_COPY);
2671 SetConditionalCascade(pAD->hwndMenu, IDM_OPENSUBMENU, IDM_OPENDEFAULT);
2672 SetConditionalCascade(pAD->hwndMenu, IDM_OBJECTSUBMENU, IDM_SHADOW);
2673 if (fWorkPlace) {
[1335]2674 WinSendMsg(pAD->hwndMenu, MM_DELETEITEM,
2675 MPFROM2SHORT(IDM_OPENSUBMENU, TRUE), MPVOID);
2676 WinSendMsg(pAD->hwndMenu, MM_DELETEITEM,
2677 MPFROM2SHORT(IDM_OBJECTSUBMENU, TRUE), MPVOID);
[551]2678 }
2679 pAD->hwndClient = hwnd;
2680 pAD->hps = InitWindow(hwnd);
2681 pAD->hvscroll = WinWindowFromID(hwndFrame, FID_VERTSCROLL);
2682 pAD->hhscroll = WinWindowFromID(hwndFrame, FID_HORZSCROLL);
2683 pAD->multiplier = 1;
[1335]2684 if (xbeginthread(MakeSeeObjWinThread,
2685 122880,
2686 pAD,
2687 pszSrcFile,
2688 __LINE__) != -1)
2689 {
2690 if (!DosCreateMutexSem(NULL, &pAD->hmtxScan, 0, FALSE)) {
2691 pAD->hwndStatus = WinCreateWindow(hwndFrame,
[1498]2692 (CHAR *) WC_SEESTATUS,
[1335]2693 NullStr,
2694 WS_VISIBLE | SS_TEXT |
2695 DT_LEFT | DT_VCENTER,
2696 0,
2697 0,
2698 0,
2699 0,
2700 hwndFrame,
2701 HWND_TOP,
2702 SEEALL_STATUS, NULL, NULL);
2703 if (!pAD->hwndStatus)
[1395]2704 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
2705 PCSZ_WINCREATEWINDOW);
[1335]2706 else {
2707 PFNWP oldproc;
[2]2708
[1335]2709 oldproc = WinSubclassWindow(hwndFrame, SeeFrameWndProc);
2710 WinSetWindowPtr(hwndFrame, QWL_USER, (PVOID) oldproc);
2711 }
2712 break;
2713 }
[2]2714 }
[551]2715 }
2716 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
2717 break;
[2]2718
[551]2719 case UM_SETUP5:
[1559]2720 // DbgMsg(pszSrcFile, __LINE__, "SeeAllWndProc UM_SETUP5");
[551]2721 if (pAD) {
[1009]2722 if (mp1 && *((CHAR *)mp1))
[1335]2723 strcpy(pAD->szFindPath, (CHAR *)mp1);
[551]2724 else {
[1335]2725 if (!WinDlgBox(HWND_DESKTOP, hwnd, AFDrvsWndProc,
2726 FM3ModHandle, DRVS_FRAME, (PVOID) pAD)) {
2727 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
2728 return 0;
2729 }
[2]2730 }
[1335]2731 if (xbeginthread(FindAllThread,
2732 524288,
2733 (PVOID)hwnd,
2734 pszSrcFile,
2735 __LINE__) == -1)
2736 {
2737 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
[551]2738 }
2739 else {
[1335]2740 DosSleep(50);//05 Aug 07 GKY 100
2741 PostMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
2742 PostMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
[551]2743 }
2744 }
2745 else
2746 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
2747 return 0;
[2]2748
[551]2749 case UM_UPDATERECORDLIST:
2750 if (mp1) {
[2]2751
[551]2752 APIRET rc;
[2]2753
[551]2754 rc = DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN);
2755 if (!rc) {
[1335]2756 WinSetPointer(HWND_DESKTOP, hptrBusy);
2757 if (UpdateList(hwnd, mp1)) {
2758 FreeList(mp1);
2759 RemoveDeleted(hwnd);
2760 ReSort(hwnd);
2761 WinInvalidateRect(hwnd, NULL, FALSE);
2762 }
2763 DosReleaseMutexSem(pAD->hmtxScan);
2764 WinSetPointer(HWND_DESKTOP, hptrArrow);
[2]2765 }
[551]2766 }
2767 return 0;
[2]2768
[551]2769 case UM_SETUP2:
[1559]2770 // DbgMsg(pszSrcFile, __LINE__, "SeeAllWndProc UM_SETUP2");
[551]2771 if (pAD) {
[2]2772
[551]2773 CHAR s[256];
2774 BOOL once = FALSE;
2775 ULONG x, ulDriveNum, ulDriveMap;
[2]2776
[551]2777 strcpy(s, GetPString(IDS_SEEALLTITLETEXT));
2778 if (!*pAD->szFindPath) {
[1335]2779 DosError(FERR_DISABLEHARDERR);
2780 if (!DosQCurDisk(&ulDriveNum, &ulDriveMap)) {
2781 for (x = 2; x < 26 && !pAD->stopflag; x++) {
2782 if ((ulDriveMap & (1 << x)) && pAD->abDrvFlags[x]) {
2783 sprintf(&s[strlen(s)], "%s%c:", (once) ? ", " : " (", x + 'A');
2784 once = TRUE;
2785 }
2786 }
2787 if (once)
2788 strcat(s, ")");
2789 }
[2]2790 }
[551]2791 else {
[1335]2792 strcat(s, " (");
2793 strcat(s, pAD->szFindPath);
2794 strcat(s, ")");
[551]2795 }
2796 WinSetWindowText(WinQueryWindow(hwnd, QW_PARENT), s);
2797 }
2798 return 0;
[2]2799
[551]2800 case UM_SETUP3:
[1559]2801 // DbgMsg(pszSrcFile, __LINE__, "SeeAllWndProc UM_SETUP3");
[551]2802 if (pAD) {
[943]2803 pAD->multiplier = pAD->afindexcnt / 32767;
2804 if (pAD->multiplier * 32767 != pAD->afindexcnt)
[1335]2805 pAD->multiplier++;
[551]2806 if (!pAD->multiplier)
[1335]2807 pAD->multiplier++;
[551]2808 {
[1335]2809 RECTL Rectl;
2810 ULONG numlines;
[2]2811
[1335]2812 WinQueryWindowRect(hwnd, &Rectl);
2813 numlines = NumLines(&Rectl, pAD);
2814 if (numlines) {
2815 WinSendMsg(pAD->hhscroll, SBM_SETTHUMBSIZE,
2816 MPFROM2SHORT((SHORT) Rectl.xRight, (SHORT) pAD->maxx),
2817 MPVOID);
2818 WinSendMsg(pAD->hvscroll, SBM_SETTHUMBSIZE,
2819 MPFROM2SHORT((SHORT) numlines,
2820 (SHORT) min(pAD->afindexcnt, 32767)),
2821 MPFROM2SHORT(1, pAD->afindexcnt + 1));
2822 WinSendMsg(pAD->hhscroll, SBM_SETSCROLLBAR,
2823 MPFROMSHORT((SHORT) abs(pAD->horzscroll)),
2824 MPFROM2SHORT(0, (SHORT) (pAD->maxx - Rectl.xRight)));
2825 WinSendMsg(pAD->hvscroll, SBM_SETSCROLLBAR,
2826 MPFROMSHORT((SHORT) (pAD->topfile / pAD->multiplier)),
2827 MPFROM2SHORT(1,
2828 (SHORT) (pAD->afindexcnt / pAD->multiplier) -
2829 (numlines - 1)));
2830 if (pAD->afindexcnt - pAD->topfile < numlines) {
2831 pAD->topfile = ((pAD->afindexcnt - pAD->topfile) - numlines);
2832 WinInvalidateRect(hwnd, NULL, FALSE);
2833 }
2834 }
[2]2835 }
[551]2836 }
2837 return 0;
[2]2838
[551]2839 case UM_SETUP4:
[1559]2840 // DbgMsg(pszSrcFile, __LINE__, "SeeAllWndProc UM_SETUP4");
[551]2841 if (pAD)
2842 pAD->killme = TRUE;
2843 else
2844 PostMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID);
2845 return 0;
[2]2846
[551]2847 case UM_RESCAN:
[1559]2848 // DbgMsg(pszSrcFile, __LINE__, "SeeAllWndProc UM_RESCAN");
[551]2849 if (pAD && !pAD->stopflag) {
2850 if (DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN)) {
[1559]2851 // Assume still working - show progress
[1335]2852 CHAR s[CCHMAXPATH + 80], tm[34];
[2]2853
[1335]2854 if (mp1) {
2855 strcpy(s, GetPString(IDS_SORTINGTEXT));
2856 if (pAD->afindexcnt) {
2857 commafmt(tm, sizeof(tm), pAD->afindexcnt);
2858 strcat(s, tm);
2859 }
2860 }
2861 else {
2862 strcpy(s, GetPString(IDS_WORKINGTEXT));
2863 if (pAD->afheadcnt) {
2864 commafmt(tm, sizeof(tm), pAD->afheadcnt);
2865 strcat(s, tm);
2866 }
2867 }
2868 if (mp2) {
2869 strcat(s, " ");
2870 strcat(s, (CHAR *)mp2);
2871 }
2872 WinSetWindowText(pAD->hwndStatus, s);
[551]2873 }
2874 else {
[1559]2875 // Assume scan done
[1335]2876 CHAR s[(CCHMAXPATH * 2) + 80], tm[34], ts[34], tb[34];
2877 ULONG y;
[2]2878
[1335]2879 if (mp1) {
2880 strcpy(s, GetPString(IDS_SORTINGTEXT));
2881 if (pAD->afindexcnt) {
2882 commafmt(tm, sizeof(tm), pAD->afindexcnt);
2883 strcat(s, tm);
2884 }
2885 if (mp2) {
2886 strcat(s, " ");
2887 strcat(s, (CHAR *)mp2);
2888 }
2889 }
2890 else if (pAD->afindexcnt) {
2891 y = (pAD->invertsort) ? (pAD->afindexcnt - 1) - (pAD->cursored - 1) :
2892 pAD->cursored - 1;
2893 commafmt(tm, sizeof(tm), pAD->afindexcnt);
2894 commafmt(ts, sizeof(ts), pAD->selected);
2895 CommaFmtULL(tb, sizeof(tb), pAD->ullSelectedBytes, ' ');
2896 sprintf(s,
2897 " %s %s%s%s %s %s (%s) %s %s",
2898 tm,
2899 GetPString(IDS_FILETEXT),
2900 &"s"[pAD->afindexcnt == 1],
2901 (*pAD->mask.szMask ||
2902 (pAD->mask.attrFile & (~FILE_DIRECTORY)) !=
2903 (ALLATTRS & (~FILE_DIRECTORY)) ||
2904 pAD->mask.antiattr) ?
2905 GetPString(IDS_FILTEREDTEXT) :
2906 NullStr,
2907 ts,
2908 GetPString(IDS_SELECTEDTEXT),
2909 tb, GetPString(IDS_CURRTEXT), pAD->afindex[y]->fullname);
2910 }
2911 else
2912 sprintf(s,
2913 GetPString(IDS_NOFILESPSTEXT),
2914 (*pAD->mask.szMask ||
2915 (pAD->mask.attrFile & (~FILE_DIRECTORY)) !=
2916 (ALLATTRS & (~FILE_DIRECTORY)) ||
2917 pAD->mask.antiattr) ?
2918 GetPString(IDS_FILTEREDTEXT) : NullStr);
2919 WinSetWindowText(pAD->hwndStatus, s);
2920 DosReleaseMutexSem(pAD->hmtxScan);
[2]2921 }
[551]2922 }
2923 return 0;
[2]2924
[551]2925 case UM_SETUP:
[1559]2926 // DbgMsg(pszSrcFile, __LINE__, "SeeAllWndProc UM_SETUP");
[551]2927 if (pAD) {
2928 WinSendMsg(pAD->hvscroll, SBM_SETTHUMBSIZE, MPFROM2SHORT(1, 1), MPVOID);
2929 WinSendMsg(pAD->hhscroll, SBM_SETTHUMBSIZE, MPFROM2SHORT(1, 1), MPVOID);
2930 WinSetActiveWindow(HWND_DESKTOP, WinQueryWindow(hwnd, QW_PARENT));
2931 }
2932 return 0;
[2]2933
[551]2934 case WM_CHAR:
2935 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
2936 if (pAD && !(SHORT1FROMMP(mp1) & KC_KEYUP)) {
[2]2937
[551]2938 register ULONG x;
2939 ULONG numlines, y, wascursored = pAD->cursored, thistime, len;
2940 BOOL found = FALSE;
2941 RECTL rcl;
[2]2942
[551]2943 WinQueryWindowRect(hwnd, &rcl);
2944 numlines = NumLines(&rcl, pAD);
2945 if (numlines) {
[1335]2946 if (SHORT1FROMMP(mp1) & KC_VIRTUALKEY) {
2947 pAD->lasttime = 0;
2948 *pAD->szCommonName = 0;
2949 switch (SHORT2FROMMP(mp2)) {
2950 case VK_DELETE:
2951 if ((shiftstate & KC_CTRL) == KC_CTRL)
2952 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_PERMDELETE, 0),
2953 MPVOID);
2954 else if ((shiftstate & KC_SHIFT) == KC_SHIFT)
2955 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_SAVETOCLIP, 0),
2956 MPVOID);
2957 else
2958 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_DELETE, 0), MPVOID);
2959 break;
2960 case VK_LEFT:
2961 WinSendMsg(hwnd, WM_HSCROLL, MPFROM2SHORT(FID_HORZSCROLL, 0),
2962 MPFROM2SHORT(0, SB_LINELEFT));
2963 break;
2964 case VK_RIGHT:
2965 WinSendMsg(hwnd, WM_HSCROLL, MPFROM2SHORT(FID_HORZSCROLL, 0),
2966 MPFROM2SHORT(0, SB_LINERIGHT));
2967 break;
2968 case VK_PAGEUP:
2969 WinSendMsg(hwnd, WM_VSCROLL, MPFROM2SHORT(FID_VERTSCROLL, 0),
2970 MPFROM2SHORT(0, SB_PAGEUP));
2971 break;
2972 case VK_PAGEDOWN:
2973 WinSendMsg(hwnd, WM_VSCROLL, MPFROM2SHORT(FID_VERTSCROLL, 0),
2974 MPFROM2SHORT(0, SB_PAGEDOWN));
2975 break;
2976 case VK_UP:
2977 if (pAD->cursored > 1) {
2978 if (shiftstate & KC_SHIFT)
2979 WinSendMsg(hwnd, WM_BUTTON1CLICK,
2980 MPFROM2SHORT(pAD->fattrs.lAveCharWidth + 2,
2981 ((rcl.yTop - (pAD->lMaxHeight *
2982 ((pAD->cursored) -
2983 pAD->topfile))) -
2984 pAD->lMaxDescender) - 1),
2985 MPFROM2SHORT(TRUE, 0));
2986 pAD->cursored--;
2987 if (pAD->cursored < pAD->topfile) {
2988 PaintLine(hwnd, pAD->hps, pAD->cursored, pAD->topfile, &rcl);
2989 WinSendMsg(hwnd, WM_VSCROLL, MPFROM2SHORT(FID_VERTSCROLL, 0),
2990 MPFROM2SHORT(0, SB_LINEUP));
2991 }
2992 else {
2993 PaintLine(hwnd, pAD->hps, pAD->cursored - 1, pAD->topfile,
2994 &rcl);
2995 PaintLine(hwnd, pAD->hps, pAD->cursored, pAD->topfile, &rcl);
2996 }
2997 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
2998 }
2999 break;
3000 case VK_DOWN:
3001 if (pAD->cursored < pAD->afindexcnt
3002 && pAD->cursored < pAD->topfile + numlines) {
3003 if (shiftstate & KC_SHIFT)
3004 WinSendMsg(hwnd, WM_BUTTON1CLICK,
3005 MPFROM2SHORT(pAD->fattrs.lAveCharWidth + 2,
3006 ((rcl.yTop - (pAD->lMaxHeight *
3007 ((pAD->cursored) -
3008 pAD->topfile))) -
3009 pAD->lMaxDescender) - 1),
3010 MPFROM2SHORT(TRUE, 0));
3011 pAD->cursored++;
3012 if (pAD->cursored >= pAD->topfile + numlines) {
3013 PaintLine(hwnd, pAD->hps, pAD->cursored - 2, pAD->topfile,
3014 &rcl);
3015 WinSendMsg(hwnd, WM_VSCROLL, MPFROM2SHORT(FID_VERTSCROLL, 0),
3016 MPFROM2SHORT(0, SB_LINEDOWN));
3017 }
3018 else {
3019 PaintLine(hwnd, pAD->hps, pAD->cursored - 1, pAD->topfile,
3020 &rcl);
3021 PaintLine(hwnd, pAD->hps, pAD->cursored - 2, pAD->topfile,
3022 &rcl);
3023 }
3024 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
3025 }
3026 break;
3027 case VK_END:
3028 if ((shiftstate & KC_CTRL) ||
3029 pAD->cursored == (pAD->topfile - 1) + numlines) {
3030 pAD->cursored = pAD->afindexcnt;
3031 pAD->topfile = (pAD->afindexcnt + 1) - numlines;
3032 if (pAD->topfile > pAD->afindexcnt)
3033 pAD->topfile = 1;
3034 WinInvalidateRect(hwnd, NULL, FALSE);
3035 }
3036 else {
3037 pAD->cursored = (pAD->topfile - 1) + numlines;
3038 if (pAD->cursored > pAD->afindexcnt)
3039 pAD->cursored = pAD->afindexcnt;
3040 PaintLine(hwnd, pAD->hps, pAD->cursored - 1, pAD->topfile,
3041 &rcl);
3042 PaintLine(hwnd, pAD->hps, wascursored - 1, pAD->topfile, &rcl);
3043 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
3044 }
3045 break;
3046 case VK_HOME:
3047 if ((shiftstate & KC_CTRL) || pAD->cursored == pAD->topfile) {
3048 pAD->topfile = 1;
3049 pAD->cursored = 1;
3050 WinInvalidateRect(hwnd, NULL, FALSE);
3051 }
3052 else {
3053 pAD->cursored = pAD->topfile;
3054 PaintLine(hwnd, pAD->hps, pAD->cursored - 1, pAD->topfile,
3055 &rcl);
3056 PaintLine(hwnd, pAD->hps, wascursored - 1, pAD->topfile, &rcl);
3057 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
3058 }
3059 break;
3060 case VK_SPACE:
3061 WinSendMsg(hwnd, WM_BUTTON1CLICK,
3062 MPFROM2SHORT(pAD->fattrs.lAveCharWidth + 2,
3063 ((rcl.yTop - (pAD->lMaxHeight *
3064 ((pAD->cursored) -
3065 pAD->topfile))) -
3066 pAD->lMaxDescender) - 1),
3067 MPFROM2SHORT(TRUE, 0));
3068 break;
3069 case VK_NEWLINE:
3070 case VK_ENTER:
3071 WinSendMsg(hwnd, WM_BUTTON1DBLCLK,
3072 MPFROM2SHORT(pAD->fattrs.lAveCharWidth + 2,
3073 ((rcl.yTop - (pAD->lMaxHeight *
3074 ((pAD->cursored) -
3075 pAD->topfile))) -
3076 pAD->lMaxDescender) - 1), MPFROM2SHORT(0,
3077 0));
3078 break;
3079 }
3080 }
3081 else if (SHORT1FROMMP(mp1) & KC_CHAR) {
3082 switch (SHORT1FROMMP(mp2)) {
3083 case '\x1b':
3084 case '\r':
3085 case '\n':
3086 WinSendMsg(hwnd, WM_BUTTON1DBLCLK,
3087 MPFROM2SHORT(pAD->fattrs.lAveCharWidth + 2,
3088 (rcl.yTop - (pAD->lMaxHeight *
3089 ((pAD->cursored) -
3090 pAD->topfile))) - 1),
3091 MPFROM2SHORT(0, 0));
3092 pAD->lasttime = 0;
3093 *pAD->szCommonName = 0;
3094 break;
3095 default:
3096 thistime = WinQueryMsgTime(WinQueryAnchorBlock(hwnd));
3097 if (thistime > pAD->lasttime + 1000)
3098 *pAD->szCommonName = 0;
3099 pAD->lasttime = thistime;
3100 KbdRetry:
3101 len = strlen(pAD->szCommonName);
3102 if (len >= CCHMAXPATH - 1) {
3103 *pAD->szCommonName = 0;
3104 len = 0;
3105 }
3106 pAD->szCommonName[len] = toupper(SHORT1FROMMP(mp2));
3107 pAD->szCommonName[len + 1] = 0;
3108 for (x = pAD->cursored - (len > 0); x < pAD->afindexcnt; x++) {
3109 y = (pAD->invertsort) ? (pAD->afindexcnt - 1) - x : x;
3110 if (pAD->fullnames) {
3111 if (!strnicmp(pAD->afindex[y]->fullname, pAD->szCommonName,
3112 len + 1)) {
3113 found = TRUE;
3114 break;
3115 }
3116 }
3117 else {
3118 if (!strnicmp(pAD->afindex[y]->filename, pAD->szCommonName,
3119 len + 1)) {
3120 found = TRUE;
3121 break;
3122 }
3123 }
3124 }
3125 if (!found) {
3126 for (x = 0; x < pAD->cursored - (len > 0); x++) {
3127 y = (pAD->invertsort) ? (pAD->afindexcnt - 1) - x : x;
3128 if (pAD->fullnames) {
3129 if (!strnicmp(pAD->afindex[y]->fullname, pAD->szCommonName,
3130 len + 1)) {
3131 found = TRUE;
3132 break;
3133 }
3134 }
3135 else {
3136 if (!strnicmp(pAD->afindex[y]->filename, pAD->szCommonName,
3137 len + 1)) {
3138 found = TRUE;
3139 break;
3140 }
3141 }
3142 }
3143 }
3144 if (found) {
3145 if (x + 1 != pAD->cursored) {
3146 pAD->cursored = x + 1;
3147 if (pAD->cursored >= pAD->topfile &&
3148 pAD->cursored < pAD->topfile + numlines &&
3149 wascursored != pAD->cursored) {
3150 PaintLine(hwnd, pAD->hps, pAD->cursored - 1, pAD->topfile,
3151 &rcl);
3152 PaintLine(hwnd, pAD->hps, wascursored - 1, pAD->topfile,
3153 &rcl);
3154 }
3155 else {
3156 if (pAD->cursored < numlines)
3157 pAD->topfile = 1;
3158 else if (pAD->cursored >
3159 (pAD->afindexcnt + 1) - (numlines / 2))
3160 pAD->topfile = (pAD->afindexcnt + 1) - numlines;
3161 else
3162 pAD->topfile = pAD->cursored - (numlines / 2);
3163 WinInvalidateRect(hwnd, NULL, FALSE);
3164 }
3165 }
3166 }
3167 else {
3168 *pAD->szCommonName = 0;
3169 pAD->lasttime = 0;
3170 if (len) // retry as first letter if no match
3171 goto KbdRetry;
3172 }
3173 break;
3174 }
3175 }
[2]3176 }
[551]3177 }
3178 break;
[2]3179
[551]3180 case DM_PRINTOBJECT:
3181 return MRFROMLONG(DRR_TARGET);
[2]3182
[551]3183 case DM_DISCARDOBJECT:
3184 return MRFROMLONG(DRR_TARGET);
[2]3185
[551]3186 case WM_BEGINDRAG:
3187 {
3188 CHAR **list;
[2]3189
[551]3190 list = BuildAList(hwnd);
3191 if (!list)
[1398]3192 Runtime_Error(pszSrcFile, __LINE__, NULL);
[551]3193 else {
[1498]3194 WinSetWindowText(pAD->hwndStatus, (CHAR *) GetPString(IDS_DRAGGINGFILESTEXT));
[1335]3195 DragList(hwnd, (HWND) 0, list, TRUE);
3196 FreeList(list);
3197 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
[2]3198 }
[551]3199 }
3200 break;
[2]3201
[551]3202 case WM_BUTTON1MOTIONSTART:
3203 if (pAD && !pAD->stopflag &&
[1335]3204 !DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN)) {
[551]3205 pAD->mousecaptured = TRUE;
3206 pAD->lastselected = (ULONG) - 1;
3207 pAD->lastdirection = 0;
3208 WinSetCapture(HWND_DESKTOP, hwnd);
3209 DosReleaseMutexSem(pAD->hmtxScan);
3210 WinSendMsg(hwnd, WM_BUTTON1CLICK, mp1, MPFROM2SHORT(TRUE, 0));
3211 }
3212 break;
[2]3213
[551]3214 case WM_MOUSEMOVE:
3215 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
3216 if (pAD && pAD->mousecaptured) {
[2]3217
[551]3218 ULONG numlines, whichfile, y, x;
3219 LONG inc;
3220 RECTL Rectl;
3221 POINTS pts;
3222 BOOL outofwindow = FALSE;
[2]3223
[551]3224 WinQueryWindowRect(hwnd, &Rectl);
3225 numlines = NumLines(&Rectl, pAD);
3226 if (numlines) {
[1335]3227 pts.x = SHORT1FROMMP(mp1);
3228 pts.y = SHORT2FROMMP(mp1);
3229 if (pts.y < 0) {
3230 WinSendMsg(hwnd, WM_VSCROLL, MPFROM2SHORT(FID_VERTSCROLL, 0),
3231 MPFROM2SHORT(0, SB_LINEDOWN));
3232 pts.y = 1;
3233 outofwindow = TRUE;
3234 }
3235 else if (pts.y > Rectl.yTop - Rectl.yBottom) {
3236 WinSendMsg(hwnd, WM_VSCROLL, MPFROM2SHORT(FID_VERTSCROLL, 0),
3237 MPFROM2SHORT(0, SB_LINEUP));
[1533]3238 pts.y = (SHORT) (Rectl.yTop - Rectl.yBottom) - 1;
[1335]3239 outofwindow = TRUE;
3240 }
3241 whichfile = ((Rectl.yTop - Rectl.yBottom) -
3242 ((LONG) pts.y + pAD->lMaxDescender)) / pAD->lMaxHeight;
3243 if (whichfile > numlines - 1)
3244 whichfile = numlines - 1;
3245 whichfile += (pAD->topfile - 1);
3246 y = (pAD->invertsort) ? (pAD->afindexcnt - 1) - whichfile : whichfile;
3247 if (y < pAD->afindexcnt && pAD->lastselected != whichfile) {
3248 if (pAD->lastselected != (ULONG) - 1) {
3249 inc = (pAD->lastselected < whichfile) ? 1 : -1;
3250 for (x = pAD->lastselected + inc;
3251 x != whichfile && x < pAD->afindexcnt;
3252 (pAD->lastselected < whichfile) ? x++ : x--) {
3253 y = (pAD->invertsort) ? (pAD->afindexcnt - 1) - x : x;
3254 if (pAD->afindex[y]->flags & AF_SELECTED) {
3255 pAD->afindex[y]->flags &= ~AF_SELECTED;
3256 pAD->selected--;
3257 pAD->ullSelectedBytes -= pAD->afindex[y]->cbFile;
3258 }
3259 else {
3260 pAD->afindex[y]->flags |= AF_SELECTED;
3261 pAD->selected++;
3262 pAD->ullSelectedBytes += pAD->afindex[y]->cbFile;
3263 }
3264 PaintLine(hwnd, pAD->hps, x, pAD->topfile, &Rectl);
3265 }
3266 }
3267 WinSendMsg(hwnd, WM_BUTTON1CLICK, MPFROM2SHORT(pts.x, pts.y),
3268 MPFROM2SHORT(TRUE, 0));
3269 }
[2]3270 }
[551]3271 if (outofwindow) {
[2]3272
[1335]3273 POINTL ptl;
[2]3274
[1335]3275 WinQueryPointerPos(HWND_DESKTOP, &ptl);
3276 WinMapWindowPoints(HWND_DESKTOP, hwnd, &ptl, 1);
3277 if ((SHORT) ptl.y == (SHORT) SHORT2FROMMP(mp1) &&
3278 (SHORT) ptl.x == (SHORT) SHORT1FROMMP(mp1) &&
3279 ((SHORT) ptl.y < 0 || ptl.y > (Rectl.yTop - Rectl.yBottom))) {
3280 PostMsg(hwnd, UM_MOUSEMOVE, mp1, MPVOID);
3281 DosSleep(1);
3282 }
[2]3283 }
[551]3284 }
3285 break;
[2]3286
[551]3287 case UM_MOUSEMOVE:
3288 if (pAD && pAD->mousecaptured) {
3289
3290 POINTL ptl;
3291 RECTL Rectl;
3292
3293 WinQueryWindowRect(hwnd, &Rectl);
3294 WinQueryPointerPos(HWND_DESKTOP, &ptl);
[766]3295 WinMapWindowPoints(HWND_DESKTOP, hwnd, &ptl, 1);
[551]3296 if ((SHORT) ptl.y == (SHORT) SHORT2FROMMP(mp1) &&
[1335]3297 (SHORT) ptl.x == (SHORT) SHORT1FROMMP(mp1) &&
3298 ((SHORT) ptl.y < 0 || ptl.y > (Rectl.yTop - Rectl.yBottom))) {
3299 DosSleep(1);
3300 PostMsg(hwnd, WM_MOUSEMOVE, mp1, MPFROM2SHORT(TRUE, 0));
[2]3301 }
[551]3302 }
3303 return 0;
[2]3304
[551]3305 case WM_BUTTON1UP:
3306 case WM_BUTTON1MOTIONEND:
3307 if (pAD) {
3308 pAD->mousecaptured = FALSE;
3309 pAD->lastselected = (ULONG) - 1;
3310 pAD->lastdirection = 0;
3311 WinSetCapture(HWND_DESKTOP, NULLHANDLE);
3312 }
3313 break;
[2]3314
[551]3315 case WM_BUTTON1CLICK:
3316 case WM_BUTTON1DBLCLK:
3317 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
3318 if (pAD && !pAD->stopflag &&
[1335]3319 !DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN)) {
[2]3320
[551]3321 ULONG numlines, whichfile, y, wascursored;
3322 RECTL Rectl;
3323 POINTS pts;
3324
[943]3325 if (pAD->afindexcnt) {
[1335]3326 WinQueryWindowRect(hwnd, &Rectl);
3327 numlines = NumLines(&Rectl, pAD);
3328 if (numlines) {
3329 pts.x = SHORT1FROMMP(mp1);
3330 pts.y = SHORT2FROMMP(mp1);
3331 whichfile = ((Rectl.yTop - Rectl.yBottom) -
3332 ((LONG) pts.y + pAD->lMaxDescender)) / pAD->lMaxHeight;
3333 if (whichfile > numlines - 1)
3334 whichfile = numlines - 1;
3335 whichfile += (pAD->topfile - 1);
3336 if (whichfile + 1 > pAD->afindexcnt)
3337 break;
3338 y = (pAD->invertsort) ? (pAD->afindexcnt - 1) - whichfile : whichfile;
3339 wascursored = pAD->cursored;
3340 pAD->cursored = whichfile + 1;
3341 if (pAD->cursored != wascursored)
3342 PaintLine(hwnd, pAD->hps, wascursored - 1, pAD->topfile, &Rectl);
3343 if (y < pAD->afindexcnt) {
3344 if (msg == WM_BUTTON1CLICK || fUnHilite) {
3345 if (pAD->afindex[y]->flags & AF_SELECTED) {
3346 pAD->afindex[y]->flags &= ~AF_SELECTED;
3347 pAD->selected--;
3348 pAD->ullSelectedBytes -= pAD->afindex[y]->cbFile;
3349 }
3350 else {
3351 pAD->afindex[y]->flags |= AF_SELECTED;
3352 pAD->selected++;
3353 pAD->ullSelectedBytes += pAD->afindex[y]->cbFile;
3354 }
3355 PaintLine(hwnd, pAD->hps, whichfile, pAD->topfile, &Rectl);
3356 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
3357 }
3358 }
3359 if (msg == WM_BUTTON1CLICK) {
3360 if (pAD->lastselected != (ULONG) - 1) {
3361 if (whichfile > pAD->lastselected)
3362 pAD->lastdirection = 1;
3363 else
3364 pAD->lastdirection = 2;
3365 }
3366 else
3367 pAD->lastdirection = 0;
3368 pAD->lastselected = whichfile;
3369 }
3370 else
3371 DefaultViewKeys(hwnd, pAD->hwndFrame, HWND_DESKTOP, NULL,
3372 pAD->afindex[y]->fullname);
3373 }
[2]3374 }
[551]3375 DosReleaseMutexSem(pAD->hmtxScan);
3376 }
3377 break;
[2]3378
[551]3379 case WM_MENUEND:
3380 if (pAD && (HWND) mp2 == pAD->hwndPopup) {
3381 WinDestroyWindow(pAD->hwndPopup);
3382 pAD->hwndPopup = (HWND) 0;
3383 }
3384 break;
[2]3385
[551]3386 case WM_CONTEXTMENU:
3387 if (pAD) {
3388 if (!pAD->hwndPopup) {
[1335]3389 pAD->hwndPopup =
3390 WinLoadMenu(HWND_DESKTOP, FM3ModHandle, SEEALL_POPUP);
[1394]3391 if (pAD->hwndPopup) {
3392 //fixme to allow user to change presparams 1-10-09 GKY
[1335]3393 WinSetPresParam(pAD->hwndPopup, PP_FONTNAMESIZE,
[1391]3394 strlen(FNT_8HELVETICA) + 1,
[1400]3395 (PVOID) FNT_8HELVETICA);
[1335]3396 SetConditionalCascade(pAD->hwndPopup,
3397 IDM_DELETESUBMENU,
3398 (fDefaultDeletePerm) ?
3399 IDM_PERMDELETE : IDM_DELETE);
3400 SetConditionalCascade(pAD->hwndPopup, IDM_MOVEMENU, IDM_MOVE);
3401 SetConditionalCascade(pAD->hwndPopup, IDM_COPYMENU, IDM_COPY);
3402 SetConditionalCascade(pAD->hwndPopup, IDM_OPENSUBMENU,
3403 IDM_OPENDEFAULT);
3404 SetConditionalCascade(pAD->hwndMenu, IDM_OBJECTSUBMENU, IDM_SHADOW);
3405 if (fWorkPlace) {
3406 WinSendMsg(pAD->hwndPopup, MM_DELETEITEM,
3407 MPFROM2SHORT(IDM_OPENSUBMENU, TRUE), MPVOID);
3408 WinSendMsg(pAD->hwndPopup, MM_DELETEITEM,
3409 MPFROM2SHORT(IDM_OBJECTSUBMENU, TRUE), MPVOID);
3410 }
3411 }
[551]3412 }
3413 if (pAD->hwndPopup) {
[2]3414
[1335]3415 APIRET rc;
[2]3416
[1335]3417 rc = DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN);
3418 WinEnableMenuItem(pAD->hwndPopup, IDM_EAS, (rc == 0 &&
3419 pAD->selected != 0));
3420 WinEnableMenuItem(pAD->hwndPopup, IDM_UUDECODE, (rc == 0 &&
[1664]3421 pAD->selected != 0));
3422 WinEnableMenuItem(pAD->hwndPopup, IDM_UNLOCKFILE, (rc == 0 && fUnlock &&
[1335]3423 pAD->selected != 0));
3424 WinEnableMenuItem(pAD->hwndPopup, IDM_EXTRACT, (rc == 0 &&
3425 pAD->selected != 0));
3426 WinEnableMenuItem(pAD->hwndPopup, IDM_ARCHIVE, (rc == 0 &&
3427 pAD->selected != 0));
3428 WinEnableMenuItem(pAD->hwndPopup, IDM_MOVEMENU, (rc == 0 &&
3429 pAD->selected != 0));
3430 WinEnableMenuItem(pAD->hwndPopup, IDM_COPYMENU, (rc == 0 &&
3431 pAD->selected != 0));
3432 WinEnableMenuItem(pAD->hwndPopup, IDM_RENAME, (rc == 0 &&
3433 pAD->selected != 0));
3434 WinEnableMenuItem(pAD->hwndPopup, IDM_PRINT, (rc == 0 &&
3435 pAD->selected != 0));
3436 WinEnableMenuItem(pAD->hwndPopup, IDM_SUBJECT, (rc == 0 &&
3437 pAD->selected != 0));
3438 WinEnableMenuItem(pAD->hwndPopup, IDM_OPENSUBMENU, (rc == 0 &&
3439 pAD->selected !=
3440 0));
3441 WinEnableMenuItem(pAD->hwndPopup, IDM_OBJECTSUBMENU,
3442 (rc == 0 && pAD->selected != 0));
3443 WinEnableMenuItem(pAD->hwndPopup, IDM_DELETESUBMENU,
3444 (rc == 0 && pAD->selected != 0));
3445 WinEnableMenuItem(pAD->hwndPopup, IDM_INFO,
3446 (rc == 0 && pAD->selected != 0));
3447 WinEnableMenuItem(pAD->hwndPopup, IDM_ATTRS,
3448 (rc == 0 && pAD->selected != 0));
3449 WinEnableMenuItem(pAD->hwndPopup, IDM_COLLECT,
3450 (rc == 0 && pAD->selected != 0));
3451 WinEnableMenuItem(pAD->hwndPopup, IDM_SAVETOCLIP,
3452 (rc == 0 && pAD->selected != 0));
3453 WinEnableMenuItem(pAD->hwndPopup, IDM_SAVETOCLIPFILENAME,
3454 (rc == 0 && pAD->selected != 0));
3455 WinEnableMenuItem(pAD->hwndPopup, IDM_APPENDTOCLIP,
3456 (rc == 0 && pAD->selected != 0));
3457 WinEnableMenuItem(pAD->hwndPopup, IDM_APPENDTOCLIPFILENAME,
3458 (rc == 0 && pAD->selected != 0));
3459 WinEnableMenuItem(pAD->hwndPopup, IDM_SAVETOLIST,
3460 (rc == 0 && pAD->selected != 0));
3461 WinEnableMenuItem(pAD->hwndPopup, IDM_REMOVE,
3462 (rc == 0 && pAD->selected != 0));
3463 WinEnableMenuItem(pAD->hwndPopup, IDM_HIDEALL,
3464 (rc == 0 && pAD->selected != 0));
3465 WinEnableMenuItem(pAD->hwndPopup, IDM_SELECTALL,
3466 (rc == 0 && pAD->afindexcnt != 0));
3467 WinEnableMenuItem(pAD->hwndPopup, IDM_SELECTMASK,
3468 (rc == 0 && pAD->afindexcnt != 0));
3469 WinEnableMenuItem(pAD->hwndPopup, IDM_DESELECTALL,
3470 (rc == 0 && pAD->afindexcnt != 0));
3471 WinEnableMenuItem(pAD->hwndPopup, IDM_DESELECTMASK,
3472 (rc == 0 && pAD->afindexcnt != 0));
3473 WinEnableMenuItem(pAD->hwndPopup, IDM_INVERT,
3474 (rc == 0 && pAD->afindexcnt != 0));
3475 WinEnableMenuItem(pAD->hwndPopup, IDM_FILTER,
3476 (rc == 0 && pAD->afheadcnt != 0));
3477 if (!rc)
3478 DosReleaseMutexSem(pAD->hmtxScan);
3479 if (WinPopupMenu(hwnd, hwnd, pAD->hwndPopup, SHORT1FROMMP(mp1),
3480 SHORT2FROMMP(mp1), 0,
3481 PU_HCONSTRAIN | PU_VCONSTRAIN |
3482 PU_KEYBOARD | PU_MOUSEBUTTON1))
3483 CenterOverWindow(pAD->hwndPopup);
[2]3484 }
[551]3485 }
3486 break;
[2]3487
[551]3488 case UM_CONTAINER_FILLED:
3489 if (pAD) {
3490 pAD->stopflag = 0;
3491 pAD->topfile = 1;
3492 pAD->cursored = 1;
3493 pAD->multiplier = 1;
[943]3494 if (!pAD->afindexcnt) {
[1559]3495 if (!fAlertBeepOff)
[1395]3496 DosBeep(250, 50);
[1335]3497 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
[2]3498 }
[551]3499 else {
[1559]3500 if (!fAlertBeepOff)
[1395]3501 DosBeep(1000, 25);
[1335]3502 WinInvalidateRect(hwnd, NULL, FALSE);
3503 PostMsg(hwnd, UM_SETUP3, MPVOID, MPVOID);
[551]3504 }
3505 WinSetWindowPos(WinQueryWindow(hwnd, QW_PARENT), HWND_TOP, 0, 0, 0, 0,
[1335]3506 SWP_SHOW | SWP_RESTORE | SWP_ACTIVATE | SWP_ZORDER);
[551]3507 }
3508 return 0;
[2]3509
[551]3510 case WM_ERASEBACKGROUND:
3511 WinFillRect((HPS) mp1, (PRECTL) mp2,
[1335]3512 standardcolors[Colors[COLORS_NORMALBACK]]);
[551]3513 return 0;
[2]3514
[551]3515 case WM_PAINT:
[1559]3516 // DbgMsg(pszSrcFile, __LINE__, "SeeAllWndProc WM_PAINT");
[551]3517 if (pAD) {
[2]3518
[551]3519 HPS hpsp;
3520 RECTL Rectl;
3521 POINTL ptl;
3522 register ULONG x;
3523 ULONG y, len, numlines;
[1397]3524 CHAR szBuff[CCHMAXPATH + 80], szCmmaFmtFileSize[81], szDate[DATE_BUF_BYTES];
[551]3525 BOOL inverted, hidsys, reado, wascursored;
[2]3526
[551]3527 hpsp = WinBeginPaint(hwnd, pAD->hps, &Rectl);
3528 WinFillRect(hpsp, &Rectl, standardcolors[Colors[COLORS_NORMALBACK]]);
3529 if (!pAD->stopflag &&
[1335]3530 !DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN)) {
3531 WinQueryWindowRect(hwnd, &Rectl);
3532 numlines = NumLines(&Rectl, pAD);
3533 if (pAD->afindexcnt && numlines) {
3534 if (pAD->topfile > (pAD->afindexcnt + 1) - numlines)
3535 pAD->topfile = (pAD->afindexcnt + 1) - numlines;
3536 if (pAD->topfile > pAD->afindexcnt)
3537 pAD->topfile = 1;
3538 if (!pAD->topfile)
3539 pAD->topfile = 1;
3540 if (pAD->cursored < pAD->topfile)
3541 pAD->cursored = pAD->topfile;
3542 else if (pAD->cursored > (pAD->topfile + numlines) - 1)
3543 pAD->cursored = (pAD->topfile + numlines) - 1;
3544 if (pAD->cursored > pAD->afindexcnt)
3545 pAD->cursored = pAD->afindexcnt;
3546 }
3547 else
3548 pAD->topfile = pAD->cursored = 1;
3549 if (numlines && pAD->afindexcnt) {
3550 GpiSetBackMix(hpsp, BM_OVERPAINT);
3551 wascursored = TRUE;
3552 for (x = pAD->topfile - 1; x < pAD->afindexcnt; x++) {
3553 ptl.x = pAD->horzscroll;
[1673]3554 if (wascursored) { // reestablish normal colors
[1335]3555 GpiSetColor(pAD->hps,
3556 standardcolors[Colors[COLORS_NORMALFORE]]);
3557 GpiSetBackColor(pAD->hps,
3558 standardcolors[Colors[COLORS_NORMALBACK]]);
3559 wascursored = inverted = hidsys = reado = FALSE;
3560 }
3561 if (x == pAD->cursored - 1)
3562 wascursored = TRUE;
3563 y = (pAD->invertsort) ? (pAD->afindexcnt - 1) - x : x;
3564 ptl.y = (Rectl.yTop -
3565 (pAD->lMaxHeight * (((x + 1) - pAD->topfile) + 1)));
3566 if (ptl.y - pAD->lMaxDescender <= 0)
3567 break;
3568 if (pAD->afindex[y]->flags & AF_SELECTED) {
3569 if (!inverted) {
3570 GpiSetColor(pAD->hps,
3571 standardcolors[Colors
3572 [COLORS_SELECTEDNORMALFORE]]);
3573 GpiSetBackColor(pAD->hps,
3574 (wascursored) ?
3575 standardcolors[Colors
3576 [COLORS_CURSOREDSELECTEDBACK]]
3577 :
3578 standardcolors[Colors[COLORS_SELECTEDBACK]]);
3579 inverted = TRUE;
3580 }
3581 }
3582 else if (inverted ||
3583 ((pAD->afindex[y]->attrFile &
3584 (FILE_SYSTEM | FILE_HIDDEN)) != 0) != hidsys ||
3585 ((pAD->afindex[y]->attrFile & FILE_READONLY) != 0) !=
3586 reado) {
3587 if (pAD->afindex[y]->attrFile & (FILE_SYSTEM | FILE_HIDDEN)) {
3588 GpiSetColor(pAD->hps,
3589 standardcolors[Colors[COLORS_SYSTEMFORE]]);
3590 hidsys = TRUE;
3591 }
3592 else if ((pAD->afindex[y]->attrFile & FILE_READONLY) != 0) {
3593 GpiSetColor(pAD->hps,
3594 standardcolors[Colors[COLORS_READONLYFORE]]);
3595 reado = TRUE;
3596 }
3597 else
3598 GpiSetColor(pAD->hps,
3599 standardcolors[Colors[COLORS_NORMALFORE]]);
3600 GpiSetBackColor(pAD->hps,
3601 (wascursored) ?
3602 standardcolors[Colors
3603 [COLORS_CURSOREDNORMALBACK]] :
3604 standardcolors[Colors[COLORS_NORMALBACK]]);
3605 inverted = FALSE;
3606 }
3607 else if (wascursored)
3608 GpiSetBackColor(pAD->hps,
3609 standardcolors[Colors
3610 [COLORS_CURSOREDNORMALBACK]]);
3611 CommaFmtULL(szCmmaFmtFileSize,
[1559]3612 sizeof(szCmmaFmtFileSize), pAD->afindex[y]->cbFile, ' ');
3613 FDateFormat(szDate, pAD->afindex[y]->date);
[1335]3614 len =
3615 sprintf(szBuff,
[1395]3616 "%c%-*.*s %-12s %c%c%c%c%c %s %02u%s%02u%s%02u ",
[1335]3617 wascursored ? '>' : ' ',
3618 pAD->fullnames ? pAD->longestw : pAD->longest,
3619 pAD->fullnames ? pAD->longestw : pAD->longest,
3620 (pAD->fullnames) ? pAD->afindex[y]->fullname : pAD->
3621 afindex[y]->filename, szCmmaFmtFileSize,
3622 "-A"[((pAD->afindex[y]->attrFile & FILE_ARCHIVED) !=
3623 0)],
3624 "-R"[((pAD->afindex[y]->attrFile & FILE_READONLY) !=
3625 0)],
3626 "-H"[((pAD->afindex[y]->attrFile & FILE_HIDDEN) != 0)],
3627 "-S"[((pAD->afindex[y]->attrFile & FILE_SYSTEM) != 0)],
[1559]3628 "-D"[((pAD->afindex[y]->attrFile & FILE_DIRECTORY) != 0)],
3629 szDate,
[1395]3630 pAD->afindex[y]->time.hours, TimeSeparator,
3631 pAD->afindex[y]->time.minutes, TimeSeparator,
[1335]3632 pAD->afindex[y]->time.twosecs * 2);
3633 GpiCharStringAt(hpsp, &ptl, len, szBuff);
3634 GpiQueryCurrentPosition(hpsp, &ptl);
3635 if (ptl.x + abs(pAD->horzscroll) > pAD->maxx) {
3636 pAD->maxx = ptl.x + abs(pAD->horzscroll);
3637 WinSendMsg(pAD->hhscroll, SBM_SETTHUMBSIZE,
3638 MPFROM2SHORT((SHORT) Rectl.xRight,
3639 (SHORT) pAD->maxx), MPVOID);
3640 }
3641 }
3642 }
3643 DosReleaseMutexSem(pAD->hmtxScan);
[2]3644 }
[551]3645 WinEndPaint(hpsp);
3646 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
3647 if (!pAD->stopflag)
[1335]3648 WinSendMsg(pAD->hvscroll, SBM_SETSCROLLBAR,
3649 MPFROMSHORT((SHORT) (pAD->topfile / pAD->multiplier)),
3650 MPFROM2SHORT(1,
3651 (SHORT) (pAD->afindexcnt / pAD->multiplier) -
3652 (numlines - 1)));
[551]3653 WinSendMsg(pAD->hhscroll, SBM_SETSCROLLBAR,
[1335]3654 MPFROMSHORT((SHORT) abs(pAD->horzscroll)),
3655 MPFROM2SHORT(0, (SHORT) (pAD->maxx - Rectl.xRight)));
[551]3656 WinSendMsg(pAD->hhscroll, SBM_SETTHUMBSIZE,
[1335]3657 MPFROM2SHORT((SHORT) Rectl.xRight, (SHORT) pAD->maxx),
3658 MPVOID);
[551]3659 }
3660 break;
[2]3661
[551]3662 case WM_HSCROLL:
3663 {
3664 RECTL rectl;
3665 BOOL invalidate = TRUE;
[2]3666
[551]3667 WinQueryWindowRect(hwnd, &rectl);
3668 switch (SHORT2FROMMP(mp2)) {
3669 case SB_PAGERIGHT:
[1335]3670 if (abs(pAD->horzscroll) < pAD->maxx - rectl.xRight) {
3671 pAD->horzscroll -= rectl.xRight;
3672 if (abs(pAD->horzscroll) > pAD->maxx - rectl.xRight)
3673 pAD->horzscroll = -(pAD->maxx - rectl.xRight);
3674 }
3675 break;
[2]3676
[551]3677 case SB_PAGELEFT:
[1335]3678 if (pAD->horzscroll < 0) {
3679 pAD->horzscroll += rectl.xRight;
3680 if (pAD->horzscroll > 0)
3681 pAD->horzscroll = 0;
3682 }
3683 break;
[2]3684
[551]3685 case SB_LINERIGHT:
[1335]3686 if (abs(pAD->horzscroll) < pAD->maxx - rectl.xRight)
3687 pAD->horzscroll -= pAD->fattrs.lAveCharWidth;
3688 break;
[2]3689
[551]3690 case SB_LINELEFT:
[1335]3691 if (pAD->horzscroll < 0)
3692 pAD->horzscroll += pAD->fattrs.lAveCharWidth;
3693 break;
[2]3694
[551]3695 case SB_SLIDERTRACK:
[1335]3696 pAD->horzscroll = SHORT1FROMMP(mp2);
3697 pAD->horzscroll = -(pAD->horzscroll);
3698 if (pAD->horzscroll > 0)
3699 pAD->horzscroll = 0;
3700 if (abs(pAD->horzscroll) > pAD->maxx - rectl.xRight)
3701 pAD->horzscroll = -(pAD->maxx - rectl.xRight);
3702 break;
[2]3703
[551]3704 default:
[1335]3705 invalidate = FALSE;
3706 break;
[2]3707 }
[551]3708 if (invalidate)
[1335]3709 WinInvalidateRect(hwnd, NULL, FALSE);
[551]3710 }
3711 break;
[2]3712
[551]3713 case WM_VSCROLL:
[1559]3714 // DbgMsg(pszSrcFile, __LINE__, "SeeAllWndProc WM_VSCROLL");
[551]3715 if (pAD && !pAD->stopflag &&
[1335]3716 !DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN)) {
[2]3717
[551]3718 ULONG numlines, wascursored;
3719 RECTL rcl;
[2]3720
[943]3721 if (pAD->afindexcnt) {
[1335]3722 WinQueryWindowRect(hwnd, &rcl);
3723 numlines = NumLines(&rcl, pAD);
3724 if (numlines) {
3725 wascursored = pAD->cursored;
3726 switch (SHORT2FROMMP(mp2)) {
3727 case SB_PAGEUP:
3728 if (pAD->topfile > 1) {
3729 pAD->topfile -= numlines;
3730 if (pAD->topfile > pAD->afindexcnt ||
3731 pAD->topfile > (pAD->afindexcnt + 1) - numlines)
3732 pAD->topfile = 1;
3733 if (pAD->cursored > pAD->topfile + numlines)
3734 pAD->cursored = pAD->topfile + numlines;
3735 if (pAD->cursored > pAD->afindexcnt)
3736 pAD->cursored = pAD->afindexcnt;
3737 WinInvalidateRect(hwnd, NULL, FALSE);
3738 }
3739 break;
3740 case SB_PAGEDOWN:
3741 if (pAD->topfile <= pAD->afindexcnt - numlines) {
3742 pAD->topfile += numlines;
3743 if (pAD->topfile > (pAD->afindexcnt + 1) - numlines)
3744 pAD->topfile = (pAD->afindexcnt + 1) - numlines;
3745 if (pAD->cursored < pAD->topfile)
3746 pAD->cursored = pAD->topfile;
3747 if (pAD->cursored > (pAD->topfile + numlines) - 1)
3748 pAD->cursored = (pAD->topfile + numlines) - 1;
3749 if (pAD->cursored > pAD->afindexcnt)
3750 pAD->cursored = pAD->afindexcnt;
3751 WinInvalidateRect(hwnd, NULL, FALSE);
3752 }
3753 break;
3754 case SB_LINEDOWN:
3755 if (pAD->topfile <= pAD->afindexcnt - numlines) {
[2]3756
[1335]3757 RECTL Rectl, iRectl;
[2]3758
[1335]3759 pAD->topfile++;
3760 if (pAD->cursored < pAD->topfile)
3761 pAD->cursored = pAD->topfile;
3762 else if (pAD->cursored > (pAD->topfile + numlines) - 1)
3763 pAD->cursored = (pAD->topfile + numlines) - 1;
3764 if (pAD->cursored > pAD->afindexcnt)
3765 pAD->cursored = pAD->afindexcnt;
3766 WinQueryWindowRect(hwnd, &Rectl);
3767 WinScrollWindow(hwnd, 0, pAD->lMaxHeight,
3768 NULL, NULL, NULLHANDLE, &iRectl, 0);
3769 WinFillRect(pAD->hps, &iRectl,
3770 standardcolors[Colors[COLORS_NORMALBACK]]);
3771 PaintLine(hwnd, pAD->hps, (pAD->topfile + numlines) - 2,
3772 pAD->topfile, &Rectl);
3773 if (pAD->cursored != pAD->topfile + numlines)
3774 PaintLine(hwnd, pAD->hps, pAD->cursored - 1, pAD->topfile,
3775 &Rectl);
3776 if (wascursored != pAD->cursored
3777 && wascursored < pAD->topfile + numlines
3778 && wascursored >= pAD->topfile)
3779 PaintLine(hwnd, pAD->hps, wascursored - 1, pAD->topfile,
3780 &Rectl);
3781 if (wascursored != pAD->cursored)
3782 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
3783 WinSendMsg(pAD->hhscroll, SBM_SETSCROLLBAR,
3784 MPFROMSHORT((SHORT) abs(pAD->horzscroll)),
3785 MPFROM2SHORT(0, (SHORT) (pAD->maxx - Rectl.xRight)));
3786 WinSendMsg(pAD->hvscroll, SBM_SETSCROLLBAR,
3787 MPFROMSHORT((SHORT) (pAD->topfile /
3788 pAD->multiplier)),
3789 MPFROM2SHORT(1, (SHORT) (pAD->afindexcnt /
3790 pAD->multiplier) -
3791 (numlines - 1)));
3792 }
3793 break;
3794 case SB_LINEUP:
3795 if (pAD->topfile > 1) {
[2]3796
[1335]3797 RECTL Rectl, iRectl;
[2]3798
[1335]3799 pAD->topfile--;
3800 if (pAD->cursored < pAD->topfile)
3801 pAD->cursored = pAD->topfile;
3802 else if (pAD->cursored > (pAD->topfile + numlines) - 1)
3803 pAD->cursored = (pAD->topfile + numlines) - 1;
3804 if (pAD->cursored > pAD->afindexcnt)
3805 pAD->cursored = pAD->afindexcnt;
3806 WinQueryWindowRect(hwnd, &Rectl);
3807 WinScrollWindow(hwnd, 0, -pAD->lMaxHeight,
3808 NULL, NULL, NULLHANDLE, &iRectl, 0);
3809 WinFillRect(pAD->hps, &iRectl,
3810 standardcolors[Colors[COLORS_NORMALBACK]]);
3811 iRectl = Rectl;
3812 iRectl.yTop -= ((numlines * pAD->lMaxHeight) +
3813 pAD->lMaxDescender);
3814 WinFillRect(pAD->hps, &iRectl,
3815 standardcolors[pAD->aulColors[COLORS_NORMALBACK]]);
3816 PaintLine(hwnd, pAD->hps, pAD->topfile - 1, pAD->topfile,
3817 &Rectl);
3818 if (pAD->cursored != pAD->topfile)
3819 PaintLine(hwnd, pAD->hps, pAD->cursored - 1, pAD->topfile,
3820 &Rectl);
3821 if (pAD->cursored != wascursored && wascursored >= pAD->topfile
3822 && wascursored < pAD->topfile + numlines)
3823 PaintLine(hwnd, pAD->hps, wascursored - 1, pAD->topfile,
3824 &Rectl);
3825 if (pAD->cursored != wascursored)
3826 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
3827 WinSendMsg(pAD->hhscroll, SBM_SETSCROLLBAR,
3828 MPFROMSHORT((SHORT) abs(pAD->horzscroll)),
3829 MPFROM2SHORT(0, (SHORT) (pAD->maxx - Rectl.xRight)));
3830 WinSendMsg(pAD->hvscroll, SBM_SETSCROLLBAR,
3831 MPFROMSHORT((SHORT) (pAD->topfile /
3832 pAD->multiplier)),
3833 MPFROM2SHORT(1, (SHORT) (pAD->afindexcnt /
3834 pAD->multiplier) -
3835 (numlines - 1)));
3836 }
3837 break;
3838 case SB_SLIDERTRACK:
3839 if ((SHORT1FROMMP(mp2) >= 1) ||
3840 (SHORT1FROMMP(mp2)) <= pAD->afindexcnt) {
3841 pAD->topfile = (ULONG) SHORT1FROMMP(mp2) * pAD->multiplier;
3842 if (pAD->topfile > (pAD->afindexcnt + 1) - numlines)
3843 pAD->topfile = (pAD->afindexcnt + 1) - numlines;
3844 if (!pAD->topfile)
3845 pAD->topfile = 1;
3846 if (pAD->cursored < pAD->topfile)
3847 pAD->cursored = pAD->topfile;
3848 else if (pAD->cursored > pAD->topfile + numlines)
3849 pAD->cursored = pAD->topfile + numlines;
3850 if (pAD->cursored > pAD->afindexcnt)
3851 pAD->cursored = pAD->afindexcnt;
3852 WinInvalidateRect(hwnd, NULL, FALSE);
3853 }
3854 else
3855 WinAlarm(HWND_DESKTOP, WA_NOTE);
3856 break;
3857 }
3858 }
[2]3859 }
[551]3860 DosReleaseMutexSem(pAD->hmtxScan);
3861 }
3862 break;
[2]3863
[551]3864 case WM_INITMENU:
3865 if (pAD) {
3866 switch (SHORT1FROMMP(mp1)) {
3867 case IDM_FILESMENU:
[1335]3868 {
3869 APIRET rc;
[2]3870
[1335]3871 rc = DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN);
3872 WinEnableMenuItem((HWND) mp2, IDM_DUPES, (rc == 0));
3873 WinEnableMenuItem((HWND) mp2, IDM_COLLECT, (rc == 0 &&
3874 pAD->selected != 0));
3875 WinEnableMenuItem((HWND) mp2, IDM_SAVETOCLIP, (rc == 0 &&
3876 pAD->selected != 0));
3877 WinEnableMenuItem((HWND) mp2, IDM_SAVETOCLIPFILENAME,
3878 (rc == 0 && pAD->selected != 0));
3879 WinEnableMenuItem((HWND) mp2, IDM_APPENDTOCLIP,
3880 (rc == 0 && pAD->selected != 0));
3881 WinEnableMenuItem((HWND) mp2, IDM_APPENDTOCLIPFILENAME,
3882 (rc == 0 && pAD->selected != 0));
3883 WinEnableMenuItem((HWND) mp2, IDM_SAVETOLIST,
3884 (rc == 0 && pAD->selected != 0));
3885 WinEnableMenuItem((HWND) mp2, IDM_REMOVE,
3886 (rc == 0 && pAD->selected != 0));
3887 WinEnableMenuItem((HWND) mp2, IDM_HIDEALL,
3888 (rc == 0 && pAD->selected != 0));
3889 WinEnableMenuItem((HWND) mp2, IDM_DELETESUBMENU,
3890 (rc == 0 && pAD->selected != 0));
3891 WinEnableMenuItem((HWND) mp2, IDM_INFO,
3892 (rc == 0 && pAD->selected != 0));
3893 WinEnableMenuItem((HWND) mp2, IDM_ATTRS,
3894 (rc == 0 && pAD->selected != 0));
3895 WinEnableMenuItem((HWND) mp2, IDM_EAS,
3896 (rc == 0 && pAD->selected != 0));
3897 WinEnableMenuItem((HWND) mp2, IDM_UUDECODE,
[1664]3898 (rc == 0 && pAD->selected != 0));
3899 WinEnableMenuItem((HWND) mp2, IDM_UNLOCKFILE,
3900 (rc == 0 && fUnlock && pAD->selected != 0));
[1335]3901 WinEnableMenuItem((HWND) mp2, IDM_EXTRACT,
3902 (rc == 0 && pAD->selected != 0));
3903 WinEnableMenuItem((HWND) mp2, IDM_ARCHIVE,
3904 (rc == 0 && pAD->selected != 0));
3905 WinEnableMenuItem((HWND) mp2, IDM_MOVEMENU,
3906 (rc == 0 && pAD->selected != 0));
3907 WinEnableMenuItem((HWND) mp2, IDM_COPYMENU,
3908 (rc == 0 && pAD->selected != 0));
3909 WinEnableMenuItem((HWND) mp2, IDM_RENAME,
3910 (rc == 0 && pAD->selected != 0));
3911 WinEnableMenuItem((HWND) mp2, IDM_PRINT,
3912 (rc == 0 && pAD->selected != 0));
3913 WinEnableMenuItem((HWND) mp2, IDM_SUBJECT,
3914 (rc == 0 && pAD->selected != 0));
3915 WinEnableMenuItem((HWND) mp2, IDM_OPENSUBMENU,
3916 (rc == 0 && pAD->selected != 0));
3917 WinEnableMenuItem((HWND) mp2, IDM_OBJECTSUBMENU,
3918 (rc == 0 && pAD->selected != 0));
3919 if (!rc)
3920 DosReleaseMutexSem(pAD->hmtxScan);
3921 }
3922 break;
[2]3923
[551]3924 case IDM_SELECTSUBMENU:
[1335]3925 {
3926 APIRET rc;
[2]3927
[1335]3928 rc = DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN);
3929 WinEnableMenuItem((HWND) mp2, IDM_SELECTALL, (rc == 0 &&
3930 pAD->afindexcnt != 0 &&
3931 (pAD->afindexcnt !=
3932 pAD->selected ||
3933 !pAD->selected)));
3934 WinEnableMenuItem((HWND) mp2, IDM_SELECTMASK, (rc == 0 &&
3935 pAD->afindexcnt != 0 &&
3936 (pAD->afindexcnt !=
3937 pAD->selected ||
3938 !pAD->selected)));
3939 WinEnableMenuItem((HWND) mp2, IDM_DESELECTALL, (rc == 0 &&
3940 pAD->afindexcnt != 0
3941 && pAD->selected));
3942 WinEnableMenuItem((HWND) mp2, IDM_DESELECTMASK,
3943 (rc == 0 && pAD->afindexcnt != 0) && pAD->selected);
3944 WinEnableMenuItem((HWND) mp2, IDM_INVERT,
3945 (rc == 0 && pAD->afindexcnt != 0));
3946 if (!rc)
3947 DosReleaseMutexSem(pAD->hmtxScan);
3948 }
3949 break;
[2]3950
[551]3951 case IDM_SORTSUBMENU:
[1335]3952 {
3953 APIRET rc;
[2]3954
[1335]3955 rc = DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN);
3956 WinEnableMenuItem((HWND) mp2, IDM_SORTNAME, (rc == 0));
3957 WinEnableMenuItem((HWND) mp2, IDM_SORTEASIZE, (rc == 0));
3958 WinEnableMenuItem((HWND) mp2, IDM_SORTSIZE, (rc == 0));
3959 WinEnableMenuItem((HWND) mp2, IDM_SORTLWDATE, (rc == 0));
3960 WinEnableMenuItem((HWND) mp2, IDM_SORTFILENAME, (rc == 0));
3961 WinEnableMenuItem((HWND) mp2, IDM_SORTFIRST, (rc == 0));
3962 if (!rc)
3963 DosReleaseMutexSem(pAD->hmtxScan);
3964 }
3965 WinCheckMenuItem((HWND) mp2, IDM_SORTNAME,
3966 (pAD->pfnCompare == comparefullnames));
3967 WinCheckMenuItem((HWND) mp2, IDM_SORTEASIZE,
3968 (pAD->pfnCompare == (PFNSORT) NULL));
3969 WinCheckMenuItem((HWND) mp2, IDM_SORTSIZE,
3970 (pAD->pfnCompare == comparesizes));
3971 WinCheckMenuItem((HWND) mp2, IDM_SORTLWDATE,
3972 (pAD->pfnCompare == comparedates));
3973 WinCheckMenuItem((HWND) mp2, IDM_SORTFILENAME,
3974 (pAD->pfnCompare == comparenames));
3975 WinCheckMenuItem((HWND) mp2, IDM_SORTREVERSE, pAD->invertsort);
3976 WinCheckMenuItem((HWND) mp2, IDM_SORTFIRST,
3977 (pAD->pfnCompare == compareexts));
3978 break;
[2]3979
[551]3980 case IDM_VIEWSMENU:
[1335]3981 {
3982 APIRET rc;
[2]3983
[1335]3984 rc = DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN);
3985 WinEnableMenuItem((HWND) mp2, IDM_RESCAN, (rc == 0));
3986 WinEnableMenuItem((HWND) mp2, IDM_FILTER, (rc == 0 &&
3987 pAD->afheadcnt != 0));
3988 if (!rc)
3989 DosReleaseMutexSem(pAD->hmtxScan);
3990 }
3991 WinCheckMenuItem((HWND) mp2, IDM_SHOWLNAMES, pAD->fullnames);
3992 break;
[2]3993 }
[551]3994 }
3995 break;
3996
3997 case WM_COMMAND:
[783]3998 if (!pAD) {
[1398]3999 Runtime_Error(pszSrcFile, __LINE__, NULL);
[551]4000 return 0;
[783]4001 }
[551]4002 switch (SHORT1FROMMP(mp1)) {
4003 case IDM_SETTARGET:
[1675]4004 SetTargetDir(hwnd, FALSE, NULL);
[2]4005 break;
4006
[551]4007 case IDM_DUPES:
4008 if (!pAD->stopflag &&
[1335]4009 !DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN)) {
4010 pAD->dupeflags = (USHORT) WinDlgBox(HWND_DESKTOP,
4011 hwnd,
4012 DupeDlgProc,
4013 FM3ModHandle,
4014 DUPE_FRAME,
4015 MPFROM2SHORT(pAD->dupeflags, 0));
4016 if (pAD->dupeflags) {
4017 xbeginthread(FindDupesThread,
4018 65536,
4019 (PVOID)hwnd,
4020 pszSrcFile,
4021 __LINE__);
4022 }
4023 DosReleaseMutexSem(pAD->hmtxScan);
[551]4024 }
4025 break;
[2]4026
[551]4027 case IDM_COLORPALETTE:
4028 {
[1335]4029 COLORS co;
4030 LONG temp[COLORS_MAX];
[2]4031
[1335]4032 memset(&co, 0, sizeof(co));
4033 co.size = sizeof(co);
4034 co.numcolors = COLORS_MAX;
4035 co.colors = pAD->aulColors;
4036 co.descriptions = IDS_SACOLORS1TEXT;
4037 co.origs = temp;
4038 co.prompt = IDS_SACOLORSPROMPTTEXT;
4039 memcpy(temp, pAD->aulColors, sizeof(LONG) * COLORS_MAX);
4040 if (WinDlgBox(HWND_DESKTOP,
4041 hwnd,
4042 ColorDlgProc,
4043 FM3ModHandle, COLOR_FRAME, (PVOID) & co)) {
4044 memcpy(Colors, pAD->aulColors, sizeof(LONG) * COLORS_MAX);
4045 PrfWriteProfileData(fmprof,
4046 appname,
4047 "Seeall.Colors",
4048 &pAD->aulColors, sizeof(LONG) * COLORS_MAX);
4049 WinInvalidateRect(hwnd, NULL, FALSE);
4050 }
[551]4051 }
4052 break;
[2]4053
[551]4054 case IDM_CODEPAGE:
4055 {
[1335]4056 INT cp;
[2]4057
[1335]4058 cp = PickCodepage(hwnd);
4059 if (cp != -1) {
4060 pAD->fattrs.usCodePage = (USHORT) cp;
4061 Codepage = pAD->fattrs.usCodePage;
4062 PrfWriteProfileData(fmprof,
4063 appname,
4064 "Seeall.Codepage",
4065 &pAD->fattrs.usCodePage, sizeof(USHORT));
[1433]4066 GpiDeleteSetId(pAD->hps, SEEALLFILECNR_FONT_LCID);
[1335]4067 GpiAssociate(pAD->hps, 0);
4068 GpiDestroyPS(pAD->hps);
4069 pAD->hps = InitWindow(hwnd);
4070 pAD->maxx = pAD->horzscroll = 0;
4071 WinInvalidateRect(hwnd, NULL, FALSE);
4072 }
[551]4073 }
4074 break;
[2]4075
[551]4076 case IDM_FONTPALETTE:
[1391]4077 SetMLEFont(hwnd, &pAD->fattrs, 3);
[551]4078 PrfWriteProfileData(fmprof,
[1335]4079 appname,
4080 "Seeall.Fattrs", &pAD->fattrs, sizeof(pAD->fattrs));
[551]4081 Fattrs = pAD->fattrs;
[1433]4082 GpiDeleteSetId(pAD->hps, SEEALLFILECNR_FONT_LCID);
[551]4083 GpiAssociate(pAD->hps, 0);
4084 GpiDestroyPS(pAD->hps);
4085 pAD->hps = InitWindow(hwnd);
4086 pAD->maxx = pAD->horzscroll = 0;
4087 WinInvalidateRect(hwnd, NULL, FALSE);
4088 break;
4089
4090 case IDM_SHOWLNAMES:
4091 pAD->fullnames = (pAD->fullnames) ? FALSE : TRUE;
4092 PrfWriteProfileData(fmprof,
[1335]4093 appname,
4094 "Seeall.Fullnames", &pAD->fullnames, sizeof(BOOL));
[551]4095 Fullnames = pAD->fullnames;
4096 pAD->maxx = pAD->horzscroll = 0;
4097 WinInvalidateRect(hwnd, NULL, FALSE);
4098 break;
4099
4100 case IDM_SORTREVERSE:
4101 pAD->invertsort = (pAD->invertsort) ? FALSE : TRUE;
4102 SortReverse = pAD->invertsort;
4103 PrfWriteProfileData(fmprof,
[1335]4104 appname,
4105 "Seeall.SortReverse",
4106 (PVOID) & pAD->invertsort, sizeof(BOOL));
[551]4107 WinInvalidateRect(hwnd, NULL, FALSE);
4108 break;
4109
4110 case IDM_SORTEASIZE:
4111 case IDM_SORTNAME:
4112 case IDM_SORTFILENAME:
4113 case IDM_SORTSIZE:
4114 case IDM_SORTLWDATE:
4115 case IDM_SORTFIRST:
4116 if (!pAD->stopflag &&
[1335]4117 !DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN)) {
4118 {
4119 USHORT dummy = SHORT1FROMMP(mp1);
[551]4120
[1335]4121 PrfWriteProfileData(fmprof,
4122 appname,
4123 "Seeall.Sort", (PVOID) & dummy, sizeof(USHORT));
4124 SortType = SHORT1FROMMP(mp1);
4125 }
4126 WinSetPointer(HWND_DESKTOP, hptrBusy);
4127 WinSendMsg(hwnd, UM_RESCAN, MPFROMLONG(1), MPVOID);
4128 switch (SHORT1FROMMP(mp1)) {
4129 case IDM_SORTEASIZE:
4130 pAD->pfnCompare = (PFNSORT) NULL;
4131 ReSort(hwnd);
4132 break;
[2]4133
[1335]4134 case IDM_SORTNAME:
4135 pAD->pfnCompare = comparefullnames;
4136 ReSort(hwnd);
4137 break;
[2]4138
[1335]4139 case IDM_SORTFILENAME:
4140 pAD->pfnCompare = comparenames;
4141 ReSort(hwnd);
4142 break;
[551]4143
[1335]4144 case IDM_SORTSIZE:
4145 pAD->pfnCompare = comparesizes;
4146 ReSort(hwnd);
4147 break;
[551]4148
[1335]4149 case IDM_SORTLWDATE:
4150 pAD->pfnCompare = comparedates;
4151 ReSort(hwnd);
4152 break;
[551]4153
[1335]4154 case IDM_SORTFIRST:
4155 pAD->pfnCompare = compareexts;
4156 ReSort(hwnd);
4157 break;
4158 }
4159 WinSetPointer(HWND_DESKTOP, hptrArrow);
4160 DosReleaseMutexSem(pAD->hmtxScan);
4161 WinInvalidateRect(hwnd, NULL, FALSE);
[551]4162 }
4163 break;
[2]4164
[551]4165 case IDM_FILTER:
4166 if (!pAD->stopflag &&
[1335]4167 !DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN)) {
4168 FilterList(hwnd);
4169 DosReleaseMutexSem(pAD->hmtxScan);
[551]4170 }
4171 break;
[2]4172
[551]4173 case IDM_RESCAN:
4174 if (!pAD->stopflag &&
[1335]4175 !DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN)) {
[2]4176
[1335]4177 CHAR tempflags[26];
[2]4178
[1335]4179 memcpy(tempflags, pAD->abDrvFlags, sizeof(tempflags));
4180 if (!WinDlgBox(HWND_DESKTOP, hwnd, AFDrvsWndProc, FM3ModHandle,
4181 DRVS_FRAME, (PVOID) pAD)) {
4182 memcpy(pAD->abDrvFlags, tempflags, sizeof(tempflags));
4183 *pAD->szFindPath = 0;
4184 DosReleaseMutexSem(pAD->hmtxScan);
4185 break;
4186 }
4187 WinSendMsg(pAD->hhscroll, SBM_SETTHUMBSIZE, MPFROM2SHORT(1, 1),
4188 MPVOID);
4189 WinSendMsg(pAD->hvscroll, SBM_SETTHUMBSIZE, MPFROM2SHORT(1, 1),
4190 MPVOID);
4191 pAD->topfile = 1;
4192 pAD->cursored = 1;
4193 pAD->selected = 0;
4194 pAD->ullSelectedBytes = 0;
4195 pAD->maxx = pAD->horzscroll = 0;
4196 FreeAllFilesList(hwnd);
4197 pAD->stopflag = 0;
4198 if (xbeginthread(FindAllThread,
4199 524288,
4200 (PVOID)hwnd,
4201 pszSrcFile,
4202 __LINE__) == -1)
4203 {
4204 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
4205 DosReleaseMutexSem(pAD->hmtxScan);
4206 }
4207 else {
4208 DosReleaseMutexSem(pAD->hmtxScan);
4209 DosSleep(50);//05 Aug 07 GKY 100
4210 WinInvalidateRect(hwnd, NULL, FALSE);
4211 PostMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
4212 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
4213 }
[551]4214 }
4215 break;
[958]4216 case IDM_UNHIDEALL:
4217 {
4218 ALLDATA *ad = WinQueryWindowPtr(hwnd, QWL_USER);
4219 FilterAll(hwnd, ad);
4220 }
4221 break;
[2]4222
[551]4223 case IDM_DELETE:
4224 case IDM_PERMDELETE:
4225 case IDM_SELECTALL:
4226 case IDM_DESELECTALL:
4227 case IDM_INVERT:
4228 case IDM_SELECTMASK:
4229 case IDM_DESELECTMASK:
4230 case IDM_REMOVE:
4231 case IDM_HIDEALL:
4232 case IDM_COLLECT:
4233 case IDM_COLLECTOR:
4234 case IDM_SAVETOCLIP:
[1084]4235 case IDM_SAVETOCLIPFILENAME:
[551]4236 case IDM_APPENDTOCLIP:
[1084]4237 case IDM_APPENDTOCLIPFILENAME:
[551]4238 case IDM_SAVETOLIST:
4239 case IDM_INFO:
4240 case IDM_ATTRS:
4241 case IDM_MOVE:
4242 case IDM_COPY:
4243 case IDM_RENAME:
4244 case IDM_MOVEPRESERVE:
4245 case IDM_COPYPRESERVE:
4246 case IDM_WILDMOVE:
4247 case IDM_WILDCOPY:
4248 case IDM_SUBJECT:
4249 case IDM_EAS:
4250 case IDM_PRINT:
4251 case IDM_ARCHIVE:
4252 case IDM_EXTRACT:
4253 case IDM_UUDECODE:
[1664]4254 case IDM_UNLOCKFILE:
[551]4255 case IDM_SHADOW:
4256 case IDM_OBJECT:
[1803]4257 case IDM_JAVAEXE:
[551]4258 case IDM_OPENSETTINGS:
4259 case IDM_OPENDEFAULT:
4260 if (!pAD->stopflag &&
[1335]4261 !DosRequestMutexSem(pAD->hmtxScan, SEM_IMMEDIATE_RETURN)) {
4262 switch (SHORT1FROMMP(mp1)) {
4263 case IDM_SELECTALL:
4264 case IDM_DESELECTALL:
4265 case IDM_INVERT:
4266 case IDM_HIDEALL:
4267 case IDM_REMOVE:
4268 Mark(hwnd, (SHORT1FROMMP(mp1) == IDM_DESELECTALL) ?
4269 AFM_UNMARK : (SHORT1FROMMP(mp1) == IDM_INVERT) ?
4270 AFM_INVERT : (SHORT1FROMMP(mp1) == IDM_HIDEALL) ?
4271 AFM_FILTER : (SHORT1FROMMP(mp1) == IDM_REMOVE) ?
4272 AFM_MARKDELETED : 0, NULL);
4273 if (SHORT1FROMMP(mp1) == IDM_REMOVE ||
4274 SHORT1FROMMP(mp1) == IDM_HIDEALL) {
4275 if (SHORT1FROMMP(mp1) == IDM_REMOVE)
4276 RemoveDeleted(hwnd);
4277 else
4278 ReSort(hwnd);
4279 }
4280 WinInvalidateRect(hwnd, NULL, FALSE);
4281 break;
[2]4282
[1335]4283 case IDM_SELECTMASK:
4284 case IDM_DESELECTMASK:
4285 SelectMask(hwnd, (SHORT1FROMMP(mp1) == IDM_DESELECTMASK));
4286 WinInvalidateRect(hwnd, NULL, FALSE);
4287 break;
[2]4288
[1335]4289 case IDM_DELETE:
4290 case IDM_PERMDELETE:
4291 case IDM_APPENDTOCLIP:
4292 case IDM_APPENDTOCLIPFILENAME:
4293 case IDM_SAVETOCLIP:
4294 case IDM_SAVETOCLIPFILENAME:
4295 case IDM_SAVETOLIST:
4296 case IDM_COLLECT:
4297 case IDM_INFO:
4298 case IDM_ATTRS:
4299 case IDM_MOVE:
4300 case IDM_COPY:
4301 case IDM_RENAME:
4302 case IDM_MOVEPRESERVE:
4303 case IDM_COPYPRESERVE:
4304 case IDM_WILDMOVE:
4305 case IDM_WILDCOPY:
4306 case IDM_SUBJECT:
4307 case IDM_PRINT:
4308 case IDM_EAS:
4309 case IDM_ARCHIVE:
4310 case IDM_EXTRACT:
4311 case IDM_SHADOW:
[1803]4312 case IDM_OBJECT:
4313 case IDM_JAVAEXE:
[1335]4314 case IDM_OPENSETTINGS:
4315 case IDM_OPENDEFAULT:
[1664]4316 case IDM_UUDECODE:
4317 case IDM_UNLOCKFILE:
[1335]4318 {
4319 CHAR **list = BuildAList(hwnd);
[2]4320
[1335]4321 if (!list)
[1398]4322 Runtime_Error(pszSrcFile, __LINE__, NULL);
[1335]4323 else {
4324 switch (SHORT1FROMMP(mp1)) {
4325 case IDM_COLLECT:
4326 CollectList(hwnd, list);
4327 break;
4328 case IDM_DELETE:
4329 case IDM_PERMDELETE:
4330 case IDM_APPENDTOCLIP:
4331 case IDM_APPENDTOCLIPFILENAME:
4332 case IDM_SAVETOCLIP:
4333 case IDM_SAVETOCLIPFILENAME:
4334 case IDM_SAVETOLIST:
4335 case IDM_INFO:
4336 case IDM_ATTRS:
4337 case IDM_MOVE:
4338 case IDM_COPY:
4339 case IDM_RENAME:
4340 case IDM_MOVEPRESERVE:
4341 case IDM_COPYPRESERVE:
4342 case IDM_WILDMOVE:
4343 case IDM_WILDCOPY:
4344 case IDM_SUBJECT:
4345 case IDM_PRINT:
4346 case IDM_EAS:
4347 case IDM_ARCHIVE:
4348 case IDM_EXTRACT:
[1664]4349 case IDM_UUDECODE:
4350 case IDM_UNLOCKFILE:
[1335]4351 case IDM_OBJECT:
[1803]4352 case IDM_SHADOW:
4353 case IDM_JAVAEXE:
[1335]4354 case IDM_OPENSETTINGS:
[1741]4355 case IDM_OPENDEFAULT:
4356 if (SHORT1FROMMP(mp1) == IDM_DELETE)
4357 ignorereadonly = FALSE;
[1335]4358 if (!PostMsg(pAD->hwndObj, UM_MASSACTION, mp1, MPFROMP(list)))
4359 FreeList(list);
4360 break;
4361 }
4362 if (fUnHilite) {
4363 Mark(hwnd, AFM_UNMARK, NULL);
4364 WinInvalidateRect(hwnd, NULL, FALSE);
4365 }
4366 }
4367 }
4368 break;
[2]4369
[1335]4370 case IDM_COLLECTOR:
4371 if (mp2) {
[2]4372
[1335]4373 CHAR **list = mp2;
[2]4374
[1335]4375 if (Collector) {
4376 if (!PostMsg(Collector, WM_COMMAND,
4377 MPFROM2SHORT(IDM_COLLECTOR, 0), MPFROMP(list)))
4378 FreeList(list);
4379 else if (fUnHilite) {
4380 Mark(hwnd, AFM_UNMARK, NULL);
4381 WinInvalidateRect(hwnd, NULL, FALSE);
4382 }
4383 }
4384 else
4385 FreeList(list);
4386 }
4387 break;
4388 }
4389 DosReleaseMutexSem(pAD->hmtxScan);
[2]4390 }
[551]4391 else if (SHORT1FROMMP(mp1) == IDM_COLLECTOR) {
[1335]4392 DosSleep(50);//05 Aug 07 GKY 100
4393 if (!PostMsg(hwnd, msg, mp1, mp2))
4394 WinSendMsg(hwnd, msg, mp1, mp2);
[551]4395 }
4396 break;
[2]4397
[551]4398 case IDM_HELP:
4399 if (hwndHelp)
[1335]4400 WinSendMsg(hwndHelp,
4401 HM_DISPLAY_HELP,
4402 MPFROM2SHORT(HELP_SEEALL, 0), MPFROMSHORT(HM_RESOURCEID));
[2]4403 break;
[551]4404 }
4405 return 0;
[2]4406
[551]4407 case WM_SIZE:
[1559]4408 // DbgMsg(pszSrcFile, __LINE__, "SeeAllWndProc WM_SIZE");
[551]4409 PostMsg(hwnd, UM_SETUP3, MPVOID, MPVOID);
4410 break;
4411
4412 case WM_CLOSE:
[1559]4413 // DbgMsg(pszSrcFile, __LINE__, "SeeAllWndProc WM_CLOSE");
[551]4414 if (pAD)
4415 pAD->stopflag = 1;
4416 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
4417 return 0;
[2]4418
[551]4419 case WM_DESTROY:
[1559]4420 // DbgMsg(pszSrcFile, __LINE__, "SeeAllWndProc WM_DESTROY");
[551]4421 if (pAD) {
4422 pAD->stopflag = 1;
4423 if (pAD->hmtxScan) {
[1559]4424 apiret = DosRequestMutexSem(pAD->hmtxScan, 2000);
4425 if (apiret != NO_ERROR)
4426 Dos_Error(MB_CANCEL, apiret, hwnd, pszSrcFile, __LINE__, "DosRequestMutexSem");
4427 DosCloseMutexSem(pAD->hmtxScan); // Are probably going to die anyway
[2]4428 }
[551]4429 if (pAD->hwndPopup)
[1335]4430 WinDestroyWindow(pAD->hwndPopup);
[551]4431 if (pAD->hwndObj) {
[1335]4432 if (!PostMsg(pAD->hwndObj, WM_CLOSE, MPVOID, MPVOID))
4433 WinSendMsg(pAD->hwndObj, WM_CLOSE, MPVOID, MPVOID);
[551]4434 }
4435 if (pAD->hps) {
[1433]4436 GpiDeleteSetId(pAD->hps, SEEALLFILECNR_FONT_LCID);
[1335]4437 GpiAssociate(pAD->hps, 0);
4438 GpiDestroyPS(pAD->hps);
[551]4439 }
4440 if (pAD->killme) {
[1335]4441 if (!PostMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID))
4442 WinSendMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID);
[551]4443 }
4444 FreeAllFilesList(hwnd);
[1039]4445 free(pAD);
[551]4446 }
[1063]4447# ifdef FORTIFY
4448 Fortify_LeaveScope();
4449# endif
[551]4450 break;
[2]4451 }
4452
[551]4453 return WinDefWindowProc(hwnd, msg, mp1, mp2);
[2]4454}
4455
[1158]4456HWND StartSeeAll(HWND hwndParent, BOOL standalone, // called by applet
[1335]4457 CHAR * pszStartPath) // pathname or NULL
[84]4458{
[551]4459 HWND hwndFrame = (HWND) 0, hwndClient;
4460 ULONG FrameFlags = FCF_TITLEBAR | FCF_SYSMENU |
4461 FCF_SIZEBORDER | FCF_MINMAX |
4462 FCF_NOBYTEALIGN | FCF_VERTSCROLL |
4463 FCF_MENU | FCF_ICON | FCF_ACCELTABLE | FCF_HORZSCROLL;
[2]4464
[551]4465 if (ParentIsDesktop(hwndParent, hwndParent))
[2]4466 FrameFlags |= (FCF_TASKLIST | FCF_SHELLPOSITION);
4467 hwndFrame = WinCreateStdWindow(hwndParent,
[1335]4468 WS_VISIBLE,
4469 &FrameFlags,
[1498]4470 (CHAR *) WC_SEEALL,
4471 (CHAR *) GetPString(IDS_SEEALLTITLETEXT),
[1335]4472 WS_VISIBLE | fwsAnimate,
4473 FM3ModHandle, SEEALL_FRAME, &hwndClient);
[551]4474 if (hwndFrame) {
4475 static CHAR *pszDir;
4476
4477 if (standalone) {
4478 if (!PostMsg(WinWindowFromID(hwndFrame, FID_CLIENT),
[1335]4479 UM_SETUP4, MPVOID, MPVOID)) {
4480 PostMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID);
4481 return (HWND) 0;
[2]4482 }
4483 }
[551]4484 if (pszStartPath) {
[84]4485 // Needs to be static for other thread
4486 if (!pszDir)
[1335]4487 pszDir = xmalloc(CCHMAXPATH, pszSrcFile, __LINE__);
[84]4488 if (pszDir) {
[1335]4489 strcpy(pszDir, pszStartPath);
4490 pszStartPath = pszDir;
[84]4491 }
4492 }
[551]4493 PostMsg(WinWindowFromID(hwndFrame, FID_CLIENT),
[1335]4494 UM_SETUP5, MPFROMP(pszStartPath), MPVOID);
[2]4495 }
[551]4496 else if (standalone)
4497 PostMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID);
[2]4498 return hwndFrame;
4499}
[783]4500
4501#pragma alloc_text(SEEALL,comparefullnames,comparenames,comparesizes)
4502#pragma alloc_text(SEEALL,comparedates,compareexts,SeeStatusProc)
4503#pragma alloc_text(SEEALL,InitWindow,PaintLine,SeeAllWndProc)
4504#pragma alloc_text(SEEALL,UpdateList,CollectList,ReSort,Mark)
[985]4505#pragma alloc_text(SEEALL,BuildAList,RemoveDeleted,SeeFrameWndProc,FilterList,FilterAll)
[787]4506#pragma alloc_text(SEEALL2,SeeObjWndProc,MakeSeeObjWinThread,FindDupesThread,DupeDlgProc)
[783]4507#pragma alloc_text(SEEALL3,FreeAllFilesList,DoADir,FindAllThread,AFDrvsWndProc)
4508#pragma alloc_text(SEEALL3,StartSeeAll)
4509
Note: See TracBrowser for help on using the repository browser.