source: trunk/dll/newview.c@ 843

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

This implements large file support; The wrappers to allow WARP3 compatibility are not done so this will not run on Warp3or Warp 4 pre fixpack 12(?)

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