source: trunk/dll/seeall.c@ 433

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

Validate WinCreateWindow

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