source: trunk/dll/autoview.c@ 872

Last change on this file since 872 was 872, checked in by Gregg Young, 18 years ago

Fix failure of font changes and font colors on main menus (tickets 27 & 162)

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