source: trunk/dll/seeall.c@ 1673

Last change on this file since 1673 was 1673, checked in by Gregg Young, 13 years ago

Update to Doxygen comment style Ticket 55. Also some minor code cleanup.

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