source: trunk/dll/select.c@ 123

Last change on this file since 123 was 123, checked in by root, 21 years ago

Rework lstrip/rstrip usage

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