source: trunk/dll/seeall.c@ 1036

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

Additional fortify scopes mostly for "lists"

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