From 8dae7aa8b13c3118a47da910e7f6f4cf961b8dea Mon Sep 17 00:00:00 2001 From: martin Date: Sun, 8 Aug 2010 15:46:27 +0000 Subject: [PATCH] SynEdit: Refactor SynMarks git-svn-id: trunk@27037 - --- components/synedit/synedit.pp | 92 ++-------- components/synedit/syneditmarks.pp | 180 +++++++++++++++++--- components/synedit/syneditmiscclasses.pp | 155 +++++++++++++++++ components/synedit/syngutterbase.pp | 1 - components/synedit/syngutterlineoverview.pp | 3 - ide/sourcemarks.pas | 53 ++---- 6 files changed, 334 insertions(+), 150 deletions(-) diff --git a/components/synedit/synedit.pp b/components/synedit/synedit.pp index e99534041b..eb741ead8f 100644 --- a/components/synedit/synedit.pp +++ b/components/synedit/synedit.pp @@ -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 diff --git a/components/synedit/syneditmarks.pp b/components/synedit/syneditmarks.pp index a416ddb5c3..4c4e0612a9 100644 --- a/components/synedit/syneditmarks.pp +++ b/components/synedit/syneditmarks.pp @@ -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. diff --git a/components/synedit/syneditmiscclasses.pp b/components/synedit/syneditmiscclasses.pp index 861968d32b..1d48c5ff8d 100644 --- a/components/synedit/syneditmiscclasses.pp +++ b/components/synedit/syneditmiscclasses.pp @@ -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. diff --git a/components/synedit/syngutterbase.pp b/components/synedit/syngutterbase.pp index a7314af073..241536f176 100644 --- a/components/synedit/syngutterbase.pp +++ b/components/synedit/syngutterbase.pp @@ -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; diff --git a/components/synedit/syngutterlineoverview.pp b/components/synedit/syngutterlineoverview.pp index eef48c41ae..cea141509b 100644 --- a/components/synedit/syngutterlineoverview.pp +++ b/components/synedit/syngutterlineoverview.pp @@ -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; diff --git a/ide/sourcemarks.pas b/ide/sourcemarks.pas index 8574e66c44..eb66b2f515 100644 --- a/ide/sourcemarks.pas +++ b/ide/sourcemarks.pas @@ -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);