source: trunk/dll/seeall.c@ 204

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

Drop unused code

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