source: trunk/dll/seeall.c@ 1391

Last change on this file since 1391 was 1391, checked in by Gregg Young, 17 years ago

Move nontranslated strings to init.c and codepage.c; use those strings in place of GetPString calls. Move other strings to a StringTable; minor cleanup and code changes to codepage.c to use a string array instead of GetPString calls. Ticket 340

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