source: trunk/dll/seeall.c@ 975

Last change on this file since 975 was 961, checked in by Steven Levine, 18 years ago

Restore SaveDirCnrState internal state save logic - accidentally removed
Move save shutdown state name to strings (IDS_SHUTDOWNSTATE, ShutdownState)

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