source: trunk/dll/seeall.c@ 533

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

Renames
Count thread usage

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