source: trunk/dll/seeall.c@ 36

Last change on this file since 36 was 36, checked in by root, 23 years ago

Handle large partitions

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