source: trunk/dll/select.c@ 158

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

Rework for ULONGLONG

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 45.7 KB
Line 
1
2/***********************************************************************
3
4 $Id: select.c 158 2005-05-26 02:19:05Z root $
5
6 Copyright (c) 1993-98 M. Kimes
7 Copyright (c) 2004, 2005 Steven H. Levine
8
9 01 Aug 04 SHL Rework lstrip/rstrip usage
10 25 May 05 SHL Rework for ULONGLONG
11
12***********************************************************************/
13
14#define INCL_DOS
15#define INCL_WIN
16#define INCL_LONGLONG
17#include <os2.h>
18
19#include <stdio.h>
20#include <stdlib.h>
21#include <string.h>
22#include <share.h>
23
24#include "fm3dll.h"
25#include "fm3str.h"
26
27#pragma alloc_text(SELECT,UnHilite,SelectAll,DeselectAll,MarkAll,SetMask)
28#pragma alloc_text(SELECT,SelectList)
29#pragma alloc_text(SELECT1,Deselect,HideAll,RemoveAll,ExpandAll,InvertAll)
30
31
32VOID UnHilite (HWND hwndCnr,BOOL all,CHAR ***list) {
33
34 PCNRITEM pci;
35 INT numfiles = 0,numalloc = 0;
36 INT attribute = CRA_CURSORED;
37
38 if(all && list && *list) {
39 FreeList(*list);
40 *list = NULL;
41 }
42 pci = (PCNRITEM)CurrentRecord(hwndCnr);
43 if(pci && (INT)pci != -1) {
44 if(pci->rc.flRecordAttr & CRA_SELECTED) {
45 attribute = CRA_SELECTED;
46 pci = WinSendMsg(hwndCnr,CM_QUERYRECORDEMPHASIS,MPFROMLONG(CMA_FIRST),
47 MPFROMSHORT(attribute));
48 }
49 while(pci && (INT)pci != -1) {
50 WinSendMsg(hwndCnr,CM_SETRECORDEMPHASIS,MPFROMP(pci),
51 MPFROM2SHORT(FALSE,CRA_SELECTED));
52 if(!all)
53 break;
54 if(list)
55 AddToList(pci->szFileName,list,&numfiles,&numalloc);
56 pci = (PCNRITEM)WinSendMsg(hwndCnr,CM_QUERYRECORDEMPHASIS,
57 MPFROMP(pci),
58 MPFROMSHORT(CRA_SELECTED));
59 }
60 }
61}
62
63
64VOID SelectList (HWND hwndCnr,BOOL partial,BOOL deselect,BOOL clearfirst,
65 PCNRITEM pciParent,CHAR *filename,CHAR **list) {
66
67 PCNRITEM pci;
68 register INT x;
69 BOOL foundone = FALSE;
70 ULONG errs = 0L;
71
72 if(clearfirst && !deselect)
73 UnHilite(hwndCnr,TRUE,NULL);
74 if(list && list[0]) {
75 for(x = 0;list[x];x++) {
76 pci = FindCnrRecord(hwndCnr,
77 list[x],
78 pciParent,
79 partial,
80 partial,
81 TRUE);
82 if(pci) {
83 WinSendMsg(hwndCnr,
84 CM_SETRECORDEMPHASIS,
85 MPFROMP(pci),
86 MPFROM2SHORT((SHORT)((deselect) ? FALSE : TRUE),
87 CRA_SELECTED));
88 foundone = TRUE;
89 }
90 }
91 if(!foundone && !partial) {
92
93 }
94 if(!foundone)
95 DosBeep(250,50);
96 }
97 else if(filename && *filename) {
98
99 FILE *fp;
100 CHAR input[1024],*p;
101
102 fp = _fsopen(filename,"r",SH_DENYNO);
103 if(fp) {
104 while(!feof(fp)) {
105 if(!fgets(input,1024,fp))
106 break;
107 input[1023] = 0;
108 bstripcr(input);
109 if(*input == '\"') {
110 memmove(input,input + 1,strlen(input) + 1);
111 lstrip(input);
112 p = strchr(input,'\"');
113 if(p)
114 *p = 0;
115 rstrip(input);
116 }
117 else {
118 p = strchr(input,' ');
119 if(p)
120 *p = 0;
121 }
122 /* input now contains name of file to select */
123 pci = FindCnrRecord(hwndCnr,
124 input,
125 pciParent,
126 partial,
127 partial,
128 TRUE);
129 if(pci) /* found it? */
130 WinSendMsg(hwndCnr,
131 CM_SETRECORDEMPHASIS,
132 MPFROMP(pci),
133 MPFROM2SHORT((SHORT)((deselect) ? FALSE : TRUE),
134 CRA_SELECTED));
135 else
136 errs++;
137 if(errs > 50L) { /* prevent runaway on bad file */
138
139 APIRET ret;
140
141 ret = saymsg(MB_YESNO,
142 hwndCnr,
143 GetPString(IDS_POSSIBLEERRORTEXT),
144 GetPString(IDS_MAYNOTBELISTTEXT),
145 filename);
146 if(ret == MBID_NO)
147 break;
148 errs = 0L;
149 }
150 }
151 fclose(fp);
152 }
153 }
154}
155
156
157VOID SelectAll (HWND hwndCnr,BOOL files,BOOL dirs,CHAR *mask,
158 CHAR *text,BOOL arc) {
159
160 PCNRITEM pci;
161 BOOL markit;
162 register CHAR *file;
163 MASK Mask;
164 register INT x;
165 ULONG textlen = 0;
166
167 if(text)
168 textlen = strlen(text);
169 memset(&Mask,0,sizeof(Mask));
170 if(mask && *mask)
171 SetMask(mask,&Mask);
172 pci = (PCNRITEM)WinSendMsg(hwndCnr,CM_QUERYRECORD,MPVOID,
173 MPFROM2SHORT(CMA_FIRST,CMA_ITEMORDER));
174 while( pci && (INT)pci != -1 ) {
175 markit = FALSE;
176 if(!(pci->rc.flRecordAttr & CRA_FILTERED)) {
177 if(!arc) {
178 if(files && !(pci->attrFile & FILE_DIRECTORY))
179 markit = TRUE;
180 if(dirs && (pci->attrFile & FILE_DIRECTORY))
181 markit = TRUE;
182 }
183 else
184 markit = TRUE;
185 if(mask && *mask && markit) {
186 markit = FALSE;
187 file = strrchr(pci->szFileName,'\\');
188 if(!file)
189 file = strrchr(pci->szFileName,':');
190 if(file)
191 file++;
192 else
193 file = pci->szFileName;
194 for(x = 0;Mask.pszMasks[x];x++) {
195 if(*Mask.pszMasks[x]) {
196 if(*Mask.pszMasks[x] != '/') {
197 if(wildcard((strchr(Mask.pszMasks[x],'\\') ||
198 strchr(Mask.pszMasks[x],':')) ?
199 pci->szFileName : file,Mask.pszMasks[x],FALSE))
200 markit = TRUE;
201 }
202 else {
203 if(wildcard((strchr(Mask.pszMasks[x],'\\') ||
204 strchr(Mask.pszMasks[x],':'),FALSE) ?
205 pci->szFileName : file,Mask.pszMasks[x] + 1,
206 FALSE)) {
207 markit = FALSE;
208 break;
209 }
210 }
211 }
212 }
213 }
214 }
215 if(markit && text && *text && !(pci->attrFile & FILE_DIRECTORY)) {
216
217 CHAR *input;
218
219 markit = FALSE;
220 input = malloc(65537);
221 if(input) {
222
223 ULONG pos;
224 LONG len;
225 FILE *inputFile;
226
227 if((inputFile = _fsopen(pci->szFileName,"rb",SH_DENYNO)) != NULL) {
228 pos = ftell(inputFile);
229 while(!feof(inputFile)) {
230 if(pos)
231 fseek(inputFile,pos - 256,SEEK_SET);
232 len = fread(input,1,65536,inputFile);
233 if(len >= 0) {
234 if(findstring(text,textlen,input,len,FALSE)) {
235 markit = TRUE;
236 break;
237 }
238 }
239 else
240 break;
241 }
242 fclose(inputFile) ;
243 }
244 free(input);
245 DosSleep(1L);
246 }
247 }
248 else if(markit && text && *text && (pci->attrFile & FILE_DIRECTORY))
249 markit = FALSE;
250 if(markit)
251 WinSendMsg(hwndCnr,CM_SETRECORDEMPHASIS,MPFROMP(pci),
252 MPFROM2SHORT(TRUE,CRA_SELECTED));
253 pci = (PCNRITEM)WinSendMsg(hwndCnr,CM_QUERYRECORD,MPFROMP(pci),
254 MPFROM2SHORT(CMA_NEXT,CMA_ITEMORDER));
255 }
256}
257
258
259VOID DeselectAll (HWND hwndCnr,BOOL files,BOOL dirs,CHAR *mask,CHAR *text,
260 BOOL arc) {
261
262 PCNRITEM pci;
263 BOOL unmarkit;
264 register CHAR *file;
265 MASK Mask;
266 register INT x;
267 ULONG textlen = 0;
268
269 if(text)
270 textlen = strlen(text);
271 memset(&Mask,0,sizeof(Mask));
272 if(mask && *mask)
273 SetMask(mask,&Mask);
274 pci = (PCNRITEM)WinSendMsg(hwndCnr,CM_QUERYRECORD,MPVOID,
275 MPFROM2SHORT(CMA_FIRST,CMA_ITEMORDER));
276 while( pci && (INT)pci != -1 ) {
277 unmarkit = FALSE;
278 if(!(pci->rc.flRecordAttr & CRA_FILTERED)) {
279 if(!arc) {
280 if(files && !(pci->attrFile & FILE_DIRECTORY))
281 unmarkit = TRUE;
282 if(dirs && (pci->attrFile & FILE_DIRECTORY))
283 unmarkit = TRUE;
284 }
285 else
286 unmarkit = TRUE;
287 if(mask && *mask && unmarkit) {
288 unmarkit = FALSE;
289 file = strrchr(pci->szFileName,'\\');
290 if(!file)
291 file = strrchr(pci->szFileName,':');
292 if(file)
293 file++;
294 else
295 file = pci->szFileName;
296 for(x = 0;Mask.pszMasks[x];x++) {
297 if(*Mask.pszMasks[x]) {
298 if(*Mask.pszMasks[x] != '/') {
299 if(wildcard((strchr(Mask.pszMasks[x],'\\') ||
300 strchr(Mask.pszMasks[x],':')) ?
301 pci->szFileName : file,Mask.pszMasks[x],FALSE))
302 unmarkit = TRUE;
303 }
304 else {
305 if(wildcard((strchr(Mask.pszMasks[x],'\\') ||
306 strchr(Mask.pszMasks[x],':')) ?
307 pci->szFileName : file,Mask.pszMasks[x] + 1,
308 FALSE)) {
309 unmarkit = FALSE;
310 break;
311 }
312 }
313 }
314 }
315 }
316 }
317 if(unmarkit && text && *text && !(pci->attrFile & FILE_DIRECTORY)) {
318
319 CHAR *input;
320
321 unmarkit = FALSE;
322 input = malloc(65537);
323 if(input) {
324
325 ULONG pos;
326 LONG len;
327 FILE *inputFile;
328
329 if((inputFile = _fsopen(pci->szFileName,"rb",SH_DENYNO)) != NULL) {
330 pos = ftell(inputFile);
331 while(!feof(inputFile)) {
332 if(pos)
333 fseek(inputFile,pos - 256,SEEK_SET);
334 len = fread(input,1,65536,inputFile);
335 if(len >= 0) {
336 if(findstring(text,textlen,input,len,FALSE)) {
337 unmarkit = TRUE;
338 break;
339 }
340 }
341 else
342 break;
343 }
344 fclose(inputFile) ;
345 }
346 free(input);
347 DosSleep(1L);
348 }
349 }
350 else if(unmarkit && text && *text && (pci->attrFile & FILE_DIRECTORY))
351 unmarkit = FALSE;
352 if(unmarkit)
353 WinSendMsg(hwndCnr,CM_SETRECORDEMPHASIS,pci,
354 MPFROM2SHORT(FALSE,CRA_SELECTED | CRA_CURSORED |
355 CRA_INUSE | CRA_SOURCE));
356 pci = (PCNRITEM)WinSendMsg(hwndCnr,CM_QUERYRECORD,MPFROMP(pci),
357 MPFROM2SHORT(CMA_NEXT,CMA_ITEMORDER));
358 }
359}
360
361
362VOID Deselect (HWND hwndCnr) {
363
364 PCNRITEM pcil;
365
366 pcil = (PCNRITEM)WinSendMsg(hwndCnr,CM_QUERYRECORDEMPHASIS,
367 MPFROMLONG(CMA_FIRST),
368 MPFROMSHORT(CRA_SELECTED));
369 while(pcil && (INT)pcil != -1) {
370 WinSendMsg(hwndCnr,CM_SETRECORDEMPHASIS,MPFROMP(pcil),
371 MPFROM2SHORT(FALSE,CRA_SELECTED));
372 pcil = WinSendMsg(hwndCnr,CM_QUERYRECORDEMPHASIS,MPFROMP(pcil),
373 MPFROMSHORT(CRA_SELECTED));
374 }
375}
376
377
378VOID HideAll (HWND hwndCnr) {
379
380 PCNRITEM pci,pciH;
381 INT attribute = CRA_CURSORED;
382 CNRINFO cnri;
383 BOOL didone = FALSE;
384
385 memset(&cnri,0,sizeof(CNRINFO));
386 cnri.cb = sizeof(CNRINFO);
387 WinSendMsg(hwndCnr,CM_QUERYCNRINFO,MPFROMP(&cnri),
388 MPFROMLONG(sizeof(CNRINFO)));
389 pci = (PCNRITEM)CurrentRecord(hwndCnr);
390 if(pci && (INT)pci != -1) {
391 if(pci->rc.flRecordAttr & CRA_SELECTED) {
392 attribute = CRA_SELECTED;
393 pci = WinSendMsg(hwndCnr,CM_QUERYRECORDEMPHASIS,MPFROMLONG(CMA_FIRST),
394 MPFROMSHORT(attribute));
395 }
396 }
397 while(pci && (INT)pci != -1) {
398 pciH = WinSendMsg(hwndCnr,CM_QUERYRECORDEMPHASIS,MPFROMP(pci),
399 MPFROMSHORT(attribute));
400 WinSendMsg(hwndCnr,CM_SETRECORDEMPHASIS,MPFROMP(pci),
401 MPFROM2SHORT(FALSE,CRA_CURSORED | CRA_SELECTED |
402 CRA_INUSE | CRA_SOURCE));
403 pci->rc.flRecordAttr |= CRA_FILTERED;
404 didone = TRUE;
405 if(fSyncUpdates) {
406 if(cnri.flWindowAttr & CV_DETAIL)
407 WinSendMsg(hwndCnr,CM_INVALIDATERECORD,MPVOID,
408 MPFROM2SHORT(0,CMA_REPOSITION | CMA_ERASE));
409 else
410 WinSendMsg(hwndCnr,CM_INVALIDATERECORD,MPFROMP(&pci),
411 MPFROM2SHORT(1,CMA_REPOSITION | CMA_ERASE));
412 }
413 pci = pciH;
414 }
415 if(didone && !fSyncUpdates)
416 WinSendMsg(hwndCnr,CM_INVALIDATERECORD,MPVOID,
417 MPFROM2SHORT(0,CMA_ERASE | CMA_REPOSITION));
418}
419
420
421VOID MarkAll (HWND hwndCnr,BOOL quitit,BOOL target,BOOL source) {
422
423 PCNRITEM pci;
424 INT attribute = CRA_CURSORED;
425
426 if(quitit)
427 attribute = (target) ? CRA_TARGET : (source) ? CRA_SOURCE : CRA_INUSE;
428 pci = (PCNRITEM)WinSendMsg(hwndCnr,CM_QUERYRECORDEMPHASIS,
429 MPFROMLONG(CMA_FIRST),
430 MPFROMSHORT(attribute));
431 if(pci && (INT)pci != -1) {
432 if(attribute == CRA_CURSORED) {
433 if(pci->rc.flRecordAttr & CRA_SELECTED) {
434 attribute = CRA_SELECTED;
435 pci = WinSendMsg(hwndCnr,CM_QUERYRECORDEMPHASIS,MPFROMLONG(CMA_FIRST),
436 MPFROMSHORT(attribute));
437 }
438 }
439 }
440 while( pci && (INT)pci != -1) {
441 WinSendMsg(hwndCnr,CM_SETRECORDEMPHASIS,MPFROMP(pci),
442 MPFROM2SHORT(!quitit,
443 ((target) ? CRA_TARGET : (source) ? CRA_SOURCE : CRA_INUSE)));
444 pci = WinSendMsg(hwndCnr,CM_QUERYRECORDEMPHASIS,MPFROMP(pci),
445 MPFROMSHORT(attribute));
446 }
447}
448
449
450VOID RemoveAll (HWND hwndCnr,ULONGLONG *pullTotalBytes,ULONG *pulTotalFiles) {
451
452 PCNRITEM pci;
453 INT attribute = CRA_CURSORED;
454 BOOL didone = FALSE;
455
456 pci = (PCNRITEM)CurrentRecord(hwndCnr);
457 if(pci && (INT)pci != -1) {
458 if(pci->rc.flRecordAttr & CRA_SELECTED) {
459 attribute = CRA_SELECTED;
460 pci = WinSendMsg(hwndCnr,CM_QUERYRECORDEMPHASIS,MPFROMLONG(CMA_FIRST),
461 MPFROMSHORT(attribute));
462 }
463 }
464 while(pci && (INT)pci != -1) {
465 if (!(pci->rc.flRecordAttr & CRA_FILTERED))
466 {
467 didone = TRUE;
468 if (pulTotalFiles)
469 *pulTotalFiles--;
470 if (pullTotalBytes)
471 *pullTotalBytes -= (pci->cbFile + pci->easize);
472 WinSendMsg(hwndCnr,CM_SETRECORDEMPHASIS,MPFROMP(pci),
473 MPFROM2SHORT(0,CRA_SELECTED));
474 if(fSyncUpdates)
475 WinSendMsg(hwndCnr,CM_REMOVERECORD,MPFROMP(&pci),
476 MPFROM2SHORT(1,CMA_FREE | CMA_INVALIDATE));
477 else
478 WinSendMsg(hwndCnr,CM_REMOVERECORD,MPFROMP(&pci),
479 MPFROM2SHORT(1,CMA_FREE));
480 if(attribute == CRA_CURSORED)
481 break;
482 pci = WinSendMsg(hwndCnr,CM_QUERYRECORDEMPHASIS,MPFROMLONG(CMA_FIRST),
483 MPFROMSHORT(attribute));
484 }
485 else
486 pci = WinSendMsg(hwndCnr,CM_QUERYRECORDEMPHASIS,MPFROMP(pci),
487 MPFROMSHORT(attribute));
488 }
489 if(didone && !fSyncUpdates)
490 WinSendMsg(hwndCnr,CM_INVALIDATERECORD,MPVOID,
491 MPFROM2SHORT(0,CMA_REPOSITION));
492}
493
494
495VOID SetMask (CHAR *str,MASK *mask) {
496
497 register INT x;
498 register CHAR *p;
499
500 if(str != mask->szMask)
501 strcpy(mask->szMask,str);
502 strcpy(mask->szMaskCopy,mask->szMask);
503 memset(mask->pszMasks,0,sizeof(CHAR *) * 26);
504 p = mask->pszMasks[0] = mask->szMaskCopy;
505 for(x = 1;x < 24;x++) {
506 while(*p && *p != ';')
507 p++;
508 if(*p) {
509 *p = 0;
510 p++;
511 mask->pszMasks[x] = p;
512 }
513 else {
514 mask->pszMasks[x] = NULL;
515 break;
516 }
517 }
518 mask->pszMasks[x] = NULL;
519}
520
521
522VOID ExpandAll (HWND hwndCnr,BOOL expand,PCNRITEM pciParent) {
523
524 PCNRITEM pci;
525
526 if(!pciParent)
527 pciParent = WinSendMsg(hwndCnr,CM_QUERYRECORD,MPFROMP(NULL),
528 MPFROM2SHORT(CMA_FIRST,CMA_ITEMORDER));
529 if(pciParent) {
530 if(expand && !(pciParent->rc.flRecordAttr & CRA_EXPANDED))
531 WinSendMsg(hwndCnr,CM_EXPANDTREE,MPFROMP(pciParent),MPVOID);
532 else if(!expand && (pciParent->rc.flRecordAttr & CRA_EXPANDED))
533 WinSendMsg(hwndCnr,CM_COLLAPSETREE,MPFROMP(pciParent),MPVOID);
534 pci = (PCNRITEM)WinSendMsg(hwndCnr,CM_QUERYRECORD,MPFROMP(pciParent),
535 MPFROM2SHORT(CMA_FIRSTCHILD,CMA_ITEMORDER));
536 if(pci)
537 DosSleep(1L);
538 while(pci && (INT)pci != -1) {
539 ExpandAll(hwndCnr,expand,pci);
540 pci = (PCNRITEM)WinSendMsg(hwndCnr,CM_QUERYRECORD,MPFROMP(pci),
541 MPFROM2SHORT(CMA_NEXT,CMA_ITEMORDER));
542 }
543 }
544 DosSleep(0L);
545}
546
547
548VOID InvertAll (HWND hwndCnr) {
549
550 PCNRITEM pci;
551
552 pci = (PCNRITEM)WinSendMsg(hwndCnr,CM_QUERYRECORD,MPVOID,
553 MPFROM2SHORT(CMA_FIRST,CMA_ITEMORDER));
554 while( pci && (INT)pci != -1 ) {
555 if(!(pci->rc.flRecordAttr & CRA_FILTERED)) {
556 if(!(pci->rc.flRecordAttr & CRA_SELECTED))
557 WinSendMsg(hwndCnr,CM_SETRECORDEMPHASIS,MPFROMP(pci),
558 MPFROM2SHORT(TRUE,CRA_SELECTED));
559 else
560 WinSendMsg(hwndCnr,CM_SETRECORDEMPHASIS,MPFROMP(pci),
561 MPFROM2SHORT(FALSE,CRA_SELECTED));
562 }
563 pci = (PCNRITEM)WinSendMsg(hwndCnr,CM_QUERYRECORD,MPFROMP(pci),
564 MPFROM2SHORT(CMA_NEXT,CMA_ITEMORDER));
565 }
566}
567
568
569#pragma alloc_text (SELECT3,SpecialSelect,CompNames,CompNamesB)
570#pragma alloc_text(SELECT4,FreeCnrs,SpecialSelect2,CompSSNames,CompSSNamesB)
571
572
573static int CompNamesB (const void *s1,const void *s2) {
574
575 PCNRITEM pci = *(PCNRITEM *)s2;
576
577 return stricmp((CHAR *)s1,pci->pszFileName);
578}
579
580
581static int CompNames (const void *s1,const void *s2) {
582
583 PCNRITEM pci1 = *(PCNRITEM *)s1;
584 PCNRITEM pci2 = *(PCNRITEM *)s2;
585
586 return stricmp(pci1->pszFileName,pci2->pszFileName);
587}
588
589
590VOID SpecialSelect (HWND hwndCnrS,HWND hwndCnrD,INT action,BOOL reset) {
591
592 PCNRITEM pciS,pciD,*pciSa = NULL,*pciDa = NULL;
593 CNRINFO cnri;
594 BOOL slow = FALSE;
595 register INT x,numD,numS;
596
597 if(!hwndCnrS || !hwndCnrD)
598 return;
599
600 memset(&cnri,0,sizeof(CNRINFO));
601 cnri.cb = sizeof(CNRINFO);
602 WinSendMsg(hwndCnrD,CM_QUERYCNRINFO,MPFROMP(&cnri),
603 MPFROMLONG(sizeof(CNRINFO)));
604 numD = (INT)cnri.cRecords;
605 memset(&cnri,0,sizeof(CNRINFO));
606 cnri.cb = sizeof(CNRINFO);
607 WinSendMsg(hwndCnrS,CM_QUERYCNRINFO,MPFROMP(&cnri),
608 MPFROMLONG(sizeof(CNRINFO)));
609 numS = (INT)cnri.cRecords;
610 if(!numD || numS != numD) {
611 DosBeep(250,100);
612 saymsg(MB_ENTER,
613 HWND_DESKTOP,
614 DEBUG_STRING,
615 "numD (%lu) != numS (%lu)",
616 numD,
617 numS);
618 return;
619 }
620 pciDa = malloc(sizeof(PCNRITEM) * numD);
621 if(!pciDa) {
622 DosBeep(250,100);
623 return;
624 }
625
626 pciSa = malloc(sizeof(PCNRITEM) * numS);
627 if(!pciSa) {
628 if(pciDa)
629 free(pciDa);
630 DosBeep(250,100);
631 return;
632 }
633
634Restart:
635
636 memset(pciDa,0,sizeof(PCNRITEM) * numD);
637 memset(pciSa,0,sizeof(PCNRITEM) * numS);
638
639 pciD = (PCNRITEM)WinSendMsg(hwndCnrD,CM_QUERYRECORD,MPVOID,
640 MPFROM2SHORT(CMA_FIRST,CMA_ITEMORDER));
641 x = 0;
642 while( pciD && (INT)pciD != -1 && x < numD) {
643 if(reset)
644 pciD->flags = 0;
645 pciDa[x] = pciD;
646 x++;
647 if(!slow)
648 pciD = (PCNRITEM)pciD->rc.preccNextRecord;
649 else
650 pciD = (PCNRITEM)WinSendMsg(hwndCnrD,CM_QUERYRECORD,MPFROMP(pciD),
651 MPFROM2SHORT(CMA_NEXT,CMA_ITEMORDER));
652 if(!(x % 500))
653 DosSleep(1L);
654 else if(!(x % 50))
655 DosSleep(0L);
656 }
657 if(numD != x) {
658 if(!slow) {
659 slow = TRUE;
660 goto Restart;
661 }
662 free(pciDa);
663 free(pciSa);
664 DosBeep(250,100);
665 saymsg(MB_ENTER,
666 HWND_DESKTOP,
667 DEBUG_STRING,
668 "numD (%lu) != x (%lu)",
669 numD,
670 x);
671 return;
672 }
673
674 pciS = (PCNRITEM)WinSendMsg(hwndCnrS,CM_QUERYRECORD,MPVOID,
675 MPFROM2SHORT(CMA_FIRST,CMA_ITEMORDER));
676 x = 0;
677 while( pciS && (INT)pciS != -1 && x < numS) {
678 if(reset)
679 pciS->flags = 0;
680 pciSa[x] = pciS;
681 x++;
682 if(!slow)
683 pciS = (PCNRITEM)pciS->rc.preccNextRecord;
684 else
685 pciS = (PCNRITEM)WinSendMsg(hwndCnrS,CM_QUERYRECORD,MPFROMP(pciS),
686 MPFROM2SHORT(CMA_NEXT,CMA_ITEMORDER));
687 if(!(x % 500))
688 DosSleep(1L);
689 else if(!(x % 50))
690 DosSleep(0L);
691 }
692 if(numS != x) {
693 if(!slow) {
694 slow = TRUE;
695 goto Restart;
696 }
697 free(pciSa);
698 free(pciDa);
699 DosBeep(250,100);
700 saymsg(MB_ENTER,
701 HWND_DESKTOP,
702 DEBUG_STRING,
703 "numS (%lu) != x (%lu)",
704 numS,
705 x);
706 return;
707 }
708
709 if(reset) {
710 for(x = 0;x < numS;x++) {
711 if(!*pciSa[x]->szFileName || !*pciDa[x]->szFileName)
712 continue;
713 pciSa[x]->flags |= CNRITEM_EXISTS;
714 pciDa[x]->flags |= CNRITEM_EXISTS;
715 if(pciSa[x]->cbFile + pciSa[x]->easize >
716 pciDa[x]->cbFile + pciDa[x]->easize) {
717 pciSa[x]->flags |= CNRITEM_LARGER;
718 pciDa[x]->flags |= CNRITEM_SMALLER;
719 }
720 else if(pciSa[x]->cbFile + pciSa[x]->easize <
721 pciDa[x]->cbFile + pciDa[x]->easize) {
722 pciSa[x]->flags |= CNRITEM_SMALLER;
723 pciDa[x]->flags |= CNRITEM_LARGER;
724 }
725 if((pciSa[x]->date.year > pciDa[x]->date.year) ? TRUE :
726 (pciSa[x]->date.year < pciDa[x]->date.year) ? FALSE :
727 (pciSa[x]->date.month > pciDa[x]->date.month) ? TRUE :
728 (pciSa[x]->date.month < pciDa[x]->date.month) ? FALSE :
729 (pciSa[x]->date.day > pciDa[x]->date.day) ? TRUE :
730 (pciSa[x]->date.day < pciDa[x]->date.day) ? FALSE :
731 (pciSa[x]->time.hours > pciDa[x]->time.hours) ? TRUE :
732 (pciSa[x]->time.hours < pciDa[x]->time.hours) ? FALSE :
733 (pciSa[x]->time.minutes > pciDa[x]->time.minutes) ? TRUE :
734 (pciSa[x]->time.minutes < pciDa[x]->time.minutes) ? FALSE :
735 (pciSa[x]->time.seconds > pciDa[x]->time.seconds) ? TRUE :
736 (pciSa[x]->time.seconds < pciDa[x]->time.seconds) ? FALSE : FALSE) {
737 pciSa[x]->flags |= CNRITEM_NEWER;
738 pciDa[x]->flags |= CNRITEM_OLDER;
739 }
740 else if((pciSa[x]->date.year < pciDa[x]->date.year) ? TRUE :
741 (pciSa[x]->date.year > pciDa[x]->date.year) ? FALSE :
742 (pciSa[x]->date.month < pciDa[x]->date.month) ? TRUE :
743 (pciSa[x]->date.month > pciDa[x]->date.month) ? FALSE :
744 (pciSa[x]->date.day < pciDa[x]->date.day) ? TRUE :
745 (pciSa[x]->date.day > pciDa[x]->date.day) ? FALSE :
746 (pciSa[x]->time.hours < pciDa[x]->time.hours) ? TRUE :
747 (pciSa[x]->time.hours > pciDa[x]->time.hours) ? FALSE :
748 (pciSa[x]->time.minutes < pciDa[x]->time.minutes) ? TRUE :
749 (pciSa[x]->time.minutes > pciDa[x]->time.minutes) ? FALSE :
750 (pciSa[x]->time.seconds < pciDa[x]->time.seconds) ? TRUE :
751 (pciSa[x]->time.seconds > pciDa[x]->time.seconds) ? FALSE :
752 FALSE) {
753 pciSa[x]->flags |= CNRITEM_OLDER;
754 pciDa[x]->flags |= CNRITEM_NEWER;
755 }
756 if(!(x % 500))
757 DosSleep(1L);
758 else if(!(x % 50))
759 DosSleep(0L);
760 }
761 }
762
763 switch(action) {
764 case IDM_SELECTIDENTICAL:
765 for(x = 0;x < numS;x++) {
766 if(!(pciSa[x]->rc.flRecordAttr & CRA_FILTERED)) {
767 if(*pciSa[x]->szFileName &&
768 (pciSa[x]->flags & CNRITEM_EXISTS) &&
769 !(pciSa[x]->flags & CNRITEM_SMALLER) &&
770 !(pciSa[x]->flags & CNRITEM_LARGER) &&
771 !(pciSa[x]->flags & CNRITEM_NEWER) &&
772 !(pciSa[x]->flags & CNRITEM_OLDER)) {
773 if(!(pciSa[x]->rc.flRecordAttr & CRA_SELECTED))
774 WinSendMsg(hwndCnrS,CM_SETRECORDEMPHASIS,MPFROMP(pciSa[x]),
775 MPFROM2SHORT(TRUE,CRA_SELECTED));
776 if(!(pciDa[x]->rc.flRecordAttr & CRA_SELECTED))
777 WinSendMsg(hwndCnrD,CM_SETRECORDEMPHASIS,MPFROMP(pciDa[x]),
778 MPFROM2SHORT(TRUE,CRA_SELECTED));
779 }
780 if(!(x % 500))
781 DosSleep(1L);
782 else if(!(x % 50))
783 DosSleep(0L);
784 }
785 }
786 break;
787
788 case IDM_SELECTSAME:
789 for(x = 0;x < numS;x++) {
790 if(!(pciSa[x]->rc.flRecordAttr & CRA_FILTERED) &&
791 *pciSa[x]->szFileName &&
792 (pciSa[x]->flags & CNRITEM_EXISTS) &&
793 !(pciSa[x]->flags & CNRITEM_SMALLER) &&
794 !(pciSa[x]->flags & CNRITEM_LARGER)) {
795 if(!(pciSa[x]->rc.flRecordAttr & CRA_SELECTED))
796 WinSendMsg(hwndCnrS,CM_SETRECORDEMPHASIS,MPFROMP(pciSa[x]),
797 MPFROM2SHORT(TRUE,CRA_SELECTED));
798 if(!(pciDa[x]->rc.flRecordAttr & CRA_SELECTED))
799 WinSendMsg(hwndCnrD,CM_SETRECORDEMPHASIS,MPFROMP(pciDa[x]),
800 MPFROM2SHORT(TRUE,CRA_SELECTED));
801 }
802 if(!(x % 500))
803 DosSleep(1L);
804 else if(!(x % 50))
805 DosSleep(0L);
806 }
807 break;
808
809 case IDM_SELECTBOTH:
810 for(x = 0;x < numS;x++) {
811 if(!(pciSa[x]->rc.flRecordAttr & CRA_FILTERED) &&
812 *pciSa[x]->szFileName &&
813 (pciSa[x]->flags & CNRITEM_EXISTS)) {
814 if(!(pciSa[x]->rc.flRecordAttr & CRA_SELECTED))
815 WinSendMsg(hwndCnrS,CM_SETRECORDEMPHASIS,MPFROMP(pciSa[x]),
816 MPFROM2SHORT(TRUE,CRA_SELECTED));
817 if(!(pciDa[x]->rc.flRecordAttr & CRA_SELECTED))
818 WinSendMsg(hwndCnrD,CM_SETRECORDEMPHASIS,MPFROMP(pciDa[x]),
819 MPFROM2SHORT(TRUE,CRA_SELECTED));
820 }
821 if(!(x % 500))
822 DosSleep(1L);
823 else if(!(x % 50))
824 DosSleep(0L);
825 }
826 break;
827
828 case IDM_SELECTONE:
829 for(x = 0;x < numS;x++) {
830 if(!(pciSa[x]->rc.flRecordAttr & CRA_FILTERED) &&
831 *pciSa[x]->szFileName &&
832 !(pciSa[x]->flags & CNRITEM_EXISTS)) {
833 if(!(pciSa[x]->rc.flRecordAttr & CRA_SELECTED))
834 WinSendMsg(hwndCnrS,CM_SETRECORDEMPHASIS,MPFROMP(pciSa[x]),
835 MPFROM2SHORT(TRUE,CRA_SELECTED));
836 }
837 else if(*pciDa[x]->szFileName &&
838 !(pciDa[x]->flags & CNRITEM_EXISTS)) {
839 if(!(pciDa[x]->rc.flRecordAttr & CRA_SELECTED))
840 WinSendMsg(hwndCnrD,CM_SETRECORDEMPHASIS,MPFROMP(pciDa[x]),
841 MPFROM2SHORT(TRUE,CRA_SELECTED));
842 }
843 if(!(x % 500))
844 DosSleep(1L);
845 else if(!(x % 50))
846 DosSleep(0L);
847 }
848 break;
849
850 case IDM_SELECTBIGGER:
851 for(x = 0;x < numS;x++) {
852 if(!(pciSa[x]->rc.flRecordAttr & CRA_FILTERED) &&
853 *pciSa[x]->szFileName &&
854 (pciSa[x]->flags & CNRITEM_LARGER)) {
855 if(!(pciSa[x]->rc.flRecordAttr & CRA_SELECTED))
856 WinSendMsg(hwndCnrS,CM_SETRECORDEMPHASIS,MPFROMP(pciSa[x]),
857 MPFROM2SHORT(TRUE,CRA_SELECTED));
858 }
859 else if(!(pciDa[x]->rc.flRecordAttr & CRA_FILTERED) &&
860 *pciDa[x]->szFileName &&
861 (pciDa[x]->flags & CNRITEM_LARGER)) {
862 if(!(pciDa[x]->rc.flRecordAttr & CRA_SELECTED))
863 WinSendMsg(hwndCnrD,CM_SETRECORDEMPHASIS,MPFROMP(pciDa[x]),
864 MPFROM2SHORT(TRUE,CRA_SELECTED));
865 }
866 if(!(x % 500))
867 DosSleep(1L);
868 else if(!(x % 50))
869 DosSleep(0L);
870 }
871 break;
872
873 case IDM_SELECTSMALLER:
874 for(x = 0;x < numS;x++) {
875 if(!(pciSa[x]->rc.flRecordAttr & CRA_FILTERED) &&
876 *pciSa[x]->szFileName &&
877 (pciSa[x]->flags & CNRITEM_SMALLER)) {
878 if(!(pciSa[x]->rc.flRecordAttr & CRA_SELECTED))
879 WinSendMsg(hwndCnrS,CM_SETRECORDEMPHASIS,MPFROMP(pciSa[x]),
880 MPFROM2SHORT(TRUE,CRA_SELECTED));
881 }
882 else if(!(pciDa[x]->rc.flRecordAttr & CRA_FILTERED) &&
883 *pciDa[x]->szFileName &&
884 (pciDa[x]->flags & CNRITEM_SMALLER)) {
885 if(!(pciDa[x]->rc.flRecordAttr & CRA_SELECTED))
886 WinSendMsg(hwndCnrD,CM_SETRECORDEMPHASIS,MPFROMP(pciDa[x]),
887 MPFROM2SHORT(TRUE,CRA_SELECTED));
888 }
889 if(!(x % 500))
890 DosSleep(1L);
891 else if(!(x % 50))
892 DosSleep(0L);
893 }
894 break;
895
896 case IDM_SELECTNEWER:
897 for(x = 0;x < numS;x++) {
898 if(!(pciSa[x]->rc.flRecordAttr & CRA_FILTERED) &&
899 *pciSa[x]->szFileName &&
900 (pciSa[x]->flags & CNRITEM_NEWER)) {
901 if(!(pciSa[x]->rc.flRecordAttr & CRA_SELECTED))
902 WinSendMsg(hwndCnrS,CM_SETRECORDEMPHASIS,MPFROMP(pciSa[x]),
903 MPFROM2SHORT(TRUE,CRA_SELECTED));
904 }
905 else if(!(pciDa[x]->rc.flRecordAttr & CRA_FILTERED) &&
906 *pciDa[x]->szFileName &&
907 (pciDa[x]->flags & CNRITEM_NEWER)) {
908 if(!(pciDa[x]->rc.flRecordAttr & CRA_SELECTED))
909 WinSendMsg(hwndCnrD,CM_SETRECORDEMPHASIS,MPFROMP(pciDa[x]),
910 MPFROM2SHORT(TRUE,CRA_SELECTED));
911 }
912 if(!(x % 500))
913 DosSleep(1L);
914 else if(!(x % 50))
915 DosSleep(0L);
916 }
917 break;
918
919 case IDM_SELECTOLDER:
920 for(x = 0;x < numS;x++) {
921 if(!(pciSa[x]->rc.flRecordAttr & CRA_FILTERED) &&
922 *pciSa[x]->szFileName &&
923 (pciSa[x]->flags & CNRITEM_OLDER)) {
924 if(!(pciSa[x]->rc.flRecordAttr & CRA_SELECTED))
925 WinSendMsg(hwndCnrS,CM_SETRECORDEMPHASIS,MPFROMP(pciSa[x]),
926 MPFROM2SHORT(TRUE,CRA_SELECTED));
927 }
928 else if(!(pciDa[x]->rc.flRecordAttr & CRA_FILTERED) &&
929 *pciDa[x]->szFileName &&
930 (pciDa[x]->flags & CNRITEM_OLDER)) {
931 if(!(pciDa[x]->rc.flRecordAttr & CRA_SELECTED))
932 WinSendMsg(hwndCnrD,CM_SETRECORDEMPHASIS,MPFROMP(pciDa[x]),
933 MPFROM2SHORT(TRUE,CRA_SELECTED));
934 }
935 if(!(x % 500))
936 DosSleep(1L);
937 else if(!(x % 50))
938 DosSleep(0L);
939 }
940 break;
941
942 case IDM_DESELECTBOTH:
943 for(x = 0;x < numS;x++) {
944 if(!(pciSa[x]->rc.flRecordAttr & CRA_FILTERED) &&
945 *pciSa[x]->szFileName &&
946 (pciSa[x]->flags & CNRITEM_EXISTS)) {
947 if(pciSa[x]->rc.flRecordAttr & CRA_SELECTED)
948 WinSendMsg(hwndCnrS,CM_SETRECORDEMPHASIS,MPFROMP(pciSa[x]),
949 MPFROM2SHORT(FALSE,CRA_SELECTED));
950 if(pciDa[x]->rc.flRecordAttr & CRA_SELECTED)
951 WinSendMsg(hwndCnrD,CM_SETRECORDEMPHASIS,MPFROMP(pciDa[x]),
952 MPFROM2SHORT(FALSE,CRA_SELECTED));
953 }
954 if(!(x % 500))
955 DosSleep(1L);
956 else if(!(x % 50))
957 DosSleep(0L);
958 }
959 break;
960
961 case IDM_DESELECTONE:
962 for(x = 0;x < numS;x++) {
963 if(!(pciSa[x]->rc.flRecordAttr & CRA_FILTERED) &&
964 *pciSa[x]->szFileName &&
965 !(pciSa[x]->flags & CNRITEM_EXISTS)) {
966 if(pciSa[x]->rc.flRecordAttr & CRA_SELECTED)
967 WinSendMsg(hwndCnrS,CM_SETRECORDEMPHASIS,MPFROMP(pciSa[x]),
968 MPFROM2SHORT(FALSE,CRA_SELECTED));
969 }
970 else if(*pciDa[x]->szFileName &&
971 !(pciDa[x]->flags & CNRITEM_EXISTS)) {
972 if(pciDa[x]->rc.flRecordAttr & CRA_SELECTED)
973 WinSendMsg(hwndCnrD,CM_SETRECORDEMPHASIS,MPFROMP(pciDa[x]),
974 MPFROM2SHORT(FALSE,CRA_SELECTED));
975 }
976 if(!(x % 500))
977 DosSleep(1L);
978 else if(!(x % 50))
979 DosSleep(0L);
980 }
981 break;
982
983 case IDM_DESELECTBIGGER:
984 for(x = 0;x < numS;x++) {
985 if(!(pciSa[x]->rc.flRecordAttr & CRA_FILTERED) &&
986 *pciSa[x]->szFileName &&
987 (pciSa[x]->flags & CNRITEM_LARGER)) {
988 if(pciSa[x]->rc.flRecordAttr & CRA_SELECTED)
989 WinSendMsg(hwndCnrS,CM_SETRECORDEMPHASIS,MPFROMP(pciSa[x]),
990 MPFROM2SHORT(FALSE,CRA_SELECTED));
991 }
992 else if(!(pciDa[x]->rc.flRecordAttr & CRA_FILTERED) &&
993 *pciDa[x]->szFileName &&
994 (pciDa[x]->flags & CNRITEM_LARGER)) {
995 if(pciDa[x]->rc.flRecordAttr & CRA_SELECTED)
996 WinSendMsg(hwndCnrD,CM_SETRECORDEMPHASIS,MPFROMP(pciDa[x]),
997 MPFROM2SHORT(FALSE,CRA_SELECTED));
998 }
999 if(!(x % 500))
1000 DosSleep(1L);
1001 else if(!(x % 50))
1002 DosSleep(0L);
1003 }
1004 break;
1005
1006 case IDM_DESELECTSMALLER:
1007 for(x = 0;x < numS;x++) {
1008 if(!(pciSa[x]->rc.flRecordAttr & CRA_FILTERED) &&
1009 *pciSa[x]->szFileName &&
1010 (pciSa[x]->flags & CNRITEM_SMALLER)) {
1011 if(pciSa[x]->rc.flRecordAttr & CRA_SELECTED)
1012 WinSendMsg(hwndCnrS,CM_SETRECORDEMPHASIS,MPFROMP(pciSa[x]),
1013 MPFROM2SHORT(FALSE,CRA_SELECTED));
1014 }
1015 else if(!(pciDa[x]->rc.flRecordAttr & CRA_FILTERED) &&
1016 *pciDa[x]->szFileName &&
1017 (pciDa[x]->flags & CNRITEM_SMALLER)) {
1018 if(pciDa[x]->rc.flRecordAttr & CRA_SELECTED)
1019 WinSendMsg(hwndCnrD,CM_SETRECORDEMPHASIS,MPFROMP(pciDa[x]),
1020 MPFROM2SHORT(FALSE,CRA_SELECTED));
1021 }
1022 if(!(x % 500))
1023 DosSleep(1L);
1024 else if(!(x % 50))
1025 DosSleep(0L);
1026 }
1027 break;
1028
1029 case IDM_DESELECTNEWER:
1030 for(x = 0;x < numS;x++) {
1031 if(!(pciSa[x]->rc.flRecordAttr & CRA_FILTERED) &&
1032 *pciSa[x]->szFileName &&
1033 (pciSa[x]->flags & CNRITEM_NEWER)) {
1034 if(pciSa[x]->rc.flRecordAttr & CRA_SELECTED)
1035 WinSendMsg(hwndCnrS,CM_SETRECORDEMPHASIS,MPFROMP(pciSa[x]),
1036 MPFROM2SHORT(FALSE,CRA_SELECTED));
1037 }
1038 else if(!(pciDa[x]->rc.flRecordAttr & CRA_FILTERED) &&
1039 *pciDa[x]->szFileName &&
1040 (pciDa[x]->flags & CNRITEM_NEWER)) {
1041 if(pciDa[x]->rc.flRecordAttr & CRA_SELECTED)
1042 WinSendMsg(hwndCnrD,CM_SETRECORDEMPHASIS,MPFROMP(pciDa[x]),
1043 MPFROM2SHORT(FALSE,CRA_SELECTED));
1044 }
1045 if(!(x % 500))
1046 DosSleep(1L);
1047 else if(!(x % 50))
1048 DosSleep(0L);
1049 }
1050 break;
1051
1052 case IDM_DESELECTOLDER:
1053 for(x = 0;x < numS;x++) {
1054 if(!(pciSa[x]->rc.flRecordAttr & CRA_FILTERED) &&
1055 *pciSa[x]->szFileName &&
1056 (pciSa[x]->flags & CNRITEM_OLDER)) {
1057 if(pciSa[x]->rc.flRecordAttr & CRA_SELECTED)
1058 WinSendMsg(hwndCnrS,CM_SETRECORDEMPHASIS,MPFROMP(pciSa[x]),
1059 MPFROM2SHORT(FALSE,CRA_SELECTED));
1060 }
1061 else if(!(pciDa[x]->rc.flRecordAttr & CRA_FILTERED) &&
1062 *pciDa[x]->szFileName &&
1063 (pciDa[x]->flags & CNRITEM_OLDER)) {
1064 if(pciDa[x]->rc.flRecordAttr & CRA_SELECTED)
1065 WinSendMsg(hwndCnrD,CM_SETRECORDEMPHASIS,MPFROMP(pciDa[x]),
1066 MPFROM2SHORT(FALSE,CRA_SELECTED));
1067 }
1068 if(!(x % 500))
1069 DosSleep(1L);
1070 else if(!(x % 50))
1071 DosSleep(0L);
1072 }
1073 break;
1074
1075 default:
1076 break;
1077 }
1078
1079 if(reset) {
1080 while(numS) {
1081 WinSendMsg(hwndCnrS,CM_INVALIDATERECORD,
1082 MPFROMP(pciSa),
1083 MPFROM2SHORT((min(numS,65535)),0));
1084 DosSleep(0L);
1085 WinSendMsg(hwndCnrD,CM_INVALIDATERECORD,
1086 MPFROMP(pciDa),
1087 MPFROM2SHORT((min(numD,65535)),0));
1088 numS -= min(numS,65535);
1089 if(numS)
1090 DosSleep(0L);
1091 }
1092 }
1093
1094 free(pciSa);
1095 free(pciDa);
1096 DosPostEventSem(CompactSem);
1097}
1098
1099
1100struct SS {
1101 PCNRITEM pci;
1102 BOOL unique,
1103 all,
1104 smallest,
1105 largest,
1106 newest,
1107 oldest;
1108};
1109
1110struct Cnr {
1111 HWND hwndCnr;
1112 ULONG numfiles;
1113 struct SS *ss;
1114};
1115
1116
1117static int CompSSNamesB (const void *s1,const void *s2) {
1118
1119 struct SS *ss2 = (struct SS *)s2;
1120
1121 return stricmp((CHAR *)s1,ss2->pci->pszFileName);
1122}
1123
1124
1125static int CompSSNames (const void *s1,const void *s2) {
1126
1127 struct SS *ss1 = (struct SS *)s1;
1128 struct SS *ss2 = (struct SS *)s2;
1129
1130 return stricmp(ss1->pci->pszFileName,ss2->pci->pszFileName);
1131}
1132
1133
1134VOID FreeCnrs (struct Cnr *Cnrs,INT numw) {
1135
1136 register INT z;
1137
1138 for(z = 0;z < numw;z++) {
1139 if(Cnrs[z].ss)
1140 free(Cnrs[z].ss);
1141 }
1142 free(Cnrs);
1143 DosPostEventSem(CompactSem);
1144}
1145
1146
1147VOID SpecialSelect2 (HWND hwndParent,INT action) {
1148
1149 PCNRITEM pci;
1150 HENUM henum;
1151 HWND hwnd;
1152 register INT numwindows = 0,w,x,z,cmp;
1153 struct Cnr *Cnrs = NULL;
1154 struct SS *bsres;
1155
1156 if(!hwndParent)
1157 return;
1158
1159 /* count directory containers, build array of hwnds */
1160 henum = WinBeginEnumWindows(hwndParent);
1161 while((hwnd = WinGetNextWindow(henum)) != NULLHANDLE) {
1162 if(WinWindowFromID(WinWindowFromID(hwnd,FID_CLIENT),DIR_CNR)) {
1163 Cnrs = realloc(Cnrs,(numwindows + 1) * sizeof(struct Cnr));
1164 if(!Cnrs) {
1165 Notify(GetPString(IDS_OUTOFMEMORY));
1166 return;
1167 }
1168 memset(&Cnrs[numwindows],0,sizeof(struct Cnr));
1169 Cnrs[numwindows].hwndCnr = WinWindowFromID(WinWindowFromID(hwnd,
1170 FID_CLIENT),DIR_CNR);
1171 numwindows++;
1172 }
1173 }
1174 WinEndEnumWindows(henum);
1175 if(numwindows < 2) {
1176 FreeCnrs(Cnrs,numwindows);
1177 DosBeep(250,100);
1178 Notify(GetPString(IDS_COMPSEL2ORMORETEXT));
1179 return;
1180 }
1181 if(numwindows > 4) {
1182 WinSendMsg(Cnrs[0].
1183 hwndCnr,
1184 UM_NOTIFY,
1185 MPFROMP(GetPString(IDS_BUILDINGLISTSTEXT)),
1186 MPVOID);
1187 DosSleep(0L);
1188 }
1189
1190 /* count records, build array of pointers to records */
1191 for(z = 0;z < numwindows;z++) {
1192 pci = (PCNRITEM)WinSendMsg(Cnrs[z].hwndCnr,
1193 CM_QUERYRECORD,
1194 MPVOID,
1195 MPFROM2SHORT(CMA_FIRST,
1196 CMA_ITEMORDER));
1197 x = 0;
1198 while(pci && (INT)pci != -1) {
1199 if(!(pci->rc.flRecordAttr & CRA_FILTERED) &&
1200 !(pci->attrFile & FILE_DIRECTORY)) {
1201 Cnrs[z].ss = realloc(Cnrs[z].ss,(x + 1) * sizeof(struct SS));
1202 if(!Cnrs[z].ss) {
1203 FreeCnrs(Cnrs,numwindows);
1204 Notify(GetPString(IDS_OUTOFMEMORY));
1205 return;
1206 }
1207 memset(&Cnrs[z].ss[x],0,sizeof(struct SS));
1208 Cnrs[z].ss[x].pci = pci;
1209 x++;
1210 }
1211 pci = (PCNRITEM)WinSendMsg(Cnrs[z].hwndCnr,
1212 CM_QUERYRECORD,
1213 MPFROMP(pci),
1214 MPFROM2SHORT(CMA_NEXT,
1215 CMA_ITEMORDER));
1216 }
1217 DosSleep(0L);
1218 Cnrs[z].numfiles = x;
1219 if(Cnrs[z].numfiles)
1220 qsort(Cnrs[z].ss,Cnrs[z].numfiles,sizeof(struct SS),CompSSNames);
1221 }
1222
1223 for(z = 0;z < numwindows;z++) {
1224 for(x = 0;x < Cnrs[z].numfiles;x++) {
1225 Cnrs[z].ss[x].all = Cnrs[z].ss[x].unique = Cnrs[z].ss[x].newest =
1226 Cnrs[z].ss[x].oldest = Cnrs[z].ss[x].smallest =
1227 Cnrs[z].ss[x].largest = TRUE;
1228 for(w = 0;w < numwindows;w++) {
1229 if(w != z && Cnrs[w].numfiles) {
1230 bsres = (struct SS *)bsearch(Cnrs[z].ss[x].pci->pszFileName,
1231 Cnrs[w].ss,Cnrs[w].numfiles,
1232 sizeof(struct SS),CompSSNamesB);
1233 if(bsres) {
1234 Cnrs[z].ss[x].unique = FALSE;
1235 if(Cnrs[z].ss[x].pci->cbFile + Cnrs[z].ss[x].pci->easize >
1236 bsres->pci->cbFile + bsres->pci->easize)
1237 Cnrs[z].ss[x].smallest = FALSE;
1238 if(Cnrs[z].ss[x].pci->cbFile + Cnrs[z].ss[x].pci->easize <
1239 bsres->pci->cbFile + bsres->pci->easize)
1240 Cnrs[z].ss[x].largest = FALSE;
1241 cmp = (Cnrs[z].ss[x].pci->date.year > bsres->pci->date.year) ? TRUE :
1242 (Cnrs[z].ss[x].pci->date.year < bsres->pci->date.year) ? FALSE :
1243 (Cnrs[z].ss[x].pci->date.month > bsres->pci->date.month) ? TRUE :
1244 (Cnrs[z].ss[x].pci->date.month < bsres->pci->date.month) ? FALSE :
1245 (Cnrs[z].ss[x].pci->date.day > bsres->pci->date.day) ? TRUE :
1246 (Cnrs[z].ss[x].pci->date.day < bsres->pci->date.day) ? FALSE :
1247 (Cnrs[z].ss[x].pci->time.hours > bsres->pci->time.hours) ? TRUE :
1248 (Cnrs[z].ss[x].pci->time.hours < bsres->pci->time.hours) ? FALSE :
1249 (Cnrs[z].ss[x].pci->time.minutes > bsres->pci->time.minutes) ? TRUE :
1250 (Cnrs[z].ss[x].pci->time.minutes < bsres->pci->time.minutes) ? FALSE :
1251 (Cnrs[z].ss[x].pci->time.seconds > bsres->pci->time.seconds) ? TRUE :
1252 (Cnrs[z].ss[x].pci->time.seconds < bsres->pci->time.seconds) ? FALSE :
1253 FALSE;
1254 if(!cmp)
1255 Cnrs[z].ss[x].newest = FALSE;
1256 cmp = (Cnrs[z].ss[x].pci->date.year < bsres->pci->date.year) ? TRUE :
1257 (Cnrs[z].ss[x].pci->date.year > bsres->pci->date.year) ? FALSE :
1258 (Cnrs[z].ss[x].pci->date.month < bsres->pci->date.month) ? TRUE :
1259 (Cnrs[z].ss[x].pci->date.month > bsres->pci->date.month) ? FALSE :
1260 (Cnrs[z].ss[x].pci->date.day < bsres->pci->date.day) ? TRUE :
1261 (Cnrs[z].ss[x].pci->date.day > bsres->pci->date.day) ? FALSE :
1262 (Cnrs[z].ss[x].pci->time.hours < bsres->pci->time.hours) ? TRUE :
1263 (Cnrs[z].ss[x].pci->time.hours > bsres->pci->time.hours) ? FALSE :
1264 (Cnrs[z].ss[x].pci->time.minutes < bsres->pci->time.minutes) ? TRUE :
1265 (Cnrs[z].ss[x].pci->time.minutes > bsres->pci->time.minutes) ? FALSE :
1266 (Cnrs[z].ss[x].pci->time.seconds < bsres->pci->time.seconds) ? TRUE :
1267 (Cnrs[z].ss[x].pci->time.seconds > bsres->pci->time.seconds) ? FALSE :
1268 FALSE;
1269 if(!cmp)
1270 Cnrs[z].ss[x].oldest = FALSE;
1271 cmp = 0;
1272 break;
1273 }
1274 else
1275 Cnrs[z].ss[x].all = FALSE;
1276 }
1277 }
1278 if(Cnrs[z].ss[x].unique)
1279 Cnrs[z].ss[x].oldest = Cnrs[z].ss[x].newest = Cnrs[z].ss[x].all =
1280 Cnrs[z].ss[x].largest = Cnrs[z].ss[x].smallest = FALSE;
1281 DosSleep(0L);
1282 }
1283 DosSleep(1L);
1284 }
1285
1286 switch(action) {
1287 case IDM_SELECTBOTH:
1288 for(z = 0;z < numwindows;z++) {
1289 for(x = 0;x < Cnrs[z].numfiles;x++) {
1290 if(Cnrs[z].ss[x].all)
1291 WinSendMsg(Cnrs[z].hwndCnr,CM_SETRECORDEMPHASIS,
1292 MPFROMP(Cnrs[z].ss[x].pci),
1293 MPFROM2SHORT(TRUE,CRA_SELECTED));
1294 }
1295 DosSleep(0L);
1296 }
1297 break;
1298 case IDM_SELECTMORE:
1299 for(z = 0;z < numwindows;z++) {
1300 for(x = 0;x < Cnrs[z].numfiles;x++) {
1301 if(!Cnrs[z].ss[x].unique)
1302 WinSendMsg(Cnrs[z].hwndCnr,CM_SETRECORDEMPHASIS,
1303 MPFROMP(Cnrs[z].ss[x].pci),
1304 MPFROM2SHORT(TRUE,CRA_SELECTED));
1305 }
1306 DosSleep(0L);
1307 }
1308 break;
1309 case IDM_SELECTONE:
1310 for(z = 0;z < numwindows;z++) {
1311 for(x = 0;x < Cnrs[z].numfiles;x++) {
1312 if(Cnrs[z].ss[x].unique)
1313 WinSendMsg(Cnrs[z].hwndCnr,CM_SETRECORDEMPHASIS,
1314 MPFROMP(Cnrs[z].ss[x].pci),
1315 MPFROM2SHORT(TRUE,CRA_SELECTED));
1316 }
1317 DosSleep(0L);
1318 }
1319 break;
1320 case IDM_SELECTNEWER:
1321 for(z = 0;z < numwindows;z++) {
1322 for(x = 0;x < Cnrs[z].numfiles;x++) {
1323 if(Cnrs[z].ss[x].newest)
1324 WinSendMsg(Cnrs[z].hwndCnr,CM_SETRECORDEMPHASIS,
1325 MPFROMP(Cnrs[z].ss[x].pci),
1326 MPFROM2SHORT(TRUE,CRA_SELECTED));
1327 }
1328 DosSleep(0L);
1329 }
1330 break;
1331 case IDM_SELECTOLDER:
1332 for(z = 0;z < numwindows;z++) {
1333 for(x = 0;x < Cnrs[z].numfiles;x++) {
1334 if(Cnrs[z].ss[x].oldest)
1335 WinSendMsg(Cnrs[z].hwndCnr,CM_SETRECORDEMPHASIS,
1336 MPFROMP(Cnrs[z].ss[x].pci),
1337 MPFROM2SHORT(TRUE,CRA_SELECTED));
1338 }
1339 DosSleep(0L);
1340 }
1341 break;
1342 case IDM_SELECTBIGGER:
1343 for(z = 0;z < numwindows;z++) {
1344 for(x = 0;x < Cnrs[z].numfiles;x++) {
1345 if(Cnrs[z].ss[x].largest)
1346 WinSendMsg(Cnrs[z].hwndCnr,CM_SETRECORDEMPHASIS,
1347 MPFROMP(Cnrs[z].ss[x].pci),
1348 MPFROM2SHORT(TRUE,CRA_SELECTED));
1349 }
1350 DosSleep(0L);
1351 }
1352 break;
1353 case IDM_SELECTSMALLER:
1354 for(z = 0;z < numwindows;z++) {
1355 for(x = 0;x < Cnrs[z].numfiles;x++) {
1356 if(Cnrs[z].ss[x].smallest)
1357 WinSendMsg(Cnrs[z].hwndCnr,CM_SETRECORDEMPHASIS,
1358 MPFROMP(Cnrs[z].ss[x].pci),
1359 MPFROM2SHORT(TRUE,CRA_SELECTED));
1360 }
1361 DosSleep(0L);
1362 }
1363 break;
1364
1365 case IDM_DESELECTBOTH:
1366 for(z = 0;z < numwindows;z++) {
1367 for(x = 0;x < Cnrs[z].numfiles;x++) {
1368 if(Cnrs[z].ss[x].all)
1369 WinSendMsg(Cnrs[z].hwndCnr,CM_SETRECORDEMPHASIS,
1370 MPFROMP(Cnrs[z].ss[x].pci),
1371 MPFROM2SHORT(FALSE,CRA_SELECTED));
1372 }
1373 DosSleep(0L);
1374 }
1375 break;
1376 case IDM_DESELECTMORE:
1377 for(z = 0;z < numwindows;z++) {
1378 for(x = 0;x < Cnrs[z].numfiles;x++) {
1379 if(!Cnrs[z].ss[x].unique)
1380 WinSendMsg(Cnrs[z].hwndCnr,CM_SETRECORDEMPHASIS,
1381 MPFROMP(Cnrs[z].ss[x].pci),
1382 MPFROM2SHORT(FALSE,CRA_SELECTED));
1383 }
1384 DosSleep(0L);
1385 }
1386 break;
1387 case IDM_DESELECTONE:
1388 for(z = 0;z < numwindows;z++) {
1389 for(x = 0;x < Cnrs[z].numfiles;x++) {
1390 if(Cnrs[z].ss[x].unique)
1391 WinSendMsg(Cnrs[z].hwndCnr,CM_SETRECORDEMPHASIS,
1392 MPFROMP(Cnrs[z].ss[x].pci),
1393 MPFROM2SHORT(FALSE,CRA_SELECTED));
1394 }
1395 DosSleep(0L);
1396 }
1397 break;
1398 case IDM_DESELECTNEWER:
1399 for(z = 0;z < numwindows;z++) {
1400 for(x = 0;x < Cnrs[z].numfiles;x++) {
1401 if(Cnrs[z].ss[x].newest)
1402 WinSendMsg(Cnrs[z].hwndCnr,CM_SETRECORDEMPHASIS,
1403 MPFROMP(Cnrs[z].ss[x].pci),
1404 MPFROM2SHORT(FALSE,CRA_SELECTED));
1405 }
1406 DosSleep(0L);
1407 }
1408 break;
1409 case IDM_DESELECTOLDER:
1410 for(z = 0;z < numwindows;z++) {
1411 for(x = 0;x < Cnrs[z].numfiles;x++) {
1412 if(Cnrs[z].ss[x].oldest)
1413 WinSendMsg(Cnrs[z].hwndCnr,CM_SETRECORDEMPHASIS,
1414 MPFROMP(Cnrs[z].ss[x].pci),
1415 MPFROM2SHORT(FALSE,CRA_SELECTED));
1416 }
1417 DosSleep(0L);
1418 }
1419 break;
1420 case IDM_DESELECTBIGGER:
1421 for(z = 0;z < numwindows;z++) {
1422 for(x = 0;x < Cnrs[z].numfiles;x++) {
1423 if(Cnrs[z].ss[x].largest)
1424 WinSendMsg(Cnrs[z].hwndCnr,CM_SETRECORDEMPHASIS,
1425 MPFROMP(Cnrs[z].ss[x].pci),
1426 MPFROM2SHORT(FALSE,CRA_SELECTED));
1427 }
1428 DosSleep(0L);
1429 }
1430 break;
1431 case IDM_DESELECTSMALLER:
1432 for(z = 0;z < numwindows;z++) {
1433 for(x = 0;x < Cnrs[z].numfiles;x++) {
1434 if(Cnrs[z].ss[x].smallest)
1435 WinSendMsg(Cnrs[z].hwndCnr,CM_SETRECORDEMPHASIS,
1436 MPFROMP(Cnrs[z].ss[x].pci),
1437 MPFROM2SHORT(FALSE,CRA_SELECTED));
1438 }
1439 DosSleep(0L);
1440 }
1441 break;
1442 }
1443
1444 FreeCnrs(Cnrs,numwindows);
1445}
Note: See TracBrowser for help on using the repository browser.