source: trunk/dll/seeall.c@ 201

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