source: trunk/dll/seeall.c@ 1212

Last change on this file since 1212 was 1212, checked in by John Small, 17 years ago

Ticket 187: Move data declarations/definitions out of fm3dll.h

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