source: trunk/dll/select.c@ 2

Last change on this file since 2 was 2, checked in by root, 23 years ago

Initial revision

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