source: trunk/dll/newview.c@ 920

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

Cleanup of NormalizeCmdLine moved to pathutil.c

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