source: trunk/dll/autoview.c@ 773

Last change on this file since 773 was 773, checked in by Steven Levine, 18 years ago

Correct some compare directories collector nits
Use BldQuoted... functions
Move BldQuoted... functions near primary callers
Add RUNTYPE_MASK
Use Runtime_Error2 more

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 22.0 KB
Line 
1
2/***********************************************************************
3
4 $Id: autoview.c 773 2007-08-07 21:23:27Z stevenhl $
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 15 Aug 06 SHL Use Runtime_Error more
18 03 Nov 06 SHL Renames
19 30 Mar 07 GKY Remove GetPString for window class names
20
21***********************************************************************/
22
23#define INCL_DOS
24#define INCL_WIN
25#define INCL_GPI
26#include <os2.h>
27
28#include <stdlib.h>
29#include <stdio.h>
30#include <string.h>
31#include <ctype.h>
32#include <process.h> // _beginthread
33
34#include "fm3dll.h"
35#include "fm3dlg.h"
36#include "fm3str.h"
37#include "mle.h"
38
39#pragma data_seg(DATA1)
40
41static PSZ pszSrcFile = __FILE__;
42
43#pragma alloc_text(AUTOVIEW,AutoViewProc,CreateHexDump,AutoObjProc)
44#pragma alloc_text(AUTOVIEW2,MakeAutoWinThread,WriteEA,PutComments)
45
46static HWND hwndAutoObj;
47static CHAR stopflag;
48static CHAR currfile[CCHMAXPATH];
49
50BOOL WriteEA(HWND hwnd, CHAR * filename, CHAR * eaname, USHORT type,
51 CHAR * data)
52{
53 /* save an ea to disk */
54
55 FEA2LIST *pfealist = NULL;
56 EAOP2 eaop;
57 APIRET rc;
58 ULONG ealen;
59 USHORT len, *num, *plen, usCodepage;
60 CHAR *p, *eaval;
61 BOOL ret = FALSE;
62
63 if (!filename || !eaname)
64 return ret;
65 usCodepage = (USHORT) WinQueryCp(WinQueryWindowULong(hwnd, QWL_HMQ));
66 len = (data) ? strlen(data) : 0;
67 ealen = sizeof(FEA2LIST) + 24L + strlen(eaname) + 1L + (ULONG) len + 4L;
68 switch (type) {
69 case EAT_EA:
70 case EAT_ASCII:
71 break;
72 case EAT_MVST:
73 if (data) {
74 ealen += sizeof(USHORT) * 5;
75 p = data;
76 while (*p) {
77 if (*p == '\n' && *(p + 1))
78 ealen += sizeof(USHORT);
79 p++;
80 }
81 }
82 break;
83 case EAT_MVMT:
84 if (data) {
85 ealen += sizeof(USHORT) * 5;
86 p = data;
87 while (*p) {
88 if (*p == '\n' && *(p + 1))
89 ealen += (sizeof(USHORT) * 2);
90 p++;
91 }
92 }
93 break;
94 default:
95 return ret;
96 }
97
98 rc = DosAllocMem((PPVOID) & pfealist, ealen, PAG_COMMIT | PAG_READ |
99 PAG_WRITE | OBJ_TILE);
100 if (rc || !pfealist)
101 Dos_Error(MB_CANCEL, rc, hwnd, pszSrcFile, __LINE__,
102 GetPString(IDS_OUTOFMEMORY));
103 else {
104 memset(pfealist, 0, ealen);
105 pfealist->list[0].cbName = strlen(eaname);
106 memcpy(pfealist->list[0].szName, eaname, pfealist->list[0].cbName + 1);
107 eaval = pfealist->list[0].szName + pfealist->list[0].cbName + 1;
108 switch (type) {
109 case EAT_EA:
110 case EAT_ASCII:
111 if (data) {
112 *(USHORT *) eaval = (USHORT) type;
113 eaval += sizeof(USHORT);
114 *(USHORT *) eaval = (USHORT) len;
115 eaval += sizeof(USHORT);
116 memcpy(eaval, data, len);
117 eaval += len;
118 }
119 break;
120 case EAT_MVST:
121 if (data) {
122 *(USHORT *) eaval = (USHORT) EAT_MVST;
123 eaval += sizeof(USHORT);
124 *(USHORT *) eaval = usCodepage;
125 eaval += sizeof(USHORT);
126 num = (USHORT *) eaval;
127 *num = 0;
128 eaval += sizeof(USHORT);
129 *(USHORT *) eaval = (USHORT) EAT_ASCII;
130 eaval += sizeof(USHORT);
131 plen = (USHORT *) eaval;
132 *plen = 0;
133 eaval += sizeof(USHORT);
134 p = data;
135 while (*p) {
136 while (*p) {
137 if (*p == '\n') {
138 p++;
139 break;
140 }
141 *eaval++ = *p++;
142 (*plen)++;
143 }
144 if (*p || *plen)
145 (*num)++;
146 if (*p) {
147 plen = (USHORT *) eaval;
148 *plen = 0;
149 eaval += sizeof(USHORT);
150 }
151 }
152 }
153 break;
154 case EAT_MVMT:
155 if (data) {
156 *(USHORT *) eaval = (USHORT) EAT_MVMT;
157 eaval += sizeof(USHORT);
158 *(USHORT *) eaval = usCodepage;
159 eaval += sizeof(USHORT);
160 num = (USHORT *) eaval;
161 *num = 0;
162 eaval += sizeof(USHORT);
163 *(USHORT *) eaval = (USHORT) EAT_ASCII;
164 eaval += sizeof(USHORT);
165 plen = (USHORT *) eaval;
166 *plen = 0;
167 eaval += sizeof(USHORT);
168 p = data;
169 while (*p) {
170 while (*p) {
171 if (*p == '\n') {
172 p++;
173 break;
174 }
175 *eaval++ = *p++;
176 (*plen)++;
177 }
178 if (*p || *plen)
179 (*num)++;
180 if (*p) {
181 *(USHORT *) eaval = (USHORT) EAT_ASCII;
182 eaval += sizeof(USHORT);
183 plen = (USHORT *) eaval;
184 *plen = 0;
185 eaval += sizeof(USHORT);
186 }
187 }
188 }
189 break;
190 }
191 pfealist->list[0].cbValue = (ULONG) (eaval -
192 (pfealist->list[0].szName +
193 pfealist->list[0].cbName + 1));
194 memset(&eaop, 0, sizeof(eaop));
195 eaop.fpFEA2List = pfealist;
196 pfealist->cbList = 13L + (ULONG) pfealist->list[0].cbName +
197 (ULONG) pfealist->list[0].cbValue;
198 rc = DosSetPathInfo(filename, FIL_QUERYEASIZE, (PVOID) & eaop,
199 (ULONG) sizeof(EAOP2), DSPI_WRTTHRU);
200 DosFreeMem(pfealist);
201 if (!rc)
202 ret = TRUE;
203 }
204 return ret;
205}
206
207BOOL PutComments(HWND hwnd, CHAR * filename, CHAR * comments)
208{
209 register CHAR *p;
210
211 if (comments) { /* check -- is it empty? */
212 p = comments;
213 while (*p && isspace(*p))
214 p++;
215 if (!*p)
216 comments = NULL;
217 }
218 return WriteEA(hwnd, filename, ".COMMENTS", EAT_MVMT, comments);
219}
220
221static PSZ pszBufOvfMsg = "Buffer overflow";
222
223ULONG CreateHexDump(CHAR * pchInBuf, ULONG cbInBuf,
224 CHAR * pchOutBuf, ULONG cbOutBuf,
225 ULONG cOffset, BOOL fLongAddr)
226{
227 register CHAR *pchIn, *pchReset, *pchOut;
228 register ULONG ibIn = 0, ibIn2, ibInFill;
229 ULONG cbOutLine = 6 + (fLongAddr ? 4 : 0) + 16 * 3 + 1 + 16 + 1;
230
231 if (pchInBuf && cbInBuf && pchOutBuf && cbOutBuf) {
232 pchIn = pchInBuf;
233 pchOut = pchOutBuf;
234 if (cOffset)
235 *pchOut++ = '\n';
236 while (ibIn < cbInBuf) {
237 if (pchOut - pchOutBuf + cbOutLine >= cbOutBuf) {
238 Runtime_Error(pszSrcFile, __LINE__, pszBufOvfMsg);
239 break;
240 }
241 pchReset = pchIn;
242 ibIn2 = ibIn;
243 if (fLongAddr)
244 sprintf(pchOut, "%08lx ", ibIn + cOffset);
245 else
246 sprintf(pchOut, "%04lx ", ibIn + cOffset);
247 pchOut += 6 + (fLongAddr ? 4 : 0);
248 do {
249 sprintf(pchOut, "%02hx ", *pchIn);
250 pchOut += 3;
251 pchIn++;
252 ibIn++;
253 } while (ibIn < cbInBuf && (ibIn % 16));
254 if (ibIn % 16) {
255 ibInFill = ibIn;
256 while (ibInFill % 16) {
257 *pchOut++ = ' ';
258 *pchOut++ = ' ';
259 *pchOut++ = ' ';
260 ibInFill++;
261 }
262 }
263 *pchOut++ = ' ';
264 pchIn = pchReset;
265 do {
266 if (*pchIn && *pchIn != '\n' && *pchIn != '\r' && *pchIn != '\t'
267 && *pchIn != '\x1a')
268 *pchOut++ = *pchIn++;
269 else {
270 *pchOut++ = '.';
271 pchIn++;
272 }
273 ibIn2++;
274 } while (ibIn2 < ibIn);
275 if (ibIn < cbInBuf)
276 *pchOut++ = '\n';
277 } // while ibIn
278 *pchOut = 0;
279 return (ULONG) (pchOut - pchOutBuf);
280 }
281 return 0L;
282}
283
284MRESULT EXPENTRY AutoObjProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
285{
286 switch (msg) {
287 case UM_LOADFILE:
288 *currfile = 0;
289 stopflag--;
290 if (fAutoView) {
291 WinSetWindowText((fComments) ? hwndAutoMLE : hwndAutoview, "");
292 MLEsetreadonly(hwndAutoMLE, TRUE);
293 MLEsetchanged(hwndAutoMLE, FALSE);
294 }
295 if (mp1) {
296 if (fAutoView) {
297 strcpy(currfile, (CHAR *) mp1);
298 if (!fComments) {
299 if (IsFile((CHAR *) mp1) == 1) {
300
301 HFILE handle;
302 ULONG action, olen, ibufflen, obufflen, l;
303 CHAR *ibuff, *obuff, *p, buffer[80];
304 ARC_TYPE *info;
305
306 if (!DosOpen((CHAR *) mp1,
307 &handle,
308 &action,
309 0L,
310 0L,
311 OPEN_ACTION_FAIL_IF_NEW | OPEN_ACTION_OPEN_IF_EXISTS,
312 OPEN_FLAGS_FAIL_ON_ERROR | OPEN_FLAGS_NOINHERIT |
313 OPEN_FLAGS_RANDOMSEQUENTIAL | OPEN_SHARE_DENYNONE |
314 OPEN_ACCESS_READONLY, 0L)) {
315 ibufflen = (AutoviewHeight < 96) ? 512 : 3072;
316 ibuff = xmalloc(ibufflen + 2, pszSrcFile, __LINE__);
317 if (ibuff) {
318 // Depends on CreateHexDump line width
319 obufflen = (ibufflen / 16) * (6 + 3 * 16 + 1 + 16 + 1) + 80;
320 obuff = xmalloc(obufflen + 1, pszSrcFile, __LINE__);
321 if (obuff) {
322 *obuff = 0;
323 if (!DosRead(handle,
324 ibuff, ibufflen, &ibufflen) && 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 && *info->signature) {
335 l = strlen(info->signature);
336 l = min(l, 79);
337 if (!DosChgFilePtr(handle, abs(info->file_offset),
338 (info->file_offset >= 0L) ?
339 FILE_BEGIN :
340 FILE_END, &ibufflen)) {
341 if (!DosRead(handle,
342 buffer,
343 l, &ibufflen) && ibufflen == l) {
344 if (!memcmp(info->signature, buffer, 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 Runtime_Error(pszSrcFile, __LINE__, pszBufOvfMsg);
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 CHAR fullname[CCHMAXPATH + 4];
415 HDIR hdir = HDIR_CREATE;
416 ULONG x, nm, ml, mc, bufflen;
417 PBYTE fb;
418 PFILEFINDBUF4 pffbFile;
419 PSZ pszBuf;
420 PSZ p;
421 APIRET rc;
422
423 BldFullPathName(fullname, currfile, "*");
424 //sprintf(fullname,
425 // "%s%s*",
426 // currfile,
427 // (currfile[strlen(currfile) - 1] == '\\') ? "" : "\\");
428 DosError(FERR_DISABLEHARDERR);
429 nm = sizeof(ffb) / sizeof(FILEFINDBUF4);
430 if (AutoviewHeight < 96)
431 nm /= 2;
432 rc = DosFindFirst(fullname,
433 &hdir,
434 FILE_NORMAL | FILE_DIRECTORY |
435 FILE_READONLY | FILE_ARCHIVED |
436 FILE_SYSTEM | FILE_HIDDEN,
437 &ffb, sizeof(ffb), &nm, 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 pszBuf = xmalloc(bufflen, pszSrcFile, __LINE__);
453 if (pszBuf) {
454 p = pszBuf;
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 - pszBuf >= bufflen)
498 Runtime_Error(pszSrcFile, __LINE__, pszBufOvfMsg);
499 if (*pszBuf)
500 WinSetWindowText(hwndAutoview, pszBuf);
501 free(pszBuf);
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, *pszBuf, *p, *data;
517 USHORT len, type, plen, dlen;
518 BOOL readonly = FALSE;
519
520 pgealist = xmallocz(sizeof(GEA2LIST) + 64, pszSrcFile, __LINE__);
521 if (pgealist) {
522 pgea = &pgealist->list[0];
523 strcpy(pgea->szName, ".COMMENTS");
524 pgea->cbName = strlen(pgea->szName);
525 pgea->oNextEntryOffset = 0L;
526 pgealist->cbList = (sizeof(GEA2LIST) + pgea->cbName);
527 pfealist = xmallocz(65536, pszSrcFile, __LINE__);
528 if (pfealist) {
529 pfealist->cbList = 65536;
530 eaop.fpGEA2List = pgealist;
531 eaop.fpFEA2List = pfealist;
532 eaop.oError = 0L;
533 rc = DosQueryPathInfo((CHAR *) mp1, FIL_QUERYEASFROMLIST,
534 (PVOID) & eaop, (ULONG) sizeof(EAOP2));
535 free(pgealist);
536 if (!rc) {
537 pfea = &eaop.fpFEA2List->list[0];
538 if (pfea->cbName && pfea->cbValue) {
539 value = pfea->szName + pfea->cbName + 1;
540 value[pfea->cbValue] = 0;
541 if (*(USHORT *) value == EAT_MVMT) {
542 pszBuf = xmalloc(65536, pszSrcFile, __LINE__);
543 if (pszBuf) {
544 p = pszBuf;
545 *pszBuf = 0;
546 data = value + (sizeof(USHORT) * 3);
547 type = *(USHORT *) data;
548 data += sizeof(USHORT);
549 len = *(USHORT *) data;
550 data += sizeof(USHORT);
551 while ((data - value) - len < pfea->cbValue) {
552 if (type == EAT_ASCII) {
553 dlen = plen = 0;
554 while (dlen < len) {
555 if (data[dlen] == '\r') {
556 dlen++;
557 if (dlen < len && data[dlen] != '\n')
558 p[plen++] = '\n';
559 }
560 else
561 p[plen++] = data[dlen++];
562 }
563 if ((!len || !plen || p[plen - 1] != '\n') &&
564 (data - value) + len < pfea->cbValue)
565 p[plen++] = '\n';
566 p += plen;
567 *p = 0;
568 }
569 else
570 readonly = TRUE;
571 data += len;
572 if (data - value >= pfea->cbValue)
573 break;
574 type = *(USHORT *) data;
575 data += sizeof(USHORT);
576 len = *(USHORT *) data;
577 data += sizeof(USHORT);
578 } // while
579 if (p - pszBuf >= 65536) {
580 Runtime_Error(pszSrcFile, __LINE__, pszBufOvfMsg);
581 pszBuf[65535] = 0; // Try to stay alive
582 break;
583 }
584 WinSetWindowText(hwndAutoMLE, pszBuf);
585 free(pszBuf);
586 }
587 }
588 else
589 readonly = TRUE;
590 }
591 /* else EA not present */
592 MLEsetchanged(hwndAutoMLE, FALSE);
593 MLEsetreadonly(hwndAutoMLE, readonly);
594 }
595 else {
596 MLEsetchanged(hwndAutoMLE, FALSE);
597 MLEsetreadonly(hwndAutoMLE, FALSE);
598 }
599 free(pfealist);
600 }
601 }
602 }
603 }
604 free((CHAR *) mp1);
605 }
606 return 0;
607
608 case UM_CLOSE:
609 if (!PostMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID))
610 WinSendMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID);
611 WinDestroyWindow(hwnd);
612 return 0;
613 }
614 return WinDefWindowProc(hwnd, msg, mp1, mp2);
615}
616
617static VOID MakeAutoWinThread(VOID * args)
618{
619 HAB hab2;
620 HMQ hmq2;
621 HWND hwndParent = (HWND) args;
622 QMSG qmsg2;
623
624 hab2 = WinInitialize(0);
625 if (hab2) {
626 hmq2 = WinCreateMsgQueue(hab2, 128);
627 if (hmq2) {
628 DosError(FERR_DISABLEHARDERR);
629 WinRegisterClass(hab2,
630 WC_OBJECTWINDOW,
631 AutoObjProc, 0, sizeof(PVOID));
632 hwndAutoObj = WinCreateWindow(HWND_OBJECT,
633 WC_OBJECTWINDOW,
634 (PSZ) NULL,
635 0,
636 0L,
637 0L,
638 0L,
639 0L, 0L, HWND_TOP, OBJ_FRAME, NULL, NULL);
640 if (!hwndAutoObj) {
641 Win_Error2(HWND_OBJECT, HWND_DESKTOP, pszSrcFile, __LINE__,
642 IDS_WINCREATEWINDOW);
643 if (!PostMsg(hwndParent, UM_CLOSE, MPVOID, MPVOID))
644 WinSendMsg(hwndParent, UM_CLOSE, MPVOID, MPVOID);
645 }
646 else {
647 WinSetWindowULong(hwndAutoObj, QWL_USER, hwndParent);
648 priority_normal();
649 while (WinGetMsg(hab2, &qmsg2, (HWND) 0, 0, 0))
650 WinDispatchMsg(hab2, &qmsg2);
651 WinDestroyWindow(hwndAutoObj);
652 hwndAutoObj = (HWND) 0;
653 }
654 WinDestroyMsgQueue(hmq2);
655 }
656 else
657 WinTerminate(hab2);
658 }
659}
660
661MRESULT EXPENTRY AutoViewProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
662{
663 USHORT id = WinQueryWindowUShort(hwnd, QWS_ID);
664
665 switch (msg) {
666 case WM_CREATE:
667 {
668 MRESULT mr;
669
670 if (!hwndAutoObj) {
671 if (_beginthread(MakeAutoWinThread, NULL, 65536, (PVOID) hwnd) == -1) {
672 Runtime_Error(pszSrcFile, __LINE__,
673 GetPString(IDS_COULDNTSTARTTHREADTEXT));
674 PostMsg(hwnd, UM_CLOSE, MPVOID, MPVOID);
675 }
676 }
677 mr = PFNWPStatic(hwnd, msg, mp1, mp2);
678 SetPresParams(hwnd,
679 &RGBGREY,
680 &RGBBLACK, &RGBGREY, GetPString(IDS_4SYSTEMVIOTEXT));
681 stopflag = 0;
682 return mr;
683 }
684
685 case UM_SETUP:
686 MLEsetlimit(hwnd, 32768);
687 MLEsetformat(hwnd, MLFIE_NOTRANS);
688 MLEsetchanged(hwnd, FALSE);
689 return 0;
690
691 case WM_BUTTON1DOWN:
692 {
693 SWP swp;
694
695 WinQueryWindowPos(hwnd, &swp);
696 if (SHORT2FROMMP(mp1) > swp.cy - 4) {
697
698 HPS hps = WinGetPS(WinQueryWindow(hwnd, QW_PARENT));
699 SWP swpC;
700 TRACKINFO track;
701
702 if (hps) {
703 WinQueryWindowPos(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
704 FID_CLIENT), &swpC);
705 track.cxBorder = 4;
706 track.cyBorder = 4;
707 track.cxGrid = 1;
708 track.cyGrid = 8;
709 track.cxKeyboard = 8;
710 track.rclTrack.yBottom = swp.y;
711 track.rclTrack.yTop = swp.y + swp.cy;
712 track.rclTrack.xLeft = swp.x;
713 track.rclTrack.xRight = swp.x + swp.cx;
714 track.rclBoundary = track.rclTrack;
715 track.rclBoundary.yTop = (swpC.cy + swp.y + swp.cy) - 116;
716 track.ptlMinTrackSize.x = swp.x + swp.cx;
717 track.ptlMinTrackSize.y = 36;
718 track.ptlMaxTrackSize.x = swp.x + swp.cx;
719 track.ptlMaxTrackSize.y = (swpC.cy + swp.cy) - 116;
720 track.fs = TF_TOP;
721 if (WinTrackRect(hwnd, hps, &track)) {
722 AutoviewHeight = track.rclTrack.yTop - track.rclTrack.yBottom;
723 PrfWriteProfileData(fmprof,
724 FM3Str,
725 "AutoviewHeight",
726 &AutoviewHeight, sizeof(ULONG));
727 WinSendMsg(WinQueryWindow(hwnd, QW_PARENT),
728 WM_UPDATEFRAME, MPFROMLONG(FCF_SIZEBORDER), MPVOID);
729 }
730 WinReleasePS(hps);
731 }
732 return (MRESULT) TRUE;
733 }
734 else if (id != MAIN_AUTOVIEWMLE)
735 return CommonTextButton(hwnd, msg, mp1, mp2);
736 }
737 break;
738
739 case WM_BUTTON3DOWN:
740 case WM_BUTTON1UP:
741 case WM_BUTTON3UP:
742 if (id != MAIN_AUTOVIEWMLE)
743 return CommonTextButton(hwnd, msg, mp1, mp2);
744 break;
745
746 case WM_MOUSEMOVE:
747 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
748 {
749 SWP swp;
750
751 WinQueryWindowPos(hwnd, &swp);
752 if (SHORT2FROMMP(mp1) > swp.cy - 4) {
753 WinSetPointer(HWND_DESKTOP, hptrNS);
754 return (MRESULT) TRUE;
755 }
756 }
757 break;
758
759 case WM_PAINT:
760 PostMsg(hwnd, UM_PAINT, MPVOID, MPVOID);
761 break;
762
763 case UM_PAINT:
764 PaintRecessedWindow(hwnd, (HPS) 0, TRUE, TRUE);
765 return 0;
766
767 case WM_SETFOCUS:
768 switch (id) {
769 case MAIN_AUTOVIEWMLE:
770 if (!mp2 && !AutoMenu) {
771 if (*currfile) {
772 if (MLEgetchanged(hwnd)) {
773 CHAR *ea = xmalloc(32768, pszSrcFile, __LINE__);
774
775 if (ea) {
776 *ea = 0;
777 WinQueryWindowText(hwnd, 32767, ea);
778 PutComments(hwnd, currfile, ea);
779 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_RESCAN, 0), MPVOID);
780 free(ea);
781 }
782 }
783 }
784 }
785 break;
786 default:
787 if (mp2)
788 PostMsg(hwnd, UM_FOCUSME, mp1, mp2);
789 break;
790 }
791 break;
792
793 case UM_FOCUSME:
794 if (mp2) {
795
796 PID pid;
797 TID tid;
798
799 if (WinQueryWindowProcess((HWND) mp1, &pid, &tid) && pid == mypid)
800 WinSetFocus(HWND_DESKTOP, (HWND) mp1);
801 else
802 WinSetFocus(HWND_DESKTOP, hwndTree);
803 }
804 return 0;
805
806 case UM_CLICKED:
807 case UM_CLICKED3:
808 if (id != MAIN_AUTOVIEWMLE) {
809 PostMsg(hwnd,
810 WM_COMMAND,
811 MPFROM2SHORT(((msg == UM_CLICKED3) ?
812 IDM_EAS : IDM_VIEWORARC), 0), MPVOID);
813 }
814 return 0;
815
816 case WM_COMMAND:
817 PostMsg(hwnd, UM_COMMAND, mp1, mp2);
818 return 0;
819
820 case UM_COMMAND:
821 switch (SHORT1FROMMP(mp1)) {
822 case IDM_RESCAN:
823 if (*currfile) {
824
825 CHAR *cf = xstrdup(currfile, pszSrcFile, __LINE__);
826
827 if (cf) {
828 stopflag++;
829 if (!PostMsg(hwndAutoObj, UM_LOADFILE, MPFROMP(cf), MPVOID))
830 free(cf);
831 }
832 }
833 break;
834
835 case IDM_INFO:
836 DefaultView(hwnd, (HWND) 0, hwndMain, NULL, 16, currfile);
837 break;
838
839 case IDM_VIEW:
840 DefaultView(hwnd, (HWND) 0, hwndMain, NULL, 0, currfile);
841 break;
842
843 case IDM_EDIT:
844 DefaultView(hwnd, (HWND) 0, hwndMain, NULL, 8, currfile);
845 break;
846
847 case IDM_EAS:
848 {
849 char *list[2];
850
851 list[0] = currfile;
852 list[1] = NULL;
853
854 WinDlgBox(HWND_DESKTOP,
855 hwndMain,
856 DisplayEAsProc, FM3ModHandle, EA_FRAME, (PVOID) list);
857 }
858 break;
859
860 default:
861 PostMsg(hwndMain, msg, mp1, mp2);
862 }
863 return 0;
864
865 case WM_MENUEND:
866 if ((HWND) mp2 == AutoMenu) {
867 WinDestroyWindow(AutoMenu);
868 AutoMenu = (HWND) 0;
869 }
870 break;
871
872 case WM_CONTEXTMENU:
873 CheckMenu(&AutoMenu, (id == MAIN_AUTOVIEWMLE) ?
874 IDM_AUTOVIEWMLE : IDM_AUTOVIEW);
875 WinCheckMenuItem(AutoMenu, IDM_AUTOVIEWFILE, !fComments);
876 WinCheckMenuItem(AutoMenu, IDM_AUTOVIEWCOMMENTS, fComments);
877 WinEnableMenuItem(AutoMenu, IDM_VIEW, (IsFile(currfile) == 1));
878 WinEnableMenuItem(AutoMenu, IDM_EDIT, (IsFile(currfile) == 1));
879 WinEnableMenuItem(AutoMenu, IDM_INFO, (*currfile != 0));
880 PopupMenu(hwnd, hwnd, AutoMenu);
881 break;
882
883 case UM_LOADFILE:
884 stopflag++;
885 if (!PostMsg(hwndAutoObj, msg, mp1, mp2)) {
886 if (mp1)
887 free((CHAR *) mp1);
888 }
889 return 0;
890
891 case UM_CLOSE:
892 if (AutoMenu) {
893 WinDestroyWindow(AutoMenu);
894 AutoMenu = (HWND) 0;
895 }
896 WinDestroyWindow(hwnd);
897 return 0;
898
899 case WM_CLOSE:
900 WinSendMsg(hwnd, UM_CLOSE, MPVOID, MPVOID);
901 return 0;
902
903 case WM_DESTROY:
904 if (id != MAIN_AUTOVIEWMLE) {
905 if (hwndAutoObj)
906 if (!PostMsg(hwndAutoObj, WM_CLOSE, MPVOID, MPVOID))
907 WinSendMsg(hwndAutoObj, WM_CLOSE, MPVOID, MPVOID);
908 break;
909 }
910 break;
911 }
912
913 if (id == MAIN_AUTOVIEWMLE)
914 return PFNWPMLE(hwnd, msg, mp1, mp2);
915 return PFNWPStatic(hwnd, msg, mp1, mp2);
916}
Note: See TracBrowser for help on using the repository browser.