source: trunk/dll/comp.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: 95.7 KB
Line 
1#define INCL_DOS
2#define INCL_WIN
3#define INCL_GPI
4
5#include <os2.h>
6#include <stdio.h>
7#include <stdlib.h>
8#include <string.h>
9#include <ctype.h>
10#include <share.h>
11#include <io.h>
12#include "fm3dll.h"
13#include "fm3dlg.h"
14#include "fm3str.h"
15
16#pragma alloc_text(COMPAREDIR,FillCnrs,FillDirList,CompNames,CompNames2)
17#pragma alloc_text(COMPAREDIR1,CompareDlgProc)
18#pragma alloc_text(COMPAREDIR2,SelectCnrs,ActionCnr)
19#pragma alloc_text(COMPAREFILE,CFileDlgProc,CompareFiles)
20#pragma alloc_text(SNAPSHOT,SnapShot,StartSnap)
21
22typedef struct {
23 CHAR filename[CCHMAXPATH];
24 CHAR dirname[CCHMAXPATH];
25 BOOL recurse;
26} SNAPSTUFF;
27
28
29void SnapShot (char *path,FILE *fp,BOOL recurse) {
30
31 FILEFINDBUF4 *fb;
32 char *mask,*enddir;
33 HDIR hdir = HDIR_CREATE;
34 ULONG nm = 1L;
35
36 fb = malloc(sizeof(FILEFINDBUF4));
37 if(fb) {
38 mask = malloc(CCHMAXPATH);
39 if(mask) {
40 sprintf(mask,
41 "%s%s*",
42 path,
43 (path[strlen(path) - 1] != '\\') ? "\\" : NullStr);
44 enddir = strrchr(mask,'\\');
45 enddir++;
46 if(!DosFindFirst(mask,
47 &hdir,
48 FILE_NORMAL | FILE_DIRECTORY |
49 FILE_ARCHIVED | FILE_READONLY | FILE_HIDDEN |
50 FILE_SYSTEM,
51 fb,
52 sizeof(FILEFINDBUF4),
53 &nm,
54 FIL_QUERYEASIZE)) {
55 do {
56 strcpy(enddir,fb->achName);
57 if(!(fb->attrFile & FILE_DIRECTORY))
58 fprintf(fp,
59 "\"%s\",%u,%lu,%04u/%02u/%02u,%02u:%02u:%02u,%lu,%lu,N\n",
60 mask,
61 enddir - mask,
62 fb->cbFile,
63 (fb->fdateLastWrite.year + 1980),
64 fb->fdateLastWrite.month,
65 fb->fdateLastWrite.day,
66 fb->ftimeLastWrite.hours,
67 fb->ftimeLastWrite.minutes,
68 fb->ftimeLastWrite.twosecs,
69 fb->attrFile,
70 (fb->cbList > 4L) ? (fb->cbList / 2L) : 0L);
71 else if(recurse && (*fb->achName != '.' ||
72 (fb->achName[1] && fb->achName[1] != '.')))
73 SnapShot(mask,fp,recurse);
74 nm = 1L;
75 } while(!DosFindNext(hdir,fb,sizeof(FILEFINDBUF4),&nm));
76 DosFindClose(hdir);
77 }
78 free(mask);
79 }
80 free(fb);
81 }
82}
83
84
85VOID StartSnap (VOID *dummy) {
86
87 SNAPSTUFF *sf = (SNAPSTUFF *)dummy;
88 FILE *fp;
89 CHAR *p;
90
91 if(sf) {
92 if(*sf->dirname && *sf->filename) {
93 priority_normal();
94 p = sf->dirname;
95 while(*p) {
96 if(*p == '/')
97 *p = '\\';
98 p++;
99 }
100 if(*(p - 1) != '\\') {
101 *p = '\\';
102 p++;
103 }
104 fp = fopen(sf->filename,"w");
105 if(fp) {
106 fprintf(fp,"\"%s\"\n",sf->dirname);
107 SnapShot(sf->dirname,fp,sf->recurse);
108 fclose(fp);
109 }
110 }
111 free(sf);
112 }
113}
114
115
116VOID CompareFiles (VOID *args) {
117
118 FCOMPARE fc;
119 HAB hab2;
120 HMQ hmq2;
121 FILE *fp1,*fp2;
122 ULONG len1,len2,offset = 0L;
123 LONG numread1,numread2;
124 CHAR s[1024],ss[1024],*p1,*p2;
125
126 if(args) {
127 fc = *(FCOMPARE *)args;
128 hab2 = WinInitialize(0);
129 if(hab2) {
130 hmq2 = WinCreateMsgQueue(hab2,0);
131 if(hmq2) {
132 WinCancelShutdown(hmq2,TRUE);
133 if(!IsFile(fc.file1) || IsRoot(fc.file1)) {
134 p1 = strrchr(fc.file2,'\\');
135 if(p1) {
136 if(fc.file1[strlen(fc.file1) - 1] == '\\')
137 p1++;
138 strcat(fc.file1,p1);
139 }
140 }
141 else if(!IsFile(fc.file2) || IsRoot(fc.file2)) {
142 p1 = strrchr(fc.file1,'\\');
143 if(p1) {
144 if(fc.file2[strlen(fc.file2) - 1] == '\\')
145 p1++;
146 strcat(fc.file2,p1);
147 }
148 }
149 sprintf(s,GetPString(IDS_COMPCOMPARETEXT),fc.file1);
150 AddToListboxBottom(fc.hwndList,s);
151 sprintf(s,GetPString(IDS_COMPTOTEXT),fc.file2);
152 AddToListboxBottom(fc.hwndList,s);
153 fp1 = _fsopen(fc.file1,"rb",SH_DENYNO);
154 if(fp1) {
155 fp2 = _fsopen(fc.file2,"rb",SH_DENYNO);
156 if(fp2) {
157 len1 = filelength(fileno(fp1));
158 len2 = filelength(fileno(fp2));
159 if(len1 != len2) {
160 strcpy(s,GetPString(IDS_COMPDIFSIZESTEXT));
161 AddToListboxBottom(fc.hwndList,s);
162 sprintf(s,GetPString(IDS_COMPVSBYTESTEXT),len1,len2);
163 AddToListboxBottom(fc.hwndList,s);
164 WinSetWindowText(fc.hwndHelp,GetPString(IDS_COMPDONTMATCHTEXT));
165 }
166 else {
167 WinSetWindowText(fc.hwndHelp,GetPString(IDS_COMPCOMPARINGTEXT));
168 while(WinIsWindow(hab2,fc.hwndList)) {
169 numread1 = fread(s,1,1024,fp1);
170 numread2 = fread(ss,1,1024,fp2);
171 if(numread1 != numread2 || feof(fp1) != feof(fp2)) {
172 sprintf(s,GetPString(IDS_COMPREADERRORTEXT),
173 offset,offset);
174 AddToListboxBottom(fc.hwndList,s);
175 WinSetWindowText(fc.hwndHelp,GetPString(IDS_ERRORTEXT));
176 break;
177 }
178 else if(!numread1 && feof(fp1) && feof(fp2)) {
179 AddToListboxBottom(fc.hwndList,
180 GetPString(IDS_COMPFILESMATCHTEXT));
181 if(!stricmp(fc.file1,fc.file2))
182 AddToListboxBottom(fc.hwndList,
183 GetPString(IDS_COMPWONDERWHYTEXT));
184 WinSetWindowText(fc.hwndHelp,
185 GetPString(IDS_COMPCOMPLETETEXT));
186 break;
187 }
188 else if(numread1 <= 0 || numread2 <= 0) {
189 if(offset == len1)
190 break;
191 else {
192 sprintf(s,GetPString(IDS_COMPMATCHREADERRORTEXT),
193 offset,offset);
194 WinSetWindowText(fc.hwndHelp,
195 GetPString(IDS_COMPODDERRORTEXT));
196 AddToListboxBottom(fc.hwndList,s);
197 break;
198 }
199 }
200 else if(memcmp(s,ss,numread1)) {
201 p1 = s;
202 p2 = ss;
203 while(p1 < s + numread1) {
204 if(*p1 != *p2) {
205 sprintf(s,GetPString(IDS_COMPMISMATCHERRORTEXT),
206 offset + (p1 - s),offset + (p1 - s));
207 AddToListboxBottom(fc.hwndList,s);
208 WinSetWindowText(fc.hwndHelp,
209 GetPString(IDS_COMPDONTMATCHTEXT));
210 break;
211 }
212 p1++;
213 p2++;
214 }
215 break;
216 }
217 offset += numread1;
218 }
219 }
220 fclose(fp2);
221 }
222 else {
223 sprintf(s,GetPString(IDS_COMPCANTOPENTEXT),fc.file2);
224 AddToListboxBottom(fc.hwndList,s);
225 WinSetWindowText(fc.hwndHelp,GetPString(IDS_ERRORTEXT));
226 }
227 fclose(fp1);
228 }
229 else {
230 sprintf(s,GetPString(IDS_COMPCANTOPENTEXT),fc.file1);
231 AddToListboxBottom(fc.hwndList,s);
232 WinSetWindowText(fc.hwndHelp,GetPString(IDS_ERRORTEXT));
233 }
234 WinDestroyMsgQueue(hmq2);
235 }
236 WinTerminate(hab2);
237 }
238 }
239}
240
241
242MRESULT EXPENTRY CFileDlgProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2) {
243
244 FCOMPARE *fc;
245
246 switch(msg) {
247 case WM_INITDLG:
248 if(!mp2)
249 WinDismissDlg(hwnd,0);
250 else {
251 WinSetWindowPtr(hwnd,0,mp2);
252 fc = (FCOMPARE *)mp2;
253 fc->hwndReport = hwnd;
254 fc->hwndList = WinWindowFromID(hwnd,FCMP_LISTBOX);
255 fc->hwndHelp = WinWindowFromID(hwnd,FCMP_HELP);
256 if(!*fc->file1 || !fc->file2) {
257 WinDismissDlg(hwnd,0);
258 break;
259 }
260 MakeFullName(fc->file1);
261 MakeFullName(fc->file2);
262 if(!stricmp(fc->file1,fc->file2)) {
263 saymsg(MB_CANCEL,hwnd,
264 GetPString(IDS_COMPSILLYALERTTEXT),
265 GetPString(IDS_COMPTOITSELFTEXT));
266 WinDismissDlg(hwnd,0);
267 break;
268 }
269 if(_beginthread(CompareFiles,
270 NULL,
271 65536,
272 (PVOID)fc) == -1) {
273 General_Error(WinQueryAnchorBlock(hwnd),
274 hwnd,
275 __FILE__,
276 __LINE__,
277 "%s",
278 GetPString(IDS_CANTCOMPARETEXT));
279 WinDismissDlg(hwnd,0);
280 }
281 }
282 break;
283
284 case WM_ADJUSTWINDOWPOS:
285 PostMsg(hwnd,
286 UM_SETDIR,
287 MPVOID,
288 MPVOID);
289 break;
290
291 case UM_SETDIR:
292 PaintRecessedWindow(WinWindowFromID(hwnd,FCMP_HELP),
293 (HPS)0,
294 FALSE,
295 TRUE);
296 return 0;
297
298 case WM_COMMAND:
299 switch(SHORT1FROMMP(mp1)) {
300 case DID_OK:
301 WinDismissDlg(hwnd,0);
302 break;
303 case DID_CANCEL:
304 WinDismissDlg(hwnd,1);
305 break;
306 }
307 return 0;
308
309 case WM_DESTROY:
310 DosSleep(100L);
311 break;
312 }
313 return WinDefDlgProc(hwnd,msg,mp1,mp2);
314}
315
316
317static VOID ActionCnr (VOID *args) {
318
319 COMPARE *cmp = (COMPARE *)args;
320 HAB hab;
321 HMQ hmq;
322 HWND hwndCnrS,hwndCnrD;
323 PCNRITEM pci,pciO,pcin,pciOn;
324 CHAR newname[CCHMAXPATH],dirname[CCHMAXPATH],*p;
325 APIRET rc;
326
327 if(!cmp)
328 return;
329
330 DosError(FERR_DISABLEHARDERR);
331
332 hab = WinInitialize(0);
333 if(hab) {
334 hmq = WinCreateMsgQueue(hab,0);
335 if(hmq) {
336 WinCancelShutdown(hmq,TRUE);
337 priority_normal();
338 switch(cmp->action) {
339 case COMP_DELETELEFT:
340 hwndCnrS = WinWindowFromID(cmp->hwnd,COMP_LEFTDIR);
341 hwndCnrD = WinWindowFromID(cmp->hwnd,COMP_RIGHTDIR);
342 cmp->action = IDM_DELETE;
343 break;
344 case COMP_DELETERIGHT:
345 hwndCnrS = WinWindowFromID(cmp->hwnd,COMP_RIGHTDIR);
346 hwndCnrD = WinWindowFromID(cmp->hwnd,COMP_LEFTDIR);
347 cmp->action = IDM_DELETE;
348 break;
349 case COMP_MOVELEFT:
350 cmp->action = IDM_MOVE;
351 hwndCnrS = WinWindowFromID(cmp->hwnd,COMP_LEFTDIR);
352 hwndCnrD = WinWindowFromID(cmp->hwnd,COMP_RIGHTDIR);
353 break;
354 case COMP_MOVERIGHT:
355 cmp->action = IDM_MOVE;
356 hwndCnrS = WinWindowFromID(cmp->hwnd,COMP_RIGHTDIR);
357 hwndCnrD = WinWindowFromID(cmp->hwnd,COMP_LEFTDIR);
358 break;
359 case COMP_COPYLEFT:
360 cmp->action = IDM_COPY;
361 hwndCnrS = WinWindowFromID(cmp->hwnd,COMP_LEFTDIR);
362 hwndCnrD = WinWindowFromID(cmp->hwnd,COMP_RIGHTDIR);
363 break;
364 case COMP_COPYRIGHT:
365 cmp->action = IDM_COPY;
366 hwndCnrS = WinWindowFromID(cmp->hwnd,COMP_RIGHTDIR);
367 hwndCnrD = WinWindowFromID(cmp->hwnd,COMP_LEFTDIR);
368 break;
369 default:
370 DosBeep(250,100);
371 goto Abort;
372 }
373
374 pci = WinSendMsg(hwndCnrS,CM_QUERYRECORD,MPVOID,
375 MPFROM2SHORT(CMA_FIRST,CMA_ITEMORDER));
376 pciO = WinSendMsg(hwndCnrD,CM_QUERYRECORD,MPVOID,
377 MPFROM2SHORT(CMA_FIRST,CMA_ITEMORDER));
378 while(pci && (INT)pci != -1 && pciO && (INT)pciO != -1) {
379 pcin = WinSendMsg(hwndCnrS,CM_QUERYRECORD,MPFROMP(pci),
380 MPFROM2SHORT(CMA_NEXT,CMA_ITEMORDER));
381 pciOn = WinSendMsg(hwndCnrD,CM_QUERYRECORD,MPFROMP(pciO),
382 MPFROM2SHORT(CMA_NEXT,CMA_ITEMORDER));
383 if(*pci->szFileName && (pci->rc.flRecordAttr & CRA_SELECTED)) {
384 switch(cmp->action) {
385 case IDM_DELETE:
386 if(!unlinkf("%s",pci->szFileName)) {
387 WinSendMsg(hwndCnrS,CM_SETRECORDEMPHASIS,MPFROMP(pci),
388 MPFROM2SHORT(FALSE,CRA_SELECTED));
389 if(!*pciO->szFileName) {
390 WinSendMsg(hwndCnrS,CM_REMOVERECORD,MPFROMP(&pci),
391 MPFROM2SHORT(1,CMA_FREE | CMA_INVALIDATE));
392 if(pciO->rc.flRecordAttr & CRA_SELECTED)
393 WinSendMsg(hwndCnrD,CM_SETRECORDEMPHASIS,MPFROMP(pciO),
394 MPFROM2SHORT(FALSE,CRA_SELECTED));
395 WinSendMsg(hwndCnrD,CM_REMOVERECORD,MPFROMP(&pciO),
396 MPFROM2SHORT(1,CMA_FREE | CMA_INVALIDATE));
397 }
398 else {
399 *pci->szFileName = 0;
400 pci->pszFileName = pci->szFileName;
401 pci->flags = 0;
402 WinSendMsg(hwndCnrS,CM_INVALIDATERECORD,MPFROMP(&pci),
403 MPFROM2SHORT(1,CMA_ERASE | CMA_TEXTCHANGED));
404 }
405 if(hwndCnrS == WinWindowFromID(cmp->hwnd,COMP_LEFTDIR))
406 cmp->cmp->totalleft--;
407 else
408 cmp->cmp->totalright--;
409 DosSleep(0L);
410 }
411 break;
412
413 case IDM_MOVE:
414 if(hwndCnrS == WinWindowFromID(cmp->hwnd,COMP_RIGHTDIR))
415 sprintf(newname,"%s%s%s",cmp->leftdir,
416 cmp->leftdir[strlen(cmp->leftdir) - 1] == '\\' ? NullStr : "\\",
417 pci->pszFileName);
418 else
419 sprintf(newname,"%s%s%s",cmp->rightdir,
420 cmp->rightdir[strlen(cmp->rightdir) - 1] == '\\' ? NullStr : "\\",
421 pci->pszFileName);
422 /* make directory if required */
423 strcpy(dirname,newname);
424 p = strrchr(dirname,'\\');
425 if(p) {
426 if(p > dirname + 2)
427 p++;
428 *p = 0;
429 if(IsFile(dirname) == -1)
430 MassMkdir(hwndMain,dirname);
431 }
432 rc = docopyf(MOVE,pci->szFileName,"%s",newname);
433 if(!rc && stricmp(pci->szFileName,newname)) {
434 WinSendMsg(hwndCnrS,CM_SETRECORDEMPHASIS,MPFROMP(pci),
435 MPFROM2SHORT(FALSE,CRA_SELECTED));
436 if(pciO->rc.flRecordAttr & CRA_SELECTED)
437 WinSendMsg(hwndCnrD,CM_SETRECORDEMPHASIS,MPFROMP(pciO),
438 MPFROM2SHORT(FALSE,CRA_SELECTED));
439 strcpy(pciO->szFileName,newname);
440 if(hwndCnrS == WinWindowFromID(cmp->hwnd,COMP_RIGHTDIR)) {
441 pciO->pszFileName = pciO->szFileName + strlen(cmp->leftdir);
442 if(cmp->leftdir[strlen(cmp->leftdir) - 1] != '\\')
443 pciO->pszFileName++;
444 }
445 else {
446 pciO->pszFileName = pciO->szFileName + strlen(cmp->rightdir);
447 if(cmp->rightdir[strlen(cmp->rightdir) - 1] != '\\')
448 pciO->pszFileName++;
449 }
450 strcpy(pciO->szDispAttr,pci->szDispAttr);
451 pciO->attrFile = pci->attrFile;
452 pciO->flags = 0;
453 pciO->date = pci->date;
454 pciO->time = pci->time;
455 pciO->ladate = pci->ladate;
456 pciO->latime = pci->latime;
457 pciO->crdate = pci->crdate;
458 pciO->crtime = pci->crtime;
459 pciO->cbFile = pci->cbFile;
460 pciO->easize = pci->easize;
461 *pciO->subject = 0;
462 *pci->szFileName = 0;
463 pci->pszFileName = pci->szFileName;
464 pci->flags = 0;
465 WinSendMsg(hwndCnrS,CM_INVALIDATERECORD,MPFROMP(&pci),
466 MPFROM2SHORT(1,CMA_ERASE | CMA_TEXTCHANGED));
467 WinSendMsg(hwndCnrD,CM_INVALIDATERECORD,MPFROMP(&pciO),
468 MPFROM2SHORT(1,CMA_ERASE | CMA_TEXTCHANGED));
469 }
470 else if(rc) {
471 rc = Dos_Error(MB_ENTERCANCEL,
472 rc,
473 HWND_DESKTOP,
474 __FILE__,
475 __LINE__,
476 GetPString(IDS_COMPMOVEFAILEDTEXT),
477 pci->szFileName,
478 newname);
479 if(rc == MBID_CANCEL) /* cause loop to break */
480 pcin = NULL;
481 }
482 break;
483
484 case IDM_COPY:
485 if(hwndCnrS == WinWindowFromID(cmp->hwnd,COMP_RIGHTDIR))
486 sprintf(newname,"%s%s%s",cmp->leftdir,
487 cmp->leftdir[strlen(cmp->leftdir) - 1] == '\\' ? NullStr : "\\",
488 pci->pszFileName);
489 else
490 sprintf(newname,"%s%s%s",cmp->rightdir,
491 cmp->rightdir[strlen(cmp->rightdir) - 1] == '\\' ? NullStr : "\\",
492 pci->pszFileName);
493 /* make directory if required */
494 strcpy(dirname,newname);
495 p = strrchr(dirname,'\\');
496 if(p) {
497 if(p > dirname + 2)
498 p++;
499 *p = 0;
500 if(IsFile(dirname) == -1)
501 MassMkdir(hwndMain,dirname);
502 }
503 rc = docopyf(COPY,pci->szFileName,"%s",newname);
504 if(!rc) {
505 WinSendMsg(hwndCnrS,CM_SETRECORDEMPHASIS,MPFROMP(pci),
506 MPFROM2SHORT(FALSE,CRA_SELECTED));
507 if(pciO->rc.flRecordAttr & CRA_SELECTED)
508 WinSendMsg(hwndCnrD,CM_SETRECORDEMPHASIS,MPFROMP(pciO),
509 MPFROM2SHORT(FALSE,CRA_SELECTED));
510 strcpy(pciO->szFileName,newname);
511 if(hwndCnrS == WinWindowFromID(cmp->hwnd,COMP_RIGHTDIR)) {
512 pciO->pszFileName = pciO->szFileName + strlen(cmp->leftdir);
513 if(cmp->leftdir[strlen(cmp->leftdir) - 1] != '\\')
514 pciO->pszFileName++;
515 }
516 else {
517 pciO->pszFileName = pciO->szFileName + strlen(cmp->rightdir);
518 if(cmp->rightdir[strlen(cmp->rightdir) - 1] != '\\')
519 pciO->pszFileName++;
520 }
521 strcpy(pciO->szDispAttr,pci->szDispAttr);
522 pciO->attrFile = pci->attrFile;
523 pciO->flags = CNRITEM_EXISTS;
524 pciO->date = pci->date;
525 pciO->time = pci->time;
526 pciO->ladate = pci->ladate;
527 pciO->latime = pci->latime;
528 pciO->crdate = pci->crdate;
529 pciO->crtime = pci->crtime;
530 pciO->cbFile = pci->cbFile;
531 pciO->easize = pci->easize;
532 *pci->subject = 0;
533 pci->flags = CNRITEM_EXISTS;
534 WinSendMsg(hwndCnrS,CM_INVALIDATERECORD,MPFROMP(&pci),
535 MPFROM2SHORT(1,CMA_ERASE | CMA_TEXTCHANGED));
536 WinSendMsg(hwndCnrD,CM_INVALIDATERECORD,MPFROMP(&pciO),
537 MPFROM2SHORT(1,CMA_ERASE | CMA_TEXTCHANGED));
538 }
539 else {
540 rc = Dos_Error(MB_ENTERCANCEL,
541 rc,
542 HWND_DESKTOP,
543 __FILE__,
544 __LINE__,
545 GetPString(IDS_COMPCOPYFAILEDTEXT),
546 pci->szFileName,
547 newname);
548 if(rc == MBID_CANCEL) /* cause loop to break */
549 pcin = NULL;
550 }
551 break;
552
553 default:
554 break;
555 }
556 }
557 pci = pcin;
558 pciO = pciOn;
559 }
560Abort:
561 WinDestroyMsgQueue(hmq);
562 }
563 WinTerminate(hab);
564 }
565 PostMsg(cmp->hwnd,UM_CONTAINER_FILLED,MPFROMLONG(1L),MPVOID);
566 PostMsg(cmp->hwnd,WM_COMMAND,MPFROM2SHORT(IDM_DESELECTALL,0),MPVOID);
567 free(cmp);
568}
569
570
571static VOID SelectCnrs (VOID *args) {
572
573 COMPARE *cmp = (COMPARE *)args;
574 HAB hab;
575 HMQ hmq;
576
577 if(!cmp)
578 return;
579
580 DosError(FERR_DISABLEHARDERR);
581
582 hab = WinInitialize(0);
583 if(hab) {
584 hmq = WinCreateMsgQueue(hab,0);
585 if(hmq) {
586 WinCancelShutdown(hmq,TRUE);
587 priority_normal();
588 switch(cmp->action) {
589 case IDM_INVERT:
590 InvertAll(WinWindowFromID(cmp->hwnd,COMP_LEFTDIR));
591 InvertAll(WinWindowFromID(cmp->hwnd,COMP_RIGHTDIR));
592 break;
593
594 case IDM_DESELECTALL:
595 Deselect(WinWindowFromID(cmp->hwnd,COMP_LEFTDIR));
596 Deselect(WinWindowFromID(cmp->hwnd,COMP_RIGHTDIR));
597 break;
598
599 default:
600 SpecialSelect(WinWindowFromID(cmp->hwnd,COMP_LEFTDIR),
601 WinWindowFromID(cmp->hwnd,COMP_RIGHTDIR),
602 cmp->action,cmp->reset);
603 break;
604 }
605 if(!PostMsg(cmp->hwnd,UM_CONTAINER_FILLED,MPFROMLONG(1L),MPVOID))
606 WinSendMsg(cmp->hwnd,UM_CONTAINER_FILLED,MPFROMLONG(1L),MPVOID);
607 WinDestroyMsgQueue(hmq);
608 }
609 WinTerminate(hab);
610 }
611 free(cmp);
612}
613
614
615static VOID FillDirList (CHAR *str,INT skiplen,BOOL recurse,
616 FILELIST ***list,INT *numfiles,INT *numalloc) {
617
618 register BYTE *fb;
619 register CHAR *enddir;
620 register ULONG x;
621 CHAR *maskstr;
622 FILEFINDBUF4 *ffb4,*pffb;
623 HDIR hDir;
624 ULONG nm,fl = 0,ulM = 64;
625 APIRET rc;
626
627 if(!str || !*str)
628 return;
629 if(!recurse)
630 ulM = 128;
631 maskstr = malloc(CCHMAXPATH);
632 if(!maskstr)
633 return;
634 ffb4 = malloc(sizeof(FILEFINDBUF4) * ulM);
635 if(!ffb4) {
636 free(maskstr);
637 return;
638 }
639 x = strlen(str);
640 memcpy(maskstr,str,x + 1);
641 enddir = maskstr + x;
642 if(*(enddir - 1) != '\\') {
643 *enddir = '\\';
644 enddir++;
645 *enddir = 0;
646 }
647 *enddir = '*';
648 *(enddir + 1) = 0;
649 hDir = HDIR_CREATE;
650 nm = ulM;
651 if(recurse)
652 fl = FILE_DIRECTORY;
653 DosError(FERR_DISABLEHARDERR);
654 rc = DosFindFirst(maskstr, &hDir,
655 (FILE_NORMAL | FILE_READONLY | FILE_ARCHIVED |
656 FILE_SYSTEM | FILE_HIDDEN) | fl,
657 ffb4, sizeof(FILEFINDBUF4) * nm,
658 &nm, FIL_QUERYEASIZE);
659 if(!rc) {
660 while(!rc) {
661 fb = (BYTE *)ffb4;
662 x = 0;
663 while(x < nm) {
664 pffb = (FILEFINDBUF4 *)fb;
665 if(pffb->attrFile & FILE_DIRECTORY) {
666 if(recurse && (*pffb->achName != '.' && (pffb->achName[1] &&
667 pffb->achName[1] != '.'))) {
668 if(fForceUpper)
669 strupr(pffb->achName);
670 else if(fForceLower)
671 strlwr(pffb->achName);
672 memcpy(enddir,pffb->achName,pffb->cchName + 1);
673 FillDirList(maskstr,skiplen,recurse,list,numfiles,numalloc);
674 }
675 }
676 else {
677 if(fForceUpper)
678 strupr(pffb->achName);
679 else if(fForceLower)
680 strlwr(pffb->achName);
681 memcpy(enddir,pffb->achName,pffb->cchName + 1);
682 if(AddToFileList(maskstr + skiplen,pffb,list,numfiles,numalloc))
683 goto Abort;
684 }
685 fb += pffb->oNextEntryOffset;
686 x++;
687 }
688 nm = ulM;
689 DosError(FERR_DISABLEHARDERR);
690 rc = DosFindNext(hDir,ffb4,sizeof(FILEFINDBUF4) * nm,&nm);
691 }
692Abort:
693 DosFindClose(hDir);
694 DosSleep(0L);
695 }
696 free(maskstr);
697 free(ffb4);
698}
699
700
701static int CompNames (const void *n1,const void *n2) {
702
703 FILELIST *fl1 = *(FILELIST **)n1;
704 FILELIST *fl2 = *(FILELIST **)n2;
705
706 return stricmp(fl1->fname,fl2->fname);
707}
708
709
710static int CompNames2 (const void *n1,const void *n2) {
711
712 FILELIST *fl1 = *(FILELIST **)n1;
713 FILELIST *fl2 = *(FILELIST **)n2;
714 register CHAR *p1,*p2;
715
716 p1 = strrchr(fl1->fname,'\\');
717 if(p1)
718 p1++;
719 else
720 p1 = fl1->fname;
721 p2 = strrchr(fl2->fname,'\\');
722 if(p2)
723 p2++;
724 else
725 p2 = fl2->fname;
726 return stricmp(p1,p2);
727}
728
729
730static VOID FillCnrs (VOID *args) {
731
732 COMPARE *cmp = (COMPARE *)args;
733 HAB hab;
734 HMQ hmq;
735 BOOL notified = FALSE;
736 static CHAR attrstring[] = "RHS\0DA";
737 HWND hwndLeft,hwndRight;
738
739 if(!cmp)
740 _endthread();
741
742 DosError(FERR_DISABLEHARDERR);
743
744 hab = WinInitialize(0);
745 if(hab) {
746 hmq = WinCreateMsgQueue(hab,0);
747 if(hmq) {
748
749 register INT x,l,r,y;
750 register ULONG cntr;
751 FILELIST **filesl = NULL,**filesr = NULL;
752 INT numfilesl = 0,numfilesr = 0,numallocl = 0,numallocr = 0,
753 lenl,lenr,high;
754 PCNRITEM pcilFirst,pcirFirst,pcil,pcir,pcit;
755 RECORDINSERT ri;
756 register CHAR *cl;
757
758 WinCancelShutdown(hmq,TRUE);
759 hwndLeft = WinWindowFromID(cmp->hwnd,COMP_LEFTDIR);
760 hwndRight = WinWindowFromID(cmp->hwnd,COMP_RIGHTDIR);
761 lenl = strlen(cmp->leftdir);
762 if(cmp->leftdir[strlen(cmp->leftdir) - 1] != '\\')
763 lenl++;
764 lenr = strlen(cmp->rightdir);
765 if(cmp->rightdir[strlen(cmp->rightdir) - 1] != '\\')
766 lenr++;
767 priority_normal();
768 /* clear containers */
769 WinSendMsg(hwndRight,CM_REMOVERECORD,
770 MPVOID,MPFROM2SHORT(0,CMA_FREE | CMA_INVALIDATE));
771 WinSendMsg(hwndLeft,CM_REMOVERECORD,
772 MPVOID,MPFROM2SHORT(0,CMA_FREE | CMA_INVALIDATE));
773 cmp->cmp->totalleft = cmp->cmp->totalright = 0;
774
775 /* build list of all files in left directory */
776 if(fForceLower)
777 strlwr(cmp->leftdir);
778 else if(fForceUpper)
779 strupr(cmp->leftdir);
780 FillDirList(cmp->leftdir,lenl,cmp->includesubdirs,
781 &filesl,&numfilesl,&numallocl);
782
783 if(filesl)
784 qsort(filesl,numfilesl,sizeof(CHAR *),CompNames);
785 /* build list of all files in right directory */
786 if(!*cmp->rightlist) {
787 if(fForceLower)
788 strlwr(cmp->rightdir);
789 else if(fForceUpper)
790 strupr(cmp->rightdir);
791 FillDirList(cmp->rightdir,lenr,cmp->includesubdirs,
792 &filesr,&numfilesr,&numallocr);
793 }
794 else { /* load snapshot file */
795
796 FILE *fp;
797 FILEFINDBUF4 fb4;
798 CHAR str[CCHMAXPATH * 2],*p;
799
800 memset(&fb4,0,sizeof(fb4));
801 fp = fopen(cmp->rightlist,"r");
802 if(fp) {
803 while(!feof(fp)) { /* first get name of directory */
804 if(!fgets(str,sizeof(str) - 1,fp))
805 break;
806 str[sizeof(str) - 1] = 0;
807 lstrip(rstrip(str));
808 p = str;
809 if(*p == '\"') {
810 p++;
811 if(*p && *p != '\"') {
812 p = strchr(p,'\"');
813 if(p) {
814 *p = 0;
815 if(*(str + 1)) {
816 strcpy(cmp->rightdir,str + 1);
817 if(fForceUpper)
818 strupr(cmp->rightdir);
819 else if(fForceLower)
820 strlwr(cmp->rightdir);
821 p = cmp->rightdir + (strlen(cmp->rightdir) - 1);
822 if(p - cmp->rightdir > 3 && *p == '\\')
823 *p = 0;
824 break;
825 }
826 }
827 }
828 }
829 }
830 {
831 CNRINFO cnri;
832
833 memset(&cnri,0,sizeof(cnri));
834 cnri.cb = sizeof(cnri);
835 cnri.pszCnrTitle = cmp->rightdir;
836 WinSendMsg(hwndRight,CM_SETCNRINFO,
837 MPFROMP(&cnri),
838 MPFROMLONG(CMA_CNRTITLE));
839 }
840 if(*cmp->rightdir) {
841 lenr = strlen(cmp->rightdir) +
842 (cmp->rightdir[strlen(cmp->rightdir) - 1] != '\\');
843 while(!feof(fp)) {
844 if(!fgets(str,sizeof(str) - 1,fp))
845 break;
846 str[sizeof(str) - 1] = 0;
847 lstrip(rstrip(str));
848 p = str;
849 if(*p == '\"') {
850 p++;
851 if(*p && *p != '\"') {
852 p = strchr(p,'\"');
853 if(p) {
854 *p = 0;
855 p++;
856 if(*p == ',') {
857 p++;
858 if(!cmp->includesubdirs && atol(p) > lenr)
859 continue;
860 p = strchr(p,',');
861 if(p) {
862 p++;
863 fb4.cbFile = atol(p);
864 p = strchr(p,',');
865 if(p) {
866 p++;
867 fb4.fdateLastWrite.year = atol(p) - 1980;
868 p = strchr(p,'/');
869 if(p) {
870 p++;
871 fb4.fdateLastWrite.month = atol(p);
872 p = strchr(p,'/');
873 if(p) {
874 p++;
875 fb4.fdateLastWrite.day = atol(p);
876 p = strchr(p,',');
877 if(p) {
878 p++;
879 fb4.ftimeLastWrite.hours = atol(p);
880 p = strchr(p,':');
881 if(p) {
882 p++;
883 fb4.ftimeLastWrite.minutes = atol(p);
884 p = strchr(p,':');
885 if(p) {
886 p++;
887 fb4.ftimeLastWrite.twosecs = atol(p);
888 p = strchr(p,',');
889 if(p) {
890 p++;
891 fb4.attrFile = atol(p);
892 p = strchr(p,',');
893 if(p) {
894 p++;
895 fb4.cbList = atol(p) * 2;
896 if(fForceUpper)
897 strupr(str + 1);
898 else if(fForceLower)
899 strlwr(str + 1);
900 if(AddToFileList((str + 1) + lenr,
901 &fb4,
902 &filesr,
903 &numfilesr,
904 &numallocr))
905 break;
906 }
907 }
908 }
909 }
910 }
911 }
912 }
913 }
914 }
915 }
916 }
917 }
918 }
919 }
920 }
921 fclose(fp);
922 }
923 else
924 DosBeep(50,100);
925 }
926 if(filesr)
927 qsort(filesr,numfilesr,sizeof(CHAR *),CompNames);
928
929 /* we now have two lists of files, both sorted. */
930 /* first, count total number of container entries required */
931 l = r = 0;
932 cntr = 0;
933 while((filesl && filesl[l]) || (filesr && filesr[r])) {
934 if((filesl && filesl[l]) && (filesr && filesr[r])) {
935 x = stricmp(filesl[l]->fname,filesr[r]->fname);
936 if(!x) {
937 l++;
938 r++;
939 }
940 else if(x < 0)
941 l++;
942 else
943 r++;
944 }
945 else if(filesl && filesl[l])
946 l++;
947 else /* filesr && filesr[r] */
948 r++;
949 cntr++; /* keep count of how many entries req'd */
950 }
951 high = cntr;
952 WinSendMsg(cmp->hwnd,UM_CONTAINERHWND,MPVOID,MPVOID);
953 /* now insert records into the containers */
954 cntr = 0;
955 l = r = 0;
956 if(high) {
957 pcilFirst = WinSendMsg(hwndLeft,
958 CM_ALLOCRECORD,
959 MPFROMLONG(EXTRA_RECORD_BYTES2),
960 MPFROMLONG(high));
961 if(!pcilFirst) {
962 high = 0;
963 DosBeep(100,100);
964 }
965 pcirFirst = WinSendMsg(hwndRight,CM_ALLOCRECORD,
966 MPFROMLONG(EXTRA_RECORD_BYTES2),
967 MPFROMLONG(high));
968 if(!pcirFirst) {
969 high = 0;
970 DosBeep(100,100);
971 pcil = pcilFirst;
972 while(pcil) {
973 pcit = (PCNRITEM)pcil->rc.preccNextRecord;
974 WinSendMsg(hwndLeft,CM_FREERECORD,
975 MPFROMP(&pcil),MPFROMSHORT(1));
976 pcil = pcit;
977 }
978 }
979 }
980 if(high) {
981 pcil = pcilFirst;
982 pcir = pcirFirst;
983 while((filesl && filesl[l]) || (filesr && filesr[r])) {
984 pcir->hwndCnr = hwndRight;
985 pcir->pszFileName = pcir->szFileName;
986 pcir->rc.pszIcon = pcir->pszFileName;
987 pcir->rc.hptrIcon = (HPOINTER)0;
988 pcir->pszSubject = pcir->subject;
989 pcir->pszLongname = pcir->Longname;
990 pcir->pszDispAttr = pcir->szDispAttr;
991 pcil->hwndCnr = hwndLeft;
992 pcil->pszFileName = pcil->szFileName;
993 pcil->rc.pszIcon = pcil->pszFileName;
994 pcil->rc.hptrIcon = (HPOINTER)0;
995 pcil->pszDispAttr = pcil->szDispAttr;
996 pcil->pszSubject = pcil->subject;
997 pcil->pszLongname = pcil->Longname;
998 if((filesl && filesl[l]) && (filesr && filesr[r])) {
999 x = stricmp(filesl[l]->fname,filesr[r]->fname);
1000 if(!x) {
1001 sprintf(pcil->szFileName,"%s%s%s",cmp->leftdir,
1002 (cmp->leftdir[strlen(cmp->leftdir) - 1] == '\\') ?
1003 NullStr : "\\",filesl[l]->fname);
1004// pcil->rc.hptrIcon = hptrFile;
1005 pcil->pszFileName = pcil->szFileName + lenl;
1006 pcil->attrFile = filesl[l]->attrFile;
1007 y = 0;
1008 for(x = 0;x < 6;x++)
1009 if(attrstring[x])
1010 pcil->szDispAttr[y++] = (CHAR)((pcil->attrFile & (1 << x)) ?
1011 attrstring[x] : '-');
1012 pcil->szDispAttr[5] = 0;
1013 pcil->cbFile = filesl[l]->cbFile;
1014 pcil->easize = filesl[l]->easize;
1015 pcil->date.day = filesl[l]->date.day;
1016 pcil->date.month = filesl[l]->date.month;
1017 pcil->date.year = filesl[l]->date.year + 1980;
1018 pcil->time.seconds = filesl[l]->time.twosecs * 2;
1019 pcil->time.minutes = filesl[l]->time.minutes;
1020 pcil->time.hours = filesl[l]->time.hours;
1021 pcil->ladate.day = filesl[l]->ladate.day;
1022 pcil->ladate.month = filesl[l]->ladate.month;
1023 pcil->ladate.year = filesl[l]->ladate.year + 1980;
1024 pcil->latime.seconds = filesl[l]->latime.twosecs * 2;
1025 pcil->latime.minutes = filesl[l]->latime.minutes;
1026 pcil->latime.hours = filesl[l]->latime.hours;
1027 pcil->crdate.day = filesl[l]->crdate.day;
1028 pcil->crdate.month = filesl[l]->crdate.month;
1029 pcil->crdate.year = filesl[l]->crdate.year + 1980;
1030 pcil->crtime.seconds = filesl[l]->crtime.twosecs * 2;
1031 pcil->crtime.minutes = filesl[l]->crtime.minutes;
1032 pcil->crtime.hours = filesl[l]->crtime.hours;
1033 if(*cmp->dcd.mask.szMask) {
1034 if(!Filter((PMINIRECORDCORE)pcil,(PVOID)&cmp->dcd.mask)) {
1035 pcil->rc.flRecordAttr |= CRA_FILTERED;
1036 pcir->rc.flRecordAttr |= CRA_FILTERED;
1037 }
1038 }
1039 sprintf(pcir->szFileName,"%s%s%s",cmp->rightdir,
1040 (cmp->rightdir[strlen(cmp->rightdir) - 1] == '\\') ?
1041 NullStr : "\\",filesr[r]->fname);
1042 pcir->pszFileName = pcir->szFileName + lenr;
1043 pcir->attrFile = filesr[r]->attrFile;
1044// pcir->rc.hptrIcon = hptrFile;
1045 y = 0;
1046 for(x = 0;x < 6;x++)
1047 if(attrstring[x])
1048 pcir->szDispAttr[y++] = (CHAR)((pcir->attrFile & (1 << x)) ?
1049 attrstring[x] : '-');
1050 pcir->szDispAttr[5] = 0;
1051 pcir->cbFile = filesr[r]->cbFile;
1052 pcir->easize = filesr[r]->easize;
1053 pcir->date.day = filesr[r]->date.day;
1054 pcir->date.month = filesr[r]->date.month;
1055 pcir->date.year = filesr[r]->date.year + 1980;
1056 pcir->time.seconds = filesr[r]->time.twosecs * 2;
1057 pcir->time.minutes = filesr[r]->time.minutes;
1058 pcir->time.hours = filesr[r]->time.hours;
1059 pcir->ladate.day = filesr[r]->ladate.day;
1060 pcir->ladate.month = filesr[r]->ladate.month;
1061 pcir->ladate.year = filesr[r]->ladate.year + 1980;
1062 pcir->latime.seconds = filesr[r]->latime.twosecs * 2;
1063 pcir->latime.minutes = filesr[r]->latime.minutes;
1064 pcir->latime.hours = filesr[r]->latime.hours;
1065 pcir->crdate.day = filesr[r]->crdate.day;
1066 pcir->crdate.month = filesr[r]->crdate.month;
1067 pcir->crdate.year = filesr[r]->crdate.year + 1980;
1068 pcir->crtime.seconds = filesr[r]->crtime.twosecs * 2;
1069 pcir->crtime.minutes = filesr[r]->crtime.minutes;
1070 pcir->crtime.hours = filesr[r]->crtime.hours;
1071 pcil->flags |= CNRITEM_EXISTS;
1072 pcir->flags |= CNRITEM_EXISTS;
1073 cl = pcil->subject;
1074 if(pcil->cbFile + pcil->easize >
1075 pcir->cbFile + pcir->easize) {
1076 pcil->flags |= CNRITEM_LARGER;
1077 pcir->flags |= CNRITEM_SMALLER;
1078 strcpy(cl,GetPString(IDS_LARGERTEXT));
1079 cl += 6;
1080 }
1081 else if(pcil->cbFile + pcil->easize <
1082 pcir->cbFile + pcir->easize) {
1083 pcil->flags |= CNRITEM_SMALLER;
1084 pcir->flags |= CNRITEM_LARGER;
1085 strcpy(cl,GetPString(IDS_SMALLERTEXT));
1086 cl += 7;
1087 }
1088 if((pcil->date.year > pcir->date.year) ? TRUE :
1089 (pcil->date.year < pcir->date.year) ? FALSE :
1090 (pcil->date.month > pcir->date.month) ? TRUE :
1091 (pcil->date.month < pcir->date.month) ? FALSE :
1092 (pcil->date.day > pcir->date.day) ? TRUE :
1093 (pcil->date.day < pcir->date.day) ? FALSE :
1094 (pcil->time.hours > pcir->time.hours) ? TRUE :
1095 (pcil->time.hours < pcir->time.hours) ? FALSE :
1096 (pcil->time.minutes > pcir->time.minutes) ? TRUE :
1097 (pcil->time.minutes < pcir->time.minutes) ? FALSE :
1098 (pcil->time.seconds > pcir->time.seconds) ? TRUE :
1099 (pcil->time.seconds < pcir->time.seconds) ? FALSE : FALSE) {
1100 pcil->flags |= CNRITEM_NEWER;
1101 pcir->flags |= CNRITEM_OLDER;
1102 if(cl != pcil->subject) {
1103 strcpy(cl,", ");
1104 cl += 2;
1105 }
1106 strcpy(cl,GetPString(IDS_NEWERTEXT));
1107 cl += 5;
1108 }
1109 else if((pcil->date.year < pcir->date.year) ? TRUE :
1110 (pcil->date.year > pcir->date.year) ? FALSE :
1111 (pcil->date.month < pcir->date.month) ? TRUE :
1112 (pcil->date.month > pcir->date.month) ? FALSE :
1113 (pcil->date.day < pcir->date.day) ? TRUE :
1114 (pcil->date.day > pcir->date.day) ? FALSE :
1115 (pcil->time.hours < pcir->time.hours) ? TRUE :
1116 (pcil->time.hours > pcir->time.hours) ? FALSE :
1117 (pcil->time.minutes < pcir->time.minutes) ? TRUE :
1118 (pcil->time.minutes > pcir->time.minutes) ? FALSE :
1119 (pcil->time.seconds < pcir->time.seconds) ? TRUE :
1120 (pcil->time.seconds > pcir->time.seconds) ? FALSE :
1121 FALSE) {
1122 pcil->flags |= CNRITEM_OLDER;
1123 pcir->flags |= CNRITEM_NEWER;
1124 if(cl != pcil->subject) {
1125 strcpy(cl,", ");
1126 cl += 2;
1127 }
1128 strcpy(cl,GetPString(IDS_OLDERTEXT));
1129 cl += 5;
1130 }
1131 *cl = 0;
1132 r++;
1133 l++;
1134 }
1135 else if(x < 0) {
1136 sprintf(pcil->szFileName,"%s%s%s",cmp->leftdir,
1137 (cmp->leftdir[strlen(cmp->leftdir) - 1] == '\\') ?
1138 NullStr : "\\",filesl[l]->fname);
1139 pcil->pszFileName = pcil->szFileName + lenl;
1140 pcil->attrFile = filesl[l]->attrFile;
1141// pcil->rc.hptrIcon = hptrFile;
1142 y = 0;
1143 for(x = 0;x < 6;x++)
1144 if(attrstring[x])
1145 pcil->szDispAttr[y++] = (CHAR)((pcil->attrFile & (1 << x)) ?
1146 attrstring[x] : '-');
1147 pcil->szDispAttr[5] = 0;
1148 pcil->cbFile = filesl[l]->cbFile;
1149 pcil->easize = filesl[l]->easize;
1150 pcil->date.day = filesl[l]->date.day;
1151 pcil->date.month = filesl[l]->date.month;
1152 pcil->date.year = filesl[l]->date.year + 1980;
1153 pcil->time.seconds = filesl[l]->time.twosecs * 2;
1154 pcil->time.minutes = filesl[l]->time.minutes;
1155 pcil->time.hours = filesl[l]->time.hours;
1156 pcil->ladate.day = filesl[l]->ladate.day;
1157 pcil->ladate.month = filesl[l]->ladate.month;
1158 pcil->ladate.year = filesl[l]->ladate.year + 1980;
1159 pcil->latime.seconds = filesl[l]->latime.twosecs * 2;
1160 pcil->latime.minutes = filesl[l]->latime.minutes;
1161 pcil->latime.hours = filesl[l]->latime.hours;
1162 pcil->crdate.day = filesl[l]->crdate.day;
1163 pcil->crdate.month = filesl[l]->crdate.month;
1164 pcil->crdate.year = filesl[l]->crdate.year + 1980;
1165 pcil->crtime.seconds = filesl[l]->crtime.twosecs * 2;
1166 pcil->crtime.minutes = filesl[l]->crtime.minutes;
1167 pcil->crtime.hours = filesl[l]->crtime.hours;
1168 if(*cmp->dcd.mask.szMask) {
1169 if(!Filter((PMINIRECORDCORE)pcil,(PVOID)&cmp->dcd.mask)) {
1170 pcil->rc.flRecordAttr |= CRA_FILTERED;
1171 pcir->rc.flRecordAttr |= CRA_FILTERED;
1172 }
1173 }
1174 free(filesl[l]);
1175 l++;
1176 }
1177 else {
1178 sprintf(pcir->szFileName,"%s%s%s",cmp->rightdir,
1179 (cmp->rightdir[strlen(cmp->rightdir) - 1] == '\\') ?
1180 NullStr : "\\",filesr[r]->fname);
1181 pcir->pszFileName = pcir->szFileName + lenr;
1182 pcir->attrFile = filesr[r]->attrFile;
1183// pcir->rc.hptrIcon = hptrFile;
1184 y = 0;
1185 for(x = 0;x < 6;x++)
1186 if(attrstring[x])
1187 pcir->szDispAttr[y++] = (CHAR)((pcir->attrFile & (1 << x)) ?
1188 attrstring[x] : '-');
1189 pcir->szDispAttr[5] = 0;
1190 pcir->cbFile = filesr[r]->cbFile;
1191 pcir->easize = filesr[r]->easize;
1192 pcir->date.day = filesr[r]->date.day;
1193 pcir->date.month = filesr[r]->date.month;
1194 pcir->date.year = filesr[r]->date.year + 1980;
1195 pcir->time.seconds = filesr[r]->time.twosecs * 2;
1196 pcir->time.minutes = filesr[r]->time.minutes;
1197 pcir->time.hours = filesr[r]->time.hours;
1198 pcir->ladate.day = filesr[r]->ladate.day;
1199 pcir->ladate.month = filesr[r]->ladate.month;
1200 pcir->ladate.year = filesr[r]->ladate.year + 1980;
1201 pcir->latime.seconds = filesr[r]->latime.twosecs * 2;
1202 pcir->latime.minutes = filesr[r]->latime.minutes;
1203 pcir->latime.hours = filesr[r]->latime.hours;
1204 pcir->crdate.day = filesr[r]->crdate.day;
1205 pcir->crdate.month = filesr[r]->crdate.month;
1206 pcir->crdate.year = filesr[r]->crdate.year + 1980;
1207 pcir->crtime.seconds = filesr[r]->crtime.twosecs * 2;
1208 pcir->crtime.minutes = filesr[r]->crtime.minutes;
1209 pcir->crtime.hours = filesr[r]->crtime.hours;
1210 if(*cmp->dcd.mask.szMask) {
1211 if(!Filter((PMINIRECORDCORE)pcir,(PVOID)&cmp->dcd.mask)) {
1212 pcir->rc.flRecordAttr |= CRA_FILTERED;
1213 pcil->rc.flRecordAttr |= CRA_FILTERED;
1214 }
1215 }
1216 free(filesr[r]);
1217 r++;
1218 }
1219 }
1220 else if(filesl && filesl[l]) {
1221 sprintf(pcil->szFileName,"%s%s%s",cmp->leftdir,
1222 (cmp->leftdir[strlen(cmp->leftdir) - 1] == '\\') ?
1223 NullStr : "\\",filesl[l]->fname);
1224 pcil->pszFileName = pcil->szFileName + lenl;
1225 pcil->attrFile = filesl[l]->attrFile;
1226// pcil->rc.hptrIcon = hptrFile;
1227 y = 0;
1228 for(x = 0;x < 6;x++)
1229 if(attrstring[x])
1230 pcil->szDispAttr[y++] = (CHAR)((pcil->attrFile & (1 << x)) ?
1231 attrstring[x] : '-');
1232 pcil->szDispAttr[5] = 0;
1233 pcil->cbFile = filesl[l]->cbFile;
1234 pcil->easize = filesl[l]->easize;
1235 pcil->date.day = filesl[l]->date.day;
1236 pcil->date.month = filesl[l]->date.month;
1237 pcil->date.year = filesl[l]->date.year + 1980;
1238 pcil->time.seconds = filesl[l]->time.twosecs * 2;
1239 pcil->time.minutes = filesl[l]->time.minutes;
1240 pcil->time.hours = filesl[l]->time.hours;
1241 pcil->ladate.day = filesl[l]->ladate.day;
1242 pcil->ladate.month = filesl[l]->ladate.month;
1243 pcil->ladate.year = filesl[l]->ladate.year + 1980;
1244 pcil->latime.seconds = filesl[l]->latime.twosecs * 2;
1245 pcil->latime.minutes = filesl[l]->latime.minutes;
1246 pcil->latime.hours = filesl[l]->latime.hours;
1247 pcil->crdate.day = filesl[l]->crdate.day;
1248 pcil->crdate.month = filesl[l]->crdate.month;
1249 pcil->crdate.year = filesl[l]->crdate.year + 1980;
1250 pcil->crtime.seconds = filesl[l]->crtime.twosecs * 2;
1251 pcil->crtime.minutes = filesl[l]->crtime.minutes;
1252 pcil->crtime.hours = filesl[l]->crtime.hours;
1253 if(*cmp->dcd.mask.szMask) {
1254 if(!Filter((PMINIRECORDCORE)pcil,(PVOID)&cmp->dcd.mask)) {
1255 pcil->rc.flRecordAttr |= CRA_FILTERED;
1256 pcir->rc.flRecordAttr |= CRA_FILTERED;
1257 }
1258 }
1259 free(filesl[l]);
1260 l++;
1261 }
1262 else { /* filesr && filesr[r] */
1263 sprintf(pcir->szFileName,"%s%s%s",cmp->rightdir,
1264 (cmp->rightdir[strlen(cmp->rightdir) - 1] == '\\') ?
1265 NullStr : "\\",filesr[r]->fname);
1266 pcir->pszFileName = pcir->szFileName + lenr;
1267 pcir->attrFile = filesr[r]->attrFile;
1268// pcir->rc.hptrIcon = hptrFile;
1269 y = 0;
1270 for(x = 0;x < 6;x++)
1271 if(attrstring[x])
1272 pcir->szDispAttr[y++] = (CHAR)((pcir->attrFile & (1 << x)) ?
1273 attrstring[x] : '-');
1274 pcir->szDispAttr[5] = 0;
1275 pcir->cbFile = filesr[r]->cbFile;
1276 pcir->easize = filesr[r]->easize;
1277 pcir->date.day = filesr[r]->date.day;
1278 pcir->date.month = filesr[r]->date.month;
1279 pcir->date.year = filesr[r]->date.year + 1980;
1280 pcir->time.seconds = filesr[r]->time.twosecs * 2;
1281 pcir->time.minutes = filesr[r]->time.minutes;
1282 pcir->time.hours = filesr[r]->time.hours;
1283 pcir->ladate.day = filesr[r]->ladate.day;
1284 pcir->ladate.month = filesr[r]->ladate.month;
1285 pcir->ladate.year = filesr[r]->ladate.year + 1980;
1286 pcir->latime.seconds = filesr[r]->latime.twosecs * 2;
1287 pcir->latime.minutes = filesr[r]->latime.minutes;
1288 pcir->latime.hours = filesr[r]->latime.hours;
1289 pcir->crdate.day = filesr[r]->crdate.day;
1290 pcir->crdate.month = filesr[r]->crdate.month;
1291 pcir->crdate.year = filesr[r]->crdate.year + 1980;
1292 pcir->crtime.seconds = filesr[r]->crtime.twosecs * 2;
1293 pcir->crtime.minutes = filesr[r]->crtime.minutes;
1294 pcir->crtime.hours = filesr[r]->crtime.hours;
1295 if(*cmp->dcd.mask.szMask) {
1296 if(!Filter((PMINIRECORDCORE)pcir,(PVOID)&cmp->dcd.mask)) {
1297 pcir->rc.flRecordAttr |= CRA_FILTERED;
1298 pcil->rc.flRecordAttr |= CRA_FILTERED;
1299 }
1300 }
1301 free(filesr[r]);
1302 r++;
1303 }
1304 if(!(cntr % 500))
1305 DosSleep(1L);
1306 else if(!(cntr % 50))
1307 DosSleep(0L);
1308 cntr++;
1309 pcil = (PCNRITEM)pcil->rc.preccNextRecord;
1310 pcir = (PCNRITEM)pcir->rc.preccNextRecord;
1311 }
1312 if(filesl)
1313 free(filesl);
1314 filesl = NULL;
1315 if(filesr)
1316 free(filesr);
1317 filesr = NULL;
1318 /* insert 'em */
1319 WinSendMsg(cmp->hwnd,UM_CONTAINERDIR,MPVOID,MPVOID);
1320 memset(&ri, 0, sizeof(RECORDINSERT));
1321 ri.cb = sizeof(RECORDINSERT);
1322 ri.pRecordOrder = (PRECORDCORE)CMA_END;
1323 ri.pRecordParent = (PRECORDCORE)NULL;
1324 ri.zOrder = (ULONG)CMA_TOP;
1325 ri.cRecordsInsert = high;
1326 ri.fInvalidateRecord = FALSE;
1327 if(!WinSendMsg(hwndLeft,CM_INSERTRECORD,
1328 MPFROMP(pcilFirst),MPFROMP(&ri))) {
1329 pcil = pcilFirst;
1330 while(pcil) {
1331 pcit = (PCNRITEM)pcil->rc.preccNextRecord;
1332 WinSendMsg(hwndLeft,CM_FREERECORD,
1333 MPFROMP(&pcil),MPFROMSHORT(1));
1334 pcil = pcit;
1335 }
1336 numfilesl = 0;
1337 }
1338 memset(&ri, 0, sizeof(RECORDINSERT));
1339 ri.cb = sizeof(RECORDINSERT);
1340 ri.pRecordOrder = (PRECORDCORE)CMA_END;
1341 ri.pRecordParent = (PRECORDCORE)NULL;
1342 ri.zOrder = (ULONG)CMA_TOP;
1343 ri.cRecordsInsert = high;
1344 ri.fInvalidateRecord = FALSE;
1345 if(!WinSendMsg(hwndRight,CM_INSERTRECORD,
1346 MPFROMP(pcirFirst),MPFROMP(&ri))) {
1347 WinSendMsg(hwndLeft,CM_REMOVERECORD,
1348 MPVOID,MPFROM2SHORT(0,CMA_FREE | CMA_INVALIDATE));
1349 pcir = pcirFirst;
1350 while(pcir) {
1351 pcit = (PCNRITEM)pcir->rc.preccNextRecord;
1352 WinSendMsg(hwndRight,CM_FREERECORD,
1353 MPFROMP(&pcir),MPFROMSHORT(1));
1354 pcir = pcit;
1355 }
1356 numfilesr = 0;
1357 }
1358 cmp->cmp->totalleft = numfilesl;
1359 cmp->cmp->totalright = numfilesr;
1360 }
1361 Deselect(hwndLeft);
1362 Deselect(hwndRight);
1363 if(!PostMsg(cmp->hwnd,UM_CONTAINER_FILLED,MPVOID,MPVOID))
1364 WinSendMsg(cmp->hwnd,UM_CONTAINER_FILLED,MPVOID,MPVOID);
1365 notified = TRUE;
1366 if(filesl)
1367 FreeList((CHAR **)filesl);
1368 if(filesr)
1369 FreeList((CHAR **)filesr);
1370 WinDestroyMsgQueue(hmq);
1371 }
1372 else
1373 DosBeep(250,100);
1374 WinTerminate(hab);
1375 }
1376 else
1377 DosBeep(50,100);
1378 if(!notified)
1379 PostMsg(cmp->hwnd,UM_CONTAINER_FILLED,MPVOID,MPVOID);
1380 free(cmp);
1381 DosPostEventSem(CompactSem);
1382}
1383
1384#define hwndLeft (WinWindowFromID(hwnd,COMP_LEFTDIR))
1385#define hwndRight (WinWindowFromID(hwnd,COMP_RIGHTDIR))
1386
1387
1388MRESULT EXPENTRY CompareDlgProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2) {
1389
1390 COMPARE *cmp;
1391 static HPOINTER hptr = (HPOINTER)0;
1392
1393 switch(msg) {
1394 case WM_INITDLG:
1395 cmp = (COMPARE *)mp2;
1396 if(cmp) {
1397 if(!hptr)
1398 hptr = WinLoadPointer(HWND_DESKTOP,FM3ModHandle,COMPARE_ICON);
1399 WinDefDlgProc(hwnd,WM_SETICON,MPFROMLONG(hptr),MPVOID);
1400 cmp->hwnd = hwnd;
1401 WinSetWindowPtr(hwnd,0,(PVOID)cmp);
1402 SetCnrCols(hwndLeft,TRUE);
1403 SetCnrCols(hwndRight,TRUE);
1404 WinSendMsg(hwnd,UM_SETUP,MPVOID,MPVOID);
1405 WinSendMsg(hwnd,UM_SETDIR,MPVOID,MPVOID);
1406 PostMsg(hwnd,UM_STRETCH,MPVOID,MPVOID);
1407 {
1408 USHORT ids[] = {COMP_LEFTDIR,COMP_RIGHTDIR,COMP_TOTALLEFT,
1409 COMP_TOTALRIGHT,COMP_SELLEFT,COMP_SELRIGHT,
1410 0};
1411 register INT x;
1412
1413 for(x = 0;ids[x];x++)
1414 SetPresParams(WinWindowFromID(hwnd,ids[x]),
1415 &RGBGREY,
1416 &RGBBLACK,
1417 &RGBBLACK,
1418 GetPString(IDS_8HELVTEXT));
1419 }
1420 }
1421 else
1422 WinDismissDlg(hwnd,0);
1423 break;
1424
1425 case UM_STRETCH:
1426 {
1427 SWP swp,swpC;
1428 LONG titl,szbx,szby,sz;
1429 HWND hwndActive;
1430
1431 WinQueryWindowPos(hwnd,&swp);
1432 if(!(swp.fl & (SWP_HIDE | SWP_MINIMIZE))) {
1433 hwndActive = WinQueryFocus(HWND_DESKTOP);
1434 szbx = SysVal(SV_CXSIZEBORDER);
1435 szby = SysVal(SV_CYSIZEBORDER);
1436 titl = SysVal(SV_CYTITLEBAR);
1437 titl += 26;
1438 swp.cx -= (szbx * 2);
1439 sz = (swp.cx / 8);
1440 WinQueryWindowPos(WinWindowFromID(hwnd,COMP_LEFTDIR),&swpC);
1441 WinSetWindowPos(WinWindowFromID(hwnd,COMP_LEFTDIR),HWND_TOP,
1442 szbx + 6,
1443 swpC.y,
1444 (swp.cx / 2) - (szbx + 6),
1445 ((swp.cy - swpC.y) - titl) - szby,
1446 SWP_MOVE | SWP_SIZE);
1447 WinSetWindowPos(WinWindowFromID(hwnd,COMP_RIGHTDIR),HWND_TOP,
1448 (swp.cx / 2) + (szbx + 6),
1449 swpC.y,
1450 (swp.cx / 2) - (szbx + 6),
1451 ((swp.cy - swpC.y) - titl) - szby,
1452 SWP_MOVE | SWP_SIZE);
1453 WinSetWindowPos(WinWindowFromID(hwnd,COMP_TOTALLEFTHDR),HWND_TOP,
1454 szbx + 6,
1455 ((swp.cy - titl) - szby) + 4,
1456 sz - (szbx + 6),
1457 20,
1458 SWP_MOVE | SWP_SIZE);
1459 WinSetWindowPos(WinWindowFromID(hwnd,COMP_TOTALLEFT),HWND_TOP,
1460 sz + (szbx + 6),
1461 ((swp.cy - titl) - szby) + 4,
1462 sz - (szbx + 6),
1463 20,
1464 SWP_MOVE | SWP_SIZE);
1465 WinSetWindowPos(WinWindowFromID(hwnd,COMP_SELLEFTHDR),HWND_TOP,
1466 (sz * 2) + (szbx + 6),
1467 ((swp.cy - titl) - szby) + 4,
1468 sz - (szbx + 6),
1469 20,
1470 SWP_MOVE | SWP_SIZE);
1471 WinSetWindowPos(WinWindowFromID(hwnd,COMP_SELLEFT),HWND_TOP,
1472 (sz * 3) + (szbx + 6),
1473 ((swp.cy - titl) - szby) + 4,
1474 sz - (szbx + 6),
1475 20,
1476 SWP_MOVE | SWP_SIZE);
1477 WinSetWindowPos(WinWindowFromID(hwnd,COMP_TOTALRIGHTHDR),HWND_TOP,
1478 (sz * 4) + (szbx + 6),
1479 ((swp.cy - titl) - szby) + 4,
1480 sz - (szbx + 6),
1481 20,
1482 SWP_MOVE | SWP_SIZE);
1483 WinSetWindowPos(WinWindowFromID(hwnd,COMP_TOTALRIGHT),HWND_TOP,
1484 (sz * 5) + (szbx + 6),
1485 ((swp.cy - titl) - szby) + 4,
1486 sz - (szbx + 6),
1487 20,
1488 SWP_MOVE | SWP_SIZE);
1489 WinSetWindowPos(WinWindowFromID(hwnd,COMP_SELRIGHTHDR),HWND_TOP,
1490 (sz * 6) + (szbx + 6),
1491 ((swp.cy - titl) - szby) + 4,
1492 sz - (szbx + 6),
1493 20,
1494 SWP_MOVE | SWP_SIZE);
1495 WinSetWindowPos(WinWindowFromID(hwnd,COMP_SELRIGHT),HWND_TOP,
1496 (sz * 7) + (szbx + 6),
1497 ((swp.cy - titl) - szby) + 4,
1498 sz - (szbx + 6),
1499 20,
1500 SWP_MOVE | SWP_SIZE);
1501 PaintRecessedWindow(WinWindowFromID(hwnd,COMP_TOTALLEFT),
1502 (HPS)0,FALSE,FALSE);
1503 PaintRecessedWindow(WinWindowFromID(hwnd,COMP_SELLEFT),
1504 (HPS)0,FALSE,FALSE);
1505 PaintRecessedWindow(WinWindowFromID(hwnd,COMP_TOTALRIGHT),
1506 (HPS)0,FALSE,FALSE);
1507 PaintRecessedWindow(WinWindowFromID(hwnd,COMP_SELRIGHT),
1508 (HPS)0,FALSE,FALSE);
1509 PaintRecessedWindow(hwndLeft,(HPS)0,
1510 (hwndActive == hwndLeft),
1511 TRUE);
1512 PaintRecessedWindow(hwndRight,(HPS)0,
1513 (hwndActive == hwndRight),
1514 TRUE);
1515 }
1516 }
1517 return 0;
1518
1519 case WM_ADJUSTWINDOWPOS:
1520 PostMsg(hwnd,UM_STRETCH,MPVOID,MPVOID);
1521 break;
1522
1523 case UM_SETUP:
1524 {
1525 CNRINFO cnri;
1526 BOOL tempsubj;
1527
1528 cmp = INSTDATA(hwnd);
1529 if(cmp) {
1530 cmp->dcd.size = sizeof(DIRCNRDATA);
1531 cmp->dcd.type = DIR_FRAME;
1532 cmp->dcd.hwndFrame = hwnd;
1533 cmp->dcd.hwndClient = hwnd;
1534 cmp->dcd.mask.attrFile = (FILE_DIRECTORY | FILE_ARCHIVED |
1535 FILE_READONLY | FILE_SYSTEM |
1536 FILE_HIDDEN);
1537 LoadDetailsSwitches("DirCmp",&cmp->dcd);
1538 cmp->dcd.detailslongname = FALSE;
1539 cmp->dcd.detailsicon = FALSE; /* TRUE; */
1540 }
1541 memset(&cnri,0,sizeof(CNRINFO));
1542 cnri.cb = sizeof(CNRINFO);
1543 WinSendDlgItemMsg(hwnd,COMP_LEFTDIR,CM_QUERYCNRINFO,
1544 MPFROMP(&cnri),MPFROMLONG(sizeof(CNRINFO)));
1545 cnri.flWindowAttr |= (CA_OWNERDRAW | CV_MINI);
1546 cnri.xVertSplitbar = DIR_SPLITBAR_OFFSET - 68;
1547 WinSendDlgItemMsg(hwnd,COMP_LEFTDIR,CM_SETCNRINFO,MPFROMP(&cnri),
1548 MPFROMLONG(CMA_FLWINDOWATTR | CMA_XVERTSPLITBAR));
1549 memset(&cnri,0,sizeof(CNRINFO));
1550 cnri.cb = sizeof(CNRINFO);
1551 WinSendDlgItemMsg(hwnd,COMP_RIGHTDIR,CM_QUERYCNRINFO,
1552 MPFROMP(&cnri),MPFROMLONG(sizeof(CNRINFO)));
1553 cnri.flWindowAttr |= (CA_OWNERDRAW | CV_MINI);
1554 cnri.xVertSplitbar = DIR_SPLITBAR_OFFSET - 54;
1555 WinSendDlgItemMsg(hwnd,COMP_RIGHTDIR,CM_SETCNRINFO,MPFROMP(&cnri),
1556 MPFROMLONG(CMA_FLWINDOWATTR | CMA_XVERTSPLITBAR));
1557 AdjustCnrColRO(hwndLeft,GetPString(IDS_FILENAMECOLTEXT),
1558 TRUE,FALSE);
1559 AdjustCnrColRO(hwndLeft,GetPString(IDS_LONGNAMECOLTEXT),
1560 TRUE,FALSE);
1561 AdjustCnrColRO(hwndRight,GetPString(IDS_FILENAMECOLTEXT),
1562 TRUE,FALSE);
1563 AdjustCnrColRO(hwndRight,GetPString(IDS_LONGNAMECOLTEXT),
1564 TRUE,FALSE);
1565 AdjustCnrColsForPref(hwndLeft,
1566 cmp->leftdir,&cmp->dcd,TRUE);
1567 tempsubj = cmp->dcd.detailssubject;
1568 cmp->dcd.detailssubject = FALSE;
1569 AdjustCnrColsForPref(hwndRight,
1570 cmp->rightdir,&cmp->dcd,TRUE);
1571 if(*cmp->rightlist) {
1572 AdjustCnrColVis(hwndRight,GetPString(IDS_LADATECOLTEXT),FALSE,FALSE);
1573 AdjustCnrColVis(hwndRight,GetPString(IDS_LATIMECOLTEXT),FALSE,FALSE);
1574 AdjustCnrColVis(hwndRight,GetPString(IDS_CRDATECOLTEXT),FALSE,FALSE);
1575 AdjustCnrColVis(hwndRight,GetPString(IDS_CRTIMECOLTEXT),FALSE,FALSE);
1576 }
1577 cmp->dcd.detailssubject = tempsubj;
1578 }
1579 return 0;
1580
1581 case WM_DRAWITEM:
1582 if(mp2) {
1583
1584 POWNERITEM pown = (POWNERITEM)mp2;
1585 PCNRDRAWITEMINFO pcown;
1586 PCNRITEM pci;
1587
1588 pcown = (PCNRDRAWITEMINFO)pown->hItem;
1589 if(pcown) {
1590 pci = (PCNRITEM)pcown->pRecord;
1591 if(pci && (INT)pci != -1 && !*pci->szFileName)
1592 return MRFROMLONG(TRUE);
1593 }
1594 }
1595 return 0;
1596
1597 case UM_CONTAINERHWND:
1598 WinSetDlgItemText(hwnd,COMP_NOTE,
1599 GetPString(IDS_COMPHOLDBLDLISTTEXT));
1600 return 0;
1601
1602 case UM_CONTAINERDIR:
1603 WinSetDlgItemText(hwnd,COMP_NOTE,
1604 GetPString(IDS_COMPHOLDFILLCNRTEXT));
1605 return 0;
1606
1607 case UM_CONTAINER_FILLED:
1608 cmp = INSTDATA(hwnd);
1609 if(cmp) {
1610 cmp->filling = FALSE;
1611 WinEnableWindow(hwndLeft,TRUE);
1612 WinEnableWindow(hwndRight,TRUE);
1613 WinEnableWindowUpdate(hwndLeft,TRUE);
1614 WinEnableWindowUpdate(hwndRight,TRUE);
1615// if(!mp1) {
1616 {
1617 CHAR s[81];
1618
1619 sprintf(s," %d",cmp->totalleft);
1620 WinSetDlgItemText(hwnd,COMP_TOTALLEFT,s);
1621 sprintf(s," %d",cmp->totalright);
1622 WinSetDlgItemText(hwnd,COMP_TOTALRIGHT,s);
1623 sprintf(s," %d",cmp->selleft);
1624 WinSetDlgItemText(hwnd,COMP_SELLEFT,s);
1625 sprintf(s," %d",cmp->selright);
1626 WinSetDlgItemText(hwnd,COMP_SELRIGHT,s);
1627 }
1628 WinEnableWindow(WinWindowFromID(hwnd,DID_OK),TRUE);
1629 WinEnableWindow(WinWindowFromID(hwnd,DID_CANCEL),TRUE);
1630 WinEnableWindow(WinWindowFromID(hwnd,COMP_COLLECT),TRUE);
1631 WinEnableWindow(WinWindowFromID(hwnd,IDM_SELECTBOTH),TRUE);
1632 WinEnableWindow(WinWindowFromID(hwnd,IDM_SELECTONE),TRUE);
1633 WinEnableWindow(WinWindowFromID(hwnd,IDM_SELECTNEWER),TRUE);
1634 WinEnableWindow(WinWindowFromID(hwnd,IDM_SELECTOLDER),TRUE);
1635 WinEnableWindow(WinWindowFromID(hwnd,IDM_SELECTBIGGER),TRUE);
1636 WinEnableWindow(WinWindowFromID(hwnd,IDM_SELECTSMALLER),TRUE);
1637 WinEnableWindow(WinWindowFromID(hwnd,IDM_DESELECTBOTH),TRUE);
1638 WinEnableWindow(WinWindowFromID(hwnd,IDM_DESELECTONE),TRUE);
1639 WinEnableWindow(WinWindowFromID(hwnd,IDM_DESELECTNEWER),TRUE);
1640 WinEnableWindow(WinWindowFromID(hwnd,IDM_DESELECTOLDER),TRUE);
1641 WinEnableWindow(WinWindowFromID(hwnd,IDM_DESELECTBIGGER),TRUE);
1642 WinEnableWindow(WinWindowFromID(hwnd,IDM_DESELECTSMALLER),TRUE);
1643 WinEnableWindow(WinWindowFromID(hwnd,IDM_DESELECTALL),TRUE);
1644 WinEnableWindow(WinWindowFromID(hwnd,IDM_SELECTIDENTICAL),TRUE);
1645 WinEnableWindow(WinWindowFromID(hwnd,IDM_SELECTSAME),TRUE);
1646 WinEnableWindow(WinWindowFromID(hwnd,IDM_INVERT),TRUE);
1647 WinEnableWindow(WinWindowFromID(hwnd,COMP_SETDIRS),TRUE);
1648 WinEnableWindow(WinWindowFromID(hwnd,COMP_DELETELEFT),TRUE);
1649 WinEnableWindow(WinWindowFromID(hwnd,COMP_FILTER),TRUE);
1650 if(!*cmp->rightlist) {
1651 WinEnableWindow(WinWindowFromID(hwnd,COMP_COPYLEFT),TRUE);
1652 WinEnableWindow(WinWindowFromID(hwnd,COMP_MOVELEFT),TRUE);
1653 WinEnableWindow(WinWindowFromID(hwnd,COMP_DELETERIGHT),TRUE);
1654 WinEnableWindow(WinWindowFromID(hwnd,COMP_COPYRIGHT),TRUE);
1655 WinEnableWindow(WinWindowFromID(hwnd,COMP_MOVERIGHT),TRUE);
1656 }
1657 WinEnableWindow(WinWindowFromID(hwnd,COMP_INCLUDESUBDIRS),TRUE);
1658 if(*cmp->dcd.mask.szMask)
1659 WinSetDlgItemText(hwnd,COMP_NOTE,
1660 GetPString(IDS_COMPREADYFILTEREDTEXT));
1661 else
1662 WinSetDlgItemText(hwnd,COMP_NOTE,
1663 GetPString(IDS_COMPREADYTEXT));
1664 }
1665 else {
1666 DosBeep(50,100);
1667 WinDismissDlg(hwnd,0);
1668 }
1669 break;
1670
1671 case WM_INITMENU:
1672 cmp = INSTDATA(hwnd);
1673 if(cmp) {
1674 switch(SHORT1FROMMP(mp1)) {
1675 case IDM_COMMANDSMENU:
1676 SetupCommandMenu(cmp->dcd.hwndLastMenu,hwnd);
1677 break;
1678 }
1679 }
1680 break;
1681
1682 case WM_MENUEND:
1683 cmp = INSTDATA(hwnd);
1684 if(cmp) {
1685 if((HWND)mp2 == cmp->dcd.hwndLastMenu) {
1686 MarkAll(hwndLeft,TRUE,FALSE,TRUE);
1687 MarkAll(hwndRight,TRUE,FALSE,TRUE);
1688 WinDestroyWindow(cmp->dcd.hwndLastMenu);
1689 cmp->dcd.hwndLastMenu = (HWND)0;
1690 }
1691 }
1692 break;
1693
1694 case WM_CONTROL:
1695 switch(SHORT1FROMMP(mp1)) {
1696 case COMP_INCLUDESUBDIRS:
1697 switch(SHORT2FROMMP(mp1)) {
1698 case BN_CLICKED:
1699 PostMsg(hwnd,UM_SETDIR,MPVOID,MPVOID);
1700 break;
1701 }
1702 break;
1703
1704 case COMP_LEFTDIR:
1705 case COMP_RIGHTDIR:
1706 switch(SHORT2FROMMP(mp1)) {
1707 case CN_KILLFOCUS:
1708 PaintRecessedWindow(WinWindowFromID(hwnd,SHORT1FROMMP(mp1)),
1709 (HPS)0,FALSE,TRUE);
1710 break;
1711
1712 case CN_SETFOCUS:
1713 PaintRecessedWindow(WinWindowFromID(hwnd,SHORT1FROMMP(mp1)),
1714 (HPS)0,TRUE,TRUE);
1715 break;
1716
1717 case CN_ENTER:
1718 if(mp2) {
1719
1720 PCNRITEM pci = (PCNRITEM)((PNOTIFYRECORDENTER)mp2)->pRecord;
1721 HWND hwndCnr = WinWindowFromID(hwnd,SHORT1FROMMP(mp1));
1722
1723 SetShiftState();
1724 if(pci) {
1725 if((pci->rc.flRecordAttr & CRA_INUSE) || !*pci->szFileName)
1726 break;
1727 WinSendMsg(hwndCnr,CM_SETRECORDEMPHASIS,MPFROMP(pci),
1728 MPFROM2SHORT(TRUE,CRA_INUSE));
1729 if(pci->attrFile & FILE_DIRECTORY) {
1730 if((shiftstate & (KC_CTRL | KC_SHIFT)) ==
1731 (KC_CTRL | KC_SHIFT))
1732 OpenObject(pci->szFileName,Settings,hwnd);
1733 else
1734 OpenObject(pci->szFileName,Default,hwnd);
1735 }
1736 else
1737 DefaultViewKeys(hwnd,hwnd,HWND_DESKTOP,NULL,
1738 pci->szFileName);
1739 WinSendMsg(hwndCnr,CM_SETRECORDEMPHASIS,
1740 MPFROMP(pci),
1741 MPFROM2SHORT(FALSE,CRA_INUSE |
1742 ((fUnHilite) ? CRA_SELECTED : 0)));
1743 }
1744 }
1745 break;
1746
1747 case CN_CONTEXTMENU:
1748 cmp = INSTDATA(hwnd);
1749 if(cmp) {
1750
1751 PCNRITEM pci = (PCNRITEM)mp2;
1752 USHORT id = COMP_CNRMENU;
1753
1754 if(cmp->dcd.hwndLastMenu)
1755 WinDestroyWindow(cmp->dcd.hwndLastMenu);
1756 cmp->dcd.hwndLastMenu = (HWND)0;
1757 cmp->hwndCalling = WinWindowFromID(hwnd,SHORT1FROMMP(mp1));
1758 if(pci) {
1759 if(!*pci->szFileName || *cmp->rightlist)
1760 break;
1761 id = COMP_MENU;
1762 WinSendMsg(cmp->hwndCalling,CM_SETRECORDEMPHASIS,
1763 MPFROMP(pci),MPFROM2SHORT(TRUE,CRA_CURSORED));
1764 }
1765 cmp->dcd.hwndLastMenu = WinLoadMenu(HWND_DESKTOP,FM3ModHandle,
1766 id);
1767 if(cmp->dcd.hwndLastMenu) {
1768 if(id == COMP_CNRMENU) {
1769 if(SHORT1FROMMP(mp1) == COMP_RIGHTDIR)
1770 WinSendMsg(cmp->dcd.hwndLastMenu,MM_DELETEITEM,
1771 MPFROM2SHORT(IDM_SHOWSUBJECT,FALSE),MPVOID);
1772 SetDetailsSwitches(cmp->dcd.hwndLastMenu,&cmp->dcd);
1773 if(SHORT1FROMMP(mp1) == COMP_LEFTDIR)
1774 WinSendMsg(cmp->dcd.hwndLastMenu,MM_DELETEITEM,
1775 MPFROM2SHORT(IDM_LOADLISTFILE,0),MPVOID);
1776 else if(*cmp->rightlist)
1777 WinSendMsg(cmp->dcd.hwndLastMenu,MM_DELETEITEM,
1778 MPFROM2SHORT(IDM_SAVELISTFILE,0),MPVOID);
1779 }
1780 PopupMenu(hwnd,hwnd,cmp->dcd.hwndLastMenu);
1781 }
1782 }
1783 break;
1784
1785 case CN_INITDRAG:
1786 cmp = INSTDATA(hwnd);
1787 if(*cmp->rightlist && SHORT1FROMMP(mp1) == COMP_RIGHTDIR)
1788 break;
1789 DoFileDrag(WinWindowFromID(hwnd,SHORT1FROMMP(mp1)),
1790 (HWND)0,
1791 mp2,
1792 NULL,
1793 NULL,
1794 TRUE);
1795 break;
1796
1797 case CN_BEGINEDIT:
1798 {
1799 PFIELDINFO pfi = ((PCNREDITDATA)mp2)->pFieldInfo;
1800 PCNRITEM pci = (PCNRITEM)((PCNREDITDATA)mp2)->pRecord;
1801
1802 if(pfi || pci) {
1803 PostMsg(hwnd,
1804 CM_CLOSEEDIT,
1805 MPVOID,
1806 MPVOID);
1807 DosBeep(250,100);
1808 }
1809 }
1810 break;
1811
1812 case CN_REALLOCPSZ:
1813 cmp = INSTDATA(hwnd);
1814 if(cmp) {
1815
1816 PFIELDINFO pfi = ((PCNREDITDATA)mp2)->pFieldInfo;
1817 PCNRITEM pci = (PCNRITEM)((PCNREDITDATA)mp2)->pRecord;
1818 HWND hwndMLE;
1819 CHAR szData[CCHMAXPATH],testname[CCHMAXPATH],*p;
1820
1821 if(!pci && !pfi) {
1822 hwndMLE = WinWindowFromID(WinWindowFromID(hwnd,
1823 SHORT1FROMMP(mp1)),CID_MLE);
1824 WinQueryWindowText(hwndMLE,
1825 sizeof(szData),
1826 szData);
1827 p = strchr(szData,'\n');
1828 if(p)
1829 *p = 0;
1830 p = strchr(szData,'\r');
1831 if(p)
1832 *p = 0;
1833 lstrip(rstrip(szData));
1834 if(*szData) {
1835 if(!DosQueryPathInfo(szData,
1836 FIL_QUERYFULLNAME,
1837 testname,
1838 sizeof(testname))) {
1839 if(!SetDir(cmp->hwndParent,
1840 hwnd,
1841 testname,
1842 1)) {
1843 if(SHORT1FROMMP(mp1) == COMP_LEFTDIR)
1844 strcpy(cmp->leftdir,testname);
1845 else {
1846 strcpy(cmp->rightdir,testname);
1847 *cmp->rightlist = 0;
1848 }
1849 PostMsg(hwnd,
1850 UM_SETUP,
1851 MPVOID,
1852 MPVOID);
1853 PostMsg(hwnd,
1854 UM_SETDIR,
1855 MPVOID,
1856 MPVOID);
1857 }
1858 }
1859 }
1860 }
1861 }
1862 break;
1863
1864 case CN_EMPHASIS:
1865 {
1866 PNOTIFYRECORDEMPHASIS pre = mp2;
1867 PCNRITEM pci;
1868
1869 if(pre->fEmphasisMask & CRA_SELECTED) {
1870 pci = (PCNRITEM)pre->pRecord;
1871 if(pci) {
1872 if(!*pci->szFileName) {
1873 if(pci->rc.flRecordAttr & CRA_SELECTED)
1874 WinSendDlgItemMsg(hwnd,SHORT1FROMMP(mp1),
1875 CM_SETRECORDEMPHASIS,
1876 MPFROMP(pci),
1877 MPFROM2SHORT(FALSE,CRA_SELECTED));
1878 }
1879 else {
1880
1881 CHAR s[81];
1882
1883 cmp = INSTDATA(hwnd);
1884 if(pci->rc.flRecordAttr & CRA_SELECTED) {
1885 if(SHORT1FROMMP(mp1) == COMP_LEFTDIR)
1886 cmp->selleft++;
1887 else
1888 cmp->selright++;
1889 }
1890 else {
1891 if(SHORT1FROMMP(mp1) == COMP_LEFTDIR) {
1892 if(cmp->selleft)
1893 cmp->selleft--;
1894 }
1895 else {
1896 if(cmp->selright)
1897 cmp->selright--;
1898 }
1899 }
1900 if(SHORT1FROMMP(mp1) == COMP_LEFTDIR) {
1901 if(WinIsWindowEnabled(hwndLeft) ||
1902 !(cmp->selleft % 50)) {
1903 sprintf(s," %d",cmp->selleft);
1904 WinSetDlgItemText(hwnd,COMP_SELLEFT,s);
1905 }
1906 }
1907 else {
1908 if(WinIsWindowEnabled(hwndRight) ||
1909 !(cmp->selright % 50)) {
1910 sprintf(s," %d",cmp->selright);
1911 WinSetDlgItemText(hwnd,COMP_SELRIGHT,s);
1912 }
1913 }
1914 }
1915 }
1916 }
1917 }
1918 break;
1919
1920 case CN_SCROLL:
1921 cmp = INSTDATA(hwnd);
1922 if(!cmp->forcescroll) {
1923
1924 PNOTIFYSCROLL pns = mp2;
1925
1926 if(pns->fScroll & CMA_VERTICAL) {
1927 cmp->forcescroll = TRUE;
1928 WinSendDlgItemMsg(hwnd,(SHORT1FROMMP(mp1) == COMP_LEFTDIR) ?
1929 COMP_RIGHTDIR : COMP_LEFTDIR,
1930 CM_SCROLLWINDOW,MPFROMSHORT(CMA_VERTICAL),
1931 MPFROMLONG(pns->lScrollInc));
1932 cmp->forcescroll = FALSE;
1933 }
1934 }
1935 break;
1936 }
1937 break;
1938 }
1939 return 0;
1940
1941 case UM_SETDIR:
1942 cmp = INSTDATA(hwnd);
1943 if(cmp) {
1944
1945 COMPARE *forthread;
1946 CNRINFO cnri;
1947
1948 cmp->includesubdirs = WinQueryButtonCheckstate(hwnd,
1949 COMP_INCLUDESUBDIRS);
1950 memset(&cnri,0,sizeof(CNRINFO));
1951 cnri.cb = sizeof(CNRINFO);
1952 cnri.pszCnrTitle = cmp->leftdir;
1953 cnri.flWindowAttr = CV_DETAIL | CV_MINI |
1954 CA_CONTAINERTITLE | CA_TITLESEPARATOR |
1955 CA_DETAILSVIEWTITLES | CA_OWNERDRAW;
1956 WinSendDlgItemMsg(hwnd,COMP_LEFTDIR,CM_SETCNRINFO,MPFROMP(&cnri),
1957 MPFROMLONG(CMA_CNRTITLE | CMA_FLWINDOWATTR));
1958 cnri.pszCnrTitle = cmp->rightdir;
1959 WinSendDlgItemMsg(hwnd,COMP_RIGHTDIR,CM_SETCNRINFO,MPFROMP(&cnri),
1960 MPFROMLONG(CMA_CNRTITLE | CMA_FLWINDOWATTR));
1961 cmp->filling = TRUE;
1962 forthread = malloc(sizeof(COMPARE));
1963 if(forthread) {
1964 *forthread = *cmp;
1965 forthread->cmp = cmp;
1966 if(_beginthread(FillCnrs,NULL,122880,(PVOID)forthread) != -1) {
1967 WinEnableWindowUpdate(hwndLeft,FALSE);
1968 WinEnableWindowUpdate(hwndRight,FALSE);
1969 cmp->selleft = cmp->selright = 0;
1970 WinSetDlgItemText(hwnd,COMP_SELLEFT,"0");
1971 WinSetDlgItemText(hwnd,COMP_SELRIGHT,"0");
1972 WinSetDlgItemText(hwnd,COMP_TOTALLEFT,"0");
1973 WinSetDlgItemText(hwnd,COMP_TOTALRIGHT,"0");
1974 WinSetDlgItemText(hwnd,COMP_NOTE,
1975 GetPString(IDS_COMPHOLDREADDISKTEXT));
1976 WinEnableWindow(hwndRight,FALSE);
1977 WinEnableWindow(hwndLeft,FALSE);
1978 WinEnableWindow(WinWindowFromID(hwnd,DID_OK),FALSE);
1979 WinEnableWindow(WinWindowFromID(hwnd,DID_CANCEL),FALSE);
1980 WinEnableWindow(WinWindowFromID(hwnd,COMP_COLLECT),FALSE);
1981 WinEnableWindow(WinWindowFromID(hwnd,IDM_SELECTBOTH),FALSE);
1982 WinEnableWindow(WinWindowFromID(hwnd,IDM_SELECTONE),FALSE);
1983 WinEnableWindow(WinWindowFromID(hwnd,IDM_SELECTNEWER),FALSE);
1984 WinEnableWindow(WinWindowFromID(hwnd,IDM_SELECTOLDER),FALSE);
1985 WinEnableWindow(WinWindowFromID(hwnd,IDM_SELECTBIGGER),FALSE);
1986 WinEnableWindow(WinWindowFromID(hwnd,IDM_SELECTSMALLER),FALSE);
1987 WinEnableWindow(WinWindowFromID(hwnd,IDM_DESELECTBOTH),FALSE);
1988 WinEnableWindow(WinWindowFromID(hwnd,IDM_DESELECTONE),FALSE);
1989 WinEnableWindow(WinWindowFromID(hwnd,IDM_DESELECTNEWER),FALSE);
1990 WinEnableWindow(WinWindowFromID(hwnd,IDM_DESELECTOLDER),FALSE);
1991 WinEnableWindow(WinWindowFromID(hwnd,IDM_DESELECTBIGGER),FALSE);
1992 WinEnableWindow(WinWindowFromID(hwnd,IDM_DESELECTSMALLER),FALSE);
1993 WinEnableWindow(WinWindowFromID(hwnd,IDM_DESELECTALL),FALSE);
1994 WinEnableWindow(WinWindowFromID(hwnd,COMP_INCLUDESUBDIRS),FALSE);
1995 WinEnableWindow(WinWindowFromID(hwnd,COMP_SETDIRS),FALSE);
1996 WinEnableWindow(WinWindowFromID(hwnd,COMP_DELETELEFT),FALSE);
1997 WinEnableWindow(WinWindowFromID(hwnd,COMP_DELETERIGHT),FALSE);
1998 WinEnableWindow(WinWindowFromID(hwnd,COMP_COPYLEFT),FALSE);
1999 WinEnableWindow(WinWindowFromID(hwnd,COMP_MOVELEFT),FALSE);
2000 WinEnableWindow(WinWindowFromID(hwnd,COMP_COPYRIGHT),FALSE);
2001 WinEnableWindow(WinWindowFromID(hwnd,COMP_MOVERIGHT),FALSE);
2002 WinEnableWindow(WinWindowFromID(hwnd,IDM_SELECTIDENTICAL),FALSE);
2003 WinEnableWindow(WinWindowFromID(hwnd,IDM_SELECTSAME),FALSE);
2004 WinEnableWindow(WinWindowFromID(hwnd,IDM_INVERT),FALSE);
2005 WinEnableWindow(WinWindowFromID(hwnd,COMP_FILTER),FALSE);
2006 }
2007 else {
2008 DosBeep(250,100);
2009 WinDismissDlg(hwnd,0);
2010 free(forthread);
2011 }
2012 }
2013 else {
2014 DosBeep(250,100);
2015 WinDismissDlg(hwnd,0);
2016 }
2017 }
2018 return 0;
2019
2020 case UM_FILTER:
2021 cmp = INSTDATA(hwnd);
2022 if(cmp) {
2023 if(mp1) {
2024 DosEnterCritSec();
2025 SetMask((CHAR *)mp1,&cmp->dcd.mask);
2026 DosExitCritSec();
2027 }
2028 cmp->dcd.suspendview = 1;
2029 WinSendMsg(hwndLeft,CM_FILTER,MPFROMP(Filter),MPFROMP(&cmp->dcd.mask));
2030 WinSendMsg(hwndRight,CM_FILTER,MPFROMP(Filter),MPFROMP(&cmp->dcd.mask));
2031 cmp->dcd.suspendview = 0;
2032 if(*cmp->dcd.mask.szMask)
2033 WinSetDlgItemText(hwnd,COMP_NOTE,
2034 GetPString(IDS_COMPREADYFILTEREDTEXT));
2035 else
2036 WinSetDlgItemText(hwnd,COMP_NOTE,
2037 GetPString(IDS_COMPREADYTEXT));
2038 }
2039 return 0;
2040
2041 case WM_COMMAND:
2042 switch(SHORT1FROMMP(mp1)) {
2043 case IDM_COMPARE:
2044 cmp = INSTDATA(hwnd);
2045 if(cmp) {
2046
2047 PCNRITEM pci;
2048 CHAR ofile[CCHMAXPATH];
2049
2050 pci = (PCNRITEM)WinSendMsg(cmp->hwndCalling,
2051 CM_QUERYRECORDEMPHASIS,
2052 MPFROMLONG(CMA_FIRST),
2053 MPFROMSHORT(CRA_CURSORED));
2054 if(pci) {
2055 if(cmp->hwndCalling == hwndLeft)
2056 strcpy(ofile,cmp->rightdir);
2057 else
2058 strcpy(ofile,cmp->leftdir);
2059 if(ofile[strlen(ofile) - 1] != '\\')
2060 strcat(ofile,"\\");
2061 strcat(ofile,pci->pszFileName);
2062 if(*compare) {
2063
2064 CHAR *fakelist[3];
2065
2066 fakelist[0] = pci->szFileName;
2067 fakelist[1] = ofile;
2068 fakelist[2] = NULL;
2069 ExecOnList(hwnd,compare,
2070 WINDOWED | SEPARATEKEEP,
2071 NULL,fakelist,NULL);
2072 }
2073 else {
2074
2075 FCOMPARE fc;
2076
2077 memset(&fc,0,sizeof(fc));
2078 fc.size = sizeof(fc);
2079 fc.hwndParent = hwnd;
2080 strcpy(fc.file1,pci->szFileName);
2081 strcpy(fc.file2,ofile);
2082 WinDlgBox(HWND_DESKTOP,hwnd,
2083 CFileDlgProc,FM3ModHandle,
2084 FCMP_FRAME,(PVOID)&fc);
2085 }
2086 }
2087 }
2088 break;
2089
2090 case COMP_FILTER:
2091 case IDM_FILTER:
2092 cmp = INSTDATA(hwnd);
2093 if(cmp) {
2094
2095 BOOL empty = FALSE;
2096 PCNRITEM pci;
2097 CHAR *p;
2098 BOOL temp;
2099
2100 if(!*cmp->dcd.mask.szMask) {
2101 empty = TRUE;
2102 temp = fSelectedAlways;
2103 fSelectedAlways = TRUE;
2104 pci = (PCNRITEM)CurrentRecord(hwnd);
2105 fSelectedAlways = temp;
2106 if(pci && !(pci->attrFile & FILE_DIRECTORY)) {
2107 p = strrchr(pci->szFileName,'\\');
2108 if(p) {
2109 p++;
2110 strcpy(cmp->dcd.mask.szMask,p);
2111 }
2112 }
2113 }
2114 cmp->dcd.mask.fNoAttribs = TRUE;
2115 cmp->dcd.mask.attrFile = ALLATTRS;
2116 cmp->dcd.mask.antiattr = 0;
2117 if(WinDlgBox(HWND_DESKTOP,hwnd,PickMaskDlgProc,
2118 FM3ModHandle,MSK_FRAME,MPFROMP(&cmp->dcd.mask))) {
2119 cmp->dcd.mask.attrFile = ALLATTRS;
2120 cmp->dcd.mask.antiattr = 0;
2121 WinSendMsg(hwnd,UM_FILTER,MPVOID,MPVOID);
2122 }
2123 else if(empty) {
2124 *cmp->dcd.mask.szMask = 0;
2125 cmp->dcd.mask.attrFile = ALLATTRS;
2126 cmp->dcd.mask.antiattr = 0;
2127 }
2128 }
2129 break;
2130
2131 case IDM_SHOWSUBJECT:
2132 case IDM_SHOWEAS:
2133 case IDM_SHOWSIZE:
2134 case IDM_SHOWLWDATE:
2135 case IDM_SHOWLWTIME:
2136 case IDM_SHOWLADATE:
2137 case IDM_SHOWLATIME:
2138 case IDM_SHOWCRDATE:
2139 case IDM_SHOWCRTIME:
2140 case IDM_SHOWATTR:
2141 cmp = INSTDATA(hwnd);
2142 if(cmp) {
2143
2144 DIRCNRDATA dcd1;
2145 BOOL tempsubj;
2146
2147 dcd1 = cmp->dcd;
2148 AdjustDetailsSwitches(hwndLeft,
2149 (HWND)0,SHORT1FROMMP(mp1),
2150 cmp->leftdir,"DirCmp",&cmp->dcd,
2151 TRUE);
2152 tempsubj = cmp->dcd.detailssubject;
2153 cmp->dcd = dcd1;
2154 cmp->dcd.detailssubject = FALSE;
2155 AdjustDetailsSwitches(hwndRight,
2156 cmp->dcd.hwndLastMenu,SHORT1FROMMP(mp1),
2157 cmp->rightdir,"DirCmp",&cmp->dcd,TRUE);
2158 cmp->dcd.detailssubject = tempsubj;
2159 }
2160 break;
2161
2162 case IDM_LOADLISTFILE:
2163 cmp = INSTDATA(hwnd);
2164 if(cmp) {
2165
2166 CHAR fullname[CCHMAXPATH];
2167
2168 strcpy(fullname,"*.PMD");
2169 if(insert_filename(HWND_DESKTOP,fullname,TRUE,FALSE) &&
2170 *fullname && !strchr(fullname,'*') && !strchr(fullname,'?')) {
2171 strcpy(cmp->rightlist,fullname);
2172 PostMsg(hwnd,UM_SETUP,MPVOID,MPVOID);
2173 PostMsg(hwnd,UM_SETDIR,MPVOID,MPVOID);
2174 }
2175 }
2176 break;
2177
2178 case IDM_SAVELISTFILE:
2179 cmp = INSTDATA(hwnd);
2180 if(cmp) {
2181
2182 SNAPSTUFF *sf;
2183 CHAR fullname[CCHMAXPATH];
2184
2185 strcpy(fullname,"*.PMD");
2186 if(export_filename(HWND_DESKTOP,fullname,1) && *fullname &&
2187 !strchr(fullname,'*') && !strchr(fullname,'?')) {
2188 sf = malloc(sizeof(SNAPSTUFF));
2189 if(sf) {
2190 memset(sf,0,sizeof(SNAPSTUFF));
2191 strcpy(sf->filename,fullname);
2192 if(hwndLeft == cmp->hwndCalling)
2193 strcpy(sf->dirname,cmp->leftdir);
2194 else
2195 strcpy(sf->dirname,cmp->rightdir);
2196 sf->recurse = cmp->includesubdirs;
2197 if(_beginthread(StartSnap,NULL,65536,(PVOID)sf) == -1) {
2198 free(sf);
2199 DosBeep(50,100);
2200 }
2201 }
2202 }
2203 }
2204 break;
2205
2206 case COMP_SETDIRS:
2207 cmp = INSTDATA(hwnd);
2208 if(cmp) {
2209
2210 WALK2 wa;
2211
2212 memset(&wa,0,sizeof(wa));
2213 wa.size = sizeof(wa);
2214 strcpy(wa.szCurrentPath1,cmp->leftdir);
2215 strcpy(wa.szCurrentPath2,cmp->rightdir);
2216 if(WinDlgBox(HWND_DESKTOP,hwnd,WalkTwoCmpDlgProc,
2217 FM3ModHandle,WALK2_FRAME,
2218 MPFROMP(&wa)) &&
2219 !IsFile(wa.szCurrentPath1) &&
2220 !IsFile(wa.szCurrentPath2)) {
2221 strcpy(cmp->leftdir,wa.szCurrentPath1);
2222 strcpy(cmp->rightdir,wa.szCurrentPath2);
2223 *cmp->rightlist = 0;
2224 PostMsg(hwnd,UM_SETUP,MPVOID,MPVOID);
2225 PostMsg(hwnd,UM_SETDIR,MPVOID,MPVOID);
2226 }
2227 }
2228 break;
2229
2230 case COMP_COPYLEFT:
2231 case COMP_MOVELEFT:
2232 case COMP_COPYRIGHT:
2233 case COMP_MOVERIGHT:
2234 case COMP_DELETELEFT:
2235 case COMP_DELETERIGHT:
2236 cmp = INSTDATA(hwnd);
2237 if(cmp) {
2238
2239 COMPARE *forthread;
2240
2241 cmp->filling = TRUE;
2242 forthread = malloc(sizeof(COMPARE));
2243 if(forthread) {
2244 *forthread = *cmp;
2245 forthread->cmp = cmp;
2246 forthread->action = SHORT1FROMMP(mp1);
2247 if(_beginthread(ActionCnr,NULL,122880,(PVOID)forthread) != -1) {
2248 WinEnableWindowUpdate(hwndLeft,FALSE);
2249 WinEnableWindowUpdate(hwndRight,FALSE);
2250 switch(SHORT1FROMMP(mp1)) {
2251 case COMP_DELETELEFT:
2252 case COMP_DELETERIGHT:
2253 WinSetDlgItemText(hwnd,COMP_NOTE,
2254 GetPString(IDS_COMPHOLDDELETINGTEXT));
2255 break;
2256 case COMP_MOVELEFT:
2257 case COMP_MOVERIGHT:
2258 WinSetDlgItemText(hwnd,COMP_NOTE,
2259 GetPString(IDS_COMPHOLDMOVINGTEXT));
2260 break;
2261 case COMP_COPYLEFT:
2262 case COMP_COPYRIGHT:
2263 WinSetDlgItemText(hwnd,COMP_NOTE,
2264 GetPString(IDS_COMPHOLDCOPYINGTEXT));
2265 break;
2266 default:
2267 WinSetDlgItemText(hwnd,COMP_NOTE,
2268 GetPString(IDS_COMPHOLDDUNNOTEXT));
2269 break;
2270 }
2271 WinEnableWindow(hwndRight,FALSE);
2272 WinEnableWindow(hwndLeft,FALSE);
2273 WinEnableWindow(WinWindowFromID(hwnd,DID_OK),FALSE);
2274 WinEnableWindow(WinWindowFromID(hwnd,DID_CANCEL),FALSE);
2275 WinEnableWindow(WinWindowFromID(hwnd,COMP_COLLECT),FALSE);
2276 WinEnableWindow(WinWindowFromID(hwnd,IDM_SELECTBOTH),FALSE);
2277 WinEnableWindow(WinWindowFromID(hwnd,IDM_SELECTONE),FALSE);
2278 WinEnableWindow(WinWindowFromID(hwnd,IDM_SELECTNEWER),FALSE);
2279 WinEnableWindow(WinWindowFromID(hwnd,IDM_SELECTOLDER),FALSE);
2280 WinEnableWindow(WinWindowFromID(hwnd,IDM_SELECTBIGGER),FALSE);
2281 WinEnableWindow(WinWindowFromID(hwnd,IDM_SELECTSMALLER),FALSE);
2282 WinEnableWindow(WinWindowFromID(hwnd,IDM_DESELECTBOTH),FALSE);
2283 WinEnableWindow(WinWindowFromID(hwnd,IDM_DESELECTONE),FALSE);
2284 WinEnableWindow(WinWindowFromID(hwnd,IDM_DESELECTNEWER),FALSE);
2285 WinEnableWindow(WinWindowFromID(hwnd,IDM_DESELECTOLDER),FALSE);
2286 WinEnableWindow(WinWindowFromID(hwnd,IDM_DESELECTBIGGER),FALSE);
2287 WinEnableWindow(WinWindowFromID(hwnd,IDM_DESELECTSMALLER),FALSE);
2288 WinEnableWindow(WinWindowFromID(hwnd,IDM_DESELECTALL),FALSE);
2289 WinEnableWindow(WinWindowFromID(hwnd,COMP_INCLUDESUBDIRS),FALSE);
2290 WinEnableWindow(WinWindowFromID(hwnd,COMP_SETDIRS),FALSE);
2291 WinEnableWindow(WinWindowFromID(hwnd,COMP_DELETELEFT),FALSE);
2292 WinEnableWindow(WinWindowFromID(hwnd,COMP_DELETERIGHT),FALSE);
2293 WinEnableWindow(WinWindowFromID(hwnd,COMP_COPYLEFT),FALSE);
2294 WinEnableWindow(WinWindowFromID(hwnd,COMP_MOVELEFT),FALSE);
2295 WinEnableWindow(WinWindowFromID(hwnd,COMP_COPYRIGHT),FALSE);
2296 WinEnableWindow(WinWindowFromID(hwnd,COMP_MOVERIGHT),FALSE);
2297 WinEnableWindow(WinWindowFromID(hwnd,IDM_SELECTIDENTICAL),FALSE);
2298 WinEnableWindow(WinWindowFromID(hwnd,IDM_SELECTSAME),FALSE);
2299 WinEnableWindow(WinWindowFromID(hwnd,IDM_INVERT),FALSE);
2300 WinEnableWindow(WinWindowFromID(hwnd,COMP_FILTER),FALSE);
2301 }
2302 else {
2303 DosBeep(250,100);
2304 free(forthread);
2305 }
2306 }
2307 else
2308 DosBeep(250,100);
2309 }
2310 break;
2311
2312 case DID_OK:
2313 WinDismissDlg(hwnd,0);
2314 break;
2315 case DID_CANCEL:
2316 WinDismissDlg(hwnd,1);
2317 break;
2318
2319 case IDM_HELP:
2320 if(hwndHelp)
2321 WinSendMsg(hwndHelp,HM_DISPLAY_HELP,
2322 MPFROM2SHORT(HELP_COMPARE,0),
2323 MPFROMSHORT(HM_RESOURCEID));
2324 break;
2325
2326 case IDM_DESELECTALL:
2327 case IDM_SELECTNEWER:
2328 case IDM_SELECTOLDER:
2329 case IDM_SELECTBIGGER:
2330 case IDM_SELECTSMALLER:
2331 case IDM_DESELECTNEWER:
2332 case IDM_DESELECTOLDER:
2333 case IDM_DESELECTBIGGER:
2334 case IDM_DESELECTSMALLER:
2335 case IDM_DESELECTONE:
2336 case IDM_DESELECTBOTH:
2337 case IDM_SELECTBOTH:
2338 case IDM_SELECTONE:
2339 case IDM_SELECTIDENTICAL:
2340 case IDM_SELECTSAME:
2341 case IDM_INVERT:
2342 cmp = INSTDATA(hwnd);
2343 if(cmp) {
2344
2345 COMPARE *forthread;
2346
2347 cmp->filling = TRUE;
2348 forthread = malloc(sizeof(COMPARE));
2349 if(forthread) {
2350 *forthread = *cmp;
2351 forthread->cmp = cmp;
2352 forthread->action = SHORT1FROMMP(mp1);
2353 if(_beginthread(SelectCnrs,NULL,65536,(PVOID)forthread) != -1) {
2354 WinEnableWindowUpdate(hwndLeft,FALSE);
2355 WinEnableWindowUpdate(hwndRight,FALSE);
2356 switch(SHORT1FROMMP(mp1)) {
2357 case IDM_DESELECTALL:
2358 case IDM_DESELECTNEWER:
2359 case IDM_DESELECTOLDER:
2360 case IDM_DESELECTBIGGER:
2361 case IDM_DESELECTSMALLER:
2362 case IDM_DESELECTONE:
2363 case IDM_DESELECTBOTH:
2364 WinSetDlgItemText(hwnd,COMP_NOTE,
2365 GetPString(IDS_COMPHOLDDESELTEXT));
2366 break;
2367 case IDM_INVERT:
2368 WinSetDlgItemText(hwnd,COMP_NOTE,
2369 GetPString(IDS_COMPHOLDINVERTTEXT));
2370 break;
2371 default:
2372 WinSetDlgItemText(hwnd,COMP_NOTE,
2373 GetPString(IDS_COMPHOLDSELTEXT));
2374 break;
2375 }
2376 WinEnableWindow(hwndRight,FALSE);
2377 WinEnableWindow(hwndLeft,FALSE);
2378 WinEnableWindow(WinWindowFromID(hwnd,DID_OK),FALSE);
2379 WinEnableWindow(WinWindowFromID(hwnd,DID_CANCEL),FALSE);
2380 WinEnableWindow(WinWindowFromID(hwnd,COMP_COLLECT),FALSE);
2381 WinEnableWindow(WinWindowFromID(hwnd,IDM_SELECTBOTH),FALSE);
2382 WinEnableWindow(WinWindowFromID(hwnd,IDM_SELECTONE),FALSE);
2383 WinEnableWindow(WinWindowFromID(hwnd,IDM_SELECTNEWER),FALSE);
2384 WinEnableWindow(WinWindowFromID(hwnd,IDM_SELECTOLDER),FALSE);
2385 WinEnableWindow(WinWindowFromID(hwnd,IDM_SELECTBIGGER),FALSE);
2386 WinEnableWindow(WinWindowFromID(hwnd,IDM_SELECTSMALLER),FALSE);
2387 WinEnableWindow(WinWindowFromID(hwnd,IDM_DESELECTBOTH),FALSE);
2388 WinEnableWindow(WinWindowFromID(hwnd,IDM_DESELECTONE),FALSE);
2389 WinEnableWindow(WinWindowFromID(hwnd,IDM_DESELECTNEWER),FALSE);
2390 WinEnableWindow(WinWindowFromID(hwnd,IDM_DESELECTOLDER),FALSE);
2391 WinEnableWindow(WinWindowFromID(hwnd,IDM_DESELECTBIGGER),FALSE);
2392 WinEnableWindow(WinWindowFromID(hwnd,IDM_DESELECTSMALLER),FALSE);
2393 WinEnableWindow(WinWindowFromID(hwnd,IDM_DESELECTALL),FALSE);
2394 WinEnableWindow(WinWindowFromID(hwnd,COMP_INCLUDESUBDIRS),FALSE);
2395 WinEnableWindow(WinWindowFromID(hwnd,COMP_SETDIRS),FALSE);
2396 WinEnableWindow(WinWindowFromID(hwnd,COMP_DELETELEFT),FALSE);
2397 WinEnableWindow(WinWindowFromID(hwnd,COMP_DELETERIGHT),FALSE);
2398 WinEnableWindow(WinWindowFromID(hwnd,COMP_COPYLEFT),FALSE);
2399 WinEnableWindow(WinWindowFromID(hwnd,COMP_MOVELEFT),FALSE);
2400 WinEnableWindow(WinWindowFromID(hwnd,COMP_COPYRIGHT),FALSE);
2401 WinEnableWindow(WinWindowFromID(hwnd,COMP_MOVERIGHT),FALSE);
2402 WinEnableWindow(WinWindowFromID(hwnd,IDM_SELECTIDENTICAL),FALSE);
2403 WinEnableWindow(WinWindowFromID(hwnd,IDM_SELECTSAME),FALSE);
2404 WinEnableWindow(WinWindowFromID(hwnd,IDM_INVERT),FALSE);
2405 WinEnableWindow(WinWindowFromID(hwnd,COMP_FILTER),FALSE);
2406 switch(SHORT1FROMMP(mp1)) {
2407 case IDM_DESELECTALL:
2408 case IDM_INVERT:
2409 break;
2410 default:
2411 break;
2412 }
2413 }
2414 else {
2415 DosBeep(250,100);
2416 free(forthread);
2417 }
2418 }
2419 else
2420 DosBeep(250,100);
2421 }
2422 break;
2423
2424 case COMP_COLLECT:
2425 cmp = INSTDATA(hwnd);
2426 if(cmp) {
2427
2428 CHAR **listl,**listr = NULL;
2429
2430 if(!Collector) {
2431
2432 SWP swp;
2433 HWND hwndC;
2434
2435 if(!fAutoTile && !ParentIsDesktop(hwnd,cmp->hwndParent) &&
2436 (!fExternalCollector && !strcmp(realappname,FM3Str)))
2437 GetNextWindowPos(cmp->hwndParent,&swp,NULL,NULL);
2438 hwndC = StartCollector((fExternalCollector ||
2439 strcmp(realappname,FM3Str)) ?
2440 HWND_DESKTOP :
2441 cmp->hwndParent,4);
2442 if(hwndC) {
2443 if(!fAutoTile && !ParentIsDesktop(hwnd,cmp->hwndParent) &&
2444 (!fExternalCollector && !strcmp(realappname,FM3Str)))
2445 WinSetWindowPos(hwndC,HWND_TOP,swp.x,swp.y,
2446 swp.cx,swp.cy,SWP_MOVE | SWP_SIZE |
2447 SWP_SHOW | SWP_ZORDER);
2448 else if(!ParentIsDesktop(hwnd,cmp->hwndParent) && fAutoTile &&
2449 !strcmp(realappname,FM3Str))
2450 TileChildren(cmp->hwndParent,TRUE);
2451 DosSleep(64L);
2452 PostMsg(hwnd,WM_COMMAND,MPFROM2SHORT(COMP_COLLECT,0),
2453 MPVOID);
2454 break;
2455 }
2456 }
2457 else
2458 StartCollector(cmp->hwndParent,4);
2459 {
2460 BOOL temp;
2461
2462 temp = fSelectedAlways;
2463 fSelectedAlways = TRUE;
2464 listl = BuildList(hwndLeft);
2465 if(!*cmp->rightlist)
2466 listr = BuildList(hwndRight);
2467 fSelectedAlways = temp;
2468 }
2469 if(listl || listr) {
2470 if(Collector) {
2471 if(listl) {
2472 if(!PostMsg(Collector,WM_COMMAND,
2473 MPFROM2SHORT(IDM_COLLECTOR,0),
2474 MPFROMP(listl)))
2475 FreeList(listl);
2476 }
2477 if(listr) {
2478 if(!PostMsg(Collector,WM_COMMAND,
2479 MPFROM2SHORT(IDM_COLLECTOR,0),
2480 MPFROMP(listr)))
2481 FreeList(listr);
2482 }
2483 WinSetWindowPos(WinQueryWindow(WinQueryWindow(Collector,
2484 QW_PARENT),QW_PARENT),HWND_TOP,
2485 0,0,0,0,SWP_ACTIVATE);
2486 }
2487 else {
2488 FreeList(listl);
2489 FreeList(listr);
2490 }
2491 }
2492 }
2493 break;
2494 }
2495 return 0;
2496
2497 case WM_CLOSE:
2498 WinDismissDlg(hwnd,0);
2499 return 0;
2500
2501 case WM_DESTROY:
2502 cmp = INSTDATA(hwnd);
2503 if(cmp) {
2504 if(cmp->dcd.hwndLastMenu)
2505 WinDestroyWindow(cmp->dcd.hwndLastMenu);
2506 if(cmp->dcd.hwndObject) {
2507 WinSetWindowPtr(cmp->dcd.hwndObject,0,(PVOID)NULL);
2508 if(!PostMsg(cmp->dcd.hwndObject,WM_CLOSE,MPVOID,MPVOID))
2509 WinSendMsg(cmp->dcd.hwndObject,WM_CLOSE,MPVOID,MPVOID);
2510 }
2511 free(cmp);
2512 }
2513 EmptyCnr(hwndLeft);
2514 EmptyCnr(hwndRight);
2515 DosPostEventSem(CompactSem);
2516 break;
2517 }
2518 return WinDefDlgProc(hwnd,msg,mp1,mp2);
2519}
Note: See TracBrowser for help on using the repository browser.