source: trunk/dll/newview.c@ 885

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

Replace explore.exe with WPURLDEFAULTSETTINGS for runhttp fall back Ticket 179

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