source: trunk/dll/seeall.c@ 302

Last change on this file since 302 was 302, checked in by root, 19 years ago

Comments

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