source: trunk/dll/newview.c@ 2

Last change on this file since 2 was 2, checked in by root, 23 years ago

Initial revision

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