source: trunk/dll/newview.c@ 130

Last change on this file since 130 was 130, checked in by root, 20 years ago

Use QWL_USER

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