home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
pascal
/
compiler
/
speedos2
/
libsrc
/
pmeditor.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1994-06-21
|
60KB
|
1,842 lines
UNIT PMEditor;
{************************************************************************
* *
* *
* General Unit for Object-PM (C) 1993,94 R. Nürnberger *
* *
* *
*************************************************************************}
INTERFACE
USES PmObject,PmDos,PmDialog;
CONST
MaxEditors=32; {Maximal editors to process}
InitialBuf=32768; {starting buffer size for editing}
EditorMaxLines:WORD=28; {maximal editor lines for standard text}
VAR
CharWidth:LONGWORD;
CharHeight:LONGWORD;
SelectDrawColor,SelectBackColor:LONGINT;
TYPE
PSliderData=^SliderData;
SliderData=record
scrollbottom:LONGWORD; { Scroll lower border }
scrolltop:LONGWORD; { Scroll upper border }
viewarea:LONGWORD; { View area of window }
intervall:WORD; { Intervall of Slider }
acvalue:LONGWORD; { actual Slider value }
end;
PTextBuf=^TTextBuf;
TTextBuf=ARRAY[0..6553500] OF BYTE; {that should be enough ...}
PEditor=^TEditor; {Data structure for each editor}
TEditor=RECORD
TextBuffer:PTextBuf; {Buffer to text}
ScreenBuffer:ARRAY[0..60] OF String[126];
TextLen:LONGWORD; {Length of text +InitialBuf}
TextLow:LONGWORD; {Actual low position in text}
TextHigh:LONGWORD; {Actual high position in text}
HSlider,VSlider:SliderData;
CursorX,CursorY:LONGWORD; {Current cursor position}
InsertMode:BOOLEAN;
Title:String;
Untitled:BOOLEAN;
Modified:BOOLEAN;
TextLines:LONGWORD;
TextViewX,TextViewY:LONGWORD;
SelectLineStart,SelectColumnStart:WORD;
SelectLineEnd,SelectColumnEnd:WORD;
SelectAnchorLine,SelectAnchorColumn:WORD;
Win:HWND; {Frame window handle}
END;
TYPE TEditorApplication=OBJECT(TMDIApplication)
EditorCount:WORD;
UntitledCount:BYTE;
Editors:ARRAY[0..MaxEditors] OF PEditor;
CreateBackups:BOOLEAN;
StdExt:String;
CONSTRUCTOR Init(AppMainID:LONGWORD);
DESTRUCTOR Done;
FUNCTION MDIHandleEvent(Win:HWND;Msg:LONGWORD;para1,para2:POINTER;
VAR Handled:BOOLEAN;
Extra:POINTER):LONGWORD:virtual;
FUNCTION AppHandleEvent(Win:HWND;Msg:LONGWORD;
para1,para2:POINTER;
VAR Handled:BOOLEAN):
LONGWORD:virtual;
PROCEDURE MDIRedraw(Win:HWND;_hps:HPS;Extra:POINTER):virtual;
PROCEDURE MDICreateNotify(Win:HWND;Extra:POINTER):virtual;
PROCEDURE OpenNewFile;
PROCEDURE OpenFile(name:STRING);
PROCEDURE SaveFile;
PROCEDURE SaveFileAs;
PROCEDURE SaveAllFiles;
PROCEDURE SaveEditor(e:PEditor);
PROCEDURE InitEditor(e:Peditor);
PROCEDURE CheckHScrollBar(Win:HWND;para1,para2,Extra:PEditor);
PROCEDURE CheckVScrollBar(Win:HWND;para1,para2,Extra:PEditor);
PROCEDURE MDIHandleCharEvent(Win:HWND;Extra:POINTER;
ch:Char):virtual;
PROCEDURE MDIHandleScanEvent(Win:HWND;Extra:POINTER;
scan:Word):virtual;
PROCEDURE SetCursor(Win:HWND;pp:PEditor);
PROCEDURE InvalidateEditorLine(Win:HWND;VAR s:string;
y:LONGWORD;Extra:PEditor);
FUNCTION CheckIfToScrollX(Win:HWND;Extra:PEditor):BOOLEAN;
PROCEDURE DestroyEditor(e:PEditor);
PROCEDURE InvalidateEditorWindow(Win:HWND;Extra:PEditor);
FUNCTION CalcMaxSliderPositions(VAR scrolldata:SliderData)
:WORD;
FUNCTION CalcSliderfromValue(wert:LONGWORD;scrolldata:
SliderData):WORD;
FUNCTION CalcValuefromSlider(wert:WORD;scrolldata:
SliderData):LONGWORD;
FUNCTION GetUpperLine(VAR s:string;Extra:PEditor):BOOLEAN;
FUNCTION GetLowerLine(VAR s:string;Extra:PEditor):BOOLEAN;
FUNCTION AppendUpperLine(VAR s:string;Extra:PEditor):BOOLEAN;
FUNCTION AppendLowerLine(VAR s:string;Extra:PEditor):BOOLEAN;
PROCEDURE LineDown(Win:HWND;Extra:PEditor);
PROCEDURE PageDown(Win:HWND;Extra:PEditor);
PROCEDURE LineUp(Win:HWND;Extra:PEditor);
PROCEDURE PageUp(Win:HWND;Extra:PEditor);
END;
IMPLEMENTATION
IMPORTS {Private}
FUNCTION WinSetWindowText(psztext:PSZ;
_hwnd:HWND):LONGWORD: PMWIN index 877;
FUNCTION WinQueryWindow(cmd:LONGWORD;
_hwnd:HWND):LONGWORD: PMWIN index 834;
FUNCTION WinWindowFromID(id:LONGWORD;
hwndParent:HWND):HWND: PMWIN index 899;
FUNCTION WinSendMsg(MPARAM2,MPARAM1:POINTER;
msg:LONGWORD;
_hwnd:HWND):POINTER: PMWIN index 920;
FUNCTION WinQueryWindowRect(VAR prclDest:RECTL;
_hwnd:HWND ):
LONGWORD: PMWIN index 840;
PROCEDURE WinReleasePS(_hps:HPS): PMWIN index 848;
FUNCTION WinGetPS(Win:HWND):HPS: PMWIN index 757;
PROCEDURE WinShowCursor(Visible:LONGWORD;
Win:HWND): PMWIN index 880;
PROCEDURE GpiSetBackMix(Mix:LONGWORD;_hps:HPS): PMGPI index 505;
FUNCTION GpiSetColor(lColor:LONGWORD;
_hps:HPS):LONGINT: PMGPI index 517;
FUNCTION GpiSetBackColor(lColor:LONGINT;
_hps:HPS):LONGWORD: PMGPI index 504;
FUNCTION GpiCharStringAt(VAR pchString;
lCount:LONGWORD;
VAR pptlPoint:POINTL;
_hps:HPS):LONGWORD: PMGPI index 359;
END;
PROCEDURE TEditorApplication.SaveEditor(e:PEditor);
VAR f:file;
d:dirstr;
n:namestr;
ex:extstr;
s:String;
Buf:LONGWORD;
Len:LONGWORD;
t:BYTE;
sp:PString;
BEGIN
IF e=NIL THEN exit;
IF e^.Untitled THEN
BEGIN
GetDir(0,s);
IF s[length(s)]='\' THEN dec(s[0]);
s:=s+'\'+e^.Title;
e^.Title:=s;
e^.Untitled:=FALSE;
sp:=s;
WinSetWindowText(sp,e^.Win);
END;
IF CreateBackups THEN
BEGIN
s:=e^.Title;
assign(f,s);
fsplit(s,d,n,ex);
IF d[length(d)]='\' THEN dec(d[0]);
s:=d+'\'+n+'.BAK';
Erase(s); {Delete old .BAK file}
Rename(f,s);
END;
s:=e^.Title;
Assign(f,s);
Rewrite(f,1);
IF ioresult<>0 THEN
BEGIN
ErrorBox('Could not create file (Disk full ?)');
exit;
END;
Buf:=LONGWORD(e^.TextBuffer);
Len:=e^.TextLow-Buf;
IF Len>0 THEN
BEGIN
BlockWrite(f,e^.TextBuffer^[0],Len);
IF ioresult<>0 THEN
BEGIN
ErrorBox('Could not write file (Disk full ?)');
Close(f);
exit;
END;
END;
FOR t:=0 TO EditorMaxLines DO
BEGIN
s:=e^.ScreenBuffer[t];
while s[length(s)]=#32 do dec(s[0]);
s:=s+#13+#10;
BlockWrite(f,s[1],length(s));
IF ioresult<>0 THEN
BEGIN
ErrorBox('Could not write file (Disk full ?)');
Close(f);
exit;
END;
END;
Len:=Buf+e^.textlen; {Maximal adress}
Len:=Len-e^.TextHigh;
IF Len>0 THEN
BEGIN
BlockWrite(f,e^.TextBuffer^[e^.TextHigh-Buf],len);
IF ioresult<>0 THEN
BEGIN
ErrorBox('Could not write file (Disk full ?)');
Close(f);
exit;
END;
END;
Close(f);
IF ioresult<>0 THEN
BEGIN
ErrorBox('Could not write file (Disk full ?)');
exit;
END;
e^.Modified:=FALSE;
END;
PROCEDURE TEditorApplication.SaveFile; {Save upper editor file}
VAR e:PEditor;
s:string;
sp:PString;
f:file;
BEGIN
IF EditorCount=0 THEN exit;
MDIGetTopWindow(e);
IF e=NIL THEN exit;
IF e^.Untitled THEN
BEGIN
IF FileSaveDialog(AppWinHandle,s) THEN
BEGIN
IF pos('.',s)=0 THEN s:=s+StdExt;
assign(f,s);
reset(f,1);
IF ioresult=0 THEN {file exists}
BEGIN
Close(f);
IF not ConfirmBox('File exists. Overwrite ??') THEN exit;
END;
e^.Title:=s;
e^.Untitled:=FALSE;
sp:=s;
WinSetWindowText(sp,e^.Win);
END
ELSE exit; {Canceled}
END;
SaveEditor(e);
END;
PROCEDURE TEditorApplication.SaveFileAs; {Save upper editor file}
VAR e:PEditor;
s:string;
sp:PString;
f:file;
BEGIN
IF EditorCount=0 THEN exit;
MDIGetTopWindow(e);
IF e=NIL THEN exit;
IF FileSaveDialog(AppWinHandle,s) THEN
BEGIN
IF pos('.',s)=0 THEN s:=s+StdExt;
assign(f,s);
reset(f,1);
IF ioresult=0 THEN {file exists}
BEGIN
Close(f);
IF not ConfirmBox('File exists. Overwrite ??') THEN exit;
END;
e^.Title:=s;
e^.Untitled:=FALSE;
sp:=s;
WinSetWindowText(sp,e^.Win);
END
ELSE exit; {Canceled}
SaveEditor(e);
END;
PROCEDURE TEditorApplication.SaveAllFiles;
VAR t:BYTE;
BEGIN
IF EditorCount=0 THEN exit;
FOR t:=0 TO EditorCount-1 DO
IF Editors[t]^.Modified THEN SaveEditor(Editors[t]);
END;
FUNCTION TEditorApplication.CalcMaxSliderPositions(VAR scrolldata:SliderData):WORD;
VAR as:WORD;
BEGIN
as:=(scrolldata.scrolltop-scrolldata.scrollbottom)-scrolldata.viewarea;
inc(as,2);
scrolldata.intervall:=as;
CalcMaxSliderPositions:=as;
END;
FUNCTION TEditorApplication.CalcSliderfromValue(wert:LONGWORD;scrolldata:SliderData):WORD;
VAR og:LONGWORD;
rec:RECTL;
BEGIN
og:=(scrolldata.scrolltop-scrolldata.viewarea)+1;
IF wert<scrolldata.scrollbottom THEN wert:=scrolldata.scrollbottom;
IF wert>og THEN wert:=og;
CalcSliderfromValue:=(wert-scrolldata.scrollbottom)+1;
END;
FUNCTION TEditorApplication.CalcValuefromSlider(Wert:WORD;scrolldata:SliderData):
LONGWORD;
VAR og:WORD;
BEGIN
og:=(scrolldata.scrolltop-scrolldata.scrollbottom)-scrolldata.viewarea;
inc(og,2);
IF Wert<1 THEN Wert:=1;
IF Wert>og THEN Wert:=og;
CalcValuefromSlider:=(Wert+scrolldata.scrollbottom)-1;
END;
FUNCTION TEditorApplication.GetUpperLine(VAR s:string;Extra:PEditor):BOOLEAN;
VAR Adresse:LONGWORD;
Buffer:POINTER;
Max:LONGWORD;
result:BOOLEAN;
Label l;
BEGIN
Adresse:=Extra^.TextHigh;
Max:=LONGWORD(Extra^.TextBuffer)+Extra^.TextLen;
IF Adresse>=Max THEN
BEGIN
Extra^.TextHigh:=Max;
s:='';
result:=FALSE;
goto l;
END;
Buffer:=Extra^.TextBuffer;
ASM
MOV CL,0
MOV EDI,$s
INC EDI
MOV ESI,$Adresse
INC ESI
!rep_lab:
CMP ESI,$Max
JAE !crlf
MOV AL,[ESI+0]
CMP AL,13
JE !cr
CMP AL,10
JE !crlf
INC CL
INC ESI
MOV [EDI+0],AL
INC EDI
CMP CL,127
JAE !crlf
JMP !rep_lab
!cr:
INC ESI
MOV AL,[ESI+0]
CMP AL,10
JNE !crlf
INC ESI
!crlf:
CLD
MOV AL,0
STOSB
MOV EDI,$s
MOV [EDI+0],CL ;Set text len
DEC ESI
CMP ESI,$Max
JBE !ok1
MOV ESI,$Max
!ok1:
MOV $Adresse,ESI
END;
Extra^.TextHigh:=Adresse;
result:=TRUE;
l:
IF length(s)>126 THEN s[0]:=#126;
ASM
MOV EDI,$s
MOV AL,[EDI+0]
CMP AL,126
JE !eee
;Length to short --> fill up with space
MOVZX EAX,AL
MOVB [EDI+0],126
ADD EDI,EAX
INC EDI
MOV ECX,126
SUB ECX,EAX
MOV AL,32
CLD
REP
STOSB
MOV AL,0
STOSB
!eee:
END;
GetUpperLine:=result;
END;
FUNCTION TEditorApplication.GetLowerLine(VAR s:string;Extra:PEditor):BOOLEAN;
VAR Adresse:LONGWORD;
Buffer:POINTER;
Result:BOOLEAN;
Label l;
BEGIN
Adresse:=Extra^.TextLow;
Buffer:=Extra^.TextBuffer;
IF Adresse<=LONGWORD(Buffer) THEN
BEGIN
Extra^.TextLow:=LONGWORD(Buffer);
Result:=FALSE;
s:='';
goto l;
END;
ASM
MOV CL,0
MOV EDI,$s
INC EDI
MOV ESI,$Adresse
SUB ESI,3
!rep_lab1:
CMP ESI,$Buffer
JB !cr1
CMP CL,127
JAE !cr1
MOV AL,[ESI+0]
CMP AL,10
JE !cr1
CMP AL,13
JE !cr1
DEC ESI
INC CL
JMP !rep_lab1
!cr1:
INC ESI
MOVZX ECX,CL
PUSH ECX
PUSH ESI
CMP ECX,0
JE !no_copy
CLD
REP
MOVSB
!no_copy:
CLD
MOV AL,0
STOSB
POP ESI
POP ECX
MOV EDI,$s
MOV [EDI+0],CL
CMP ESI,$Buffer
JAE !ok
MOV ESI,$Buffer
!ok:
MOV $Adresse,ESI
END;
Extra^.TextLow:=Adresse;
Result:=TRUE;
l:
IF length(s)>126 THEN s[0]:=#126;
ASM
MOV EDI,$s
MOV AL,[EDI+0]
CMP AL,126
JE !eee1
;Length to short --> fill up with space
MOVZX EAX,AL
MOVB [EDI+0],126
ADD EDI,EAX
INC EDI
MOV ECX,126
SUB ECX,EAX
MOV AL,32
CLD
REP
STOSB
MOV AL,0
STOSB
!eee1:
END;
GetLowerLine:=Result;
END;
FUNCTION TEditorApplication.AppendUpperLine(VAR s:string;Extra:PEditor):BOOLEAN;
VAR Adresse:LONGWORD;
Buffer:POINTER;
BEGIN
WHILE s[length(s)]=#32 DO dec(s[0]);
Adresse:=Extra^.TextHigh;
Buffer:=Extra^.TextBuffer;
ASM
MOV EDI,$Adresse
MOV AL,10
STD
STOSB
MOV AL,13
STOSB
MOV ESI,$s
MOV CL,[ESI+0]
MOVZX ECX,CL
ADD ESI,ECX
CMP ECX,0
JE !no_copy1
STD
REP
MOVSB
!no_copy1:
MOV $Adresse,EDI
END;
Extra^.TextHigh:=Adresse;
AppendUpperLine:=TRUE;
END;
FUNCTION TEditorApplication.AppendLowerLine(VAR s:string;Extra:PEditor):BOOLEAN;
VAR Adresse:LONGWORD;
Buffer:POINTER;
BEGIN
WHILE s[length(s)]=#32 DO dec(s[0]);
Adresse:=Extra^.TextLow;
Buffer:=Extra^.TextBuffer;
ASM
MOV EDI,$Adresse
MOV ESI,$s
MOV CL,[ESI+0]
MOVZX ECX,CL
INC ESI
CMP ECX,0
JE !no_copy2
CLD
REP
MOVSB
!no_copy2:
MOV AL,13
STOSB
MOV AL,10
STOSB
MOV $Adresse,EDI
END;
Extra^.TextLow:=Adresse;
AppendLowerLine:=TRUE;
END;
CONSTRUCTOR TEditorApplication.Init(AppMainID:LONGWORD);
VAR t:WORD;
BEGIN
inherited.init(AppMainID);
SelectBackColor:=15; {CLR_PALEGRAY}
SelectDrawColor:=1; {CLR_BLUE}
StdExt:='.TXT';
EditorCount:=0;
UntitledCount:=0;
CharHeight:=16;
CharWidth:=8;
CreateBackups:=TRUE;
FOR t:=0 TO MaxEditors DO Editors[t]:=NIL;
END;
DESTRUCTOR TEditorApplication.Done;
BEGIN
END;
PROCEDURE TEditorApplication.DestroyEditor(e:PEditor);
VAR t,t1:WORD;
label l;
BEGIN
freemem(e^.TextBuffer,e^.TextLen);
FOR t:=0 TO MaxEditors DO IF Editors[t]=e THEN goto l;
errorbox('Could not free editor data !');
exit;
l:
FOR t1:=t TO MaxEditors DO Editors[t1]:=Editors[t1+1];
dec(EditorCount);
dispose(e);
END;
PROCEDURE TEditorApplication.InitEditor(e:Peditor);
VAR Adresse:LONGWORD;
Max:LONGWORD;
BEGIN
Editors[EditorCount]:=e;
inc(EditorCount);
e^.CursorX:=1;
e^.CursorY:=1;
e^.InsertMode:=FALSE;
e^.Untitled:=FALSE;
e^.Modified:=FALSE;
e^.SelectLineStart:=65535;
e^.SelectLineEnd:=65535;
e^.SelectColumnStart:=65535;
e^.SelectColumnEnd:=65535;
Adresse:=e^.TextHigh;
Max:=EditorMaxLines;
ASM
MOV ECX,$Max
MOV EDI,$Adresse
STD
!cploop:
MOV AL,10
STOSB
MOV AL,13
STOSB
LOOP !cploop
MOV $Adresse,EDI
END;
e^.TextHigh:=Adresse;
END;
PROCEDURE TEditorApplication.OpenNewFile;
VAR e:PEditor;
t:WORD;
s:string;
BEGIN
IF EditorCount>=MaxEditors THEN
BEGIN
ErrorBox('Too much files opened');
exit;
END;
new(e);
getmem(e^.TextBuffer,InitialBuf); {reserve 32K initially}
e^.Textlen:=InitialBuf;
e^.TextLow:=LONGWORD(e^.TextBuffer);
e^.TextHigh:=e^.TextLow+e^.textLen; {Clear Editor}
e^.TextLines:=EditorMaxLines;
InitEditor(e);
FOR t:=0 TO EditorMaxLines DO
BEGIN
e^.ScreenBuffer[t]:='';
s:=e^.ScreenBuffer[t];
ASM
CLD
LEA EDI,$s
MOV AL,126
STOSB
MOV ECX,126
MOV AL,32
REP
STOSB
END;
e^.ScreenBuffer[t]:=s;
END;
s:=Tostr(UntitledCount);
inc(UntitledCount);
IF length(s)=1 THEN s:='0'+s;
e^.Title:='NONAME'+s+StdExt;
e^.untitled:=TRUE;
e^.Win:=MDICreateChild(e^.Title,e,FCF_VERTSCROLL or FCF_HORZSCROLL);
END;
PROCEDURE TEditorApplication.OpenFile(name:string);
VAR e:PEditor;
t:WORD;
f:file;
size:LONGWORD;
Adresse:LONGWORD;
Zeilen:LONGWORD;
BufAdresse:LONGWORD;
BufLen:LONGWORD;
BEGIN
IF EditorCount>=MaxEditors THEN
BEGIN
ErrorBox('Too much files opened');
exit;
END;
assign(f,name);
reset(f,1);
if ioresult<>0 THEN
BEGIN
ErrorBox('Error reading:'+name);
exit;
END;
size:=FileSize(f);
new(e);
getmem(e^.TextBuffer,size+InitialBuf); {reserve 32K initially}
e^.Textlen:=InitialBuf+size;
e^.TextLow:=LONGWORD(e^.TextBuffer);
e^.TextHigh:=e^.TextLow+InitialBuf+size; {Clear Editor}
e^.TextLines:=EditorMaxLines;
InitEditor(e);
dec(e^.TextHigh,size+1);
Adresse:=e^.TextHigh+1;
ASM
LEA EAX,$f
PUSH EAX
PUSHL $Adresse
PUSHL $Size
CALLN32 System._BlockRead
END;
IF ioresult<>0 THEN ErrorBox('Error reading:'+name)
ELSE IF Size<>BlockReadResult THEN ErrorBox('Error reading:'+name);
close(f);
{Count Zeilnums}
Zeilen:=0;
BufAdresse:=e^.TextHigh+1;
BufLen:=e^.TextLow+InitialBuf+size;
ASM
MOV ESI,$BufAdresse
CLD
!cloop:
CMP ESI,$BufLen
JAE !zexit
LODSB
CMP AL,13
JE !zfoundcr
CMP AL,10
JE !zFound
JMP !cloop
!zfoundcr:
LODSB
CMP AL,10
JE !zfound
DEC ESI
!zfound:
INCD $Zeilen
JMP !cloop
!zexit:
END;
e^.TextLines:=Zeilen;
FOR t:=0 TO EditorMaxLines DO GetUpperLine(e^.ScreenBuffer[t],e);
e^.Title:=name;
MDICreateChild(e^.Title,e,FCF_VERTSCROLL or FCF_HORZSCROLL); {Extra Byte is the editor}
END;
FUNCTION TEditorApplication.AppHandleEvent(Win:HWND;Msg:LONGWORD;
para1,para2:POINTER;
VAR Handled:BOOLEAN):LONGWORD;
VAR r:LONGWORD;
BEGIN
r:=Inherited.AppHandleEvent(Win,Msg,para1,para2,Handled);
AppHandleEvent:=r;
END;
PROCEDURE TEditorApplication.SetCursor(Win:HWND;pp:PEditor);
VAR cux,cuy:LONGWORD;
rec:RECTL;
s,s1:string;
sp:Pstring;
ScrollWin,FrameWin:HWND;
w:WORD;
p:POINTER;
ww,ww1:WORD;
t:LONGWORD;
na:namestr;
di:dirstr;
ex:extstr;
BEGIN
WinShowCursor(0,Win);
WinQueryWindowRect(rec,Win);
cux:=2+(pp^.CursorX-1)*CharWidth;
cuy:=rec.yTop-(pp^.CursorY)*CharHeight;
dec(cuy,2);
ASM
;Set window cursor
PUSHL 0 ;whole window
PUSHL 8004h ;CURSOR_SETPOS
PUSHL 2 ;Cusizey
PUSHL _CharWidth
PUSHL $cuy
PUSHL $cux
PUSHL $Win
MOV AL,7
CALLDLL PMWIN,715 ;WinCreateCursor
ADD ESP,28
END;
WinShowCursor(1,Win);
s1:=pp^.Title;
IF length(s1)>60 THEN
BEGIN
fsplit(s1,di,na,ex);
s1:='...\'+na+ex;
END;
s:=s1+' '+tostr(pp^.CursorY+pp^.VSlider.acvalue)+':'+
tostr(pp^.CursorX+pp^.HSlider.acvalue);
IF pp^.Modified THEN s:=s+' *';
sp:=s;
FrameWin:=WinQueryWindow(QW_PARENT,Win);
WinSetWindowText(sp,FrameWin);
ScrollWin:=WinWindowFromID(FID_HORZSCROLL,FrameWin);
w:=CalcSliderfromValue(pp^.HSlider.acvalue,pp^.HSlider);
p:=PointerFromShort(w);
WinSendMsg(NIL,p,SBM_SETPOS,ScrollWin);
ScrollWin:=WinWindowFromID(FID_VERTSCROLL,FrameWin);
w:=CalcSliderfromValue(pp^.VSlider.acvalue,pp^.VSlider);
p:=PointerFromShort(w);
WinSendMsg(NIL,p,SBM_SETPOS,ScrollWin);
END;
PROCEDURE TEditorApplication.MDIRedraw(Win:HWND;_hps:HPS;Extra:POINTER);
VAR facename,s:string;
rec:RECTL;
pp:PEditor;
Lines:LONGWORD;
t:LongWord;
pt:POINTL;
ScrollX:LONGWORD;
SelectLoLine,SelectHiLine:WORD;
SelectLoColumn,SelectHiColumn:WORD;
AcLine,AcColumn,help,TextViewX,Mul,Mul1:WORD;
Label l;
BEGIN
WinShowCursor(0,Win);
facename:='System VIO';
CreateLogFont(_hps,facename,CharHeight,CharWidth); {default font}
pp:=Extra;
GpiSetBackMix(2,_hps); {BM_OverPaint}
WinQueryWindowRect(rec,Win);
Lines:=(rec.ytop-rec.ybottom) div CharHeight; {Lines to draw}
pt.x:=2;
pt.y:=rec.yTop-CharHeight;
ScrollX:=pp^.HSlider.acvalue;
SelectLoLine:=pp^.SelectLineStart;
SelectHiLine:=pp^.SelectLineEnd;
SelectLoColumn:=pp^.SelectColumnStart;
SelectHiColumn:=pp^.SelectColumnEnd;
AcLine:=pp^.VSlider.acvalue;
AcColumn:=ScrollX+1;
TextViewX:=pp^.TextViewX+1;
IF SelectLoColumn<65535 THEN
BEGIN
IF SelectLoColumn>AcColumn THEN
BEGIN
Dec(SelectLoColumn,AcColumn);
Mul:=CharWidth*SelectLoColumn;
END
ELSE SelectLoColumn:=0;
END
ELSE SelectLoColumn:=0;
IF SelectHiColumn<65535 THEN
BEGIN
IF SelectHiColumn>AcColumn-1 THEN
BEGIN
Dec(SelectHiColumn,AcColumn-1);
Mul1:=CharWidth*SelectHiColumn;
END
ELSE SelectHiColumn:=0;
END
ELSE SelectHiColumn:=0;
GpiSetColor(TextDrawColor,_hps);
GpiSetBackColor(TextBackColor,_hps);
FOR t:=0 TO Lines-1 DO
BEGIN
help:=t+AcLine;
IF ((help>=SelectLoLine)AND(Help<=SelectHiLine)) THEN
BEGIN
CASE Help OF
SelectLoLine:
BEGIN
IF SelectLoColumn>0 THEN
BEGIN
GpiCharStringAt(pp^.ScreenBuffer[t][AcColumn],
SelectLoColumn,pt,_hps);
inc(pt.x,Mul);
GpiSetColor(SelectDrawColor,_hps);
GpiSetBackColor(SelectBackColor,_hps);
IF Help=SelectHiLine THEN
BEGIN
GpiCharStringAt(pp^.ScreenBuffer[t][AcColumn+
SelectLoColumn],SelectHiColumn-
SelectLoColumn,pt,_hps);
GpiSetColor(TextDrawColor,_hps);
GpiSetBackColor(TextBackColor,_hps);
inc(pt.x,mul1-mul);
GpiCharStringAt(pp^.ScreenBuffer[t][AcColumn+
SelectLoColumn+
(SelectHiColumn-SelectLoColumn)],
TextViewX-SelectHiColumn,pt,_hps);
dec(pt.x,mul1-mul);
END
ELSE GpiCharStringAt(pp^.ScreenBuffer[t][AcColumn+
SelectLoColumn],TextViewX-SelectLoColumn,
pt,_hps);
dec(pt.x,Mul);
END
ELSE
BEGIN
l:
GpiSetColor(SelectDrawColor,_hps);
GpiSetBackColor(SelectBackColor,_hps);
GpiCharStringAt(pp^.ScreenBuffer[t][AcColumn],
pp^.TextViewX+1,pt,_hps);
END;
GpiSetColor(TextDrawColor,_hps);
GpiSetBackColor(TextBackColor,_hps);
END;
SelectHiLine:
BEGIN
IF SelectHiColumn>0 THEN
BEGIN
GpiSetColor(SelectDrawColor,_hps);
GpiSetBackColor(SelectBackColor,_hps);
GpiCharStringAt(pp^.ScreenBuffer[t][AcColumn],
SelectHiColumn,pt,_hps);
inc(pt.x,Mul1);
GpiSetColor(TextDrawColor,_hps);
GpiSetBackColor(TextBackColor,_hps);
GpiCharStringAt(pp^.ScreenBuffer[t][AcColumn+
SelectHiColumn],TextViewX-SelectHiColumn,
pt,_hps);
dec(pt.x,Mul1);
END
ELSE goto l;
END;
ELSE
BEGIN
GpiSetColor(SelectDrawColor,_hps);
GpiSetBackColor(SelectBackColor,_hps);
GpiCharStringAt(pp^.ScreenBuffer[t][AcColumn],
pp^.TextViewX+1,pt,_hps);
GpiSetColor(TextDrawColor,_hps);
GpiSetBackColor(TextBackColor,_hps);
END;
END; {case}
END
ELSE GpiCharStringAt(pp^.ScreenBuffer[t][ScrollX+1],pp^.TextViewX+1,pt,_hps);
dec(pt.y,CharHeight);
END;
WinShowCursor(1,Win);
SetCursor(Win,pp);
END;
PROCEDURE TEditorApplication.CheckHScrollBar(Win:HWND;para1,para2,Extra:PEditor);
VAr w:Word;
p,p1:POINTER;
l:LONGWORD;
ScrollWin,FrameWin:HWND;
SliderID:LONGWORD;
HSliderX:SliderData;
label lab;
BEGIN
HSliderX:=Extra^.HSlider;
l:=PointerToLong(para2);
SliderID:=PointerToLong(para1);
SliderID:=lo(SliderID);
w:=hi(l);
FrameWin:=WinQueryWindow(QW_PARENT,Win);
ScrollWin:=WinWindowFromID(SliderID,FrameWin);
CASE w OF
SB_LINELEFT:
BEGIN
IF HSliderX.acvalue-1>HSliderX.scrollbottom THEN dec(HSliderX.acvalue)
ELSE HSliderX.acvalue:=HSliderX.scrollbottom;
goto lab;
END;
SB_LINERIGHT:
BEGIN
IF HSliderX.acvalue+1<HSliderX.scrolltop THEN inc(HSliderX.acvalue);
{ELSE HSliderX.acvalue:=HSliderX.scrolltop;}
goto lab;
END;
SB_PAGELEFT:
BEGIN
IF HSliderX.acvalue-HSliderX.viewarea>HSliderX.scrollbottom THEN
dec(HSliderX.acvalue,HSliderX.viewarea)
ELSE HSliderX.acvalue:=HSliderX.scrollbottom;
goto lab;
END;
SB_PAGERIGHT:
BEGIN
IF HSliderX.acvalue+HSliderX.viewarea<HSliderX.scrolltop THEN
inc(HSliderX.acvalue,HSliderX.viewarea)
ELSE HSliderX.acvalue:=HSliderX.scrolltop;
lab:
IF HSliderX.acValue+Extra^.CursorX>HSliderX.ScrollTop THEN
BEGIN
Beep(1200,200);
HSliderX.acvalue:=HSliderX.ScrollTop-Extra^.CursorX;
END;
w:=HSliderX.acvalue; {CalcSliderfromValue(HSliderX.acvalue,HSliderX);}
p:=PointerFromShort(w);
WinSendMsg(NIL,p,SBM_SETPOS,ScrollWin);
END;
SB_SLIDERPOSITION:
BEGIN
w:=lo(l);
HSliderX.acvalue:=CalcValuefromSlider(w,HSliderX);
IF HSliderX.acValue+Extra^.CursorX>HSliderX.ScrollTop THEN
BEGIN
Beep(1200,200);
HSliderX.acvalue:=HSliderX.ScrollTop-Extra^.CursorX;
w:=CalcSliderfromValue(HSliderX.acvalue,HSliderX);
p:=PointerFromShort(w);
WinSendMsg(NIL,p,SBM_SETPOS,ScrollWin);
END;
END;
ELSE exit;
END; {Case}
Extra^.HSlider:=HSliderX;
END;
FUNCTION TEditorApplication.CheckIfToScrollX(Win:HWND;Extra:PEditor):BOOLEAN;
VAR ScrollX:LONGWORD;
rec:RECTL;
BEGIN
IF Extra^.CursorX>Extra^.TextViewX THEN
BEGIN
ScrollX:=Extra^.CursorX-Extra^.TextViewX;
dec(Extra^.Cursorx,ScrollX);
inc(Extra^.HSlider.acvalue,ScrollX);
InvalidateEditorWindow(Win,Extra);
CheckIfToScrollX:=TRUE;
END
ELSE CheckIfToScrollX:=FALSE;
END;
PROCEDURE TEditorApplication.MDIHandleCharEvent(Win:HWND;Extra:POINTER;ch:CHAR);
VAR s:string;
x,y:LongWord;
Extra1:PEditor;
label L;
BEGIN
Extra1:=Extra;
x:=Extra1^.CursorX+Extra1^.HSlider.acvalue;
IF x>=Extra1^.HSlider.ScrollTop THEN
BEGIN
l:
beep(1200,200);
exit;
END;
y:=Extra1^.CursorY-1;
s:=Extra1^.ScreenBuffer[y];
Extra1^.Modified:=TRUE;
IF Extra1^.insertmode THEN s[x]:=ch
ELSE
BEGIN
Insert(ch,s,x);
IF Length(s)>126 THEN s[0]:=#126;
END;
inc(Extra1^.CursorX);
Extra1^.ScreenBuffer[y]:=s;
IF CheckIfToScrollX(Win,Extra1) THEN exit;
InvalidateEditorLine(Win,s,y+1,Extra1);
END;
PROCEDURE TEditorApplication.PageUp(Win:HWND;Extra:PEditor);
VAR t,t1:WORD;
TextView:WORD;
BEGIN
IF Extra^.TextLow<=LONGWORD(Extra^.TextBuffer) THEN
BEGIN
Extra^.CursorY:=1;
exit;
END;
IF Extra^.VSlider.acvalue=0 THEN
BEGIN
Extra^.CursorY:=1;
exit;
END;
TextView:=Extra^.TextViewY-1;
IF TextView>Extra^.VSlider.acvalue THEN
BEGIN
TextView:=Extra^.VSlider.acvalue;
Extra^.CursorY:=1;
END;
FOR t:=EditorMaxLines DOWNTO (EditorMaxLines-TextView)+1 DO
AppendUpperLine(Extra^.ScreenBuffer[t],Extra);
t1:=EditorMaxLines-TextView; {Lines to transmit}
ASM
MOVZXW ECX,$t1
INC ECX
SHL ECX,5 ;multiply with 128 and divide by 4
MOV ESI,$Extra ;Source buffer
MOVZXW EAX,_EditormaxLines
MOVZXW EBX,$TextView
SUB EAX,EBX
INC EAX
SHL EAX,7 ;multiply with 128
ADD ESI,EAX ;Source
MOV EDI,$Extra ;Destination
MOVZXW EAX,_EditorMaxLines
INC EAX
SHL EAX,7
ADD EDI,EAX ;Destination
STD
REP
MOVSW ;MOVSD
END;
FOR t:=TextView-1 DOWNTO 0 DO GetLowerLine(Extra^.ScreenBuffer[t],Extra);
Dec(Extra^.VSlider.acvalue,TextView);
END;
PROCEDURE TEditorApplication.LineUp(Win:HWND;Extra:PEditor);
VAR t:WORD;
BEGIN
IF Extra^.CursorY=1 THEN
BEGIN
IF Extra^.VSlider.acvalue=0 THEN exit;
IF Extra^.TextLow<=LONGWORD(Extra^.TextBuffer) THEN
BEGIN
Extra^.VSlider.Acvalue:=0;
exit;
END;
dec(Extra^.VSlider.acvalue);
AppendUpperLine(Extra^.ScreenBuffer[EditorMaxLines],Extra);
ASM
MOVZXW ECX,_EditorMaxLines
SHL ECX,5 ;multiply with 128 and divide by 4
MOV ESI,$Extra ;Source
MOVZXW EAX,_EditorMaxLines
INC EAX
SHL EAX,7
ADD ESI,EAX
MOV EDI,ESI ;Destination
SUB ESI,128 ;Source
STD
REP
MOVSW ;MOVSD
END;
GetLowerLine(Extra^.ScreenBuffer[0],Extra);
END
ELSE dec(Extra^.CursorY);
END;
PROCEDURE TEditorApplication.LineDown(Win:HWND;Extra:PEditor);
VAR t:Word;
label l;
BEGIN
IF Extra^.TextHigh>=LONGWORD(Extra^.TextBuffer)+Extra^.TextLen THEN
BEGIN
{No more lines in memory}
FOR t:=Extra^.CursorY TO EditorMaxLines DO
IF length(Extra^.ScreenBuffer[t])<>0 THEN goto l;
exit;
END;
l:
inc(Extra ^.CursorY);
IF Extra^.CursorY>Extra^.TextViewY THEN
BEGIN
Extra^.CursorY:=Extra^.TextViewY;
inc(Extra^.VSlider.acvalue);
AppendLowerLine(Extra^.ScreenBuffer[0],Extra);
ASM
MOVZXW ECX,_EditorMaxLines
SHL ECX,5 ;multiply with 128 and divide by 4
MOV EDI,$Extra ;Destination
ADD EDI,4
MOV ESI,EDI ;Source
ADD ESI,128
CLD
REP
MOVSW ;MOVSD
END;
GetUpperLine(Extra^.ScreenBuffer[EditorMaxLines],Extra);
END;
END;
PROCEDURE TEditorApplication.PageDown(Win:HWND;Extra:PEditor);
VAR
Count:WORD;
TextView:WORD;
t,t1:WORD;
BEGIN
IF Extra^.TextHigh>=LONGWORD(Extra^.TextBuffer)+Extra^.TextLen THEN exit;
TextView:=Extra^.TextViewY-1;
FOR t:=0 TO TextView-1 DO AppendLowerLine(Extra^.ScreenBuffer[t],Extra);
t1:=(EditorMaxLines-TextView)+1; {Lines to transmit}
ASM
MOVZXW ECX,$t1
SHL ECX,5 ;multiply with 128 and divide by 4
MOV ESI,$Extra ;Source buffer
ADD ESI,4
MOVZXW EAX,$TextView
SHL EAX,7 ;multiply with 128
ADD ESI,EAX ;onto ScreenBuffer[TextView]
MOV EDI,$Extra
ADD EDI,4 ;onto ScreenBuffer[0]
CLD
REP
MOVSW ;MOVSD
END;
FOR t:=t1 TO EditorMaxLines DO GetUpperLine(Extra^.ScreenBuffer[t],Extra);
Inc(Extra^.VSlider.acvalue,TextView);
END;
PROCEDURE TEditorApplication.CheckVScrollBar(Win:HWND;para1,para2,Extra:PEditor);
VAr w:Word;
p,p1:POINTER;
l,r:LONGWORD;
ScrollWin,FrameWin:HWND;
SliderID:LONGWORD;
t:WORD;
t1:LONGWORD;
acval:LONGWORD;
aclineval:LONGWORD;
acpageval:LONGWORD;
BEGIN
l:=PointerToLong(para2);
SliderID:=PointerToLong(para1);
SliderID:=lo(SliderID);
w:=hi(l);
FrameWin:=WinQueryWindow(QW_PARENT,Win);
ScrollWin:=WinWindowFromID(SliderID,FrameWin);
CASE w OF
SB_LINEUP:
BEGIN
Extra^.CursorY:=1;
LineUp(Win,Extra);
w:=CalcSliderfromValue(Extra^.VSlider.acvalue,Extra^.VSlider);
p:=PointerFromShort(w);
WinSendMsg(NIL,p,SBM_SETPOS,ScrollWin);
END;
SB_LINEDOWN:
BEGIN
Extra^.CursorY:=Extra^.TextViewY;
LineDown(Win,Extra);
w:=CalcSliderfromValue(Extra^.VSlider.acvalue,Extra^.VSlider);
p:=PointerFromShort(w);
WinSendMsg(NIL,p,SBM_SETPOS,ScrollWin);
END;
SB_PAGEUP:
BEGIN
PageUp(Win,Extra);
w:=CalcSliderfromValue(Extra^.VSlider.acvalue,Extra^.VSlider);
p:=PointerFromShort(w);
WinSendMsg(NIL,p,SBM_SETPOS,ScrollWin);
END;
SB_PAGEDOWN:
BEGIN
PageDown(Win,Extra);
w:=CalcSliderfromValue(Extra^.VSlider.acvalue,Extra^.VSlider);
p:=PointerFromShort(w);
WinSendMsg(NIL,p,SBM_SETPOS,ScrollWin);
END;
SB_SLIDERPOSITION:
BEGIN
w:=lo(l);
acval:=CalcValuefromSlider(w,Extra^.VSlider);
IF acval=Extra^.VSlider.acvalue THEN exit;
IF acval>Extra^.VSlider.acvalue THEN
BEGIN
r:=(acval-Extra^.VSlider.acvalue)+Extra^.TextViewY;
acpageval:=r div Extra^.TextViewY;
aclineval:=r mod Extra^.TextViewY;
FOR t1:=1 TO acpageval DO PageDown(Win,Extra);
FOR t1:=1 TO aclineval DO LineDown(Win,Extra);
END
ELSE
BEGIN
r:=(Extra^.VSlider.acvalue-acval)+Extra^.TextViewY;
acpageval:=r div Extra^.TextViewY;
aclineval:=r mod Extra^.TextViewY;
FOR t1:=1 TO acpageval DO PageUp(Win,Extra);
FOR t1:=1 TO aclineval DO LineUp(Win,Extra);
END;
END;
END; {Case}
END;
PROCEDURE TEditorApplication.MDICreateNotify(Win:HWND;Extra:POINTER);
VAR
ww,ww1:Word;
p:POINTER;
p1:POINTER;
FrameWin,ScrollWin:HWND;
pp:PEditor;
rec:RECTL;
Lines:LONGWORD;
BEGIN
inherited.MDICreateNotify(Win,Extra);
pp:=Extra;
WinQueryWindowrect(rec,Win);
{init horizontal ScrollWindow}
Lines:=(rec.XRight-rec.XLeft) div CharWidth;
pp^.TextViewX:=Lines;
FrameWin:=WinQueryWindow(QW_PARENT,Win);
ScrollWin:=WinWindowFromID(FID_HORZSCROLL,FrameWin);
pp^.HSlider.scrollbottom:=0;
pp^.HSlider.scrolltop:=127;
pp^.HSlider.viewarea:=Lines;
{define Scroll intervall}
ww1:=1;
ww:=CalcMaxSliderPositions(pp^.HSlider);
p:=PointerFrom2Short(ww,ww1);
WinSendMsg(p,LongToPointer(1),SBM_SETSCROLLBAR,ScrollWin);
pp^.HSlider.acvalue:=pp^.HSlider.scrollbottom;
{Set slider size}
ww1:=pp^.HSlider.viewarea;
ww:=pp^.HSlider.scrolltop-pp^.HSlider.scrollbottom+1;
p:=PointerFrom2Short(ww,ww1);
WinSendmsg(NIL,p,SBM_SETTHUMBSIZE,ScrollWin);
{init vertical ScrollWindow}
ScrollWin:=WinWindowFromID(FID_VERTSCROLL,FrameWin);
Lines:=(rec.yTop-rec.yBottom) div CharHeight;
pp^.TextViewY:=Lines;
pp^.VSlider.scrollbottom:=0;
pp^.VSlider.scrolltop:=pp^.TextLines;
pp^.VSlider.viewarea:=Lines;
{define Scroll intervall}
ww1:=1;
ww:=CalcMaxSliderPositions(pp^.VSlider);
p:=PointerFrom2Short(ww,ww1);
WinSendMsg(p,LongToPointer(1),SBM_SETSCROLLBAR,ScrollWin);
pp^.VSlider.acvalue:=pp^.VSlider.scrollbottom;
{Set slider size}
ww1:=pp^.VSlider.viewarea;
ww:=pp^.VSlider.scrolltop-pp^.VSlider.scrollbottom+1;
p:=PointerFrom2Short(ww,ww1);
WinSendmsg(NIL,p,SBM_SETTHUMBSIZE,ScrollWin);
END;
PROCEDURE TEditorApplication.InvalidateEditorLine(Win:HWND;var s:string;
y:LONGWORD;Extra:PEditor);
VAR _hps:LONGWORD;
rec:RECTL;
pt:POINTL;
facename:String;
scrollX:LONGWORD;
BEGIN
WinShowCursor(0,Win);
_hps:=WinGetPS(Win);
WinQueryWindowRect(rec,Win);
facename:='System VIO';
CreateLogFont(_hps,facename,CharHeight,CharWidth); {default font}
pt.x:=2;
pt.y:=rec.yTop-y*CharHeight;
scrollX:=Extra^.HSlider.acvalue;
GpiSetBackMix(2,_hps); {BM_OverPaint}
GpiSetColor(TextDrawColor,_hps);
GpiSetBackColor(TextBackColor,_hps);
GpiCharStringAt(s[Scrollx+1],Extra^.TextViewX+1,pt,_hps);
WinReleasePS(_hps);
WinShowCursor(1,Win);
SetCursor(Win,Extra);
END;
PROCEDURE TEditorApplication.InvalidateEditorWindow(Win:HWND;Extra:PEditor);
VAR _hps:LONGWORD;
BEGIN
_hps:=WinGetPS(Win);
MDIRedraw(Win,_hps,Extra);
WinReleasePs(_hps);
END;
PROCEDURE TEditorApplication.MDIHandleScanEvent(Win:HWND;Extra:POINTER;scan:Word);
VAR hsp:LONGWORD;
r:LongWord;
x,y:LONGWORD;
s,s1:string;
t,t1:WORD;
ScrollWin,FrameWin:HWND;
p:POINTER;
ww,ww1:WORD;
rc:RECTL;
Extra1:PEditor;
BEGIN
Extra1:=Extra;
CASE Scan OF
kbCtrlY:
BEGIN
Extra1^.Modified:=TRUE;
FOR t:=Extra1^.CursorY-1 TO EditorMaxLines-1 DO
Extra1^.ScreenBuffer[t]:=Extra1^.ScreenBuffer[t+1];
IF GetUpperLine(Extra1^.ScreenBuffer[EditorMaxLines],Extra1)
THEN Dec(Extra1^.TextLines);
InvalidateEditorWindow(Win,Extra1);
END;
kbCDown:
BEGIN
IF Extra1^.CursorY=Extra1^.TextViewY THEN
BEGIN
LineDown(Win,Extra1);
InvalidateEditorWindow(Win,Extra);
exit;
END
ELSE LineDown(Win,Extra1);
END;
kbCUp:
BEGIN
IF Extra1^.CursorY=1 THEN
BEGIN
IF Extra1^.VSlider.acvalue=0 THEN exit;
LineUp(Win,Extra1);
InvalidateEditorWindow(Win,Extra1);
exit;
END
ELSE LineUp(Win,Extra1);
END;
kbCR:
BEGIN
IF Extra1^.InsertMode THEN
BEGIN
Extra1^.CursorX:=1;
Extra1^.HSlider.acvalue:=0;
IF Extra1^.CursorY=Extra1^.TextViewY THEN
BEGIN
LineDown(Win,Extra1);
InvalidateEditorWindow(Win,Extra);
exit;
END
ELSE LineDown(Win,Extra1);
END
ELSE
BEGIN
Extra1^.Modified:=TRUE;
s:=Extra1^.ScreenBuffer[Extra1^.CursorY-1];
x:=Extra1^.CursorX+Extra1^.HSlider.acvalue;
s1:=copy(s,1,x-1);
WHILE Length(s1)<126 DO s1:=s1+' ';
Extra1^.ScreenBuffer[Extra1^.CursorY-1]:=s1;
delete(s,1,x-1);
WHILE Length(s)<126 DO s:=s+' ';
inc(Extra1^.CursorY);
Extra1^.CursorX:=1;
Extra1^.HSlider.acvalue:=0;
inc(Extra1^.TextLines);
{init vertical ScrollWindow}
WinQueryWindowrect(rc,Win);
FrameWin:=WinQueryWindow(QW_PARENT,Win);
ScrollWin:=WinWindowFromID(FID_VERTSCROLL,FrameWin);
r:=(rc.yTop-rc.yBottom) div CharHeight;
Extra1^.TextViewY:=r;
Extra1^.VSlider.scrollbottom:=0;
Extra1^.VSlider.scrolltop:=Extra1^.TextLines;
Extra1^.VSlider.viewarea:=r;
{define Scroll intervall}
ww1:=1;
ww:=CalcMaxSliderPositions(Extra1^.VSlider);
p:=PointerFrom2Short(ww,ww1);
WinSendMsg(p,LongToPointer(1),SBM_SETSCROLLBAR,ScrollWin);
{Set slider size}
ww1:=Extra1^.VSlider.viewarea;
ww:=Extra1^.VSlider.scrolltop-Extra1^.VSlider.scrollbottom+1;
p:=PointerFrom2Short(ww,ww1);
WinSendmsg(NIL,p,SBM_SETTHUMBSIZE,ScrollWin);
AppendUpperLine(Extra1^.ScreenBuffer[EditorMaxLines],Extra1);
FOR t:=EditorMaxLines DOWNTO Extra1^.CursorY DO
Extra1^.ScreenBuffer[t]:=Extra1^.ScreenBuffer[t-1];
Extra1^.ScreenBuffer[Extra1^.CursorY-1]:=s;
Dec(Extra1^.CursorY);
LineDown(Win,Extra1);
InvalidateEditorWindow(Win,Extra);
END;
END;
kbPageDown:
BEGIN
IF Extra1^.TextHigh>=LONGWORD(Extra1^.TextBuffer)+Extra1^.TextLen THEN exit;
PageDown(Win,Extra1);
InvalidateEditorWindow(Win,Extra1);
exit;
END;
kbPageUp:
BEGIN
IF Extra1^.TextLow<=LONGWORD(Extra1^.TextBuffer) THEN exit;
PageUp(Win,Extra1);
InvalidateEditorWindow(Win,Extra1);
exit;
END;
kbCRight:
BEGIN
x:=Extra1^.CursorX+Extra1^.HSlider.acvalue;
IF x>=Extra1^.HSlider.ScrollTop THEN exit;
inc(Extra1^.CursorX);
IF CheckIfToScrollX(Win,Extra1) THEN exit;
END;
kbCLeft:
BEGIN
IF Extra1^.CursorX=1 THEN
BEGIN
IF Extra1^.HSlider.acvalue=0 THEN exit;
dec(Extra1^.HSlider.acvalue);
InvalidateEditorWindow(Win,Extra1);
exit;
END
ELSE dec(Extra1^.CursorX);
END;
kbPos1:
BEGIN
Extra1^.CursorX:=1;
r:=Extra1^.HSlider.acvalue;
Extra1^.HSlider.acvalue:=0;
if r<>0 THEN
BEGIN
InvalidateEditorWindow(Win,Extra1);
exit;
END;
END;
kbEnd:
BEGIN
x:=Extra1^.CursorY-1;
s:=Extra1^.ScreenBuffer[x];
while s[length(s)]=#32 do dec(s[0]);
Extra1^.CursorX:=length(s)+1;
Extra1^.HSlider.acvalue:=0;
IF CheckIfToScrollX(Win,Extra1) THEN exit;
END;
kbDel:
BEGIN
Extra1^.Modified:=TRUE;
y:=Extra1^.CursorY-1;
s:=Extra1^.ScreenBuffer[y];
x:=Extra1^.CursorX+Extra1^.HSlider.acvalue;
t1:=0;
for t:=length(s) downto x do if s[t]<>#32 then t1:=t;
if t1<x then
begin
while s[length(s)]=#32 do dec(s[0]);
s1:=Extra1^.ScreenBuffer[y+1];
while s1[length(s1)]=#32 do dec(s1[0]);
if length(s)+length(s1)>126 then s1[0]:=chr(126-length(s));
s:=s+s1;
while length(s)<126 do s:=s+' ';
Extra1^.ScreenBuffer[y]:=s;
FOR t:=y+1 TO EditorMaxLines-1 DO
Extra1^.ScreenBuffer[t]:=Extra1^.ScreenBuffer[t+1];
IF GetUpperLine(Extra1^.ScreenBuffer[EditorMaxLines],Extra1)
THEN Dec(Extra1^.TextLines);
InvalidateEditorWindow(Win,Extra1);
end
else
begin
delete(s,x,1);
s:=s+' ';
Extra1^.ScreenBuffer[y]:=s;
InvalidateEditorLine(Win,s,y+1,Extra1);
end;
exit;
END;
kbBS:
BEGIN
Extra1^.Modified:=TRUE;
y:=Extra1^.CursorY-1;
x:=Extra1^.CursorX+Extra1^.HSlider.acvalue;
s:=Extra1^.ScreenBuffer[y];
IF length(s)>=x-1 THEN IF x<>1 THEN delete(s,x-1,1);
Extra1^.ScreenBuffer[y]:=s;
while s[length(s)]=#32 do dec(s[0]);
IF Extra1^.CursorX=1 THEN
BEGIN
IF Extra1^.HSlider.acvalue=0 THEN exit;
dec(Extra1^.HSlider.acvalue);
InvalidateEditorWindow(Win,Extra1);
exit;
END
ELSE
BEGIN
dec(Extra1^.CursorX);
InvalidateEditorLine(Win,s,y+1,Extra1);
exit;
END;
END;
kbInsert:
BEGIN
Extra1^.InsertMode:=not(Extra1^.InsertMode);
IF Extra1^.InsertMode THEN r:=CharHeight
ELSE r:=2;
ASM
;Destroy the cursor
PUSHL $Win
MOV AL,1
CALLDLL PMWIN,725 ;WinDestroyCursor
ADD ESP,4
;Create the cursor
PUSHL 0 ;whole window
PUSHL 4 ;CURSOR_SOLID | CURSOR_FLASH
PUSHL $r ;Cursorheigth
PUSHL _CharWidth
PUSHL 40
PUSHL 40
PUSHL $Win
MOV AL,7
CALLDLL PMWIN,715 ;WinCreateCursor
ADD ESP,28
END;
WinShowCursor(1,Win);
END;
ELSE exit;
END; {CASE}
SetCursor(Win,Extra1);
END;
FUNCTION TEditorApplication.MDIHandleEvent(Win:HWND;Msg:LONGWORD;para1,
para2:POINTER;VAR Handled:BOOLEAN;
Extra:POINTER):LONGWORD;
VAR r:LONGWORD;
rc:RECTL;
H:BOOLEAN;
w:WORD;
ch:CHAR;
b:Byte;
pp:PEditor;
FrameWin,ScrollWin:HWND;
ww,ww1:WORD;
p:POINTER;
po:points;
lx,ly,wx,wy:Integer;
Label l,ll,ll1;
BEGIN
H:=TRUE;
r:=0;
CASE MSG OF
WM_SIZE:
BEGIN
pp:=Extra;
WinQueryWindowrect(rc,Win);
{init horizontal ScrollWindow}
r:=(rc.XRight-rc.XLeft) div CharWidth;
pp^.TextViewX:=r;
FrameWin:=WinQueryWindow(QW_PARENT,Win);
ScrollWin:=WinWindowFromID(FID_HORZSCROLL,FrameWin);
pp^.HSlider.scrollbottom:=0;
pp^.HSlider.scrolltop:=127;
pp^.HSlider.viewarea:=r;
{define Scroll intervall}
ww1:=1;
ww:=CalcMaxSliderPositions(pp^.HSlider);
p:=PointerFrom2Short(ww,ww1);
WinSendMsg(p,LongToPointer(1),SBM_SETSCROLLBAR,ScrollWin);
{Set slider size}
ww1:=pp^.HSlider.viewarea;
ww:=pp^.HSlider.scrolltop-pp^.HSlider.scrollbottom+1;
p:=PointerFrom2Short(ww,ww1);
WinSendmsg(NIL,p,SBM_SETTHUMBSIZE,ScrollWin);
{init vertical ScrollWindow}
ScrollWin:=WinWindowFromID(FID_VERTSCROLL,FrameWin);
r:=(rc.yTop-rc.yBottom) div CharHeight;
pp^.textViewY:=r;
pp^.VSlider.scrollbottom:=0;
pp^.VSlider.scrolltop:=pp^.TextLines;
pp^.VSlider.viewarea:=r;
{define Scroll intervall}
ww1:=1;
ww:=CalcMaxSliderPositions(pp^.VSlider);
p:=PointerFrom2Short(ww,ww1);
WinSendMsg(p,LongToPointer(1),SBM_SETSCROLLBAR,ScrollWin);
{Set slider size}
ww1:=pp^.VSlider.viewarea;
ww:=pp^.VSlider.scrolltop-pp^.VSlider.scrollbottom+1;
p:=PointerFrom2Short(ww,ww1);
WinSendmsg(NIL,p,SBM_SETTHUMBSIZE,ScrollWin);
IF not Handled THEN H:=FALSE;
END;
WM_DESTROY:
BEGIN
DestroyEditor(Extra);
IF not Handled THEN H:=FALSE;
END;
WM_HSCROLL:CheckHScrollBar(Win,para1,para2,Extra);
WM_VSCROLL:CheckVScrollBar(Win,para1,para2,Extra);
WM_SETFOCUS: {EingabeFocus neu setzen}
BEGIN
pp:=Extra;
IF pp^.InsertMode THEN r:=CharHeight
ELSE r:=2;
ASM
MOV EAX,$Para2
CMP EAX,0
JE !dc ;Window is loosing focus
;Window becomes focus --> Create the cursor
PUSHL 0 ;whole window
PUSHL 4 ;CURSOR_SOLID | CURSOR_FLASH
PUSHL $r ;Cursorheigth
PUSHL _CharWidth
PUSHL 40
PUSHL 40
PUSHL $Win
MOV AL,7
CALLDLL PMWIN,715 ;WinCreateCursor
ADD ESP,28
END;
WinShowCursor(1,Win);
SetCursor(Win,Extra);
InvalidateWindow(Win);
goto l;
ASM
!dc:
;Window is loosing focus --> Destroy the cursor
PUSHL $Win
MOV AL,1
CALLDLL PMWIN,725 ;WinDestroyCursor
ADD ESP,4
END;
l:
END;
WM_BUTTON1Down,WM_BUTTON1Click:
BEGIN
po:=Points(Para1);
lx:=po.x DIV CharWidth;
ly:=po.y DIV CharHeight;
WinQueryWindowrect(rc,Win);
wx:=(rc.xright-rc.xleft) DIV CharWidth;
wy:=(rc.ytop-rc.ybottom) DIV CharHeight;
inc(lx);
if lx>wx then lx:=wx;
ly:=wy-ly;
if ly<1 then ly:=1;
pp:=Extra;
pp^.SelectColumnStart:=65535;
pp^.SelectLineStart:=65535;
pp^.SelectColumnEnd:=65535;
pp^.SelectLineEnd:=65535;
IF lx=pp^.CursorX THEN IF ly=pp^.Cursory THEN goto ll;
pp^.CursorX:=lx;
pp^.CursorY:=ly;
SetCursor(Win,pp);
InvalidateEditorWindow(Win,pp)
ll:
IF not Handled THEN H:=FALSE;
END;
WM_BUTTON2Click:MessageBox('Right mouse button clicked');
WM_MOUSEDRAG1:
BEGIN
po:=Points(Para1);
lx:=po.x DIV CharWidth;
ly:=po.y DIV CharHeight;
WinQueryWindowrect(rc,Win);
wx:=(rc.xright-rc.xleft) DIV CharWidth;
wy:=(rc.ytop-rc.ybottom) DIV CharHeight;
inc(lx);
if lx>wx then lx:=wx;
ly:=wy-ly;
if ly<1 then ly:=1;
pp:=Extra;
IF lx=pp^.CursorX THEN IF ly=pp^.Cursory THEN
IF ly<pp^.TextViewY-1 THEN IF ly>1 THEN goto ll1;
pp^.CursorX:=lx;
pp^.CursorY:=ly;
SetCursor(Win,pp);
ww:=pp^.HSlider.acvalue+pp^.CursorX-1;
ww1:=pp^.vSlider.acvalue+pp^.CursorY-1;
IF pp^.SelectLineStart=65535 THEN
BEGIN
pp^.SelectLineStart:=ww1;
pp^.SelectAnchorLine:=ww1;
END;
IF ww1>=pp^.SelectAnchorLine THEN
BEGIN
pp^.SelectLineEnd:=ww1;
pp^.SelectLineStart:=pp^.SelectAnchorLine;
END;
ELSE
BEGIN
pp^.SelectLineStart:=ww1;
pp^.SelectLineEnd:=pp^.SelectAnchorLine;
END;
IF pp^.SelectColumnStart=65535 THEN
BEGIN
pp^.SelectColumnStart:=ww;
pp^.SelectAnchorColumn:=ww;
END;
IF ww1=pp^.SelectLineStart THEN
BEGIN
IF ww>=pp^.SelectAnchorColumn THEN
BEGIN
IF ww1=pp^.SelectLineEnd THEN pp^.SelectColumnEnd:=ww;
pp^.SelectColumnStart:=pp^.SelectAnchorColumn;
END;
ELSE
BEGIN
pp^.SelectColumnStart:=ww;
IF ww1=pp^.SelectLineEnd THEN pp^.SelectColumnEnd:=
pp^.SelectAnchorColumn;
END;
END;
IF ww1=pp^.SelectLineEnd THEN IF ww1<>pp^.SelectLineStart THEN
pp^.SelectColumnEnd:=ww;
dec(ww1,pp^.VSlider.AcValue);
IF ww1=pp^.TextViewY-1 THEN
BEGIN
LineDown(Win,pp);
LastDragPos:=para1;
DragWindow:=Win;
Drag_Mode:=TRUE;
END
ELSE
BEGIN
IF ww1=0 THEN
BEGIN
LineUp(Win,pp);
LastDragPos:=para1;
DragWindow:=Win;
Drag_Mode:=TRUE;
END
ELSE Drag_Mode:=FALSE;
END;
InvalidateEditorWindow(Win,pp);
ll1:
IF not Handled THEN H:=FALSE;
END;
ELSE IF not Handled THEN H:=FALSE;
END; {Case}
Handled:=H;
r:=Inherited.MDIHandleEvent(Win,Msg,para1,para2,Handled,Extra);
MDIHandleEvent:=r;
END;
BEGIN
END.