source: trunk/dll/newview.c@ 816

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

Improved fix for fast viewer failure (Ticket 152)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 107.4 KB
RevLine 
[83]1
2/***********************************************************************
3
4 $Id: newview.c 816 2007-08-27 15:07:14Z gyoung $
5
6 New internal viewer
7
8 Copyright (c) 1993-98 M. Kimes
[574]9 Copyright (c) 2001, 2007 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
[574]20 22 Mar 07 GKY Use QWL_USER
[593]21 30 Mar 07 GKY Remove GetPString for window class names
[775]22 06 Aug 07 GKY Reduce DosSleep times (ticket 148)
[793]23 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
[812]24 26 Aug 07 GKY Fixed fast viewer text load failure
[83]25
[775]26
[83]27***********************************************************************/
28
[2]29#define INCL_DOS
30#define INCL_WIN
31#define INCL_GPI
[350]32#include <os2.h>
[2]33
34#include <stdlib.h>
35#include <stdio.h>
36#include <string.h>
37#include <ctype.h>
38#include <process.h>
39#include <limits.h>
40#include <share.h>
[350]41
[2]42#include "fm3dll.h"
43#include "fm3dlg.h"
44#include "fm3str.h"
45#include "mle.h"
46
47#pragma data_seg(DATA2)
[350]48
49static PSZ pszSrcFile = __FILE__;
50
[2]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),
[574]471 FID_CLIENT), QWL_USER);
[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),
[574]501 FID_CLIENT), QWL_USER);
[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));
[771]955 DosSleep(150);//05 Aug 07 GKY 1500
[191]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));
[771]1059 DosSleep(150);//05 Aug 07 GKY 1500
[191]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) {
[816]1094 if (ad->text)
1095 DosSleep(32); // 26 Aug 07 GKY Fixes failure to load text file in some cases
[551]1096 ad->relining = TRUE;
1097 if (!DosRequestMutexSem(ad->ScanSem, SEM_INDEFINITE_WAIT)) {
1098 ad->busy++;
1099 ad->maxx = 0;
1100 if (ad->text && ad->textsize) {
1101 if (ad->hex) {
1102 firstline = ad->topline;
1103 cursored = ad->cursored;
[191]1104 }
[551]1105 else if (ad->lines)
1106 whereiam = ad->lines[ad->cursored - 1];
1107 ad->found = 0;
1108 ad->selected = ad->numlines = ad->numalloc = 0;
1109 if (ad->lines)
1110 free(ad->lines);
1111 if (ad->markedlines)
1112 free(ad->markedlines);
1113 ad->lines = NULL;
1114 ad->markedlines = NULL;
1115 WinSetWindowText(WinWindowFromID(ad->hwndFrame,
[191]1116 NEWVIEW_STATUS1),
1117 GetPString(IDS_FORMATTINGTEXT));
[551]1118 if (!ad->hex) {
1119 if (WinSendDlgItemMsg(ad->hwndFrame, NEWVIEW_LISTBOX,
1120 LM_QUERYITEMCOUNT, MPVOID, MPVOID)) {
1121 WinSendDlgItemMsg(ad->hwndFrame, NEWVIEW_LISTBOX,
1122 LM_DELETEALL, MPVOID, MPVOID);
1123 PostMsg(ad->hwndFrame, WM_UPDATEFRAME,
[191]1124 MPFROMLONG(FCF_SIZEBORDER), MPVOID);
1125 }
1126 }
1127 WinSetFocus(HWND_DESKTOP, hwnd);
[551]1128 if (!ad->hex) {
[191]1129 WinQueryWindowRect(hwnd, &Rectl);
[551]1130 width = (Rectl.xRight - Rectl.xLeft) / ad->fattrs.lAveCharWidth;
[191]1131 numlines = NumLines(&Rectl, ad);
[551]1132 ad->oldwidth = width;
1133 p = ad->text;
1134 if (width) {
1135 while (p - ad->text < ad->textsize && !ad->stopflag) {
1136 if (ad->wrapon) {
[191]1137 e = p + (width - 1);
[551]1138 if (e - ad->text > ad->textsize)
1139 e = ad->text + ad->textsize;
[191]1140 pp = p;
[551]1141 while (pp < e) {
1142 if (*pp == '\r' || *pp == '\n') {
[191]1143 e = pp;
1144 break;
1145 }
1146 pp++;
1147 }
1148 }
[551]1149 else {
[191]1150 pp = p;
[551]1151 while (pp - ad->text < ad->textsize &&
[191]1152 *pp != '\r' && *pp != '\n')
1153 pp++;
1154 e = pp;
[551]1155 if (ad->maxx <
1156 (((e - p) + 1) * ad->fattrs.lAveCharWidth) + 1)
1157 ad->maxx = (((e - p) + 1) *
1158 ad->fattrs.lAveCharWidth) + 1;
[191]1159 }
[551]1160 if (whereiam && p >= whereiam && e <= whereiam) {
1161 cursored = firstline = ad->numlines + 1;
[191]1162 whereiam = NULL;
1163 }
1164 /* assign ad->lines[ad->numlines] */
[551]1165 if (ad->numlines + 1 > ad->numalloc) {
[2]1166
[191]1167 CHAR **temp;
[2]1168
[551]1169 temp = xrealloc(ad->lines, sizeof(CHAR *) *
1170 (ad->numalloc + 256), pszSrcFile,
1171 __LINE__);
[350]1172 if (!temp)
[191]1173 break;
[551]1174 ad->lines = temp;
1175 ad->numalloc += 256;
[191]1176 }
[551]1177 ad->lines[ad->numlines] = p;
1178 ad->numlines++;
1179 if (ad->numlines == numlines) {
[191]1180 /* display first page */
1181 register INT x;
[2]1182
[551]1183 for (x = 0; x < ad->numlines; x++) {
[191]1184 if ((LONG) (Rectl.yTop -
[812]1185 (ad->lMaxHeight * (((x + 1) -
1186 ad->topline) + 1))) < 0)
1187 break;
[551]1188 PaintLine(hwnd, ad->hps, x, 1, &Rectl);
[191]1189 }
1190 }
1191 p = e;
[551]1192 if (p - ad->text < ad->textsize) {
[191]1193 if (*p == '\r')
1194 p++;
1195 }
[551]1196 if (p - ad->text < ad->textsize) {
[191]1197 if (*p == '\n')
1198 p++;
1199 }
1200 }
1201 }
[551]1202 if (ad->numalloc != ad->numlines) {
[2]1203
[191]1204 CHAR **temp;
[2]1205
[551]1206 temp =
1207 xrealloc(ad->lines, sizeof(CHAR *) * ad->numlines,
1208 pszSrcFile, __LINE__);
1209 if (temp) {
1210 ad->lines = temp;
1211 ad->numalloc = ad->numlines;
[191]1212 }
1213 }
1214 }
[551]1215 else {
1216 ad->numlines = ad->textsize / 16;
1217 if (ad->numlines * 16 < ad->textsize)
1218 ad->numlines++;
[191]1219 }
[551]1220 if (ad->numlines) {
1221 ad->markedlines = xmalloc(ad->numlines, pszSrcFile, __LINE__);
1222 if (ad->markedlines) {
1223 memset(ad->markedlines, 0, ad->numlines);
1224 ad->selected = 0;
[191]1225 }
[551]1226 if (*ftprun && !ad->ignoreftp && strstr(ad->text, "ftp://"))
1227 ad->ftpin = TRUE;
1228 if (*httprun && !ad->ignorehttp && strstr(ad->text, "http://"))
1229 ad->httpin = TRUE;
[191]1230 }
1231 }
[551]1232 DosReleaseMutexSem(ad->ScanSem);
[191]1233 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
1234 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
[551]1235 ad->busy--;
[191]1236 }
[2]1237 }
1238 WinDestroyMsgQueue(hmq2);
1239 }
[533]1240 DecrThreadUsage();
[2]1241 WinTerminate(hab2);
1242 }
1243 DosPostEventSem(CompactSem);
[551]1244 if (ad && !ad->stopflag) {
[191]1245 PostMsg(hwnd, UM_CONTAINER_FILLED, MPFROMLONG(firstline),
1246 MPFROMLONG(cursored));
[551]1247 ad->relining = FALSE;
[2]1248 }
1249}
1250
[533]1251static VOID LoadFileThread(VOID * args)
[83]1252{
[551]1253 HWND hwnd = (HWND) args;
[191]1254 HAB hab2;
1255 HMQ hmq2;
[2]1256 VIEWDATA *ad;
[191]1257 HFILE handle;
1258 ULONG action, len;
1259 APIRET rc;
1260 BOOL error = TRUE;
[2]1261
1262 hab2 = WinInitialize(0);
[551]1263 if (hab2) {
[191]1264 hmq2 = WinCreateMsgQueue(hab2, 0);
[551]1265 if (hmq2) {
[191]1266 WinCancelShutdown(hmq2, TRUE);
[533]1267 IncrThreadUsage();
[191]1268 ad = WinQueryWindowPtr(hwnd, QWL_USER);
[551]1269 if (ad) {
1270 if (!DosRequestMutexSem(ad->ScanSem, SEM_INDEFINITE_WAIT)) {
1271 ad->busy++;
[191]1272 priority_normal();
[551]1273 if (*ad->filename) {
1274 if (ad->text)
1275 free(ad->text);
1276 if (ad->lines)
1277 free(ad->lines);
1278 if (ad->markedlines)
1279 free(ad->markedlines);
1280 ad->text = NULL;
1281 ad->lines = NULL;
1282 ad->markedlines = NULL;
1283 ad->ftpin = ad->httpin = FALSE;
1284 ad->selected = ad->numlines = ad->textsize = ad->numalloc = 0;
1285 WinSendDlgItemMsg(ad->hwndFrame, NEWVIEW_LISTBOX, LM_DELETEALL,
[191]1286 MPVOID, MPVOID);
[551]1287 PostMsg(ad->hwndFrame, WM_UPDATEFRAME,
[191]1288 MPFROMLONG(FCF_SIZEBORDER), MPVOID);
1289 WinSetFocus(HWND_DESKTOP, hwnd);
[551]1290 rc = DosOpen(ad->filename, &handle, &action, 0L, 0L,
1291 OPEN_ACTION_FAIL_IF_NEW | OPEN_ACTION_OPEN_IF_EXISTS,
[191]1292 OPEN_FLAGS_FAIL_ON_ERROR | OPEN_FLAGS_NOINHERIT |
1293 OPEN_FLAGS_SEQUENTIAL | OPEN_SHARE_DENYNONE |
1294 OPEN_ACCESS_READONLY, 0L);
[350]1295 if (rc) {
1296 Dos_Error(MB_CANCEL,
1297 rc,
1298 hwnd,
1299 pszSrcFile,
1300 __LINE__,
[551]1301 GetPString(IDS_COMPCANTOPENTEXT), ad->filename);
[350]1302 }
1303 else {
[191]1304 DosChgFilePtr(handle, 0L, FILE_END, &len);
1305 DosChgFilePtr(handle, 0L, FILE_BEGIN, &action);
[350]1306 if (!len) {
1307 saymsg(MB_CANCEL,
1308 hwnd,
1309 GetPString(IDS_ERRORTEXT),
[551]1310 GetPString(IDS_ZEROLENGTHTEXT), ad->filename);
[350]1311 }
1312 else {
[551]1313 ad->text = xmalloc(len + 2, pszSrcFile, __LINE__);
1314 if (ad->text) {
1315 *ad->text = 0;
1316 ad->text[len] = 0;
1317 rc = DosRead(handle, ad->text, len, &ad->textsize);
[350]1318 if (rc) {
[191]1319 Dos_Error(MB_CANCEL,
1320 rc,
1321 hwnd,
[350]1322 pszSrcFile,
[191]1323 __LINE__,
[551]1324 GetPString(IDS_ERRORREADINGTEXT), ad->filename);
1325 free(ad->text);
1326 ad->text = NULL;
1327 ad->textsize = 0;
[191]1328 }
[350]1329 else {
[551]1330 ad->text[ad->textsize] = 0;
1331 if (!ad->hex && !(ad->flags & (8 | 16)) && ad->textsize) {
[350]1332 ULONG x;
[551]1333
1334 x = min(512, ad->textsize);
1335 if (fGuessType && IsBinary(ad->text, x))
1336 ad->hex = TRUE;
[350]1337 }
[551]1338 if (ad->textsize) {
1339 if (_beginthread
1340 (ReLineThread, NULL, 524288, (PVOID) hwnd) == -1)
1341 Runtime_Error(pszSrcFile, __LINE__,
1342 GetPString(IDS_COULDNTSTARTTHREADTEXT));
[350]1343 else
[551]1344 error = FALSE;
[350]1345 }
1346 }
[191]1347 }
1348 }
1349 DosClose(handle);
1350 }
1351 }
[551]1352 ad->busy--;
1353 DosReleaseMutexSem(ad->ScanSem);
[191]1354 }
[2]1355 }
1356 WinDestroyMsgQueue(hmq2);
1357 }
[533]1358 DecrThreadUsage();
[2]1359 WinTerminate(hab2);
1360 }
[191]1361 if (error)
1362 PostMsg(hwnd, UM_CONTAINER_FILLED, MPVOID, MPVOID);
[2]1363 DosPostEventSem(CompactSem);
1364}
1365
[551]1366MRESULT EXPENTRY ViewFrameWndProc(HWND hwnd, ULONG msg, MPARAM mp1,
1367 MPARAM mp2)
[83]1368{
[191]1369 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
[2]1370
[551]1371 switch (msg) {
[191]1372 case WM_CHAR:
1373 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
1374 break;
[2]1375
[191]1376 case WM_CONTROL:
[551]1377 switch (SHORT1FROMMP(mp1)) {
[191]1378 case NEWVIEW_LISTBOX:
1379 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), UM_CONTROL,
1380 mp1, mp2);
1381 }
1382 break;
[2]1383
[191]1384 case WM_CALCFRAMERECT:
1385 {
1386 MRESULT mr;
1387 PRECTL prectl;
1388 SHORT sSelect;
[2]1389
[191]1390 mr = oldproc(hwnd, msg, mp1, mp2);
[2]1391
[191]1392 /*
1393 * Calculate the position of the client rectangle.
1394 * Otherwise, we'll see a lot of redraw when we move the
1395 * client during WM_FORMATFRAME.
1396 */
[2]1397
[551]1398 if (mr && mp2) {
[191]1399 prectl = (PRECTL) mp1;
[551]1400 prectl->yBottom += 22;
1401 prectl->yTop -= 22;
[191]1402 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, NEWVIEW_LISTBOX,
1403 LM_QUERYITEMCOUNT,
1404 MPVOID, MPVOID);
1405 if (sSelect > 0)
[551]1406 prectl->yTop -= 48;
[2]1407 }
[191]1408 return mr;
1409 }
[2]1410
[191]1411 case WM_FORMATFRAME:
1412 {
1413 SHORT sCount, soldCount, sSelect;
[551]1414 PSWP pswp, pswpClient, pswpNew1, pswpNew2, pswpNew3, pswpList,
1415 pswpScroll, pswpNew4, pswpUp, pswpDn;
[2]1416
[191]1417 sCount = (SHORT) oldproc(hwnd, msg, mp1, mp2);
1418 soldCount = sCount;
[2]1419
[191]1420 /*
1421 * Reformat the frame to "squeeze" the client
1422 * and make room for status window sibling beneath
1423 */
[2]1424
[191]1425 pswp = (PSWP) mp1;
1426 {
1427 SHORT x;
[2]1428
[551]1429 for (x = 0; x < sCount; x++) {
1430 if (WinQueryWindowUShort(pswp->hwnd, QWS_ID) == FID_CLIENT) {
[191]1431 pswpClient = pswp;
1432 break;
1433 }
1434 pswp++;
1435 }
[2]1436 }
[191]1437 pswpNew1 = (PSWP) mp1 + soldCount;
1438 pswpNew2 = (PSWP) mp1 + (soldCount + 1);
1439 pswpNew3 = (PSWP) mp1 + (soldCount + 2);
1440 pswpNew4 = (PSWP) mp1 + (soldCount + 3);
1441 *pswpNew1 = *pswpClient;
[551]1442 pswpNew1->hwnd = WinWindowFromID(hwnd, NEWVIEW_STATUS1);
1443 pswpNew1->x = pswpClient->x + 2;
1444 pswpNew1->y = pswpClient->y + 2;
1445 pswpNew1->cx = (pswpClient->cx / 3) - 3;
1446 pswpNew1->cy = 20;
1447 pswpClient->y = pswpNew1->y + pswpNew1->cy + 3;
1448 pswpClient->cy = (pswpClient->cy - pswpNew1->cy) - 5;
[191]1449 *pswpNew2 = *pswpNew1;
1450 *pswpNew3 = *pswpNew1;
1451 *pswpNew4 = *pswpNew1;
[551]1452 pswpNew2->hwnd = WinWindowFromID(hwnd, NEWVIEW_STATUS2);
1453 pswpNew3->hwnd = WinWindowFromID(hwnd, NEWVIEW_STATUS3);
1454 pswpNew4->hwnd = WinWindowFromID(hwnd, NEWVIEW_DRAG);
1455 pswpNew2->x = pswpNew1->x + pswpNew1->cx + 3;
1456 pswpNew3->x = pswpNew2->x + pswpNew2->cx + 3;
1457 pswpNew3->cx = ((pswpClient->x + pswpClient->cx) - pswpNew3->x) - 26;
1458 pswpNew4->x = pswpNew3->x + pswpNew3->cx + 3;
1459 pswpNew4->cx = 20;
[191]1460 sCount += 4;
1461 pswpScroll = (PSWP) mp1;
[551]1462 while (pswpScroll < pswpClient) {
1463 if (WinQueryWindowUShort(pswpScroll->hwnd, QWS_ID) == FID_VERTSCROLL)
[191]1464 break;
1465 pswpScroll++;
1466 }
1467 if (pswpScroll == pswpClient)
1468 pswpScroll = NULL;
1469 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, NEWVIEW_LISTBOX,
[551]1470 LM_QUERYITEMCOUNT, MPVOID, MPVOID);
1471 if (sSelect > 0) {
[191]1472 pswpList = (PSWP) mp1 + (soldCount + 4);
1473 *pswpList = *pswpClient;
[551]1474 pswpList->hwnd = WinWindowFromID(hwnd, NEWVIEW_LISTBOX);
1475 pswpList->x = pswpClient->x;
1476 pswpList->cx = pswpClient->cx;
1477 if (pswpScroll) {
1478 pswpList->cx += pswpScroll->cx;
1479 pswpScroll->cy -= 48;
[191]1480 }
[551]1481 pswpList->y = (pswpClient->y + pswpClient->cy) - 48;
1482 pswpList->cy = 48;
1483 pswpClient->cy -= 48;
[191]1484 sCount++;
1485 }
1486 WinShowWindow(WinWindowFromID(hwnd, NEWVIEW_LISTBOX), (sSelect > 0));
[2]1487
[551]1488 if (pswpScroll) {
[191]1489 pswpUp = (PSWP) mp1 + (soldCount + 4 + (sSelect > 0));
1490 *pswpUp = *pswpClient;
[551]1491 pswpUp->hwnd = WinWindowFromID(hwnd, IDM_PREVBLANKLINE);
1492 pswpUp->cx = pswpScroll->cx;
1493 pswpUp->x = pswpScroll->x;
1494 pswpUp->cy = WinQuerySysValue(HWND_DESKTOP, SV_CYVSCROLLARROW);
1495 pswpUp->y = (pswpScroll->y + pswpScroll->cy) - (pswpUp->cy + 1);
1496 pswpScroll->cy -= ((pswpUp->cy * 2) + 1);
[191]1497 pswpDn = (PSWP) mp1 + (soldCount + 5 + (sSelect > 0));
1498 *pswpDn = *pswpUp;
[551]1499 pswpDn->y = pswpScroll->y;
1500 pswpDn->hwnd = WinWindowFromID(hwnd, IDM_NEXTBLANKLINE);
1501 pswpScroll->y += pswpUp->cy;
[191]1502 sCount += 2;
1503 }
[551]1504 else {
[191]1505 WinShowWindow(WinWindowFromID(hwnd, IDM_PREVBLANKLINE), FALSE);
1506 WinShowWindow(WinWindowFromID(hwnd, IDM_NEXTBLANKLINE), FALSE);
1507 }
1508 return MRFROMSHORT(sCount);
1509 }
[2]1510
[191]1511 case WM_QUERYFRAMECTLCOUNT:
1512 {
1513 SHORT sCount, sSelect;
1514
1515 sCount = (SHORT) oldproc(hwnd, msg, mp1, mp2);
1516 sCount += 6;
1517 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, NEWVIEW_LISTBOX,
[551]1518 LM_QUERYITEMCOUNT, MPVOID, MPVOID);
[191]1519 if (sSelect > 0)
1520 sCount++;
1521 return MRFROMSHORT(sCount);
1522 }
[2]1523 }
[191]1524 return oldproc(hwnd, msg, mp1, mp2);
[2]1525}
1526
[191]1527MRESULT EXPENTRY FindStrDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[83]1528{
[2]1529 VIEWDATA *ad;
1530
[551]1531 switch (msg) {
[191]1532 case WM_INITDLG:
1533 if (!mp2)
1534 WinDismissDlg(hwnd, 0);
[551]1535 else {
[2]1536
[191]1537 HWND hwndClient = *(HWND *) mp2;
[2]1538
[191]1539 WinSetWindowULong(hwnd, QWL_USER, (ULONG) hwndClient);
1540 ad = (VIEWDATA *) WinQueryWindowPtr(hwndClient, QWL_USER);
1541 MLEsetwrap(WinWindowFromID(hwnd, NEWFIND_MLE), FALSE);
1542 MLEsetlimit(WinWindowFromID(hwnd, NEWFIND_MLE), SEARCHSTRINGLEN);
1543 MLEsetformat(WinWindowFromID(hwnd, NEWFIND_MLE), MLFIE_NOTRANS);
[551]1544 if (*ad->searchtext) {
[2]1545
[191]1546 IPT here = 0;
[551]1547 ULONG len = strlen(ad->searchtext);
[2]1548
[191]1549 WinSendMsg(WinWindowFromID(hwnd, NEWFIND_MLE),
1550 MLM_SETIMPORTEXPORT,
[551]1551 MPFROMP(ad->searchtext), MPFROMLONG(SEARCHSTRINGLEN));
[191]1552 WinSendMsg(WinWindowFromID(hwnd, NEWFIND_MLE),
[551]1553 MLM_IMPORT, MPFROMP(&here), MPFROMLONG(len));
[2]1554 }
[551]1555 WinCheckButton(hwnd, NEWFIND_ALSOSELECT, ad->alsoselect);
1556 WinCheckButton(hwnd, NEWFIND_SENSITIVE, ad->sensitive);
1557 WinCheckButton(hwnd, NEWFIND_LITERAL, ad->literalsearch);
[191]1558 }
1559 break;
[2]1560
[191]1561 case WM_COMMAND:
[551]1562 switch (SHORT1FROMMP(mp1)) {
[191]1563 case DID_OK:
1564 {
1565 CHAR s[SEARCHSTRINGLEN];
1566 IPT here = 0;
1567 ULONG len;
1568 HWND hwndClient = WinQueryWindowULong(hwnd, QWL_USER);
[2]1569
[191]1570 ad = (VIEWDATA *) WinQueryWindowPtr(hwndClient, QWL_USER);
1571 memset(s, 0, SEARCHSTRINGLEN);
1572 WinSendMsg(WinWindowFromID(hwnd, NEWFIND_MLE),
1573 MLM_SETIMPORTEXPORT,
[551]1574 MPFROMP(s), MPFROMLONG(SEARCHSTRINGLEN));
[191]1575 len = SEARCHSTRINGLEN;
1576 WinSendMsg(WinWindowFromID(hwnd, NEWFIND_MLE),
[551]1577 MLM_EXPORT, MPFROMP(&here), MPFROMLONG(&len));
[191]1578 s[SEARCHSTRINGLEN - 1] = 0;
[551]1579 if (!*s) {
[350]1580 DosBeep(250, 100); // Complain
[191]1581 break;
1582 }
[551]1583 strcpy(ad->searchtext, s);
1584 ad->sensitive = WinQueryButtonCheckstate(hwnd, NEWFIND_SENSITIVE);
1585 if (ad->sensitive != Sensitive) {
1586 Sensitive = ad->sensitive;
[191]1587 PrfWriteProfileData(fmprof,
1588 appname,
1589 "Viewer.Sensitive",
[551]1590 &ad->sensitive, sizeof(BOOL));
[191]1591 }
[551]1592 ad->literalsearch = WinQueryButtonCheckstate(hwnd, NEWFIND_LITERAL);
1593 if (ad->literalsearch != LiteralSearch) {
1594 LiteralSearch = ad->literalsearch;
[191]1595 PrfWriteProfileData(fmprof,
1596 appname,
1597 "Viewer.LiteralSearch",
[551]1598 &ad->literalsearch, sizeof(BOOL));
[191]1599 }
[551]1600 ad->alsoselect = WinQueryButtonCheckstate(hwnd, NEWFIND_ALSOSELECT);
1601 if (ad->alsoselect != AlsoSelect) {
1602 AlsoSelect = ad->alsoselect;
[191]1603 PrfWriteProfileData(fmprof,
1604 appname,
1605 "Viewer.AlsoSelect",
[551]1606 &ad->alsoselect, sizeof(BOOL));
[191]1607 }
[2]1608 }
[191]1609 WinDismissDlg(hwnd, 1);
1610 break;
1611 case DID_CANCEL:
1612 WinDismissDlg(hwnd, 0);
1613 break;
1614 }
1615 return 0;
[2]1616 }
[191]1617 return WinDefDlgProc(hwnd, msg, mp1, mp2);
[2]1618}
1619
[191]1620MRESULT EXPENTRY ViewWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[83]1621{
[191]1622 VIEWDATA *ad = WinQueryWindowPtr(hwnd, QWL_USER);
[2]1623
[551]1624 switch (msg) {
[191]1625 case WM_CREATE:
1626 {
1627 HWND temphwnd;
[377]1628 HWND hwndFrame = WinQueryWindow(hwnd, QW_PARENT);
[2]1629
[377]1630 temphwnd = WinCreateWindow(hwndFrame,
[191]1631 WC_BUTTON,
1632 "<",
1633 WS_VISIBLE |
1634 BS_PUSHBUTTON | BS_NOPOINTERFOCUS,
1635 0,
1636 0,
1637 0,
1638 0,
[377]1639 hwndFrame,
[551]1640 HWND_TOP, IDM_PREVBLANKLINE, NULL, NULL);
[377]1641 if (!temphwnd)
[551]1642 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__,
1643 IDS_WINCREATEWINDOW);
[377]1644 else {
[551]1645 WinSetPresParam(temphwnd,
1646 PP_FONTNAMESIZE,
1647 strlen(GetPString(IDS_8HELVTEXT)) + 1,
1648 (PVOID) GetPString(IDS_8HELVTEXT));
[377]1649 }
1650 temphwnd = WinCreateWindow(hwndFrame,
[191]1651 WC_BUTTON,
1652 ">",
1653 WS_VISIBLE |
1654 BS_PUSHBUTTON | BS_NOPOINTERFOCUS,
1655 0,
1656 0,
1657 0,
1658 0,
[377]1659 hwndFrame,
[551]1660 HWND_TOP, IDM_NEXTBLANKLINE, NULL, NULL);
[377]1661 if (!temphwnd)
[551]1662 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__,
1663 IDS_WINCREATEWINDOW);
[377]1664 else {
[551]1665 WinSetPresParam(temphwnd,
1666 PP_FONTNAMESIZE,
1667 strlen(GetPString(IDS_8HELVTEXT)) + 1,
1668 (PVOID) GetPString(IDS_8HELVTEXT));
[377]1669 }
[551]1670 WinStartTimer(WinQueryAnchorBlock(hwnd), hwnd, ID_TIMER5, 1000L);
[191]1671 }
1672 break;
[2]1673
[191]1674 case WM_TIMER:
1675 if (ad &&
[551]1676 ad->needrefreshing &&
1677 !ad->stopflag &&
1678 !ad->relining &&
1679 !DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN)) {
1680 ad->needrefreshing = FALSE;
1681 DosReleaseMutexSem(ad->ScanSem);
[191]1682 WinInvalidateRect(hwnd, NULL, TRUE);
1683 }
1684 break;
[2]1685
[191]1686 case UM_SETUP:
[377]1687 if (!ad)
[350]1688 Runtime_Error(pszSrcFile, __LINE__, "no data");
1689 else {
1690 CHAR s[CCHMAXPATH + 8];
1691 APIRET rc;
[551]1692
1693 ad->hwndMenu = WinWindowFromID(ad->hwndFrame, FID_MENU);
1694 ad->hvscroll = WinWindowFromID(ad->hwndFrame, FID_VERTSCROLL);
1695 ad->hhscroll = WinWindowFromID(ad->hwndFrame, FID_HORZSCROLL);
1696 WinSendMsg(ad->hhscroll, SBM_SETTHUMBSIZE, MPFROM2SHORT(1, 1), MPVOID);
1697 WinSendMsg(ad->hvscroll, SBM_SETTHUMBSIZE, MPFROM2SHORT(1, 1), MPVOID);
1698 sprintf(s, "%s: %s", FM2Str, ad->filename);
1699 WinSetWindowText(ad->hwndFrame, s);
1700 rc = DosCreateMutexSem(NULL, &ad->ScanSem, 0L, FALSE);
[350]1701 if (rc)
[551]1702 Dos_Error(MB_CANCEL, rc, hwnd, pszSrcFile, __LINE__,
1703 "DosCreateMutexSem");
[350]1704 else {
1705 PFNWP oldproc;
[551]1706 HWND hwndFrame = ad->hwndFrame;
1707
1708 WinSendMsg(ad->hvscroll,
1709 SBM_SETSCROLLBAR, MPFROMSHORT(1), MPFROM2SHORT(1, 1));
1710 WinSendMsg(ad->hhscroll, SBM_SETSCROLLBAR, MPFROMSHORT(1),
[191]1711 MPFROM2SHORT(1, 1));
[551]1712 ad->hwndStatus1 = WinCreateWindow(hwndFrame,
[593]1713 WC_VIEWSTATUS,
[551]1714 GetPString(IDS_LOADINGTEXT),
1715 WS_VISIBLE | SS_TEXT |
1716 DT_LEFT | DT_VCENTER,
1717 0,
1718 0,
1719 0,
1720 0,
1721 hwndFrame,
1722 HWND_TOP,
1723 NEWVIEW_STATUS1, NULL, NULL);
1724 if (!ad->hwndStatus1)
1725 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__,
1726 IDS_WINCREATEWINDOW);
[377]1727
[551]1728 ad->hwndStatus2 = WinCreateWindow(hwndFrame,
[593]1729 WC_VIEWSTATUS,
[551]1730 NULL,
1731 WS_VISIBLE | SS_TEXT |
1732 DT_LEFT | DT_VCENTER,
1733 0,
1734 0,
1735 0,
1736 0,
1737 hwndFrame,
1738 HWND_TOP,
1739 NEWVIEW_STATUS2, NULL, NULL);
1740 if (!ad->hwndStatus2)
1741 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__,
1742 IDS_WINCREATEWINDOW);
[377]1743
[551]1744 ad->hwndStatus3 = WinCreateWindow(hwndFrame,
[593]1745 WC_VIEWSTATUS,
[551]1746 NULL,
1747 WS_VISIBLE | SS_TEXT |
1748 DT_LEFT | DT_VCENTER,
1749 0,
1750 0,
1751 0,
1752 0,
1753 hwndFrame,
1754 HWND_TOP,
1755 NEWVIEW_STATUS3, NULL, NULL);
1756 if (!ad->hwndStatus3)
1757 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__,
1758 IDS_WINCREATEWINDOW);
[377]1759
[551]1760 ad->hwndListbox = WinCreateWindow(hwndFrame,
1761 WC_LISTBOX,
1762 NULL,
1763 LS_NOADJUSTPOS,
1764 0,
1765 0,
1766 0,
1767 0,
1768 hwndFrame,
1769 HWND_TOP,
1770 NEWVIEW_LISTBOX, NULL, NULL);
1771 if (!ad->hwndListbox)
1772 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__,
1773 IDS_WINCREATEWINDOW);
[377]1774
[551]1775 ad->hwndDrag = WinCreateWindow(hwndFrame,
[593]1776 WC_VIEWSTATUS,
[551]1777 "#100",
1778 WS_VISIBLE | SS_BITMAP,
1779 0,
1780 0,
1781 0,
1782 0,
1783 hwndFrame,
1784 HWND_TOP, NEWVIEW_DRAG, NULL, NULL);
1785 if (!ad->hwndDrag)
1786 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__,
1787 IDS_WINCREATEWINDOW);
[377]1788
1789 oldproc = WinSubclassWindow(hwndFrame, ViewFrameWndProc);
[551]1790 WinSetWindowPtr(hwndFrame, QWL_USER, (PVOID) oldproc);
1791 ad->hps = InitWindow(hwnd);
[533]1792 if (_beginthread(LoadFileThread, NULL, 524288, (PVOID) hwnd) == -1)
[551]1793 Runtime_Error(pszSrcFile, __LINE__,
1794 GetPString(IDS_COULDNTSTARTTHREADTEXT));
[350]1795 else {
1796 WinSendMsg(hwnd, UM_SETUP5, MPVOID, MPVOID);
[812]1797 DosSleep(32); //05 Aug 07 GKY 32
[551]1798 return (MRESULT) 1;
[191]1799 }
[2]1800 }
[191]1801 }
[350]1802 // Oops
[191]1803 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
1804 return 0;
[2]1805
[191]1806 case UM_SETUP5:
[551]1807 if (ad) {
1808 if (ad->hwndFrame ==
1809 WinQueryActiveWindow(WinQueryWindow(ad->hwndFrame,
[191]1810 QW_PARENT)) &&
[551]1811 !ParentIsDesktop(ad->hwndFrame, (HWND) 0)) {
[191]1812 if (hwndStatus2)
1813 WinSetWindowText(hwndStatus2,
[551]1814 (*ad->filename) ?
1815 ad->filename : GetPString(IDS_UNTITLEDTEXT));
1816 if (fMoreButtons) {
[191]1817 WinSetWindowText(hwndName,
[551]1818 (*ad->filename) ?
1819 ad->filename : GetPString(IDS_UNTITLEDTEXT));
[191]1820 WinSetWindowText(hwndDate, NullStr);
1821 WinSetWindowText(hwndAttr, NullStr);
1822 }
1823 if (hwndStatus)
1824 WinSetWindowText(hwndStatus,
1825 GetPString(IDS_INTERNALVIEWERTITLETEXT));
[2]1826 }
[191]1827 }
1828 return 0;
[2]1829
[191]1830 case DM_DISCARDOBJECT:
1831 case DM_PRINTOBJECT:
1832 return MRFROMLONG(DRR_TARGET);
[2]1833
[191]1834 case UM_RESCAN:
[551]1835 if (ad) {
1836 if (!ad->busy && !DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN)) {
1837 if (ad->numlines) {
[2]1838
[191]1839 CHAR s[80], tb[34], tl[34];
[2]1840
[551]1841 commafmt(tb, sizeof(tb), ad->textsize);
1842 commafmt(tl, sizeof(tl), ad->numlines);
[191]1843 sprintf(s,
1844 " %s %s%s %s %s%s",
1845 tb,
1846 GetPString(IDS_BYTETEXT),
[551]1847 &"s"[ad->textsize == 1],
1848 tl, GetPString(IDS_LINETEXT), &"s"[ad->numlines == 1]);
1849 WinSetWindowText(ad->hwndStatus1, s);
[191]1850 }
1851 else
[551]1852 WinSetWindowText(ad->hwndStatus1, GetPString(IDS_NVNOLINESTEXT));
1853 DosReleaseMutexSem(ad->ScanSem);
[2]1854 }
[191]1855 else
[551]1856 WinSetWindowText(ad->hwndStatus1, GetPString(IDS_WORKINGTEXT));
[191]1857 }
1858 return 0;
[2]1859
[191]1860 case UM_SETUP2:
1861 /*
1862 * calculate width of client in characters, recalc lines if
1863 * oldwidth != newwidth, set ad->oldwidth for later comparison
1864 */
[551]1865 if (ad) {
[2]1866
[191]1867 BOOL invalidate = FALSE;
[2]1868
[551]1869 if (!ad->wrapon && !ad->hex) {
1870 if (WinQueryWindow(ad->hhscroll, QW_PARENT) == ad->hwndFrame) {
[191]1871 invalidate = TRUE;
[551]1872 WinSetOwner(ad->hhscroll, HWND_OBJECT);
1873 WinSetParent(ad->hhscroll, HWND_OBJECT, TRUE);
1874 ad->maxx = 0;
1875 ad->horzscroll = 0;
[191]1876 }
[2]1877 }
[551]1878 else {
1879 if (WinQueryWindow(ad->hhscroll, QW_PARENT) != ad->hwndFrame) {
[191]1880 invalidate = TRUE;
[551]1881 WinSetOwner(ad->hhscroll, ad->hwndFrame);
1882 WinSetParent(ad->hhscroll, ad->hwndFrame, TRUE);
[191]1883 }
1884 }
[551]1885 if (invalidate) {
1886 WinSendMsg(ad->hwndFrame, WM_UPDATEFRAME, MPFROMLONG(FCF_SIZEBORDER),
[191]1887 MPVOID);
1888 WinInvalidateRect(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
1889 NEWVIEW_DRAG), NULL, FALSE);
[551]1890 WinInvalidateRect(ad->hhscroll, NULL, FALSE);
[191]1891 }
1892 }
[2]1893
[551]1894 if (ad && !ad->busy &&
1895 !DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN)) {
[2]1896
[191]1897 RECTL rcl;
1898 ULONG newwidth;
[2]1899
[191]1900 WinQueryWindowRect(hwnd, &rcl);
[551]1901 newwidth = (rcl.xRight - rcl.xLeft) / ad->fattrs.lAveCharWidth;
1902 if ((!ad->hex || ad->oldwidth == -1) &&
1903 newwidth != ad->oldwidth && ad->text && ad->textsize) {
1904 ad->oldwidth = newwidth;
1905 if (!ad->relining) {
1906 if (_beginthread(ReLineThread, NULL, 524288, (PVOID) hwnd) == -1) {
1907 Runtime_Error(pszSrcFile, __LINE__,
1908 GetPString(IDS_COULDNTSTARTTHREADTEXT));
1909 DosReleaseMutexSem(ad->ScanSem);
[191]1910 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
1911 return 0;
1912 }
1913 }
[2]1914 }
[551]1915 ad->oldwidth = newwidth;
1916 DosReleaseMutexSem(ad->ScanSem);
[191]1917 }
1918 return MRFROMLONG(TRUE);
[2]1919
[191]1920 case WM_CHAR:
1921 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
[551]1922 if (ad && !ad->busy && !(SHORT1FROMMP(mp1) & KC_KEYUP) &&
1923 !DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN)) {
[2]1924
[551]1925 ULONG numlines, wascursored = ad->cursored;
[191]1926 RECTL rcl;
[2]1927
[191]1928 WinQueryWindowRect(hwnd, &rcl);
1929 numlines = NumLines(&rcl, ad);
[551]1930 if (numlines) {
1931 if (SHORT1FROMMP(mp1) & KC_VIRTUALKEY) {
1932 switch (SHORT2FROMMP(mp2)) {
[191]1933 case VK_LEFT:
1934 WinSendMsg(hwnd, WM_HSCROLL, MPFROM2SHORT(FID_HORZSCROLL, 0),
1935 MPFROM2SHORT(0, SB_LINELEFT));
1936 break;
1937 case VK_RIGHT:
1938 WinSendMsg(hwnd, WM_HSCROLL, MPFROM2SHORT(FID_HORZSCROLL, 0),
1939 MPFROM2SHORT(0, SB_LINERIGHT));
1940 break;
1941 case VK_PAGEUP:
1942 PostMsg(hwnd, WM_VSCROLL, MPFROM2SHORT(FID_VERTSCROLL, 0),
1943 MPFROM2SHORT(0, SB_PAGEUP));
1944 break;
1945 case VK_PAGEDOWN:
1946 PostMsg(hwnd, WM_VSCROLL, MPFROM2SHORT(FID_VERTSCROLL, 0),
1947 MPFROM2SHORT(0, SB_PAGEDOWN));
1948 break;
1949 case VK_UP:
[551]1950 if (ad->cursored > 1) {
[191]1951 if (shiftstate & KC_SHIFT)
1952 WinSendMsg(hwnd, WM_BUTTON1CLICK,
[551]1953 MPFROM2SHORT(ad->fattrs.lAveCharWidth + 2,
1954 ((rcl.yTop - (ad->lMaxHeight *
1955 ((ad->cursored) -
1956 ad->topline))) -
1957 ad->lMaxDescender) - 1),
[191]1958 MPFROM2SHORT(TRUE, 0));
[551]1959 ad->cursored--;
1960 if (ad->cursored < ad->topline) {
1961 PaintLine(hwnd, ad->hps, ad->cursored, ad->topline, &rcl);
[191]1962 WinSendMsg(hwnd, WM_VSCROLL, MPFROM2SHORT(FID_VERTSCROLL, 0),
1963 MPFROM2SHORT(0, SB_LINEUP));
1964 }
[551]1965 else {
1966 PaintLine(hwnd, ad->hps, ad->cursored - 1, ad->topline, &rcl);
1967 PaintLine(hwnd, ad->hps, ad->cursored, ad->topline, &rcl);
[191]1968 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
1969 }
1970 }
1971 break;
1972 case VK_DOWN:
[551]1973 if (ad->cursored < ad->numlines &&
1974 ad->cursored < ad->topline + numlines) {
[191]1975 if (shiftstate & KC_SHIFT)
1976 WinSendMsg(hwnd, WM_BUTTON1CLICK,
[551]1977 MPFROM2SHORT(ad->fattrs.lAveCharWidth + 2,
1978 ((rcl.yTop - (ad->lMaxHeight *
1979 ((ad->cursored) -
1980 ad->topline))) -
1981 ad->lMaxDescender) - 1),
[191]1982 MPFROM2SHORT(TRUE, 0));
[551]1983 ad->cursored++;
1984 if (ad->cursored >= ad->topline + numlines) {
1985 PaintLine(hwnd, ad->hps, ad->cursored - 2, ad->topline, &rcl);
[191]1986 WinSendMsg(hwnd, WM_VSCROLL, MPFROM2SHORT(FID_VERTSCROLL, 0),
1987 MPFROM2SHORT(0, SB_LINEDOWN));
1988 }
[551]1989 else {
1990 PaintLine(hwnd, ad->hps, ad->cursored - 1, ad->topline, &rcl);
1991 PaintLine(hwnd, ad->hps, ad->cursored - 2, ad->topline, &rcl);
[191]1992 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
1993 }
1994 }
1995 break;
1996 case VK_END:
1997 if ((shiftstate & KC_CTRL) ||
[551]1998 ad->cursored == (ad->topline - 1) + numlines) {
1999 ad->cursored = ad->numlines;
2000 ad->topline = (ad->numlines + 1) - numlines;
2001 if (ad->topline > ad->numlines)
2002 ad->topline = 1;
[191]2003 WinInvalidateRect(hwnd, NULL, FALSE);
2004 }
[551]2005 else {
2006 ad->cursored = (ad->topline - 1) + numlines;
2007 if (ad->cursored > ad->numlines)
2008 ad->cursored = ad->numlines;
2009 PaintLine(hwnd, ad->hps, ad->cursored - 1, ad->topline, &rcl);
2010 PaintLine(hwnd, ad->hps, wascursored - 1, ad->topline, &rcl);
[191]2011 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
2012 }
2013 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
2014 break;
2015 case VK_HOME:
[551]2016 if ((shiftstate & KC_CTRL) || ad->cursored == ad->topline) {
2017 ad->topline = 1;
2018 ad->cursored = 1;
[191]2019 WinInvalidateRect(hwnd, NULL, FALSE);
2020 }
[551]2021 else {
2022 ad->cursored = ad->topline;
2023 PaintLine(hwnd, ad->hps, ad->cursored - 1, ad->topline, &rcl);
2024 PaintLine(hwnd, ad->hps, wascursored - 1, ad->topline, &rcl);
[191]2025 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
2026 }
2027 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
2028 break;
2029 case VK_SPACE:
2030 WinSendMsg(hwnd, WM_BUTTON1CLICK,
[551]2031 MPFROM2SHORT(ad->fattrs.lAveCharWidth + 2,
2032 ((rcl.yTop - (ad->lMaxHeight *
2033 ((ad->cursored) -
2034 ad->topline))) -
2035 ad->lMaxDescender) - 1),
[191]2036 MPFROM2SHORT(TRUE, 0));
2037 break;
2038 case VK_NEWLINE:
2039 case VK_ENTER:
2040 WinSendMsg(hwnd, WM_BUTTON1DBLCLK,
[551]2041 MPFROM2SHORT(ad->fattrs.lAveCharWidth + 2,
2042 ((rcl.yTop - (ad->lMaxHeight *
2043 ((ad->cursored) -
2044 ad->topline))) -
2045 ad->lMaxDescender) - 1), MPFROM2SHORT(0,
2046 0));
[191]2047 break;
2048 }
2049 }
[551]2050 else if (SHORT1FROMMP(mp1) & KC_CHAR) {
2051 switch (SHORT1FROMMP(mp2)) {
[191]2052 case '\r':
2053 case '\n':
2054 WinSendMsg(hwnd, WM_BUTTON1DBLCLK,
[551]2055 MPFROM2SHORT(ad->fattrs.lAveCharWidth + 2,
2056 (rcl.yTop - (ad->lMaxHeight *
2057 ((ad->cursored) -
2058 ad->topline))) - 1),
[191]2059 MPFROM2SHORT(0, 0));
2060 break;
2061 default:
2062 break;
2063 }
2064 }
[551]2065 if (wascursored != ad->cursored)
[191]2066 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
[2]2067 }
[551]2068 DosReleaseMutexSem(ad->ScanSem);
[191]2069 }
2070 break;
[2]2071
[191]2072 case WM_BUTTON1MOTIONSTART:
2073 WinSetFocus(HWND_DESKTOP, hwnd);
[551]2074 if (ad && !ad->stopflag && !ad->busy &&
2075 !DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN)) {
2076 ad->mousecaptured = TRUE;
2077 ad->lastselected = ULONG_MAX;
2078 ad->lastdirection = 0;
[191]2079 WinSetCapture(HWND_DESKTOP, hwnd);
2080 WinSendMsg(hwnd, WM_BUTTON1CLICK, mp1, MPFROM2SHORT(TRUE, 0));
2081 }
2082 break;
[2]2083
[191]2084 case WM_MOUSEMOVE:
2085 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
[551]2086 if (ad && ad->mousecaptured) {
[2]2087
[191]2088 ULONG numlines, whichline, x;
2089 LONG inc;
2090 RECTL Rectl;
2091 POINTS pts;
2092 BOOL outofwindow = FALSE;
[2]2093
[191]2094 WinQueryWindowRect(hwnd, &Rectl);
2095 numlines = NumLines(&Rectl, ad);
[551]2096 if (numlines) {
[191]2097 pts.x = SHORT1FROMMP(mp1);
2098 pts.y = SHORT2FROMMP(mp1);
[551]2099 if (pts.y < 0) {
[191]2100 WinSendMsg(hwnd, WM_VSCROLL, MPFROM2SHORT(FID_VERTSCROLL, 0),
2101 MPFROM2SHORT(0, SB_LINEDOWN));
2102 pts.y = 1;
2103 outofwindow = TRUE;
2104 }
[551]2105 else if (pts.y > Rectl.yTop - Rectl.yBottom) {
[191]2106 WinSendMsg(hwnd, WM_VSCROLL, MPFROM2SHORT(FID_VERTSCROLL, 0),
2107 MPFROM2SHORT(0, SB_LINEUP));
2108 pts.y = (Rectl.yTop - Rectl.yBottom) - 1;
2109 outofwindow = TRUE;
2110 }
2111 whichline = ((Rectl.yTop - Rectl.yBottom) -
[551]2112 ((LONG) pts.y + ad->lMaxDescender)) / ad->lMaxHeight;
[191]2113 if (whichline > numlines - 1)
2114 whichline = numlines - 1;
[551]2115 whichline += (ad->topline - 1);
2116 if (whichline < ad->numlines && ad->lastselected != whichline) {
2117 if (ad->lastselected != ULONG_MAX) {
2118 inc = (ad->lastselected < whichline) ? 1 : -1;
2119 for (x = ad->lastselected + inc;
2120 x != whichline && x < ad->numlines;
2121 (ad->lastselected < whichline) ? x++ : x--) {
2122 if (ad->markedlines) {
2123 if (ad->markedlines[x] & VF_SELECTED) {
2124 ad->markedlines[x] &= (~VF_SELECTED);
2125 ad->selected--;
[191]2126 }
[551]2127 else {
2128 ad->markedlines[x] |= VF_SELECTED;
2129 ad->selected++;
[191]2130 }
2131 }
[551]2132 PaintLine(hwnd, ad->hps, x, ad->topline, &Rectl);
[191]2133 }
2134 WinSendMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
2135 }
2136 WinSendMsg(hwnd, WM_BUTTON1CLICK, MPFROM2SHORT(pts.x, pts.y),
2137 MPFROM2SHORT(TRUE, 0));
2138 }
2139 }
[551]2140 if (outofwindow) {
[2]2141
[191]2142 POINTL ptl;
[2]2143
[191]2144 WinQueryPointerPos(HWND_DESKTOP, &ptl);
2145 WinMapWindowPoints(HWND_DESKTOP, hwnd, &ptl, 1L);
2146 if ((SHORT) ptl.y == (SHORT) SHORT2FROMMP(mp1) &&
2147 (SHORT) ptl.x == (SHORT) SHORT1FROMMP(mp1) &&
[551]2148 ((SHORT) ptl.y < 0 || ptl.y > (Rectl.yTop - Rectl.yBottom))) {
[191]2149 PostMsg(hwnd, UM_MOUSEMOVE, mp1, MPVOID);
[771]2150 DosSleep(1);
[191]2151 }
[2]2152 }
[191]2153 }
2154 break;
[2]2155
[191]2156 case UM_MOUSEMOVE:
[551]2157 if (ad && ad->mousecaptured) {
[2]2158
[191]2159 POINTL ptl;
2160 RECTL Rectl;
[2]2161
[191]2162 WinQueryWindowRect(hwnd, &Rectl);
2163 WinQueryPointerPos(HWND_DESKTOP, &ptl);
[771]2164 WinMapWindowPoints(HWND_DESKTOP, hwnd, &ptl, 1);
[191]2165 if ((SHORT) ptl.y == (SHORT) SHORT2FROMMP(mp1) &&
2166 (SHORT) ptl.x == (SHORT) SHORT1FROMMP(mp1) &&
[551]2167 ((SHORT) ptl.y < 0 || ptl.y > (Rectl.yTop - Rectl.yBottom))) {
[771]2168 DosSleep(1);
[191]2169 PostMsg(hwnd, WM_MOUSEMOVE, mp1, MPFROM2SHORT(TRUE, 0));
[2]2170 }
[191]2171 }
2172 return 0;
[2]2173
[191]2174 case WM_BUTTON1UP:
2175 case WM_BUTTON1MOTIONEND:
2176 WinSetFocus(HWND_DESKTOP, hwnd);
[551]2177 if (ad && ad->mousecaptured) {
2178 ad->mousecaptured = FALSE;
2179 ad->lastselected = ULONG_MAX;
2180 ad->lastdirection = 0;
2181 DosReleaseMutexSem(ad->ScanSem);
[191]2182 WinSetCapture(HWND_DESKTOP, NULLHANDLE);
2183 }
2184 break;
[2]2185
[191]2186 case WM_BUTTON1DBLCLK:
2187 case WM_BUTTON1CLICK:
2188 WinSetFocus(HWND_DESKTOP, hwnd);
[551]2189 if (ad && !ad->stopflag && ad->numlines && ad->text && !ad->busy &&
2190 !DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN)) {
[2]2191
[191]2192 ULONG numlines, whichline, wascursored, width;
2193 RECTL Rectl;
2194 POINTS pts;
[2]2195
[191]2196 WinQueryWindowRect(hwnd, &Rectl);
2197 numlines = NumLines(&Rectl, ad);
2198 if (!numlines)
2199 break;
2200 pts.x = SHORT1FROMMP(mp1);
2201 pts.y = SHORT2FROMMP(mp1);
2202 whichline = ((Rectl.yTop - Rectl.yBottom) -
[551]2203 ((LONG) pts.y + ad->lMaxDescender)) / ad->lMaxHeight;
[191]2204 if (whichline > numlines - 1)
2205 whichline = numlines - 1;
[551]2206 whichline += (ad->topline - 1);
2207 if (whichline + 1 > ad->numlines)
[191]2208 break;
[551]2209 wascursored = ad->cursored;
2210 ad->cursored = whichline + 1;
2211 if (msg == WM_BUTTON1CLICK) {
2212 if (ad->lastselected != ULONG_MAX) {
2213 if (whichline > ad->lastselected)
2214 ad->lastdirection = 1;
[191]2215 else
[551]2216 ad->lastdirection = 2;
[191]2217 }
2218 else
[551]2219 ad->lastdirection = 0;
2220 ad->lastselected = whichline;
2221 if (whichline < ad->numlines) {
2222 if (ad->markedlines) {
2223 if (ad->markedlines[whichline] & VF_SELECTED) {
2224 ad->selected--;
2225 ad->markedlines[whichline] &= (~VF_SELECTED);
[191]2226 }
[551]2227 else {
2228 ad->selected++;
2229 ad->markedlines[whichline] |= VF_SELECTED;
[191]2230 }
2231 }
2232 WinSendMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
2233 }
[551]2234 PaintLine(hwnd, ad->hps, whichline, ad->topline, &Rectl);
2235 if (ad->cursored != wascursored) {
2236 PaintLine(hwnd, ad->hps, wascursored - 1, ad->topline, &Rectl);
[191]2237 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
2238 }
2239 }
[551]2240 else {
[2]2241
[191]2242 SHORT numsels, sSelect = 0, numinserted;
2243 ULONG linenum;
[2]2244
[551]2245 if (!ad->hex && ad->lines) {
[2]2246
[191]2247 CHAR *p, *e;
[2]2248
[551]2249 width = (Rectl.xRight - Rectl.xLeft) / ad->fattrs.lAveCharWidth;
2250 e = p = ad->lines[whichline];
2251 while (*e != '\r' && *e != '\n' && e < ad->text + ad->textsize) {
2252 if (ad->wrapon && e - p == width)
[191]2253 break;
2254 e++;
2255 }
2256 if ((*e == '\r' || *e == '\n') && e > p)
2257 e--;
2258 width = e - p;
2259 if (!width)
2260 goto NoAdd;
[2]2261
[551]2262 if ((ad->httpin && *httprun &&
2263 strnstr(ad->lines[whichline], "http://", width)) ||
2264 (ad->ftpin && *ftprun &&
2265 strnstr(ad->lines[whichline], "ftp://", width))) {
[2]2266
[191]2267 USHORT ret;
2268 URLDATA *urld;
[2]2269
[551]2270 urld = xmallocz(sizeof(URLDATA), pszSrcFile, __LINE__);
[350]2271 if (urld) {
[551]2272 urld->size = sizeof(URLDATA);
2273 urld->line = ad->lines[whichline];
2274 urld->len = width;
[191]2275 ret = (USHORT) WinDlgBox(HWND_DESKTOP, hwnd, UrlDlgProc,
2276 FM3ModHandle, URL_FRAME, urld);
[350]2277 switch (ret) {
[191]2278 case 0:
2279 free(urld);
2280 goto NoAdd;
2281 case 1:
[551]2282 if (*urld->url)
[191]2283 runemf2(SEPARATE | WINDOWED,
[551]2284 hwnd, NULL, NULL, "%s %s", httprun, urld->url);
[191]2285 free(urld);
2286 goto NoAdd;
2287 case 2:
[551]2288 if (*urld->url)
[191]2289 runemf2(SEPARATE | WINDOWED,
[551]2290 hwnd, NULL, NULL, "%s %s", ftprun, urld->url);
[191]2291 free(urld);
2292 goto NoAdd;
2293 default:
2294 break;
2295 }
2296 free(urld);
2297 }
2298 }
2299 }
[551]2300 numsels = (SHORT) WinSendDlgItemMsg(ad->hwndFrame, NEWVIEW_LISTBOX,
2301 LM_QUERYITEMCOUNT, MPVOID,
2302 MPVOID);
2303 if (numsels > 0) {
2304 for (sSelect = 0; sSelect < numsels; sSelect++) {
2305 linenum =
2306 (ULONG) WinSendDlgItemMsg(ad->hwndFrame, NEWVIEW_LISTBOX,
2307 LM_QUERYITEMHANDLE,
2308 MPFROM2SHORT(sSelect, 0), MPVOID);
[191]2309 if (linenum == whichline)
2310 goto NoAdd;
2311 }
2312 }
2313 {
2314 CHAR *s = NULL, *p;
[2]2315
[551]2316 if (!ad->hex && ad->lines) {
2317 s = xmalloc(width + 2, pszSrcFile, __LINE__);
[191]2318 if (!s)
2319 goto NoAdd;
[551]2320 strncpy(s, ad->lines[whichline], width + 1);
[191]2321 s[width + 1] = 0;
2322 p = s;
[551]2323 while (*p) {
2324 if (*p == '\r' || *p == '\n') {
[191]2325 *p = 0;
2326 break;
2327 }
2328 p++;
2329 }
2330 }
[551]2331 else {
[2]2332
[191]2333 register ULONG x;
[2]2334
[551]2335 width = ad->textsize - (whichline * 16);
[191]2336 width = min(width, 16);
[551]2337 s = xmalloc(80, pszSrcFile, __LINE__);
[191]2338 if (!s)
2339 goto NoAdd;
2340 sprintf(s, "%08lx ", whichline * 16);
2341 p = s + 9;
[551]2342 for (x = 0; x < width; x++) {
2343 sprintf(p, " %02hx", ad->text[(whichline * 16) + x]);
[191]2344 p += 3;
2345 }
2346 *p = ' ';
2347 p++;
2348 *p = ' ';
2349 p++;
[551]2350 for (x = 0; x < width; x++) {
2351 *p = ad->text[(whichline * 16) + x];
[191]2352 p++;
2353 }
2354 *p = 0;
2355 }
[551]2356 if (s) {
2357 if (*s) {
2358 ad->dummy = TRUE;
2359 numinserted = (SHORT) WinSendDlgItemMsg(ad->hwndFrame,
[191]2360 NEWVIEW_LISTBOX,
2361 LM_INSERTITEM,
[551]2362 MPFROM2SHORT(LIT_END,
2363 0),
[191]2364 MPFROMP(s));
[551]2365 ad->dummy = FALSE;
[191]2366 if (numinserted >= 0)
[551]2367 WinSendDlgItemMsg(ad->hwndFrame, NEWVIEW_LISTBOX,
[191]2368 LM_SETITEMHANDLE,
2369 MPFROM2SHORT(numinserted, 0),
2370 MPFROMLONG(whichline));
2371 }
2372 free(s);
2373 }
2374 }
2375 if (!numsels)
[551]2376 WinSendMsg(ad->hwndFrame, WM_UPDATEFRAME,
[191]2377 MPFROMLONG(FCF_SIZEBORDER), MPVOID);
[2]2378 }
[191]2379 NoAdd:
[551]2380 DosReleaseMutexSem(ad->ScanSem);
[191]2381 DosPostEventSem(CompactSem);
2382 }
2383 break;
[2]2384
[191]2385 case WM_MENUEND:
[551]2386 if (ad && ad->hwndPopup == (HWND) mp2) {
2387 WinDestroyWindow(ad->hwndPopup);
2388 ad->hwndPopup = (HWND) 0;
[191]2389 }
2390 break;
2391
2392 case UM_CONTEXTMENU:
2393 case WM_CONTEXTMENU:
[551]2394 if (ad) {
2395 if (!ad->hwndPopup) {
2396 ad->hwndPopup =
2397 WinLoadMenu(HWND_DESKTOP, FM3ModHandle, NEWVIEW_POPUP);
2398 if (ad->hwndPopup)
2399 WinSetPresParam(ad->hwndPopup,
[191]2400 PP_FONTNAMESIZE,
2401 strlen(GetPString(IDS_8HELVTEXT)) + 1,
2402 GetPString(IDS_8HELVTEXT));
[2]2403 }
[551]2404 if (ad->hwndPopup) {
[2]2405
[191]2406 APIRET rc;
2407 SHORT sSelect;
[2]2408
[551]2409 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
2410 WinEnableMenuItem(ad->hwndPopup, IDM_SAVETOCLIP, (rc == 0 &&
2411 ad->selected != 0));
2412 WinEnableMenuItem(ad->hwndPopup, IDM_APPENDTOCLIP, (rc == 0 &&
2413 ad->selected !=
2414 0));
2415 WinEnableMenuItem(ad->hwndPopup, IDM_SAVETOLIST,
2416 (rc == 0 && ad->selected != 0));
2417 sSelect =
2418 (SHORT) WinSendDlgItemMsg(ad->hwndFrame, NEWVIEW_LISTBOX,
2419 LM_QUERYITEMCOUNT, MPVOID, MPVOID);
2420 WinEnableMenuItem(ad->hwndPopup, IDM_SAVETOCLIP2,
2421 (rc == 0 && sSelect > 0));
2422 WinEnableMenuItem(ad->hwndPopup, IDM_APPENDTOCLIP2,
2423 (rc == 0 && sSelect > 0));
2424 WinEnableMenuItem(ad->hwndPopup, IDM_SAVETOLIST2,
2425 (rc == 0 && sSelect > 0));
2426 WinEnableMenuItem(ad->hwndPopup, IDM_SELECTALL,
2427 (rc == 0 && ad->numlines != 0 && ad->markedlines));
2428 WinEnableMenuItem(ad->hwndPopup, IDM_DESELECTALL,
2429 (rc == 0 && ad->numlines != 0 && ad->markedlines
2430 && ad->selected != 0));
2431 WinEnableMenuItem(ad->hwndPopup, IDM_PREVSELECTED,
2432 (rc == 0 && ad->numlines != 0 && ad->markedlines
2433 && ad->selected != 0));
2434 WinEnableMenuItem(ad->hwndPopup, IDM_NEXTSELECTED,
2435 (rc == 0 && ad->numlines != 0 && ad->markedlines
2436 && ad->selected != 0));
2437 WinEnableMenuItem(ad->hwndPopup, IDM_SELECTFOUND,
2438 (rc == 0 && ad->numlines != 0 && ad->markedlines
2439 && ad->found != 0));
2440 WinEnableMenuItem(ad->hwndPopup, IDM_DESELECTFOUND,
2441 (rc == 0 && ad->numlines != 0 && ad->markedlines
2442 && ad->selected != 0 && ad->found != 0));
2443 WinEnableMenuItem(ad->hwndPopup, IDM_INVERT,
2444 (rc == 0 && ad->numlines != 0 && ad->markedlines));
2445 WinEnableMenuItem(ad->hwndPopup, IDM_FINDFIRST,
2446 (rc == 0 && ad->numlines != 0 && ad->markedlines));
2447 WinEnableMenuItem(ad->hwndPopup, IDM_FINDNEXT,
2448 (rc == 0 && ad->numlines != 0 && ad->markedlines
2449 && ad->found));
2450 WinEnableMenuItem(ad->hwndPopup, IDM_FINDPREV,
2451 (rc == 0 && ad->numlines != 0 && ad->markedlines
2452 && ad->found));
2453 WinEnableMenuItem(ad->hwndPopup, IDM_GOTOLINE,
2454 (rc == 0 && ad->numlines != 0));
2455 WinEnableMenuItem(ad->hwndPopup, IDM_GOTOOFFSET,
2456 (rc == 0 && ad->textsize != 0));
[191]2457 if (!rc)
[551]2458 DosReleaseMutexSem(ad->ScanSem);
2459 PopupMenu(hwnd, hwnd, ad->hwndPopup);
[2]2460 }
[191]2461 }
2462 break;
[2]2463
[191]2464 case UM_SETUP3:
[551]2465 if (ad && !ad->busy &&
2466 !DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN)) {
2467 ad->multiplier = ad->numlines / 32767;
2468 if (ad->multiplier * 32767 != ad->numlines)
2469 ad->multiplier++;
2470 if (!ad->multiplier)
2471 ad->multiplier++;
[191]2472 {
2473 RECTL Rectl;
2474 ULONG numlines;
[2]2475
[191]2476 WinQueryWindowRect(hwnd, &Rectl);
2477 numlines = NumLines(&Rectl, ad);
[551]2478 if (numlines) {
2479 WinSendMsg(ad->hhscroll, SBM_SETTHUMBSIZE,
2480 MPFROM2SHORT((SHORT) Rectl.xRight, (SHORT) ad->maxx),
[191]2481 MPVOID);
[551]2482 WinSendMsg(ad->hvscroll, SBM_SETTHUMBSIZE,
[191]2483 MPFROM2SHORT((SHORT) numlines,
[551]2484 (SHORT) min(ad->numlines, 32767)), MPVOID);
2485 if (ad->multiplier)
2486 WinSendMsg(ad->hvscroll, SBM_SETSCROLLBAR,
2487 MPFROMSHORT((SHORT) (ad->topline / ad->multiplier)),
2488 MPFROM2SHORT(1, (SHORT) ((ad->numlines + 1) /
2489 ad->multiplier) - numlines));
2490 WinSendMsg(ad->hhscroll, SBM_SETSCROLLBAR,
2491 MPFROMSHORT((SHORT) abs(ad->horzscroll)),
2492 MPFROM2SHORT(0, (SHORT) (ad->maxx - Rectl.xRight)));
2493 if (ad->numlines - ad->topline < numlines) {
2494 ad->topline = ((ad->numlines - ad->topline) - numlines);
[191]2495 WinInvalidateRect(hwnd, NULL, FALSE);
2496 }
2497 }
[2]2498 }
[551]2499 DosReleaseMutexSem(ad->ScanSem);
[191]2500 }
2501 return 0;
[2]2502
[191]2503 case UM_SETUP4:
[551]2504 if (ad && !ad->busy &&
2505 !DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN)) {
[2]2506
[191]2507 CHAR s[140], t[34];
2508 ULONG numlines;
2509 RECTL Rectl;
[2]2510
[191]2511 WinQueryWindowRect(hwnd, &Rectl);
2512 numlines = NumLines(&Rectl, ad);
[551]2513 commafmt(t, sizeof(t), ad->cursored);
[191]2514 strcpy(s, GetPString(IDS_LINECOLONTEXT));
2515 strcat(s, t);
[551]2516 if (ad->selected) {
2517 if (ad->selected > ad->numlines)
2518 ad->selected = 0;
2519 else {
2520 commafmt(t, sizeof(t), ad->selected);
[191]2521 strcat(s, " (");
2522 strcat(s, t);
2523 strcat(s, GetPString(IDS_SELECTEDPARENTEXT));
2524 }
[2]2525 }
[551]2526 if (ad->found) {
2527 if (ad->found > ad->numlines)
2528 ad->found = 0;
2529 else {
2530 commafmt(t, sizeof(t), ad->found);
[191]2531 strcat(s, " (");
2532 strcat(s, t);
2533 strcat(s, GetPString(IDS_FOUNDPARENTEXT));
2534 }
2535 }
[551]2536 WinSetWindowText(ad->hwndStatus2, s);
2537 if (!ad->hex && ad->lines)
2538 commafmt(t, sizeof(t), ad->lines[ad->cursored - 1] - ad->text);
[191]2539 else
[551]2540 commafmt(t, sizeof(t), (ad->cursored - 1) * 16);
[191]2541 strcpy(s, GetPString(IDS_OFFSETCOLONTEXT));
2542 strcat(s, t);
[551]2543 WinSetWindowText(ad->hwndStatus3, s);
2544 if (ad->multiplier)
2545 WinSendMsg(ad->hvscroll, SBM_SETSCROLLBAR,
2546 MPFROMSHORT((SHORT) (ad->topline / ad->multiplier)),
2547 MPFROM2SHORT(1, (SHORT) ((ad->numlines + 1) /
2548 ad->multiplier) - numlines));
2549 WinSendMsg(ad->hhscroll, SBM_SETSCROLLBAR,
2550 MPFROMSHORT((SHORT) abs(ad->horzscroll)),
2551 MPFROM2SHORT(0, (SHORT) (ad->maxx - Rectl.xRight)));
2552 DosReleaseMutexSem(ad->ScanSem);
[191]2553 }
2554 return 0;
[2]2555
[191]2556 case UM_CONTAINER_FILLED:
[551]2557 if (ad && !ad->busy &&
2558 !DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN)) {
2559 ad->stopflag = 0;
2560 ad->topline = 1;
2561 ad->cursored = 1;
2562 ad->multiplier = 1;
[191]2563 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
2564 WinEnableWindow(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
[551]2565 IDM_NEXTBLANKLINE), !ad->hex);
[191]2566 WinEnableWindow(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
[551]2567 IDM_PREVBLANKLINE), !ad->hex);
2568 if (!ad->numlines) {
2569 if (!ad->text)
2570 Runtime_Error(pszSrcFile, __LINE__, "no data");
[191]2571 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
2572 }
[551]2573 else {
2574 if (mp1 && (ULONG) mp1 < ad->numlines + 1) {
[2]2575
[191]2576 RECTL Rectl;
2577 ULONG numlines;
[2]2578
[191]2579 WinQueryWindowRect(hwnd, &Rectl);
2580 numlines = NumLines(&Rectl, ad);
[551]2581 if (numlines) {
2582 ad->topline = (ULONG) mp1;
2583 if (ad->numlines - ad->topline < numlines)
2584 ad->topline = ad->numlines - numlines;
2585 ad->cursored = (ULONG) mp1;
2586 if (mp2) {
2587 ad->cursored = (ULONG) mp2;
2588 if (ad->cursored > (ad->topline - 1) + numlines)
2589 ad->cursored = (ad->topline - 1) + numlines;
[191]2590 }
2591 }
2592 }
2593 WinSendMsg(hwnd, UM_SETUP3, MPVOID, MPVOID);
2594 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
2595 WinInvalidateRect(hwnd, NULL, FALSE);
[2]2596 }
[551]2597 DosReleaseMutexSem(ad->ScanSem);
[191]2598 }
2599 else if (ad)
[551]2600 ad->needrefreshing = TRUE;
[191]2601 return 0;
[2]2602
[191]2603 case WM_ERASEBACKGROUND:
2604 WinFillRect((HPS) mp1, (PRECTL) mp2,
[551]2605 standardcolors[ad->colors[COLORS_NORMALBACK]]);
[191]2606 return 0;
[2]2607
[191]2608 case WM_PAINT:
[551]2609 if (ad) {
[2]2610
[191]2611 HPS hpsp;
2612 RECTL Rectl;
2613 register ULONG x;
[551]2614 ULONG numlines, wascursored = ad->cursored;
[2]2615
[551]2616 hpsp = WinBeginPaint(hwnd, ad->hps, &Rectl);
[191]2617 WinFillRect(hpsp, &Rectl,
[551]2618 standardcolors[ad->colors[COLORS_NORMALBACK]]);
2619 if (!ad->stopflag && !ad->busy &&
2620 !DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN)) {
[191]2621 WinQueryWindowRect(hwnd, &Rectl);
2622 numlines = NumLines(&Rectl, ad);
[551]2623 if (numlines) {
2624 if (ad->numlines && (ad->lines || ad->hex)) {
2625 if (ad->topline > (ad->numlines + 1) - numlines)
2626 ad->topline = (ad->numlines + 1) - numlines;
2627 if (ad->topline > ad->numlines)
2628 ad->topline = 1;
2629 if (!ad->topline)
2630 ad->topline = 1;
2631 if (ad->cursored < ad->topline)
2632 ad->cursored = ad->topline;
2633 else if (ad->cursored > (ad->topline + numlines) - 1)
2634 ad->cursored = (ad->topline + numlines) - 1;
2635 if (ad->cursored > ad->numlines)
2636 ad->cursored = ad->numlines;
2637 if (wascursored != ad->cursored)
[191]2638 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
2639 }
2640 else
[551]2641 ad->topline = ad->cursored = 1;
2642 if (ad->numlines && (ad->lines || ad->hex)) {
2643 for (x = ad->topline - 1; x < ad->numlines; x++) {
[191]2644 if (((LONG) (Rectl.yTop -
[551]2645 (ad->lMaxHeight *
2646 (((x + 1) - ad->topline) + 1))) -
2647 ad->lMaxDescender) <= 0)
[191]2648 break;
[551]2649 PaintLine(hwnd, hpsp, x, ad->topline, &Rectl);
[191]2650 }
2651 }
2652 }
[551]2653 if (ad->multiplier)
2654 WinSendMsg(ad->hvscroll, SBM_SETSCROLLBAR,
2655 MPFROMSHORT((SHORT) (ad->topline / ad->multiplier)),
2656 MPFROM2SHORT(1, (SHORT) ((ad->numlines + 1) /
2657 ad->multiplier) - numlines));
2658 WinSendMsg(ad->hhscroll, SBM_SETSCROLLBAR,
2659 MPFROMSHORT((SHORT) abs(ad->horzscroll)),
2660 MPFROM2SHORT(0, (SHORT) (ad->maxx - Rectl.xRight)));
2661 WinSendMsg(ad->hhscroll, SBM_SETTHUMBSIZE,
2662 MPFROM2SHORT((SHORT) Rectl.xRight, (SHORT) ad->maxx),
[191]2663 MPVOID);
[551]2664 DosReleaseMutexSem(ad->ScanSem);
2665 ad->needrefreshing = FALSE;
[2]2666 }
[191]2667 else
[551]2668 ad->needrefreshing = TRUE;
[191]2669 WinEndPaint(hpsp);
2670 }
[551]2671 else {
[2]2672
[191]2673 HPS hpsp;
[2]2674
[191]2675 hpsp = WinBeginPaint(hwnd, (HPS) 0, NULL);
2676 WinEndPaint(hpsp);
2677 }
2678 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
2679 break;
[2]2680
[191]2681 case WM_HSCROLL:
2682 {
2683 RECTL rectl;
2684 BOOL invalidate = TRUE;
2685
2686 WinQueryWindowRect(hwnd, &rectl);
[551]2687 switch (SHORT2FROMMP(mp2)) {
[191]2688 case SB_PAGERIGHT:
[551]2689 if (abs(ad->horzscroll) <= ad->maxx - rectl.xRight) {
2690 ad->horzscroll -= rectl.xRight;
2691 if (abs(ad->horzscroll) > ad->maxx - rectl.xRight)
2692 ad->horzscroll = -((ad->maxx - rectl.xRight) +
2693 ad->fattrs.lAveCharWidth);
[191]2694 }
2695 else
2696 invalidate = FALSE;
2697 break;
[2]2698
[191]2699 case SB_PAGELEFT:
[551]2700 if (ad->horzscroll < 0) {
2701 ad->horzscroll += rectl.xRight;
2702 if (ad->horzscroll > 0)
2703 ad->horzscroll = 0;
[191]2704 }
2705 else
2706 invalidate = FALSE;
2707 break;
[2]2708
[191]2709 case SB_LINERIGHT:
[551]2710 if (abs(ad->horzscroll) <= ad->maxx - rectl.xRight)
2711 ad->horzscroll -= ad->fattrs.lAveCharWidth;
[191]2712 else
2713 invalidate = FALSE;
2714 break;
[2]2715
[191]2716 case SB_LINELEFT:
[551]2717 if (ad->horzscroll < 0)
2718 ad->horzscroll += ad->fattrs.lAveCharWidth;
[191]2719 else
2720 invalidate = FALSE;
2721 break;
[2]2722
[191]2723 case SB_SLIDERTRACK:
[551]2724 ad->horzscroll = (SHORT1FROMMP(mp2) / ad->fattrs.lAveCharWidth) *
2725 ad->fattrs.lAveCharWidth;
2726 ad->horzscroll = -(ad->horzscroll);
2727 if (ad->horzscroll > 0)
2728 ad->horzscroll = 0;
2729 if (abs(ad->horzscroll) > (ad->maxx - rectl.xRight) +
2730 ad->fattrs.lAveCharWidth)
2731 ad->horzscroll = -(ad->maxx - rectl.xRight);
[191]2732 break;
[2]2733
[191]2734 default:
2735 invalidate = FALSE;
2736 break;
[2]2737 }
[191]2738 if (invalidate)
2739 WinInvalidateRect(hwnd, NULL, FALSE);
2740 }
2741 break;
[2]2742
[191]2743 case WM_VSCROLL:
[551]2744 if (ad && !ad->stopflag && ad->text && ad->numlines && !ad->busy &&
2745 !DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN)) {
[2]2746
[191]2747 ULONG numlines, wascursored;
2748 RECTL rcl;
[2]2749
[191]2750 WinQueryWindowRect(hwnd, &rcl);
2751 numlines = NumLines(&rcl, ad);
[551]2752 if (numlines) {
2753 wascursored = ad->cursored;
2754 switch (SHORT2FROMMP(mp2)) {
[191]2755 case SB_PAGEUP:
[551]2756 if (ad->topline > 1) {
2757 ad->topline -= numlines;
2758 if (ad->topline > ad->numlines ||
2759 ad->topline + numlines > (ad->numlines + 1))
2760 ad->topline = 1;
2761 if (ad->cursored > ad->topline + numlines)
2762 ad->cursored = ad->topline + numlines;
2763 if (ad->cursored > ad->numlines)
2764 ad->cursored = ad->numlines;
[191]2765 WinInvalidateRect(hwnd, NULL, FALSE);
2766 }
2767 break;
2768 case SB_PAGEDOWN:
[551]2769 if (ad->topline + numlines <= ad->numlines) {
2770 ad->topline += numlines;
2771 if (ad->topline + numlines > ad->numlines + 1)
2772 ad->topline = (ad->numlines + 1) - numlines;
2773 if (ad->cursored < ad->topline)
2774 ad->cursored = ad->topline;
2775 if (ad->cursored + 1 > ad->topline + numlines)
2776 ad->cursored = (ad->topline + numlines) - 1;
2777 if (ad->cursored > ad->numlines)
2778 ad->cursored = ad->numlines;
[191]2779 WinInvalidateRect(hwnd, NULL, FALSE);
2780 }
2781 break;
2782 case SB_LINEDOWN:
[551]2783 if (ad->topline + numlines <= ad->numlines) {
[2]2784
[191]2785 RECTL Rectl, iRectl;
[2]2786
[551]2787 ad->topline++;
2788 if (ad->cursored < ad->topline)
2789 ad->cursored = ad->topline;
2790 else if (ad->cursored + 1 > ad->topline + numlines)
2791 ad->cursored = (ad->topline + numlines) - 1;
2792 if (ad->cursored > ad->numlines)
2793 ad->cursored = ad->numlines;
[191]2794 WinQueryWindowRect(hwnd, &Rectl);
[551]2795 WinScrollWindow(hwnd, 0, ad->lMaxHeight,
[191]2796 NULL, NULL, NULLHANDLE, &iRectl, 0);
[551]2797 WinFillRect(ad->hps, &iRectl,
2798 standardcolors[ad->colors[COLORS_NORMALBACK]]);
2799 PaintLine(hwnd, ad->hps, (ad->topline + numlines) - 2,
2800 ad->topline, &Rectl);
2801 if (ad->cursored != ad->topline + numlines)
2802 PaintLine(hwnd, ad->hps, ad->cursored - 1, ad->topline, &Rectl);
2803 if (wascursored != ad->cursored &&
2804 wascursored < ad->topline + numlines &&
2805 wascursored >= ad->topline)
2806 PaintLine(hwnd, ad->hps, wascursored - 1, ad->topline, &Rectl);
2807 if (numlines >= ad->numlines)
[191]2808 numlines = 0;
[551]2809 if (ad->multiplier)
2810 WinSendMsg(ad->hvscroll, SBM_SETSCROLLBAR,
2811 MPFROMSHORT((SHORT) (ad->topline / ad->multiplier)),
2812 MPFROM2SHORT(1, (SHORT) ((ad->numlines + 1) /
2813 ad->multiplier) -
[191]2814 numlines));
[551]2815 WinSendMsg(ad->hhscroll, SBM_SETSCROLLBAR,
2816 MPFROMSHORT((SHORT) abs(ad->horzscroll)),
2817 MPFROM2SHORT(0, (SHORT) (ad->maxx - Rectl.xRight)));
[191]2818 }
2819 break;
2820 case SB_LINEUP:
[551]2821 if (ad->topline > 1) {
[2]2822
[191]2823 RECTL Rectl, iRectl;
[2]2824
[551]2825 ad->topline--;
2826 if (ad->cursored < ad->topline)
2827 ad->cursored = ad->topline;
2828 else if (ad->cursored + 1 > ad->topline + numlines)
2829 ad->cursored = (ad->topline + numlines) - 1;
2830 if (ad->cursored > ad->numlines)
2831 ad->cursored = ad->numlines;
[191]2832 WinQueryWindowRect(hwnd, &Rectl);
[551]2833 WinScrollWindow(hwnd, 0, -ad->lMaxHeight,
[191]2834 NULL, NULL, NULLHANDLE, &iRectl, 0);
[551]2835 WinFillRect(ad->hps, &iRectl,
2836 standardcolors[ad->colors[COLORS_NORMALBACK]]);
[191]2837 iRectl = Rectl;
[551]2838 iRectl.yTop -= ((numlines * ad->lMaxHeight) + ad->lMaxDescender);
2839 WinFillRect(ad->hps, &iRectl,
2840 standardcolors[ad->colors[COLORS_NORMALBACK]]);
2841 PaintLine(hwnd, ad->hps, ad->topline - 1, ad->topline, &Rectl);
2842 if (ad->cursored != ad->topline)
2843 PaintLine(hwnd, ad->hps, ad->cursored - 1, ad->topline, &Rectl);
2844 if (ad->cursored != wascursored &&
2845 wascursored >= ad->topline &&
2846 wascursored < ad->topline + numlines)
2847 PaintLine(hwnd, ad->hps, wascursored - 1, ad->topline, &Rectl);
2848 if (numlines >= ad->numlines)
[191]2849 numlines = 0;
[551]2850 if (ad->multiplier)
2851 WinSendMsg(ad->hvscroll, SBM_SETSCROLLBAR,
2852 MPFROMSHORT((SHORT) (ad->topline / ad->multiplier)),
2853 MPFROM2SHORT(1, (SHORT) ((ad->numlines + 1) /
2854 ad->multiplier) -
[191]2855 numlines));
[551]2856 WinSendMsg(ad->hhscroll, SBM_SETSCROLLBAR,
2857 MPFROMSHORT((SHORT) abs(ad->horzscroll)),
2858 MPFROM2SHORT(0, (SHORT) (ad->maxx - Rectl.xRight)));
[191]2859 }
2860 break;
2861 case SB_SLIDERTRACK:
[551]2862 if ((SHORT1FROMMP(mp2) >= 1) || (SHORT1FROMMP(mp2)) <= ad->numlines) {
2863 ad->topline = (ULONG) SHORT1FROMMP(mp2) * ad->multiplier;
2864 if (ad->topline + numlines > ad->numlines + 1)
2865 ad->topline = (ad->numlines + 1) - numlines;
2866 if (!ad->topline)
2867 ad->topline = 1;
2868 if (ad->cursored < ad->topline)
2869 ad->cursored = ad->topline;
2870 else if (ad->cursored > ad->topline + numlines)
2871 ad->cursored = ad->topline + numlines;
2872 if (ad->cursored > ad->numlines)
2873 ad->cursored = ad->numlines;
[191]2874 WinInvalidateRect(hwnd, NULL, FALSE);
2875 }
2876 else
2877 WinAlarm(HWND_DESKTOP, WA_NOTE);
2878 break;
2879 }
[551]2880 if (ad->cursored != wascursored)
[191]2881 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
[2]2882 }
[551]2883 DosReleaseMutexSem(ad->ScanSem);
[191]2884 }
2885 break;
[2]2886
[191]2887 case WM_INITMENU:
[551]2888 switch (SHORT1FROMMP(mp1)) {
[191]2889 case IDM_FILESMENU:
2890 {
2891 APIRET rc;
2892 SHORT sSelect;
[2]2893
[551]2894 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
2895 WinEnableMenuItem((HWND) mp2, IDM_SAVETOCLIP, (rc == 0 &&
2896 ad->selected != 0));
2897 WinEnableMenuItem((HWND) mp2, IDM_APPENDTOCLIP, (rc == 0 &&
2898 ad->selected != 0));
2899 WinEnableMenuItem((HWND) mp2, IDM_SAVETOLIST, (rc == 0 &&
2900 ad->selected != 0));
2901 sSelect = (SHORT) WinSendDlgItemMsg(ad->hwndFrame, NEWVIEW_LISTBOX,
2902 LM_QUERYITEMCOUNT, MPVOID,
2903 MPVOID);
2904 WinEnableMenuItem((HWND) mp2, IDM_SAVETOCLIP2,
2905 (rc == 0 && sSelect > 0));
2906 WinEnableMenuItem((HWND) mp2, IDM_APPENDTOCLIP2,
2907 (rc == 0 && sSelect > 0));
2908 WinEnableMenuItem((HWND) mp2, IDM_SAVETOLIST2,
2909 (rc == 0 && sSelect > 0));
[191]2910 if (!rc)
[551]2911 DosReleaseMutexSem(ad->ScanSem);
[191]2912 }
2913 break;
[2]2914
[191]2915 case IDM_VIEWSMENU:
2916 {
2917 APIRET rc;
[2]2918
[551]2919 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
2920 WinEnableMenuItem((HWND) mp2, IDM_FONTPALETTE, (rc == 0));
2921 WinEnableMenuItem((HWND) mp2, IDM_HEXMODE, (rc == 0));
2922 WinEnableMenuItem((HWND) mp2, IDM_WRAP, (rc == 0));
2923 WinEnableMenuItem((HWND) mp2, IDM_CODEPAGE, (rc == 0));
[191]2924 if (!rc)
[551]2925 DosReleaseMutexSem(ad->ScanSem);
[191]2926 }
[551]2927 WinCheckMenuItem((HWND) mp2, IDM_HEXMODE, ad->hex);
2928 WinCheckMenuItem((HWND) mp2, IDM_WRAP, ad->wrapon);
2929 WinCheckMenuItem((HWND) mp2, IDM_IGNOREFTP, ad->ignoreftp);
2930 WinCheckMenuItem((HWND) mp2, IDM_IGNOREHTTP, ad->ignorehttp);
[191]2931 break;
[2]2932
[191]2933 case IDM_SEARCHMENU:
2934 {
2935 APIRET rc;
[2]2936
[551]2937 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
2938 WinEnableMenuItem((HWND) mp2, IDM_FINDFIRST, (rc == 0 &&
2939 ad->numlines != 0 &&
2940 ad->markedlines));
2941 WinEnableMenuItem((HWND) mp2, IDM_FINDNEXT, (rc == 0 &&
2942 ad->numlines != 0 &&
2943 ad->markedlines &&
2944 ad->found != 0));
2945 WinEnableMenuItem((HWND) mp2, IDM_FINDPREV, (rc == 0 &&
2946 ad->numlines != 0 &&
2947 ad->markedlines &&
2948 ad->found != 0));
2949 WinEnableMenuItem((HWND) mp2, IDM_NEXTBLANKLINE, (rc == 0 &&
2950 ad->numlines != 0 &&
2951 !ad->hex));
2952 WinEnableMenuItem((HWND) mp2, IDM_PREVBLANKLINE, (rc == 0 &&
2953 ad->numlines != 0 &&
2954 !ad->hex));
2955 WinEnableMenuItem((HWND) mp2, IDM_GOTOLINE, (rc == 0 &&
2956 ad->numlines != 0));
2957 WinEnableMenuItem((HWND) mp2, IDM_GOTOOFFSET, (rc == 0 &&
2958 ad->textsize != 0));
[191]2959 if (!rc)
[551]2960 DosReleaseMutexSem(ad->ScanSem);
[191]2961 }
2962 break;
[2]2963
[191]2964 case IDM_SELECTSUBMENU:
2965 {
2966 APIRET rc;
[2]2967
[551]2968 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
2969 WinEnableMenuItem((HWND) mp2, IDM_SELECTALL, (rc == 0 &&
2970 ad->numlines != 0 &&
2971 ad->markedlines &&
2972 (ad->selected !=
2973 ad->numlines ||
2974 !ad->selected)));
2975 WinEnableMenuItem((HWND) mp2, IDM_DESELECTALL, (rc == 0 &&
2976 ad->numlines != 0 &&
2977 ad->markedlines &&
2978 ad->selected != 0));
2979 WinEnableMenuItem((HWND) mp2, IDM_DESELECTFOUND, (rc == 0 &&
2980 ad->numlines != 0 &&
2981 ad->markedlines &&
2982 ad->selected != 0 &&
2983 ad->found != 0));
2984 WinEnableMenuItem((HWND) mp2, IDM_SELECTFOUND, (rc == 0 &&
2985 ad->numlines != 0 &&
2986 ad->markedlines &&
2987 ad->found != 0 &&
2988 (ad->numlines !=
2989 ad->selected ||
2990 !ad->selected)));
2991 WinEnableMenuItem((HWND) mp2, IDM_NEXTSELECTED, (rc == 0 &&
2992 ad->numlines != 0 &&
2993 ad->markedlines &&
2994 ad->selected != 0));
2995 WinEnableMenuItem((HWND) mp2, IDM_PREVSELECTED, (rc == 0 &&
2996 ad->numlines != 0 &&
2997 ad->markedlines &&
2998 ad->selected != 0));
2999 WinEnableMenuItem((HWND) mp2, IDM_INVERT, (rc == 0 &&
3000 ad->numlines != 0 &&
3001 ad->markedlines));
[191]3002 if (!rc)
[551]3003 DosReleaseMutexSem(ad->ScanSem);
[2]3004 }
3005 break;
[191]3006 }
3007 break;
[2]3008
[191]3009 case UM_CONTROL:
[551]3010 switch (SHORT1FROMMP(mp1)) {
[191]3011 case NEWVIEW_LISTBOX:
[551]3012 switch (SHORT2FROMMP(mp1)) {
[191]3013 case LN_SETFOCUS:
[551]3014 if (ad) {
3015 if (!ad->clientfocused) {
[191]3016 PostMsg(hwnd,
[551]3017 WM_COMMAND, MPFROM2SHORT(IDM_NEXTWINDOW, 0), MPVOID);
[191]3018 break;
3019 }
[551]3020 ad->clientfocused = FALSE;
[191]3021 }
3022 PostMsg(hwnd,
[551]3023 UM_CONTROL, MPFROM2SHORT(NEWVIEW_LISTBOX, LN_SELECT), MPVOID);
[191]3024 break;
3025 case LN_KILLFOCUS:
[551]3026 if (ad) {
3027 ad->clientfocused = TRUE;
[191]3028 WinSetFocus(HWND_DESKTOP, hwnd);
3029 }
3030 break;
3031 case LN_SELECT:
[551]3032 if (ad && !ad->dummy) {
[2]3033
[191]3034 ULONG linenum, numlines;
3035 SHORT sSelect;
[551]3036 HWND hwndUL = WinWindowFromID(ad->hwndFrame,
[191]3037 SHORT1FROMMP(mp1));
3038 RECTL Rectl;
[2]3039
[191]3040 sSelect = (SHORT) WinSendMsg(hwndUL,
3041 LM_QUERYSELECTION,
[551]3042 MPFROM2SHORT(LIT_FIRST, 0), MPVOID);
3043 if (sSelect >= 0) {
[191]3044 linenum = (ULONG) WinSendMsg(hwndUL,
3045 LM_QUERYITEMHANDLE,
[551]3046 MPFROM2SHORT(sSelect, 0), MPVOID);
3047 if (ad->topline != linenum + 1 && linenum < ad->numlines) {
[191]3048 WinQueryWindowRect(hwnd, &Rectl);
3049 numlines = NumLines(&Rectl, ad);
[551]3050 ad->topline = linenum + 1;
3051 if (ad->numlines - ad->topline < numlines)
3052 ad->topline = ad->numlines - numlines;
3053 ad->cursored = linenum + 1;
[191]3054 WinInvalidateRect(hwnd, NULL, FALSE);
3055 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
3056 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
3057 }
3058 }
3059 else
3060 PostMsg(hwndUL, LM_SELECTITEM, MPFROM2SHORT(0, 0),
3061 MPFROM2SHORT(TRUE, 0));
3062 }
3063 break;
[2]3064
[191]3065 case LN_ENTER:
[551]3066 if (ad) {
[2]3067
[191]3068 SHORT sSelect;
[551]3069 HWND hwndUL = WinWindowFromID(ad->hwndFrame,
[191]3070 SHORT1FROMMP(mp1));
[2]3071
[191]3072 sSelect = (SHORT) WinSendMsg(hwndUL,
3073 LM_QUERYSELECTION,
[551]3074 MPFROM2SHORT(LIT_FIRST, 0), MPVOID);
3075 if (sSelect >= 0) {
3076 ad->dummy = TRUE;
[191]3077 WinSendMsg(hwndUL, LM_DELETEITEM,
3078 MPFROM2SHORT(sSelect, 0), MPVOID);
[551]3079 ad->dummy = FALSE;
[191]3080 sSelect = (SHORT) WinSendMsg(hwndUL,
[551]3081 LM_QUERYITEMCOUNT, MPVOID, MPVOID);
3082 if (sSelect <= 0) {
3083 PostMsg(ad->hwndFrame, WM_UPDATEFRAME,
[191]3084 MPFROMLONG(FCF_SIZEBORDER), MPVOID);
3085 WinSetFocus(HWND_DESKTOP, hwnd);
3086 }
3087 }
3088 }
3089 break;
[2]3090
[191]3091 default:
3092 break;
[2]3093 }
[191]3094 break;
[2]3095
[191]3096 default:
3097 break;
3098 }
3099 return 0;
[2]3100
[191]3101 case WM_COMMAND:
[551]3102 switch (SHORT1FROMMP(mp1)) {
[191]3103 case IDM_EDIT:
[551]3104 if (*editor) {
[2]3105
[191]3106 CHAR *dummy[2];
[2]3107
[551]3108 dummy[0] = ad->filename;
[191]3109 dummy[1] = NULL;
3110 ExecOnList(hwnd, editor, WINDOWED | SEPARATE, NULL, dummy, NULL);
3111 }
3112 else
[551]3113 StartMLEEditor(ad->hwndParent, 4, ad->filename, ad->hwndFrame);
3114 ad->hwndRestore = (HWND) 0;
[191]3115 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
3116 break;
[2]3117
[191]3118 case IDM_IGNOREFTP:
[551]3119 ad->ignoreftp = (ad->ignoreftp) ? FALSE : TRUE;
3120 ad->ftpin = FALSE;
3121 if (ad->text && *ftprun && !ad->ignoreftp && strstr(ad->text, "ftp://"))
3122 ad->ftpin = TRUE;
3123 IgnoreFTP = ad->ignoreftp;
[191]3124 PrfWriteProfileData(fmprof, appname, "Viewer.IgnoreFTP",
[551]3125 &ad->ignoreftp, sizeof(BOOL));
[191]3126 WinInvalidateRect(hwnd, NULL, FALSE);
3127 break;
[2]3128
[191]3129 case IDM_IGNOREHTTP:
[551]3130 ad->ignorehttp = (ad->ignorehttp) ? FALSE : TRUE;
3131 ad->httpin = FALSE;
3132 if (ad->text && *httprun && !ad->ignorehttp &&
3133 strstr(ad->text, "http://"))
3134 ad->httpin = TRUE;
3135 IgnoreHTTP = ad->ignorehttp;
[191]3136 PrfWriteProfileData(fmprof, appname, "Viewer.IgnoreHTTP",
[551]3137 &ad->ignorehttp, sizeof(BOOL));
[191]3138 WinInvalidateRect(hwnd, NULL, FALSE);
3139 break;
[2]3140
[191]3141 case IDM_PREVBLANKLINE:
[551]3142 if (!ad->hex && ad->lines) {
[2]3143
[191]3144 ULONG x;
[2]3145
[551]3146 x = ad->cursored - 2;
3147 if (x >= ad->numlines)
[191]3148 x = 0;
[551]3149 while (x < ad->numlines &&
3150 (*ad->lines[x] == '\r' || *ad->lines[x] == '\n'))
[191]3151 x--;
[551]3152 if (x >= ad->numlines)
[191]3153 x = 0;
[551]3154 for (; x < ad->numlines; x--) {
3155 if (*ad->lines[x] == '\r' || *ad->lines[x] == '\n') {
3156 if (x < ad->numlines - 1)
[191]3157 x++;
3158 break;
3159 }
3160 }
[551]3161 if (x < ad->numlines) {
3162 ad->topline = ad->cursored = x;
[191]3163 WinInvalidateRect(hwnd, NULL, FALSE);
3164 }
3165 }
3166 break;
[2]3167
[191]3168 case IDM_NEXTBLANKLINE:
[551]3169 if (!ad->hex && ad->lines) {
[2]3170
[191]3171 ULONG x;
[2]3172
[551]3173 x = ad->cursored;
3174 while (x < ad->numlines &&
3175 (*ad->lines[x] == '\r' || *ad->lines[x] == '\n'))
[191]3176 x++;
[551]3177 for (; x < ad->numlines; x++) {
3178 if (*ad->lines[x] == '\r' || *ad->lines[x] == '\n') {
3179 if (x < ad->numlines - 1)
[191]3180 x++;
3181 break;
3182 }
3183 }
[551]3184 if (x < ad->numlines) {
3185 while (x < ad->numlines &&
3186 (*ad->lines[x] == '\r' || *ad->lines[x] == '\n'))
[191]3187 x++;
[551]3188 if (x < ad->numlines) {
3189 ad->topline = ad->cursored = x;
[191]3190 WinInvalidateRect(hwnd, NULL, FALSE);
3191 }
3192 }
3193 }
3194 break;
[2]3195
[191]3196 case IDM_VIEW:
3197 case IDM_OBJECT:
[551]3198 if (!ad->hex && ad->lines) {
[2]3199
[191]3200 CHAR line[CCHMAXPATH], filename[CCHMAXPATH], *p;
[2]3201
[551]3202 strncpy(line, ad->lines[ad->cursored - 1], CCHMAXPATH);
[191]3203 line[CCHMAXPATH - 1] = 0;
[368]3204 chop_at_crnl(line);
[551]3205 if (*line == '\"') {
[191]3206 memmove(line, line + 1, strlen(line));
3207 p = strchr(line, '\"');
3208 lstrip(line);
3209 if (p)
3210 *p = 0;
3211 rstrip(line);
3212 }
[551]3213 else {
[191]3214 lstrip(line);
3215 p = strchr(line, ' ');
3216 if (p)
3217 *p = 0;
3218 rstrip(line);
3219 }
[551]3220 if (!strchr(line, '\\') && !strchr(line, '/') && !strchr(line, ':')) {
3221 strcpy(filename, ad->filename);
[191]3222 p = strrchr(filename, '\\');
3223 if (p)
3224 p++;
3225 else
3226 p = filename;
3227 strcpy(p, line);
3228 }
3229 else
3230 strcpy(filename, line);
3231 MakeFullName(filename);
[551]3232 if (*filename && IsFile(filename) == 1) {
[191]3233 if (SHORT1FROMMP(mp1) == IDM_OBJECT)
[551]3234 OpenObject(filename, Default, ad->hwndFrame);
[191]3235 else
[551]3236 DefaultView(hwnd, ad->hwndFrame, HWND_DESKTOP, NULL, 0, filename);
[191]3237 }
3238 }
3239 break;
[2]3240
[191]3241 case IDM_COLORPALETTE:
3242 {
3243 COLORS co;
3244 LONG temp[COLORS_MAX];
[2]3245
[191]3246 memset(&co, 0, sizeof(co));
3247 co.size = sizeof(co);
3248 co.numcolors = COLORS_MAX;
[551]3249 co.colors = ad->colors;
[191]3250 co.descriptions = IDS_NVCOLORS1TEXT;
3251 co.origs = temp;
3252 co.prompt = IDS_NVCOLORSPROMPTTEXT;
[551]3253 memcpy(temp, ad->colors, sizeof(LONG) * COLORS_MAX);
[191]3254 if (WinDlgBox(HWND_DESKTOP,
3255 hwnd,
3256 ColorDlgProc,
[551]3257 FM3ModHandle, COLOR_FRAME, (PVOID) & co)) {
3258 memcpy(Colors, ad->colors, sizeof(LONG) * COLORS_MAX);
[191]3259 PrfWriteProfileData(fmprof,
3260 appname,
3261 "Viewer.Colors",
[551]3262 &ad->colors, sizeof(LONG) * COLORS_MAX);
3263 WinInvalidateRect(hwnd, NULL, FALSE);
3264 WinInvalidateRect(ad->hwndStatus1, NULL, FALSE);
3265 WinInvalidateRect(ad->hwndStatus2, NULL, FALSE);
3266 WinInvalidateRect(ad->hwndStatus3, NULL, FALSE);
[191]3267 }
3268 }
3269 break;
[2]3270
[191]3271 case IDM_NEXTWINDOW:
3272 case IDM_PREVWINDOW:
3273 {
3274 SHORT sSelect;
[2]3275
[551]3276 sSelect = (SHORT) WinSendDlgItemMsg(ad->hwndFrame,
[191]3277 NEWVIEW_LISTBOX,
3278 LM_QUERYITEMCOUNT,
[551]3279 MPVOID, MPVOID);
3280 if (sSelect) {
3281 if (!ad->clientfocused)
[191]3282 WinSetFocus(HWND_DESKTOP, hwnd);
3283 else
3284 WinSetFocus(HWND_DESKTOP,
[551]3285 WinWindowFromID(ad->hwndFrame, NEWVIEW_LISTBOX));
[191]3286 }
3287 else
3288 WinSetFocus(HWND_DESKTOP, hwnd);
3289 }
3290 break;
[2]3291
[191]3292 case IDM_FINDFIRST:
3293 {
3294 APIRET rc;
[2]3295
[551]3296 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
3297 if (!rc) {
3298 if (!ad->busy && ad->text && ad->numlines && ad->markedlines) {
[2]3299
[191]3300 ULONG numlines;
3301 RECTL Rectl;
3302 static char test[SEARCHSTRINGLEN];
[2]3303
[191]3304 WinQueryWindowRect(hwnd, &Rectl);
3305 numlines = NumLines(&Rectl, ad);
3306 if (!numlines)
3307 break;
[551]3308 strcpy(test, ad->searchtext);
[191]3309 if (WinDlgBox(HWND_DESKTOP, hwnd, FindStrDlgProc, FM3ModHandle,
[551]3310 NEWFIND_FRAME, (PVOID) & hwnd)) {
3311 if (*ad->searchtext && strcmp(test, ad->searchtext))
[191]3312 PrfWriteProfileString(fmprof,
3313 appname,
3314 "Viewer.Searchtext",
[551]3315 (PVOID) ad->searchtext);
3316 if (_beginthread(SearchThread, NULL, 524288, (PVOID) hwnd) ==
3317 -1)
3318 Runtime_Error(pszSrcFile, __LINE__,
3319 GetPString(IDS_COULDNTSTARTTHREADTEXT));
[191]3320 }
3321 }
[551]3322 DosReleaseMutexSem(ad->ScanSem);
[191]3323 }
3324 }
3325 break;
[2]3326
[191]3327 case IDM_PREVSELECTED:
3328 case IDM_NEXTSELECTED:
3329 case IDM_FINDPREV:
3330 case IDM_FINDNEXT:
3331 {
3332 APIRET rc;
[2]3333
[551]3334 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
3335 if (!rc) {
3336 if (!ad->busy && ad->text && ad->markedlines) {
[2]3337
[191]3338 RECTL Rectl;
3339 register ULONG x;
3340 ULONG numlines;
3341 CHAR markedwith;
[2]3342
[191]3343 markedwith = (SHORT1FROMMP(mp1) == IDM_FINDNEXT ||
3344 SHORT1FROMMP(mp1) == IDM_FINDPREV) ?
3345 VF_FOUND : VF_SELECTED;
3346 WinQueryWindowRect(hwnd, &Rectl);
3347 numlines = NumLines(&Rectl, ad);
3348 if (!numlines)
3349 break;
3350 WinSetPointer(HWND_DESKTOP, hptrBusy);
3351 if (SHORT1FROMMP(mp1) == IDM_PREVSELECTED ||
[551]3352 SHORT1FROMMP(mp1) == IDM_FINDPREV) {
3353 for (x = ad->cursored - 2; x < ULONG_MAX - 1; x--) {
3354 if (ad->markedlines[x] & markedwith) {
3355 ad->topline = x + 1;
3356 if (ad->numlines - ad->topline < numlines)
3357 ad->topline = ad->numlines - numlines;
3358 ad->cursored = x + 1;
[191]3359 WinInvalidateRect(hwnd, NULL, FALSE);
3360 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
3361 break;
3362 }
3363 }
3364 }
[551]3365 else {
3366 for (x = ad->cursored; x < ad->numlines; x++) {
3367 if (ad->markedlines[x] & markedwith) {
3368 ad->topline = x + 1;
3369 if (ad->numlines - ad->topline < numlines)
3370 ad->topline = ad->numlines - numlines;
3371 ad->cursored = x + 1;
[191]3372 WinInvalidateRect(hwnd, NULL, FALSE);
3373 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
3374 break;
3375 }
3376 }
3377 }
3378 WinSetPointer(HWND_DESKTOP, hptrArrow);
[551]3379 if (x >= ad->numlines)
[191]3380 DosBeep(50, 100);
3381 }
[551]3382 DosReleaseMutexSem(ad->ScanSem);
[191]3383 }
3384 }
3385 break;
[2]3386
[191]3387 case IDM_SELECTFOUND:
3388 case IDM_DESELECTFOUND:
3389 {
3390 APIRET rc;
[2]3391
[551]3392 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
3393 if (!rc) {
3394 if (!ad->busy && ad->text && ad->markedlines) {
[2]3395
[191]3396 RECTL Rectl;
3397 register ULONG x;
3398 ULONG numlines;
[2]3399
[191]3400 WinQueryWindowRect(hwnd, &Rectl);
3401 numlines = NumLines(&Rectl, ad);
3402 if (!numlines)
3403 break;
3404 WinSetPointer(HWND_DESKTOP, hptrBusy);
[551]3405 for (x = 0; x < ad->numlines; x++) {
3406 if (SHORT1FROMMP(mp1) == IDM_SELECTFOUND) {
3407 if ((ad->markedlines[x] & VF_FOUND) &&
3408 !(ad->markedlines[x] & VF_SELECTED)) {
3409 ad->markedlines[x] |= VF_SELECTED;
3410 ad->selected++;
[191]3411 }
3412 }
[551]3413 else {
3414 if ((ad->markedlines[x] & VF_FOUND) &&
3415 (ad->markedlines[x] & VF_SELECTED)) {
3416 ad->markedlines[x] &= (~VF_SELECTED);
3417 ad->selected--;
[191]3418 }
3419 }
3420 }
3421 WinSendMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
3422 WinSetPointer(HWND_DESKTOP, hptrArrow);
3423 WinInvalidateRect(hwnd, NULL, FALSE);
3424 }
[551]3425 DosReleaseMutexSem(ad->ScanSem);
[191]3426 }
3427 }
3428 break;
[2]3429
[191]3430 case IDM_GOTOLINE:
3431 case IDM_GOTOOFFSET:
3432 {
3433 APIRET rc;
[2]3434
[551]3435 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
3436 if (!rc) {
3437 if (!ad->busy && ad->numlines) {
[2]3438
[191]3439 ULONG numlines, linenum;
3440 CHAR s[34], ss[134];
3441 STRINGINPARMS sip;
3442 RECTL Rectl;
3443 register ULONG x;
[2]3444
[191]3445 WinQueryWindowRect(hwnd, &Rectl);
3446 numlines = NumLines(&Rectl, ad);
3447 if (!numlines)
3448 break;
[551]3449 if (ad->numlines <= numlines) {
[191]3450 DosBeep(500, 100);
3451 break;
3452 }
3453 sip.help = (SHORT1FROMMP(mp1) == IDM_GOTOLINE) ?
[551]3454 GetPString(IDS_NVLINEJUMPTEXT) : GetPString(IDS_NVBYTEJUMPTEXT);
[191]3455 sip.ret = s;
3456 *s = 0;
3457 sip.prompt = ss;
3458 sip.inputlen = 34;
3459 sip.title = (SHORT1FROMMP(mp1) == IDM_GOTOLINE) ?
3460 GetPString(IDS_NVLINEJUMPTITLETEXT) :
3461 GetPString(IDS_NVBYTEJUMPTITLETEXT);
3462 sprintf(sip.prompt,
3463 GetPString(IDS_NVJUMPTEXT),
3464 (SHORT1FROMMP(mp1) == IDM_GOTOLINE) ?
3465 GetPString(IDS_LINETEXT) :
3466 GetPString(IDS_OFFSETTEXT),
3467 (SHORT1FROMMP(mp1) == IDM_GOTOLINE) ?
3468 1 :
3469 0,
3470 (SHORT1FROMMP(mp1) == IDM_GOTOLINE) ?
[551]3471 ad->numlines : ad->textsize - 1);
[191]3472 WinDlgBox(HWND_DESKTOP,
[551]3473 hwnd, InputDlgProc, FM3ModHandle, STR_FRAME, &sip);
3474 if (*s) {
[191]3475 s[33] = 0;
3476 linenum = atol(s);
[551]3477 switch (SHORT1FROMMP(mp1)) {
[191]3478 case IDM_GOTOLINE:
[551]3479 if (linenum > 0 && linenum <= ad->numlines) {
3480 ad->topline = linenum;
3481 ad->cursored = ad->topline;
3482 if (ad->numlines - ad->topline < numlines)
3483 ad->topline = (ad->numlines - numlines) + 1;
3484 WinInvalidateRect(hwnd, NULL, FALSE);
[191]3485 }
3486 break;
3487 case IDM_GOTOOFFSET:
[551]3488 if (linenum < ad->textsize) {
3489 if (ad->hex)
3490 ad->topline = (linenum / 16) + 1;
3491 else if (ad->lines) {
3492 ad->topline = (ULONG) - 1;
3493 for (x = 0; x < ad->numlines; x++) {
3494 if (ad->lines[x] > ad->text + linenum) {
3495 ad->topline = x + 1;
[191]3496 break;
3497 }
3498 }
[551]3499 if (ad->topline == (ULONG) - 1)
3500 ad->topline = ad->numlines;
[191]3501 }
[551]3502 ad->cursored = ad->topline;
3503 if (ad->numlines - ad->topline < numlines)
3504 ad->topline = (ad->numlines - numlines) + 1;
3505 WinInvalidateRect(hwnd, NULL, FALSE);
[191]3506 }
3507 break;
3508 }
3509 }
[551]3510 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
[191]3511 }
[551]3512 DosReleaseMutexSem(ad->ScanSem);
[191]3513 }
3514 }
3515 break;
[2]3516
[191]3517 case IDM_CODEPAGE:
3518 {
3519 INT cp;
[2]3520
[191]3521 cp = PickCodepage(hwnd);
[551]3522 if (cp != -1) {
3523 ad->fattrs.usCodePage = (USHORT) cp;
3524 Codepage = ad->fattrs.usCodePage;
[191]3525 PrfWriteProfileData(fmprof,
3526 appname,
3527 "Viewer.Codepage",
[551]3528 &ad->fattrs.usCodePage, sizeof(USHORT));
3529 GpiDeleteSetId(ad->hps, FIXED_FONT_LCID);
3530 GpiAssociate(ad->hps, 0);
3531 GpiDestroyPS(ad->hps);
3532 ad->hps = InitWindow(hwnd);
3533 WinSendMsg(hwnd, UM_SETUP3, MPVOID, MPVOID);
3534 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
3535 WinInvalidateRect(hwnd, NULL, FALSE);
[191]3536 }
3537 }
3538 break;
[2]3539
[191]3540 case IDM_SAVETOLIST2:
3541 case IDM_SAVETOCLIP2:
3542 case IDM_APPENDTOCLIP2:
3543 case IDM_SAVETOLIST:
3544 case IDM_SAVETOCLIP:
3545 case IDM_APPENDTOCLIP:
3546 {
3547 APIRET rc;
[2]3548
[551]3549 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
3550 if (!rc) {
3551 if (!ad->busy) {
3552 ad->cliptype = SHORT1FROMMP(mp1);
3553 if (_beginthread(ClipboardThread, NULL, 524288, (PVOID) hwnd) ==
3554 -1)
3555 Runtime_Error(pszSrcFile, __LINE__,
3556 GetPString(IDS_COULDNTSTARTTHREADTEXT));
[191]3557 }
[551]3558 DosReleaseMutexSem(ad->ScanSem);
[191]3559 }
3560 }
3561 break;
[2]3562
[191]3563 case IDM_SELECTALL:
3564 case IDM_DESELECTALL:
3565 case IDM_INVERT:
3566 {
3567 APIRET rc;
[2]3568
[551]3569 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
3570 if (!rc) {
3571 if (!ad->busy && ad->markedlines) {
[2]3572
[191]3573 register ULONG x;
[2]3574
[551]3575 for (x = 0; x < ad->numlines; x++) {
3576 switch (SHORT1FROMMP(mp1)) {
[191]3577 case IDM_SELECTALL:
[551]3578 if (!(ad->markedlines[x] & VF_SELECTED)) {
3579 ad->markedlines[x] |= VF_SELECTED;
3580 ad->selected++;
[191]3581 }
3582 break;
3583 case IDM_DESELECTALL:
[551]3584 if (ad->markedlines[x] & VF_SELECTED) {
3585 ad->markedlines[x] &= (~VF_SELECTED);
3586 ad->selected--;
[191]3587 }
3588 break;
3589 case IDM_INVERT:
[551]3590 if (ad->markedlines[x] & VF_SELECTED) {
3591 ad->markedlines[x] &= (~VF_SELECTED);
3592 ad->selected--;
[191]3593 }
[551]3594 else {
3595 ad->markedlines[x] |= VF_SELECTED;
3596 ad->selected++;
[191]3597 }
3598 break;
3599 }
3600 }
3601 WinSendMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
3602 WinInvalidateRect(hwnd, NULL, FALSE);
3603 }
[551]3604 DosReleaseMutexSem(ad->ScanSem);
[191]3605 }
3606 }
3607 break;
[2]3608
[191]3609 case IDM_WRAP:
3610 {
3611 APIRET rc;
[2]3612
[551]3613 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
3614 if (!rc) {
3615 if (!ad->busy) {
3616 ad->wrapon = ad->wrapon ? FALSE : TRUE;
3617 WrapOn = ad->wrapon;
[191]3618 PrfWriteProfileData(fmprof, appname, "Viewer.WrapOn",
[551]3619 &ad->wrapon, sizeof(BOOL));
[191]3620 PostMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
3621 PostMsg(hwnd, UM_SETUP3, MPVOID, MPVOID);
3622 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
[551]3623 if (WinSendDlgItemMsg(ad->hwndFrame, NEWVIEW_LISTBOX,
[191]3624 LM_QUERYITEMCOUNT, MPVOID, MPVOID))
[551]3625 WinSendDlgItemMsg(ad->hwndFrame, NEWVIEW_LISTBOX, LM_DELETEALL,
[191]3626 MPVOID, MPVOID);
[551]3627 ad->oldwidth = -1;
3628 WinSendMsg(ad->hvscroll, SBM_SETTHUMBSIZE,
3629 MPFROM2SHORT(1, 1), MPVOID);
3630 WinSendMsg(ad->hvscroll, SBM_SETSCROLLBAR,
[191]3631 MPFROMSHORT(1), MPFROM2SHORT(1, 1));
[551]3632 WinSendMsg(ad->hhscroll, SBM_SETTHUMBSIZE,
3633 MPFROM2SHORT(1, 1), MPVOID);
3634 WinSendMsg(ad->hhscroll, SBM_SETSCROLLBAR,
[191]3635 MPFROMSHORT(1), MPFROM2SHORT(1, 1));
[551]3636 WinSendMsg(ad->hwndFrame, WM_UPDATEFRAME,
[191]3637 MPFROMLONG(FCF_SIZEBORDER), MPVOID);
3638 WinInvalidateRect(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
3639 NEWVIEW_DRAG), NULL, FALSE);
[551]3640 WinInvalidateRect(ad->hhscroll, NULL, FALSE);
[191]3641 }
[551]3642 DosReleaseMutexSem(ad->ScanSem);
[191]3643 }
3644 }
3645 break;
[2]3646
[191]3647 case IDM_HEXMODE:
3648 {
3649 APIRET rc;
[2]3650
[551]3651 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
3652 if (!rc) {
3653 if (!ad->busy) {
3654 ad->hex = (ad->hex) ? FALSE : TRUE;
[191]3655 WinEnableWindow(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
[551]3656 IDM_NEXTBLANKLINE), !ad->hex);
[191]3657 WinEnableWindow(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
[551]3658 IDM_PREVBLANKLINE), !ad->hex);
[191]3659 PostMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
3660 PostMsg(hwnd, UM_SETUP3, MPVOID, MPVOID);
3661 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
[551]3662 if (WinSendDlgItemMsg(ad->hwndFrame, NEWVIEW_LISTBOX,
[191]3663 LM_QUERYITEMCOUNT, MPVOID, MPVOID))
[551]3664 WinSendDlgItemMsg(ad->hwndFrame, NEWVIEW_LISTBOX, LM_DELETEALL,
[191]3665 MPVOID, MPVOID);
[551]3666 ad->oldwidth = -1;
3667 WinSendMsg(ad->hvscroll, SBM_SETTHUMBSIZE,
3668 MPFROM2SHORT(1, 1), MPVOID);
3669 WinSendMsg(ad->hvscroll, SBM_SETSCROLLBAR,
[191]3670 MPFROMSHORT(1), MPFROM2SHORT(1, 1));
[551]3671 WinSendMsg(ad->hhscroll, SBM_SETTHUMBSIZE,
3672 MPFROM2SHORT(1, 1), MPVOID);
3673 WinSendMsg(ad->hhscroll, SBM_SETSCROLLBAR,
[191]3674 MPFROMSHORT(1), MPFROM2SHORT(1, 1));
[551]3675 WinSendMsg(ad->hwndFrame, WM_UPDATEFRAME,
[191]3676 MPFROMLONG(FCF_SIZEBORDER), MPVOID);
3677 WinInvalidateRect(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
3678 NEWVIEW_DRAG), NULL, FALSE);
[551]3679 WinInvalidateRect(ad->hhscroll, NULL, FALSE);
[191]3680 }
[551]3681 DosReleaseMutexSem(ad->ScanSem);
[191]3682 }
3683 }
3684 break;
[2]3685
[191]3686 case IDM_FONTPALETTE:
3687 {
3688 APIRET rc;
[2]3689
[551]3690 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
3691 if (!rc) {
3692 SetMLEFont(hwnd, &ad->fattrs, 11);
[191]3693 PrfWriteProfileData(fmprof, appname, "Viewer.Fattrs",
[551]3694 &ad->fattrs, sizeof(FATTRS));
3695 Fattrs = ad->fattrs;
3696 GpiDeleteSetId(ad->hps, FIXED_FONT_LCID);
3697 GpiAssociate(ad->hps, 0);
3698 GpiDestroyPS(ad->hps);
3699 ad->hps = InitWindow(hwnd);
3700 DosReleaseMutexSem(ad->ScanSem);
[191]3701 WinSendMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
3702 WinInvalidateRect(hwnd, NULL, FALSE);
3703 }
[2]3704 }
3705 break;
3706
[191]3707 case IDM_HELP:
3708 if (hwndHelp)
3709 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
[551]3710 MPFROM2SHORT(HELP_NEWVIEW, 0), MPFROMSHORT(HM_RESOURCEID));
[2]3711 break;
[191]3712 }
3713 return 0;
[2]3714
[191]3715 case WM_SETFOCUS:
3716 if (mp2)
3717 WinSendMsg(hwnd, UM_SETUP5, MPVOID, MPVOID);
[551]3718 if (mp2 && ad && ad->needrefreshing && !ad->stopflag &&
3719 !DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN)) {
3720 ad->needrefreshing = FALSE;
3721 DosReleaseMutexSem(ad->ScanSem);
[191]3722 WinInvalidateRect(hwnd, NULL, TRUE);
3723 }
3724 break;
[2]3725
[191]3726 case WM_SIZE:
[551]3727 if (SHORT1FROMMP(mp2) && SHORT2FROMMP(mp2)) {
[191]3728 PostMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
3729 PostMsg(hwnd, UM_SETUP3, MPVOID, MPVOID);
3730 }
3731 break;
[2]3732
[191]3733 case WM_SAVEAPPLICATION:
[551]3734 if (ad && ParentIsDesktop(hwnd, ad->hwndParent)) {
[2]3735
[191]3736 SWP swp;
[2]3737
[551]3738 WinQueryWindowPos(ad->hwndFrame, &swp);
[191]3739 if (!(swp.fl & (SWP_HIDE | SWP_MINIMIZE | SWP_MAXIMIZE)))
3740 PrfWriteProfileData(fmprof,
[551]3741 appname, "NewViewSizePos", &swp, sizeof(swp));
[191]3742 }
3743 break;
[2]3744
[191]3745 case WM_CLOSE:
3746 if (ad)
[551]3747 ad->stopflag = 1;
[191]3748 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
3749 return 0;
[2]3750
[191]3751 case WM_DESTROY:
3752 {
3753 BOOL dontclose = FALSE;
[551]3754 HWND hwndRestore = (HWND) 0;
[2]3755
[191]3756 WinStopTimer(WinQueryAnchorBlock(hwnd), hwnd, ID_TIMER5);
[551]3757 if (ad) {
3758 ad->stopflag = 1;
3759 if (ad->ScanSem) {
[771]3760 DosRequestMutexSem(ad->ScanSem, 15000);
[551]3761 DosCloseMutexSem(ad->ScanSem);
[191]3762 }
[551]3763 if (ad->busy)
[771]3764 DosSleep(100); //05 Aug 07 GKY 128
[551]3765 if (ad->hps) {
3766 GpiDeleteSetId(ad->hps, FIXED_FONT_LCID);
3767 GpiAssociate(ad->hps, 0);
3768 GpiDestroyPS(ad->hps);
[191]3769 }
[551]3770 hwndRestore = ad->hwndRestore;
3771 dontclose = ((ad->flags & 4) != 0) ? TRUE : FALSE;
[191]3772 FreeViewerMem(hwnd);
3773 WinSetWindowPtr(hwnd, QWL_USER, NULL);
3774 free(ad);
[2]3775 }
[551]3776 if (hwndRestore && hwndRestore != HWND_DESKTOP) {
[191]3777
3778 ULONG fl = SWP_SHOW | SWP_ACTIVATE | SWP_ZORDER;
3779 SWP swp;
3780
[551]3781 if (WinQueryWindowPos(hwndRestore, &swp)) {
[191]3782 if (!(swp.fl & SWP_MAXIMIZE))
3783 fl |= SWP_RESTORE;
3784 WinSetWindowPos(hwndRestore, HWND_TOP, 0, 0, 0, 0, fl);
3785 }
3786 }
3787 if (!dontclose &&
3788 ParentIsDesktop(hwnd, WinQueryWindow(WinQueryWindow(hwnd,
[551]3789 QW_PARENT),
3790 QW_PARENT))) {
3791 if (!PostMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID))
[191]3792 DosExit(EXIT_PROCESS, 1);
3793 }
3794 }
3795 break;
[2]3796 }
3797
[191]3798 return WinDefWindowProc(hwnd, msg, mp1, mp2);
[2]3799}
3800
[191]3801HWND StartViewer(HWND hwndParent, USHORT flags, CHAR * filename,
3802 HWND hwndRestore)
[83]3803{
[551]3804 HWND hwndFrame = (HWND) 0, hwndClient;
[191]3805 VIEWDATA *ad;
3806 ULONG FrameFlags = FCF_TITLEBAR | FCF_SYSMENU |
[551]3807 FCF_SIZEBORDER | FCF_MINMAX |
3808 FCF_NOBYTEALIGN | FCF_VERTSCROLL |
3809 FCF_MENU | FCF_ICON | FCF_ACCELTABLE | FCF_HORZSCROLL;
[2]3810
[191]3811 if (strcmp(realappname, FM3Str))
[2]3812 hwndParent = HWND_DESKTOP;
[191]3813 if (ParentIsDesktop(hwndParent, hwndParent))
[2]3814 FrameFlags |= FCF_TASKLIST;
3815// saymsg(MB_ENTER,HWND_DESKTOP,DEBUG_STRING,"\"%s\"\r\rparent %s desktop",filename,(ParentIsDesktop(hwndParent,hwndParent)) ? "is" : "isn't");
3816 hwndFrame = WinCreateStdWindow(hwndParent,
[191]3817 0,
3818 &FrameFlags,
[593]3819 WC_NEWVIEW,
[191]3820 GetPString(IDS_FM2VIEWERTITLETEXT),
3821 fwsAnimate,
[551]3822 FM3ModHandle, NEWVIEW_FRAME, &hwndClient);
3823 if (hwndFrame) {
[2]3824
[191]3825 HWND hwndMenu = WinWindowFromID(hwndFrame, FID_MENU);
[2]3826
[551]3827 if (!fToolbar && hwndMenu) {
[191]3828 WinSendMsg(hwndMenu, MM_DELETEITEM,
3829 MPFROM2SHORT(IDM_FINDFIRST, FALSE), MPVOID);
3830 WinSendMsg(hwndMenu, MM_DELETEITEM,
3831 MPFROM2SHORT(IDM_FINDNEXT, FALSE), MPVOID);
3832 WinSendMsg(hwndMenu, MM_DELETEITEM,
3833 MPFROM2SHORT(IDM_FINDPREV, FALSE), MPVOID);
3834 WinSendMsg(hwndMenu, MM_DELETEITEM,
3835 MPFROM2SHORT(IDM_SAVETOCLIP, FALSE), MPVOID);
[2]3836 }
[551]3837 ad = xmallocz(sizeof(VIEWDATA), pszSrcFile, __LINE__);
[350]3838 if (!ad) {
3839 WinDestroyWindow(hwndFrame);
[551]3840 hwndFrame = (HWND) 0;
[350]3841 }
3842 else {
[551]3843 ad->size = sizeof(VIEWDATA);
3844 ad->stopflag = 0;
3845 ad->multiplier = 1;
3846 ad->hwndRestore = hwndRestore;
3847 ad->hwndFrame = hwndFrame;
3848 ad->hwndParent = hwndParent;
3849 ad->clientfocused = TRUE;
3850 ad->oldwidth = -1;
3851 strcpy(ad->filename, filename);
3852 ad->flags = flags;
3853 if (ad->flags & 16)
3854 ad->hex = TRUE;
[191]3855 WinSetWindowPtr(hwndClient, QWL_USER, (PVOID) ad);
[551]3856 if (Firsttime) {
[2]3857
[191]3858 ULONG size;
[2]3859
[191]3860 size = sizeof(BOOL);
3861 PrfQueryProfileData(fmprof, appname, "Viewer.Sensitive",
3862 (PVOID) & Sensitive, &size);
3863 size = sizeof(USHORT);
3864 PrfQueryProfileData(fmprof, appname, "Viewer.Codepage",
3865 (PVOID) & Codepage, &size);
3866 size = sizeof(BOOL);
3867 PrfQueryProfileData(fmprof, appname, "Viewer.LiteralSearch",
3868 (PVOID) & LiteralSearch, &size);
3869 size = sizeof(BOOL);
3870 PrfQueryProfileData(fmprof, appname, "Viewer.AlsoSelect",
3871 (PVOID) & AlsoSelect, &size);
3872 size = sizeof(BOOL);
3873 PrfQueryProfileData(fmprof, appname, "Viewer.WrapOn",
3874 (PVOID) & WrapOn, &size);
3875 size = sizeof(BOOL);
3876 PrfQueryProfileData(fmprof, appname, "Viewer.IgnoreFTP",
3877 (PVOID) & IgnoreFTP, &size);
3878 size = sizeof(BOOL);
3879 PrfQueryProfileData(fmprof, appname, "Viewer.IgnoreHTTP",
3880 (PVOID) & IgnoreHTTP, &size);
3881 memset(&Fattrs, 0, sizeof(FATTRS));
3882 size = sizeof(FATTRS);
3883 Fattrs.usRecordLength = sizeof(FATTRS);
3884 Fattrs.lMaxBaselineExt = 16;
3885 Fattrs.lAveCharWidth = 8;
3886 Fattrs.usCodePage = Codepage;
3887 strcpy(Fattrs.szFacename, GetPString(IDS_SYSMONOTEXT));
3888 PrfQueryProfileData(fmprof, appname, "Viewer.Fattrs",
3889 (PVOID) & Fattrs, &size);
3890 size = sizeof(LONG) * COLORS_MAX;
3891 PrfQueryProfileData(fmprof, appname, "Viewer.Colors",
3892 (PVOID) Colors, &size);
3893 Firsttime = FALSE;
[2]3894 }
3895 {
[551]3896 ULONG size = sizeof(ad->searchtext);
[191]3897
3898 PrfQueryProfileData(fmprof, appname, "Viewer.Searchtext",
[551]3899 (PVOID) ad->searchtext, &size);
3900 ad->searchtext[sizeof(ad->searchtext) - 1] = 0;
[2]3901 }
[551]3902 ad->sensitive = Sensitive;
3903 ad->literalsearch = LiteralSearch;
3904 ad->fattrs = Fattrs;
3905 ad->alsoselect = AlsoSelect;
3906 ad->fattrs.usCodePage = Codepage;
3907 ad->wrapon = WrapOn;
3908 ad->ignorehttp = IgnoreHTTP;
3909 ad->ignoreftp = IgnoreFTP;
3910 memcpy(ad->colors, Colors, sizeof(LONG) * COLORS_MAX);
[191]3911 WinSetWindowPtr(hwndClient, QWL_USER, (PVOID) ad);
[350]3912 if (!WinSendMsg(hwndClient, UM_SETUP, MPVOID, MPVOID))
[551]3913 hwndFrame = (HWND) 0;
[350]3914 else {
[812]3915 //DosSleep(32);
[551]3916 if (!(FrameFlags & FCF_TASKLIST) && !(flags & 2)) {
[191]3917 SWP swp;
[551]3918
[191]3919 FillClient(hwndParent, &swp, NULL, FALSE);
3920 WinSetWindowPos(hwndFrame, HWND_TOP, swp.x, swp.y, swp.cx, swp.cy,
3921 SWP_SIZE | SWP_MOVE | SWP_SHOW | SWP_RESTORE |
3922 SWP_ZORDER | SWP_ACTIVATE);
3923 }
[551]3924 else if (FrameFlags & FCF_TASKLIST) {
[2]3925
[191]3926 SWP swp, swpD;
3927 ULONG size = sizeof(swp);
3928 LONG cxScreen, cyScreen;
[2]3929
[191]3930 WinQueryTaskSizePos(WinQueryAnchorBlock(hwndFrame), 0, &swp);
3931 if (PrfQueryProfileData(fmprof,
[551]3932 appname, "NewViewSizePos", &swpD, &size)) {
[191]3933 cxScreen = WinQuerySysValue(HWND_DESKTOP, SV_CXSCREEN);
3934 cyScreen = WinQuerySysValue(HWND_DESKTOP, SV_CYSCREEN);
3935 if (swp.x + swpD.cx > cxScreen)
3936 swp.x = cxScreen - swpD.cx;
3937 if (swp.y + swpD.cy > cyScreen)
3938 swp.y = cyScreen - swpD.cy;
3939 swp.cx = swpD.cx;
3940 swp.cy = swpD.cy;
3941 }
3942 WinSetWindowPos(hwndFrame, HWND_TOP, swp.x, swp.y, swp.cx, swp.cy,
3943 SWP_SIZE | SWP_MOVE | SWP_SHOW | SWP_ZORDER |
3944 SWP_ACTIVATE);
3945 }
[2]3946 }
3947 }
3948 }
3949 return hwndFrame;
3950}
[793]3951
3952#pragma alloc_text(NEWVIEW,ViewStatusProc,FreeViewerMem,LoadFileThread)
3953#pragma alloc_text(NEWVIEW,InitWindow,PaintLine,ViewWndProc)
3954#pragma alloc_text(NEWVIEW,ViewFrameWndProc,StartViewer,ReLineThread)
3955#pragma alloc_text(NEWVIEW,BuildAList,SearchThread,ClipboardThread,FindStrDlgProc)
3956#pragma alloc_text(NEWVIEW,BuildAList2,UrlDlgProc)
Note: See TracBrowser for help on using the repository browser.