source: trunk/dll/seeall.c@ 50

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

Comments

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