source: trunk/dll/newview.c@ 562

Last change on this file since 562 was 551, checked in by Gregg Young, 19 years ago

Indentation cleanup

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 107.0 KB
RevLine 
[83]1
2/***********************************************************************
3
4 $Id: newview.c 551 2007-02-28 01:33:51Z gyoung $
5
6 New internal viewer
7
8 Copyright (c) 1993-98 M. Kimes
[350]9 Copyright (c) 2001, 2006 Steven H. Levine
[83]10
[130]11 01 Dec 03 SHL Comments
12 02 Dec 03 SHL Correct WM_VSCROLL math
13 23 May 05 SHL Use QWL_USER
[191]14 06 Jun 05 SHL Indent -i2
[218]15 06 Jun 05 SHL Correct reversed wrap logic
[350]16 17 Jul 06 SHL Use Runtime_Error
[368]17 26 Jul 06 SHL Use chop_at_crnl and convert_nl_to_nul
[533]18 03 Nov 06 SHL Renames
19 03 Nov 06 SHL Count thread usage
[83]20
21***********************************************************************/
22
[2]23#define INCL_DOS
24#define INCL_WIN
25#define INCL_GPI
[350]26#include <os2.h>
[2]27
28#include <stdlib.h>
29#include <stdio.h>
30#include <string.h>
31#include <ctype.h>
32#include <process.h>
33#include <limits.h>
34#include <share.h>
[350]35
[2]36#include "fm3dll.h"
37#include "fm3dlg.h"
38#include "fm3str.h"
39#include "mle.h"
40
41#pragma data_seg(DATA2)
[350]42
43static PSZ pszSrcFile = __FILE__;
44
[533]45#pragma alloc_text(NEWVIEW,ViewStatusProc,FreeViewerMem,LoadFileThread)
[2]46#pragma alloc_text(NEWVIEW,InitWindow,PaintLine,ViewWndProc)
[533]47#pragma alloc_text(NEWVIEW,ViewFrameWndProc,StartViewer,ReLineThread)
48#pragma alloc_text(NEWVIEW,BuildAList,SearchThread,ClipboardThread,FindStrDlgProc)
[2]49#pragma alloc_text(NEWVIEW,BuildAList2,UrlDlgProc)
50
51#define VF_SELECTED 0x01
52#define VF_FOUND 0x02
53#define VF_HTTP 0x04
54#define VF_FTP 0x08
55
56#define FIXED_FONT_LCID 5
57
58#define COLORS_MAX 12
59
60#define COLORS_CURSOREDNORMALBACK 0
61#define COLORS_CURSOREDSELECTEDBACK 1
62#define COLORS_NORMALBACK 2
63#define COLORS_SELECTEDBACK 3
64#define COLORS_NORMALFORE 4
65#define COLORS_FOUNDFORE 5
66#define COLORS_SELECTEDFORE 6
67#define COLORS_SELECTEDFOUNDFORE 7
68#define COLORS_HTTPBACK 8
69#define COLORS_HTTPFORE 9
70#define COLORS_FTPBACK 10
71#define COLORS_FTPFORE 11
72
[551]73static LONG Colors[COLORS_MAX] = { COLR_WHITE, COLR_DARKGRAY,
74 COLR_PALEGRAY, COLR_BLACK,
75 COLR_BLACK, COLR_RED,
76 COLR_WHITE, COLR_YELLOW,
77 COLR_PALEGRAY, COLR_DARKBLUE,
78 COLR_PALEGRAY, COLR_DARKGREEN
79};
[2]80
81#define SEARCHSTRINGLEN 1024
82
[191]83typedef struct
84{
85 USHORT size;
86 USHORT flags;
87 USHORT cliptype;
88 CHAR filename[CCHMAXPATH];
89 CHAR *text;
90 CHAR **lines, *markedlines;
91 CHAR searchtext[SEARCHSTRINGLEN], *lastpos, szFacename[FACESIZE];
92 ULONG textsize, numlines, topline, cursored, selected, numalloc, multiplier,
[551]93 lastselected, found;
[191]94 CHAR stopflag, busy;
95 LONG oldwidth, lastdirection, lMaxAscender, lMaxDescender, lMaxHeight,
[551]96 maxx, horzscroll;
[191]97 BOOL hex, mousecaptured, sensitive, dummy, literalsearch, clientfocused,
[551]98 alsoselect, wrapon, relining, httpin, ftpin, ignorehttp, ignoreftp,
99 needrefreshing;
[191]100 HMTX ScanSem;
101 HWND hvscroll, hwndMenu, hwndStatus1, hwndStatus2, hwndStatus3, hwndRestore,
[551]102 hwndPopup, hwndListbox, hwndFrame, hwndDrag, hwndParent, hhscroll;
[191]103 HPS hps;
104 FATTRS fattrs;
105 LONG colors[12];
106}
107VIEWDATA;
[2]108
[191]109typedef struct
110{
[2]111 USHORT size;
112 USHORT dummy;
[191]113 ULONG len;
114 CHAR *line;
115 CHAR url[SEARCHSTRINGLEN];
116}
117URLDATA;
[2]118
[191]119static BOOL Sensitive = FALSE;
120static USHORT Codepage = 0;
121static BOOL Firsttime = TRUE;
122static BOOL LiteralSearch = FALSE;
123static BOOL AlsoSelect = FALSE;
124static BOOL WrapOn = FALSE;
125static BOOL IgnoreFTP = FALSE;
126static BOOL IgnoreHTTP = FALSE;
[2]127static FATTRS Fattrs;
128
[191]129MRESULT EXPENTRY UrlDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[83]130{
[2]131 URLDATA *urld;
132
[551]133 switch (msg) {
[191]134 case WM_INITDLG:
[551]135 if (mp2) {
[191]136 CHAR *p, *e, *pp;
137 SHORT count;
[2]138
[191]139 WinSetWindowPtr(hwnd, QWL_USER, mp2);
140 urld = mp2;
[551]141 e = urld->line + urld->len + 1;
142 p = urld->line;
143 do {
[191]144 p = strnstr(p, "http://", e - p);
[551]145 if (p) {
146 strncpy(urld->url, p, min(e - p, SEARCHSTRINGLEN - 1));
147 urld->url[min(e - p, SEARCHSTRINGLEN - 1)] = 0;
148 pp = urld->url;
[191]149 while (*pp && *pp != ' ' && *pp != '\r' && *pp != '\n' &&
150 *pp != '\"')
151 pp++;
152 *pp = 0;
153 WinSendDlgItemMsg(hwnd, URL_LISTBOX, LM_INSERTITEM,
[551]154 MPFROM2SHORT(LIT_END, 0), MPFROMP(urld->url));
[191]155 p++;
156 }
[2]157 }
[191]158 while (p && *p && p < e);
[551]159 p = urld->line;
160 do {
[191]161 p = strnstr(p, "ftp://", e - p);
[551]162 if (p) {
163 strncpy(urld->url, p, min(e - p, SEARCHSTRINGLEN - 1));
164 urld->url[min(e - p, SEARCHSTRINGLEN - 1)] = 0;
165 pp = urld->url;
[191]166 while (*pp && *pp != ' ' && *pp != '\r' && *pp != '\n' &&
167 *pp != '\"')
168 pp++;
169 *pp = 0;
170 WinSendDlgItemMsg(hwnd, URL_LISTBOX, LM_INSERTITEM,
[551]171 MPFROM2SHORT(LIT_END, 0), MPFROMP(urld->url));
[191]172 p++;
173 }
174 }
175 while (p && *p && p < e);
[551]176 *urld->url = 0;
[191]177 count = (SHORT) WinSendDlgItemMsg(hwnd, URL_LISTBOX, LM_QUERYITEMCOUNT,
178 MPVOID, MPVOID);
[551]179 if (count) {
[191]180 WinSendDlgItemMsg(hwnd, URL_LISTBOX, LM_SELECTITEM,
181 MPFROMSHORT(0), MPFROMSHORT(TRUE));
182 if (count == 1)
183 WinSendMsg(hwnd, WM_COMMAND, MPFROM2SHORT(DID_OK, 0), MPVOID);
184 else
185 PostMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
186 break;
187 }
188 }
189 WinDismissDlg(hwnd, 0);
190 break;
[2]191
[191]192 case UM_SETUP:
193 WinShowWindow(hwnd, TRUE);
194 return 0;
[2]195
[191]196 case WM_CONTROL:
[551]197 switch (SHORT1FROMMP(mp1)) {
[191]198 case URL_LISTBOX:
[551]199 switch (SHORT2FROMMP(mp1)) {
[191]200 case LN_ENTER:
201 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(DID_OK, 0), MPVOID);
202 break;
[2]203 }
[191]204 break;
205 }
206 return 0;
[2]207
[191]208 case WM_COMMAND:
[551]209 switch (SHORT1FROMMP(mp1)) {
[191]210 case URL_BOOKMARK:
211 WinDismissDlg(hwnd, 3);
212 break;
[2]213
[191]214 case DID_OK:
215 {
216 SHORT select;
[2]217
[191]218 urld = WinQueryWindowPtr(hwnd, QWL_USER);
[551]219 if (urld) {
[191]220 select = (SHORT) WinSendDlgItemMsg(hwnd, URL_LISTBOX,
221 LM_QUERYSELECTION,
[551]222 MPFROMSHORT(LIT_FIRST), MPVOID);
223 if (select >= 0) {
224 *urld->url = 0;
[191]225 WinSendDlgItemMsg(hwnd, URL_LISTBOX, LM_QUERYITEMTEXT,
[551]226 MPFROM2SHORT(select, sizeof(urld->url)),
227 MPFROMP(urld->url));
228 if (*urld->url) {
229 if (!strncmp(urld->url, "http://", 7)) {
[191]230 WinDismissDlg(hwnd, 1);
231 break;
232 }
[551]233 else if (!strncmp(urld->url, "ftp://", 6)) {
234 memmove(urld->url, urld->url + 6, strlen(urld->url) + 1);
235 if (*urld->url) {
[191]236 WinDismissDlg(hwnd, 2);
237 break;
238 }
239 }
240 }
241 }
242 }
243 }
[350]244 Runtime_Error(pszSrcFile, __LINE__, "no data");
[191]245 break;
[2]246
[191]247 case DID_CANCEL:
248 WinDismissDlg(hwnd, 0);
249 break;
[2]250
[191]251 case IDM_HELP:
252 break;
253 }
254 return 0;
[2]255 }
[191]256 return WinDefDlgProc(hwnd, msg, mp1, mp2);
[2]257}
258
[191]259static ULONG NumLines(RECTL * rcl, VIEWDATA * ad)
[83]260{
[2]261 ULONG numlines;
262
[551]263 numlines = (rcl->yTop - rcl->yBottom) / ad->lMaxHeight;
264 if (ad->lMaxDescender && numlines &&
265 ((rcl->yTop - rcl->yBottom) -
266 (numlines * ad->lMaxHeight) <= ad->lMaxDescender))
[2]267 numlines--;
268 return numlines;
269}
270
[191]271static CHAR **BuildAList(HWND hwnd)
[83]272{
[191]273 VIEWDATA *ad = WinQueryWindowPtr(hwnd, QWL_USER);
274 register ULONG x, y, z = 0;
275 ULONG width;
276 RECTL Rectl;
277 CHAR **list = NULL, s[SEARCHSTRINGLEN], a;
278 register CHAR *p, *e;
279 INT numlines = 0, numalloc = 0;
[2]280
[551]281 if (ad && ad->selected) {
[191]282 WinQueryWindowRect(hwnd, &Rectl);
[551]283 width = (Rectl.xRight - Rectl.xLeft) / ad->fattrs.lAveCharWidth;
284 if (!width && !ad->hex)
[2]285 return list;
[551]286 for (x = 0; x < ad->numlines; x++) {
287 if (ad->stopflag)
[191]288 break;
[551]289 if (ad->markedlines[x] & VF_SELECTED) {
290 if (ad->hex) {
291 width = ad->textsize - (x * 16);
[191]292 width = min(width, 16);
293 sprintf(s, "%08lx ", x * 16);
294 p = s + 9;
[551]295 for (y = 0; y < width; y++) {
296 sprintf(p, " %02hx", ad->text[(x * 16) + y]);
[191]297 p += 3;
298 }
299 *p = ' ';
300 p++;
301 *p = ' ';
302 p++;
[551]303 for (y = 0; y < width; y++) {
304 a = ad->text[(x * 16) + y];
[191]305 if (a && a != '\n' && a != '\r' && a != '\t' && a != '\x1a')
[551]306 *p = ad->text[(x * 16) + y];
[191]307 else
308 *p = '.';
309 p++;
310 }
311 *p = 0;
312 }
[551]313 else {
314 if (!ad->wrapon) {
315 e = p = ad->lines[x];
316 while (*e != '\r' && *e != '\n' && e < ad->text + ad->textsize)
[191]317 e++;
[2]318/*
[191]319 if((*e == '\r' || *e == '\n') && e > p)
320 e--;
321 */
322 width = e - p;
323 }
[551]324 else {
325 p = ad->lines[x];
[191]326 e = p + (width - 1);
[551]327 if (e - ad->text > ad->textsize)
328 e = ad->text + ad->textsize;
329 while (p < e) {
330 if (*p == '\r' || *p == '\n') {
[191]331 e = p;
332 break;
333 }
334 p++;
335 }
336 }
[551]337 strncpy(s, ad->lines[x], e - ad->lines[x]);
338 s[e - ad->lines[x]] = 0;
[191]339 }
340 if (AddToList(s, &list, &numlines, &numalloc))
341 break;
342 z++;
[551]343 if (z >= ad->selected)
[191]344 break;
[2]345 }
346 }
347 }
348 return list;
349}
350
[191]351static CHAR **BuildAList2(HWND hwnd)
[83]352{
[191]353 VIEWDATA *ad = WinQueryWindowPtr(hwnd, QWL_USER);
354 CHAR **list = NULL, s[SEARCHSTRINGLEN];
355 SHORT x, z;
356 INT numlines = 0, numalloc = 0;
[2]357
[551]358 if (ad) {
359 z = (SHORT) WinSendDlgItemMsg(ad->hwndFrame, NEWVIEW_LISTBOX,
[191]360 LM_QUERYITEMCOUNT, MPVOID, MPVOID);
361 z = max(z, 0);
[551]362 for (x = 0; x < z; x++) {
363 if (ad->stopflag)
[191]364 break;
[2]365 *s = 0;
[551]366 WinSendDlgItemMsg(ad->hwndFrame, NEWVIEW_LISTBOX, LM_QUERYITEMTEXT,
[191]367 MPFROM2SHORT(x, SEARCHSTRINGLEN), MPFROMP(s));
368 if (*s)
369 if (AddToList(s, &list, &numlines, &numalloc))
370 break;
[2]371 }
372 }
373 return list;
374}
375
[191]376MRESULT EXPENTRY ViewStatusProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[83]377{
[551]378 switch (msg) {
[191]379 case WM_CREATE:
380 return CommonTextProc(hwnd, msg, mp1, mp2);
[2]381
[191]382 case WM_MOUSEMOVE:
383 {
384 USHORT id = WinQueryWindowUShort(hwnd, QWS_ID);
385
[551]386 if (fOtherHelp) {
387 if ((!hwndBubble || WinQueryWindowULong(hwndBubble, QWL_USER) != hwnd)
388 && !WinQueryCapture(HWND_DESKTOP)) {
[2]389
[191]390 char *s = NULL;
[2]391
[551]392 switch (id) {
[191]393 case NEWVIEW_STATUS2:
394 s = GetPString(IDS_NVSTATUS2HELPTEXT);
395 break;
396 case NEWVIEW_STATUS3:
397 s = GetPString(IDS_NVSTATUS3HELPTEXT);
398 break;
399 case NEWVIEW_DRAG:
400 s = GetPString(IDS_NVDRAGHELPTEXT);
401 break;
402 }
403 if (s && *s)
404 MakeBubble(hwnd, TRUE, s);
405 else if (hwndBubble)
406 WinDestroyWindow(hwndBubble);
407 }
[2]408 }
[551]409 switch (id) {
[191]410 case NEWVIEW_STATUS1:
411 break;
412 default:
413 return CommonTextButton(hwnd, msg, mp1, mp2);
414 }
415 }
416 break;
[2]417
[191]418 case WM_BUTTON3UP:
419 case WM_BUTTON1UP:
420 case WM_BUTTON1DOWN:
421 case WM_BUTTON3DOWN:
422 {
423 USHORT id;
424
425 id = WinQueryWindowUShort(hwnd, QWS_ID);
[551]426 switch (id) {
[191]427 case NEWVIEW_STATUS1:
428 break;
429 default:
430 return CommonTextButton(hwnd, msg, mp1, mp2);
[2]431 }
[191]432 }
433 break;
[2]434
[191]435 case UM_CLICKED:
436 case UM_CLICKED3:
437 {
438 USHORT id = WinQueryWindowUShort(hwnd, QWS_ID), cmd = 0;
439
[551]440 switch (id) {
[191]441 case NEWVIEW_DRAG:
442 if (msg == UM_CLICKED)
443 cmd = (msg == UM_CLICKED) ? IDM_HEXMODE : IDM_DESELECTALL;
444 break;
445 case NEWVIEW_STATUS2:
446 cmd = (msg == UM_CLICKED) ? IDM_GOTOLINE : IDM_FINDFIRST;
447 break;
448 case NEWVIEW_STATUS3:
449 cmd = (msg == UM_CLICKED) ? IDM_GOTOOFFSET : IDM_FINDNEXT;
450 break;
451 default:
452 break;
[2]453 }
[191]454 PostMsg(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
455 FID_CLIENT),
[551]456 WM_COMMAND, MPFROM2SHORT(cmd, 0), MPVOID);
[191]457 }
458 return 0;
[2]459
[191]460 case WM_BEGINDRAG:
461 {
462 USHORT id = WinQueryWindowUShort(hwnd, QWS_ID);
463
[551]464 switch (id) {
[191]465 case NEWVIEW_STATUS1:
466 case NEWVIEW_DRAG:
467 {
[551]468 VIEWDATA *ad =
469 WinQueryWindowPtr(WinWindowFromID(WinQueryWindow(hwnd,
470 QW_PARENT),
471 FID_CLIENT), 0);
[2]472
[191]473 if (ad)
474 DragOne(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
[551]475 FID_CLIENT), (HWND) 0, ad->filename,
476 FALSE);
[191]477 }
478 break;
479 default:
480 break;
[2]481 }
[191]482 }
483 break;
[2]484
[191]485 case WM_CONTEXTMENU:
486 PostMsg(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
[551]487 FID_CLIENT), UM_CONTEXTMENU, MPVOID, MPVOID);
[191]488 break;
[2]489
[191]490 case WM_SETFOCUS:
491 if (mp2)
492 PostMsg(hwnd, UM_FOCUSME, MPVOID, MPVOID);
493 break;
[2]494
[191]495 case WM_PAINT:
496 {
497 USHORT id = WinQueryWindowUShort(hwnd, QWS_ID);
498 ULONG color;
499 VIEWDATA *ad = WinQueryWindowPtr(WinWindowFromID(WinQueryWindow(hwnd,
[551]500 QW_PARENT),
501 FID_CLIENT), 0);
[191]502 SWP swp;
503 POINTL ptl;
504 HPS hps;
505
[551]506 switch (id) {
[191]507 case NEWVIEW_STATUS1:
508 PaintRecessedWindow(hwnd, (HPS) 0, FALSE, FALSE);
509 break;
510 default:
511 PaintRecessedWindow(hwnd, (HPS) 0, TRUE, FALSE);
512 break;
[2]513 }
[191]514 hps = WinGetPS(WinQueryWindow(hwnd, QW_PARENT));
[551]515 if (hps) {
[191]516 WinQueryWindowPos(hwnd, &swp);
517 ptl.x = swp.x - 1;
518 ptl.y = swp.y + swp.cy + 2;
519 GpiMove(hps, &ptl);
[551]520 switch (id) {
[191]521 case NEWVIEW_STATUS1:
522 if (ad)
[551]523 color =
524 (standardcolors[ad->colors[COLORS_NORMALBACK]] ==
525 CLR_WHITE) ? CLR_PALEGRAY : CLR_WHITE;
[191]526 else
527 color = CLR_WHITE;
528 break;
529 default:
530 if (ad)
[551]531 color =
532 (standardcolors[ad->colors[COLORS_NORMALBACK]] ==
533 CLR_PALEGRAY) ? CLR_DARKGRAY : CLR_PALEGRAY;
[191]534 else
535 color = CLR_PALEGRAY;
536 break;
537 }
538 GpiSetColor(hps, color);
539 ptl.x = swp.x + swp.cx;
540 GpiLine(hps, &ptl);
541 WinReleasePS(hps);
542 }
543 }
544 break;
[2]545
[191]546 case UM_FOCUSME:
547 WinSetFocus(HWND_DESKTOP,
[551]548 WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT), FID_CLIENT));
[191]549 return 0;
[2]550 }
[191]551 return PFNWPStatic(hwnd, msg, mp1, mp2);
[2]552}
553
[191]554static VOID FreeViewerMem(HWND hwnd)
[83]555{
[191]556 VIEWDATA *ad = WinQueryWindowPtr(hwnd, QWL_USER);
[2]557
[551]558 if (ad) {
559 ad->selected = ad->textsize = ad->numlines = ad->numalloc = 0;
560 if (ad->text)
561 free(ad->text);
562 if (ad->lines)
563 free(ad->lines);
564 if (ad->markedlines)
565 free(ad->markedlines);
566 ad->text = NULL;
567 ad->lines = NULL;
568 ad->markedlines = NULL;
[2]569 DosPostEventSem(CompactSem);
570 }
571}
572
[191]573static HPS InitWindow(HWND hwnd)
[83]574{
[191]575 VIEWDATA *ad = WinQueryWindowPtr(hwnd, QWL_USER);
576 HPS hps = (HPS) 0;
577 SIZEL sizel;
578 FONTMETRICS FontMetrics;
[2]579
[551]580 if (ad) {
[2]581 sizel.cx = sizel.cy = 0;
[191]582 hps = GpiCreatePS(WinQueryAnchorBlock(hwnd), WinOpenWindowDC(hwnd),
583 (PSIZEL) & sizel, PU_PELS | GPIF_DEFAULT | GPIT_MICRO |
584 GPIA_ASSOC);
[551]585 if (hps) {
586 GpiSetCp(hps, (ULONG) ad->fattrs.usCodePage);
587 GpiCreateLogFont(hps, NULL, FIXED_FONT_LCID, &ad->fattrs);
[191]588 GpiSetCharSet(hps, FIXED_FONT_LCID);
[551]589 GpiQueryFontMetrics(hps, (long)sizeof(FONTMETRICS), &FontMetrics);
590 ad->fattrs.lAveCharWidth = FontMetrics.lAveCharWidth;
591 ad->fattrs.lMaxBaselineExt = FontMetrics.lMaxBaselineExt;
592 ad->lMaxAscender = max(FontMetrics.lMaxAscender, 0);
593 ad->lMaxDescender = max(FontMetrics.lMaxDescender, 0);
594 ad->lMaxHeight = ad->lMaxAscender + ad->lMaxDescender;
595 if (ad->fattrs.usCodePage != FontMetrics.usCodePage) {
596 ad->fattrs.usCodePage = FontMetrics.usCodePage;
597 Codepage = ad->fattrs.usCodePage;
[191]598 PrfWriteProfileData(fmprof,
599 appname,
600 "Viewer.Codepage",
[551]601 &ad->fattrs.usCodePage, sizeof(USHORT));
[2]602 }
[551]603 else if (ad->fattrs.usCodePage) {
[2]604
[191]605 HMQ hmq;
606 ULONG cps[50], len, x;
[2]607
[551]608 if (!DosQueryCp(sizeof(cps), cps, &len)) {
609 for (x = 0; x < len / sizeof(ULONG); x++) {
610 if (cps[x] == (ULONG) ad->fattrs.usCodePage) {
[191]611 hmq = WinQueryWindowULong(hwnd, QWL_HMQ);
[551]612 WinSetCp(hmq, ad->fattrs.usCodePage);
[191]613 break;
614 }
615 }
616 }
[551]617 DosSetProcessCp((ULONG) ad->fattrs.usCodePage);
[2]618 }
[191]619 GpiSetBackMix(hps, BM_OVERPAINT);
[551]620 SetPresParamFromFattrs(WinWindowFromID(ad->hwndFrame, NEWVIEW_LISTBOX),
621 &ad->fattrs, FontMetrics.sNominalPointSize,
622 MAKEFIXED(FontMetrics.sNominalPointSize / 10,
623 0));
[2]624 }
625 }
626 return (hps);
627}
628
[191]629static VOID PaintLine(HWND hwnd, HPS hps, ULONG whichline, ULONG topline,
630 RECTL * Rectl)
[83]631{
[191]632 VIEWDATA *ad = WinQueryWindowPtr(hwnd, QWL_USER);
633 POINTL ptl;
634 ULONG width;
635 register CHAR *p, *e;
636 CHAR marker[] = " >";
637 RECTL rcl2;
[2]638
[551]639 if (ad && (ad->hex || ad->lines)) {
640 ptl.y = (Rectl->yTop - (ad->lMaxHeight *
641 (((whichline + 1) - topline) + 1)));
[2]642 ptl.x = 0;
[191]643 GpiMove(hps, &ptl);
644 GpiSetBackMix(hps, BM_OVERPAINT);
[551]645 if (ad->markedlines) {
646 if (ad->markedlines[whichline] & VF_SELECTED) {
647 GpiSetColor(hps, ((ad->markedlines[whichline] & VF_FOUND) != 0) ?
648 standardcolors[ad->colors[COLORS_SELECTEDFOUNDFORE]] :
649 standardcolors[ad->colors[COLORS_SELECTEDFORE]]);
650 GpiSetBackColor(hps, (whichline == ad->cursored - 1) ?
651 standardcolors[ad->
652 colors[COLORS_CURSOREDSELECTEDBACK]] :
653 standardcolors[ad->colors[COLORS_SELECTEDBACK]]);
[2]654 }
[551]655 else if (ad->markedlines[whichline] & VF_FOUND) {
656 GpiSetColor(hps, standardcolors[ad->colors[COLORS_FOUNDFORE]]);
657 GpiSetBackColor(hps, (whichline == ad->cursored - 1) ?
658 standardcolors[ad->
659 colors[COLORS_CURSOREDNORMALBACK]] :
660 standardcolors[ad->colors[COLORS_NORMALBACK]]);
[2]661 }
[551]662 else {
663 GpiSetColor(hps, standardcolors[ad->colors[COLORS_NORMALFORE]]);
664 GpiSetBackColor(hps, (whichline == ad->cursored - 1) ?
665 standardcolors[ad->
666 colors[COLORS_CURSOREDNORMALBACK]] :
667 standardcolors[ad->colors[COLORS_NORMALBACK]]);
[2]668 }
669 }
[551]670 else {
671 GpiSetColor(hps, standardcolors[ad->colors[COLORS_NORMALFORE]]);
672 GpiSetBackColor(hps, (whichline == ad->cursored - 1) ?
673 standardcolors[ad->colors[COLORS_CURSOREDNORMALBACK]] :
674 standardcolors[ad->colors[COLORS_NORMALBACK]]);
[2]675 }
[551]676 if (!ad->hex) {
677 if (ad->wrapon) {
678 width = (Rectl->xRight - Rectl->xLeft) / ad->fattrs.lAveCharWidth;
679 if (width) {
680 GpiCharString(hps, 1, marker + (whichline == ad->cursored - 1));
681 p = ad->lines[whichline];
[191]682 e = p + (width - 1);
[551]683 if (e - ad->text > ad->textsize)
684 e = ad->text + ad->textsize;
685 while (p < e) {
686 if (*p == '\r' || *p == '\n') {
[191]687 e = p;
688 break;
689 }
690 p++;
691 }
[551]692 if (ad->ftpin && whichline != ad->cursored - 1
693 && (!ad->markedlines
694 || !(ad->markedlines[whichline] & (VF_SELECTED | VF_FOUND)))
695 && strnstr(ad->lines[whichline], "ftp://",
696 e - ad->lines[whichline])) {
697 GpiSetColor(hps, standardcolors[ad->colors[COLORS_FTPFORE]]);
698 GpiSetBackColor(hps, standardcolors[ad->colors[COLORS_FTPBACK]]);
[191]699 }
[551]700 if (ad->httpin && whichline != ad->cursored - 1
701 && (!ad->markedlines
702 || !(ad->markedlines[whichline] & (VF_SELECTED | VF_FOUND)))
703 && strnstr(ad->lines[whichline], "http://",
704 e - ad->lines[whichline])) {
705 GpiSetColor(hps, standardcolors[ad->colors[COLORS_HTTPFORE]]);
706 GpiSetBackColor(hps, standardcolors[ad->colors[COLORS_HTTPBACK]]);
[191]707 }
708 rcl2 = *Rectl;
[551]709 rcl2.yTop = ptl.y + ad->lMaxAscender;
710 rcl2.yBottom = ptl.y - ad->lMaxDescender;
711 GpiCharString(hps, e - ad->lines[whichline], ad->lines[whichline]);
[191]712 GpiQueryCurrentPosition(hps, &ptl);
713 rcl2.xLeft = ptl.x;
714 WinFillRect(hps, &rcl2,
[551]715 standardcolors[ad->colors[COLORS_NORMALBACK]]);
[191]716 }
[2]717 }
[551]718 else {
719 width = (Rectl->xRight - Rectl->xLeft) / ad->fattrs.lAveCharWidth;
720 if (width) {
721 GpiCharString(hps, 1, marker + (whichline == ad->cursored - 1));
722 p = ad->lines[whichline];
723 e = p + (abs(ad->horzscroll) / ad->fattrs.lAveCharWidth);
724 if (e - ad->text > ad->textsize)
725 e = ad->text + ad->textsize;
726 while (p < e) {
[191]727 if (*p == '\r' || *p == '\n')
728 break;
729 p++;
730 }
[551]731 if (*p != '\r' && *p != '\n') {
[2]732
[191]733 CHAR *pp;
[2]734
[191]735 e = p + (width - 1);
[551]736 if (e - ad->text > ad->textsize)
737 e = ad->text + ad->textsize;
[191]738 pp = p;
[551]739 while (pp < e) {
740 if (*pp == '\r' || *pp == '\n') {
[191]741 e = pp;
742 break;
743 }
744 pp++;
745 }
746 }
747 else
748 e = p;
[551]749 if (ad->ftpin && whichline != ad->cursored - 1
750 && (!ad->markedlines
751 || !(ad->markedlines[whichline] & (VF_SELECTED | VF_FOUND)))
752 && strnstr(ad->lines[whichline], "ftp://",
753 e - ad->lines[whichline])) {
754 GpiSetColor(hps, standardcolors[ad->colors[COLORS_FTPFORE]]);
755 GpiSetBackColor(hps, standardcolors[ad->colors[COLORS_FTPBACK]]);
[191]756 }
[551]757 if (ad->httpin && whichline != ad->cursored - 1
758 && (!ad->markedlines
759 || !(ad->markedlines[whichline] & (VF_SELECTED | VF_FOUND)))
760 && strnstr(ad->lines[whichline], "http://",
761 e - ad->lines[whichline])) {
762 GpiSetColor(hps, standardcolors[ad->colors[COLORS_HTTPFORE]]);
763 GpiSetBackColor(hps, standardcolors[ad->colors[COLORS_HTTPBACK]]);
[191]764 }
765 rcl2 = *Rectl;
[551]766 rcl2.yTop = ptl.y + ad->lMaxAscender;
767 rcl2.yBottom = ptl.y - ad->lMaxDescender;
[191]768 GpiCharString(hps, e - p, p);
769 GpiQueryCurrentPosition(hps, &ptl);
770 rcl2.xLeft = ptl.x;
771 WinFillRect(hps, &rcl2,
[551]772 standardcolors[ad->colors[COLORS_NORMALBACK]]);
[191]773 }
[2]774 }
775 }
[551]776 else {
[2]777
[191]778 CHAR s[80];
779 register ULONG x;
[2]780
781 rcl2 = *Rectl;
[551]782 rcl2.yTop = ptl.y + ad->lMaxAscender;
783 rcl2.yBottom = ptl.y - ad->lMaxDescender;
784 GpiCharString(hps, 1, marker + (whichline == ad->cursored - 1));
785 width = ad->textsize - (whichline * 16);
[191]786 width = min(width, 16);
[551]787 sprintf(s, "%08lx ", whichline * 16);
[2]788 p = s + 9;
[551]789 for (x = 0; x < width; x++) {
790 sprintf(p, " %02hx", ad->text[(whichline * 16) + x]);
[191]791 p += 3;
[2]792 }
[551]793 for (; x < 16; x++) {
[191]794 *p = ' ';
795 p++;
796 *p = ' ';
797 p++;
798 *p = ' ';
799 p++;
[2]800 }
801 *p = ' ';
802 p++;
803 *p = ' ';
804 p++;
[551]805 for (x = 0; x < width; x++) {
806 *p = ad->text[(whichline * 16) + x];
[191]807 p++;
[2]808 }
809 *p = 0;
[551]810 GpiCharString(hps, (p - s) - (abs(ad->horzscroll) /
811 ad->fattrs.lAveCharWidth),
812 s + (abs(ad->horzscroll) / ad->fattrs.lAveCharWidth));
[191]813 GpiQueryCurrentPosition(hps, &ptl);
[551]814 if (ptl.x + abs(ad->horzscroll) + ad->fattrs.lAveCharWidth + 1 >
815 ad->maxx) {
816 ad->maxx = ptl.x + abs(ad->horzscroll) + ad->fattrs.lAveCharWidth + 1;
817 WinSendMsg(ad->hhscroll, SBM_SETTHUMBSIZE,
818 MPFROM2SHORT((SHORT) Rectl->xRight, (SHORT) ad->maxx),
[191]819 MPVOID);
[2]820 }
821 rcl2.xLeft = ptl.x;
[551]822 WinFillRect(hps, &rcl2, standardcolors[ad->colors[COLORS_NORMALBACK]]);
[2]823 }
824 }
825}
826
[533]827static VOID SearchThread(VOID * args)
[83]828{
[551]829 HWND hwnd = (HWND) args;
[191]830 HAB hab2;
831 HMQ hmq2;
832 VIEWDATA *ad;
[2]833 register CHAR *p;
[191]834 RECTL Rectl;
835 ULONG width, numlines, lastline, whichline, firstline = ULONG_MAX;
[2]836 register ULONG x;
[191]837 CHAR s[SEARCHSTRINGLEN], s2[SEARCHSTRINGLEN], *t, *n, markwith;
[2]838
839 priority_normal();
840 hab2 = WinInitialize(0);
[551]841 if (hab2) {
[191]842 hmq2 = WinCreateMsgQueue(hab2, 0);
[533]843 if (hmq2) {
[191]844 WinCancelShutdown(hmq2, TRUE);
[533]845 IncrThreadUsage();
[191]846 ad = WinQueryWindowPtr(hwnd, QWL_USER);
[551]847 if (ad) {
848 if (!DosRequestMutexSem(ad->ScanSem, SEM_INDEFINITE_WAIT)) {
849 markwith = VF_FOUND | ((ad->alsoselect) ? VF_SELECTED : 0);
850 strcpy(s, ad->searchtext);
851 if (*s) {
[191]852 WinQueryWindowRect(hwnd, &Rectl);
[551]853 width = (Rectl.xRight - Rectl.xLeft) / ad->fattrs.lAveCharWidth;
[191]854 numlines = NumLines(&Rectl, ad);
[551]855 WinSetWindowText(WinWindowFromID(ad->hwndFrame,
[191]856 NEWVIEW_STATUS1),
857 GetPString(IDS_SEARCHINGTEXT));
[551]858 if (numlines && width && ad->markedlines && ad->numlines &&
859 ad->text && ad->textsize) {
860 for (x = 0; x < ad->numlines && !ad->stopflag; x++)
861 ad->markedlines[x] &= (~VF_FOUND);
862 ad->found = 0;
[191]863 t = s;
[551]864 while (t && !ad->stopflag) {
[191]865 lastline = 1;
[368]866 n = convert_nl_to_nul(t);
[551]867 if (*t) {
[191]868 strcpy(s2, t);
[551]869 if (ad->literalsearch)
[191]870 literal(s2);
[551]871 p = ad->text;
872 while (p && !ad->stopflag) {
[191]873 p = findstring(s2, strlen(s2), p,
[551]874 ad->textsize - (p - ad->text),
875 ad->sensitive);
876 if (p) {
877 if (ad->hex) {
878 whichline = (p - ad->text) / 16;
[191]879 if (whichline < firstline)
880 firstline = whichline;
[551]881 if (!(ad->markedlines[whichline] & VF_FOUND))
882 ad->found++;
883 if (markwith & VF_SELECTED) {
884 if (!(ad->markedlines[whichline] & VF_SELECTED))
885 ad->selected++;
[191]886 }
[551]887 ad->markedlines[whichline] |= markwith;
888 if ((p - ad->text) + strlen(s2) >
889 (whichline + 1) * 16) {
[191]890 whichline++;
[551]891 if (!(ad->markedlines[whichline] & VF_FOUND))
892 ad->found++;
893 if (markwith & VF_SELECTED) {
894 if (!(ad->markedlines[whichline] & VF_SELECTED))
895 ad->selected++;
[191]896 }
[551]897 ad->markedlines[whichline] |= markwith;
[191]898 }
[551]899 p = ad->text + ((whichline + 1) * 16);
900 if (p >= ad->text + ad->textsize)
[191]901 break;
902 }
[551]903 else {
904 for (x = lastline; x < ad->numlines; x++) {
905 if (ad->lines[x] > p) {
[191]906 if (x - 1 < firstline)
907 firstline = x - 1;
[551]908 if (!(ad->markedlines[x - 1] & VF_FOUND))
909 ad->found++;
910 if (markwith & VF_SELECTED) {
911 if (!(ad->markedlines[x - 1] & VF_SELECTED))
912 ad->selected++;
[191]913 }
[551]914 ad->markedlines[x - 1] |= markwith;
915 if (x + 1 < ad->numlines &&
916 p + strlen(s2) > ad->lines[x]) {
[191]917 x++;
[551]918 if (!(ad->markedlines[x - 1] & VF_FOUND))
919 ad->found++;
920 if (markwith & VF_SELECTED) {
921 if (!(ad->markedlines[x - 1] & VF_SELECTED))
922 ad->selected++;
[191]923 }
[551]924 ad->markedlines[x - 1] |= markwith;
[191]925 }
926 lastline = x;
[551]927 p = ad->lines[x];
[191]928 break;
929 }
930 }
[551]931 if (x >= ad->numlines) {
932 if (markwith & VF_SELECTED) {
933 if (!
934 (ad->markedlines[numlines - 1] & VF_SELECTED))
935 ad->selected++;
936 if (!(ad->markedlines[numlines - 1] & VF_FOUND))
937 ad->found++;
[191]938 }
[551]939 ad->markedlines[ad->numlines - 1] |= markwith;
[191]940 break;
941 }
942 }
943 }
944 }
945 }
946 t = n;
947 }
948 }
[551]949 DosReleaseMutexSem(ad->ScanSem);
950 if (!ad->stopflag && firstline == ULONG_MAX) {
[191]951 DosBeep(50, 50);
[551]952 WinSetWindowText(WinWindowFromID(ad->hwndFrame,
[191]953 NEWVIEW_STATUS1),
954 GetPString(IDS_NOMATCHINGTEXT));
955 DosSleep(1500);
956 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
957 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
958 }
[551]959 else if (!ad->stopflag) {
[191]960 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
961 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
962 PostMsg(hwnd, UM_CONTAINER_FILLED,
[551]963 MPFROMLONG(firstline + 1), MPFROMLONG(firstline + 1));
[191]964 }
965 }
966 else
[551]967 DosReleaseMutexSem(ad->ScanSem);
[191]968 }
[2]969 }
970 WinDestroyMsgQueue(hmq2);
971 }
[533]972 DecrThreadUsage();
[2]973 WinTerminate(hab2);
974 }
975 DosPostEventSem(CompactSem);
976}
977
[533]978static VOID ClipboardThread(VOID * args)
[83]979{
[551]980 HWND hwnd = (HWND) args;
[191]981 HAB hab2;
982 HMQ hmq2;
[2]983 VIEWDATA *ad;
[191]984 CHAR **list;
985 USHORT cmd;
[2]986 register ULONG x;
[191]987 BOOL released = FALSE;
[2]988
989 priority_normal();
990 hab2 = WinInitialize(0);
[551]991 if (hab2) {
[191]992 hmq2 = WinCreateMsgQueue(hab2, 0);
[533]993 if (hmq2) {
[191]994 WinCancelShutdown(hmq2, TRUE);
[533]995 IncrThreadUsage();
[191]996 ad = WinQueryWindowPtr(hwnd, QWL_USER);
[551]997 if (ad) {
998 if (!DosRequestMutexSem(ad->ScanSem, SEM_INDEFINITE_WAIT)) {
999 cmd = ad->cliptype;
1000 if (ad->numlines && ad->text && ad->textsize && ad->markedlines &&
1001 !ad->stopflag) {
1002 WinSetWindowText(WinWindowFromID(ad->hwndFrame,
[191]1003 NEWVIEW_STATUS1),
1004 GetPString(IDS_BUILDINGLINELISTTEXT));
1005 if (cmd == IDM_SAVETOCLIP || cmd == IDM_APPENDTOCLIP ||
1006 cmd == IDM_SAVETOLIST)
1007 list = BuildAList(hwnd);
1008 else
1009 list = BuildAList2(hwnd);
[551]1010 if (list) {
1011 if (!ad->stopflag) {
1012 WinSetWindowText(WinWindowFromID(ad->hwndFrame,
[191]1013 NEWVIEW_STATUS1),
1014 (cmd == IDM_SAVETOCLIP ||
1015 cmd == IDM_SAVETOCLIP2) ?
1016 GetPString(IDS_SAVETOCLIPTEXT) :
1017 (cmd == IDM_APPENDTOCLIP ||
1018 cmd == IDM_APPENDTOCLIP2) ?
1019 GetPString(IDS_APPENDTOCLIPTEXT) :
1020 GetPString(IDS_WRITETOFILETEXT));
[551]1021 DosReleaseMutexSem(ad->ScanSem);
[191]1022 released = TRUE;
1023 if (cmd == IDM_SAVETOCLIP || cmd == IDM_APPENDTOCLIP ||
1024 cmd == IDM_SAVETOCLIP2 || cmd == IDM_APPENDTOCLIP2)
1025 ListToClipboardHab(hab2, list, (cmd == IDM_APPENDTOCLIP ||
1026 cmd == IDM_APPENDTOCLIP2));
[551]1027 else {
[2]1028
[191]1029 FILE *fp;
1030 CHAR filename[CCHMAXPATH];
[2]1031
[191]1032 *filename = 0;
[551]1033 if (export_filename(hwnd, filename, FALSE)) {
[191]1034 fp = _fsopen(filename, "a+", SH_DENYWR);
[350]1035 if (!fp) {
1036 saymsg(MB_CANCEL,
1037 hwnd,
1038 GetPString(IDS_ERRORTEXT),
[551]1039 GetPString(IDS_CANTOPENFORWRITETEXT), filename);
[350]1040 }
1041 else {
[191]1042 fseek(fp, 0L, SEEK_END);
1043 for (x = 0; list[x]; x++)
[551]1044 fprintf(fp, "%s\n", list[x]);
[191]1045 fclose(fp);
1046 }
1047 }
1048 }
1049 }
1050 FreeList(list);
1051 }
[551]1052 else {
1053 DosReleaseMutexSem(ad->ScanSem);
[191]1054 released = TRUE;
1055 DosBeep(50, 100);
[551]1056 WinSetWindowText(WinWindowFromID(ad->hwndFrame,
[191]1057 NEWVIEW_STATUS1),
1058 GetPString(IDS_NVNOLINESSELTEXT));
1059 DosSleep(1500);
1060 }
1061 }
1062 if (!released)
[551]1063 DosReleaseMutexSem(ad->ScanSem);
[191]1064 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
1065 }
[2]1066 }
1067 WinDestroyMsgQueue(hmq2);
1068 }
[533]1069 DecrThreadUsage();
[2]1070 WinTerminate(hab2);
1071 }
1072 DosPostEventSem(CompactSem);
1073}
1074
[533]1075static VOID ReLineThread(VOID * args)
[83]1076{
[551]1077 HWND hwnd = (HWND) args;
[191]1078 HAB hab2;
1079 HMQ hmq2;
[2]1080 VIEWDATA *ad;
[191]1081 CHAR *p, *pp, *e, *whereiam = NULL;
1082 RECTL Rectl;
1083 ULONG width, numlines, firstline = 1, cursored = 1;
[2]1084
1085 priority_normal();
1086 hab2 = WinInitialize(0);
[533]1087 if (hab2) {
[191]1088 hmq2 = WinCreateMsgQueue(hab2, 0);
[533]1089 if (hmq2) {
[191]1090 WinCancelShutdown(hmq2, TRUE);
[533]1091 IncrThreadUsage();
[191]1092 ad = WinQueryWindowPtr(hwnd, QWL_USER);
[533]1093 if (ad) {
[551]1094 ad->relining = TRUE;
1095 if (!DosRequestMutexSem(ad->ScanSem, SEM_INDEFINITE_WAIT)) {
1096 ad->busy++;
1097 ad->maxx = 0;
1098 if (ad->text && ad->textsize) {
1099 if (ad->hex) {
1100 firstline = ad->topline;
1101 cursored = ad->cursored;
[191]1102 }
[551]1103 else if (ad->lines)
1104 whereiam = ad->lines[ad->cursored - 1];
1105 ad->found = 0;
1106 ad->selected = ad->numlines = ad->numalloc = 0;
1107 if (ad->lines)
1108 free(ad->lines);
1109 if (ad->markedlines)
1110 free(ad->markedlines);
1111 ad->lines = NULL;
1112 ad->markedlines = NULL;
1113 WinSetWindowText(WinWindowFromID(ad->hwndFrame,
[191]1114 NEWVIEW_STATUS1),
1115 GetPString(IDS_FORMATTINGTEXT));
[551]1116 if (!ad->hex) {
1117 if (WinSendDlgItemMsg(ad->hwndFrame, NEWVIEW_LISTBOX,
1118 LM_QUERYITEMCOUNT, MPVOID, MPVOID)) {
1119 WinSendDlgItemMsg(ad->hwndFrame, NEWVIEW_LISTBOX,
1120 LM_DELETEALL, MPVOID, MPVOID);
1121 PostMsg(ad->hwndFrame, WM_UPDATEFRAME,
[191]1122 MPFROMLONG(FCF_SIZEBORDER), MPVOID);
1123 }
1124 }
1125 WinSetFocus(HWND_DESKTOP, hwnd);
[551]1126 if (!ad->hex) {
[191]1127 WinQueryWindowRect(hwnd, &Rectl);
[551]1128 width = (Rectl.xRight - Rectl.xLeft) / ad->fattrs.lAveCharWidth;
[191]1129 numlines = NumLines(&Rectl, ad);
[551]1130 ad->oldwidth = width;
1131 p = ad->text;
1132 if (width) {
1133 while (p - ad->text < ad->textsize && !ad->stopflag) {
1134 if (ad->wrapon) {
[191]1135 e = p + (width - 1);
[551]1136 if (e - ad->text > ad->textsize)
1137 e = ad->text + ad->textsize;
[191]1138 pp = p;
[551]1139 while (pp < e) {
1140 if (*pp == '\r' || *pp == '\n') {
[191]1141 e = pp;
1142 break;
1143 }
1144 pp++;
1145 }
1146 }
[551]1147 else {
[191]1148 pp = p;
[551]1149 while (pp - ad->text < ad->textsize &&
[191]1150 *pp != '\r' && *pp != '\n')
1151 pp++;
1152 e = pp;
[551]1153 if (ad->maxx <
1154 (((e - p) + 1) * ad->fattrs.lAveCharWidth) + 1)
1155 ad->maxx = (((e - p) + 1) *
1156 ad->fattrs.lAveCharWidth) + 1;
[191]1157 }
[551]1158 if (whereiam && p >= whereiam && e <= whereiam) {
1159 cursored = firstline = ad->numlines + 1;
[191]1160 whereiam = NULL;
1161 }
1162 /* assign ad->lines[ad->numlines] */
[551]1163 if (ad->numlines + 1 > ad->numalloc) {
[2]1164
[191]1165 CHAR **temp;
[2]1166
[551]1167 temp = xrealloc(ad->lines, sizeof(CHAR *) *
1168 (ad->numalloc + 256), pszSrcFile,
1169 __LINE__);
[350]1170 if (!temp)
[191]1171 break;
[551]1172 ad->lines = temp;
1173 ad->numalloc += 256;
[191]1174 }
[551]1175 ad->lines[ad->numlines] = p;
1176 ad->numlines++;
1177 if (ad->numlines == numlines) {
[191]1178 /* display first page */
1179 register INT x;
[2]1180
[551]1181 for (x = 0; x < ad->numlines; x++) {
[191]1182 if ((LONG) (Rectl.yTop -
[551]1183 (ad->lMaxHeight * (((x + 1) -
1184 ad->topline) + 1))) < 0)
[191]1185 break;
[551]1186 PaintLine(hwnd, ad->hps, x, 1, &Rectl);
[191]1187 }
1188 }
1189 p = e;
[551]1190 if (p - ad->text < ad->textsize) {
[191]1191 if (*p == '\r')
1192 p++;
1193 }
[551]1194 if (p - ad->text < ad->textsize) {
[191]1195 if (*p == '\n')
1196 p++;
1197 }
1198 }
1199 }
[551]1200 if (ad->numalloc != ad->numlines) {
[2]1201
[191]1202 CHAR **temp;
[2]1203
[551]1204 temp =
1205 xrealloc(ad->lines, sizeof(CHAR *) * ad->numlines,
1206 pszSrcFile, __LINE__);
1207 if (temp) {
1208 ad->lines = temp;
1209 ad->numalloc = ad->numlines;
[191]1210 }
1211 }
1212 }
[551]1213 else {
1214 ad->numlines = ad->textsize / 16;
1215 if (ad->numlines * 16 < ad->textsize)
1216 ad->numlines++;
[191]1217 }
[551]1218 if (ad->numlines) {
1219 ad->markedlines = xmalloc(ad->numlines, pszSrcFile, __LINE__);
1220 if (ad->markedlines) {
1221 memset(ad->markedlines, 0, ad->numlines);
1222 ad->selected = 0;
[191]1223 }
[551]1224 if (*ftprun && !ad->ignoreftp && strstr(ad->text, "ftp://"))
1225 ad->ftpin = TRUE;
1226 if (*httprun && !ad->ignorehttp && strstr(ad->text, "http://"))
1227 ad->httpin = TRUE;
[191]1228 }
1229 }
[551]1230 DosReleaseMutexSem(ad->ScanSem);
[191]1231 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
1232 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
[551]1233 ad->busy--;
[191]1234 }
[2]1235 }
1236 WinDestroyMsgQueue(hmq2);
1237 }
[533]1238 DecrThreadUsage();
[2]1239 WinTerminate(hab2);
1240 }
1241 DosPostEventSem(CompactSem);
[551]1242 if (ad && !ad->stopflag) {
[191]1243 PostMsg(hwnd, UM_CONTAINER_FILLED, MPFROMLONG(firstline),
1244 MPFROMLONG(cursored));
[551]1245 ad->relining = FALSE;
[2]1246 }
1247}
1248
[533]1249static VOID LoadFileThread(VOID * args)
[83]1250{
[551]1251 HWND hwnd = (HWND) args;
[191]1252 HAB hab2;
1253 HMQ hmq2;
[2]1254 VIEWDATA *ad;
[191]1255 HFILE handle;
1256 ULONG action, len;
1257 APIRET rc;
1258 BOOL error = TRUE;
[2]1259
1260 hab2 = WinInitialize(0);
[551]1261 if (hab2) {
[191]1262 hmq2 = WinCreateMsgQueue(hab2, 0);
[551]1263 if (hmq2) {
[191]1264 WinCancelShutdown(hmq2, TRUE);
[533]1265 IncrThreadUsage();
[191]1266 ad = WinQueryWindowPtr(hwnd, QWL_USER);
[551]1267 if (ad) {
1268 if (!DosRequestMutexSem(ad->ScanSem, SEM_INDEFINITE_WAIT)) {
1269 ad->busy++;
[191]1270 priority_normal();
[551]1271 if (*ad->filename) {
1272 if (ad->text)
1273 free(ad->text);
1274 if (ad->lines)
1275 free(ad->lines);
1276 if (ad->markedlines)
1277 free(ad->markedlines);
1278 ad->text = NULL;
1279 ad->lines = NULL;
1280 ad->markedlines = NULL;
1281 ad->ftpin = ad->httpin = FALSE;
1282 ad->selected = ad->numlines = ad->textsize = ad->numalloc = 0;
1283 WinSendDlgItemMsg(ad->hwndFrame, NEWVIEW_LISTBOX, LM_DELETEALL,
[191]1284 MPVOID, MPVOID);
[551]1285 PostMsg(ad->hwndFrame, WM_UPDATEFRAME,
[191]1286 MPFROMLONG(FCF_SIZEBORDER), MPVOID);
1287 WinSetFocus(HWND_DESKTOP, hwnd);
[551]1288 rc = DosOpen(ad->filename, &handle, &action, 0L, 0L,
1289 OPEN_ACTION_FAIL_IF_NEW | OPEN_ACTION_OPEN_IF_EXISTS,
[191]1290 OPEN_FLAGS_FAIL_ON_ERROR | OPEN_FLAGS_NOINHERIT |
1291 OPEN_FLAGS_SEQUENTIAL | OPEN_SHARE_DENYNONE |
1292 OPEN_ACCESS_READONLY, 0L);
[350]1293 if (rc) {
1294 Dos_Error(MB_CANCEL,
1295 rc,
1296 hwnd,
1297 pszSrcFile,
1298 __LINE__,
[551]1299 GetPString(IDS_COMPCANTOPENTEXT), ad->filename);
[350]1300 }
1301 else {
[191]1302 DosChgFilePtr(handle, 0L, FILE_END, &len);
1303 DosChgFilePtr(handle, 0L, FILE_BEGIN, &action);
[350]1304 if (!len) {
1305 saymsg(MB_CANCEL,
1306 hwnd,
1307 GetPString(IDS_ERRORTEXT),
[551]1308 GetPString(IDS_ZEROLENGTHTEXT), ad->filename);
[350]1309 }
1310 else {
[551]1311 ad->text = xmalloc(len + 2, pszSrcFile, __LINE__);
1312 if (ad->text) {
1313 *ad->text = 0;
1314 ad->text[len] = 0;
1315 rc = DosRead(handle, ad->text, len, &ad->textsize);
[350]1316 if (rc) {
[191]1317 Dos_Error(MB_CANCEL,
1318 rc,
1319 hwnd,
[350]1320 pszSrcFile,
[191]1321 __LINE__,
[551]1322 GetPString(IDS_ERRORREADINGTEXT), ad->filename);
1323 free(ad->text);
1324 ad->text = NULL;
1325 ad->textsize = 0;
[191]1326 }
[350]1327 else {
[551]1328 ad->text[ad->textsize] = 0;
1329 if (!ad->hex && !(ad->flags & (8 | 16)) && ad->textsize) {
[350]1330 ULONG x;
[551]1331
1332 x = min(512, ad->textsize);
1333 if (fGuessType && IsBinary(ad->text, x))
1334 ad->hex = TRUE;
[350]1335 }
[551]1336 if (ad->textsize) {
1337 if (_beginthread
1338 (ReLineThread, NULL, 524288, (PVOID) hwnd) == -1)
1339 Runtime_Error(pszSrcFile, __LINE__,
1340 GetPString(IDS_COULDNTSTARTTHREADTEXT));
[350]1341 else
[551]1342 error = FALSE;
[350]1343 }
1344 }
[191]1345 }
1346 }
1347 DosClose(handle);
1348 }
1349 }
[551]1350 ad->busy--;
1351 DosReleaseMutexSem(ad->ScanSem);
[191]1352 }
[2]1353 }
1354 WinDestroyMsgQueue(hmq2);
1355 }
[533]1356 DecrThreadUsage();
[2]1357 WinTerminate(hab2);
1358 }
[191]1359 if (error)
1360 PostMsg(hwnd, UM_CONTAINER_FILLED, MPVOID, MPVOID);
[2]1361 DosPostEventSem(CompactSem);
1362}
1363
[551]1364MRESULT EXPENTRY ViewFrameWndProc(HWND hwnd, ULONG msg, MPARAM mp1,
1365 MPARAM mp2)
[83]1366{
[191]1367 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
[2]1368
[551]1369 switch (msg) {
[191]1370 case WM_CHAR:
1371 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
1372 break;
[2]1373
[191]1374 case WM_CONTROL:
[551]1375 switch (SHORT1FROMMP(mp1)) {
[191]1376 case NEWVIEW_LISTBOX:
1377 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), UM_CONTROL,
1378 mp1, mp2);
1379 }
1380 break;
[2]1381
[191]1382 case WM_CALCFRAMERECT:
1383 {
1384 MRESULT mr;
1385 PRECTL prectl;
1386 SHORT sSelect;
[2]1387
[191]1388 mr = oldproc(hwnd, msg, mp1, mp2);
[2]1389
[191]1390 /*
1391 * Calculate the position of the client rectangle.
1392 * Otherwise, we'll see a lot of redraw when we move the
1393 * client during WM_FORMATFRAME.
1394 */
[2]1395
[551]1396 if (mr && mp2) {
[191]1397 prectl = (PRECTL) mp1;
[551]1398 prectl->yBottom += 22;
1399 prectl->yTop -= 22;
[191]1400 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, NEWVIEW_LISTBOX,
1401 LM_QUERYITEMCOUNT,
1402 MPVOID, MPVOID);
1403 if (sSelect > 0)
[551]1404 prectl->yTop -= 48;
[2]1405 }
[191]1406 return mr;
1407 }
[2]1408
[191]1409 case WM_FORMATFRAME:
1410 {
1411 SHORT sCount, soldCount, sSelect;
[551]1412 PSWP pswp, pswpClient, pswpNew1, pswpNew2, pswpNew3, pswpList,
1413 pswpScroll, pswpNew4, pswpUp, pswpDn;
[2]1414
[191]1415 sCount = (SHORT) oldproc(hwnd, msg, mp1, mp2);
1416 soldCount = sCount;
[2]1417
[191]1418 /*
1419 * Reformat the frame to "squeeze" the client
1420 * and make room for status window sibling beneath
1421 */
[2]1422
[191]1423 pswp = (PSWP) mp1;
1424 {
1425 SHORT x;
[2]1426
[551]1427 for (x = 0; x < sCount; x++) {
1428 if (WinQueryWindowUShort(pswp->hwnd, QWS_ID) == FID_CLIENT) {
[191]1429 pswpClient = pswp;
1430 break;
1431 }
1432 pswp++;
1433 }
[2]1434 }
[191]1435 pswpNew1 = (PSWP) mp1 + soldCount;
1436 pswpNew2 = (PSWP) mp1 + (soldCount + 1);
1437 pswpNew3 = (PSWP) mp1 + (soldCount + 2);
1438 pswpNew4 = (PSWP) mp1 + (soldCount + 3);
1439 *pswpNew1 = *pswpClient;
[551]1440 pswpNew1->hwnd = WinWindowFromID(hwnd, NEWVIEW_STATUS1);
1441 pswpNew1->x = pswpClient->x + 2;
1442 pswpNew1->y = pswpClient->y + 2;
1443 pswpNew1->cx = (pswpClient->cx / 3) - 3;
1444 pswpNew1->cy = 20;
1445 pswpClient->y = pswpNew1->y + pswpNew1->cy + 3;
1446 pswpClient->cy = (pswpClient->cy - pswpNew1->cy) - 5;
[191]1447 *pswpNew2 = *pswpNew1;
1448 *pswpNew3 = *pswpNew1;
1449 *pswpNew4 = *pswpNew1;
[551]1450 pswpNew2->hwnd = WinWindowFromID(hwnd, NEWVIEW_STATUS2);
1451 pswpNew3->hwnd = WinWindowFromID(hwnd, NEWVIEW_STATUS3);
1452 pswpNew4->hwnd = WinWindowFromID(hwnd, NEWVIEW_DRAG);
1453 pswpNew2->x = pswpNew1->x + pswpNew1->cx + 3;
1454 pswpNew3->x = pswpNew2->x + pswpNew2->cx + 3;
1455 pswpNew3->cx = ((pswpClient->x + pswpClient->cx) - pswpNew3->x) - 26;
1456 pswpNew4->x = pswpNew3->x + pswpNew3->cx + 3;
1457 pswpNew4->cx = 20;
[191]1458 sCount += 4;
1459 pswpScroll = (PSWP) mp1;
[551]1460 while (pswpScroll < pswpClient) {
1461 if (WinQueryWindowUShort(pswpScroll->hwnd, QWS_ID) == FID_VERTSCROLL)
[191]1462 break;
1463 pswpScroll++;
1464 }
1465 if (pswpScroll == pswpClient)
1466 pswpScroll = NULL;
1467 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, NEWVIEW_LISTBOX,
[551]1468 LM_QUERYITEMCOUNT, MPVOID, MPVOID);
1469 if (sSelect > 0) {
[191]1470 pswpList = (PSWP) mp1 + (soldCount + 4);
1471 *pswpList = *pswpClient;
[551]1472 pswpList->hwnd = WinWindowFromID(hwnd, NEWVIEW_LISTBOX);
1473 pswpList->x = pswpClient->x;
1474 pswpList->cx = pswpClient->cx;
1475 if (pswpScroll) {
1476 pswpList->cx += pswpScroll->cx;
1477 pswpScroll->cy -= 48;
[191]1478 }
[551]1479 pswpList->y = (pswpClient->y + pswpClient->cy) - 48;
1480 pswpList->cy = 48;
1481 pswpClient->cy -= 48;
[191]1482 sCount++;
1483 }
1484 WinShowWindow(WinWindowFromID(hwnd, NEWVIEW_LISTBOX), (sSelect > 0));
[2]1485
[551]1486 if (pswpScroll) {
[191]1487 pswpUp = (PSWP) mp1 + (soldCount + 4 + (sSelect > 0));
1488 *pswpUp = *pswpClient;
[551]1489 pswpUp->hwnd = WinWindowFromID(hwnd, IDM_PREVBLANKLINE);
1490 pswpUp->cx = pswpScroll->cx;
1491 pswpUp->x = pswpScroll->x;
1492 pswpUp->cy = WinQuerySysValue(HWND_DESKTOP, SV_CYVSCROLLARROW);
1493 pswpUp->y = (pswpScroll->y + pswpScroll->cy) - (pswpUp->cy + 1);
1494 pswpScroll->cy -= ((pswpUp->cy * 2) + 1);
[191]1495 pswpDn = (PSWP) mp1 + (soldCount + 5 + (sSelect > 0));
1496 *pswpDn = *pswpUp;
[551]1497 pswpDn->y = pswpScroll->y;
1498 pswpDn->hwnd = WinWindowFromID(hwnd, IDM_NEXTBLANKLINE);
1499 pswpScroll->y += pswpUp->cy;
[191]1500 sCount += 2;
1501 }
[551]1502 else {
[191]1503 WinShowWindow(WinWindowFromID(hwnd, IDM_PREVBLANKLINE), FALSE);
1504 WinShowWindow(WinWindowFromID(hwnd, IDM_NEXTBLANKLINE), FALSE);
1505 }
1506 return MRFROMSHORT(sCount);
1507 }
[2]1508
[191]1509 case WM_QUERYFRAMECTLCOUNT:
1510 {
1511 SHORT sCount, sSelect;
1512
1513 sCount = (SHORT) oldproc(hwnd, msg, mp1, mp2);
1514 sCount += 6;
1515 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, NEWVIEW_LISTBOX,
[551]1516 LM_QUERYITEMCOUNT, MPVOID, MPVOID);
[191]1517 if (sSelect > 0)
1518 sCount++;
1519 return MRFROMSHORT(sCount);
1520 }
[2]1521 }
[191]1522 return oldproc(hwnd, msg, mp1, mp2);
[2]1523}
1524
[191]1525MRESULT EXPENTRY FindStrDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[83]1526{
[2]1527 VIEWDATA *ad;
1528
[551]1529 switch (msg) {
[191]1530 case WM_INITDLG:
1531 if (!mp2)
1532 WinDismissDlg(hwnd, 0);
[551]1533 else {
[2]1534
[191]1535 HWND hwndClient = *(HWND *) mp2;
[2]1536
[191]1537 WinSetWindowULong(hwnd, QWL_USER, (ULONG) hwndClient);
1538 ad = (VIEWDATA *) WinQueryWindowPtr(hwndClient, QWL_USER);
1539 MLEsetwrap(WinWindowFromID(hwnd, NEWFIND_MLE), FALSE);
1540 MLEsetlimit(WinWindowFromID(hwnd, NEWFIND_MLE), SEARCHSTRINGLEN);
1541 MLEsetformat(WinWindowFromID(hwnd, NEWFIND_MLE), MLFIE_NOTRANS);
[551]1542 if (*ad->searchtext) {
[2]1543
[191]1544 IPT here = 0;
[551]1545 ULONG len = strlen(ad->searchtext);
[2]1546
[191]1547 WinSendMsg(WinWindowFromID(hwnd, NEWFIND_MLE),
1548 MLM_SETIMPORTEXPORT,
[551]1549 MPFROMP(ad->searchtext), MPFROMLONG(SEARCHSTRINGLEN));
[191]1550 WinSendMsg(WinWindowFromID(hwnd, NEWFIND_MLE),
[551]1551 MLM_IMPORT, MPFROMP(&here), MPFROMLONG(len));
[2]1552 }
[551]1553 WinCheckButton(hwnd, NEWFIND_ALSOSELECT, ad->alsoselect);
1554 WinCheckButton(hwnd, NEWFIND_SENSITIVE, ad->sensitive);
1555 WinCheckButton(hwnd, NEWFIND_LITERAL, ad->literalsearch);
[191]1556 }
1557 break;
[2]1558
[191]1559 case WM_COMMAND:
[551]1560 switch (SHORT1FROMMP(mp1)) {
[191]1561 case DID_OK:
1562 {
1563 CHAR s[SEARCHSTRINGLEN];
1564 IPT here = 0;
1565 ULONG len;
1566 HWND hwndClient = WinQueryWindowULong(hwnd, QWL_USER);
[2]1567
[191]1568 ad = (VIEWDATA *) WinQueryWindowPtr(hwndClient, QWL_USER);
1569 memset(s, 0, SEARCHSTRINGLEN);
1570 WinSendMsg(WinWindowFromID(hwnd, NEWFIND_MLE),
1571 MLM_SETIMPORTEXPORT,
[551]1572 MPFROMP(s), MPFROMLONG(SEARCHSTRINGLEN));
[191]1573 len = SEARCHSTRINGLEN;
1574 WinSendMsg(WinWindowFromID(hwnd, NEWFIND_MLE),
[551]1575 MLM_EXPORT, MPFROMP(&here), MPFROMLONG(&len));
[191]1576 s[SEARCHSTRINGLEN - 1] = 0;
[551]1577 if (!*s) {
[350]1578 DosBeep(250, 100); // Complain
[191]1579 break;
1580 }
[551]1581 strcpy(ad->searchtext, s);
1582 ad->sensitive = WinQueryButtonCheckstate(hwnd, NEWFIND_SENSITIVE);
1583 if (ad->sensitive != Sensitive) {
1584 Sensitive = ad->sensitive;
[191]1585 PrfWriteProfileData(fmprof,
1586 appname,
1587 "Viewer.Sensitive",
[551]1588 &ad->sensitive, sizeof(BOOL));
[191]1589 }
[551]1590 ad->literalsearch = WinQueryButtonCheckstate(hwnd, NEWFIND_LITERAL);
1591 if (ad->literalsearch != LiteralSearch) {
1592 LiteralSearch = ad->literalsearch;
[191]1593 PrfWriteProfileData(fmprof,
1594 appname,
1595 "Viewer.LiteralSearch",
[551]1596 &ad->literalsearch, sizeof(BOOL));
[191]1597 }
[551]1598 ad->alsoselect = WinQueryButtonCheckstate(hwnd, NEWFIND_ALSOSELECT);
1599 if (ad->alsoselect != AlsoSelect) {
1600 AlsoSelect = ad->alsoselect;
[191]1601 PrfWriteProfileData(fmprof,
1602 appname,
1603 "Viewer.AlsoSelect",
[551]1604 &ad->alsoselect, sizeof(BOOL));
[191]1605 }
[2]1606 }
[191]1607 WinDismissDlg(hwnd, 1);
1608 break;
1609 case DID_CANCEL:
1610 WinDismissDlg(hwnd, 0);
1611 break;
1612 }
1613 return 0;
[2]1614 }
[191]1615 return WinDefDlgProc(hwnd, msg, mp1, mp2);
[2]1616}
1617
[191]1618MRESULT EXPENTRY ViewWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[83]1619{
[191]1620 VIEWDATA *ad = WinQueryWindowPtr(hwnd, QWL_USER);
[2]1621
[551]1622 switch (msg) {
[191]1623 case WM_CREATE:
1624 {
1625 HWND temphwnd;
[377]1626 HWND hwndFrame = WinQueryWindow(hwnd, QW_PARENT);
[2]1627
[377]1628 temphwnd = WinCreateWindow(hwndFrame,
[191]1629 WC_BUTTON,
1630 "<",
1631 WS_VISIBLE |
1632 BS_PUSHBUTTON | BS_NOPOINTERFOCUS,
1633 0,
1634 0,
1635 0,
1636 0,
[377]1637 hwndFrame,
[551]1638 HWND_TOP, IDM_PREVBLANKLINE, NULL, NULL);
[377]1639 if (!temphwnd)
[551]1640 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__,
1641 IDS_WINCREATEWINDOW);
[377]1642 else {
[551]1643 WinSetPresParam(temphwnd,
1644 PP_FONTNAMESIZE,
1645 strlen(GetPString(IDS_8HELVTEXT)) + 1,
1646 (PVOID) GetPString(IDS_8HELVTEXT));
[377]1647 }
1648 temphwnd = WinCreateWindow(hwndFrame,
[191]1649 WC_BUTTON,
1650 ">",
1651 WS_VISIBLE |
1652 BS_PUSHBUTTON | BS_NOPOINTERFOCUS,
1653 0,
1654 0,
1655 0,
1656 0,
[377]1657 hwndFrame,
[551]1658 HWND_TOP, IDM_NEXTBLANKLINE, NULL, NULL);
[377]1659 if (!temphwnd)
[551]1660 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__,
1661 IDS_WINCREATEWINDOW);
[377]1662 else {
[551]1663 WinSetPresParam(temphwnd,
1664 PP_FONTNAMESIZE,
1665 strlen(GetPString(IDS_8HELVTEXT)) + 1,
1666 (PVOID) GetPString(IDS_8HELVTEXT));
[377]1667 }
[551]1668 WinStartTimer(WinQueryAnchorBlock(hwnd), hwnd, ID_TIMER5, 1000L);
[191]1669 }
1670 break;
[2]1671
[191]1672 case WM_TIMER:
1673 if (ad &&
[551]1674 ad->needrefreshing &&
1675 !ad->stopflag &&
1676 !ad->relining &&
1677 !DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN)) {
1678 ad->needrefreshing = FALSE;
1679 DosReleaseMutexSem(ad->ScanSem);
[191]1680 WinInvalidateRect(hwnd, NULL, TRUE);
1681 }
1682 break;
[2]1683
[191]1684 case UM_SETUP:
[377]1685 if (!ad)
[350]1686 Runtime_Error(pszSrcFile, __LINE__, "no data");
1687 else {
1688 CHAR s[CCHMAXPATH + 8];
1689 APIRET rc;
[551]1690
1691 ad->hwndMenu = WinWindowFromID(ad->hwndFrame, FID_MENU);
1692 ad->hvscroll = WinWindowFromID(ad->hwndFrame, FID_VERTSCROLL);
1693 ad->hhscroll = WinWindowFromID(ad->hwndFrame, FID_HORZSCROLL);
1694 WinSendMsg(ad->hhscroll, SBM_SETTHUMBSIZE, MPFROM2SHORT(1, 1), MPVOID);
1695 WinSendMsg(ad->hvscroll, SBM_SETTHUMBSIZE, MPFROM2SHORT(1, 1), MPVOID);
1696 sprintf(s, "%s: %s", FM2Str, ad->filename);
1697 WinSetWindowText(ad->hwndFrame, s);
1698 rc = DosCreateMutexSem(NULL, &ad->ScanSem, 0L, FALSE);
[350]1699 if (rc)
[551]1700 Dos_Error(MB_CANCEL, rc, hwnd, pszSrcFile, __LINE__,
1701 "DosCreateMutexSem");
[350]1702 else {
1703 PFNWP oldproc;
[551]1704 HWND hwndFrame = ad->hwndFrame;
1705
1706 WinSendMsg(ad->hvscroll,
1707 SBM_SETSCROLLBAR, MPFROMSHORT(1), MPFROM2SHORT(1, 1));
1708 WinSendMsg(ad->hhscroll, SBM_SETSCROLLBAR, MPFROMSHORT(1),
[191]1709 MPFROM2SHORT(1, 1));
[551]1710 ad->hwndStatus1 = WinCreateWindow(hwndFrame,
1711 GetPString(IDS_WCVIEWSTATUS),
1712 GetPString(IDS_LOADINGTEXT),
1713 WS_VISIBLE | SS_TEXT |
1714 DT_LEFT | DT_VCENTER,
1715 0,
1716 0,
1717 0,
1718 0,
1719 hwndFrame,
1720 HWND_TOP,
1721 NEWVIEW_STATUS1, NULL, NULL);
1722 if (!ad->hwndStatus1)
1723 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__,
1724 IDS_WINCREATEWINDOW);
[377]1725
[551]1726 ad->hwndStatus2 = WinCreateWindow(hwndFrame,
1727 GetPString(IDS_WCVIEWSTATUS),
1728 NULL,
1729 WS_VISIBLE | SS_TEXT |
1730 DT_LEFT | DT_VCENTER,
1731 0,
1732 0,
1733 0,
1734 0,
1735 hwndFrame,
1736 HWND_TOP,
1737 NEWVIEW_STATUS2, NULL, NULL);
1738 if (!ad->hwndStatus2)
1739 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__,
1740 IDS_WINCREATEWINDOW);
[377]1741
[551]1742 ad->hwndStatus3 = WinCreateWindow(hwndFrame,
1743 GetPString(IDS_WCVIEWSTATUS),
1744 NULL,
1745 WS_VISIBLE | SS_TEXT |
1746 DT_LEFT | DT_VCENTER,
1747 0,
1748 0,
1749 0,
1750 0,
1751 hwndFrame,
1752 HWND_TOP,
1753 NEWVIEW_STATUS3, NULL, NULL);
1754 if (!ad->hwndStatus3)
1755 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__,
1756 IDS_WINCREATEWINDOW);
[377]1757
[551]1758 ad->hwndListbox = WinCreateWindow(hwndFrame,
1759 WC_LISTBOX,
1760 NULL,
1761 LS_NOADJUSTPOS,
1762 0,
1763 0,
1764 0,
1765 0,
1766 hwndFrame,
1767 HWND_TOP,
1768 NEWVIEW_LISTBOX, NULL, NULL);
1769 if (!ad->hwndListbox)
1770 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__,
1771 IDS_WINCREATEWINDOW);
[377]1772
[551]1773 ad->hwndDrag = WinCreateWindow(hwndFrame,
1774 GetPString(IDS_WCVIEWSTATUS),
1775 "#100",
1776 WS_VISIBLE | SS_BITMAP,
1777 0,
1778 0,
1779 0,
1780 0,
1781 hwndFrame,
1782 HWND_TOP, NEWVIEW_DRAG, NULL, NULL);
1783 if (!ad->hwndDrag)
1784 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__,
1785 IDS_WINCREATEWINDOW);
[377]1786
1787 oldproc = WinSubclassWindow(hwndFrame, ViewFrameWndProc);
[551]1788 WinSetWindowPtr(hwndFrame, QWL_USER, (PVOID) oldproc);
1789 ad->hps = InitWindow(hwnd);
[533]1790 if (_beginthread(LoadFileThread, NULL, 524288, (PVOID) hwnd) == -1)
[551]1791 Runtime_Error(pszSrcFile, __LINE__,
1792 GetPString(IDS_COULDNTSTARTTHREADTEXT));
[350]1793 else {
1794 WinSendMsg(hwnd, UM_SETUP5, MPVOID, MPVOID);
1795 DosSleep(32L);
[551]1796 return (MRESULT) 1;
[191]1797 }
[2]1798 }
[191]1799 }
[350]1800 // Oops
[191]1801 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
1802 return 0;
[2]1803
[191]1804 case UM_SETUP5:
[551]1805 if (ad) {
1806 if (ad->hwndFrame ==
1807 WinQueryActiveWindow(WinQueryWindow(ad->hwndFrame,
[191]1808 QW_PARENT)) &&
[551]1809 !ParentIsDesktop(ad->hwndFrame, (HWND) 0)) {
[191]1810 if (hwndStatus2)
1811 WinSetWindowText(hwndStatus2,
[551]1812 (*ad->filename) ?
1813 ad->filename : GetPString(IDS_UNTITLEDTEXT));
1814 if (fMoreButtons) {
[191]1815 WinSetWindowText(hwndName,
[551]1816 (*ad->filename) ?
1817 ad->filename : GetPString(IDS_UNTITLEDTEXT));
[191]1818 WinSetWindowText(hwndDate, NullStr);
1819 WinSetWindowText(hwndAttr, NullStr);
1820 }
1821 if (hwndStatus)
1822 WinSetWindowText(hwndStatus,
1823 GetPString(IDS_INTERNALVIEWERTITLETEXT));
[2]1824 }
[191]1825 }
1826 return 0;
[2]1827
[191]1828 case DM_DISCARDOBJECT:
1829 case DM_PRINTOBJECT:
1830 return MRFROMLONG(DRR_TARGET);
[2]1831
[191]1832 case UM_RESCAN:
[551]1833 if (ad) {
1834 if (!ad->busy && !DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN)) {
1835 if (ad->numlines) {
[2]1836
[191]1837 CHAR s[80], tb[34], tl[34];
[2]1838
[551]1839 commafmt(tb, sizeof(tb), ad->textsize);
1840 commafmt(tl, sizeof(tl), ad->numlines);
[191]1841 sprintf(s,
1842 " %s %s%s %s %s%s",
1843 tb,
1844 GetPString(IDS_BYTETEXT),
[551]1845 &"s"[ad->textsize == 1],
1846 tl, GetPString(IDS_LINETEXT), &"s"[ad->numlines == 1]);
1847 WinSetWindowText(ad->hwndStatus1, s);
[191]1848 }
1849 else
[551]1850 WinSetWindowText(ad->hwndStatus1, GetPString(IDS_NVNOLINESTEXT));
1851 DosReleaseMutexSem(ad->ScanSem);
[2]1852 }
[191]1853 else
[551]1854 WinSetWindowText(ad->hwndStatus1, GetPString(IDS_WORKINGTEXT));
[191]1855 }
1856 return 0;
[2]1857
[191]1858 case UM_SETUP2:
1859 /*
1860 * calculate width of client in characters, recalc lines if
1861 * oldwidth != newwidth, set ad->oldwidth for later comparison
1862 */
[551]1863 if (ad) {
[2]1864
[191]1865 BOOL invalidate = FALSE;
[2]1866
[551]1867 if (!ad->wrapon && !ad->hex) {
1868 if (WinQueryWindow(ad->hhscroll, QW_PARENT) == ad->hwndFrame) {
[191]1869 invalidate = TRUE;
[551]1870 WinSetOwner(ad->hhscroll, HWND_OBJECT);
1871 WinSetParent(ad->hhscroll, HWND_OBJECT, TRUE);
1872 ad->maxx = 0;
1873 ad->horzscroll = 0;
[191]1874 }
[2]1875 }
[551]1876 else {
1877 if (WinQueryWindow(ad->hhscroll, QW_PARENT) != ad->hwndFrame) {
[191]1878 invalidate = TRUE;
[551]1879 WinSetOwner(ad->hhscroll, ad->hwndFrame);
1880 WinSetParent(ad->hhscroll, ad->hwndFrame, TRUE);
[191]1881 }
1882 }
[551]1883 if (invalidate) {
1884 WinSendMsg(ad->hwndFrame, WM_UPDATEFRAME, MPFROMLONG(FCF_SIZEBORDER),
[191]1885 MPVOID);
1886 WinInvalidateRect(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
1887 NEWVIEW_DRAG), NULL, FALSE);
[551]1888 WinInvalidateRect(ad->hhscroll, NULL, FALSE);
[191]1889 }
1890 }
[2]1891
[551]1892 if (ad && !ad->busy &&
1893 !DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN)) {
[2]1894
[191]1895 RECTL rcl;
1896 ULONG newwidth;
[2]1897
[191]1898 WinQueryWindowRect(hwnd, &rcl);
[551]1899 newwidth = (rcl.xRight - rcl.xLeft) / ad->fattrs.lAveCharWidth;
1900 if ((!ad->hex || ad->oldwidth == -1) &&
1901 newwidth != ad->oldwidth && ad->text && ad->textsize) {
1902 ad->oldwidth = newwidth;
1903 if (!ad->relining) {
1904 if (_beginthread(ReLineThread, NULL, 524288, (PVOID) hwnd) == -1) {
1905 Runtime_Error(pszSrcFile, __LINE__,
1906 GetPString(IDS_COULDNTSTARTTHREADTEXT));
1907 DosReleaseMutexSem(ad->ScanSem);
[191]1908 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
1909 return 0;
1910 }
1911 }
[2]1912 }
[551]1913 ad->oldwidth = newwidth;
1914 DosReleaseMutexSem(ad->ScanSem);
[191]1915 }
1916 return MRFROMLONG(TRUE);
[2]1917
[191]1918 case WM_CHAR:
1919 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
[551]1920 if (ad && !ad->busy && !(SHORT1FROMMP(mp1) & KC_KEYUP) &&
1921 !DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN)) {
[2]1922
[551]1923 ULONG numlines, wascursored = ad->cursored;
[191]1924 RECTL rcl;
[2]1925
[191]1926 WinQueryWindowRect(hwnd, &rcl);
1927 numlines = NumLines(&rcl, ad);
[551]1928 if (numlines) {
1929 if (SHORT1FROMMP(mp1) & KC_VIRTUALKEY) {
1930 switch (SHORT2FROMMP(mp2)) {
[191]1931 case VK_LEFT:
1932 WinSendMsg(hwnd, WM_HSCROLL, MPFROM2SHORT(FID_HORZSCROLL, 0),
1933 MPFROM2SHORT(0, SB_LINELEFT));
1934 break;
1935 case VK_RIGHT:
1936 WinSendMsg(hwnd, WM_HSCROLL, MPFROM2SHORT(FID_HORZSCROLL, 0),
1937 MPFROM2SHORT(0, SB_LINERIGHT));
1938 break;
1939 case VK_PAGEUP:
1940 PostMsg(hwnd, WM_VSCROLL, MPFROM2SHORT(FID_VERTSCROLL, 0),
1941 MPFROM2SHORT(0, SB_PAGEUP));
1942 break;
1943 case VK_PAGEDOWN:
1944 PostMsg(hwnd, WM_VSCROLL, MPFROM2SHORT(FID_VERTSCROLL, 0),
1945 MPFROM2SHORT(0, SB_PAGEDOWN));
1946 break;
1947 case VK_UP:
[551]1948 if (ad->cursored > 1) {
[191]1949 if (shiftstate & KC_SHIFT)
1950 WinSendMsg(hwnd, WM_BUTTON1CLICK,
[551]1951 MPFROM2SHORT(ad->fattrs.lAveCharWidth + 2,
1952 ((rcl.yTop - (ad->lMaxHeight *
1953 ((ad->cursored) -
1954 ad->topline))) -
1955 ad->lMaxDescender) - 1),
[191]1956 MPFROM2SHORT(TRUE, 0));
[551]1957 ad->cursored--;
1958 if (ad->cursored < ad->topline) {
1959 PaintLine(hwnd, ad->hps, ad->cursored, ad->topline, &rcl);
[191]1960 WinSendMsg(hwnd, WM_VSCROLL, MPFROM2SHORT(FID_VERTSCROLL, 0),
1961 MPFROM2SHORT(0, SB_LINEUP));
1962 }
[551]1963 else {
1964 PaintLine(hwnd, ad->hps, ad->cursored - 1, ad->topline, &rcl);
1965 PaintLine(hwnd, ad->hps, ad->cursored, ad->topline, &rcl);
[191]1966 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
1967 }
1968 }
1969 break;
1970 case VK_DOWN:
[551]1971 if (ad->cursored < ad->numlines &&
1972 ad->cursored < ad->topline + numlines) {
[191]1973 if (shiftstate & KC_SHIFT)
1974 WinSendMsg(hwnd, WM_BUTTON1CLICK,
[551]1975 MPFROM2SHORT(ad->fattrs.lAveCharWidth + 2,
1976 ((rcl.yTop - (ad->lMaxHeight *
1977 ((ad->cursored) -
1978 ad->topline))) -
1979 ad->lMaxDescender) - 1),
[191]1980 MPFROM2SHORT(TRUE, 0));
[551]1981 ad->cursored++;
1982 if (ad->cursored >= ad->topline + numlines) {
1983 PaintLine(hwnd, ad->hps, ad->cursored - 2, ad->topline, &rcl);
[191]1984 WinSendMsg(hwnd, WM_VSCROLL, MPFROM2SHORT(FID_VERTSCROLL, 0),
1985 MPFROM2SHORT(0, SB_LINEDOWN));
1986 }
[551]1987 else {
1988 PaintLine(hwnd, ad->hps, ad->cursored - 1, ad->topline, &rcl);
1989 PaintLine(hwnd, ad->hps, ad->cursored - 2, ad->topline, &rcl);
[191]1990 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
1991 }
1992 }
1993 break;
1994 case VK_END:
1995 if ((shiftstate & KC_CTRL) ||
[551]1996 ad->cursored == (ad->topline - 1) + numlines) {
1997 ad->cursored = ad->numlines;
1998 ad->topline = (ad->numlines + 1) - numlines;
1999 if (ad->topline > ad->numlines)
2000 ad->topline = 1;
[191]2001 WinInvalidateRect(hwnd, NULL, FALSE);
2002 }
[551]2003 else {
2004 ad->cursored = (ad->topline - 1) + numlines;
2005 if (ad->cursored > ad->numlines)
2006 ad->cursored = ad->numlines;
2007 PaintLine(hwnd, ad->hps, ad->cursored - 1, ad->topline, &rcl);
2008 PaintLine(hwnd, ad->hps, wascursored - 1, ad->topline, &rcl);
[191]2009 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
2010 }
2011 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
2012 break;
2013 case VK_HOME:
[551]2014 if ((shiftstate & KC_CTRL) || ad->cursored == ad->topline) {
2015 ad->topline = 1;
2016 ad->cursored = 1;
[191]2017 WinInvalidateRect(hwnd, NULL, FALSE);
2018 }
[551]2019 else {
2020 ad->cursored = ad->topline;
2021 PaintLine(hwnd, ad->hps, ad->cursored - 1, ad->topline, &rcl);
2022 PaintLine(hwnd, ad->hps, wascursored - 1, ad->topline, &rcl);
[191]2023 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
2024 }
2025 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
2026 break;
2027 case VK_SPACE:
2028 WinSendMsg(hwnd, WM_BUTTON1CLICK,
[551]2029 MPFROM2SHORT(ad->fattrs.lAveCharWidth + 2,
2030 ((rcl.yTop - (ad->lMaxHeight *
2031 ((ad->cursored) -
2032 ad->topline))) -
2033 ad->lMaxDescender) - 1),
[191]2034 MPFROM2SHORT(TRUE, 0));
2035 break;
2036 case VK_NEWLINE:
2037 case VK_ENTER:
2038 WinSendMsg(hwnd, WM_BUTTON1DBLCLK,
[551]2039 MPFROM2SHORT(ad->fattrs.lAveCharWidth + 2,
2040 ((rcl.yTop - (ad->lMaxHeight *
2041 ((ad->cursored) -
2042 ad->topline))) -
2043 ad->lMaxDescender) - 1), MPFROM2SHORT(0,
2044 0));
[191]2045 break;
2046 }
2047 }
[551]2048 else if (SHORT1FROMMP(mp1) & KC_CHAR) {
2049 switch (SHORT1FROMMP(mp2)) {
[191]2050 case '\r':
2051 case '\n':
2052 WinSendMsg(hwnd, WM_BUTTON1DBLCLK,
[551]2053 MPFROM2SHORT(ad->fattrs.lAveCharWidth + 2,
2054 (rcl.yTop - (ad->lMaxHeight *
2055 ((ad->cursored) -
2056 ad->topline))) - 1),
[191]2057 MPFROM2SHORT(0, 0));
2058 break;
2059 default:
2060 break;
2061 }
2062 }
[551]2063 if (wascursored != ad->cursored)
[191]2064 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
[2]2065 }
[551]2066 DosReleaseMutexSem(ad->ScanSem);
[191]2067 }
2068 break;
[2]2069
[191]2070 case WM_BUTTON1MOTIONSTART:
2071 WinSetFocus(HWND_DESKTOP, hwnd);
[551]2072 if (ad && !ad->stopflag && !ad->busy &&
2073 !DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN)) {
2074 ad->mousecaptured = TRUE;
2075 ad->lastselected = ULONG_MAX;
2076 ad->lastdirection = 0;
[191]2077 WinSetCapture(HWND_DESKTOP, hwnd);
2078 WinSendMsg(hwnd, WM_BUTTON1CLICK, mp1, MPFROM2SHORT(TRUE, 0));
2079 }
2080 break;
[2]2081
[191]2082 case WM_MOUSEMOVE:
2083 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
[551]2084 if (ad && ad->mousecaptured) {
[2]2085
[191]2086 ULONG numlines, whichline, x;
2087 LONG inc;
2088 RECTL Rectl;
2089 POINTS pts;
2090 BOOL outofwindow = FALSE;
[2]2091
[191]2092 WinQueryWindowRect(hwnd, &Rectl);
2093 numlines = NumLines(&Rectl, ad);
[551]2094 if (numlines) {
[191]2095 pts.x = SHORT1FROMMP(mp1);
2096 pts.y = SHORT2FROMMP(mp1);
[551]2097 if (pts.y < 0) {
[191]2098 WinSendMsg(hwnd, WM_VSCROLL, MPFROM2SHORT(FID_VERTSCROLL, 0),
2099 MPFROM2SHORT(0, SB_LINEDOWN));
2100 pts.y = 1;
2101 outofwindow = TRUE;
2102 }
[551]2103 else if (pts.y > Rectl.yTop - Rectl.yBottom) {
[191]2104 WinSendMsg(hwnd, WM_VSCROLL, MPFROM2SHORT(FID_VERTSCROLL, 0),
2105 MPFROM2SHORT(0, SB_LINEUP));
2106 pts.y = (Rectl.yTop - Rectl.yBottom) - 1;
2107 outofwindow = TRUE;
2108 }
2109 whichline = ((Rectl.yTop - Rectl.yBottom) -
[551]2110 ((LONG) pts.y + ad->lMaxDescender)) / ad->lMaxHeight;
[191]2111 if (whichline > numlines - 1)
2112 whichline = numlines - 1;
[551]2113 whichline += (ad->topline - 1);
2114 if (whichline < ad->numlines && ad->lastselected != whichline) {
2115 if (ad->lastselected != ULONG_MAX) {
2116 inc = (ad->lastselected < whichline) ? 1 : -1;
2117 for (x = ad->lastselected + inc;
2118 x != whichline && x < ad->numlines;
2119 (ad->lastselected < whichline) ? x++ : x--) {
2120 if (ad->markedlines) {
2121 if (ad->markedlines[x] & VF_SELECTED) {
2122 ad->markedlines[x] &= (~VF_SELECTED);
2123 ad->selected--;
[191]2124 }
[551]2125 else {
2126 ad->markedlines[x] |= VF_SELECTED;
2127 ad->selected++;
[191]2128 }
2129 }
[551]2130 PaintLine(hwnd, ad->hps, x, ad->topline, &Rectl);
[191]2131 }
2132 WinSendMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
2133 }
2134 WinSendMsg(hwnd, WM_BUTTON1CLICK, MPFROM2SHORT(pts.x, pts.y),
2135 MPFROM2SHORT(TRUE, 0));
2136 }
2137 }
[551]2138 if (outofwindow) {
[2]2139
[191]2140 POINTL ptl;
[2]2141
[191]2142 WinQueryPointerPos(HWND_DESKTOP, &ptl);
2143 WinMapWindowPoints(HWND_DESKTOP, hwnd, &ptl, 1L);
2144 if ((SHORT) ptl.y == (SHORT) SHORT2FROMMP(mp1) &&
2145 (SHORT) ptl.x == (SHORT) SHORT1FROMMP(mp1) &&
[551]2146 ((SHORT) ptl.y < 0 || ptl.y > (Rectl.yTop - Rectl.yBottom))) {
[191]2147 PostMsg(hwnd, UM_MOUSEMOVE, mp1, MPVOID);
2148 DosSleep(1L);
2149 }
[2]2150 }
[191]2151 }
2152 break;
[2]2153
[191]2154 case UM_MOUSEMOVE:
[551]2155 if (ad && ad->mousecaptured) {
[2]2156
[191]2157 POINTL ptl;
2158 RECTL Rectl;
[2]2159
[191]2160 WinQueryWindowRect(hwnd, &Rectl);
2161 WinQueryPointerPos(HWND_DESKTOP, &ptl);
2162 WinMapWindowPoints(HWND_DESKTOP, hwnd, &ptl, 1L);
2163 if ((SHORT) ptl.y == (SHORT) SHORT2FROMMP(mp1) &&
2164 (SHORT) ptl.x == (SHORT) SHORT1FROMMP(mp1) &&
[551]2165 ((SHORT) ptl.y < 0 || ptl.y > (Rectl.yTop - Rectl.yBottom))) {
[191]2166 DosSleep(1L);
2167 PostMsg(hwnd, WM_MOUSEMOVE, mp1, MPFROM2SHORT(TRUE, 0));
[2]2168 }
[191]2169 }
2170 return 0;
[2]2171
[191]2172 case WM_BUTTON1UP:
2173 case WM_BUTTON1MOTIONEND:
2174 WinSetFocus(HWND_DESKTOP, hwnd);
[551]2175 if (ad && ad->mousecaptured) {
2176 ad->mousecaptured = FALSE;
2177 ad->lastselected = ULONG_MAX;
2178 ad->lastdirection = 0;
2179 DosReleaseMutexSem(ad->ScanSem);
[191]2180 WinSetCapture(HWND_DESKTOP, NULLHANDLE);
2181 }
2182 break;
[2]2183
[191]2184 case WM_BUTTON1DBLCLK:
2185 case WM_BUTTON1CLICK:
2186 WinSetFocus(HWND_DESKTOP, hwnd);
[551]2187 if (ad && !ad->stopflag && ad->numlines && ad->text && !ad->busy &&
2188 !DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN)) {
[2]2189
[191]2190 ULONG numlines, whichline, wascursored, width;
2191 RECTL Rectl;
2192 POINTS pts;
[2]2193
[191]2194 WinQueryWindowRect(hwnd, &Rectl);
2195 numlines = NumLines(&Rectl, ad);
2196 if (!numlines)
2197 break;
2198 pts.x = SHORT1FROMMP(mp1);
2199 pts.y = SHORT2FROMMP(mp1);
2200 whichline = ((Rectl.yTop - Rectl.yBottom) -
[551]2201 ((LONG) pts.y + ad->lMaxDescender)) / ad->lMaxHeight;
[191]2202 if (whichline > numlines - 1)
2203 whichline = numlines - 1;
[551]2204 whichline += (ad->topline - 1);
2205 if (whichline + 1 > ad->numlines)
[191]2206 break;
[551]2207 wascursored = ad->cursored;
2208 ad->cursored = whichline + 1;
2209 if (msg == WM_BUTTON1CLICK) {
2210 if (ad->lastselected != ULONG_MAX) {
2211 if (whichline > ad->lastselected)
2212 ad->lastdirection = 1;
[191]2213 else
[551]2214 ad->lastdirection = 2;
[191]2215 }
2216 else
[551]2217 ad->lastdirection = 0;
2218 ad->lastselected = whichline;
2219 if (whichline < ad->numlines) {
2220 if (ad->markedlines) {
2221 if (ad->markedlines[whichline] & VF_SELECTED) {
2222 ad->selected--;
2223 ad->markedlines[whichline] &= (~VF_SELECTED);
[191]2224 }
[551]2225 else {
2226 ad->selected++;
2227 ad->markedlines[whichline] |= VF_SELECTED;
[191]2228 }
2229 }
2230 WinSendMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
2231 }
[551]2232 PaintLine(hwnd, ad->hps, whichline, ad->topline, &Rectl);
2233 if (ad->cursored != wascursored) {
2234 PaintLine(hwnd, ad->hps, wascursored - 1, ad->topline, &Rectl);
[191]2235 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
2236 }
2237 }
[551]2238 else {
[2]2239
[191]2240 SHORT numsels, sSelect = 0, numinserted;
2241 ULONG linenum;
[2]2242
[551]2243 if (!ad->hex && ad->lines) {
[2]2244
[191]2245 CHAR *p, *e;
[2]2246
[551]2247 width = (Rectl.xRight - Rectl.xLeft) / ad->fattrs.lAveCharWidth;
2248 e = p = ad->lines[whichline];
2249 while (*e != '\r' && *e != '\n' && e < ad->text + ad->textsize) {
2250 if (ad->wrapon && e - p == width)
[191]2251 break;
2252 e++;
2253 }
2254 if ((*e == '\r' || *e == '\n') && e > p)
2255 e--;
2256 width = e - p;
2257 if (!width)
2258 goto NoAdd;
[2]2259
[551]2260 if ((ad->httpin && *httprun &&
2261 strnstr(ad->lines[whichline], "http://", width)) ||
2262 (ad->ftpin && *ftprun &&
2263 strnstr(ad->lines[whichline], "ftp://", width))) {
[2]2264
[191]2265 USHORT ret;
2266 URLDATA *urld;
[2]2267
[551]2268 urld = xmallocz(sizeof(URLDATA), pszSrcFile, __LINE__);
[350]2269 if (urld) {
[551]2270 urld->size = sizeof(URLDATA);
2271 urld->line = ad->lines[whichline];
2272 urld->len = width;
[191]2273 ret = (USHORT) WinDlgBox(HWND_DESKTOP, hwnd, UrlDlgProc,
2274 FM3ModHandle, URL_FRAME, urld);
[350]2275 switch (ret) {
[191]2276 case 0:
2277 free(urld);
2278 goto NoAdd;
2279 case 1:
[551]2280 if (*urld->url)
[191]2281 runemf2(SEPARATE | WINDOWED,
[551]2282 hwnd, NULL, NULL, "%s %s", httprun, urld->url);
[191]2283 free(urld);
2284 goto NoAdd;
2285 case 2:
[551]2286 if (*urld->url)
[191]2287 runemf2(SEPARATE | WINDOWED,
[551]2288 hwnd, NULL, NULL, "%s %s", ftprun, urld->url);
[191]2289 free(urld);
2290 goto NoAdd;
2291 default:
2292 break;
2293 }
2294 free(urld);
2295 }
2296 }
2297 }
[551]2298 numsels = (SHORT) WinSendDlgItemMsg(ad->hwndFrame, NEWVIEW_LISTBOX,
2299 LM_QUERYITEMCOUNT, MPVOID,
2300 MPVOID);
2301 if (numsels > 0) {
2302 for (sSelect = 0; sSelect < numsels; sSelect++) {
2303 linenum =
2304 (ULONG) WinSendDlgItemMsg(ad->hwndFrame, NEWVIEW_LISTBOX,
2305 LM_QUERYITEMHANDLE,
2306 MPFROM2SHORT(sSelect, 0), MPVOID);
[191]2307 if (linenum == whichline)
2308 goto NoAdd;
2309 }
2310 }
2311 {
2312 CHAR *s = NULL, *p;
[2]2313
[551]2314 if (!ad->hex && ad->lines) {
2315 s = xmalloc(width + 2, pszSrcFile, __LINE__);
[191]2316 if (!s)
2317 goto NoAdd;
[551]2318 strncpy(s, ad->lines[whichline], width + 1);
[191]2319 s[width + 1] = 0;
2320 p = s;
[551]2321 while (*p) {
2322 if (*p == '\r' || *p == '\n') {
[191]2323 *p = 0;
2324 break;
2325 }
2326 p++;
2327 }
2328 }
[551]2329 else {
[2]2330
[191]2331 register ULONG x;
[2]2332
[551]2333 width = ad->textsize - (whichline * 16);
[191]2334 width = min(width, 16);
[551]2335 s = xmalloc(80, pszSrcFile, __LINE__);
[191]2336 if (!s)
2337 goto NoAdd;
2338 sprintf(s, "%08lx ", whichline * 16);
2339 p = s + 9;
[551]2340 for (x = 0; x < width; x++) {
2341 sprintf(p, " %02hx", ad->text[(whichline * 16) + x]);
[191]2342 p += 3;
2343 }
2344 *p = ' ';
2345 p++;
2346 *p = ' ';
2347 p++;
[551]2348 for (x = 0; x < width; x++) {
2349 *p = ad->text[(whichline * 16) + x];
[191]2350 p++;
2351 }
2352 *p = 0;
2353 }
[551]2354 if (s) {
2355 if (*s) {
2356 ad->dummy = TRUE;
2357 numinserted = (SHORT) WinSendDlgItemMsg(ad->hwndFrame,
[191]2358 NEWVIEW_LISTBOX,
2359 LM_INSERTITEM,
[551]2360 MPFROM2SHORT(LIT_END,
2361 0),
[191]2362 MPFROMP(s));
[551]2363 ad->dummy = FALSE;
[191]2364 if (numinserted >= 0)
[551]2365 WinSendDlgItemMsg(ad->hwndFrame, NEWVIEW_LISTBOX,
[191]2366 LM_SETITEMHANDLE,
2367 MPFROM2SHORT(numinserted, 0),
2368 MPFROMLONG(whichline));
2369 }
2370 free(s);
2371 }
2372 }
2373 if (!numsels)
[551]2374 WinSendMsg(ad->hwndFrame, WM_UPDATEFRAME,
[191]2375 MPFROMLONG(FCF_SIZEBORDER), MPVOID);
[2]2376 }
[191]2377 NoAdd:
[551]2378 DosReleaseMutexSem(ad->ScanSem);
[191]2379 DosPostEventSem(CompactSem);
2380 }
2381 break;
[2]2382
[191]2383 case WM_MENUEND:
[551]2384 if (ad && ad->hwndPopup == (HWND) mp2) {
2385 WinDestroyWindow(ad->hwndPopup);
2386 ad->hwndPopup = (HWND) 0;
[191]2387 }
2388 break;
2389
2390 case UM_CONTEXTMENU:
2391 case WM_CONTEXTMENU:
[551]2392 if (ad) {
2393 if (!ad->hwndPopup) {
2394 ad->hwndPopup =
2395 WinLoadMenu(HWND_DESKTOP, FM3ModHandle, NEWVIEW_POPUP);
2396 if (ad->hwndPopup)
2397 WinSetPresParam(ad->hwndPopup,
[191]2398 PP_FONTNAMESIZE,
2399 strlen(GetPString(IDS_8HELVTEXT)) + 1,
2400 GetPString(IDS_8HELVTEXT));
[2]2401 }
[551]2402 if (ad->hwndPopup) {
[2]2403
[191]2404 APIRET rc;
2405 SHORT sSelect;
[2]2406
[551]2407 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
2408 WinEnableMenuItem(ad->hwndPopup, IDM_SAVETOCLIP, (rc == 0 &&
2409 ad->selected != 0));
2410 WinEnableMenuItem(ad->hwndPopup, IDM_APPENDTOCLIP, (rc == 0 &&
2411 ad->selected !=
2412 0));
2413 WinEnableMenuItem(ad->hwndPopup, IDM_SAVETOLIST,
2414 (rc == 0 && ad->selected != 0));
2415 sSelect =
2416 (SHORT) WinSendDlgItemMsg(ad->hwndFrame, NEWVIEW_LISTBOX,
2417 LM_QUERYITEMCOUNT, MPVOID, MPVOID);
2418 WinEnableMenuItem(ad->hwndPopup, IDM_SAVETOCLIP2,
2419 (rc == 0 && sSelect > 0));
2420 WinEnableMenuItem(ad->hwndPopup, IDM_APPENDTOCLIP2,
2421 (rc == 0 && sSelect > 0));
2422 WinEnableMenuItem(ad->hwndPopup, IDM_SAVETOLIST2,
2423 (rc == 0 && sSelect > 0));
2424 WinEnableMenuItem(ad->hwndPopup, IDM_SELECTALL,
2425 (rc == 0 && ad->numlines != 0 && ad->markedlines));
2426 WinEnableMenuItem(ad->hwndPopup, IDM_DESELECTALL,
2427 (rc == 0 && ad->numlines != 0 && ad->markedlines
2428 && ad->selected != 0));
2429 WinEnableMenuItem(ad->hwndPopup, IDM_PREVSELECTED,
2430 (rc == 0 && ad->numlines != 0 && ad->markedlines
2431 && ad->selected != 0));
2432 WinEnableMenuItem(ad->hwndPopup, IDM_NEXTSELECTED,
2433 (rc == 0 && ad->numlines != 0 && ad->markedlines
2434 && ad->selected != 0));
2435 WinEnableMenuItem(ad->hwndPopup, IDM_SELECTFOUND,
2436 (rc == 0 && ad->numlines != 0 && ad->markedlines
2437 && ad->found != 0));
2438 WinEnableMenuItem(ad->hwndPopup, IDM_DESELECTFOUND,
2439 (rc == 0 && ad->numlines != 0 && ad->markedlines
2440 && ad->selected != 0 && ad->found != 0));
2441 WinEnableMenuItem(ad->hwndPopup, IDM_INVERT,
2442 (rc == 0 && ad->numlines != 0 && ad->markedlines));
2443 WinEnableMenuItem(ad->hwndPopup, IDM_FINDFIRST,
2444 (rc == 0 && ad->numlines != 0 && ad->markedlines));
2445 WinEnableMenuItem(ad->hwndPopup, IDM_FINDNEXT,
2446 (rc == 0 && ad->numlines != 0 && ad->markedlines
2447 && ad->found));
2448 WinEnableMenuItem(ad->hwndPopup, IDM_FINDPREV,
2449 (rc == 0 && ad->numlines != 0 && ad->markedlines
2450 && ad->found));
2451 WinEnableMenuItem(ad->hwndPopup, IDM_GOTOLINE,
2452 (rc == 0 && ad->numlines != 0));
2453 WinEnableMenuItem(ad->hwndPopup, IDM_GOTOOFFSET,
2454 (rc == 0 && ad->textsize != 0));
[191]2455 if (!rc)
[551]2456 DosReleaseMutexSem(ad->ScanSem);
2457 PopupMenu(hwnd, hwnd, ad->hwndPopup);
[2]2458 }
[191]2459 }
2460 break;
[2]2461
[191]2462 case UM_SETUP3:
[551]2463 if (ad && !ad->busy &&
2464 !DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN)) {
2465 ad->multiplier = ad->numlines / 32767;
2466 if (ad->multiplier * 32767 != ad->numlines)
2467 ad->multiplier++;
2468 if (!ad->multiplier)
2469 ad->multiplier++;
[191]2470 {
2471 RECTL Rectl;
2472 ULONG numlines;
[2]2473
[191]2474 WinQueryWindowRect(hwnd, &Rectl);
2475 numlines = NumLines(&Rectl, ad);
[551]2476 if (numlines) {
2477 WinSendMsg(ad->hhscroll, SBM_SETTHUMBSIZE,
2478 MPFROM2SHORT((SHORT) Rectl.xRight, (SHORT) ad->maxx),
[191]2479 MPVOID);
[551]2480 WinSendMsg(ad->hvscroll, SBM_SETTHUMBSIZE,
[191]2481 MPFROM2SHORT((SHORT) numlines,
[551]2482 (SHORT) min(ad->numlines, 32767)), MPVOID);
2483 if (ad->multiplier)
2484 WinSendMsg(ad->hvscroll, SBM_SETSCROLLBAR,
2485 MPFROMSHORT((SHORT) (ad->topline / ad->multiplier)),
2486 MPFROM2SHORT(1, (SHORT) ((ad->numlines + 1) /
2487 ad->multiplier) - numlines));
2488 WinSendMsg(ad->hhscroll, SBM_SETSCROLLBAR,
2489 MPFROMSHORT((SHORT) abs(ad->horzscroll)),
2490 MPFROM2SHORT(0, (SHORT) (ad->maxx - Rectl.xRight)));
2491 if (ad->numlines - ad->topline < numlines) {
2492 ad->topline = ((ad->numlines - ad->topline) - numlines);
[191]2493 WinInvalidateRect(hwnd, NULL, FALSE);
2494 }
2495 }
[2]2496 }
[551]2497 DosReleaseMutexSem(ad->ScanSem);
[191]2498 }
2499 return 0;
[2]2500
[191]2501 case UM_SETUP4:
[551]2502 if (ad && !ad->busy &&
2503 !DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN)) {
[2]2504
[191]2505 CHAR s[140], t[34];
2506 ULONG numlines;
2507 RECTL Rectl;
[2]2508
[191]2509 WinQueryWindowRect(hwnd, &Rectl);
2510 numlines = NumLines(&Rectl, ad);
[551]2511 commafmt(t, sizeof(t), ad->cursored);
[191]2512 strcpy(s, GetPString(IDS_LINECOLONTEXT));
2513 strcat(s, t);
[551]2514 if (ad->selected) {
2515 if (ad->selected > ad->numlines)
2516 ad->selected = 0;
2517 else {
2518 commafmt(t, sizeof(t), ad->selected);
[191]2519 strcat(s, " (");
2520 strcat(s, t);
2521 strcat(s, GetPString(IDS_SELECTEDPARENTEXT));
2522 }
[2]2523 }
[551]2524 if (ad->found) {
2525 if (ad->found > ad->numlines)
2526 ad->found = 0;
2527 else {
2528 commafmt(t, sizeof(t), ad->found);
[191]2529 strcat(s, " (");
2530 strcat(s, t);
2531 strcat(s, GetPString(IDS_FOUNDPARENTEXT));
2532 }
2533 }
[551]2534 WinSetWindowText(ad->hwndStatus2, s);
2535 if (!ad->hex && ad->lines)
2536 commafmt(t, sizeof(t), ad->lines[ad->cursored - 1] - ad->text);
[191]2537 else
[551]2538 commafmt(t, sizeof(t), (ad->cursored - 1) * 16);
[191]2539 strcpy(s, GetPString(IDS_OFFSETCOLONTEXT));
2540 strcat(s, t);
[551]2541 WinSetWindowText(ad->hwndStatus3, s);
2542 if (ad->multiplier)
2543 WinSendMsg(ad->hvscroll, SBM_SETSCROLLBAR,
2544 MPFROMSHORT((SHORT) (ad->topline / ad->multiplier)),
2545 MPFROM2SHORT(1, (SHORT) ((ad->numlines + 1) /
2546 ad->multiplier) - numlines));
2547 WinSendMsg(ad->hhscroll, SBM_SETSCROLLBAR,
2548 MPFROMSHORT((SHORT) abs(ad->horzscroll)),
2549 MPFROM2SHORT(0, (SHORT) (ad->maxx - Rectl.xRight)));
2550 DosReleaseMutexSem(ad->ScanSem);
[191]2551 }
2552 return 0;
[2]2553
[191]2554 case UM_CONTAINER_FILLED:
[551]2555 if (ad && !ad->busy &&
2556 !DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN)) {
2557 ad->stopflag = 0;
2558 ad->topline = 1;
2559 ad->cursored = 1;
2560 ad->multiplier = 1;
[191]2561 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
2562 WinEnableWindow(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
[551]2563 IDM_NEXTBLANKLINE), !ad->hex);
[191]2564 WinEnableWindow(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
[551]2565 IDM_PREVBLANKLINE), !ad->hex);
2566 if (!ad->numlines) {
2567 if (!ad->text)
2568 Runtime_Error(pszSrcFile, __LINE__, "no data");
[191]2569 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
2570 }
[551]2571 else {
2572 if (mp1 && (ULONG) mp1 < ad->numlines + 1) {
[2]2573
[191]2574 RECTL Rectl;
2575 ULONG numlines;
[2]2576
[191]2577 WinQueryWindowRect(hwnd, &Rectl);
2578 numlines = NumLines(&Rectl, ad);
[551]2579 if (numlines) {
2580 ad->topline = (ULONG) mp1;
2581 if (ad->numlines - ad->topline < numlines)
2582 ad->topline = ad->numlines - numlines;
2583 ad->cursored = (ULONG) mp1;
2584 if (mp2) {
2585 ad->cursored = (ULONG) mp2;
2586 if (ad->cursored > (ad->topline - 1) + numlines)
2587 ad->cursored = (ad->topline - 1) + numlines;
[191]2588 }
2589 }
2590 }
2591 WinSendMsg(hwnd, UM_SETUP3, MPVOID, MPVOID);
2592 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
2593 WinInvalidateRect(hwnd, NULL, FALSE);
[2]2594 }
[551]2595 DosReleaseMutexSem(ad->ScanSem);
[191]2596 }
2597 else if (ad)
[551]2598 ad->needrefreshing = TRUE;
[191]2599 return 0;
[2]2600
[191]2601 case WM_ERASEBACKGROUND:
2602 WinFillRect((HPS) mp1, (PRECTL) mp2,
[551]2603 standardcolors[ad->colors[COLORS_NORMALBACK]]);
[191]2604 return 0;
[2]2605
[191]2606 case WM_PAINT:
[551]2607 if (ad) {
[2]2608
[191]2609 HPS hpsp;
2610 RECTL Rectl;
2611 register ULONG x;
[551]2612 ULONG numlines, wascursored = ad->cursored;
[2]2613
[551]2614 hpsp = WinBeginPaint(hwnd, ad->hps, &Rectl);
[191]2615 WinFillRect(hpsp, &Rectl,
[551]2616 standardcolors[ad->colors[COLORS_NORMALBACK]]);
2617 if (!ad->stopflag && !ad->busy &&
2618 !DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN)) {
[191]2619 WinQueryWindowRect(hwnd, &Rectl);
2620 numlines = NumLines(&Rectl, ad);
[551]2621 if (numlines) {
2622 if (ad->numlines && (ad->lines || ad->hex)) {
2623 if (ad->topline > (ad->numlines + 1) - numlines)
2624 ad->topline = (ad->numlines + 1) - numlines;
2625 if (ad->topline > ad->numlines)
2626 ad->topline = 1;
2627 if (!ad->topline)
2628 ad->topline = 1;
2629 if (ad->cursored < ad->topline)
2630 ad->cursored = ad->topline;
2631 else if (ad->cursored > (ad->topline + numlines) - 1)
2632 ad->cursored = (ad->topline + numlines) - 1;
2633 if (ad->cursored > ad->numlines)
2634 ad->cursored = ad->numlines;
2635 if (wascursored != ad->cursored)
[191]2636 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
2637 }
2638 else
[551]2639 ad->topline = ad->cursored = 1;
2640 if (ad->numlines && (ad->lines || ad->hex)) {
2641 for (x = ad->topline - 1; x < ad->numlines; x++) {
[191]2642 if (((LONG) (Rectl.yTop -
[551]2643 (ad->lMaxHeight *
2644 (((x + 1) - ad->topline) + 1))) -
2645 ad->lMaxDescender) <= 0)
[191]2646 break;
[551]2647 PaintLine(hwnd, hpsp, x, ad->topline, &Rectl);
[191]2648 }
2649 }
2650 }
[551]2651 if (ad->multiplier)
2652 WinSendMsg(ad->hvscroll, SBM_SETSCROLLBAR,
2653 MPFROMSHORT((SHORT) (ad->topline / ad->multiplier)),
2654 MPFROM2SHORT(1, (SHORT) ((ad->numlines + 1) /
2655 ad->multiplier) - numlines));
2656 WinSendMsg(ad->hhscroll, SBM_SETSCROLLBAR,
2657 MPFROMSHORT((SHORT) abs(ad->horzscroll)),
2658 MPFROM2SHORT(0, (SHORT) (ad->maxx - Rectl.xRight)));
2659 WinSendMsg(ad->hhscroll, SBM_SETTHUMBSIZE,
2660 MPFROM2SHORT((SHORT) Rectl.xRight, (SHORT) ad->maxx),
[191]2661 MPVOID);
[551]2662 DosReleaseMutexSem(ad->ScanSem);
2663 ad->needrefreshing = FALSE;
[2]2664 }
[191]2665 else
[551]2666 ad->needrefreshing = TRUE;
[191]2667 WinEndPaint(hpsp);
2668 }
[551]2669 else {
[2]2670
[191]2671 HPS hpsp;
[2]2672
[191]2673 hpsp = WinBeginPaint(hwnd, (HPS) 0, NULL);
2674 WinEndPaint(hpsp);
2675 }
2676 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
2677 break;
[2]2678
[191]2679 case WM_HSCROLL:
2680 {
2681 RECTL rectl;
2682 BOOL invalidate = TRUE;
2683
2684 WinQueryWindowRect(hwnd, &rectl);
[551]2685 switch (SHORT2FROMMP(mp2)) {
[191]2686 case SB_PAGERIGHT:
[551]2687 if (abs(ad->horzscroll) <= ad->maxx - rectl.xRight) {
2688 ad->horzscroll -= rectl.xRight;
2689 if (abs(ad->horzscroll) > ad->maxx - rectl.xRight)
2690 ad->horzscroll = -((ad->maxx - rectl.xRight) +
2691 ad->fattrs.lAveCharWidth);
[191]2692 }
2693 else
2694 invalidate = FALSE;
2695 break;
[2]2696
[191]2697 case SB_PAGELEFT:
[551]2698 if (ad->horzscroll < 0) {
2699 ad->horzscroll += rectl.xRight;
2700 if (ad->horzscroll > 0)
2701 ad->horzscroll = 0;
[191]2702 }
2703 else
2704 invalidate = FALSE;
2705 break;
[2]2706
[191]2707 case SB_LINERIGHT:
[551]2708 if (abs(ad->horzscroll) <= ad->maxx - rectl.xRight)
2709 ad->horzscroll -= ad->fattrs.lAveCharWidth;
[191]2710 else
2711 invalidate = FALSE;
2712 break;
[2]2713
[191]2714 case SB_LINELEFT:
[551]2715 if (ad->horzscroll < 0)
2716 ad->horzscroll += ad->fattrs.lAveCharWidth;
[191]2717 else
2718 invalidate = FALSE;
2719 break;
[2]2720
[191]2721 case SB_SLIDERTRACK:
[551]2722 ad->horzscroll = (SHORT1FROMMP(mp2) / ad->fattrs.lAveCharWidth) *
2723 ad->fattrs.lAveCharWidth;
2724 ad->horzscroll = -(ad->horzscroll);
2725 if (ad->horzscroll > 0)
2726 ad->horzscroll = 0;
2727 if (abs(ad->horzscroll) > (ad->maxx - rectl.xRight) +
2728 ad->fattrs.lAveCharWidth)
2729 ad->horzscroll = -(ad->maxx - rectl.xRight);
[191]2730 break;
[2]2731
[191]2732 default:
2733 invalidate = FALSE;
2734 break;
[2]2735 }
[191]2736 if (invalidate)
2737 WinInvalidateRect(hwnd, NULL, FALSE);
2738 }
2739 break;
[2]2740
[191]2741 case WM_VSCROLL:
[551]2742 if (ad && !ad->stopflag && ad->text && ad->numlines && !ad->busy &&
2743 !DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN)) {
[2]2744
[191]2745 ULONG numlines, wascursored;
2746 RECTL rcl;
[2]2747
[191]2748 WinQueryWindowRect(hwnd, &rcl);
2749 numlines = NumLines(&rcl, ad);
[551]2750 if (numlines) {
2751 wascursored = ad->cursored;
2752 switch (SHORT2FROMMP(mp2)) {
[191]2753 case SB_PAGEUP:
[551]2754 if (ad->topline > 1) {
2755 ad->topline -= numlines;
2756 if (ad->topline > ad->numlines ||
2757 ad->topline + numlines > (ad->numlines + 1))
2758 ad->topline = 1;
2759 if (ad->cursored > ad->topline + numlines)
2760 ad->cursored = ad->topline + numlines;
2761 if (ad->cursored > ad->numlines)
2762 ad->cursored = ad->numlines;
[191]2763 WinInvalidateRect(hwnd, NULL, FALSE);
2764 }
2765 break;
2766 case SB_PAGEDOWN:
[551]2767 if (ad->topline + numlines <= ad->numlines) {
2768 ad->topline += numlines;
2769 if (ad->topline + numlines > ad->numlines + 1)
2770 ad->topline = (ad->numlines + 1) - numlines;
2771 if (ad->cursored < ad->topline)
2772 ad->cursored = ad->topline;
2773 if (ad->cursored + 1 > ad->topline + numlines)
2774 ad->cursored = (ad->topline + numlines) - 1;
2775 if (ad->cursored > ad->numlines)
2776 ad->cursored = ad->numlines;
[191]2777 WinInvalidateRect(hwnd, NULL, FALSE);
2778 }
2779 break;
2780 case SB_LINEDOWN:
[551]2781 if (ad->topline + numlines <= ad->numlines) {
[2]2782
[191]2783 RECTL Rectl, iRectl;
[2]2784
[551]2785 ad->topline++;
2786 if (ad->cursored < ad->topline)
2787 ad->cursored = ad->topline;
2788 else if (ad->cursored + 1 > ad->topline + numlines)
2789 ad->cursored = (ad->topline + numlines) - 1;
2790 if (ad->cursored > ad->numlines)
2791 ad->cursored = ad->numlines;
[191]2792 WinQueryWindowRect(hwnd, &Rectl);
[551]2793 WinScrollWindow(hwnd, 0, ad->lMaxHeight,
[191]2794 NULL, NULL, NULLHANDLE, &iRectl, 0);
[551]2795 WinFillRect(ad->hps, &iRectl,
2796 standardcolors[ad->colors[COLORS_NORMALBACK]]);
2797 PaintLine(hwnd, ad->hps, (ad->topline + numlines) - 2,
2798 ad->topline, &Rectl);
2799 if (ad->cursored != ad->topline + numlines)
2800 PaintLine(hwnd, ad->hps, ad->cursored - 1, ad->topline, &Rectl);
2801 if (wascursored != ad->cursored &&
2802 wascursored < ad->topline + numlines &&
2803 wascursored >= ad->topline)
2804 PaintLine(hwnd, ad->hps, wascursored - 1, ad->topline, &Rectl);
2805 if (numlines >= ad->numlines)
[191]2806 numlines = 0;
[551]2807 if (ad->multiplier)
2808 WinSendMsg(ad->hvscroll, SBM_SETSCROLLBAR,
2809 MPFROMSHORT((SHORT) (ad->topline / ad->multiplier)),
2810 MPFROM2SHORT(1, (SHORT) ((ad->numlines + 1) /
2811 ad->multiplier) -
[191]2812 numlines));
[551]2813 WinSendMsg(ad->hhscroll, SBM_SETSCROLLBAR,
2814 MPFROMSHORT((SHORT) abs(ad->horzscroll)),
2815 MPFROM2SHORT(0, (SHORT) (ad->maxx - Rectl.xRight)));
[191]2816 }
2817 break;
2818 case SB_LINEUP:
[551]2819 if (ad->topline > 1) {
[2]2820
[191]2821 RECTL Rectl, iRectl;
[2]2822
[551]2823 ad->topline--;
2824 if (ad->cursored < ad->topline)
2825 ad->cursored = ad->topline;
2826 else if (ad->cursored + 1 > ad->topline + numlines)
2827 ad->cursored = (ad->topline + numlines) - 1;
2828 if (ad->cursored > ad->numlines)
2829 ad->cursored = ad->numlines;
[191]2830 WinQueryWindowRect(hwnd, &Rectl);
[551]2831 WinScrollWindow(hwnd, 0, -ad->lMaxHeight,
[191]2832 NULL, NULL, NULLHANDLE, &iRectl, 0);
[551]2833 WinFillRect(ad->hps, &iRectl,
2834 standardcolors[ad->colors[COLORS_NORMALBACK]]);
[191]2835 iRectl = Rectl;
[551]2836 iRectl.yTop -= ((numlines * ad->lMaxHeight) + ad->lMaxDescender);
2837 WinFillRect(ad->hps, &iRectl,
2838 standardcolors[ad->colors[COLORS_NORMALBACK]]);
2839 PaintLine(hwnd, ad->hps, ad->topline - 1, ad->topline, &Rectl);
2840 if (ad->cursored != ad->topline)
2841 PaintLine(hwnd, ad->hps, ad->cursored - 1, ad->topline, &Rectl);
2842 if (ad->cursored != wascursored &&
2843 wascursored >= ad->topline &&
2844 wascursored < ad->topline + numlines)
2845 PaintLine(hwnd, ad->hps, wascursored - 1, ad->topline, &Rectl);
2846 if (numlines >= ad->numlines)
[191]2847 numlines = 0;
[551]2848 if (ad->multiplier)
2849 WinSendMsg(ad->hvscroll, SBM_SETSCROLLBAR,
2850 MPFROMSHORT((SHORT) (ad->topline / ad->multiplier)),
2851 MPFROM2SHORT(1, (SHORT) ((ad->numlines + 1) /
2852 ad->multiplier) -
[191]2853 numlines));
[551]2854 WinSendMsg(ad->hhscroll, SBM_SETSCROLLBAR,
2855 MPFROMSHORT((SHORT) abs(ad->horzscroll)),
2856 MPFROM2SHORT(0, (SHORT) (ad->maxx - Rectl.xRight)));
[191]2857 }
2858 break;
2859 case SB_SLIDERTRACK:
[551]2860 if ((SHORT1FROMMP(mp2) >= 1) || (SHORT1FROMMP(mp2)) <= ad->numlines) {
2861 ad->topline = (ULONG) SHORT1FROMMP(mp2) * ad->multiplier;
2862 if (ad->topline + numlines > ad->numlines + 1)
2863 ad->topline = (ad->numlines + 1) - numlines;
2864 if (!ad->topline)
2865 ad->topline = 1;
2866 if (ad->cursored < ad->topline)
2867 ad->cursored = ad->topline;
2868 else if (ad->cursored > ad->topline + numlines)
2869 ad->cursored = ad->topline + numlines;
2870 if (ad->cursored > ad->numlines)
2871 ad->cursored = ad->numlines;
[191]2872 WinInvalidateRect(hwnd, NULL, FALSE);
2873 }
2874 else
2875 WinAlarm(HWND_DESKTOP, WA_NOTE);
2876 break;
2877 }
[551]2878 if (ad->cursored != wascursored)
[191]2879 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
[2]2880 }
[551]2881 DosReleaseMutexSem(ad->ScanSem);
[191]2882 }
2883 break;
[2]2884
[191]2885 case WM_INITMENU:
[551]2886 switch (SHORT1FROMMP(mp1)) {
[191]2887 case IDM_FILESMENU:
2888 {
2889 APIRET rc;
2890 SHORT sSelect;
[2]2891
[551]2892 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
2893 WinEnableMenuItem((HWND) mp2, IDM_SAVETOCLIP, (rc == 0 &&
2894 ad->selected != 0));
2895 WinEnableMenuItem((HWND) mp2, IDM_APPENDTOCLIP, (rc == 0 &&
2896 ad->selected != 0));
2897 WinEnableMenuItem((HWND) mp2, IDM_SAVETOLIST, (rc == 0 &&
2898 ad->selected != 0));
2899 sSelect = (SHORT) WinSendDlgItemMsg(ad->hwndFrame, NEWVIEW_LISTBOX,
2900 LM_QUERYITEMCOUNT, MPVOID,
2901 MPVOID);
2902 WinEnableMenuItem((HWND) mp2, IDM_SAVETOCLIP2,
2903 (rc == 0 && sSelect > 0));
2904 WinEnableMenuItem((HWND) mp2, IDM_APPENDTOCLIP2,
2905 (rc == 0 && sSelect > 0));
2906 WinEnableMenuItem((HWND) mp2, IDM_SAVETOLIST2,
2907 (rc == 0 && sSelect > 0));
[191]2908 if (!rc)
[551]2909 DosReleaseMutexSem(ad->ScanSem);
[191]2910 }
2911 break;
[2]2912
[191]2913 case IDM_VIEWSMENU:
2914 {
2915 APIRET rc;
[2]2916
[551]2917 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
2918 WinEnableMenuItem((HWND) mp2, IDM_FONTPALETTE, (rc == 0));
2919 WinEnableMenuItem((HWND) mp2, IDM_HEXMODE, (rc == 0));
2920 WinEnableMenuItem((HWND) mp2, IDM_WRAP, (rc == 0));
2921 WinEnableMenuItem((HWND) mp2, IDM_CODEPAGE, (rc == 0));
[191]2922 if (!rc)
[551]2923 DosReleaseMutexSem(ad->ScanSem);
[191]2924 }
[551]2925 WinCheckMenuItem((HWND) mp2, IDM_HEXMODE, ad->hex);
2926 WinCheckMenuItem((HWND) mp2, IDM_WRAP, ad->wrapon);
2927 WinCheckMenuItem((HWND) mp2, IDM_IGNOREFTP, ad->ignoreftp);
2928 WinCheckMenuItem((HWND) mp2, IDM_IGNOREHTTP, ad->ignorehttp);
[191]2929 break;
[2]2930
[191]2931 case IDM_SEARCHMENU:
2932 {
2933 APIRET rc;
[2]2934
[551]2935 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
2936 WinEnableMenuItem((HWND) mp2, IDM_FINDFIRST, (rc == 0 &&
2937 ad->numlines != 0 &&
2938 ad->markedlines));
2939 WinEnableMenuItem((HWND) mp2, IDM_FINDNEXT, (rc == 0 &&
2940 ad->numlines != 0 &&
2941 ad->markedlines &&
2942 ad->found != 0));
2943 WinEnableMenuItem((HWND) mp2, IDM_FINDPREV, (rc == 0 &&
2944 ad->numlines != 0 &&
2945 ad->markedlines &&
2946 ad->found != 0));
2947 WinEnableMenuItem((HWND) mp2, IDM_NEXTBLANKLINE, (rc == 0 &&
2948 ad->numlines != 0 &&
2949 !ad->hex));
2950 WinEnableMenuItem((HWND) mp2, IDM_PREVBLANKLINE, (rc == 0 &&
2951 ad->numlines != 0 &&
2952 !ad->hex));
2953 WinEnableMenuItem((HWND) mp2, IDM_GOTOLINE, (rc == 0 &&
2954 ad->numlines != 0));
2955 WinEnableMenuItem((HWND) mp2, IDM_GOTOOFFSET, (rc == 0 &&
2956 ad->textsize != 0));
[191]2957 if (!rc)
[551]2958 DosReleaseMutexSem(ad->ScanSem);
[191]2959 }
2960 break;
[2]2961
[191]2962 case IDM_SELECTSUBMENU:
2963 {
2964 APIRET rc;
[2]2965
[551]2966 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
2967 WinEnableMenuItem((HWND) mp2, IDM_SELECTALL, (rc == 0 &&
2968 ad->numlines != 0 &&
2969 ad->markedlines &&
2970 (ad->selected !=
2971 ad->numlines ||
2972 !ad->selected)));
2973 WinEnableMenuItem((HWND) mp2, IDM_DESELECTALL, (rc == 0 &&
2974 ad->numlines != 0 &&
2975 ad->markedlines &&
2976 ad->selected != 0));
2977 WinEnableMenuItem((HWND) mp2, IDM_DESELECTFOUND, (rc == 0 &&
2978 ad->numlines != 0 &&
2979 ad->markedlines &&
2980 ad->selected != 0 &&
2981 ad->found != 0));
2982 WinEnableMenuItem((HWND) mp2, IDM_SELECTFOUND, (rc == 0 &&
2983 ad->numlines != 0 &&
2984 ad->markedlines &&
2985 ad->found != 0 &&
2986 (ad->numlines !=
2987 ad->selected ||
2988 !ad->selected)));
2989 WinEnableMenuItem((HWND) mp2, IDM_NEXTSELECTED, (rc == 0 &&
2990 ad->numlines != 0 &&
2991 ad->markedlines &&
2992 ad->selected != 0));
2993 WinEnableMenuItem((HWND) mp2, IDM_PREVSELECTED, (rc == 0 &&
2994 ad->numlines != 0 &&
2995 ad->markedlines &&
2996 ad->selected != 0));
2997 WinEnableMenuItem((HWND) mp2, IDM_INVERT, (rc == 0 &&
2998 ad->numlines != 0 &&
2999 ad->markedlines));
[191]3000 if (!rc)
[551]3001 DosReleaseMutexSem(ad->ScanSem);
[2]3002 }
3003 break;
[191]3004 }
3005 break;
[2]3006
[191]3007 case UM_CONTROL:
[551]3008 switch (SHORT1FROMMP(mp1)) {
[191]3009 case NEWVIEW_LISTBOX:
[551]3010 switch (SHORT2FROMMP(mp1)) {
[191]3011 case LN_SETFOCUS:
[551]3012 if (ad) {
3013 if (!ad->clientfocused) {
[191]3014 PostMsg(hwnd,
[551]3015 WM_COMMAND, MPFROM2SHORT(IDM_NEXTWINDOW, 0), MPVOID);
[191]3016 break;
3017 }
[551]3018 ad->clientfocused = FALSE;
[191]3019 }
3020 PostMsg(hwnd,
[551]3021 UM_CONTROL, MPFROM2SHORT(NEWVIEW_LISTBOX, LN_SELECT), MPVOID);
[191]3022 break;
3023 case LN_KILLFOCUS:
[551]3024 if (ad) {
3025 ad->clientfocused = TRUE;
[191]3026 WinSetFocus(HWND_DESKTOP, hwnd);
3027 }
3028 break;
3029 case LN_SELECT:
[551]3030 if (ad && !ad->dummy) {
[2]3031
[191]3032 ULONG linenum, numlines;
3033 SHORT sSelect;
[551]3034 HWND hwndUL = WinWindowFromID(ad->hwndFrame,
[191]3035 SHORT1FROMMP(mp1));
3036 RECTL Rectl;
[2]3037
[191]3038 sSelect = (SHORT) WinSendMsg(hwndUL,
3039 LM_QUERYSELECTION,
[551]3040 MPFROM2SHORT(LIT_FIRST, 0), MPVOID);
3041 if (sSelect >= 0) {
[191]3042 linenum = (ULONG) WinSendMsg(hwndUL,
3043 LM_QUERYITEMHANDLE,
[551]3044 MPFROM2SHORT(sSelect, 0), MPVOID);
3045 if (ad->topline != linenum + 1 && linenum < ad->numlines) {
[191]3046 WinQueryWindowRect(hwnd, &Rectl);
3047 numlines = NumLines(&Rectl, ad);
[551]3048 ad->topline = linenum + 1;
3049 if (ad->numlines - ad->topline < numlines)
3050 ad->topline = ad->numlines - numlines;
3051 ad->cursored = linenum + 1;
[191]3052 WinInvalidateRect(hwnd, NULL, FALSE);
3053 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
3054 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
3055 }
3056 }
3057 else
3058 PostMsg(hwndUL, LM_SELECTITEM, MPFROM2SHORT(0, 0),
3059 MPFROM2SHORT(TRUE, 0));
3060 }
3061 break;
[2]3062
[191]3063 case LN_ENTER:
[551]3064 if (ad) {
[2]3065
[191]3066 SHORT sSelect;
[551]3067 HWND hwndUL = WinWindowFromID(ad->hwndFrame,
[191]3068 SHORT1FROMMP(mp1));
[2]3069
[191]3070 sSelect = (SHORT) WinSendMsg(hwndUL,
3071 LM_QUERYSELECTION,
[551]3072 MPFROM2SHORT(LIT_FIRST, 0), MPVOID);
3073 if (sSelect >= 0) {
3074 ad->dummy = TRUE;
[191]3075 WinSendMsg(hwndUL, LM_DELETEITEM,
3076 MPFROM2SHORT(sSelect, 0), MPVOID);
[551]3077 ad->dummy = FALSE;
[191]3078 sSelect = (SHORT) WinSendMsg(hwndUL,
[551]3079 LM_QUERYITEMCOUNT, MPVOID, MPVOID);
3080 if (sSelect <= 0) {
3081 PostMsg(ad->hwndFrame, WM_UPDATEFRAME,
[191]3082 MPFROMLONG(FCF_SIZEBORDER), MPVOID);
3083 WinSetFocus(HWND_DESKTOP, hwnd);
3084 }
3085 }
3086 }
3087 break;
[2]3088
[191]3089 default:
3090 break;
[2]3091 }
[191]3092 break;
[2]3093
[191]3094 default:
3095 break;
3096 }
3097 return 0;
[2]3098
[191]3099 case WM_COMMAND:
[551]3100 switch (SHORT1FROMMP(mp1)) {
[191]3101 case IDM_EDIT:
[551]3102 if (*editor) {
[2]3103
[191]3104 CHAR *dummy[2];
[2]3105
[551]3106 dummy[0] = ad->filename;
[191]3107 dummy[1] = NULL;
3108 ExecOnList(hwnd, editor, WINDOWED | SEPARATE, NULL, dummy, NULL);
3109 }
3110 else
[551]3111 StartMLEEditor(ad->hwndParent, 4, ad->filename, ad->hwndFrame);
3112 ad->hwndRestore = (HWND) 0;
[191]3113 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
3114 break;
[2]3115
[191]3116 case IDM_IGNOREFTP:
[551]3117 ad->ignoreftp = (ad->ignoreftp) ? FALSE : TRUE;
3118 ad->ftpin = FALSE;
3119 if (ad->text && *ftprun && !ad->ignoreftp && strstr(ad->text, "ftp://"))
3120 ad->ftpin = TRUE;
3121 IgnoreFTP = ad->ignoreftp;
[191]3122 PrfWriteProfileData(fmprof, appname, "Viewer.IgnoreFTP",
[551]3123 &ad->ignoreftp, sizeof(BOOL));
[191]3124 WinInvalidateRect(hwnd, NULL, FALSE);
3125 break;
[2]3126
[191]3127 case IDM_IGNOREHTTP:
[551]3128 ad->ignorehttp = (ad->ignorehttp) ? FALSE : TRUE;
3129 ad->httpin = FALSE;
3130 if (ad->text && *httprun && !ad->ignorehttp &&
3131 strstr(ad->text, "http://"))
3132 ad->httpin = TRUE;
3133 IgnoreHTTP = ad->ignorehttp;
[191]3134 PrfWriteProfileData(fmprof, appname, "Viewer.IgnoreHTTP",
[551]3135 &ad->ignorehttp, sizeof(BOOL));
[191]3136 WinInvalidateRect(hwnd, NULL, FALSE);
3137 break;
[2]3138
[191]3139 case IDM_PREVBLANKLINE:
[551]3140 if (!ad->hex && ad->lines) {
[2]3141
[191]3142 ULONG x;
[2]3143
[551]3144 x = ad->cursored - 2;
3145 if (x >= ad->numlines)
[191]3146 x = 0;
[551]3147 while (x < ad->numlines &&
3148 (*ad->lines[x] == '\r' || *ad->lines[x] == '\n'))
[191]3149 x--;
[551]3150 if (x >= ad->numlines)
[191]3151 x = 0;
[551]3152 for (; x < ad->numlines; x--) {
3153 if (*ad->lines[x] == '\r' || *ad->lines[x] == '\n') {
3154 if (x < ad->numlines - 1)
[191]3155 x++;
3156 break;
3157 }
3158 }
[551]3159 if (x < ad->numlines) {
3160 ad->topline = ad->cursored = x;
[191]3161 WinInvalidateRect(hwnd, NULL, FALSE);
3162 }
3163 }
3164 break;
[2]3165
[191]3166 case IDM_NEXTBLANKLINE:
[551]3167 if (!ad->hex && ad->lines) {
[2]3168
[191]3169 ULONG x;
[2]3170
[551]3171 x = ad->cursored;
3172 while (x < ad->numlines &&
3173 (*ad->lines[x] == '\r' || *ad->lines[x] == '\n'))
[191]3174 x++;
[551]3175 for (; x < ad->numlines; x++) {
3176 if (*ad->lines[x] == '\r' || *ad->lines[x] == '\n') {
3177 if (x < ad->numlines - 1)
[191]3178 x++;
3179 break;
3180 }
3181 }
[551]3182 if (x < ad->numlines) {
3183 while (x < ad->numlines &&
3184 (*ad->lines[x] == '\r' || *ad->lines[x] == '\n'))
[191]3185 x++;
[551]3186 if (x < ad->numlines) {
3187 ad->topline = ad->cursored = x;
[191]3188 WinInvalidateRect(hwnd, NULL, FALSE);
3189 }
3190 }
3191 }
3192 break;
[2]3193
[191]3194 case IDM_VIEW:
3195 case IDM_OBJECT:
[551]3196 if (!ad->hex && ad->lines) {
[2]3197
[191]3198 CHAR line[CCHMAXPATH], filename[CCHMAXPATH], *p;
[2]3199
[551]3200 strncpy(line, ad->lines[ad->cursored - 1], CCHMAXPATH);
[191]3201 line[CCHMAXPATH - 1] = 0;
[368]3202 chop_at_crnl(line);
[551]3203 if (*line == '\"') {
[191]3204 memmove(line, line + 1, strlen(line));
3205 p = strchr(line, '\"');
3206 lstrip(line);
3207 if (p)
3208 *p = 0;
3209 rstrip(line);
3210 }
[551]3211 else {
[191]3212 lstrip(line);
3213 p = strchr(line, ' ');
3214 if (p)
3215 *p = 0;
3216 rstrip(line);
3217 }
[551]3218 if (!strchr(line, '\\') && !strchr(line, '/') && !strchr(line, ':')) {
3219 strcpy(filename, ad->filename);
[191]3220 p = strrchr(filename, '\\');
3221 if (p)
3222 p++;
3223 else
3224 p = filename;
3225 strcpy(p, line);
3226 }
3227 else
3228 strcpy(filename, line);
3229 MakeFullName(filename);
[551]3230 if (*filename && IsFile(filename) == 1) {
[191]3231 if (SHORT1FROMMP(mp1) == IDM_OBJECT)
[551]3232 OpenObject(filename, Default, ad->hwndFrame);
[191]3233 else
[551]3234 DefaultView(hwnd, ad->hwndFrame, HWND_DESKTOP, NULL, 0, filename);
[191]3235 }
3236 }
3237 break;
[2]3238
[191]3239 case IDM_COLORPALETTE:
3240 {
3241 COLORS co;
3242 LONG temp[COLORS_MAX];
[2]3243
[191]3244 memset(&co, 0, sizeof(co));
3245 co.size = sizeof(co);
3246 co.numcolors = COLORS_MAX;
[551]3247 co.colors = ad->colors;
[191]3248 co.descriptions = IDS_NVCOLORS1TEXT;
3249 co.origs = temp;
3250 co.prompt = IDS_NVCOLORSPROMPTTEXT;
[551]3251 memcpy(temp, ad->colors, sizeof(LONG) * COLORS_MAX);
[191]3252 if (WinDlgBox(HWND_DESKTOP,
3253 hwnd,
3254 ColorDlgProc,
[551]3255 FM3ModHandle, COLOR_FRAME, (PVOID) & co)) {
3256 memcpy(Colors, ad->colors, sizeof(LONG) * COLORS_MAX);
[191]3257 PrfWriteProfileData(fmprof,
3258 appname,
3259 "Viewer.Colors",
[551]3260 &ad->colors, sizeof(LONG) * COLORS_MAX);
3261 WinInvalidateRect(hwnd, NULL, FALSE);
3262 WinInvalidateRect(ad->hwndStatus1, NULL, FALSE);
3263 WinInvalidateRect(ad->hwndStatus2, NULL, FALSE);
3264 WinInvalidateRect(ad->hwndStatus3, NULL, FALSE);
[191]3265 }
3266 }
3267 break;
[2]3268
[191]3269 case IDM_NEXTWINDOW:
3270 case IDM_PREVWINDOW:
3271 {
3272 SHORT sSelect;
[2]3273
[551]3274 sSelect = (SHORT) WinSendDlgItemMsg(ad->hwndFrame,
[191]3275 NEWVIEW_LISTBOX,
3276 LM_QUERYITEMCOUNT,
[551]3277 MPVOID, MPVOID);
3278 if (sSelect) {
3279 if (!ad->clientfocused)
[191]3280 WinSetFocus(HWND_DESKTOP, hwnd);
3281 else
3282 WinSetFocus(HWND_DESKTOP,
[551]3283 WinWindowFromID(ad->hwndFrame, NEWVIEW_LISTBOX));
[191]3284 }
3285 else
3286 WinSetFocus(HWND_DESKTOP, hwnd);
3287 }
3288 break;
[2]3289
[191]3290 case IDM_FINDFIRST:
3291 {
3292 APIRET rc;
[2]3293
[551]3294 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
3295 if (!rc) {
3296 if (!ad->busy && ad->text && ad->numlines && ad->markedlines) {
[2]3297
[191]3298 ULONG numlines;
3299 RECTL Rectl;
3300 static char test[SEARCHSTRINGLEN];
[2]3301
[191]3302 WinQueryWindowRect(hwnd, &Rectl);
3303 numlines = NumLines(&Rectl, ad);
3304 if (!numlines)
3305 break;
[551]3306 strcpy(test, ad->searchtext);
[191]3307 if (WinDlgBox(HWND_DESKTOP, hwnd, FindStrDlgProc, FM3ModHandle,
[551]3308 NEWFIND_FRAME, (PVOID) & hwnd)) {
3309 if (*ad->searchtext && strcmp(test, ad->searchtext))
[191]3310 PrfWriteProfileString(fmprof,
3311 appname,
3312 "Viewer.Searchtext",
[551]3313 (PVOID) ad->searchtext);
3314 if (_beginthread(SearchThread, NULL, 524288, (PVOID) hwnd) ==
3315 -1)
3316 Runtime_Error(pszSrcFile, __LINE__,
3317 GetPString(IDS_COULDNTSTARTTHREADTEXT));
[191]3318 }
3319 }
[551]3320 DosReleaseMutexSem(ad->ScanSem);
[191]3321 }
3322 }
3323 break;
[2]3324
[191]3325 case IDM_PREVSELECTED:
3326 case IDM_NEXTSELECTED:
3327 case IDM_FINDPREV:
3328 case IDM_FINDNEXT:
3329 {
3330 APIRET rc;
[2]3331
[551]3332 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
3333 if (!rc) {
3334 if (!ad->busy && ad->text && ad->markedlines) {
[2]3335
[191]3336 RECTL Rectl;
3337 register ULONG x;
3338 ULONG numlines;
3339 CHAR markedwith;
[2]3340
[191]3341 markedwith = (SHORT1FROMMP(mp1) == IDM_FINDNEXT ||
3342 SHORT1FROMMP(mp1) == IDM_FINDPREV) ?
3343 VF_FOUND : VF_SELECTED;
3344 WinQueryWindowRect(hwnd, &Rectl);
3345 numlines = NumLines(&Rectl, ad);
3346 if (!numlines)
3347 break;
3348 WinSetPointer(HWND_DESKTOP, hptrBusy);
3349 if (SHORT1FROMMP(mp1) == IDM_PREVSELECTED ||
[551]3350 SHORT1FROMMP(mp1) == IDM_FINDPREV) {
3351 for (x = ad->cursored - 2; x < ULONG_MAX - 1; x--) {
3352 if (ad->markedlines[x] & markedwith) {
3353 ad->topline = x + 1;
3354 if (ad->numlines - ad->topline < numlines)
3355 ad->topline = ad->numlines - numlines;
3356 ad->cursored = x + 1;
[191]3357 WinInvalidateRect(hwnd, NULL, FALSE);
3358 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
3359 break;
3360 }
3361 }
3362 }
[551]3363 else {
3364 for (x = ad->cursored; x < ad->numlines; x++) {
3365 if (ad->markedlines[x] & markedwith) {
3366 ad->topline = x + 1;
3367 if (ad->numlines - ad->topline < numlines)
3368 ad->topline = ad->numlines - numlines;
3369 ad->cursored = x + 1;
[191]3370 WinInvalidateRect(hwnd, NULL, FALSE);
3371 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
3372 break;
3373 }
3374 }
3375 }
3376 WinSetPointer(HWND_DESKTOP, hptrArrow);
[551]3377 if (x >= ad->numlines)
[191]3378 DosBeep(50, 100);
3379 }
[551]3380 DosReleaseMutexSem(ad->ScanSem);
[191]3381 }
3382 }
3383 break;
[2]3384
[191]3385 case IDM_SELECTFOUND:
3386 case IDM_DESELECTFOUND:
3387 {
3388 APIRET rc;
[2]3389
[551]3390 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
3391 if (!rc) {
3392 if (!ad->busy && ad->text && ad->markedlines) {
[2]3393
[191]3394 RECTL Rectl;
3395 register ULONG x;
3396 ULONG numlines;
[2]3397
[191]3398 WinQueryWindowRect(hwnd, &Rectl);
3399 numlines = NumLines(&Rectl, ad);
3400 if (!numlines)
3401 break;
3402 WinSetPointer(HWND_DESKTOP, hptrBusy);
[551]3403 for (x = 0; x < ad->numlines; x++) {
3404 if (SHORT1FROMMP(mp1) == IDM_SELECTFOUND) {
3405 if ((ad->markedlines[x] & VF_FOUND) &&
3406 !(ad->markedlines[x] & VF_SELECTED)) {
3407 ad->markedlines[x] |= VF_SELECTED;
3408 ad->selected++;
[191]3409 }
3410 }
[551]3411 else {
3412 if ((ad->markedlines[x] & VF_FOUND) &&
3413 (ad->markedlines[x] & VF_SELECTED)) {
3414 ad->markedlines[x] &= (~VF_SELECTED);
3415 ad->selected--;
[191]3416 }
3417 }
3418 }
3419 WinSendMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
3420 WinSetPointer(HWND_DESKTOP, hptrArrow);
3421 WinInvalidateRect(hwnd, NULL, FALSE);
3422 }
[551]3423 DosReleaseMutexSem(ad->ScanSem);
[191]3424 }
3425 }
3426 break;
[2]3427
[191]3428 case IDM_GOTOLINE:
3429 case IDM_GOTOOFFSET:
3430 {
3431 APIRET rc;
[2]3432
[551]3433 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
3434 if (!rc) {
3435 if (!ad->busy && ad->numlines) {
[2]3436
[191]3437 ULONG numlines, linenum;
3438 CHAR s[34], ss[134];
3439 STRINGINPARMS sip;
3440 RECTL Rectl;
3441 register ULONG x;
[2]3442
[191]3443 WinQueryWindowRect(hwnd, &Rectl);
3444 numlines = NumLines(&Rectl, ad);
3445 if (!numlines)
3446 break;
[551]3447 if (ad->numlines <= numlines) {
[191]3448 DosBeep(500, 100);
3449 break;
3450 }
3451 sip.help = (SHORT1FROMMP(mp1) == IDM_GOTOLINE) ?
[551]3452 GetPString(IDS_NVLINEJUMPTEXT) : GetPString(IDS_NVBYTEJUMPTEXT);
[191]3453 sip.ret = s;
3454 *s = 0;
3455 sip.prompt = ss;
3456 sip.inputlen = 34;
3457 sip.title = (SHORT1FROMMP(mp1) == IDM_GOTOLINE) ?
3458 GetPString(IDS_NVLINEJUMPTITLETEXT) :
3459 GetPString(IDS_NVBYTEJUMPTITLETEXT);
3460 sprintf(sip.prompt,
3461 GetPString(IDS_NVJUMPTEXT),
3462 (SHORT1FROMMP(mp1) == IDM_GOTOLINE) ?
3463 GetPString(IDS_LINETEXT) :
3464 GetPString(IDS_OFFSETTEXT),
3465 (SHORT1FROMMP(mp1) == IDM_GOTOLINE) ?
3466 1 :
3467 0,
3468 (SHORT1FROMMP(mp1) == IDM_GOTOLINE) ?
[551]3469 ad->numlines : ad->textsize - 1);
[191]3470 WinDlgBox(HWND_DESKTOP,
[551]3471 hwnd, InputDlgProc, FM3ModHandle, STR_FRAME, &sip);
3472 if (*s) {
[191]3473 s[33] = 0;
3474 linenum = atol(s);
[551]3475 switch (SHORT1FROMMP(mp1)) {
[191]3476 case IDM_GOTOLINE:
[551]3477 if (linenum > 0 && linenum <= ad->numlines) {
3478 ad->topline = linenum;
3479 ad->cursored = ad->topline;
3480 if (ad->numlines - ad->topline < numlines)
3481 ad->topline = (ad->numlines - numlines) + 1;
3482 WinInvalidateRect(hwnd, NULL, FALSE);
[191]3483 }
3484 break;
3485 case IDM_GOTOOFFSET:
[551]3486 if (linenum < ad->textsize) {
3487 if (ad->hex)
3488 ad->topline = (linenum / 16) + 1;
3489 else if (ad->lines) {
3490 ad->topline = (ULONG) - 1;
3491 for (x = 0; x < ad->numlines; x++) {
3492 if (ad->lines[x] > ad->text + linenum) {
3493 ad->topline = x + 1;
[191]3494 break;
3495 }
3496 }
[551]3497 if (ad->topline == (ULONG) - 1)
3498 ad->topline = ad->numlines;
[191]3499 }
[551]3500 ad->cursored = ad->topline;
3501 if (ad->numlines - ad->topline < numlines)
3502 ad->topline = (ad->numlines - numlines) + 1;
3503 WinInvalidateRect(hwnd, NULL, FALSE);
[191]3504 }
3505 break;
3506 }
3507 }
[551]3508 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
[191]3509 }
[551]3510 DosReleaseMutexSem(ad->ScanSem);
[191]3511 }
3512 }
3513 break;
[2]3514
[191]3515 case IDM_CODEPAGE:
3516 {
3517 INT cp;
[2]3518
[191]3519 cp = PickCodepage(hwnd);
[551]3520 if (cp != -1) {
3521 ad->fattrs.usCodePage = (USHORT) cp;
3522 Codepage = ad->fattrs.usCodePage;
[191]3523 PrfWriteProfileData(fmprof,
3524 appname,
3525 "Viewer.Codepage",
[551]3526 &ad->fattrs.usCodePage, sizeof(USHORT));
3527 GpiDeleteSetId(ad->hps, FIXED_FONT_LCID);
3528 GpiAssociate(ad->hps, 0);
3529 GpiDestroyPS(ad->hps);
3530 ad->hps = InitWindow(hwnd);
3531 WinSendMsg(hwnd, UM_SETUP3, MPVOID, MPVOID);
3532 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
3533 WinInvalidateRect(hwnd, NULL, FALSE);
[191]3534 }
3535 }
3536 break;
[2]3537
[191]3538 case IDM_SAVETOLIST2:
3539 case IDM_SAVETOCLIP2:
3540 case IDM_APPENDTOCLIP2:
3541 case IDM_SAVETOLIST:
3542 case IDM_SAVETOCLIP:
3543 case IDM_APPENDTOCLIP:
3544 {
3545 APIRET rc;
[2]3546
[551]3547 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
3548 if (!rc) {
3549 if (!ad->busy) {
3550 ad->cliptype = SHORT1FROMMP(mp1);
3551 if (_beginthread(ClipboardThread, NULL, 524288, (PVOID) hwnd) ==
3552 -1)
3553 Runtime_Error(pszSrcFile, __LINE__,
3554 GetPString(IDS_COULDNTSTARTTHREADTEXT));
[191]3555 }
[551]3556 DosReleaseMutexSem(ad->ScanSem);
[191]3557 }
3558 }
3559 break;
[2]3560
[191]3561 case IDM_SELECTALL:
3562 case IDM_DESELECTALL:
3563 case IDM_INVERT:
3564 {
3565 APIRET rc;
[2]3566
[551]3567 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
3568 if (!rc) {
3569 if (!ad->busy && ad->markedlines) {
[2]3570
[191]3571 register ULONG x;
[2]3572
[551]3573 for (x = 0; x < ad->numlines; x++) {
3574 switch (SHORT1FROMMP(mp1)) {
[191]3575 case IDM_SELECTALL:
[551]3576 if (!(ad->markedlines[x] & VF_SELECTED)) {
3577 ad->markedlines[x] |= VF_SELECTED;
3578 ad->selected++;
[191]3579 }
3580 break;
3581 case IDM_DESELECTALL:
[551]3582 if (ad->markedlines[x] & VF_SELECTED) {
3583 ad->markedlines[x] &= (~VF_SELECTED);
3584 ad->selected--;
[191]3585 }
3586 break;
3587 case IDM_INVERT:
[551]3588 if (ad->markedlines[x] & VF_SELECTED) {
3589 ad->markedlines[x] &= (~VF_SELECTED);
3590 ad->selected--;
[191]3591 }
[551]3592 else {
3593 ad->markedlines[x] |= VF_SELECTED;
3594 ad->selected++;
[191]3595 }
3596 break;
3597 }
3598 }
3599 WinSendMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
3600 WinInvalidateRect(hwnd, NULL, FALSE);
3601 }
[551]3602 DosReleaseMutexSem(ad->ScanSem);
[191]3603 }
3604 }
3605 break;
[2]3606
[191]3607 case IDM_WRAP:
3608 {
3609 APIRET rc;
[2]3610
[551]3611 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
3612 if (!rc) {
3613 if (!ad->busy) {
3614 ad->wrapon = ad->wrapon ? FALSE : TRUE;
3615 WrapOn = ad->wrapon;
[191]3616 PrfWriteProfileData(fmprof, appname, "Viewer.WrapOn",
[551]3617 &ad->wrapon, sizeof(BOOL));
[191]3618 PostMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
3619 PostMsg(hwnd, UM_SETUP3, MPVOID, MPVOID);
3620 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
[551]3621 if (WinSendDlgItemMsg(ad->hwndFrame, NEWVIEW_LISTBOX,
[191]3622 LM_QUERYITEMCOUNT, MPVOID, MPVOID))
[551]3623 WinSendDlgItemMsg(ad->hwndFrame, NEWVIEW_LISTBOX, LM_DELETEALL,
[191]3624 MPVOID, MPVOID);
[551]3625 ad->oldwidth = -1;
3626 WinSendMsg(ad->hvscroll, SBM_SETTHUMBSIZE,
3627 MPFROM2SHORT(1, 1), MPVOID);
3628 WinSendMsg(ad->hvscroll, SBM_SETSCROLLBAR,
[191]3629 MPFROMSHORT(1), MPFROM2SHORT(1, 1));
[551]3630 WinSendMsg(ad->hhscroll, SBM_SETTHUMBSIZE,
3631 MPFROM2SHORT(1, 1), MPVOID);
3632 WinSendMsg(ad->hhscroll, SBM_SETSCROLLBAR,
[191]3633 MPFROMSHORT(1), MPFROM2SHORT(1, 1));
[551]3634 WinSendMsg(ad->hwndFrame, WM_UPDATEFRAME,
[191]3635 MPFROMLONG(FCF_SIZEBORDER), MPVOID);
3636 WinInvalidateRect(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
3637 NEWVIEW_DRAG), NULL, FALSE);
[551]3638 WinInvalidateRect(ad->hhscroll, NULL, FALSE);
[191]3639 }
[551]3640 DosReleaseMutexSem(ad->ScanSem);
[191]3641 }
3642 }
3643 break;
[2]3644
[191]3645 case IDM_HEXMODE:
3646 {
3647 APIRET rc;
[2]3648
[551]3649 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
3650 if (!rc) {
3651 if (!ad->busy) {
3652 ad->hex = (ad->hex) ? FALSE : TRUE;
[191]3653 WinEnableWindow(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
[551]3654 IDM_NEXTBLANKLINE), !ad->hex);
[191]3655 WinEnableWindow(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
[551]3656 IDM_PREVBLANKLINE), !ad->hex);
[191]3657 PostMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
3658 PostMsg(hwnd, UM_SETUP3, MPVOID, MPVOID);
3659 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
[551]3660 if (WinSendDlgItemMsg(ad->hwndFrame, NEWVIEW_LISTBOX,
[191]3661 LM_QUERYITEMCOUNT, MPVOID, MPVOID))
[551]3662 WinSendDlgItemMsg(ad->hwndFrame, NEWVIEW_LISTBOX, LM_DELETEALL,
[191]3663 MPVOID, MPVOID);
[551]3664 ad->oldwidth = -1;
3665 WinSendMsg(ad->hvscroll, SBM_SETTHUMBSIZE,
3666 MPFROM2SHORT(1, 1), MPVOID);
3667 WinSendMsg(ad->hvscroll, SBM_SETSCROLLBAR,
[191]3668 MPFROMSHORT(1), MPFROM2SHORT(1, 1));
[551]3669 WinSendMsg(ad->hhscroll, SBM_SETTHUMBSIZE,
3670 MPFROM2SHORT(1, 1), MPVOID);
3671 WinSendMsg(ad->hhscroll, SBM_SETSCROLLBAR,
[191]3672 MPFROMSHORT(1), MPFROM2SHORT(1, 1));
[551]3673 WinSendMsg(ad->hwndFrame, WM_UPDATEFRAME,
[191]3674 MPFROMLONG(FCF_SIZEBORDER), MPVOID);
3675 WinInvalidateRect(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
3676 NEWVIEW_DRAG), NULL, FALSE);
[551]3677 WinInvalidateRect(ad->hhscroll, NULL, FALSE);
[191]3678 }
[551]3679 DosReleaseMutexSem(ad->ScanSem);
[191]3680 }
3681 }
3682 break;
[2]3683
[191]3684 case IDM_FONTPALETTE:
3685 {
3686 APIRET rc;
[2]3687
[551]3688 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
3689 if (!rc) {
3690 SetMLEFont(hwnd, &ad->fattrs, 11);
[191]3691 PrfWriteProfileData(fmprof, appname, "Viewer.Fattrs",
[551]3692 &ad->fattrs, sizeof(FATTRS));
3693 Fattrs = ad->fattrs;
3694 GpiDeleteSetId(ad->hps, FIXED_FONT_LCID);
3695 GpiAssociate(ad->hps, 0);
3696 GpiDestroyPS(ad->hps);
3697 ad->hps = InitWindow(hwnd);
3698 DosReleaseMutexSem(ad->ScanSem);
[191]3699 WinSendMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
3700 WinInvalidateRect(hwnd, NULL, FALSE);
3701 }
[2]3702 }
3703 break;
3704
[191]3705 case IDM_HELP:
3706 if (hwndHelp)
3707 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
[551]3708 MPFROM2SHORT(HELP_NEWVIEW, 0), MPFROMSHORT(HM_RESOURCEID));
[2]3709 break;
[191]3710 }
3711 return 0;
[2]3712
[191]3713 case WM_SETFOCUS:
3714 if (mp2)
3715 WinSendMsg(hwnd, UM_SETUP5, MPVOID, MPVOID);
[551]3716 if (mp2 && ad && ad->needrefreshing && !ad->stopflag &&
3717 !DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN)) {
3718 ad->needrefreshing = FALSE;
3719 DosReleaseMutexSem(ad->ScanSem);
[191]3720 WinInvalidateRect(hwnd, NULL, TRUE);
3721 }
3722 break;
[2]3723
[191]3724 case WM_SIZE:
[551]3725 if (SHORT1FROMMP(mp2) && SHORT2FROMMP(mp2)) {
[191]3726 PostMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
3727 PostMsg(hwnd, UM_SETUP3, MPVOID, MPVOID);
3728 }
3729 break;
[2]3730
[191]3731 case WM_SAVEAPPLICATION:
[551]3732 if (ad && ParentIsDesktop(hwnd, ad->hwndParent)) {
[2]3733
[191]3734 SWP swp;
[2]3735
[551]3736 WinQueryWindowPos(ad->hwndFrame, &swp);
[191]3737 if (!(swp.fl & (SWP_HIDE | SWP_MINIMIZE | SWP_MAXIMIZE)))
3738 PrfWriteProfileData(fmprof,
[551]3739 appname, "NewViewSizePos", &swp, sizeof(swp));
[191]3740 }
3741 break;
[2]3742
[191]3743 case WM_CLOSE:
3744 if (ad)
[551]3745 ad->stopflag = 1;
[191]3746 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
3747 return 0;
[2]3748
[191]3749 case WM_DESTROY:
3750 {
3751 BOOL dontclose = FALSE;
[551]3752 HWND hwndRestore = (HWND) 0;
[2]3753
[191]3754 WinStopTimer(WinQueryAnchorBlock(hwnd), hwnd, ID_TIMER5);
[551]3755 if (ad) {
3756 ad->stopflag = 1;
3757 if (ad->ScanSem) {
3758 DosRequestMutexSem(ad->ScanSem, 15000L);
3759 DosCloseMutexSem(ad->ScanSem);
[191]3760 }
[551]3761 if (ad->busy)
[191]3762 DosSleep(128L);
[551]3763 if (ad->hps) {
3764 GpiDeleteSetId(ad->hps, FIXED_FONT_LCID);
3765 GpiAssociate(ad->hps, 0);
3766 GpiDestroyPS(ad->hps);
[191]3767 }
[551]3768 hwndRestore = ad->hwndRestore;
3769 dontclose = ((ad->flags & 4) != 0) ? TRUE : FALSE;
[191]3770 FreeViewerMem(hwnd);
3771 WinSetWindowPtr(hwnd, QWL_USER, NULL);
3772 free(ad);
[2]3773 }
[551]3774 if (hwndRestore && hwndRestore != HWND_DESKTOP) {
[191]3775
3776 ULONG fl = SWP_SHOW | SWP_ACTIVATE | SWP_ZORDER;
3777 SWP swp;
3778
[551]3779 if (WinQueryWindowPos(hwndRestore, &swp)) {
[191]3780 if (!(swp.fl & SWP_MAXIMIZE))
3781 fl |= SWP_RESTORE;
3782 WinSetWindowPos(hwndRestore, HWND_TOP, 0, 0, 0, 0, fl);
3783 }
3784 }
3785 if (!dontclose &&
3786 ParentIsDesktop(hwnd, WinQueryWindow(WinQueryWindow(hwnd,
[551]3787 QW_PARENT),
3788 QW_PARENT))) {
3789 if (!PostMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID))
[191]3790 DosExit(EXIT_PROCESS, 1);
3791 }
3792 }
3793 break;
[2]3794 }
3795
[191]3796 return WinDefWindowProc(hwnd, msg, mp1, mp2);
[2]3797}
3798
[191]3799HWND StartViewer(HWND hwndParent, USHORT flags, CHAR * filename,
3800 HWND hwndRestore)
[83]3801{
[551]3802 HWND hwndFrame = (HWND) 0, hwndClient;
[191]3803 VIEWDATA *ad;
3804 ULONG FrameFlags = FCF_TITLEBAR | FCF_SYSMENU |
[551]3805 FCF_SIZEBORDER | FCF_MINMAX |
3806 FCF_NOBYTEALIGN | FCF_VERTSCROLL |
3807 FCF_MENU | FCF_ICON | FCF_ACCELTABLE | FCF_HORZSCROLL;
[2]3808
[191]3809 if (strcmp(realappname, FM3Str))
[2]3810 hwndParent = HWND_DESKTOP;
[191]3811 if (ParentIsDesktop(hwndParent, hwndParent))
[2]3812 FrameFlags |= FCF_TASKLIST;
3813// saymsg(MB_ENTER,HWND_DESKTOP,DEBUG_STRING,"\"%s\"\r\rparent %s desktop",filename,(ParentIsDesktop(hwndParent,hwndParent)) ? "is" : "isn't");
3814 hwndFrame = WinCreateStdWindow(hwndParent,
[191]3815 0,
3816 &FrameFlags,
3817 GetPString(IDS_WCNEWVIEW),
3818 GetPString(IDS_FM2VIEWERTITLETEXT),
3819 fwsAnimate,
[551]3820 FM3ModHandle, NEWVIEW_FRAME, &hwndClient);
3821 if (hwndFrame) {
[2]3822
[191]3823 HWND hwndMenu = WinWindowFromID(hwndFrame, FID_MENU);
[2]3824
[551]3825 if (!fToolbar && hwndMenu) {
[191]3826 WinSendMsg(hwndMenu, MM_DELETEITEM,
3827 MPFROM2SHORT(IDM_FINDFIRST, FALSE), MPVOID);
3828 WinSendMsg(hwndMenu, MM_DELETEITEM,
3829 MPFROM2SHORT(IDM_FINDNEXT, FALSE), MPVOID);
3830 WinSendMsg(hwndMenu, MM_DELETEITEM,
3831 MPFROM2SHORT(IDM_FINDPREV, FALSE), MPVOID);
3832 WinSendMsg(hwndMenu, MM_DELETEITEM,
3833 MPFROM2SHORT(IDM_SAVETOCLIP, FALSE), MPVOID);
[2]3834 }
[551]3835 ad = xmallocz(sizeof(VIEWDATA), pszSrcFile, __LINE__);
[350]3836 if (!ad) {
3837 WinDestroyWindow(hwndFrame);
[551]3838 hwndFrame = (HWND) 0;
[350]3839 }
3840 else {
[551]3841 ad->size = sizeof(VIEWDATA);
3842 ad->stopflag = 0;
3843 ad->multiplier = 1;
3844 ad->hwndRestore = hwndRestore;
3845 ad->hwndFrame = hwndFrame;
3846 ad->hwndParent = hwndParent;
3847 ad->clientfocused = TRUE;
3848 ad->oldwidth = -1;
3849 strcpy(ad->filename, filename);
3850 ad->flags = flags;
3851 if (ad->flags & 16)
3852 ad->hex = TRUE;
[191]3853 WinSetWindowPtr(hwndClient, QWL_USER, (PVOID) ad);
[551]3854 if (Firsttime) {
[2]3855
[191]3856 ULONG size;
[2]3857
[191]3858 size = sizeof(BOOL);
3859 PrfQueryProfileData(fmprof, appname, "Viewer.Sensitive",
3860 (PVOID) & Sensitive, &size);
3861 size = sizeof(USHORT);
3862 PrfQueryProfileData(fmprof, appname, "Viewer.Codepage",
3863 (PVOID) & Codepage, &size);
3864 size = sizeof(BOOL);
3865 PrfQueryProfileData(fmprof, appname, "Viewer.LiteralSearch",
3866 (PVOID) & LiteralSearch, &size);
3867 size = sizeof(BOOL);
3868 PrfQueryProfileData(fmprof, appname, "Viewer.AlsoSelect",
3869 (PVOID) & AlsoSelect, &size);
3870 size = sizeof(BOOL);
3871 PrfQueryProfileData(fmprof, appname, "Viewer.WrapOn",
3872 (PVOID) & WrapOn, &size);
3873 size = sizeof(BOOL);
3874 PrfQueryProfileData(fmprof, appname, "Viewer.IgnoreFTP",
3875 (PVOID) & IgnoreFTP, &size);
3876 size = sizeof(BOOL);
3877 PrfQueryProfileData(fmprof, appname, "Viewer.IgnoreHTTP",
3878 (PVOID) & IgnoreHTTP, &size);
3879 memset(&Fattrs, 0, sizeof(FATTRS));
3880 size = sizeof(FATTRS);
3881 Fattrs.usRecordLength = sizeof(FATTRS);
3882 Fattrs.lMaxBaselineExt = 16;
3883 Fattrs.lAveCharWidth = 8;
3884 Fattrs.usCodePage = Codepage;
3885 strcpy(Fattrs.szFacename, GetPString(IDS_SYSMONOTEXT));
3886 PrfQueryProfileData(fmprof, appname, "Viewer.Fattrs",
3887 (PVOID) & Fattrs, &size);
3888 size = sizeof(LONG) * COLORS_MAX;
3889 PrfQueryProfileData(fmprof, appname, "Viewer.Colors",
3890 (PVOID) Colors, &size);
3891 Firsttime = FALSE;
[2]3892 }
3893 {
[551]3894 ULONG size = sizeof(ad->searchtext);
[191]3895
3896 PrfQueryProfileData(fmprof, appname, "Viewer.Searchtext",
[551]3897 (PVOID) ad->searchtext, &size);
3898 ad->searchtext[sizeof(ad->searchtext) - 1] = 0;
[2]3899 }
[551]3900 ad->sensitive = Sensitive;
3901 ad->literalsearch = LiteralSearch;
3902 ad->fattrs = Fattrs;
3903 ad->alsoselect = AlsoSelect;
3904 ad->fattrs.usCodePage = Codepage;
3905 ad->wrapon = WrapOn;
3906 ad->ignorehttp = IgnoreHTTP;
3907 ad->ignoreftp = IgnoreFTP;
3908 memcpy(ad->colors, Colors, sizeof(LONG) * COLORS_MAX);
[191]3909 WinSetWindowPtr(hwndClient, QWL_USER, (PVOID) ad);
[350]3910 if (!WinSendMsg(hwndClient, UM_SETUP, MPVOID, MPVOID))
[551]3911 hwndFrame = (HWND) 0;
[350]3912 else {
[551]3913 // DosSleep(64L);
3914 if (!(FrameFlags & FCF_TASKLIST) && !(flags & 2)) {
[191]3915 SWP swp;
[551]3916
[191]3917 FillClient(hwndParent, &swp, NULL, FALSE);
3918 WinSetWindowPos(hwndFrame, HWND_TOP, swp.x, swp.y, swp.cx, swp.cy,
3919 SWP_SIZE | SWP_MOVE | SWP_SHOW | SWP_RESTORE |
3920 SWP_ZORDER | SWP_ACTIVATE);
3921 }
[551]3922 else if (FrameFlags & FCF_TASKLIST) {
[2]3923
[191]3924 SWP swp, swpD;
3925 ULONG size = sizeof(swp);
3926 LONG cxScreen, cyScreen;
[2]3927
[191]3928 WinQueryTaskSizePos(WinQueryAnchorBlock(hwndFrame), 0, &swp);
3929 if (PrfQueryProfileData(fmprof,
[551]3930 appname, "NewViewSizePos", &swpD, &size)) {
[191]3931 cxScreen = WinQuerySysValue(HWND_DESKTOP, SV_CXSCREEN);
3932 cyScreen = WinQuerySysValue(HWND_DESKTOP, SV_CYSCREEN);
3933 if (swp.x + swpD.cx > cxScreen)
3934 swp.x = cxScreen - swpD.cx;
3935 if (swp.y + swpD.cy > cyScreen)
3936 swp.y = cyScreen - swpD.cy;
3937 swp.cx = swpD.cx;
3938 swp.cy = swpD.cy;
3939 }
3940 WinSetWindowPos(hwndFrame, HWND_TOP, swp.x, swp.y, swp.cx, swp.cy,
3941 SWP_SIZE | SWP_MOVE | SWP_SHOW | SWP_ZORDER |
3942 SWP_ACTIVATE);
3943 }
[2]3944 }
3945 }
3946 }
3947 return hwndFrame;
3948}
Note: See TracBrowser for help on using the repository browser.