From 7af59a81a6229021994275d24d78ca75df5730a0 Mon Sep 17 00:00:00 2001 From: martin Date: Wed, 27 Oct 2010 22:57:04 +0000 Subject: [PATCH] SynEdit: Fixed LineOverviewGutter for new shared marks code git-svn-id: trunk@27913 - --- components/synedit/synedit.pp | 1 + components/synedit/synedittextbase.pas | 1 + components/synedit/syngutterlineoverview.pp | 32 +++++++++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/components/synedit/synedit.pp b/components/synedit/synedit.pp index 0a0a8be292..2194dbd386 100644 --- a/components/synedit/synedit.pp +++ b/components/synedit/synedit.pp @@ -5262,6 +5262,7 @@ var i: Integer; TempPlugins: TList; begin + FLines.SendNotification(senrTextBufferChanging, FLines); // Send the old buffer DestroyMarkList; // Remember all Plugins; Detach from Lines diff --git a/components/synedit/synedittextbase.pas b/components/synedit/synedittextbase.pas index e4b4362cff..06f7896361 100644 --- a/components/synedit/synedittextbase.pas +++ b/components/synedit/synedittextbase.pas @@ -54,6 +54,7 @@ type senrDecPaintLock, senrAfterIncPaintLock, // For plugins, etc... senrBeforeDecPaintLock, + senrTextBufferChanging, // About to change senrTextBufferChanged ); diff --git a/components/synedit/syngutterlineoverview.pp b/components/synedit/syngutterlineoverview.pp index 06c3323a62..9edbaba3bb 100644 --- a/components/synedit/syngutterlineoverview.pp +++ b/components/synedit/syngutterlineoverview.pp @@ -250,6 +250,8 @@ type procedure DoMarkChange(Sender: TSynEditMark; Changes: TSynEditMarkChangeReasons); function CreateGutterMark(ASynMark: TSynEditMark): TSynGutterLOvMark; function IndexOfSynMark(ASynMark: TSynEditMark): Integer; + procedure BufferChanging(Sender: TObject); + procedure BufferChanged(Sender: TObject); public constructor Create(AOwner: TComponent); override; destructor Destroy; override; @@ -1146,17 +1148,47 @@ begin while Result >= 0 do begin; if FMarkList[Result].FData = Pointer(ASynMark) then exit; dec(Result); + end; end; +procedure TSynGutterLOvProviderBookmarks.BufferChanging(Sender: TObject); +begin + TSynEdit(SynEdit).Marks.UnRegisterChangeHandler({$IFDEF FPC}@{$ENDIF}DoMarkChange); +end; + +procedure TSynGutterLOvProviderBookmarks.BufferChanged(Sender: TObject); +var + i: Integer; +begin + TSynEditStringList(Sender).RemoveHanlders(self); + TSynEditStringList(TextBuffer).AddGenericHandler(senrTextBufferChanging, TMethod({$IFDEF FPC}@{$ENDIF}BufferChanging)); + TSynEditStringList(TextBuffer).AddGenericHandler(senrTextBufferChanged, TMethod({$IFDEF FPC}@{$ENDIF}BufferChanged)); + TSynEdit(SynEdit).Marks.RegisterChangeHandler({$IFDEF FPC}@{$ENDIF}DoMarkChange, + [smcrAdded, smcrRemoved, smcrLine, smcrVisible, smcrChanged]); + + while FMarkList.Count > 0 do begin + FMarkList[0].Destroy; + FMarkList.Delete(0); + end; + + for i := 0 to TSynEdit(SynEdit).Marks.Count - 1 do + if TSynEdit(SynEdit).Marks[i].Visible then + CreateGutterMark(TSynEdit(SynEdit).Marks[i]); +end; + constructor TSynGutterLOvProviderBookmarks.Create(AOwner: TComponent); var i: Integer; begin inherited Create(AOwner); Color := clBlue; + TSynEditStringList(TextBuffer).AddGenericHandler(senrTextBufferChanging, TMethod({$IFDEF FPC}@{$ENDIF}BufferChanging)); + TSynEditStringList(TextBuffer).AddGenericHandler(senrTextBufferChanged, TMethod({$IFDEF FPC}@{$ENDIF}BufferChanged)); + TSynEdit(SynEdit).Marks.RegisterChangeHandler({$IFDEF FPC}@{$ENDIF}DoMarkChange, [smcrAdded, smcrRemoved, smcrLine, smcrVisible, smcrChanged]); + for i := 0 to TSynEdit(SynEdit).Marks.Count - 1 do if TSynEdit(SynEdit).Marks[i].Visible then CreateGutterMark(TSynEdit(SynEdit).Marks[i]);