source: trunk/dll/seeall.c@ 1178

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

Ticket 187: Draft 1: Functions only

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