mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-09 01:28:19 +02:00
SynEdit: add color setting for visualized special chars (whitespace)
git-svn-id: trunk@32368 -
This commit is contained in:
parent
cd46dbb0ae
commit
e5ce00364c
1
.gitattributes
vendored
1
.gitattributes
vendored
@ -2249,6 +2249,7 @@ components/synedit/syneditmarkupctrlmouselink.pp svneol=native#text/plain
|
||||
components/synedit/syneditmarkupguttermark.pp svneol=native#text/pascal
|
||||
components/synedit/syneditmarkuphighall.pp svneol=native#text/plain
|
||||
components/synedit/syneditmarkupselection.pp svneol=native#text/plain
|
||||
components/synedit/syneditmarkupspecialchar.pp svneol=native#text/pascal
|
||||
components/synedit/syneditmarkupspecialline.pp svneol=native#text/plain
|
||||
components/synedit/syneditmarkupwordgroup.pp svneol=native#text/plain
|
||||
components/synedit/syneditmiscclasses.pp svneol=native#text/pascal
|
||||
|
@ -7,28 +7,24 @@ unit allsynedit;
|
||||
interface
|
||||
|
||||
uses
|
||||
SynBeautifier, SynCompletion, SynDesignStringConstants, SynEdit,
|
||||
SynEditAutoComplete, SynEditExport, SynEditFoldedView, SynEditHighlighter,
|
||||
SynEditHighlighterFoldBase, SynEditHighlighterXMLBase, SynEditKeyCmds,
|
||||
SynEditLazDsgn, SynEditLines, SynEditMarks, SynEditMarkup,
|
||||
SynEditMarkupBracket, SynEditMarkupCtrlMouseLink, SynEditMarkupHighAll,
|
||||
SynBeautifier, SynCompletion, SynDesignStringConstants, SynEdit, SynEditAutoComplete,
|
||||
SynEditExport, SynEditFoldedView, SynEditHighlighter, SynEditHighlighterFoldBase,
|
||||
SynEditHighlighterXMLBase, SynEditKeyCmds, SynEditLazDsgn, SynEditLines, SynEditMarks,
|
||||
SynEditMarkup, SynEditMarkupBracket, SynEditMarkupCtrlMouseLink, SynEditMarkupHighAll,
|
||||
SynEditMarkupSelection, SynEditMarkupSpecialLine, SynEditMarkupWordGroup,
|
||||
SynEditMiscClasses, SynEditMiscProcs, SynEditMouseCmds, SynEditPlugins,
|
||||
SynEditPointClasses, SynEditRegexSearch, SynEditSearch, SynEditStrConst,
|
||||
SynEditTextBase, SynEditTextBuffer, SynEditTextDoubleWidthChars,
|
||||
SynEditTextTabExpander, SynEditTextTrimmer, SynEditTypes, SynExportHTML,
|
||||
SynGutter, SynGutterBase, SynGutterChanges, SynGutterCodeFolding,
|
||||
SynGutterLineNumber, SynGutterLineOverview, SynGutterMarks,
|
||||
SynEditPointClasses, SynEditRegexSearch, SynEditSearch, SynEditStrConst, SynEditTextBase,
|
||||
SynEditTextBuffer, SynEditTextDoubleWidthChars, SynEditTextTabExpander, SynEditTextTrimmer,
|
||||
SynEditTypes, SynExportHTML, SynGutter, SynGutterBase, SynGutterChanges,
|
||||
SynGutterCodeFolding, SynGutterLineNumber, SynGutterLineOverview, SynGutterMarks,
|
||||
SynHighlighterAny, SynHighlighterCpp, SynHighlighterCss, SynHighlighterDiff,
|
||||
SynHighlighterHashEntries, SynHighlighterHTML, SynHighlighterJava,
|
||||
SynHighlighterJScript, SynHighlighterLFM, SynHighlighterMulti,
|
||||
SynHighlighterPas, SynHighlighterPerl, SynHighlighterPHP,
|
||||
SynHighlighterPosition, SynHighlighterPython, SynHighlighterSQL,
|
||||
SynHighlighterTeX, synhighlighterunixshellscript, SynHighlighterVB,
|
||||
SynHighlighterXML, SynMacroRecorder, SynMemo, SynPluginSyncroEdit,
|
||||
SynPluginSyncronizedEditBase, SynPluginTemplateEdit,
|
||||
SynPropertyEditObjectList, SynRegExpr, SynTextDrawer,
|
||||
SynEditMarkupGutterMark, SynHighlighterBat, SynHighlighterIni,
|
||||
SynHighlighterHashEntries, SynHighlighterHTML, SynHighlighterJava, SynHighlighterJScript,
|
||||
SynHighlighterLFM, SynHighlighterMulti, SynHighlighterPas, SynHighlighterPerl,
|
||||
SynHighlighterPHP, SynHighlighterPosition, SynHighlighterPython, SynHighlighterSQL,
|
||||
SynHighlighterTeX, synhighlighterunixshellscript, SynHighlighterVB, SynHighlighterXML,
|
||||
SynMacroRecorder, SynMemo, SynPluginSyncroEdit, SynPluginSyncronizedEditBase,
|
||||
SynPluginTemplateEdit, SynPropertyEditObjectList, SynRegExpr, SynTextDrawer,
|
||||
SynEditMarkupGutterMark, SynHighlighterBat, SynHighlighterIni, SynEditMarkupSpecialChar,
|
||||
LazarusPackageIntf;
|
||||
|
||||
implementation
|
||||
|
@ -1,11 +1,10 @@
|
||||
<?xml version="1.0"?>
|
||||
<CONFIG>
|
||||
<Package Version="3">
|
||||
<Package Version="4">
|
||||
<Name Value="SynEdit"/>
|
||||
<AddToProjectUsesSection Value="False"/>
|
||||
<Author Value="Lazarus Team, SynEdit"/>
|
||||
<CompilerOptions>
|
||||
<Version Value="9"/>
|
||||
<Version Value="10"/>
|
||||
<SearchPaths>
|
||||
<UnitOutputDirectory Value="units/$(TargetCPU)-$(TargetOS)"/>
|
||||
</SearchPaths>
|
||||
@ -33,7 +32,7 @@ Alternatively, the contents of these files may be used under the terms of the GN
|
||||
If you wish to allow use of your version of these files only under the terms of the GPL and not to allow others to use your version of this file under the MPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the GPL. If you do not delete the provisions above, a recipient may use your version of this file under either the MPL or the GPL.
|
||||
"/>
|
||||
<Version Major="1"/>
|
||||
<Files Count="77">
|
||||
<Files Count="78">
|
||||
<Item1>
|
||||
<Filename Value="synbeautifier.pas"/>
|
||||
<UnitName Value="SynBeautifier"/>
|
||||
@ -345,6 +344,10 @@ If you wish to allow use of your version of these files only under the terms of
|
||||
<Filename Value="synhighlighterini.pas"/>
|
||||
<UnitName Value="SynHighlighterIni"/>
|
||||
</Item77>
|
||||
<Item78>
|
||||
<Filename Value="syneditmarkupspecialchar.pp"/>
|
||||
<UnitName Value="SynEditMarkupSpecialChar"/>
|
||||
</Item78>
|
||||
</Files>
|
||||
<LazDoc Paths="docs/xml"/>
|
||||
<i18n>
|
||||
@ -363,5 +366,8 @@ If you wish to allow use of your version of these files only under the terms of
|
||||
<PublishOptions>
|
||||
<Version Value="2"/>
|
||||
</PublishOptions>
|
||||
<CustomOptions Items="ExternHelp" Version="2">
|
||||
<_ExternHelp Items="Count"/>
|
||||
</CustomOptions>
|
||||
</Package>
|
||||
</CONFIG>
|
||||
|
@ -74,6 +74,7 @@ uses
|
||||
SynEditPointClasses, SynBeautifier, SynEditMarks,
|
||||
SynEditMarkup, SynEditMarkupHighAll, SynEditMarkupBracket, SynEditMarkupWordGroup,
|
||||
SynEditMarkupCtrlMouseLink, SynEditMarkupSpecialLine, SynEditMarkupSelection,
|
||||
SynEditMarkupSpecialChar,
|
||||
SynEditTextBase, SynEditTextTrimmer, SynEditFoldedView, SynEditTextTabExpander,
|
||||
SynEditTextDoubleWidthChars,
|
||||
SynGutterBase, SynGutter, SynGutterCodeFolding, SynGutterChanges,
|
||||
@ -245,8 +246,7 @@ type
|
||||
);
|
||||
TSynEditorShareOptions = set of TSynEditorShareOption;
|
||||
|
||||
TSynVisibleSpecialChar = (vscSpace, vscTabAtFirst, vscTabAtLast);
|
||||
TSynVisibleSpecialChars = set of TSynVisibleSpecialChar;
|
||||
TSynVisibleSpecialChars = SynEditTypes.TSynVisibleSpecialChars;
|
||||
|
||||
const
|
||||
// MouseAction related options will have no effect (as default), unless they
|
||||
@ -365,6 +365,7 @@ type
|
||||
fMarkupCtrlMouse : TSynEditMarkupCtrlMouseLink;
|
||||
fMarkupSpecialLine : TSynEditMarkupSpecialLine;
|
||||
fMarkupSelection : TSynEditMarkupSelection;
|
||||
fMarkupSpecialChar : TSynEditMarkupSpecialChar;
|
||||
fCharsInWindow: Integer;
|
||||
fCharWidth: Integer;
|
||||
fFontDummy: TFont;
|
||||
@ -1722,8 +1723,10 @@ begin
|
||||
fMarkupCtrlMouse := TSynEditMarkupCtrlMouseLink.Create(self);
|
||||
fMarkupSpecialLine := TSynEditMarkupSpecialLine.Create(self);
|
||||
fMarkupSelection := TSynEditMarkupSelection.Create(self, FBlockSelection);
|
||||
fMarkupSpecialChar := TSynEditMarkupSpecialChar.Create(self);
|
||||
|
||||
fMarkupManager := TSynEditMarkupManager.Create(self);
|
||||
fMarkupManager.AddMarkUp(fMarkupSpecialChar);
|
||||
fMarkupManager.AddMarkUp(fMarkupSpecialLine);
|
||||
fMarkupManager.AddMarkUp(fMarkupHighCaret);
|
||||
fMarkupManager.AddMarkUp(fMarkupHighAll);
|
||||
@ -1796,6 +1799,7 @@ begin
|
||||
FOptions2 := SYNEDIT_DEFAULT_OPTIONS2;
|
||||
FShareOptions := SYNEDIT_DEFAULT_SHARE_OPTIONS;
|
||||
FVisibleSpecialChars := SYNEDIT_DEFAULT_VISIBLESPECIALCHARS;
|
||||
fMarkupSpecialChar.VisibleSpecialChars := SYNEDIT_DEFAULT_VISIBLESPECIALCHARS;
|
||||
UpdateOptions;
|
||||
UpdateOptions2;
|
||||
fScrollTimer := TTimer.Create(Self);
|
||||
@ -5623,6 +5627,7 @@ procedure TCustomSynEdit.SetVisibleSpecialChars(AValue: TSynVisibleSpecialChars)
|
||||
begin
|
||||
if FVisibleSpecialChars = AValue then Exit;
|
||||
FVisibleSpecialChars := AValue;
|
||||
fMarkupSpecialChar.VisibleSpecialChars := AValue;
|
||||
if eoShowSpecialChars in Options then Invalidate;
|
||||
end;
|
||||
|
||||
@ -7377,6 +7382,7 @@ begin
|
||||
UpdateCaret;
|
||||
if (eoShowSpecialChars in ChangedOptions) and HandleAllocated then
|
||||
Invalidate;
|
||||
fMarkupSpecialChar.Enabled := (eoShowSpecialChars in ChangedOptions);
|
||||
|
||||
(* Deal with deprecated values
|
||||
Those are all controlled by mouse-actions.
|
||||
|
153
components/synedit/syneditmarkupspecialchar.pp
Normal file
153
components/synedit/syneditmarkupspecialchar.pp
Normal file
@ -0,0 +1,153 @@
|
||||
{-------------------------------------------------------------------------------
|
||||
The contents of this file are subject to the Mozilla Public License
|
||||
Version 1.1 (the "License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
http://www.mozilla.org/MPL/
|
||||
|
||||
Software distributed under the License is distributed on an "AS IS" basis,
|
||||
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
|
||||
the specific language governing rights and limitations under the License.
|
||||
|
||||
Alternatively, the contents of this file may be used under the terms of the
|
||||
GNU General Public License Version 2 or later (the "GPL"), in which case
|
||||
the provisions of the GPL are applicable instead of those above.
|
||||
If you wish to allow use of your version of this file only under the terms
|
||||
of the GPL and not to allow others to use your version of this file
|
||||
under the MPL, indicate your decision by deleting the provisions above and
|
||||
replace them with the notice and other provisions required by the GPL.
|
||||
If you do not delete the provisions above, a recipient may use your version
|
||||
of this file under either the MPL or the GPL.
|
||||
|
||||
-------------------------------------------------------------------------------}
|
||||
unit SynEditMarkupSpecialChar;
|
||||
|
||||
{$mode objfpc}{$H+}
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Classes, SysUtils, Graphics, Controls, LCLProc,
|
||||
SynEditMarkup, SynEditTypes, SynEditMiscClasses;
|
||||
|
||||
type
|
||||
|
||||
{ TSynEditMarkupSpecialChar }
|
||||
|
||||
TSynEditMarkupSpecialChar = class(TSynEditMarkup)
|
||||
private
|
||||
FVisibleSpecialChars: TSynVisibleSpecialChars;
|
||||
FHasMarkup: Boolean;
|
||||
FCurLine: String;
|
||||
FCurStart, FCurEnd: integer;
|
||||
procedure SetVisibleSpecialChars(AValue: TSynVisibleSpecialChars);
|
||||
protected
|
||||
procedure DoMarkupChanged(AMarkup: TSynSelectedColor); override;
|
||||
function IsSpecial(pos: Integer): Boolean; inline;
|
||||
public
|
||||
constructor Create(ASynEdit : TSynEditBase);
|
||||
destructor Destroy; override;
|
||||
|
||||
Procedure PrepareMarkupForRow(aRow : Integer); override;
|
||||
Function GetMarkupAttributeAtRowCol(const aRow, aCol: Integer) : TSynSelectedColor; override;
|
||||
Function GetNextMarkupColAfterRowCol(const aRow, aCol: Integer) : Integer; override;
|
||||
|
||||
property VisibleSpecialChars: TSynVisibleSpecialChars read FVisibleSpecialChars write SetVisibleSpecialChars;
|
||||
end;
|
||||
|
||||
implementation
|
||||
|
||||
{ TSynEditMarkupSpecialChar }
|
||||
|
||||
procedure TSynEditMarkupSpecialChar.SetVisibleSpecialChars(AValue: TSynVisibleSpecialChars);
|
||||
begin
|
||||
if FVisibleSpecialChars = AValue then Exit;
|
||||
FVisibleSpecialChars := AValue;
|
||||
SynEdit.Invalidate;
|
||||
end;
|
||||
|
||||
procedure TSynEditMarkupSpecialChar.DoMarkupChanged(AMarkup: TSynSelectedColor);
|
||||
begin
|
||||
inherited DoMarkupChanged(AMarkup);
|
||||
FHasMarkup := AMarkup.IsEnabled;
|
||||
SynEdit.Invalidate;
|
||||
end;
|
||||
|
||||
function TSynEditMarkupSpecialChar.IsSpecial(pos: Integer): Boolean;
|
||||
begin
|
||||
if (pos < 1) or (pos > Length(FCurLine)) then exit(False);
|
||||
Result := ( (vscSpace in FVisibleSpecialChars) and (FCurLine[pos] in [' ']) ) or
|
||||
( (FVisibleSpecialChars*[vscTabAtFirst, vscTabAtLast] <> []) and (FCurLine[pos] in [#9]) )
|
||||
;
|
||||
end;
|
||||
|
||||
constructor TSynEditMarkupSpecialChar.Create(ASynEdit : TSynEditBase);
|
||||
begin
|
||||
inherited Create(ASynEdit);
|
||||
MarkupInfo.Clear;
|
||||
FHasMarkup := False;
|
||||
end;
|
||||
|
||||
destructor TSynEditMarkupSpecialChar.Destroy;
|
||||
begin
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
procedure TSynEditMarkupSpecialChar.PrepareMarkupForRow(aRow : Integer);
|
||||
begin
|
||||
FCurLine := '';
|
||||
FCurStart := -1;
|
||||
FCurEnd := -1;
|
||||
if (not FHasMarkup) or (FVisibleSpecialChars = []) then exit;
|
||||
FCurLine := Lines[aRow-1];
|
||||
end;
|
||||
|
||||
function TSynEditMarkupSpecialChar.GetMarkupAttributeAtRowCol(const aRow, aCol: Integer) : TSynSelectedColor;
|
||||
begin
|
||||
Result := nil;
|
||||
if (FCurLine='') or (not (FHasMarkup and (FVisibleSpecialChars <> []))) then exit;
|
||||
|
||||
if (aCol >= FCurStart) and (aCol < FCurEnd) then begin
|
||||
Result := MarkupInfo;
|
||||
Result.StartX := FCurStart;
|
||||
Result.EndX := FCurEnd - 1;
|
||||
end;
|
||||
end;
|
||||
|
||||
function TSynEditMarkupSpecialChar.GetNextMarkupColAfterRowCol(const aRow, aCol: Integer) : Integer;
|
||||
var
|
||||
s: Boolean;
|
||||
i, LogCol: Integer;
|
||||
begin
|
||||
Result := -1;
|
||||
if (FCurLine='') or (not (FHasMarkup and (FVisibleSpecialChars <> []))) then exit;
|
||||
|
||||
if aCol < FCurStart then exit(FCurStart);
|
||||
if aCol < FCurEnd then exit(FCurEnd);
|
||||
|
||||
LogCol := PhysicalToLogicalPos(Point(aCol, aRow)).x;
|
||||
if LogCol > Length(FCurLine) then exit;
|
||||
if (LogCol = Length(FCurLine)) then begin
|
||||
if IsSpecial(LogCol) then
|
||||
Result := LogicalToPhysicalPos(Point(Length(FCurLine)+1, aRow)).x;
|
||||
exit;
|
||||
end;
|
||||
|
||||
// search next space-seq
|
||||
i := LogCol;
|
||||
s := IsSpecial(LogCol);
|
||||
if s then
|
||||
FCurStart := aCol
|
||||
else begin
|
||||
while (i <= Length(FCurLine)) and (not IsSpecial(i)) do inc(i);
|
||||
FCurStart := LogicalToPhysicalPos(Point(i, aRow)).x;
|
||||
end;
|
||||
|
||||
while (i <= Length(FCurLine)) and (IsSpecial(i)) do inc(i);
|
||||
FCurEnd := LogicalToPhysicalPos(Point(i, aRow)).x;
|
||||
|
||||
if aCol < FCurStart then exit(FCurStart);
|
||||
if aCol < FCurEnd then exit(FCurEnd);
|
||||
end;
|
||||
|
||||
end.
|
||||
|
@ -92,6 +92,9 @@ type
|
||||
);
|
||||
TSynStatusChanges = set of TSynStatusChange;
|
||||
|
||||
TSynVisibleSpecialChar = (vscSpace, vscTabAtFirst, vscTabAtLast);
|
||||
TSynVisibleSpecialChars = set of TSynVisibleSpecialChar;
|
||||
|
||||
TSynLineStyle = (
|
||||
slsSolid, // PS_SOLID pen
|
||||
slsDashed, // PS_DASH pen
|
||||
|
Loading…
Reference in New Issue
Block a user