source: trunk/dll/seeall.c@ 175

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

Use ULONGLONG and CommaFmtULL

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