source: trunk/dll/autoview.c@ 341

Last change on this file since 341 was 341, checked in by root, 19 years ago

Check more run time errors

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