SynEdit: add color setting for visualized special chars (whitespace)

git-svn-id: trunk@32368 -
This commit is contained in:
martin 2011-09-16 16:22:38 +00:00
parent cd46dbb0ae
commit e5ce00364c
6 changed files with 190 additions and 25 deletions

1
.gitattributes vendored
View File

@ -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

View File

@ -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

View File

@ -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>

View File

@ -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.

View 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.

View File

@ -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