source: trunk/dll/newview.c@ 946

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

Minor code cleanup and documentation for some changes. (Tickets 3, 7, 184)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 114.9 KB
RevLine 
[83]1
2/***********************************************************************
3
4 $Id: newview.c 946 2008-02-10 19:02:58Z 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 }
[946]2451 }
2452 //Move line to selection box at top of viewer
[551]2453 numsels = (SHORT) WinSendDlgItemMsg(ad->hwndFrame, NEWVIEW_LISTBOX,
2454 LM_QUERYITEMCOUNT, MPVOID,
2455 MPVOID);
2456 if (numsels > 0) {
2457 for (sSelect = 0; sSelect < numsels; sSelect++) {
2458 linenum =
2459 (ULONG) WinSendDlgItemMsg(ad->hwndFrame, NEWVIEW_LISTBOX,
2460 LM_QUERYITEMHANDLE,
2461 MPFROM2SHORT(sSelect, 0), MPVOID);
[191]2462 if (linenum == whichline)
2463 goto NoAdd;
2464 }
2465 }
2466 {
2467 CHAR *s = NULL, *p;
[2]2468
[551]2469 if (!ad->hex && ad->lines) {
2470 s = xmalloc(width + 2, pszSrcFile, __LINE__);
[191]2471 if (!s)
2472 goto NoAdd;
[551]2473 strncpy(s, ad->lines[whichline], width + 1);
[191]2474 s[width + 1] = 0;
2475 p = s;
[551]2476 while (*p) {
2477 if (*p == '\r' || *p == '\n') {
[191]2478 *p = 0;
2479 break;
2480 }
2481 p++;
2482 }
2483 }
[551]2484 else {
[2]2485
[191]2486 register ULONG x;
[2]2487
[551]2488 width = ad->textsize - (whichline * 16);
[946]2489 width = min(width, 16); //standard hexx line length
2490 //use 80 as width * 5 gives inconsistent format on short lines
[551]2491 s = xmalloc(80, pszSrcFile, __LINE__);
[191]2492 if (!s)
2493 goto NoAdd;
2494 sprintf(s, "%08lx ", whichline * 16);
2495 p = s + 9;
[551]2496 for (x = 0; x < width; x++) {
[870]2497 sprintf(p, " %02x", (UCHAR)ad->text[(whichline * 16) + x]);
[191]2498 p += 3;
2499 }
2500 *p = ' ';
2501 p++;
2502 *p = ' ';
2503 p++;
[551]2504 for (x = 0; x < width; x++) {
2505 *p = ad->text[(whichline * 16) + x];
[191]2506 p++;
2507 }
2508 *p = 0;
2509 }
[551]2510 if (s) {
2511 if (*s) {
2512 ad->dummy = TRUE;
2513 numinserted = (SHORT) WinSendDlgItemMsg(ad->hwndFrame,
[191]2514 NEWVIEW_LISTBOX,
2515 LM_INSERTITEM,
[551]2516 MPFROM2SHORT(LIT_END,
2517 0),
[191]2518 MPFROMP(s));
[551]2519 ad->dummy = FALSE;
[191]2520 if (numinserted >= 0)
[551]2521 WinSendDlgItemMsg(ad->hwndFrame, NEWVIEW_LISTBOX,
[191]2522 LM_SETITEMHANDLE,
2523 MPFROM2SHORT(numinserted, 0),
2524 MPFROMLONG(whichline));
2525 }
2526 free(s);
2527 }
2528 }
2529 if (!numsels)
[551]2530 WinSendMsg(ad->hwndFrame, WM_UPDATEFRAME,
[191]2531 MPFROMLONG(FCF_SIZEBORDER), MPVOID);
[2]2532 }
[191]2533 NoAdd:
[551]2534 DosReleaseMutexSem(ad->ScanSem);
[191]2535 DosPostEventSem(CompactSem);
2536 }
2537 break;
[2]2538
[191]2539 case WM_MENUEND:
[551]2540 if (ad && ad->hwndPopup == (HWND) mp2) {
2541 WinDestroyWindow(ad->hwndPopup);
2542 ad->hwndPopup = (HWND) 0;
[191]2543 }
2544 break;
2545
2546 case UM_CONTEXTMENU:
2547 case WM_CONTEXTMENU:
[551]2548 if (ad) {
2549 if (!ad->hwndPopup) {
2550 ad->hwndPopup =
2551 WinLoadMenu(HWND_DESKTOP, FM3ModHandle, NEWVIEW_POPUP);
2552 if (ad->hwndPopup)
2553 WinSetPresParam(ad->hwndPopup,
[191]2554 PP_FONTNAMESIZE,
2555 strlen(GetPString(IDS_8HELVTEXT)) + 1,
2556 GetPString(IDS_8HELVTEXT));
[2]2557 }
[551]2558 if (ad->hwndPopup) {
[2]2559
[191]2560 APIRET rc;
2561 SHORT sSelect;
[2]2562
[551]2563 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
2564 WinEnableMenuItem(ad->hwndPopup, IDM_SAVETOCLIP, (rc == 0 &&
2565 ad->selected != 0));
2566 WinEnableMenuItem(ad->hwndPopup, IDM_APPENDTOCLIP, (rc == 0 &&
2567 ad->selected !=
2568 0));
2569 WinEnableMenuItem(ad->hwndPopup, IDM_SAVETOLIST,
2570 (rc == 0 && ad->selected != 0));
2571 sSelect =
2572 (SHORT) WinSendDlgItemMsg(ad->hwndFrame, NEWVIEW_LISTBOX,
2573 LM_QUERYITEMCOUNT, MPVOID, MPVOID);
2574 WinEnableMenuItem(ad->hwndPopup, IDM_SAVETOCLIP2,
2575 (rc == 0 && sSelect > 0));
2576 WinEnableMenuItem(ad->hwndPopup, IDM_APPENDTOCLIP2,
2577 (rc == 0 && sSelect > 0));
2578 WinEnableMenuItem(ad->hwndPopup, IDM_SAVETOLIST2,
2579 (rc == 0 && sSelect > 0));
2580 WinEnableMenuItem(ad->hwndPopup, IDM_SELECTALL,
2581 (rc == 0 && ad->numlines != 0 && ad->markedlines));
2582 WinEnableMenuItem(ad->hwndPopup, IDM_DESELECTALL,
2583 (rc == 0 && ad->numlines != 0 && ad->markedlines
2584 && ad->selected != 0));
2585 WinEnableMenuItem(ad->hwndPopup, IDM_PREVSELECTED,
2586 (rc == 0 && ad->numlines != 0 && ad->markedlines
2587 && ad->selected != 0));
2588 WinEnableMenuItem(ad->hwndPopup, IDM_NEXTSELECTED,
2589 (rc == 0 && ad->numlines != 0 && ad->markedlines
2590 && ad->selected != 0));
2591 WinEnableMenuItem(ad->hwndPopup, IDM_SELECTFOUND,
2592 (rc == 0 && ad->numlines != 0 && ad->markedlines
2593 && ad->found != 0));
2594 WinEnableMenuItem(ad->hwndPopup, IDM_DESELECTFOUND,
2595 (rc == 0 && ad->numlines != 0 && ad->markedlines
2596 && ad->selected != 0 && ad->found != 0));
2597 WinEnableMenuItem(ad->hwndPopup, IDM_INVERT,
2598 (rc == 0 && ad->numlines != 0 && ad->markedlines));
2599 WinEnableMenuItem(ad->hwndPopup, IDM_FINDFIRST,
2600 (rc == 0 && ad->numlines != 0 && ad->markedlines));
2601 WinEnableMenuItem(ad->hwndPopup, IDM_FINDNEXT,
2602 (rc == 0 && ad->numlines != 0 && ad->markedlines
2603 && ad->found));
2604 WinEnableMenuItem(ad->hwndPopup, IDM_FINDPREV,
2605 (rc == 0 && ad->numlines != 0 && ad->markedlines
2606 && ad->found));
2607 WinEnableMenuItem(ad->hwndPopup, IDM_GOTOLINE,
2608 (rc == 0 && ad->numlines != 0));
2609 WinEnableMenuItem(ad->hwndPopup, IDM_GOTOOFFSET,
2610 (rc == 0 && ad->textsize != 0));
[191]2611 if (!rc)
[551]2612 DosReleaseMutexSem(ad->ScanSem);
2613 PopupMenu(hwnd, hwnd, ad->hwndPopup);
[2]2614 }
[191]2615 }
2616 break;
[2]2617
[191]2618 case UM_SETUP3:
[551]2619 if (ad && !ad->busy &&
2620 !DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN)) {
2621 ad->multiplier = ad->numlines / 32767;
2622 if (ad->multiplier * 32767 != ad->numlines)
2623 ad->multiplier++;
2624 if (!ad->multiplier)
2625 ad->multiplier++;
[191]2626 {
2627 RECTL Rectl;
2628 ULONG numlines;
[2]2629
[191]2630 WinQueryWindowRect(hwnd, &Rectl);
2631 numlines = NumLines(&Rectl, ad);
[551]2632 if (numlines) {
2633 WinSendMsg(ad->hhscroll, SBM_SETTHUMBSIZE,
2634 MPFROM2SHORT((SHORT) Rectl.xRight, (SHORT) ad->maxx),
[191]2635 MPVOID);
[551]2636 WinSendMsg(ad->hvscroll, SBM_SETTHUMBSIZE,
[191]2637 MPFROM2SHORT((SHORT) numlines,
[551]2638 (SHORT) min(ad->numlines, 32767)), MPVOID);
2639 if (ad->multiplier)
2640 WinSendMsg(ad->hvscroll, SBM_SETSCROLLBAR,
2641 MPFROMSHORT((SHORT) (ad->topline / ad->multiplier)),
2642 MPFROM2SHORT(1, (SHORT) ((ad->numlines + 1) /
2643 ad->multiplier) - numlines));
2644 WinSendMsg(ad->hhscroll, SBM_SETSCROLLBAR,
2645 MPFROMSHORT((SHORT) abs(ad->horzscroll)),
2646 MPFROM2SHORT(0, (SHORT) (ad->maxx - Rectl.xRight)));
2647 if (ad->numlines - ad->topline < numlines) {
2648 ad->topline = ((ad->numlines - ad->topline) - numlines);
[191]2649 WinInvalidateRect(hwnd, NULL, FALSE);
2650 }
2651 }
[2]2652 }
[551]2653 DosReleaseMutexSem(ad->ScanSem);
[191]2654 }
2655 return 0;
[2]2656
[191]2657 case UM_SETUP4:
[551]2658 if (ad && !ad->busy &&
2659 !DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN)) {
[2]2660
[191]2661 CHAR s[140], t[34];
2662 ULONG numlines;
2663 RECTL Rectl;
[2]2664
[191]2665 WinQueryWindowRect(hwnd, &Rectl);
2666 numlines = NumLines(&Rectl, ad);
[551]2667 commafmt(t, sizeof(t), ad->cursored);
[191]2668 strcpy(s, GetPString(IDS_LINECOLONTEXT));
2669 strcat(s, t);
[551]2670 if (ad->selected) {
2671 if (ad->selected > ad->numlines)
2672 ad->selected = 0;
2673 else {
2674 commafmt(t, sizeof(t), ad->selected);
[191]2675 strcat(s, " (");
2676 strcat(s, t);
2677 strcat(s, GetPString(IDS_SELECTEDPARENTEXT));
2678 }
[2]2679 }
[551]2680 if (ad->found) {
2681 if (ad->found > ad->numlines)
2682 ad->found = 0;
2683 else {
2684 commafmt(t, sizeof(t), ad->found);
[191]2685 strcat(s, " (");
2686 strcat(s, t);
2687 strcat(s, GetPString(IDS_FOUNDPARENTEXT));
2688 }
2689 }
[551]2690 WinSetWindowText(ad->hwndStatus2, s);
2691 if (!ad->hex && ad->lines)
2692 commafmt(t, sizeof(t), ad->lines[ad->cursored - 1] - ad->text);
[191]2693 else
[551]2694 commafmt(t, sizeof(t), (ad->cursored - 1) * 16);
[191]2695 strcpy(s, GetPString(IDS_OFFSETCOLONTEXT));
2696 strcat(s, t);
[551]2697 WinSetWindowText(ad->hwndStatus3, s);
2698 if (ad->multiplier)
2699 WinSendMsg(ad->hvscroll, SBM_SETSCROLLBAR,
2700 MPFROMSHORT((SHORT) (ad->topline / ad->multiplier)),
2701 MPFROM2SHORT(1, (SHORT) ((ad->numlines + 1) /
2702 ad->multiplier) - numlines));
2703 WinSendMsg(ad->hhscroll, SBM_SETSCROLLBAR,
2704 MPFROMSHORT((SHORT) abs(ad->horzscroll)),
2705 MPFROM2SHORT(0, (SHORT) (ad->maxx - Rectl.xRight)));
2706 DosReleaseMutexSem(ad->ScanSem);
[191]2707 }
2708 return 0;
[2]2709
[191]2710 case UM_CONTAINER_FILLED:
[551]2711 if (ad && !ad->busy &&
2712 !DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN)) {
2713 ad->stopflag = 0;
2714 ad->topline = 1;
2715 ad->cursored = 1;
2716 ad->multiplier = 1;
[191]2717 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
2718 WinEnableWindow(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
[551]2719 IDM_NEXTBLANKLINE), !ad->hex);
[191]2720 WinEnableWindow(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
[551]2721 IDM_PREVBLANKLINE), !ad->hex);
[817]2722 if (ad->numlines)
2723 {
[551]2724 if (mp1 && (ULONG) mp1 < ad->numlines + 1) {
[2]2725
[191]2726 RECTL Rectl;
2727 ULONG numlines;
[2]2728
[191]2729 WinQueryWindowRect(hwnd, &Rectl);
2730 numlines = NumLines(&Rectl, ad);
[551]2731 if (numlines) {
2732 ad->topline = (ULONG) mp1;
2733 if (ad->numlines - ad->topline < numlines)
2734 ad->topline = ad->numlines - numlines;
2735 ad->cursored = (ULONG) mp1;
2736 if (mp2) {
2737 ad->cursored = (ULONG) mp2;
2738 if (ad->cursored > (ad->topline - 1) + numlines)
2739 ad->cursored = (ad->topline - 1) + numlines;
[191]2740 }
2741 }
2742 }
2743 WinSendMsg(hwnd, UM_SETUP3, MPVOID, MPVOID);
2744 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
2745 WinInvalidateRect(hwnd, NULL, FALSE);
[2]2746 }
[551]2747 DosReleaseMutexSem(ad->ScanSem);
[191]2748 }
2749 else if (ad)
[551]2750 ad->needrefreshing = TRUE;
[191]2751 return 0;
[2]2752
[191]2753 case WM_ERASEBACKGROUND:
2754 WinFillRect((HPS) mp1, (PRECTL) mp2,
[551]2755 standardcolors[ad->colors[COLORS_NORMALBACK]]);
[191]2756 return 0;
[2]2757
[191]2758 case WM_PAINT:
[551]2759 if (ad) {
[2]2760
[191]2761 HPS hpsp;
2762 RECTL Rectl;
2763 register ULONG x;
[551]2764 ULONG numlines, wascursored = ad->cursored;
[2]2765
[551]2766 hpsp = WinBeginPaint(hwnd, ad->hps, &Rectl);
[191]2767 WinFillRect(hpsp, &Rectl,
[551]2768 standardcolors[ad->colors[COLORS_NORMALBACK]]);
2769 if (!ad->stopflag && !ad->busy &&
2770 !DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN)) {
[191]2771 WinQueryWindowRect(hwnd, &Rectl);
2772 numlines = NumLines(&Rectl, ad);
[551]2773 if (numlines) {
2774 if (ad->numlines && (ad->lines || ad->hex)) {
2775 if (ad->topline > (ad->numlines + 1) - numlines)
2776 ad->topline = (ad->numlines + 1) - numlines;
2777 if (ad->topline > ad->numlines)
2778 ad->topline = 1;
2779 if (!ad->topline)
2780 ad->topline = 1;
2781 if (ad->cursored < ad->topline)
2782 ad->cursored = ad->topline;
2783 else if (ad->cursored > (ad->topline + numlines) - 1)
2784 ad->cursored = (ad->topline + numlines) - 1;
2785 if (ad->cursored > ad->numlines)
2786 ad->cursored = ad->numlines;
2787 if (wascursored != ad->cursored)
[191]2788 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
2789 }
2790 else
[551]2791 ad->topline = ad->cursored = 1;
2792 if (ad->numlines && (ad->lines || ad->hex)) {
2793 for (x = ad->topline - 1; x < ad->numlines; x++) {
[191]2794 if (((LONG) (Rectl.yTop -
[551]2795 (ad->lMaxHeight *
2796 (((x + 1) - ad->topline) + 1))) -
2797 ad->lMaxDescender) <= 0)
[191]2798 break;
[551]2799 PaintLine(hwnd, hpsp, x, ad->topline, &Rectl);
[191]2800 }
2801 }
2802 }
[551]2803 if (ad->multiplier)
2804 WinSendMsg(ad->hvscroll, SBM_SETSCROLLBAR,
2805 MPFROMSHORT((SHORT) (ad->topline / ad->multiplier)),
2806 MPFROM2SHORT(1, (SHORT) ((ad->numlines + 1) /
2807 ad->multiplier) - numlines));
2808 WinSendMsg(ad->hhscroll, SBM_SETSCROLLBAR,
2809 MPFROMSHORT((SHORT) abs(ad->horzscroll)),
2810 MPFROM2SHORT(0, (SHORT) (ad->maxx - Rectl.xRight)));
2811 WinSendMsg(ad->hhscroll, SBM_SETTHUMBSIZE,
2812 MPFROM2SHORT((SHORT) Rectl.xRight, (SHORT) ad->maxx),
[191]2813 MPVOID);
[551]2814 DosReleaseMutexSem(ad->ScanSem);
2815 ad->needrefreshing = FALSE;
[2]2816 }
[191]2817 else
[551]2818 ad->needrefreshing = TRUE;
[191]2819 WinEndPaint(hpsp);
2820 }
[551]2821 else {
[2]2822
[191]2823 HPS hpsp;
[2]2824
[191]2825 hpsp = WinBeginPaint(hwnd, (HPS) 0, NULL);
2826 WinEndPaint(hpsp);
2827 }
2828 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
2829 break;
[2]2830
[191]2831 case WM_HSCROLL:
2832 {
2833 RECTL rectl;
2834 BOOL invalidate = TRUE;
2835
2836 WinQueryWindowRect(hwnd, &rectl);
[551]2837 switch (SHORT2FROMMP(mp2)) {
[191]2838 case SB_PAGERIGHT:
[551]2839 if (abs(ad->horzscroll) <= ad->maxx - rectl.xRight) {
2840 ad->horzscroll -= rectl.xRight;
2841 if (abs(ad->horzscroll) > ad->maxx - rectl.xRight)
2842 ad->horzscroll = -((ad->maxx - rectl.xRight) +
2843 ad->fattrs.lAveCharWidth);
[191]2844 }
2845 else
2846 invalidate = FALSE;
2847 break;
[2]2848
[191]2849 case SB_PAGELEFT:
[551]2850 if (ad->horzscroll < 0) {
2851 ad->horzscroll += rectl.xRight;
2852 if (ad->horzscroll > 0)
2853 ad->horzscroll = 0;
[191]2854 }
2855 else
2856 invalidate = FALSE;
2857 break;
[2]2858
[191]2859 case SB_LINERIGHT:
[551]2860 if (abs(ad->horzscroll) <= ad->maxx - rectl.xRight)
2861 ad->horzscroll -= ad->fattrs.lAveCharWidth;
[191]2862 else
2863 invalidate = FALSE;
2864 break;
[2]2865
[191]2866 case SB_LINELEFT:
[551]2867 if (ad->horzscroll < 0)
2868 ad->horzscroll += ad->fattrs.lAveCharWidth;
[191]2869 else
2870 invalidate = FALSE;
2871 break;
[2]2872
[191]2873 case SB_SLIDERTRACK:
[551]2874 ad->horzscroll = (SHORT1FROMMP(mp2) / ad->fattrs.lAveCharWidth) *
2875 ad->fattrs.lAveCharWidth;
2876 ad->horzscroll = -(ad->horzscroll);
2877 if (ad->horzscroll > 0)
2878 ad->horzscroll = 0;
2879 if (abs(ad->horzscroll) > (ad->maxx - rectl.xRight) +
2880 ad->fattrs.lAveCharWidth)
2881 ad->horzscroll = -(ad->maxx - rectl.xRight);
[191]2882 break;
[2]2883
[191]2884 default:
2885 invalidate = FALSE;
2886 break;
[2]2887 }
[191]2888 if (invalidate)
2889 WinInvalidateRect(hwnd, NULL, FALSE);
2890 }
2891 break;
[2]2892
[191]2893 case WM_VSCROLL:
[551]2894 if (ad && !ad->stopflag && ad->text && ad->numlines && !ad->busy &&
2895 !DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN)) {
[2]2896
[191]2897 ULONG numlines, wascursored;
2898 RECTL rcl;
[2]2899
[191]2900 WinQueryWindowRect(hwnd, &rcl);
2901 numlines = NumLines(&rcl, ad);
[551]2902 if (numlines) {
2903 wascursored = ad->cursored;
2904 switch (SHORT2FROMMP(mp2)) {
[191]2905 case SB_PAGEUP:
[551]2906 if (ad->topline > 1) {
2907 ad->topline -= numlines;
2908 if (ad->topline > ad->numlines ||
2909 ad->topline + numlines > (ad->numlines + 1))
2910 ad->topline = 1;
2911 if (ad->cursored > ad->topline + numlines)
2912 ad->cursored = ad->topline + numlines;
2913 if (ad->cursored > ad->numlines)
2914 ad->cursored = ad->numlines;
[191]2915 WinInvalidateRect(hwnd, NULL, FALSE);
2916 }
2917 break;
2918 case SB_PAGEDOWN:
[551]2919 if (ad->topline + numlines <= ad->numlines) {
2920 ad->topline += numlines;
2921 if (ad->topline + numlines > ad->numlines + 1)
2922 ad->topline = (ad->numlines + 1) - numlines;
2923 if (ad->cursored < ad->topline)
2924 ad->cursored = ad->topline;
2925 if (ad->cursored + 1 > ad->topline + numlines)
2926 ad->cursored = (ad->topline + numlines) - 1;
2927 if (ad->cursored > ad->numlines)
2928 ad->cursored = ad->numlines;
[191]2929 WinInvalidateRect(hwnd, NULL, FALSE);
2930 }
2931 break;
2932 case SB_LINEDOWN:
[551]2933 if (ad->topline + numlines <= ad->numlines) {
[2]2934
[191]2935 RECTL Rectl, iRectl;
[2]2936
[551]2937 ad->topline++;
2938 if (ad->cursored < ad->topline)
2939 ad->cursored = ad->topline;
2940 else if (ad->cursored + 1 > ad->topline + numlines)
2941 ad->cursored = (ad->topline + numlines) - 1;
2942 if (ad->cursored > ad->numlines)
2943 ad->cursored = ad->numlines;
[191]2944 WinQueryWindowRect(hwnd, &Rectl);
[551]2945 WinScrollWindow(hwnd, 0, ad->lMaxHeight,
[191]2946 NULL, NULL, NULLHANDLE, &iRectl, 0);
[551]2947 WinFillRect(ad->hps, &iRectl,
2948 standardcolors[ad->colors[COLORS_NORMALBACK]]);
2949 PaintLine(hwnd, ad->hps, (ad->topline + numlines) - 2,
2950 ad->topline, &Rectl);
2951 if (ad->cursored != ad->topline + numlines)
2952 PaintLine(hwnd, ad->hps, ad->cursored - 1, ad->topline, &Rectl);
2953 if (wascursored != ad->cursored &&
2954 wascursored < ad->topline + numlines &&
2955 wascursored >= ad->topline)
2956 PaintLine(hwnd, ad->hps, wascursored - 1, ad->topline, &Rectl);
2957 if (numlines >= ad->numlines)
[191]2958 numlines = 0;
[551]2959 if (ad->multiplier)
2960 WinSendMsg(ad->hvscroll, SBM_SETSCROLLBAR,
2961 MPFROMSHORT((SHORT) (ad->topline / ad->multiplier)),
2962 MPFROM2SHORT(1, (SHORT) ((ad->numlines + 1) /
2963 ad->multiplier) -
[191]2964 numlines));
[551]2965 WinSendMsg(ad->hhscroll, SBM_SETSCROLLBAR,
2966 MPFROMSHORT((SHORT) abs(ad->horzscroll)),
2967 MPFROM2SHORT(0, (SHORT) (ad->maxx - Rectl.xRight)));
[191]2968 }
2969 break;
2970 case SB_LINEUP:
[551]2971 if (ad->topline > 1) {
[2]2972
[191]2973 RECTL Rectl, iRectl;
[2]2974
[551]2975 ad->topline--;
2976 if (ad->cursored < ad->topline)
2977 ad->cursored = ad->topline;
2978 else if (ad->cursored + 1 > ad->topline + numlines)
2979 ad->cursored = (ad->topline + numlines) - 1;
2980 if (ad->cursored > ad->numlines)
2981 ad->cursored = ad->numlines;
[191]2982 WinQueryWindowRect(hwnd, &Rectl);
[551]2983 WinScrollWindow(hwnd, 0, -ad->lMaxHeight,
[191]2984 NULL, NULL, NULLHANDLE, &iRectl, 0);
[551]2985 WinFillRect(ad->hps, &iRectl,
2986 standardcolors[ad->colors[COLORS_NORMALBACK]]);
[191]2987 iRectl = Rectl;
[551]2988 iRectl.yTop -= ((numlines * ad->lMaxHeight) + ad->lMaxDescender);
2989 WinFillRect(ad->hps, &iRectl,
2990 standardcolors[ad->colors[COLORS_NORMALBACK]]);
2991 PaintLine(hwnd, ad->hps, ad->topline - 1, ad->topline, &Rectl);
2992 if (ad->cursored != ad->topline)
2993 PaintLine(hwnd, ad->hps, ad->cursored - 1, ad->topline, &Rectl);
2994 if (ad->cursored != wascursored &&
2995 wascursored >= ad->topline &&
2996 wascursored < ad->topline + numlines)
2997 PaintLine(hwnd, ad->hps, wascursored - 1, ad->topline, &Rectl);
2998 if (numlines >= ad->numlines)
[191]2999 numlines = 0;
[551]3000 if (ad->multiplier)
3001 WinSendMsg(ad->hvscroll, SBM_SETSCROLLBAR,
3002 MPFROMSHORT((SHORT) (ad->topline / ad->multiplier)),
3003 MPFROM2SHORT(1, (SHORT) ((ad->numlines + 1) /
3004 ad->multiplier) -
[191]3005 numlines));
[551]3006 WinSendMsg(ad->hhscroll, SBM_SETSCROLLBAR,
3007 MPFROMSHORT((SHORT) abs(ad->horzscroll)),
3008 MPFROM2SHORT(0, (SHORT) (ad->maxx - Rectl.xRight)));
[191]3009 }
3010 break;
3011 case SB_SLIDERTRACK:
[551]3012 if ((SHORT1FROMMP(mp2) >= 1) || (SHORT1FROMMP(mp2)) <= ad->numlines) {
3013 ad->topline = (ULONG) SHORT1FROMMP(mp2) * ad->multiplier;
3014 if (ad->topline + numlines > ad->numlines + 1)
3015 ad->topline = (ad->numlines + 1) - numlines;
3016 if (!ad->topline)
3017 ad->topline = 1;
3018 if (ad->cursored < ad->topline)
3019 ad->cursored = ad->topline;
3020 else if (ad->cursored > ad->topline + numlines)
3021 ad->cursored = ad->topline + numlines;
3022 if (ad->cursored > ad->numlines)
3023 ad->cursored = ad->numlines;
[191]3024 WinInvalidateRect(hwnd, NULL, FALSE);
3025 }
3026 else
3027 WinAlarm(HWND_DESKTOP, WA_NOTE);
3028 break;
3029 }
[551]3030 if (ad->cursored != wascursored)
[191]3031 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
[2]3032 }
[551]3033 DosReleaseMutexSem(ad->ScanSem);
[191]3034 }
3035 break;
[2]3036
[191]3037 case WM_INITMENU:
[551]3038 switch (SHORT1FROMMP(mp1)) {
[191]3039 case IDM_FILESMENU:
3040 {
3041 APIRET rc;
3042 SHORT sSelect;
[2]3043
[551]3044 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
3045 WinEnableMenuItem((HWND) mp2, IDM_SAVETOCLIP, (rc == 0 &&
3046 ad->selected != 0));
3047 WinEnableMenuItem((HWND) mp2, IDM_APPENDTOCLIP, (rc == 0 &&
3048 ad->selected != 0));
3049 WinEnableMenuItem((HWND) mp2, IDM_SAVETOLIST, (rc == 0 &&
3050 ad->selected != 0));
3051 sSelect = (SHORT) WinSendDlgItemMsg(ad->hwndFrame, NEWVIEW_LISTBOX,
3052 LM_QUERYITEMCOUNT, MPVOID,
3053 MPVOID);
3054 WinEnableMenuItem((HWND) mp2, IDM_SAVETOCLIP2,
3055 (rc == 0 && sSelect > 0));
3056 WinEnableMenuItem((HWND) mp2, IDM_APPENDTOCLIP2,
3057 (rc == 0 && sSelect > 0));
3058 WinEnableMenuItem((HWND) mp2, IDM_SAVETOLIST2,
3059 (rc == 0 && sSelect > 0));
[191]3060 if (!rc)
[551]3061 DosReleaseMutexSem(ad->ScanSem);
[191]3062 }
3063 break;
[2]3064
[191]3065 case IDM_VIEWSMENU:
3066 {
3067 APIRET rc;
[2]3068
[551]3069 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
3070 WinEnableMenuItem((HWND) mp2, IDM_FONTPALETTE, (rc == 0));
3071 WinEnableMenuItem((HWND) mp2, IDM_HEXMODE, (rc == 0));
3072 WinEnableMenuItem((HWND) mp2, IDM_WRAP, (rc == 0));
3073 WinEnableMenuItem((HWND) mp2, IDM_CODEPAGE, (rc == 0));
[191]3074 if (!rc)
[551]3075 DosReleaseMutexSem(ad->ScanSem);
[191]3076 }
[551]3077 WinCheckMenuItem((HWND) mp2, IDM_HEXMODE, ad->hex);
3078 WinCheckMenuItem((HWND) mp2, IDM_WRAP, ad->wrapon);
3079 WinCheckMenuItem((HWND) mp2, IDM_IGNOREFTP, ad->ignoreftp);
3080 WinCheckMenuItem((HWND) mp2, IDM_IGNOREHTTP, ad->ignorehttp);
[890]3081 WinCheckMenuItem((HWND) mp2, IDM_IGNOREMAIL, ad->ignoremail);
[191]3082 break;
[2]3083
[191]3084 case IDM_SEARCHMENU:
3085 {
3086 APIRET rc;
[2]3087
[551]3088 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
3089 WinEnableMenuItem((HWND) mp2, IDM_FINDFIRST, (rc == 0 &&
3090 ad->numlines != 0 &&
3091 ad->markedlines));
3092 WinEnableMenuItem((HWND) mp2, IDM_FINDNEXT, (rc == 0 &&
3093 ad->numlines != 0 &&
3094 ad->markedlines &&
3095 ad->found != 0));
3096 WinEnableMenuItem((HWND) mp2, IDM_FINDPREV, (rc == 0 &&
3097 ad->numlines != 0 &&
3098 ad->markedlines &&
3099 ad->found != 0));
3100 WinEnableMenuItem((HWND) mp2, IDM_NEXTBLANKLINE, (rc == 0 &&
3101 ad->numlines != 0 &&
3102 !ad->hex));
3103 WinEnableMenuItem((HWND) mp2, IDM_PREVBLANKLINE, (rc == 0 &&
3104 ad->numlines != 0 &&
3105 !ad->hex));
3106 WinEnableMenuItem((HWND) mp2, IDM_GOTOLINE, (rc == 0 &&
3107 ad->numlines != 0));
3108 WinEnableMenuItem((HWND) mp2, IDM_GOTOOFFSET, (rc == 0 &&
3109 ad->textsize != 0));
[191]3110 if (!rc)
[551]3111 DosReleaseMutexSem(ad->ScanSem);
[191]3112 }
3113 break;
[2]3114
[191]3115 case IDM_SELECTSUBMENU:
3116 {
3117 APIRET rc;
[2]3118
[551]3119 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
3120 WinEnableMenuItem((HWND) mp2, IDM_SELECTALL, (rc == 0 &&
3121 ad->numlines != 0 &&
3122 ad->markedlines &&
3123 (ad->selected !=
3124 ad->numlines ||
3125 !ad->selected)));
3126 WinEnableMenuItem((HWND) mp2, IDM_DESELECTALL, (rc == 0 &&
3127 ad->numlines != 0 &&
3128 ad->markedlines &&
3129 ad->selected != 0));
3130 WinEnableMenuItem((HWND) mp2, IDM_DESELECTFOUND, (rc == 0 &&
3131 ad->numlines != 0 &&
3132 ad->markedlines &&
3133 ad->selected != 0 &&
3134 ad->found != 0));
3135 WinEnableMenuItem((HWND) mp2, IDM_SELECTFOUND, (rc == 0 &&
3136 ad->numlines != 0 &&
3137 ad->markedlines &&
3138 ad->found != 0 &&
3139 (ad->numlines !=
3140 ad->selected ||
3141 !ad->selected)));
3142 WinEnableMenuItem((HWND) mp2, IDM_NEXTSELECTED, (rc == 0 &&
3143 ad->numlines != 0 &&
3144 ad->markedlines &&
3145 ad->selected != 0));
3146 WinEnableMenuItem((HWND) mp2, IDM_PREVSELECTED, (rc == 0 &&
3147 ad->numlines != 0 &&
3148 ad->markedlines &&
3149 ad->selected != 0));
3150 WinEnableMenuItem((HWND) mp2, IDM_INVERT, (rc == 0 &&
3151 ad->numlines != 0 &&
3152 ad->markedlines));
[191]3153 if (!rc)
[551]3154 DosReleaseMutexSem(ad->ScanSem);
[2]3155 }
3156 break;
[191]3157 }
3158 break;
[2]3159
[191]3160 case UM_CONTROL:
[551]3161 switch (SHORT1FROMMP(mp1)) {
[191]3162 case NEWVIEW_LISTBOX:
[551]3163 switch (SHORT2FROMMP(mp1)) {
[191]3164 case LN_SETFOCUS:
[551]3165 if (ad) {
3166 if (!ad->clientfocused) {
[191]3167 PostMsg(hwnd,
[551]3168 WM_COMMAND, MPFROM2SHORT(IDM_NEXTWINDOW, 0), MPVOID);
[191]3169 break;
3170 }
[551]3171 ad->clientfocused = FALSE;
[191]3172 }
3173 PostMsg(hwnd,
[551]3174 UM_CONTROL, MPFROM2SHORT(NEWVIEW_LISTBOX, LN_SELECT), MPVOID);
[191]3175 break;
3176 case LN_KILLFOCUS:
[551]3177 if (ad) {
3178 ad->clientfocused = TRUE;
[191]3179 WinSetFocus(HWND_DESKTOP, hwnd);
3180 }
3181 break;
3182 case LN_SELECT:
[551]3183 if (ad && !ad->dummy) {
[2]3184
[191]3185 ULONG linenum, numlines;
3186 SHORT sSelect;
[551]3187 HWND hwndUL = WinWindowFromID(ad->hwndFrame,
[191]3188 SHORT1FROMMP(mp1));
3189 RECTL Rectl;
[2]3190
[191]3191 sSelect = (SHORT) WinSendMsg(hwndUL,
3192 LM_QUERYSELECTION,
[551]3193 MPFROM2SHORT(LIT_FIRST, 0), MPVOID);
3194 if (sSelect >= 0) {
[191]3195 linenum = (ULONG) WinSendMsg(hwndUL,
3196 LM_QUERYITEMHANDLE,
[551]3197 MPFROM2SHORT(sSelect, 0), MPVOID);
3198 if (ad->topline != linenum + 1 && linenum < ad->numlines) {
[191]3199 WinQueryWindowRect(hwnd, &Rectl);
3200 numlines = NumLines(&Rectl, ad);
[551]3201 ad->topline = linenum + 1;
3202 if (ad->numlines - ad->topline < numlines)
3203 ad->topline = ad->numlines - numlines;
3204 ad->cursored = linenum + 1;
[191]3205 WinInvalidateRect(hwnd, NULL, FALSE);
3206 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
3207 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
3208 }
3209 }
3210 else
3211 PostMsg(hwndUL, LM_SELECTITEM, MPFROM2SHORT(0, 0),
3212 MPFROM2SHORT(TRUE, 0));
3213 }
3214 break;
[2]3215
[191]3216 case LN_ENTER:
[551]3217 if (ad) {
[2]3218
[191]3219 SHORT sSelect;
[551]3220 HWND hwndUL = WinWindowFromID(ad->hwndFrame,
[191]3221 SHORT1FROMMP(mp1));
[2]3222
[191]3223 sSelect = (SHORT) WinSendMsg(hwndUL,
3224 LM_QUERYSELECTION,
[551]3225 MPFROM2SHORT(LIT_FIRST, 0), MPVOID);
3226 if (sSelect >= 0) {
3227 ad->dummy = TRUE;
[191]3228 WinSendMsg(hwndUL, LM_DELETEITEM,
3229 MPFROM2SHORT(sSelect, 0), MPVOID);
[551]3230 ad->dummy = FALSE;
[191]3231 sSelect = (SHORT) WinSendMsg(hwndUL,
[551]3232 LM_QUERYITEMCOUNT, MPVOID, MPVOID);
3233 if (sSelect <= 0) {
3234 PostMsg(ad->hwndFrame, WM_UPDATEFRAME,
[191]3235 MPFROMLONG(FCF_SIZEBORDER), MPVOID);
3236 WinSetFocus(HWND_DESKTOP, hwnd);
3237 }
3238 }
3239 }
3240 break;
[2]3241
[191]3242 default:
3243 break;
[2]3244 }
[191]3245 break;
[2]3246
[191]3247 default:
3248 break;
3249 }
3250 return 0;
[2]3251
[191]3252 case WM_COMMAND:
[551]3253 switch (SHORT1FROMMP(mp1)) {
[191]3254 case IDM_EDIT:
[551]3255 if (*editor) {
[2]3256
[191]3257 CHAR *dummy[2];
[2]3258
[551]3259 dummy[0] = ad->filename;
[191]3260 dummy[1] = NULL;
[888]3261 ExecOnList(hwnd, editor, WINDOWED | SEPARATE, NULL, dummy, NULL,
3262 pszSrcFile, __LINE__);
[191]3263 }
3264 else
[551]3265 StartMLEEditor(ad->hwndParent, 4, ad->filename, ad->hwndFrame);
3266 ad->hwndRestore = (HWND) 0;
[191]3267 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
3268 break;
[2]3269
[191]3270 case IDM_IGNOREFTP:
[551]3271 ad->ignoreftp = (ad->ignoreftp) ? FALSE : TRUE;
3272 ad->ftpin = FALSE;
[890]3273 if (ad->text && (*ftprun || fFtpRunWPSDefault) &&
3274 !ad->ignoreftp && strstr(ad->text, "ftp://"))
[551]3275 ad->ftpin = TRUE;
3276 IgnoreFTP = ad->ignoreftp;
[191]3277 PrfWriteProfileData(fmprof, appname, "Viewer.IgnoreFTP",
[551]3278 &ad->ignoreftp, sizeof(BOOL));
[191]3279 WinInvalidateRect(hwnd, NULL, FALSE);
3280 break;
[2]3281
[191]3282 case IDM_IGNOREHTTP:
[551]3283 ad->ignorehttp = (ad->ignorehttp) ? FALSE : TRUE;
3284 ad->httpin = FALSE;
[890]3285 if (ad->text && (*httprun || fHttpRunWPSDefault) && !ad->ignorehttp &&
[551]3286 strstr(ad->text, "http://"))
3287 ad->httpin = TRUE;
3288 IgnoreHTTP = ad->ignorehttp;
[191]3289 PrfWriteProfileData(fmprof, appname, "Viewer.IgnoreHTTP",
[551]3290 &ad->ignorehttp, sizeof(BOOL));
[191]3291 WinInvalidateRect(hwnd, NULL, FALSE);
3292 break;
[2]3293
[890]3294 case IDM_IGNOREMAIL:
3295 ad->ignoremail = (ad->ignoremail) ? FALSE : TRUE;
3296 ad->mailin = FALSE;
3297 if (ad->text && *mailrun && !ad->ignoremail &&
3298 strstr(ad->text, "@"))
3299 ad->mailin = TRUE;
3300 IgnoreMail = ad->ignoremail;
3301 PrfWriteProfileData(fmprof, appname, "Viewer.IgnoreMail",
3302 &ad->ignoremail, sizeof(BOOL));
3303 WinInvalidateRect(hwnd, NULL, FALSE);
3304 break;
3305
[191]3306 case IDM_PREVBLANKLINE:
[551]3307 if (!ad->hex && ad->lines) {
[2]3308
[191]3309 ULONG x;
[2]3310
[551]3311 x = ad->cursored - 2;
3312 if (x >= ad->numlines)
[191]3313 x = 0;
[551]3314 while (x < ad->numlines &&
3315 (*ad->lines[x] == '\r' || *ad->lines[x] == '\n'))
[191]3316 x--;
[551]3317 if (x >= ad->numlines)
[191]3318 x = 0;
[551]3319 for (; x < ad->numlines; x--) {
3320 if (*ad->lines[x] == '\r' || *ad->lines[x] == '\n') {
3321 if (x < ad->numlines - 1)
[191]3322 x++;
3323 break;
3324 }
3325 }
[551]3326 if (x < ad->numlines) {
3327 ad->topline = ad->cursored = x;
[191]3328 WinInvalidateRect(hwnd, NULL, FALSE);
3329 }
3330 }
3331 break;
[2]3332
[191]3333 case IDM_NEXTBLANKLINE:
[551]3334 if (!ad->hex && ad->lines) {
[2]3335
[191]3336 ULONG x;
[2]3337
[551]3338 x = ad->cursored;
3339 while (x < ad->numlines &&
3340 (*ad->lines[x] == '\r' || *ad->lines[x] == '\n'))
[191]3341 x++;
[551]3342 for (; x < ad->numlines; x++) {
3343 if (*ad->lines[x] == '\r' || *ad->lines[x] == '\n') {
3344 if (x < ad->numlines - 1)
[191]3345 x++;
3346 break;
3347 }
3348 }
[551]3349 if (x < ad->numlines) {
3350 while (x < ad->numlines &&
3351 (*ad->lines[x] == '\r' || *ad->lines[x] == '\n'))
[191]3352 x++;
[551]3353 if (x < ad->numlines) {
3354 ad->topline = ad->cursored = x;
[191]3355 WinInvalidateRect(hwnd, NULL, FALSE);
3356 }
3357 }
3358 }
3359 break;
[2]3360
[191]3361 case IDM_VIEW:
3362 case IDM_OBJECT:
[551]3363 if (!ad->hex && ad->lines) {
[2]3364
[191]3365 CHAR line[CCHMAXPATH], filename[CCHMAXPATH], *p;
[2]3366
[551]3367 strncpy(line, ad->lines[ad->cursored - 1], CCHMAXPATH);
[191]3368 line[CCHMAXPATH - 1] = 0;
[368]3369 chop_at_crnl(line);
[551]3370 if (*line == '\"') {
[191]3371 memmove(line, line + 1, strlen(line));
3372 p = strchr(line, '\"');
3373 lstrip(line);
3374 if (p)
3375 *p = 0;
3376 rstrip(line);
3377 }
[551]3378 else {
[191]3379 lstrip(line);
3380 p = strchr(line, ' ');
3381 if (p)
3382 *p = 0;
3383 rstrip(line);
3384 }
[551]3385 if (!strchr(line, '\\') && !strchr(line, '/') && !strchr(line, ':')) {
3386 strcpy(filename, ad->filename);
[191]3387 p = strrchr(filename, '\\');
3388 if (p)
3389 p++;
3390 else
3391 p = filename;
3392 strcpy(p, line);
3393 }
3394 else
3395 strcpy(filename, line);
3396 MakeFullName(filename);
[551]3397 if (*filename && IsFile(filename) == 1) {
[191]3398 if (SHORT1FROMMP(mp1) == IDM_OBJECT)
[551]3399 OpenObject(filename, Default, ad->hwndFrame);
[191]3400 else
[551]3401 DefaultView(hwnd, ad->hwndFrame, HWND_DESKTOP, NULL, 0, filename);
[191]3402 }
3403 }
3404 break;
[2]3405
[191]3406 case IDM_COLORPALETTE:
3407 {
3408 COLORS co;
3409 LONG temp[COLORS_MAX];
[2]3410
[191]3411 memset(&co, 0, sizeof(co));
3412 co.size = sizeof(co);
3413 co.numcolors = COLORS_MAX;
[551]3414 co.colors = ad->colors;
[191]3415 co.descriptions = IDS_NVCOLORS1TEXT;
3416 co.origs = temp;
3417 co.prompt = IDS_NVCOLORSPROMPTTEXT;
[551]3418 memcpy(temp, ad->colors, sizeof(LONG) * COLORS_MAX);
[191]3419 if (WinDlgBox(HWND_DESKTOP,
3420 hwnd,
3421 ColorDlgProc,
[551]3422 FM3ModHandle, COLOR_FRAME, (PVOID) & co)) {
3423 memcpy(Colors, ad->colors, sizeof(LONG) * COLORS_MAX);
[191]3424 PrfWriteProfileData(fmprof,
3425 appname,
3426 "Viewer.Colors",
[551]3427 &ad->colors, sizeof(LONG) * COLORS_MAX);
3428 WinInvalidateRect(hwnd, NULL, FALSE);
3429 WinInvalidateRect(ad->hwndStatus1, NULL, FALSE);
3430 WinInvalidateRect(ad->hwndStatus2, NULL, FALSE);
3431 WinInvalidateRect(ad->hwndStatus3, NULL, FALSE);
[191]3432 }
3433 }
3434 break;
[2]3435
[191]3436 case IDM_NEXTWINDOW:
3437 case IDM_PREVWINDOW:
3438 {
3439 SHORT sSelect;
[2]3440
[551]3441 sSelect = (SHORT) WinSendDlgItemMsg(ad->hwndFrame,
[191]3442 NEWVIEW_LISTBOX,
3443 LM_QUERYITEMCOUNT,
[551]3444 MPVOID, MPVOID);
3445 if (sSelect) {
3446 if (!ad->clientfocused)
[191]3447 WinSetFocus(HWND_DESKTOP, hwnd);
3448 else
3449 WinSetFocus(HWND_DESKTOP,
[551]3450 WinWindowFromID(ad->hwndFrame, NEWVIEW_LISTBOX));
[191]3451 }
3452 else
3453 WinSetFocus(HWND_DESKTOP, hwnd);
3454 }
3455 break;
[2]3456
[191]3457 case IDM_FINDFIRST:
3458 {
3459 APIRET rc;
[2]3460
[551]3461 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
3462 if (!rc) {
3463 if (!ad->busy && ad->text && ad->numlines && ad->markedlines) {
[2]3464
[191]3465 ULONG numlines;
3466 RECTL Rectl;
3467 static char test[SEARCHSTRINGLEN];
[2]3468
[191]3469 WinQueryWindowRect(hwnd, &Rectl);
3470 numlines = NumLines(&Rectl, ad);
3471 if (!numlines)
3472 break;
[551]3473 strcpy(test, ad->searchtext);
[191]3474 if (WinDlgBox(HWND_DESKTOP, hwnd, FindStrDlgProc, FM3ModHandle,
[551]3475 NEWFIND_FRAME, (PVOID) & hwnd)) {
3476 if (*ad->searchtext && strcmp(test, ad->searchtext))
[191]3477 PrfWriteProfileString(fmprof,
3478 appname,
3479 "Viewer.Searchtext",
[551]3480 (PVOID) ad->searchtext);
3481 if (_beginthread(SearchThread, NULL, 524288, (PVOID) hwnd) ==
3482 -1)
3483 Runtime_Error(pszSrcFile, __LINE__,
3484 GetPString(IDS_COULDNTSTARTTHREADTEXT));
[191]3485 }
3486 }
[551]3487 DosReleaseMutexSem(ad->ScanSem);
[191]3488 }
3489 }
3490 break;
[2]3491
[191]3492 case IDM_PREVSELECTED:
3493 case IDM_NEXTSELECTED:
3494 case IDM_FINDPREV:
3495 case IDM_FINDNEXT:
3496 {
3497 APIRET rc;
[2]3498
[551]3499 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
3500 if (!rc) {
3501 if (!ad->busy && ad->text && ad->markedlines) {
[2]3502
[191]3503 RECTL Rectl;
3504 register ULONG x;
3505 ULONG numlines;
3506 CHAR markedwith;
[2]3507
[191]3508 markedwith = (SHORT1FROMMP(mp1) == IDM_FINDNEXT ||
3509 SHORT1FROMMP(mp1) == IDM_FINDPREV) ?
3510 VF_FOUND : VF_SELECTED;
3511 WinQueryWindowRect(hwnd, &Rectl);
3512 numlines = NumLines(&Rectl, ad);
3513 if (!numlines)
3514 break;
3515 WinSetPointer(HWND_DESKTOP, hptrBusy);
3516 if (SHORT1FROMMP(mp1) == IDM_PREVSELECTED ||
[551]3517 SHORT1FROMMP(mp1) == IDM_FINDPREV) {
3518 for (x = ad->cursored - 2; x < ULONG_MAX - 1; x--) {
3519 if (ad->markedlines[x] & markedwith) {
3520 ad->topline = x + 1;
3521 if (ad->numlines - ad->topline < numlines)
3522 ad->topline = ad->numlines - numlines;
3523 ad->cursored = x + 1;
[191]3524 WinInvalidateRect(hwnd, NULL, FALSE);
3525 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
3526 break;
3527 }
3528 }
3529 }
[551]3530 else {
3531 for (x = ad->cursored; x < ad->numlines; x++) {
3532 if (ad->markedlines[x] & markedwith) {
3533 ad->topline = x + 1;
3534 if (ad->numlines - ad->topline < numlines)
3535 ad->topline = ad->numlines - numlines;
3536 ad->cursored = x + 1;
[191]3537 WinInvalidateRect(hwnd, NULL, FALSE);
3538 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
3539 break;
3540 }
3541 }
3542 }
3543 WinSetPointer(HWND_DESKTOP, hptrArrow);
[551]3544 if (x >= ad->numlines)
[191]3545 DosBeep(50, 100);
3546 }
[551]3547 DosReleaseMutexSem(ad->ScanSem);
[191]3548 }
3549 }
3550 break;
[2]3551
[191]3552 case IDM_SELECTFOUND:
3553 case IDM_DESELECTFOUND:
3554 {
3555 APIRET rc;
[2]3556
[551]3557 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
3558 if (!rc) {
3559 if (!ad->busy && ad->text && ad->markedlines) {
[2]3560
[191]3561 RECTL Rectl;
3562 register ULONG x;
3563 ULONG numlines;
[2]3564
[191]3565 WinQueryWindowRect(hwnd, &Rectl);
3566 numlines = NumLines(&Rectl, ad);
3567 if (!numlines)
3568 break;
3569 WinSetPointer(HWND_DESKTOP, hptrBusy);
[551]3570 for (x = 0; x < ad->numlines; x++) {
3571 if (SHORT1FROMMP(mp1) == IDM_SELECTFOUND) {
3572 if ((ad->markedlines[x] & VF_FOUND) &&
3573 !(ad->markedlines[x] & VF_SELECTED)) {
3574 ad->markedlines[x] |= VF_SELECTED;
3575 ad->selected++;
[191]3576 }
3577 }
[551]3578 else {
3579 if ((ad->markedlines[x] & VF_FOUND) &&
3580 (ad->markedlines[x] & VF_SELECTED)) {
3581 ad->markedlines[x] &= (~VF_SELECTED);
3582 ad->selected--;
[191]3583 }
3584 }
3585 }
3586 WinSendMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
3587 WinSetPointer(HWND_DESKTOP, hptrArrow);
3588 WinInvalidateRect(hwnd, NULL, FALSE);
3589 }
[551]3590 DosReleaseMutexSem(ad->ScanSem);
[191]3591 }
3592 }
3593 break;
[2]3594
[191]3595 case IDM_GOTOLINE:
3596 case IDM_GOTOOFFSET:
3597 {
3598 APIRET rc;
[2]3599
[551]3600 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
3601 if (!rc) {
3602 if (!ad->busy && ad->numlines) {
[2]3603
[191]3604 ULONG numlines, linenum;
3605 CHAR s[34], ss[134];
3606 STRINGINPARMS sip;
3607 RECTL Rectl;
3608 register ULONG x;
[2]3609
[191]3610 WinQueryWindowRect(hwnd, &Rectl);
3611 numlines = NumLines(&Rectl, ad);
3612 if (!numlines)
3613 break;
[551]3614 if (ad->numlines <= numlines) {
[191]3615 DosBeep(500, 100);
3616 break;
3617 }
3618 sip.help = (SHORT1FROMMP(mp1) == IDM_GOTOLINE) ?
[551]3619 GetPString(IDS_NVLINEJUMPTEXT) : GetPString(IDS_NVBYTEJUMPTEXT);
[191]3620 sip.ret = s;
3621 *s = 0;
3622 sip.prompt = ss;
3623 sip.inputlen = 34;
3624 sip.title = (SHORT1FROMMP(mp1) == IDM_GOTOLINE) ?
3625 GetPString(IDS_NVLINEJUMPTITLETEXT) :
3626 GetPString(IDS_NVBYTEJUMPTITLETEXT);
3627 sprintf(sip.prompt,
3628 GetPString(IDS_NVJUMPTEXT),
3629 (SHORT1FROMMP(mp1) == IDM_GOTOLINE) ?
3630 GetPString(IDS_LINETEXT) :
3631 GetPString(IDS_OFFSETTEXT),
3632 (SHORT1FROMMP(mp1) == IDM_GOTOLINE) ?
3633 1 :
3634 0,
3635 (SHORT1FROMMP(mp1) == IDM_GOTOLINE) ?
[551]3636 ad->numlines : ad->textsize - 1);
[191]3637 WinDlgBox(HWND_DESKTOP,
[551]3638 hwnd, InputDlgProc, FM3ModHandle, STR_FRAME, &sip);
3639 if (*s) {
[191]3640 s[33] = 0;
3641 linenum = atol(s);
[551]3642 switch (SHORT1FROMMP(mp1)) {
[191]3643 case IDM_GOTOLINE:
[551]3644 if (linenum > 0 && linenum <= ad->numlines) {
3645 ad->topline = linenum;
3646 ad->cursored = ad->topline;
3647 if (ad->numlines - ad->topline < numlines)
3648 ad->topline = (ad->numlines - numlines) + 1;
3649 WinInvalidateRect(hwnd, NULL, FALSE);
[191]3650 }
3651 break;
3652 case IDM_GOTOOFFSET:
[551]3653 if (linenum < ad->textsize) {
3654 if (ad->hex)
3655 ad->topline = (linenum / 16) + 1;
3656 else if (ad->lines) {
3657 ad->topline = (ULONG) - 1;
3658 for (x = 0; x < ad->numlines; x++) {
3659 if (ad->lines[x] > ad->text + linenum) {
3660 ad->topline = x + 1;
[191]3661 break;
3662 }
3663 }
[551]3664 if (ad->topline == (ULONG) - 1)
3665 ad->topline = ad->numlines;
[191]3666 }
[551]3667 ad->cursored = ad->topline;
3668 if (ad->numlines - ad->topline < numlines)
3669 ad->topline = (ad->numlines - numlines) + 1;
3670 WinInvalidateRect(hwnd, NULL, FALSE);
[191]3671 }
3672 break;
3673 }
3674 }
[551]3675 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
[191]3676 }
[551]3677 DosReleaseMutexSem(ad->ScanSem);
[191]3678 }
3679 }
3680 break;
[2]3681
[191]3682 case IDM_CODEPAGE:
3683 {
3684 INT cp;
[2]3685
[191]3686 cp = PickCodepage(hwnd);
[551]3687 if (cp != -1) {
3688 ad->fattrs.usCodePage = (USHORT) cp;
3689 Codepage = ad->fattrs.usCodePage;
[191]3690 PrfWriteProfileData(fmprof,
3691 appname,
3692 "Viewer.Codepage",
[551]3693 &ad->fattrs.usCodePage, sizeof(USHORT));
3694 GpiDeleteSetId(ad->hps, FIXED_FONT_LCID);
3695 GpiAssociate(ad->hps, 0);
3696 GpiDestroyPS(ad->hps);
3697 ad->hps = InitWindow(hwnd);
3698 WinSendMsg(hwnd, UM_SETUP3, MPVOID, MPVOID);
3699 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
3700 WinInvalidateRect(hwnd, NULL, FALSE);
[191]3701 }
3702 }
3703 break;
[2]3704
[191]3705 case IDM_SAVETOLIST2:
3706 case IDM_SAVETOCLIP2:
3707 case IDM_APPENDTOCLIP2:
3708 case IDM_SAVETOLIST:
3709 case IDM_SAVETOCLIP:
3710 case IDM_APPENDTOCLIP:
3711 {
3712 APIRET rc;
[2]3713
[551]3714 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
3715 if (!rc) {
3716 if (!ad->busy) {
3717 ad->cliptype = SHORT1FROMMP(mp1);
3718 if (_beginthread(ClipboardThread, NULL, 524288, (PVOID) hwnd) ==
3719 -1)
3720 Runtime_Error(pszSrcFile, __LINE__,
3721 GetPString(IDS_COULDNTSTARTTHREADTEXT));
[191]3722 }
[551]3723 DosReleaseMutexSem(ad->ScanSem);
[191]3724 }
3725 }
3726 break;
[2]3727
[191]3728 case IDM_SELECTALL:
3729 case IDM_DESELECTALL:
3730 case IDM_INVERT:
3731 {
3732 APIRET rc;
[2]3733
[551]3734 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
3735 if (!rc) {
3736 if (!ad->busy && ad->markedlines) {
[2]3737
[191]3738 register ULONG x;
[2]3739
[551]3740 for (x = 0; x < ad->numlines; x++) {
3741 switch (SHORT1FROMMP(mp1)) {
[191]3742 case IDM_SELECTALL:
[551]3743 if (!(ad->markedlines[x] & VF_SELECTED)) {
3744 ad->markedlines[x] |= VF_SELECTED;
3745 ad->selected++;
[191]3746 }
3747 break;
3748 case IDM_DESELECTALL:
[551]3749 if (ad->markedlines[x] & VF_SELECTED) {
3750 ad->markedlines[x] &= (~VF_SELECTED);
3751 ad->selected--;
[191]3752 }
3753 break;
3754 case IDM_INVERT:
[551]3755 if (ad->markedlines[x] & VF_SELECTED) {
3756 ad->markedlines[x] &= (~VF_SELECTED);
3757 ad->selected--;
[191]3758 }
[551]3759 else {
3760 ad->markedlines[x] |= VF_SELECTED;
3761 ad->selected++;
[191]3762 }
3763 break;
3764 }
3765 }
3766 WinSendMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
3767 WinInvalidateRect(hwnd, NULL, FALSE);
3768 }
[551]3769 DosReleaseMutexSem(ad->ScanSem);
[191]3770 }
3771 }
3772 break;
[2]3773
[191]3774 case IDM_WRAP:
3775 {
3776 APIRET rc;
[2]3777
[551]3778 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
3779 if (!rc) {
3780 if (!ad->busy) {
3781 ad->wrapon = ad->wrapon ? FALSE : TRUE;
3782 WrapOn = ad->wrapon;
[191]3783 PrfWriteProfileData(fmprof, appname, "Viewer.WrapOn",
[551]3784 &ad->wrapon, sizeof(BOOL));
[191]3785 PostMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
3786 PostMsg(hwnd, UM_SETUP3, MPVOID, MPVOID);
3787 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
[551]3788 if (WinSendDlgItemMsg(ad->hwndFrame, NEWVIEW_LISTBOX,
[191]3789 LM_QUERYITEMCOUNT, MPVOID, MPVOID))
[551]3790 WinSendDlgItemMsg(ad->hwndFrame, NEWVIEW_LISTBOX, LM_DELETEALL,
[191]3791 MPVOID, MPVOID);
[551]3792 ad->oldwidth = -1;
3793 WinSendMsg(ad->hvscroll, SBM_SETTHUMBSIZE,
3794 MPFROM2SHORT(1, 1), MPVOID);
3795 WinSendMsg(ad->hvscroll, SBM_SETSCROLLBAR,
[191]3796 MPFROMSHORT(1), MPFROM2SHORT(1, 1));
[551]3797 WinSendMsg(ad->hhscroll, SBM_SETTHUMBSIZE,
3798 MPFROM2SHORT(1, 1), MPVOID);
3799 WinSendMsg(ad->hhscroll, SBM_SETSCROLLBAR,
[191]3800 MPFROMSHORT(1), MPFROM2SHORT(1, 1));
[551]3801 WinSendMsg(ad->hwndFrame, WM_UPDATEFRAME,
[191]3802 MPFROMLONG(FCF_SIZEBORDER), MPVOID);
3803 WinInvalidateRect(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
3804 NEWVIEW_DRAG), NULL, FALSE);
[818]3805 //WinInvalidateRect(ad->hhscroll, NULL, FALSE);
[191]3806 }
[551]3807 DosReleaseMutexSem(ad->ScanSem);
[191]3808 }
3809 }
3810 break;
[2]3811
[191]3812 case IDM_HEXMODE:
3813 {
3814 APIRET rc;
[2]3815
[551]3816 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
3817 if (!rc) {
3818 if (!ad->busy) {
3819 ad->hex = (ad->hex) ? FALSE : TRUE;
[191]3820 WinEnableWindow(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
[551]3821 IDM_NEXTBLANKLINE), !ad->hex);
[191]3822 WinEnableWindow(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
[551]3823 IDM_PREVBLANKLINE), !ad->hex);
[191]3824 PostMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
3825 PostMsg(hwnd, UM_SETUP3, MPVOID, MPVOID);
3826 PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID);
[551]3827 if (WinSendDlgItemMsg(ad->hwndFrame, NEWVIEW_LISTBOX,
[191]3828 LM_QUERYITEMCOUNT, MPVOID, MPVOID))
[551]3829 WinSendDlgItemMsg(ad->hwndFrame, NEWVIEW_LISTBOX, LM_DELETEALL,
[191]3830 MPVOID, MPVOID);
[551]3831 ad->oldwidth = -1;
3832 WinSendMsg(ad->hvscroll, SBM_SETTHUMBSIZE,
3833 MPFROM2SHORT(1, 1), MPVOID);
3834 WinSendMsg(ad->hvscroll, SBM_SETSCROLLBAR,
[191]3835 MPFROMSHORT(1), MPFROM2SHORT(1, 1));
[551]3836 WinSendMsg(ad->hhscroll, SBM_SETTHUMBSIZE,
3837 MPFROM2SHORT(1, 1), MPVOID);
3838 WinSendMsg(ad->hhscroll, SBM_SETSCROLLBAR,
[191]3839 MPFROMSHORT(1), MPFROM2SHORT(1, 1));
[551]3840 WinSendMsg(ad->hwndFrame, WM_UPDATEFRAME,
[191]3841 MPFROMLONG(FCF_SIZEBORDER), MPVOID);
3842 WinInvalidateRect(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
3843 NEWVIEW_DRAG), NULL, FALSE);
[818]3844 //WinInvalidateRect(ad->hhscroll, NULL, FALSE);
[191]3845 }
[551]3846 DosReleaseMutexSem(ad->ScanSem);
[191]3847 }
3848 }
3849 break;
[2]3850
[191]3851 case IDM_FONTPALETTE:
3852 {
3853 APIRET rc;
[2]3854
[551]3855 rc = DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN);
3856 if (!rc) {
3857 SetMLEFont(hwnd, &ad->fattrs, 11);
[191]3858 PrfWriteProfileData(fmprof, appname, "Viewer.Fattrs",
[551]3859 &ad->fattrs, sizeof(FATTRS));
3860 Fattrs = ad->fattrs;
3861 GpiDeleteSetId(ad->hps, FIXED_FONT_LCID);
3862 GpiAssociate(ad->hps, 0);
3863 GpiDestroyPS(ad->hps);
3864 ad->hps = InitWindow(hwnd);
3865 DosReleaseMutexSem(ad->ScanSem);
[191]3866 WinSendMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
3867 WinInvalidateRect(hwnd, NULL, FALSE);
3868 }
[2]3869 }
3870 break;
3871
[191]3872 case IDM_HELP:
3873 if (hwndHelp)
3874 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
[551]3875 MPFROM2SHORT(HELP_NEWVIEW, 0), MPFROMSHORT(HM_RESOURCEID));
[2]3876 break;
[191]3877 }
3878 return 0;
[2]3879
[191]3880 case WM_SETFOCUS:
3881 if (mp2)
3882 WinSendMsg(hwnd, UM_SETUP5, MPVOID, MPVOID);
[551]3883 if (mp2 && ad && ad->needrefreshing && !ad->stopflag &&
3884 !DosRequestMutexSem(ad->ScanSem, SEM_IMMEDIATE_RETURN)) {
3885 ad->needrefreshing = FALSE;
3886 DosReleaseMutexSem(ad->ScanSem);
[191]3887 WinInvalidateRect(hwnd, NULL, TRUE);
3888 }
3889 break;
[2]3890
[191]3891 case WM_SIZE:
[551]3892 if (SHORT1FROMMP(mp2) && SHORT2FROMMP(mp2)) {
[191]3893 PostMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
3894 PostMsg(hwnd, UM_SETUP3, MPVOID, MPVOID);
3895 }
3896 break;
[2]3897
[191]3898 case WM_SAVEAPPLICATION:
[551]3899 if (ad && ParentIsDesktop(hwnd, ad->hwndParent)) {
[2]3900
[191]3901 SWP swp;
[2]3902
[551]3903 WinQueryWindowPos(ad->hwndFrame, &swp);
[191]3904 if (!(swp.fl & (SWP_HIDE | SWP_MINIMIZE | SWP_MAXIMIZE)))
3905 PrfWriteProfileData(fmprof,
[551]3906 appname, "NewViewSizePos", &swp, sizeof(swp));
[191]3907 }
3908 break;
[2]3909
[191]3910 case WM_CLOSE:
3911 if (ad)
[551]3912 ad->stopflag = 1;
[191]3913 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
3914 return 0;
[2]3915
[191]3916 case WM_DESTROY:
3917 {
3918 BOOL dontclose = FALSE;
[551]3919 HWND hwndRestore = (HWND) 0;
[2]3920
[191]3921 WinStopTimer(WinQueryAnchorBlock(hwnd), hwnd, ID_TIMER5);
[551]3922 if (ad) {
3923 ad->stopflag = 1;
3924 if (ad->ScanSem) {
[771]3925 DosRequestMutexSem(ad->ScanSem, 15000);
[551]3926 DosCloseMutexSem(ad->ScanSem);
[191]3927 }
[551]3928 if (ad->busy)
[771]3929 DosSleep(100); //05 Aug 07 GKY 128
[551]3930 if (ad->hps) {
3931 GpiDeleteSetId(ad->hps, FIXED_FONT_LCID);
3932 GpiAssociate(ad->hps, 0);
3933 GpiDestroyPS(ad->hps);
[191]3934 }
[551]3935 hwndRestore = ad->hwndRestore;
3936 dontclose = ((ad->flags & 4) != 0) ? TRUE : FALSE;
[191]3937 FreeViewerMem(hwnd);
3938 WinSetWindowPtr(hwnd, QWL_USER, NULL);
3939 free(ad);
[2]3940 }
[551]3941 if (hwndRestore && hwndRestore != HWND_DESKTOP) {
[191]3942
3943 ULONG fl = SWP_SHOW | SWP_ACTIVATE | SWP_ZORDER;
3944 SWP swp;
3945
[551]3946 if (WinQueryWindowPos(hwndRestore, &swp)) {
[191]3947 if (!(swp.fl & SWP_MAXIMIZE))
3948 fl |= SWP_RESTORE;
3949 WinSetWindowPos(hwndRestore, HWND_TOP, 0, 0, 0, 0, fl);
3950 }
3951 }
3952 if (!dontclose &&
3953 ParentIsDesktop(hwnd, WinQueryWindow(WinQueryWindow(hwnd,
[551]3954 QW_PARENT),
3955 QW_PARENT))) {
3956 if (!PostMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID))
[191]3957 DosExit(EXIT_PROCESS, 1);
3958 }
3959 }
3960 break;
[2]3961 }
3962
[191]3963 return WinDefWindowProc(hwnd, msg, mp1, mp2);
[2]3964}
3965
[191]3966HWND StartViewer(HWND hwndParent, USHORT flags, CHAR * filename,
3967 HWND hwndRestore)
[83]3968{
[551]3969 HWND hwndFrame = (HWND) 0, hwndClient;
[191]3970 VIEWDATA *ad;
3971 ULONG FrameFlags = FCF_TITLEBAR | FCF_SYSMENU |
[551]3972 FCF_SIZEBORDER | FCF_MINMAX |
3973 FCF_NOBYTEALIGN | FCF_VERTSCROLL |
3974 FCF_MENU | FCF_ICON | FCF_ACCELTABLE | FCF_HORZSCROLL;
[2]3975
[191]3976 if (strcmp(realappname, FM3Str))
[2]3977 hwndParent = HWND_DESKTOP;
[191]3978 if (ParentIsDesktop(hwndParent, hwndParent))
[2]3979 FrameFlags |= FCF_TASKLIST;
[858]3980 // saymsg(MB_ENTER,HWND_DESKTOP,DEBUG_STRING,"\"%s\"\r\rparent %s desktop",filename,(ParentIsDesktop(hwndParent,hwndParent)) ? "is" : "isn't");
[2]3981 hwndFrame = WinCreateStdWindow(hwndParent,
[191]3982 0,
3983 &FrameFlags,
[593]3984 WC_NEWVIEW,
[191]3985 GetPString(IDS_FM2VIEWERTITLETEXT),
3986 fwsAnimate,
[551]3987 FM3ModHandle, NEWVIEW_FRAME, &hwndClient);
3988 if (hwndFrame) {
[2]3989
[191]3990 HWND hwndMenu = WinWindowFromID(hwndFrame, FID_MENU);
[2]3991
[551]3992 if (!fToolbar && hwndMenu) {
[191]3993 WinSendMsg(hwndMenu, MM_DELETEITEM,
3994 MPFROM2SHORT(IDM_FINDFIRST, FALSE), MPVOID);
3995 WinSendMsg(hwndMenu, MM_DELETEITEM,
3996 MPFROM2SHORT(IDM_FINDNEXT, FALSE), MPVOID);
3997 WinSendMsg(hwndMenu, MM_DELETEITEM,
3998 MPFROM2SHORT(IDM_FINDPREV, FALSE), MPVOID);
3999 WinSendMsg(hwndMenu, MM_DELETEITEM,
4000 MPFROM2SHORT(IDM_SAVETOCLIP, FALSE), MPVOID);
[2]4001 }
[551]4002 ad = xmallocz(sizeof(VIEWDATA), pszSrcFile, __LINE__);
[350]4003 if (!ad) {
4004 WinDestroyWindow(hwndFrame);
[858]4005 hwndFrame = (HWND)0;
[350]4006 }
4007 else {
[551]4008 ad->size = sizeof(VIEWDATA);
4009 ad->stopflag = 0;
4010 ad->multiplier = 1;
4011 ad->hwndRestore = hwndRestore;
4012 ad->hwndFrame = hwndFrame;
4013 ad->hwndParent = hwndParent;
4014 ad->clientfocused = TRUE;
4015 ad->oldwidth = -1;
4016 strcpy(ad->filename, filename);
4017 ad->flags = flags;
4018 if (ad->flags & 16)
4019 ad->hex = TRUE;
[191]4020 WinSetWindowPtr(hwndClient, QWL_USER, (PVOID) ad);
[551]4021 if (Firsttime) {
[2]4022
[191]4023 ULONG size;
[2]4024
[191]4025 size = sizeof(BOOL);
4026 PrfQueryProfileData(fmprof, appname, "Viewer.Sensitive",
4027 (PVOID) & Sensitive, &size);
4028 size = sizeof(USHORT);
4029 PrfQueryProfileData(fmprof, appname, "Viewer.Codepage",
4030 (PVOID) & Codepage, &size);
4031 size = sizeof(BOOL);
4032 PrfQueryProfileData(fmprof, appname, "Viewer.LiteralSearch",
4033 (PVOID) & LiteralSearch, &size);
4034 size = sizeof(BOOL);
4035 PrfQueryProfileData(fmprof, appname, "Viewer.AlsoSelect",
4036 (PVOID) & AlsoSelect, &size);
4037 size = sizeof(BOOL);
4038 PrfQueryProfileData(fmprof, appname, "Viewer.WrapOn",
4039 (PVOID) & WrapOn, &size);
4040 size = sizeof(BOOL);
4041 PrfQueryProfileData(fmprof, appname, "Viewer.IgnoreFTP",
4042 (PVOID) & IgnoreFTP, &size);
4043 size = sizeof(BOOL);
4044 PrfQueryProfileData(fmprof, appname, "Viewer.IgnoreHTTP",
[890]4045 (PVOID) & IgnoreHTTP, &size);
4046 size = sizeof(BOOL);
4047 PrfQueryProfileData(fmprof, appname, "Viewer.IgnoreMail",
4048 (PVOID) & IgnoreMail, &size);
[191]4049 memset(&Fattrs, 0, sizeof(FATTRS));
4050 size = sizeof(FATTRS);
4051 Fattrs.usRecordLength = sizeof(FATTRS);
4052 Fattrs.lMaxBaselineExt = 16;
4053 Fattrs.lAveCharWidth = 8;
4054 Fattrs.usCodePage = Codepage;
4055 strcpy(Fattrs.szFacename, GetPString(IDS_SYSMONOTEXT));
4056 PrfQueryProfileData(fmprof, appname, "Viewer.Fattrs",
4057 (PVOID) & Fattrs, &size);
4058 size = sizeof(LONG) * COLORS_MAX;
4059 PrfQueryProfileData(fmprof, appname, "Viewer.Colors",
4060 (PVOID) Colors, &size);
4061 Firsttime = FALSE;
[2]4062 }
4063 {
[551]4064 ULONG size = sizeof(ad->searchtext);
[191]4065
4066 PrfQueryProfileData(fmprof, appname, "Viewer.Searchtext",
[551]4067 (PVOID) ad->searchtext, &size);
4068 ad->searchtext[sizeof(ad->searchtext) - 1] = 0;
[2]4069 }
[551]4070 ad->sensitive = Sensitive;
4071 ad->literalsearch = LiteralSearch;
4072 ad->fattrs = Fattrs;
4073 ad->alsoselect = AlsoSelect;
4074 ad->fattrs.usCodePage = Codepage;
4075 ad->wrapon = WrapOn;
4076 ad->ignorehttp = IgnoreHTTP;
4077 ad->ignoreftp = IgnoreFTP;
[890]4078 ad->ignoremail = IgnoreMail;
[551]4079 memcpy(ad->colors, Colors, sizeof(LONG) * COLORS_MAX);
[191]4080 WinSetWindowPtr(hwndClient, QWL_USER, (PVOID) ad);
[350]4081 if (!WinSendMsg(hwndClient, UM_SETUP, MPVOID, MPVOID))
[551]4082 hwndFrame = (HWND) 0;
[350]4083 else {
[812]4084 //DosSleep(32);
[551]4085 if (!(FrameFlags & FCF_TASKLIST) && !(flags & 2)) {
[191]4086 SWP swp;
[551]4087
[191]4088 FillClient(hwndParent, &swp, NULL, FALSE);
4089 WinSetWindowPos(hwndFrame, HWND_TOP, swp.x, swp.y, swp.cx, swp.cy,
4090 SWP_SIZE | SWP_MOVE | SWP_SHOW | SWP_RESTORE |
4091 SWP_ZORDER | SWP_ACTIVATE);
4092 }
[551]4093 else if (FrameFlags & FCF_TASKLIST) {
[2]4094
[191]4095 SWP swp, swpD;
4096 ULONG size = sizeof(swp);
4097 LONG cxScreen, cyScreen;
[2]4098
[191]4099 WinQueryTaskSizePos(WinQueryAnchorBlock(hwndFrame), 0, &swp);
4100 if (PrfQueryProfileData(fmprof,
[551]4101 appname, "NewViewSizePos", &swpD, &size)) {
[191]4102 cxScreen = WinQuerySysValue(HWND_DESKTOP, SV_CXSCREEN);
4103 cyScreen = WinQuerySysValue(HWND_DESKTOP, SV_CYSCREEN);
4104 if (swp.x + swpD.cx > cxScreen)
4105 swp.x = cxScreen - swpD.cx;
4106 if (swp.y + swpD.cy > cyScreen)
4107 swp.y = cyScreen - swpD.cy;
4108 swp.cx = swpD.cx;
4109 swp.cy = swpD.cy;
4110 }
4111 WinSetWindowPos(hwndFrame, HWND_TOP, swp.x, swp.y, swp.cx, swp.cy,
4112 SWP_SIZE | SWP_MOVE | SWP_SHOW | SWP_ZORDER |
4113 SWP_ACTIVATE);
4114 }
[2]4115 }
4116 }
4117 }
4118 return hwndFrame;
4119}
[793]4120
4121#pragma alloc_text(NEWVIEW,ViewStatusProc,FreeViewerMem,LoadFileThread)
4122#pragma alloc_text(NEWVIEW,InitWindow,PaintLine,ViewWndProc)
4123#pragma alloc_text(NEWVIEW,ViewFrameWndProc,StartViewer,ReLineThread)
4124#pragma alloc_text(NEWVIEW,BuildAList,SearchThread,ClipboardThread,FindStrDlgProc)
4125#pragma alloc_text(NEWVIEW,BuildAList2,UrlDlgProc)
Note: See TracBrowser for help on using the repository browser.