source: trunk/dll/seeall.c@ 943

Last change on this file since 943 was 943, checked in by Gregg Young, 18 years ago

Rename some varibles to make code easier to follow

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