source: trunk/dll/seeall.c@ 130

Last change on this file since 130 was 130, checked in by root, 20 years ago

Use QWL_USER

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