source: trunk/dll/autoview.c@ 51

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

Standardize EA match

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 30.9 KB
Line 
1
2/***********************************************************************
3
4 $Id: autoview.c 51 2003-02-12 20:22:14Z root $
5
6 Auto view
7
8 Copyright (c) 1993-98 M. Kimes
9 Copyright (c) 2001, 2002 Steven H.Levine
10
11 Revisions 12 Sep 02 SHL - AutoObjProc: catch buff2 overflows
12 25 Oct 02 SHL - CreateHexDump: catch buffer overflow
13 12 Feb 03 SHL - AutoObjProc: standardize EA math
14
15***********************************************************************/
16
17
18#define INCL_DOS
19#define INCL_WIN
20#define INCL_GPI
21
22#include <os2.h>
23#include <stdlib.h>
24#include <stdio.h>
25#include <string.h>
26#include <ctype.h>
27#include "fm3dll.h"
28#include "fm3dlg.h"
29#include "fm3str.h"
30#include "mle.h"
31
32#pragma data_seg(DATA1)
33#pragma alloc_text(AUTOVIEW,AutoViewProc,CreateHexDump,AutoObjProc)
34#pragma alloc_text(AUTOVIEW2,MakeAutoWin,WriteEA,PutComments)
35
36static HWND hwndAutoObj = (HWND)0;
37static CHAR stopflag;
38static CHAR currfile[CCHMAXPATH];
39extern BOOL loadedarcs;
40
41
42BOOL WriteEA (HWND hwnd,CHAR *filename,CHAR *eaname,USHORT type,CHAR *data) {
43
44 /* save an ea to disk */
45
46 FEA2LIST *pfealist = NULL;
47 EAOP2 eaop;
48 APIRET rc;
49 ULONG ealen;
50 USHORT len,*num,*plen,usCodepage;
51 CHAR *p,*eaval;
52 BOOL ret = FALSE;
53
54 if(!filename || !eaname)
55 return ret;
56 usCodepage = (USHORT)WinQueryCp(WinQueryWindowULong(hwnd,QWL_HMQ));
57 len = (data) ? strlen(data) : 0;
58 ealen = sizeof(FEA2LIST) + 24L + strlen(eaname) + 1L +
59 (ULONG)len + 4L;
60 switch(type) {
61 case EAT_EA:
62 case EAT_ASCII:
63 break;
64 case EAT_MVST:
65 if(data) {
66 ealen += sizeof(USHORT) * 5;
67 p = data;
68 while(*p) {
69 if(*p == '\n' && *(p + 1))
70 ealen += sizeof(USHORT);
71 p++;
72 }
73 }
74 break;
75 case EAT_MVMT:
76 if(data) {
77 ealen += sizeof(USHORT) * 5;
78 p = data;
79 while(*p) {
80 if(*p == '\n' && *(p + 1))
81 ealen += (sizeof(USHORT) * 2);
82 p++;
83 }
84 }
85 break;
86 default:
87 return ret;
88 }
89
90 if(!DosAllocMem((PPVOID)&pfealist,ealen,PAG_COMMIT | PAG_READ |
91 PAG_WRITE | OBJ_TILE) && pfealist) {
92 memset(pfealist,0,ealen);
93 pfealist->list[0].cbName = strlen(eaname);
94 memcpy(pfealist->list[0].szName,eaname,pfealist->list[0].cbName + 1);
95 eaval = pfealist->list[0].szName + pfealist->list[0].cbName + 1;
96 switch(type) {
97 case EAT_EA:
98 case EAT_ASCII:
99 if(data) {
100 *(USHORT *)eaval = (USHORT)type;
101 eaval += sizeof(USHORT);
102 *(USHORT *)eaval = (USHORT)len;
103 eaval += sizeof(USHORT);
104 memcpy(eaval,data,len);
105 eaval += len;
106 }
107 break;
108 case EAT_MVST:
109 if(data) {
110 *(USHORT *)eaval = (USHORT)EAT_MVST;
111 eaval += sizeof(USHORT);
112 *(USHORT *)eaval = usCodepage;
113 eaval += sizeof(USHORT);
114 num = (USHORT *)eaval;
115 *num = 0;
116 eaval += sizeof(USHORT);
117 *(USHORT *)eaval = (USHORT)EAT_ASCII;
118 eaval += sizeof(USHORT);
119 plen = (USHORT *)eaval;
120 *plen = 0;
121 eaval += sizeof(USHORT);
122 p = data;
123 while(*p) {
124 while(*p) {
125 if(*p == '\n') {
126 p++;
127 break;
128 }
129 *eaval++ = *p++;
130 (*plen)++;
131 }
132 if(*p || *plen)
133 (*num)++;
134 if(*p) {
135 plen = (USHORT *)eaval;
136 *plen = 0;
137 eaval += sizeof(USHORT);
138 }
139 }
140 }
141 break;
142 case EAT_MVMT:
143 if(data) {
144 *(USHORT *)eaval = (USHORT)EAT_MVMT;
145 eaval += sizeof(USHORT);
146 *(USHORT *)eaval = usCodepage;
147 eaval += sizeof(USHORT);
148 num = (USHORT *)eaval;
149 *num = 0;
150 eaval += sizeof(USHORT);
151 *(USHORT *)eaval = (USHORT)EAT_ASCII;
152 eaval += sizeof(USHORT);
153 plen = (USHORT *)eaval;
154 *plen = 0;
155 eaval += sizeof(USHORT);
156 p = data;
157 while(*p) {
158 while(*p) {
159 if(*p == '\n') {
160 p++;
161 break;
162 }
163 *eaval++ = *p++;
164 (*plen)++;
165 }
166 if(*p || *plen)
167 (*num)++;
168 if(*p) {
169 *(USHORT *)eaval = (USHORT)EAT_ASCII;
170 eaval += sizeof(USHORT);
171 plen = (USHORT *)eaval;
172 *plen = 0;
173 eaval += sizeof(USHORT);
174 }
175 }
176 }
177 break;
178 }
179 pfealist->list[0].cbValue = (ULONG)(eaval -
180 (pfealist->list[0].szName +
181 pfealist->list[0].cbName + 1));
182 memset(&eaop,0,sizeof(eaop));
183 eaop.fpFEA2List = pfealist;
184 pfealist->cbList = 13L + (ULONG)pfealist->list[0].cbName +
185 (ULONG)pfealist->list[0].cbValue;
186 rc = DosSetPathInfo(filename,FIL_QUERYEASIZE,(PVOID)&eaop,
187 (ULONG)sizeof(EAOP2),DSPI_WRTTHRU);
188 DosFreeMem(pfealist);
189 if(!rc)
190 ret = TRUE;
191 }
192 return ret;
193}
194
195
196BOOL PutComments (HWND hwnd,CHAR *filename,CHAR *comments) {
197
198 register CHAR *p;
199
200 if(comments) { /* check -- is it empty? */
201 p = comments;
202 while(*p && isspace(*p))
203 p++;
204 if(!*p)
205 comments = NULL;
206 }
207 return WriteEA(hwnd,filename,".COMMENTS",EAT_MVMT,comments);
208}
209
210
211ULONG CreateHexDump (CHAR *pchInBuf,ULONG cbInBuf,
212 CHAR *pchOutBuf,ULONG cbOutBuf,
213 ULONG cOffset,BOOL fLongAddr)
214{
215 register CHAR *pchIn,*pchReset,*pchOut;
216 register ULONG ibIn = 0,ibIn2,ibInFill;
217 ULONG cbOutLine = 6 + (fLongAddr ? 4 : 0) + 16 * 3 + 1 + 16 + 1;
218
219 if(pchInBuf && cbInBuf && pchOutBuf && cbOutBuf) {
220 pchIn = pchInBuf;
221 pchOut = pchOutBuf;
222 if(cOffset)
223 *pchOut++ = '\n';
224 while (ibIn < cbInBuf) {
225 if (pchOut - pchOutBuf + cbOutLine >= cbOutBuf) {
226 saymsg(MB_ENTER,HWND_DESKTOP,DEBUG_STRING,"hex buf ovf");
227 break;
228 }
229 pchReset = pchIn;
230 ibIn2 = ibIn;
231 if(fLongAddr)
232 sprintf(pchOut,"%08lx ",ibIn + cOffset);
233 else
234 sprintf(pchOut,"%04lx ",ibIn + cOffset);
235 pchOut += 6 + (fLongAddr ? 4 : 0);
236 do {
237 sprintf(pchOut,"%02hx ",*pchIn);
238 pchOut += 3;
239 pchIn++;
240 ibIn++;
241 } while(ibIn < cbInBuf && (ibIn % 16));
242 if(ibIn % 16) {
243 ibInFill = ibIn;
244 while(ibInFill % 16) {
245 *pchOut++ = ' ';
246 *pchOut++ = ' ';
247 *pchOut++ = ' ';
248 ibInFill++;
249 }
250 }
251 *pchOut++ = ' ';
252 pchIn = pchReset;
253 do {
254 if(*pchIn && *pchIn != '\n' && *pchIn != '\r' && *pchIn != '\t' && *pchIn != '\x1a')
255 *pchOut++ = *pchIn++;
256 else {
257 *pchOut++ = '.';
258 pchIn++;
259 }
260 ibIn2++;
261 } while(ibIn2 < ibIn);
262 if(ibIn < cbInBuf)
263 *pchOut++ = '\n';
264 } // while ibIn
265 *pchOut = 0;
266 return (ULONG)(pchOut - pchOutBuf);
267 }
268 return 0L;
269}
270
271
272MRESULT EXPENTRY AutoObjProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
273{
274
275 switch(msg) {
276 case UM_LOADFILE:
277 *currfile = 0;
278 stopflag--;
279 if(fAutoView) {
280 WinSetWindowText((fComments) ? hwndAutoMLE : hwndAutoview,"");
281 MLEsetreadonly(hwndAutoMLE,TRUE);
282 MLEsetchanged(hwndAutoMLE,FALSE);
283 }
284 if(mp1) {
285 if(fAutoView) {
286 strcpy(currfile,(CHAR *)mp1);
287 if(!fComments) {
288 if(IsFile((CHAR *)mp1) == 1) {
289
290 HFILE handle;
291 ULONG action,olen,ibufflen,obufflen,l;
292 CHAR *ibuff,*obuff,*p,buffer[80];
293 ARC_TYPE *info;
294
295 if(!DosOpen((CHAR *)mp1,
296 &handle,
297 &action,
298 0L,
299 0L,
300 OPEN_ACTION_FAIL_IF_NEW | OPEN_ACTION_OPEN_IF_EXISTS,
301 OPEN_FLAGS_FAIL_ON_ERROR | OPEN_FLAGS_NOINHERIT |
302 OPEN_FLAGS_RANDOMSEQUENTIAL | OPEN_SHARE_DENYNONE |
303 OPEN_ACCESS_READONLY,
304 0L)) {
305 ibufflen = (AutoviewHeight < 96) ? 512 : 3072;
306 ibuff = malloc(ibufflen + 2);
307 if(ibuff) {
308 // Depends on CreateHexDump line width
309 obufflen = (ibufflen / 16) * (6 + 3 * 16 + 1 + 16 + 1) + 80;
310 obuff = malloc(obufflen + 1);
311 if(obuff) {
312 *obuff = 0;
313 if(!DosRead(handle,
314 ibuff,
315 ibufflen,
316 &ibufflen) &&
317 ibufflen) {
318 ibuff[ibufflen] = 0;
319 p = obuff;
320 if(IsBinary(ibuff,ibufflen)) {
321 olen = ibufflen;
322 // Check archive
323 if(!loadedarcs)
324 load_archivers();
325 info = arcsighead;
326 while(info) {
327 if(info->signature &&
328 *info->signature) {
329 l = strlen(info->signature);
330 l = min(l,79);
331 if(!DosChgFilePtr(handle,abs(info->file_offset),
332 (info->file_offset >= 0L) ?
333 FILE_BEGIN :
334 FILE_END,
335 &ibufflen)) {
336 if(!DosRead(handle,
337 buffer,
338 l,
339 &ibufflen) &&
340 ibufflen == l) {
341 if(!memcmp(info->signature,
342 buffer,
343 l))
344 break;
345 }
346 }
347 }
348 info = info->next;
349 }
350 if(info) {
351 sprintf(p,"**%s%s%s\n",
352 (info->id) ? info->id : "",
353 (info->id) ? " " : "",
354 GetPString(IDS_ARCHIVETEXT));
355 p += strlen(p);
356 }
357 CreateHexDump(ibuff, // Input buffer
358 olen, // Input buffer size
359 p, // Output buffer
360 obufflen - (p - obuff), // Output buffer size
361 0, // Address offest
362 FALSE); // Short addresses
363 }
364 else {
365 // Text file
366 register CHAR *src,*dest;
367 CHAR *endsrc;
368
369 src = ibuff;
370 dest = obuff;
371 endsrc = ibuff + ibufflen;
372 while(src < endsrc) {
373 if(dest == obuff && (*src == '\t' || *src == ' ' ||
374 *src == '\r' || *src == '\n')) {
375 src++;
376 }
377 else if(*src == '\t' || !*src) {
378 *dest = ' ';
379 dest++;
380 src++;
381 }
382 else if(*src == '\r' || *src == '\n') {
383 *dest = *src;
384 while(*(src + 1) == '\r' || *(src + 1) == '\n' ||
385 *(src + 1) == ' ' || *(src + 1) == '\t')
386 src++;
387 dest++;
388 src++;
389 }
390 else {
391 *dest = *src;
392 src++;
393 dest++;
394 }
395 } // while
396 *dest = 0;
397 if (dest - obuff >= obufflen)
398 saymsg(MB_ENTER,HWND_DESKTOP,DEBUG_STRING,"obuff ovf");
399 }
400 if(*obuff)
401 WinSetWindowText(hwndAutoview,obuff);
402 }
403 free(obuff);
404 }
405 free(ibuff);
406 }
407 DosClose(handle);
408 }
409 }
410 else if(!IsFile(currfile)) {
411
412 static FILEFINDBUF4 ffb[130];
413 static char fullname[CCHMAXPATH + 4];
414 HDIR hdir = HDIR_CREATE;
415 ULONG x,nm,ml,mc,bufflen;
416 PBYTE fb;
417 PFILEFINDBUF4 pffbFile;
418 char *buff,*p;
419 APIRET rc;
420
421 sprintf(fullname,
422 "%s%s*",
423 currfile,
424 (currfile[strlen(currfile) - 1] == '\\') ? "" : "\\");
425 DosError(FERR_DISABLEHARDERR);
426 nm = sizeof(ffb) / sizeof(FILEFINDBUF4);
427 if(AutoviewHeight < 96)
428 nm /= 2;
429 rc = DosFindFirst(fullname,
430 &hdir,
431 FILE_NORMAL | FILE_DIRECTORY |
432 FILE_READONLY | FILE_ARCHIVED |
433 FILE_SYSTEM | FILE_HIDDEN,
434 &ffb,
435 sizeof(ffb),
436 &nm,
437 FIL_QUERYEASIZE);
438 if(!rc && nm) {
439 fb = (PBYTE)&ffb;
440 x = ml = 0;
441 while(x < nm) {
442 pffbFile = (PFILEFINDBUF4)fb;
443 mc = (ULONG)pffbFile->cchName +
444 ((pffbFile->attrFile & FILE_DIRECTORY) != 0);
445 ml = max(ml,mc);
446 if(!pffbFile->oNextEntryOffset)
447 break;
448 fb += pffbFile->oNextEntryOffset;
449 x++;
450 }
451 bufflen = (CCHMAXPATHCOMP + 42) * nm;
452 buff = malloc(bufflen);
453 if(buff) {
454 p = buff;
455 *p = 0;
456 fb = (PBYTE)&ffb;
457 x = 0;
458 while(x < nm) {
459 pffbFile = (PFILEFINDBUF4)fb;
460 if(!(!*pffbFile->achName ||
461 (((pffbFile->attrFile & FILE_DIRECTORY) &&
462 pffbFile->achName[0] == '.') &&
463 (!pffbFile->achName[1] ||
464 (pffbFile->achName[1] == '.' &&
465 !pffbFile->achName[2]))))) {
466 sprintf(p,
467 "%s%-*.*s %-8lu [%s%s%s%s] %04lu/%02lu/%02lu "
468 "%02lu:%02lu:%02lu\r",
469 ((pffbFile->attrFile & FILE_DIRECTORY) != 0) ?
470 "\\" : " ",
471 ml,
472 ml,
473 pffbFile->achName,
474 pffbFile->cbFile +
475 CBLIST_TO_EASIZE(pffbFile->cbList),
476 ((pffbFile->attrFile & FILE_READONLY) != 0) ?
477 "R" : "-",
478 ((pffbFile->attrFile & FILE_ARCHIVED) != 0) ?
479 "A" : "-",
480 ((pffbFile->attrFile & FILE_HIDDEN) != 0) ?
481 "H" : "-",
482 ((pffbFile->attrFile & FILE_SYSTEM) != 0) ?
483 "S" : "-",
484 pffbFile->fdateLastWrite.year + 1980,
485 pffbFile->fdateLastWrite.month,
486 pffbFile->fdateLastWrite.day,
487 pffbFile->ftimeLastWrite.hours,
488 pffbFile->ftimeLastWrite.minutes,
489 pffbFile->ftimeLastWrite.twosecs * 2);
490 p += strlen(p);
491 }
492 if(!pffbFile->oNextEntryOffset)
493 break;
494 fb += pffbFile->oNextEntryOffset;
495 x++;
496 } // while
497 if (p - buff >= bufflen)
498 saymsg(MB_ENTER,HWND_DESKTOP,DEBUG_STRING,"buff ovf");
499 if(*buff)
500 WinSetWindowText(hwndAutoview,buff);
501 free(buff);
502 }
503 }
504 if(!rc)
505 DosFindClose(hdir);
506 }
507 }
508 else {
509
510 APIRET rc;
511 EAOP2 eaop;
512 PGEA2LIST pgealist;
513 PFEA2LIST pfealist;
514 PGEA2 pgea;
515 PFEA2 pfea;
516 CHAR *value,*buff,*p,*data;
517 USHORT len,type,plen,dlen;
518 BOOL readonly = FALSE;
519
520 pgealist = malloc(sizeof(GEA2LIST) + 64);
521 if(pgealist) {
522 memset(pgealist,0,sizeof(GEA2LIST) + 64);
523 pgea = &pgealist->list[0];
524 strcpy(pgea->szName,".COMMENTS");
525 pgea->cbName = strlen(pgea->szName);
526 pgea->oNextEntryOffset = 0L;
527 pgealist->cbList = (sizeof(GEA2LIST) + pgea->cbName);
528 pfealist = malloc(65536);
529 if(pfealist) {
530 memset(pfealist,0,65536);
531 pfealist->cbList = 65536;
532 eaop.fpGEA2List = pgealist;
533 eaop.fpFEA2List = pfealist;
534 eaop.oError = 0L;
535 rc = DosQueryPathInfo((CHAR *)mp1,FIL_QUERYEASFROMLIST,
536 (PVOID)&eaop,
537 (ULONG)sizeof(EAOP2));
538 free(pgealist);
539 if(!rc) {
540 pfea = &eaop.fpFEA2List->list[0];
541 if(pfea->cbName && pfea->cbValue) {
542 value = pfea->szName + pfea->cbName + 1;
543 value[pfea->cbValue] = 0;
544 if(*(USHORT *)value == EAT_MVMT) {
545 buff = malloc(65536);
546 if(buff) {
547 p = buff;
548 *buff = 0;
549 data = value + (sizeof(USHORT) * 3);
550 type = *(USHORT *)data;
551 data += sizeof(USHORT);
552 len = *(USHORT *)data;
553 data += sizeof(USHORT);
554 while((data - value) - len < pfea->cbValue) {
555 if(type == EAT_ASCII) {
556 dlen = plen = 0;
557 while(dlen < len) {
558 if(data[dlen] == '\r') {
559 dlen++;
560 if(dlen < len && data[dlen] != '\n')
561 p[plen++] = '\n';
562 }
563 else
564 p[plen++] = data[dlen++];
565 }
566 if((!len || !plen || p[plen - 1] != '\n') &&
567 (data - value) + len < pfea->cbValue)
568 p[plen++] = '\n';
569 p += plen;
570 *p = 0;
571 }
572 else
573 readonly = TRUE;
574 data += len;
575 if(data - value >= pfea->cbValue)
576 break;
577 type = *(USHORT *)data;
578 data += sizeof(USHORT);
579 len = *(USHORT *)data;
580 data += sizeof(USHORT);
581 } // while
582 if (p - buff >= 65536) {
583 saymsg(MB_ENTER,HWND_DESKTOP,DEBUG_STRING,"eabuff ovf");
584 buff[65535] = 0; // Try to stay alive
585 break;
586 }
587 WinSetWindowText(hwndAutoMLE,buff);
588 free(buff);
589 }
590 }
591 else
592 readonly = TRUE;
593 }
594 /* else EA not present */
595 MLEsetchanged(hwndAutoMLE,FALSE);
596 MLEsetreadonly(hwndAutoMLE,readonly);
597 }
598 else {
599 MLEsetchanged(hwndAutoMLE,FALSE);
600 MLEsetreadonly(hwndAutoMLE,FALSE);
601 }
602 free(pfealist);
603 }
604 }
605 }
606 }
607 free((CHAR *)mp1);
608 }
609 return 0;
610
611 case UM_CLOSE:
612 if(!PostMsg((HWND)0,WM_QUIT,MPVOID,MPVOID))
613 WinSendMsg((HWND)0,WM_QUIT,MPVOID,MPVOID);
614 WinDestroyWindow(hwnd);
615 return 0;
616 }
617 return WinDefWindowProc(hwnd,msg,mp1,mp2);
618}
619
620
621VOID MakeAutoWin (VOID *args) {
622
623 HAB hab2;
624 HMQ hmq2;
625 HWND hwndParent = (HWND)args;
626 QMSG qmsg2;
627
628 hab2 = WinInitialize(0);
629 if(hab2) {
630 hmq2 = WinCreateMsgQueue(hab2,128);
631 if(hmq2) {
632 DosError(FERR_DISABLEHARDERR);
633 WinRegisterClass(hab2,
634 GetPString(IDS_WCOBJECTWINDOW),
635 AutoObjProc,
636 0,
637 sizeof(PVOID));
638 hwndAutoObj = WinCreateWindow(HWND_OBJECT,
639 GetPString(IDS_WCOBJECTWINDOW),
640 (PSZ)NULL,
641 0,
642 0L,
643 0L,
644 0L,
645 0L,
646 0L,
647 HWND_TOP,
648 OBJ_FRAME,
649 NULL,
650 NULL);
651 if(hwndAutoObj) {
652 WinSetWindowULong(hwndAutoObj,0,hwndParent);
653 priority_normal();
654 while(WinGetMsg(hab2,&qmsg2,(HWND)0,0,0))
655 WinDispatchMsg(hab2,&qmsg2);
656 WinDestroyWindow(hwndAutoObj);
657 hwndAutoObj = (HWND)0;
658 }
659 else {
660 if(!PostMsg(hwndParent,UM_CLOSE,MPVOID,MPVOID))
661 WinSendMsg(hwndParent,UM_CLOSE,MPVOID,MPVOID);
662 }
663 WinDestroyMsgQueue(hmq2);
664 }
665 else
666 WinTerminate(hab2);
667 }
668}
669
670
671MRESULT EXPENTRY AutoViewProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2) {
672
673 USHORT id = WinQueryWindowUShort(hwnd,QWS_ID);
674
675 switch(msg) {
676 case WM_CREATE:
677 {
678 MRESULT mr;
679
680 if(!hwndAutoObj &&
681 _beginthread(MakeAutoWin,
682 NULL,
683 65536,
684 (PVOID)hwnd) == -1)
685 PostMsg(hwnd,
686 UM_CLOSE,
687 MPVOID,
688 MPVOID);
689 mr = PFNWPStatic(hwnd,msg,mp1,mp2);
690 SetPresParams(hwnd,
691 &RGBGREY,
692 &RGBBLACK,
693 &RGBGREY,
694 GetPString(IDS_4SYSTEMVIOTEXT));
695 stopflag = 0;
696 return mr;
697 }
698
699 case UM_SETUP:
700 MLEsetlimit(hwnd,32768);
701 MLEsetformat(hwnd,MLFIE_NOTRANS);
702 MLEsetchanged(hwnd,FALSE);
703 return 0;
704
705 case WM_BUTTON1DOWN:
706 {
707 SWP swp;
708
709 WinQueryWindowPos(hwnd,&swp);
710 if(SHORT2FROMMP(mp1) > swp.cy - 4) {
711
712 HPS hps = WinGetPS(WinQueryWindow(hwnd,QW_PARENT));
713 SWP swpC;
714 TRACKINFO track;
715
716 if(hps) {
717 WinQueryWindowPos(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),
718 FID_CLIENT),&swpC);
719 track.cxBorder = 4;
720 track.cyBorder = 4;
721 track.cxGrid = 1;
722 track.cyGrid = 8;
723 track.cxKeyboard = 8;
724 track.rclTrack.yBottom = swp.y;
725 track.rclTrack.yTop = swp.y + swp.cy;
726 track.rclTrack.xLeft = swp.x;
727 track.rclTrack.xRight = swp.x + swp.cx;
728 track.rclBoundary = track.rclTrack;
729 track.rclBoundary.yTop = (swpC.cy + swp.y + swp.cy) - 116;
730 track.ptlMinTrackSize.x = swp.x + swp.cx;
731 track.ptlMinTrackSize.y = 36;
732 track.ptlMaxTrackSize.x = swp.x + swp.cx;
733 track.ptlMaxTrackSize.y = (swpC.cy + swp.cy) - 116;
734 track.fs = TF_TOP;
735 if(WinTrackRect(hwnd,hps,&track)) {
736 AutoviewHeight = track.rclTrack.yTop - track.rclTrack.yBottom;
737 PrfWriteProfileData(fmprof,
738 FM3Str,
739 "AutoviewHeight",
740 &AutoviewHeight,
741 sizeof(ULONG));
742 WinSendMsg(WinQueryWindow(hwnd,QW_PARENT),
743 WM_UPDATEFRAME,
744 MPFROMLONG(FCF_SIZEBORDER),
745 MPVOID);
746 }
747 WinReleasePS(hps);
748 }
749 return (MRESULT)TRUE;
750 }
751 else if(id != MAIN_AUTOVIEWMLE)
752 return CommonTextButton(hwnd,msg,mp1,mp2);
753 }
754 break;
755
756 case WM_BUTTON3DOWN:
757 case WM_BUTTON1UP:
758 case WM_BUTTON3UP:
759 if(id != MAIN_AUTOVIEWMLE)
760 return CommonTextButton(hwnd,msg,mp1,mp2);
761 break;
762
763 case WM_MOUSEMOVE:
764 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
765 {
766 SWP swp;
767
768 WinQueryWindowPos(hwnd,&swp);
769 if(SHORT2FROMMP(mp1) > swp.cy - 4) {
770 WinSetPointer(HWND_DESKTOP,hptrNS);
771 return (MRESULT)TRUE;
772 }
773 }
774 break;
775
776 case WM_PAINT:
777 PostMsg(hwnd,
778 UM_PAINT,
779 MPVOID,
780 MPVOID);
781 break;
782
783 case UM_PAINT:
784 PaintRecessedWindow(hwnd,(HPS)0,TRUE,TRUE);
785 return 0;
786
787 case WM_SETFOCUS:
788 switch(id) {
789 case MAIN_AUTOVIEWMLE:
790 if(!mp2 && !AutoMenu) {
791 if(*currfile) {
792 if(MLEgetchanged(hwnd)) {
793
794 CHAR *ea = malloc(32768);
795
796 if(ea) {
797 *ea = 0;
798 WinQueryWindowText(hwnd,32767,ea);
799 PutComments(hwnd,
800 currfile,
801 ea);
802 PostMsg(hwnd,
803 WM_COMMAND,
804 MPFROM2SHORT(IDM_RESCAN,0),
805 MPVOID);
806 free(ea);
807 }
808 }
809 }
810 }
811 break;
812 default:
813 if(mp2)
814 PostMsg(hwnd,
815 UM_FOCUSME,
816 mp1,
817 mp2);
818 break;
819 }
820 break;
821
822 case UM_FOCUSME:
823 if(mp2) {
824
825 PID pid;
826 TID tid;
827
828 if(WinQueryWindowProcess((HWND)mp1,
829 &pid,
830 &tid) &&
831 pid == mypid)
832 WinSetFocus(HWND_DESKTOP,
833 (HWND)mp1);
834 else
835 WinSetFocus(HWND_DESKTOP,
836 hwndTree);
837 }
838 return 0;
839
840 case UM_CLICKED:
841 case UM_CLICKED3:
842 if(id != MAIN_AUTOVIEWMLE) {
843 PostMsg(hwnd,
844 WM_COMMAND,
845 MPFROM2SHORT(((msg == UM_CLICKED3) ?
846 IDM_EAS :
847 IDM_VIEWORARC),
848 0),
849 MPVOID);
850 }
851 return 0;
852
853 case WM_COMMAND:
854 PostMsg(hwnd,
855 UM_COMMAND,
856 mp1,
857 mp2);
858 return 0;
859
860 case UM_COMMAND:
861 switch(SHORT1FROMMP(mp1)) {
862 case IDM_RESCAN:
863 if(*currfile) {
864
865 CHAR *cf = strdup(currfile);
866
867 if(cf) {
868 stopflag++;
869 if(!PostMsg(hwndAutoObj,
870 UM_LOADFILE,
871 MPFROMP(cf),
872 MPVOID))
873 free(cf);
874 }
875 }
876 break;
877
878 case IDM_INFO:
879 DefaultView(hwnd,
880 (HWND)0,
881 hwndMain,
882 NULL,
883 16,
884 currfile);
885 break;
886
887 case IDM_VIEW:
888 DefaultView(hwnd,
889 (HWND)0,
890 hwndMain,
891 NULL,
892 0,
893 currfile);
894 break;
895
896 case IDM_EDIT:
897 DefaultView(hwnd,
898 (HWND)0,
899 hwndMain,
900 NULL,
901 8,
902 currfile);
903 break;
904
905 case IDM_EAS:
906 {
907 char *list[2];
908
909 list[0] = currfile;
910 list[1] = NULL;
911
912 WinDlgBox(HWND_DESKTOP,
913 hwndMain,
914 DisplayEAsProc,
915 FM3ModHandle,
916 EA_FRAME,
917 (PVOID)list);
918 }
919 break;
920
921 default:
922 PostMsg(hwndMain,
923 msg,
924 mp1,
925 mp2);
926 }
927 return 0;
928
929 case WM_MENUEND:
930 if((HWND)mp2 == AutoMenu) {
931 WinDestroyWindow(AutoMenu);
932 AutoMenu = (HWND)0;
933 }
934 break;
935
936 case WM_CONTEXTMENU:
937 CheckMenu(&AutoMenu,(id == MAIN_AUTOVIEWMLE) ?
938 IDM_AUTOVIEWMLE : IDM_AUTOVIEW);
939 WinCheckMenuItem(AutoMenu,
940 IDM_AUTOVIEWFILE,
941 !fComments);
942 WinCheckMenuItem(AutoMenu,
943 IDM_AUTOVIEWCOMMENTS,
944 fComments);
945 WinEnableMenuItem(AutoMenu,
946 IDM_VIEW,
947 (IsFile(currfile) == 1));
948 WinEnableMenuItem(AutoMenu,
949 IDM_EDIT,
950 (IsFile(currfile) == 1));
951 WinEnableMenuItem(AutoMenu,
952 IDM_INFO,
953 (*currfile != 0));
954 PopupMenu(hwnd,
955 hwnd,
956 AutoMenu);
957 break;
958
959 case UM_LOADFILE:
960 stopflag++;
961 if(!PostMsg(hwndAutoObj,
962 msg,
963 mp1,
964 mp2)) {
965 if(mp1)
966 free((CHAR *)mp1);
967 }
968 return 0;
969
970 case UM_CLOSE:
971 if(AutoMenu) {
972 WinDestroyWindow(AutoMenu);
973 AutoMenu = (HWND)0;
974 }
975 WinDestroyWindow(hwnd);
976 return 0;
977
978 case WM_CLOSE:
979 WinSendMsg(hwnd,
980 UM_CLOSE,
981 MPVOID,
982 MPVOID);
983 return 0;
984
985 case WM_DESTROY:
986 if(id != MAIN_AUTOVIEWMLE) {
987 if(hwndAutoObj)
988 if(!PostMsg(hwndAutoObj,
989 WM_CLOSE,
990 MPVOID,
991 MPVOID))
992 WinSendMsg(hwndAutoObj,
993 WM_CLOSE,
994 MPVOID,
995 MPVOID);
996 break;
997 }
998 break;
999 }
1000
1001 if(id == MAIN_AUTOVIEWMLE)
1002 return PFNWPMLE(hwnd,msg,mp1,mp2);
1003 return PFNWPStatic(hwnd,msg,mp1,mp2);
1004}
1005
Note: See TracBrowser for help on using the repository browser.