source: trunk/dll/seeall.c@ 2

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

Initial revision

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