source: trunk/dll/seeall.c@ 517

Last change on this file since 517 was 517, checked in by root, 19 years ago

Correct . and .. detect

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