source: trunk/dll/autoview.c@ 201

Last change on this file since 201 was 130, checked in by root, 20 years ago

Use QWL_USER

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