source: trunk/dll/seeall.c@ 118

Last change on this file since 118 was 84, checked in by root, 21 years ago

StartSeeAll: avoid forgetting startpath, correct malloc arg oops

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