SynEdit: Refactor SynMarks

git-svn-id: trunk@27037 -
This commit is contained in:
martin 2010-08-08 15:46:27 +00:00
parent 206d235bd0
commit 8dae7aa8b1
6 changed files with 334 additions and 150 deletions

View File

@ -634,7 +634,7 @@ type
procedure SetTopView(const AValue : Integer);
{$ENDIF}
procedure Loaded; override;
procedure MarkListChange(Sender: TObject);
procedure MarkListChange(Sender: TSynEditMark; Changes: TSynEditMarkChangeReasons);
{$IFDEF SYN_MBCSSUPPORT}
procedure MBCSGetSelRangeInLineWhenColumnSelectionMode(const s: string;
var ColFrom, ColTo: Integer);
@ -1118,26 +1118,11 @@ const
type
{ TSynStatusChangedHandlerList }
TStatusChangeEventHandlerListEntry = record
FHandler: TStatusChangeEvent;
FChanges: TSynStatusChanges;
end;
TSynStatusChangedHandlerList = Class
private
FCount: Integer;
FItems: Array of TStatusChangeEventHandlerListEntry;
protected
function IndexOf(AHandler: TStatusChangeEvent): Integer;
function NextDownIndex(var Index: integer): boolean;
TSynStatusChangedHandlerList = Class(TSynFilteredMethodList)
public
constructor Create;
procedure Add(AHandler: TStatusChangeEvent; Changes: TSynStatusChanges);
procedure Remove(AHandler: TStatusChangeEvent);
procedure CallStatusChangedHandlers(Sender: TObject; Changes: TSynStatusChanges);
property Count: Integer read FCount;
end;
{ TSynEditUndoCaret }
@ -1745,7 +1730,8 @@ begin
FMouseActionExecHandlerList := TSynEditMouseActionExecList.Create;
fMarkList := TSynEditMarkList.Create(self, FTheLinesView);
fMarkList.OnChange := {$IFDEF FPC}@{$ENDIF}MarkListChange;
fMarkList.RegisterChangeHandler({$IFDEF FPC}@{$ENDIF}MarkListChange,
[low(TSynEditMarkChangeReason)..high(TSynEditMarkChangeReason)]);
fRightEdgeColor := clSilver;
{$IFDEF SYN_MBCSSUPPORT}
fImeCount := 0;
@ -6553,14 +6539,16 @@ begin
end;
end;
{ Called by FMarkList if change }
procedure TCustomSynEdit.MarkListChange(Sender: TObject);
procedure TCustomSynEdit.MarkListChange(Sender: TSynEditMark; Changes: TSynEditMarkChangeReasons);
begin
{$IFDEF SYN_LAZARUS}
Invalidate; // marks can have special line colors
{$ELSE}
InvalidateGutter;
{$ENDIF}
if (not Sender.Visible) and (not (smcrVisible in Changes)) then
exit;
if smcrLine in Changes then begin
InvalidateLine(Sender.OldLine);
InvalidateGutterLines(Sender.OldLine, Sender.OldLine);
end;
InvalidateLine(Sender.Line);
InvalidateGutterLines(Sender.Line, Sender.Line);
end;
{$IFDEF SYN_LAZARUS}
@ -8715,60 +8703,15 @@ begin
end;
{ TSynStatusChangedHandlerList }
function TSynStatusChangedHandlerList.IndexOf(AHandler: TStatusChangeEvent): Integer;
begin
Result := FCount - 1;
while (Result >= 0) and (FItems[Result].FHandler <> AHandler) do
dec(Result);
end;
function TSynStatusChangedHandlerList.NextDownIndex(var Index: integer): boolean;
begin
if Self<>nil then begin
dec(Index);
if (Index>=FCount) then
Index:=FCount-1;
end else
Index:=-1;
Result:=(Index>=0);
end;
constructor TSynStatusChangedHandlerList.Create;
begin
FCount := 0;
end;
procedure TSynStatusChangedHandlerList.Add(AHandler: TStatusChangeEvent;
Changes: TSynStatusChanges);
var
i: Integer;
begin
i := IndexOf(AHandler);
if i >= 0 then
FItems[i].FChanges := FItems[i].FChanges + Changes
else begin
if FCount >= high(FItems) then
SetLength(FItems, Max(8, FCount * 2));
FItems[FCount].FHandler := AHandler;
FItems[FCount].FChanges := Changes;
inc(FCount);
end;
AddBitFilter(TMethod(AHandler), Pointer(PtrUInt(Changes)));
end;
procedure TSynStatusChangedHandlerList.Remove(AHandler: TStatusChangeEvent);
var
i: Integer;
begin
i := IndexOf(AHandler);
if i < 0 then exit;
while i < FCount - 1 do begin
FItems[i] := FItems[i + 1];
inc(i);
end;
dec(FCount);
if length(FItems) > FCount * 4 then
SetLength(FItems, FCount * 2);
inherited Remove(TMethod(AHandler));
end;
procedure TSynStatusChangedHandlerList.CallStatusChangedHandlers(Sender: TObject;
@ -8777,9 +8720,8 @@ var
i: Integer;
begin
i:=Count;
while NextDownIndex(i) do
if FItems[i].FChanges * Changes <> [] then
FItems[i].FHandler(Sender, Changes);
while NextDownIndexBitFilter(i, Pointer(PtrUInt(Changes))) do
TStatusChangeEvent(FItems[i].FHandler)(Sender, Changes);
end;
initialization

View File

@ -14,26 +14,56 @@ const
type
TSynEditMarkList = class;
TSynEditMark = class;
TSynEditMarkChangeReason = (smcrAdded, smcrRemoved, smcrLine, smcrVisible, smcrChanged);
TSynEditMarkChangeReasons = set of TSynEditMarkChangeReason;
TSynEditMarkChangeEvent = procedure(Sender: TSynEditMark; Changes: TSynEditMarkChangeReasons)
of object;
{ TSynEditMarkChangedHandlerList }
TSynEditMarkChangedHandlerList = Class(TSynFilteredMethodList)
public
procedure Add(AHandler: TSynEditMarkChangeEvent; Changes: TSynEditMarkChangeReasons);
procedure Remove(AHandler: TSynEditMarkChangeEvent);
procedure CallMarkChangedHandlers(Sender: TSynEditMark; Changes: TSynEditMarkChangeReasons);
end;
{ TSynEditMark }
TSynEditMark = class
private
FOldLine: integer;
procedure SetMarkList(const AValue: TSynEditMarkList);
protected
FLine, FColumn, FImage, FPriority: Integer;
FEdit: TSynEditBase;
FMarkList: TSynEditMarkList;
FVisible: boolean;
FInternalImage: boolean;
FBookmarkNum: integer;
function GetEdit: TSynEditBase; virtual;
FChangeLock: Integer;
FChanges: TSynEditMarkChangeReasons;
function GetEdit: TSynEditBase; virtual;
procedure SetColumn(const Value: Integer); virtual;
procedure SetImage(const Value: Integer); virtual;
procedure SetLine(const Value: Integer); virtual;
procedure SetPriority(const AValue: integer); virtual;
procedure SetVisible(const Value: boolean); virtual; //MWE: Laz needs to know when a line gets visible, so the editor color can be updated
procedure SetVisible(const Value: boolean); virtual;
procedure SetInternalImage(const Value: boolean);
function GetIsBookmark: boolean;
function GetIsBookmark: boolean;
procedure DoChange(AChanges: TSynEditMarkChangeReasons); virtual;
procedure ForceChange(AChanges: TSynEditMarkChangeReasons);
public
constructor Create(AOwner: TSynEditBase);
destructor Destroy; override;
procedure IncChangeLock;
procedure DecChangeLock;
property Line: integer read FLine write SetLine;
property OldLine: integer read FOldLine;
property Column: integer read FColumn write SetColumn;
property Priority: integer read FPriority write SetPriority;
property ImageIndex: integer read FImage write SetImage;
@ -41,6 +71,7 @@ type
property Visible: boolean read FVisible write SetVisible;
property InternalImage: boolean read FInternalImage write SetInternalImage;
property IsBookmark: boolean read GetIsBookmark;
property MarkList: TSynEditMarkList read FMarkList write SetMarkList;
end;
TPlaceMarkEvent = procedure(Sender: TObject; var Mark: TSynEditMark) of object;
@ -57,7 +88,9 @@ type
FEdit: TSynEditBase;
FLines: TSynEditStrings;
fOnChange: TNotifyEvent;
FChangeHandlers: TSynEditMarkChangedHandlerList;
procedure DoChange;
procedure MarkChanged(Sender: TSynEditMark; AChanges: TSynEditMarkChangeReasons); virtual;
function Get(Index: Integer): TSynEditMark;
procedure Put(Index: Integer; Item: TSynEditMark);
procedure DoLinesEdited(Sender: TSynEditStrings; aLinePos, aBytePos, aCount,
@ -74,6 +107,8 @@ type
function Last: TSynEditMark;
procedure Place(Mark: TSynEditMark);
function Remove(Item: TSynEditMark): Integer;
procedure RegisterChangeHandler(Handler: TSynEditMarkChangeEvent; Filter: TSynEditMarkChangeReasons);
procedure UnRegisterChangeHandler(Handler: TSynEditMarkChangeEvent);
public
property Items[Index: Integer]: TSynEditMark read Get write Put; default;
property OnChange: TNotifyEvent read FOnChange write FOnChange;
@ -85,9 +120,6 @@ function DoMarksCompareBookmarksLast(Item1, Item2: Pointer): Integer;
implementation
uses SynEdit;
type // This is until InvalidateGutterLines, can be moved to an accessible place
SynEditAccess = Class(TCustomSynEdit);
function DoMarksCompareBookmarksFirst(Item1, Item2: Pointer): Integer;
var
Mark1: TSynEditMark absolute Item1;
@ -162,6 +194,17 @@ begin
FPriority := AValue;
end;
procedure TSynEditMark.SetMarkList(const AValue: TSynEditMarkList);
begin
if AValue = nil then begin
DoChange([smcrRemoved]);
ForceChange(FChanges);
end;
FMarkList := AValue;
if FMarkList <> nil then
DoChange([smcrAdded]);
end;
function TSynEditMark.GetEdit: TSynEditBase;
begin
if FEdit <> nil then try
@ -178,45 +221,61 @@ begin
Result := (fBookmarkNum >= 0);
end;
procedure TSynEditMark.DoChange(AChanges: TSynEditMarkChangeReasons);
begin
if FChangeLock > 0 then begin
FChanges := FChanges + AChanges;
exit;
end;
ForceChange(AChanges);
end;
procedure TSynEditMark.ForceChange(AChanges: TSynEditMarkChangeReasons);
begin
if (FMarkList <> nil) and (AChanges <> []) then
FMarkList.MarkChanged(Self, AChanges);
FChanges := [];
end;
procedure TSynEditMark.SetColumn(const Value: Integer);
begin
if FColumn = Value then
exit;
FColumn := Value;
DoChange([smcrChanged]);
end;
procedure TSynEditMark.SetImage(const Value: Integer);
begin
if FImage = Value then
exit;
FImage := Value;
if FVisible and Assigned(FEdit) then
SynEditAccess(Pointer(FEdit)).InvalidateGutterLines(FLine, FLine);
DoChange([smcrChanged]);
end;
procedure TSynEditMark.SetInternalImage(const Value: boolean);
begin
if FInternalImage = Value then
exit;
FInternalImage := Value;
if FVisible and Assigned(FEdit) then
SynEditAccess(Pointer(FEdit)).InvalidateGutterLines(FLine, FLine);
DoChange([smcrChanged]);
end;
procedure TSynEditMark.SetLine(const Value: Integer);
begin
if FVisible and Assigned(FEdit) then
begin
if FLine > 0 then
SynEditAccess(Pointer(FEdit)).InvalidateGutterLines(FLine, FLine);
FLine := Value;
SynEditAccess(Pointer(FEdit)).InvalidateGutterLines(FLine, FLine);
end else
FLine := Value;
if FLine = Value then
exit;
FOldLine := FLine;
FLine := Value;
DoChange([smcrLine]);
end;
procedure TSynEditMark.SetVisible(const Value: boolean);
begin
if FVisible <> Value then
begin
FVisible := Value;
if Assigned(FEdit) then
SynEditAccess(Pointer(FEdit)).InvalidateGutterLines(FLine, FLine);
end;
if FVisible = Value then
exit;
FVisible := Value;
DoChange([smcrVisible]);
end;
constructor TSynEditMark.Create(AOwner: TSynEditBase);
@ -227,10 +286,32 @@ begin
FPriority := 0;
end;
destructor TSynEditMark.Destroy;
begin
if FMarkList <> nil then begin
DoChange([smcrRemoved]);
FMarkList.Remove(self);
end;
inherited Destroy;
end;
procedure TSynEditMark.IncChangeLock;
begin
inc(FChangeLock);
end;
procedure TSynEditMark.DecChangeLock;
begin
dec(FChangeLock);
if (FChangeLock = 0) and (FChanges <> []) then
DoChange(FChanges);
end;
{ TSynEditMarkList }
function TSynEditMarkList.Add(Item: TSynEditMark): Integer;
begin
Item.MarkList := self;;
Result := inherited Add(Item);
DoChange;
end;
@ -245,6 +326,7 @@ end;
constructor TSynEditMarkList.Create(AOwner: TSynEditBase; ALines: TSynEditStrings);
begin
FChangeHandlers := TSynEditMarkChangedHandlerList.Create;
inherited Create;
FEdit := AOwner;
FLines := ALines;
@ -252,17 +334,17 @@ begin
end;
destructor TSynEditMarkList.Destroy;
var
i: integer;
begin
FLines.RemoveEditHandler(@DoLinesEdited);
for i := 0 to Pred(Count) do
Get(i).Free;
while Count > 0 do
Get(0).Free;
inherited Destroy;
FreeAndNil(FChangeHandlers);
end;
procedure TSynEditMarkList.Delete(Index: Integer);
begin
Items[Index].MarkList := nil;
inherited Delete(Index);
DoChange;
end;
@ -273,6 +355,12 @@ begin
FOnChange(Self);
end;
procedure TSynEditMarkList.MarkChanged(Sender: TSynEditMark;
AChanges: TSynEditMarkChangeReasons);
begin
FChangeHandlers.CallMarkChangedHandlers(Sender, AChanges);
end;
function TSynEditMarkList.First: TSynEditMark;
begin
Result := TSynEditMark(inherited First);
@ -311,6 +399,7 @@ end;
procedure TSynEditMarkList.Insert(Index: Integer; Item: TSynEditMark);
begin
Item.MarkList := Self;
inherited Insert(Index, Item);
DoChange;
end;
@ -384,9 +473,44 @@ end;
function TSynEditMarkList.Remove(Item: TSynEditMark): Integer;
begin
Item.MarkList := nil;
Result := inherited Remove(Item);
DoChange;
end;
procedure TSynEditMarkList.RegisterChangeHandler(Handler: TSynEditMarkChangeEvent;
Filter: TSynEditMarkChangeReasons);
begin
FChangeHandlers.Add(Handler, Filter);
end;
procedure TSynEditMarkList.UnRegisterChangeHandler(Handler: TSynEditMarkChangeEvent);
begin
FChangeHandlers.Remove(Handler);
end;
{ TSynEditMarkChangedHandlerList }
procedure TSynEditMarkChangedHandlerList.Add(AHandler: TSynEditMarkChangeEvent;
Changes: TSynEditMarkChangeReasons);
begin
AddBitFilter(TMethod(AHandler), Pointer(PtrUInt(Changes)));
end;
procedure TSynEditMarkChangedHandlerList.Remove(AHandler: TSynEditMarkChangeEvent);
begin
inherited Remove(TMethod(AHandler));
end;
procedure TSynEditMarkChangedHandlerList.CallMarkChangedHandlers(Sender: TSynEditMark;
Changes: TSynEditMarkChangeReasons);
var
i: Integer;
begin
i:=Count;
while NextDownIndexBitFilter(i, Pointer(PtrUInt(Changes))) do
TSynEditMarkChangeEvent(FItems[i].FHandler)(Sender, Changes);
end;
end.

View File

@ -371,6 +371,35 @@ type
read GetObjectItems write SetObjectItems; default;
end;
TSynFilteredMethodListEntry = record
FHandler: TMethod;
FFilter: Pointer;
end;
{ TSynFilteredMethodList }
TSynFilteredMethodList = Class
private
FCount: Integer;
protected
FItems: Array of TSynFilteredMethodListEntry;
function IndexOf(AHandler: TMethod): Integer;
function IndexOf(AHandler: TMethod; AFilter: Pointer): Integer;
function NextDownIndex(var Index: integer): boolean;
function NextDownIndexNumFilter(var Index: integer; AFilter: Pointer): boolean;
function NextDownIndexBitFilter(var Index: integer; AFilter: Pointer): boolean;
procedure Delete(AIndex: Integer);
public
constructor Create;
procedure AddNumFilter(AHandler: TMethod; AFilter: Pointer); // Separate entries for same method with diff filter
procedure AddBitFilter(AHandler: TMethod; AFilter: Pointer); // Filter is bitmask
procedure Remove(AHandler: TMethod);
procedure Remove(AHandler: TMethod; AFilter: Pointer);
procedure CallNotifyEventsNumFilter(Sender: TObject; AFilter: Pointer);
procedure CallNotifyEventsBitFilter(Sender: TObject; AFilter: Pointer); // filter is Bitmask
property Count: Integer read FCount;
end;
const
synClipTagText = TSynClipboardStreamTag(1);
synClipTagExtText = TSynClipboardStreamTag(2);
@ -1242,5 +1271,131 @@ begin
end;
end;
{ TSynFilteredMethodList }
function TSynFilteredMethodList.IndexOf(AHandler: TMethod): Integer;
begin
Result := FCount - 1;
while (Result >= 0) and
(FItems[Result].FHandler.Code <> AHandler.Code) and
(FItems[Result].FHandler.Data <> AHandler.Data)
do
dec(Result);
end;
function TSynFilteredMethodList.IndexOf(AHandler: TMethod; AFilter: Pointer): Integer;
begin
Result := FCount - 1;
while (Result >= 0) and
(FItems[Result].FHandler.Code <> AHandler.Code) and
(FItems[Result].FHandler.Data <> AHandler.Data) and
(FItems[Result].FFilter <> AFilter)
do
dec(Result);
end;
function TSynFilteredMethodList.NextDownIndex(var Index: integer): boolean;
begin
if Self<>nil then begin
dec(Index);
if (Index>=FCount) then
Index:=FCount-1;
end else
Index:=-1;
Result:=(Index>=0);
end;
function TSynFilteredMethodList.NextDownIndexNumFilter(var Index: integer;
AFilter: Pointer): boolean;
begin
Repeat
Result := NextDownIndex(Index);
until (not Result) or (FItems[Index].FFilter = AFilter);
end;
function TSynFilteredMethodList.NextDownIndexBitFilter(var Index: integer;
AFilter: Pointer): boolean;
begin
Repeat
Result := NextDownIndex(Index);
until (not Result) or (PtrUInt(FItems[Index].FFilter) and PtrUInt(AFilter) <> 0);
end;
procedure TSynFilteredMethodList.Delete(AIndex: Integer);
begin
if AIndex < 0 then exit;
while AIndex < FCount - 1 do begin
FItems[AIndex] := FItems[AIndex + 1];
inc(AIndex);
end;
dec(FCount);
if length(FItems) > FCount * 4 then
SetLength(FItems, FCount * 2);
end;
constructor TSynFilteredMethodList.Create;
begin
FCount := 0;
end;
procedure TSynFilteredMethodList.AddNumFilter(AHandler: TMethod; AFilter: Pointer);
var
i: Integer;
begin
i := IndexOf(AHandler, AFilter);
if i >= 0 then
raise Exception.Create('Duplicate');
if FCount >= high(FItems) then
SetLength(FItems, Max(8, FCount * 2));
FItems[FCount].FHandler := AHandler;
FItems[FCount].FFilter := AFilter;
inc(FCount);
end;
procedure TSynFilteredMethodList.AddBitFilter(AHandler: TMethod; AFilter: Pointer);
var
i: Integer;
begin
i := IndexOf(AHandler);
if i >= 0 then
FItems[i].FFilter := Pointer( PtrUInt(FItems[i].FFilter) or PtrUInt(AFilter) )
else begin
if FCount >= high(FItems) then
SetLength(FItems, Max(8, FCount * 2));
FItems[FCount].FHandler := AHandler;
FItems[FCount].FFilter := AFilter;
inc(FCount);
end;
end;
procedure TSynFilteredMethodList.Remove(AHandler: TMethod);
begin
Delete(IndexOf(AHandler));
end;
procedure TSynFilteredMethodList.Remove(AHandler: TMethod; AFilter: Pointer);
begin
Delete(IndexOf(AHandler, AFilter));
end;
procedure TSynFilteredMethodList.CallNotifyEventsNumFilter(Sender: TObject; AFilter: Pointer);
var
i: Integer;
begin
i:=Count;
while NextDownIndexNumFilter(i, AFilter) do
TNotifyEvent(FItems[i].FHandler)(Sender);
end;
procedure TSynFilteredMethodList.CallNotifyEventsBitFilter(Sender: TObject; AFilter: Pointer);
var
i: Integer;
begin
i:=Count;
while NextDownIndexBitFilter(i, AFilter) do
TNotifyEvent(FItems[i].FHandler)(Sender);
end;
end.

View File

@ -253,7 +253,6 @@ end;
procedure TSynGutterBase.RecalcBounds;
var
NewTop, NewLeft, NewHeight: Integer;
i: Integer;
begin
// gutters act as alLeft or alRight, so Width is not computed here
NewTop := 0;

View File

@ -18,7 +18,6 @@ type
private
FColor: TColor;
FHeight: Integer;
FProviderList: TSynGutterLineOverviewProviderList;
FGutterPart: TSynGutterLineOverview;
FPriority: Integer;
FRGBColor: TColor;
@ -331,8 +330,6 @@ end;
procedure TSynGutterLineOverview.LineCountChanged(Sender: TSynEditStrings; AIndex,
ACount: Integer);
var
r: TRect;
begin
if not SynEdit.HandleAllocated then exit;
FWinControl.Invalidate;

View File

@ -53,20 +53,15 @@ type
FSourceMark: TSourceMark;
FSynEdit: TSynEdit;
FOnChange: TNotifyEvent;
FChangeLock: Integer;
FChangeLock2: Integer;
protected
procedure Changed;
procedure DoChange(AChanges: TSynEditMarkChangeReasons); override;
property OnChange: TNotifyEvent read FOnChange write FOnChange;
procedure Assign(Src: TSourceSynMark);
public
constructor Create(AOwner: TSourceMark; AEditor: TSourceEditorInterface);
destructor Destroy; override;
function GetEdit: TSynEdit; override;
procedure SetColumn(const Value: Integer); override;
procedure SetImage(const Value: Integer); override;
procedure SetLine(const Value: Integer); override;
procedure SetPriority(const AValue: integer); override;
procedure SetVisible(const Value: boolean); override;
property SourceMark: TSourceMark read FSourceMark write FSourceMark;
end;
@ -315,16 +310,18 @@ begin
Result := -AMark.CompareEditorAndLine(EditorAndLine^.EditorID, EditorAndLine^.Line);
end;
procedure TSourceSynMark.Changed;
procedure TSourceSynMark.DoChange(AChanges: TSynEditMarkChangeReasons);
begin
if FChangeLock > 0 then exit;
inherited DoChange(AChanges);
if FChangeLock2 > 0 then exit;
if assigned(FOnChange) then
FOnChange(Self);
end;
procedure TSourceSynMark.Assign(Src: TSourceSynMark);
begin
inc(FChangeLock);
inc(FChangeLock2);
IncChangeLock;
try
Line := Src.Line;
Column := Src.Column;
@ -334,9 +331,9 @@ begin
InternalImage := Src.InternalImage;
BookmarkNumber := Src.BookmarkNumber;
finally
dec(FChangeLock);
DecChangeLock;
dec(FChangeLock2);
end;
Changed;
end;
constructor TSourceSynMark.Create(AOwner: TSourceMark; AEditor: TSourceEditorInterface);
@ -345,7 +342,7 @@ begin
FSourceEditor := AEditor;
FSynEdit := TSynEdit(FSourceEditor.EditorControl);
Inherited Create(FSynEdit);
FChangeLock := 0;
FChangeLock2 := 0;
if FSynEdit <> nil then
FSynEdit.Marks.Add(Self);
end;
@ -495,36 +492,6 @@ begin
Result := FSynEdit;
end;
procedure TSourceSynMark.SetColumn(const Value: Integer);
begin
inherited SetColumn(Value);
Changed;
end;
procedure TSourceSynMark.SetImage(const Value: Integer);
begin
inherited SetImage(Value);
Changed;
end;
procedure TSourceSynMark.SetLine(const Value: Integer);
begin
inherited SetLine(Value);
Changed;
end;
procedure TSourceSynMark.SetPriority(const AValue: integer);
begin
inherited SetPriority(AValue);
Changed;
end;
procedure TSourceSynMark.SetVisible(const Value: boolean);
begin
inherited SetVisible(Value);
Changed;
end;
{ TSourceMark }
procedure TSourceMark.SetSourceMarks(const AValue: TSourceMarks);