240 lines
5.9 KiB
PHP
240 lines
5.9 KiB
PHP
{$ifdef nnn}begin end;{$endif}
|
|
|
|
function TATSynEdit.DoCalcLineHiliteEx(ALineIndex: integer;
|
|
var AParts: TATLineParts;
|
|
AColorBG: TColor; out AColorAfter: TColor): boolean;
|
|
const
|
|
cMaxCharsInLine = 50*1024;
|
|
var
|
|
WrapItem: TATSynWrapItem;
|
|
Str: atString;
|
|
begin
|
|
Result:= Strings.IsIndexValid(ALineIndex);
|
|
if not Result then exit;
|
|
FillChar(AParts, SizeOf(AParts), 0);
|
|
|
|
Str:= Strings.Lines[ALineIndex];
|
|
if Str='' then exit;
|
|
|
|
WrapItem:= TATSynWrapItem.Create(ALineIndex, 1, Length(Str), 0, cWrapItemFinal);
|
|
try
|
|
AColorAfter:= AColorBG;
|
|
DoCalcLineHilite(WrapItem, AParts, 0, cMaxCharsInLine,
|
|
AColorBG, false, AColorAfter);
|
|
finally
|
|
FreeAndNil(WrapItem);
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
procedure TATSynEdit.DoCalcLineHilite(const AItem: TATSynWrapItem;
|
|
var AParts: TATLineParts; ACharsSkipped, ACharsMax: integer;
|
|
AColorBG: TColor; AColorForced: boolean; var AColorAfter: TColor);
|
|
var
|
|
nMaxOffset, nCharIndex, nLineIndex, nLineLen: integer;
|
|
begin
|
|
nMaxOffset:= Min(ACharsMax, AItem.NLength-ACharsSkipped);
|
|
nLineIndex:= AItem.NLineIndex;
|
|
nLineLen:= AItem.NLength;
|
|
nCharIndex:= AItem.NCharIndex+ACharsSkipped;
|
|
|
|
FillChar(AParts, SizeOf(AParts), 0);
|
|
if Assigned(FAdapterHilite) then
|
|
FAdapterHilite.OnEditorCalcHilite(Self, AParts, nLineIndex, nCharIndex, nLineLen, AColorAfter);
|
|
if Assigned(FOnCalcHilite) then
|
|
FOnCalcHilite(Self, AParts, nLineIndex, nCharIndex, nLineLen, AColorAfter);
|
|
|
|
DoPartSetColorBG(AParts, AColorBG, AColorForced);
|
|
if AColorForced then
|
|
AColorAfter:= AColorBG;
|
|
|
|
//first add Attribs,
|
|
//selection must be over attribs
|
|
DoPartCalc_ApplyAttribsOver(AParts, nMaxOffset, nLineIndex, nCharIndex-1);
|
|
|
|
//Createnew makes parts for selection and fills empty AParts with these parts.
|
|
//Applyover makes parts for selection and inserts these one-by-one over ready AParts
|
|
//calculated before (in adapter or OnCalc event).
|
|
//Maybe possible to always use Applyover but it's slower so i made Createnew for
|
|
//faster render w/out adapter
|
|
if AParts[0].Len>0 then
|
|
begin
|
|
DoPartCalc_ApplyOver(AParts, nMaxOffset, nLineIndex, nCharIndex-1);
|
|
end
|
|
else
|
|
begin
|
|
DoPartCalc_CreateNew(AParts, nMaxOffset, nLineIndex, nCharIndex-1, AColorBG);
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure TATSynEdit.DoPartCalc_CreateNew(var AParts: TATLineParts;
|
|
AOffsetMax, ALineIndex, ACharIndex: integer; AColorBG: TColor);
|
|
var
|
|
bSel, bSelPrev, bAdd: boolean;
|
|
nIndex, i: integer;
|
|
begin
|
|
bSel:= false;
|
|
bSelPrev:= false;
|
|
nIndex:= -1;
|
|
|
|
for i:= 0 to AOffsetMax do
|
|
begin
|
|
bSel:= IsPosSelected(ACharIndex+i, ALineIndex);
|
|
|
|
if nIndex<0 then
|
|
bAdd:= true
|
|
else
|
|
bAdd:= bSel<>bSelPrev;
|
|
bSelPrev:= bSel;
|
|
|
|
if not bAdd then
|
|
begin
|
|
Inc(AParts[nIndex].Len);
|
|
end
|
|
else
|
|
begin
|
|
Inc(nIndex);
|
|
if nIndex>=High(AParts) then Break;
|
|
with AParts[nIndex] do
|
|
begin
|
|
Offset:= i;
|
|
Len:= 1;
|
|
if bSel then
|
|
begin
|
|
ColorFont:= FColors.TextSelFont;//random($ffff);
|
|
ColorBG:= FColors.TextSelBG;
|
|
end
|
|
else
|
|
begin
|
|
ColorFont:= GetColorTextFont;//random($ffff);
|
|
ColorBG:= AColorBG;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TATSynEdit.DoPartCalc_ApplyOver(var AParts: TATLineParts; AOffsetMax,
|
|
ALineIndex, ACharIndex: integer);
|
|
var
|
|
bSel, bSelPrev: boolean;
|
|
Part: TATLinePart;
|
|
i: integer;
|
|
begin
|
|
FillChar(Part{%H-}, SizeOf(Part), 0);
|
|
Part.ColorFont:= Colors.TextSelFont;
|
|
Part.ColorBG:= Colors.TextSelBG;
|
|
|
|
bSel:= false;
|
|
bSelPrev:= false;
|
|
|
|
for i:= 0 to AOffsetMax do
|
|
begin
|
|
bSel:= IsPosSelected(ACharIndex+i, ALineIndex);
|
|
|
|
if bSel and (i=AOffsetMax) then
|
|
begin
|
|
DoPartInsert(AParts, Part, true);
|
|
Break
|
|
end;
|
|
|
|
if bSel and bSelPrev then
|
|
Inc(Part.Len)
|
|
else
|
|
if not bSelPrev and bSel then
|
|
begin
|
|
Part.Offset:= i;
|
|
Part.Len:= 1;
|
|
end
|
|
else
|
|
if bSelPrev and not bSel then
|
|
begin
|
|
DoPartInsert(AParts, Part, true);
|
|
end;
|
|
bSelPrev:= bSel;
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure TATSynEdit.DoCalcPosColor(AX, AY: integer; var AColor: TColor);
|
|
begin
|
|
if Assigned(FAdapterHilite) then
|
|
FAdapterHilite.OnEditorCalcPosColor(Self, AX, AY, AColor);
|
|
end;
|
|
|
|
procedure TATSynEdit.DoCalcLineEntireColor(ALine: integer; ACoordTop: integer;
|
|
ALineWithCaret: boolean; out AColor: TColor; out AColorForced: boolean);
|
|
var
|
|
BmKind: integer;
|
|
begin
|
|
AColor:= clNone;
|
|
|
|
BmKind:= Strings.LinesBm[ALine];
|
|
if BmKind<>0 then
|
|
begin
|
|
AColor:= Colors.BookmarkBG;
|
|
if Assigned(FOnCalcBookmarkColor) then
|
|
FOnCalcBookmarkColor(Self, BmKind, AColor);
|
|
end;
|
|
|
|
if FOptShowCurLine then
|
|
begin
|
|
if FOptShowCurLineMinimal then
|
|
begin
|
|
if ALineWithCaret and IsLinePartWithCaret(ALine, ACoordTop) then
|
|
AColor:= Colors.CurrentLineBG;
|
|
end
|
|
else
|
|
begin
|
|
if ALineWithCaret then
|
|
AColor:= Colors.CurrentLineBG;
|
|
end;
|
|
end;
|
|
|
|
if FMarkedRange.Count=2 then
|
|
if (ALine>=FMarkedRange.Items[0].PosY) and
|
|
(ALine<=FMarkedRange.Items[1].PosY) then
|
|
AColor:= Colors.MarkedLinesBG;
|
|
|
|
AColorForced:= AColor<>clNone;
|
|
if not AColorForced then
|
|
AColor:= GetColorTextBG;
|
|
end;
|
|
|
|
|
|
procedure TATSynEdit.DoPartCalc_ApplyAttribsOver(var AParts: TATLineParts;
|
|
AOffsetMax, ALineIndex, ACharIndex: integer);
|
|
var
|
|
i: integer;
|
|
Attr: TATMarkerItem;
|
|
Part: TATLinePart;
|
|
PartObj: TATLinePartClass;
|
|
begin
|
|
for i:= 0 to Attribs.Count-1 do
|
|
begin
|
|
Attr:= Attribs[i];
|
|
PartObj:= TATLinePartClass(Attr.Ptr);
|
|
if Assigned(PartObj) then
|
|
if Attr.PosY=ALineIndex then
|
|
begin
|
|
//empty parts? init part for whole line, for DoPartInsert to work
|
|
if AParts[0].Len=0 then
|
|
begin
|
|
AParts[0].Offset:= 0;
|
|
AParts[0].Len:= AOffsetMax;
|
|
AParts[0].ColorBG:= Colors.TextBG;
|
|
AParts[0].ColorFont:= Colors.TextFont;
|
|
end;
|
|
|
|
Part:= PartObj.Data;
|
|
Part.Len:= Attr.SelLen;
|
|
Part.Offset:= Attr.PosX-ACharIndex;
|
|
DoPartInsert(AParts, Part, false);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|