source: trunk/dll/newview.c@ 83

Last change on this file since 83 was 83, checked in by root, 21 years ago

Correct WM_VSCROLL math

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