source: trunk/dll/newview.c@ 819

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

History and comments update for horizontal scroll bar fix

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