SynEdit, Refactor: Moved Modified/ChangStamp completely to TextBuffer (shred editors share this state)

git-svn-id: trunk@24633 -
This commit is contained in:
martin 2010-04-15 18:42:04 +00:00
parent 622b9e77e6
commit 261424827b
4 changed files with 126 additions and 157 deletions

View File

@ -413,7 +413,6 @@ type
FMouseActions, FMouseSelActions: TSynEditMouseActions;
FMouseActionSearchHandlerList: TSynEditMouseActionSearchList;
FMouseActionExecHandlerList: TSynEditMouseActionExecList;
fModified: Boolean;
fMarkList: TSynEditMarkList;
fExtraLineSpacing: integer;
FUseUTF8: boolean;
@ -447,16 +446,15 @@ type
fOnReplaceText: TReplaceTextEvent;
fOnSpecialLineColors: TSpecialLineColorsEvent;// needed, because bug fpc 11926
fOnStatusChange: TStatusChangeEvent;
{$IFDEF SYN_LAZARUS}
FOnSpecialLineMarkup: TSpecialLineMarkupEvent;// needed, because bug fpc 11926
FOnClickLink: TMouseEvent;
FOnMouseLink: TSynMouseLinkEvent;
fChangeStamp: int64;
{$ENDIF}
procedure AquirePrimarySelection;
function GetChangeStamp: int64;
function GetDefSelectionMode: TSynSelectionMode;
function GetFoldState: String;
function GetModified: Boolean;
function GetPaintLockOwner: TSynEditBase;
function GetPlugin(Index: Integer): TSynEditPlugin;
function GetTextBetweenPoints(aStartPoint, aEndPoint: TPoint): String;
@ -571,8 +569,8 @@ type
procedure SetParagraphBlock(Value: TPoint);
procedure SizeOrFontChanged(bFont: boolean);
procedure StatusChanged(AChanges: TSynStatusChanges);
procedure UpdateModified;
procedure UndoRedoAdded(Sender: TObject);
procedure ModifiedChanged(Sender: TObject);
procedure UnlockUndo;
procedure UpdateCaret(IgnorePaintLock: Boolean = False);
procedure UpdateScrollBars;
@ -600,7 +598,6 @@ type
procedure Resize; override;
function RealGetText: TCaption; override;
procedure RealSetText(const Value: TCaption); override;
procedure IncreaseChangeStamp;
function GetLines: TStrings; override;
function GetViewedTextBuffer: TSynEditStrings; override;
function GetTextBuffer: TSynEditStrings; override;
@ -870,7 +867,7 @@ type
property Marks: TSynEditMarkList read fMarkList;
property MaxLeftChar: integer read fMaxLeftChar write SetMaxLeftChar
default 1024;
property Modified: Boolean read fModified write SetModified;
property Modified: Boolean read GetModified write SetModified;
property PaintLock: Integer read fPaintLock;
property ReadOnly: Boolean read GetReadOnly write SetReadOnly default FALSE;
property SelAvail: Boolean read GetSelAvail;
@ -885,7 +882,7 @@ type
property UseUTF8: boolean read FUseUTF8;
procedure Update; override;
procedure Invalidate; override;
property ChangeStamp: int64 read fChangeStamp;
property ChangeStamp: int64 read GetChangeStamp;
{$ENDIF}
procedure ShareTextBufferFrom(AShareEditor: TCustomSynEdit);
procedure UnShareTextBuffer;
@ -1318,6 +1315,11 @@ begin
end;
end;
function TCustomSynEdit.GetChangeStamp: int64;
begin
Result := TSynEditStringList(FLines).TextChangeStamp;
end;
function TCustomSynEdit.GetDefSelectionMode: TSynSelectionMode;
begin
Result := FBlockSelection.SelectionMode;
@ -1328,6 +1330,11 @@ begin
Result := FFoldedLinesView.GetFoldDescription(0, 0, -1, -1, True);
end;
function TCustomSynEdit.GetModified: Boolean;
begin
Result := TSynEditStringList(FLines).Modified;
end;
function TCustomSynEdit.GetPaintLockOwner: TSynEditBase;
begin
Result := TSynEditStringList(FLines).PaintLockOwner;
@ -1536,7 +1543,7 @@ begin
FTheLinesView := FTabbedLinesView;
FTopLinesView := FTrimmedLinesView;
// External Accessor
FStrings := TSynEditLines.Create(FLines, {$IFDEF FPC}@{$ENDIF}MarkTextAsSaved);
FStrings := TSynEditLines.Create(TSynEditStringList(FLines), {$IFDEF FPC}@{$ENDIF}MarkTextAsSaved);
FCaret.Lines := FTheLinesView;
FInternalCaret.Lines := FTheLinesView;
@ -1549,7 +1556,8 @@ begin
AddNotifyHandler(senrBeginUpdate, {$IFDEF FPC}@{$ENDIF}LinesChanging);
AddNotifyHandler(senrEndUpdate, {$IFDEF FPC}@{$ENDIF}LinesChanged);
AddNotifyHandler(senrCleared, {$IFDEF FPC}@{$ENDIF}ListCleared);
AddNotifyHandler(senrUndoRedoAdded, {$IFDEF FPC}@{$ENDIF}UndoRedoAdded);
AddNotifyHandler(senrUndoRedoAdded, {$IFDEF FPC}@{$ENDIF}Self.UndoRedoAdded);
AddNotifyHandler(senrModifiedChanged, {$IFDEF FPC}@{$ENDIF}ModifiedChanged);
end;
FUndoList := TSynEditStringList(fLines).UndoList;
@ -4108,14 +4116,6 @@ begin
FLines.Text := Value; // Do not trim
end;
procedure TCustomSynEdit.IncreaseChangeStamp;
begin
if fChangeStamp=High(fChangeStamp) then
fChangeStamp:=Low(fChangeStamp)
else
inc(fChangeStamp);
end;
function TCustomSynEdit.CurrentMaxTopLine: Integer;
begin
if (eoScrollPastEof in Options) then
@ -4593,7 +4593,6 @@ procedure TCustomSynEdit.LineCountChanged(Sender: TSynEditStrings;
AIndex, ACount: Integer);
begin
{$IFDEF SYNFOLDDEBUG}debugln(['FOLD-- LineCountChanged Aindex', AIndex, ' ACount=', ACount]);{$ENDIF}
IncreaseChangeStamp;
if (AIndex < FBeautifyStartLineIdx) or (FBeautifyStartLineIdx < 0) then
FBeautifyStartLineIdx := AIndex;
if ACount > 0 then begin
@ -4628,7 +4627,6 @@ procedure TCustomSynEdit.LineTextChanged(Sender: TSynEditStrings;
AIndex, ACount: Integer);
begin
{$IFDEF SYNFOLDDEBUG}debugln(['FOLD-- LineTextChanged Aindex', AIndex, ' ACount=', ACount]);{$ENDIF}
IncreaseChangeStamp;
if (AIndex < FBeautifyStartLineIdx) or (FBeautifyStartLineIdx < 0) then
FBeautifyStartLineIdx := AIndex;
if (AIndex + ACount - 1 > FBeautifyEndLineIdx) then
@ -5062,7 +5060,7 @@ begin
// Recreate te public access to FLines
FreeAndNil(FStrings);
FStrings := TSynEditLines.Create(FLines, {$IFDEF FPC}@{$ENDIF}MarkTextAsSaved);
FStrings := TSynEditLines.Create(TSynEditStringList(FLines), {$IFDEF FPC}@{$ENDIF}MarkTextAsSaved);
// Attach Highlighter
if FHighlighter <> nil then
@ -7630,21 +7628,7 @@ end;
procedure TCustomSynEdit.SetModified(Value: boolean);
begin
if Value then
IncreaseChangeStamp;
if Value <> fModified then
begin
fModified := Value;
{$IFDEF SYN_LAZARUS}
if not fModified then
begin
// the current state should be the unmodified state.
fUndoList.MarkTopAsUnmodified;
fRedoList.MarkTopAsUnmodified;
end;
{$ENDIF}
StatusChanged([scModified]);
end;
TSynEditStringList(FLines).Modified := Value;
end;
{$IFNDEF SYN_LAZARUS}
@ -8398,28 +8382,18 @@ begin
end;
end;
procedure TCustomSynEdit.UpdateModified;
begin
if fUndoList.UnModifiedMarkerExists then
Modified:=not fUndoList.IsTopMarkedAsUnmodified
else if fRedoList.UnModifiedMarkerExists then
Modified:=not fRedoList.IsTopMarkedAsUnmodified
else
Modified := fUndoList.CanUndo or fUndoList.FullUndoImpossible; //mh 2000-10-03
end;
procedure TCustomSynEdit.UndoRedoAdded(Sender: TObject);
begin
IncreaseChangeStamp;
UpdateModified;
// we have to clear the redo information, since adding undo info removes
// the necessary context to undo earlier edit actions
if (Sender = fUndoList) and not (fUndoList.IsInsideRedo) then //mh 2000-10-30
fRedoList.Clear;
// Todo: Check Paintlock, otherwise move to LinesChanged, LineCountChanged
if Assigned(fOnChange) then
fOnChange(Self);
end;
procedure TCustomSynEdit.ModifiedChanged(Sender: TObject);
begin
StatusChanged([scModified]);
end;
function TCustomSynEdit.LogicalToPhysicalPos(const p: TPoint): TPoint;
begin
Result := FTheLinesView.LogicalToPhysicalPos(p);

View File

@ -34,7 +34,7 @@ unit SynEditLines;
interface
uses
Classes, SysUtils, FileUtil, FPCAdds, SynEditTextBase;
Classes, SysUtils, FileUtil, FPCAdds, SynEditTextBuffer;
type
@ -45,7 +45,7 @@ type
TSynEditLines = class(TStrings)
private
fDosFileFormat: boolean;
FTextBuffer: TSynEditStrings;
FTextBuffer: TSynEditStringList;
FOnSaved: TSavedNotification;
function GetTextChangeStamp: int64;
protected
@ -60,7 +60,7 @@ type
{$IFDEF SYN_COMPILER_3_UP} override; {$ENDIF}
procedure SetUpdateState(Updating: Boolean); override;
public
constructor Create(ATextBuffer: TSynEditStrings; OnSaved: TSavedNotification);
constructor Create(ATextBuffer: TSynEditStringList; OnSaved: TSavedNotification);
function Add(const S: string): integer; override;
procedure AddStrings(AStrings: TStrings); override;
procedure Clear; override;
@ -70,7 +70,7 @@ type
procedure LoadFromFile(const FileName: string); override;
procedure SaveToFile(const FileName: string); override;
property DosFileFormat: boolean read fDosFileFormat write fDosFileFormat;
property TextChangeStamp: int64 read GetTextChangeStamp;
property TextChangeStamp: int64 read GetTextChangeStamp; deprecated '#############';
end;
implementation
@ -273,7 +273,7 @@ end;
{ TSynEditLines }
constructor TSynEditLines.Create(ATextBuffer: TSynEditStrings; OnSaved: TSavedNotification);
constructor TSynEditLines.Create(ATextBuffer: TSynEditStringList; OnSaved: TSavedNotification);
begin
inherited Create;
FTextBuffer := ATextBuffer;

View File

@ -38,13 +38,16 @@ type
Text: String) of object;
TSynEditNotifyReason = ( // TStringListLineCountEvent
senrLineCount, senrLineChange, senrEditAction,
senrHighlightChanged, // used by Highlighter
senrLineCount, // Lines Inserted or Deleted (if not empty, they will trigger senrLineChange too)
senrLineChange, // Lines modified (also triggered by senrEditAction)
senrHighlightChanged, // used by Highlighter (invalidate and fold checks needed)
// TStringListLineEditEvent
senrTextEdit,
senrEditAction, // EditInsert, EditDelete, EditLineBreak, ...
// TNotifyEvent
senrBeginUpdate, senrEndUpdate, senrCleared,
senrUndoRedoAdded
senrBeginUpdate, senrEndUpdate,
senrCleared,
senrUndoRedoAdded,
senrModifiedChanged // The modified flag was changed
);
TPhysicalCharWidths = Array of Shortint;
@ -84,7 +87,6 @@ type
TSynEditStrings = class(TStrings)
protected
FTextChangeStamp: int64;
FIsUtf8: Boolean;
function GetIsUtf8 : Boolean; virtual;
procedure SetIsUtf8(const AValue : Boolean); virtual;
@ -161,14 +163,12 @@ type
property CurUndoList: TSynEditUndoList read GetCurUndoList; // Re or Undo (Redo while undoing)
property IsUndoing: Boolean read GetIsUndoing write SetIsUndoing;
property IsRedoing: Boolean read GetIsRedoing write SetIsRedoing;
procedure IncreaseTextChangeStamp;
procedure SendHighlightChanged(aIndex, aCount: Integer);
public
property ExpandedStrings[Index: integer]: string read GetExpandedString;
property LengthOfLongestLine: integer read GetLengthOfLongestLine;
property IsUtf8: Boolean read GetIsUtf8 write SetIsUtf8;
property Ranges[Index: TClass]: TSynEditStorageMem read GetRange write PutRange;
property TextChangeStamp: int64 read FTextChangeStamp;
end;
{ TSynEditStringsLinked }
@ -401,12 +401,12 @@ end;
procedure TSynEditStrings.AddEditHandler(AHandler: TStringListLineEditEvent);
begin
AddGenericHandler(senrTextEdit, TMethod(AHandler));
AddGenericHandler(senrEditAction, TMethod(AHandler));
end;
procedure TSynEditStrings.RemoveEditHandler(AHandler: TStringListLineEditEvent);
begin
RemoveGenericHandler(senrTextEdit, TMethod(AHandler));
RemoveGenericHandler(senrEditAction, TMethod(AHandler));
end;
function TSynEditStrings.GetPhysicalCharWidths(Index: Integer): TPhysicalCharWidths;
@ -527,14 +527,6 @@ begin
Result := BytePos + 1 + PhysicalPos - ScreenPos;
end;
procedure TSynEditStrings.IncreaseTextChangeStamp;
begin
if fTextChangeStamp=High(fTextChangeStamp) then
fTextChangeStamp:=Low(fTextChangeStamp)
else
inc(fTextChangeStamp);
end;
procedure TSynEditStrings.SendHighlightChanged(aIndex, aCount: Integer);
begin
SendNotification(senrHighlightChanged, Self, aIndex, aCount);

View File

@ -42,9 +42,8 @@ unit SynEditTextBuffer;
interface
uses
Classes, SysUtils, SynEditTextBase,
FileUtil, LCLProc, LCLIntf, LCLType,
SynEditTypes, SynEditMiscProcs, SynEditMiscClasses;
Classes, SysUtils, LCLProc, LCLIntf, LCLType,
SynEditTextBase, SynEditTypes, SynEditMiscProcs, SynEditMiscClasses;
const
NullRange = TSynEditRange(nil);
@ -139,14 +138,7 @@ type
FAttributeList: Array of TSynEditStringAttribute;
FAttachedSynEditList: TFPList;
FLineRangeNotificationList: TLineRangeNotificationList; // LineCount
FLineChangeNotificationList: TLineRangeNotificationList; // ContentChange (not called on add...)
FLineInvalidateNotificationList: TLineRangeNotificationList; // senrHighlightChanged
FLineEditNotificationList: TLineEditNotificationList;
FUndoRedoAddedNotificationList: TSynMethodList;
FOnChangeList: TSynMethodList;
FOnChangingList: TSynMethodList;
FOnClearedList: TSynMethodList;
FNotifyLists: Array [TSynEditNotifyReason] of TSynMethodList;
FIgnoreSendNotification: array [TSynEditNotifyReason] of Integer;
fDosFileFormat: boolean;
@ -155,6 +147,9 @@ type
FUndoList: TSynEditUndoList;
FIsUndoing, FIsRedoing: Boolean;
FModified: Boolean;
FTextChangeStamp: int64;
function GetAttachedSynEdits(Index: Integer): TSynEditBase;
function GetFlags(Index: Integer): TSynEditStringFlags;
procedure Grow;
@ -162,6 +157,7 @@ type
function ClassIndexForAttribute(AttrIndex: TClass): Integer;
Procedure SetAttributeSize(NewSize: Integer);
procedure SetFlags(Index: Integer; const AValue: TSynEditStringFlags);
procedure SetModified(const AValue: Boolean);
protected
function GetExpandedString(Index: integer): string; override;
function GetLengthOfLongestLine: integer; override;
@ -197,6 +193,7 @@ type
procedure SetUpdateState(Updating: Boolean); override;
procedure UndoEditLinesDelete(LogY, ACount: Integer);
procedure IncreaseTextChangeStamp;
public
constructor Create;
destructor Destroy; override;
@ -228,6 +225,8 @@ type
property LengthOfLongestLine: integer read GetLengthOfLongestLine;
property Flags[Index: Integer]: TSynEditStringFlags read GetFlags
write SetFlags;
property Modified: Boolean read FModified write SetModified;
property TextChangeStamp: int64 read FTextChangeStamp;
public
property UndoList: TSynEditUndoList read GetUndoList write fUndoList;
property RedoList: TSynEditUndoList read GetRedoList write fRedoList;
@ -434,15 +433,17 @@ begin
fRedoList.OnAddedUndo := {$IFDEF FPC}@{$ENDIF}UndoRedoAdded;
FIsUndoing := False;
FIsRedoing := False;
FModified := False;
FLineRangeNotificationList := TLineRangeNotificationList.Create;
FLineChangeNotificationList := TLineRangeNotificationList.Create;
FLineInvalidateNotificationList := TLineRangeNotificationList.Create;
FLineEditNotificationList := TLineEditNotificationList.Create;
FUndoRedoAddedNotificationList := TLineEditNotificationList.Create;
FOnChangeList := TSynMethodList.Create;
FOnChangingList := TSynMethodList.Create;
FOnClearedList := TSynMethodList.Create;
FNotifyLists[senrLineCount] := TLineRangeNotificationList.Create;
FNotifyLists[senrLineChange] := TLineRangeNotificationList.Create;
FNotifyLists[senrHighlightChanged] := TLineRangeNotificationList.Create;
FNotifyLists[senrEditAction] := TLineEditNotificationList.Create;
FNotifyLists[senrBeginUpdate] := TSynMethodList.Create;
FNotifyLists[senrEndUpdate] := TSynMethodList.Create;
FNotifyLists[senrCleared] := TSynMethodList.Create;
FNotifyLists[senrUndoRedoAdded] := TSynMethodList.Create;
FNotifyLists[senrModifiedChanged] := TSynMethodList.Create;
for r := low(TSynEditNotifyReason) to high(TSynEditNotifyReason) do
FIgnoreSendNotification[r] := 0;
@ -456,19 +457,15 @@ begin
end;
destructor TSynEditStringList.Destroy;
var
i: TSynEditNotifyReason;
begin
fAttributeList := nil;
inherited Destroy;
SetCount(0);
SetCapacity(0);
FreeAndNil(FLineRangeNotificationList);
FreeAndNil(FLineChangeNotificationList);
FreeAndNil(FLineInvalidateNotificationList);
FreeAndNil(FLineEditNotificationList);
FreeAndNil(FUndoRedoAddedNotificationList);
FreeAndNil(FOnChangeList);
FreeAndNil(FOnChangingList);
FreeAndNil(FOnClearedList);
for i := low(TSynEditNotifyReason) to high(TSynEditNotifyReason) do
FreeAndNil(FNotifyLists[i]);
FreeAndNil(FUndoList);
FreeAndNil(FRedoList);
FreeAndNil(FAttachedSynEditList);
@ -481,7 +478,7 @@ begin
BeginUpdate;
Result := Count;
InsertItem(Result, S);
FLineRangeNotificationList.CallRangeNotifyEvents(self, Result, Count - Result);
SendNotification(senrLineCount, self, Result, Count - Result);
EndUpdate;
end;
@ -506,7 +503,7 @@ begin
end;
Flags[Count-1] := [];
end;
FLineRangeNotificationList.CallRangeNotifyEvents(self, FirstAdded, Count - FirstAdded);
SendNotification(senrLineCount, self, FirstAdded, Count - FirstAdded);
finally
EndUpdate;
end;
@ -523,8 +520,8 @@ begin
BeginUpdate;
SetCount(0);
SetCapacity(0);
FOnClearedList.CallNotifyEvents(Self);
FLineRangeNotificationList.CallRangeNotifyEvents(self, 0, -c);
FNotifyLists[senrCleared].CallNotifyEvents(Self);
SendNotification(senrLineCount, self, 0, -c);
EndUpdate;
end;
fIndexOfLongestLine := -1;
@ -538,7 +535,7 @@ begin
BeginUpdate;
FList.DeleteRows(Index, 1);
fIndexOfLongestLine := -1;
FLineRangeNotificationList.CallRangeNotifyEvents(self, Index, -1);
SendNotification(senrLineCount, self, Index, -1);
EndUpdate;
end;
@ -550,7 +547,7 @@ begin
ListIndexOutOfBounds(Index);
BeginUpdate;
FList.DeleteRows(Index, NumLines);
FLineRangeNotificationList.CallRangeNotifyEvents(self, Index, -NumLines);
SendNotification(senrLineCount, self, Index, -NumLines);
EndUpdate;
end;
end;
@ -663,7 +660,18 @@ end;
procedure TSynEditStringList.UndoRedoAdded(Sender: TObject);
begin
FUndoRedoAddedNotificationList.CallNotifyEvents(Sender);
// we have to clear the redo information, since adding undo info removes
// the necessary context to undo earlier edit actions
if (Sender = fUndoList) and not (fUndoList.IsInsideRedo) then
fRedoList.Clear;
if fUndoList.UnModifiedMarkerExists then
Modified := not fUndoList.IsTopMarkedAsUnmodified
else if fRedoList.UnModifiedMarkerExists then
Modified := not fRedoList.IsTopMarkedAsUnmodified
else
Modified := fUndoList.CanUndo or fUndoList.FullUndoImpossible;
FNotifyLists[senrUndoRedoAdded].CallNotifyEvents(Sender);
end;
// Maps the Physical Width (ScreenCells) to each character
@ -737,7 +745,7 @@ begin
BeginUpdate;
OldCnt:=Count;
InsertItem(Index, S);
FLineRangeNotificationList.CallRangeNotifyEvents(self, Index, Count - OldCnt);
SendNotification(senrLineCount, self, Index, Count - OldCnt);
EndUpdate;
end;
@ -769,7 +777,7 @@ begin
if Capacity<Count + NumLines then
SetCapacity(Count + NumLines);
FList.InsertRows(Index, NumLines);
FLineRangeNotificationList.CallRangeNotifyEvents(self, Index, NumLines);
SendNotification(senrLineCount, self, Index, NumLines);
finally
EndUpdate;
end;
@ -894,6 +902,21 @@ begin
SetAttribute(TSynEditFlagsClass, Index, Pointer(PtrUInt(Integer(AValue))));
end;
procedure TSynEditStringList.SetModified(const AValue: Boolean);
begin
if AValue then
IncreaseTextChangeStamp;
if FModified = AValue then exit;
FModified := AValue;
if not FModified then
begin
// the current state should be the unmodified state.
FUndoList.MarkTopAsUnmodified;
FRedoList.MarkTopAsUnmodified;
end;
FNotifyLists[senrModifiedChanged].CallNotifyEvents(Self);
end;
procedure TSynEditStringList.MarkModified(AFirst, ALast: Integer);
var
Index: Integer;
@ -914,54 +937,28 @@ end;
procedure TSynEditStringList.AddGenericHandler(AReason: TSynEditNotifyReason; AHandler: TMethod);
begin
case AReason of
senrLineChange : FLineChangeNotificationList.Add(AHandler);
senrLineCount : FLineRangeNotificationList.Add(AHandler);
senrTextEdit: FLineEditNotificationList.Add(TMethod(AHandler));
senrHighlightChanged: FLineInvalidateNotificationList.Add(TMethod(AHandler));
senrBeginUpdate : FOnChangingList.Add(AHandler);
senrEndUpdate : FOnChangeList.Add(AHandler);
senrCleared : FOnClearedList.Add(AHandler);
senrUndoRedoAdded : FUndoRedoAddedNotificationList.Add(AHandler);
end;
FNotifyLists[AReason].Add(AHandler);
end;
procedure TSynEditStringList.RemoveGenericHandler(AReason: TSynEditNotifyReason; AHandler: TMethod);
begin
case AReason of
senrLineChange : FLineChangeNotificationList.Remove(AHandler);
senrLineCount : FLineRangeNotificationList.Remove(AHandler);
senrTextEdit: FLineEditNotificationList.Remove(TMethod(AHandler));
senrHighlightChanged: FLineInvalidateNotificationList.Remove(TMethod(AHandler));
senrBeginUpdate : FOnChangingList.Remove(AHandler);
senrEndUpdate : FOnChangeList.Remove(AHandler);
senrCleared : FOnClearedList.Remove(AHandler);
senrUndoRedoAdded : FUndoRedoAddedNotificationList.Remove(AHandler);
end;
FNotifyLists[AReason].Remove(AHandler);
end;
procedure TSynEditStringList.CopyHanlders(OtherLines: TSynEditStringList; AOwner: TObject = nil);
var
i: TSynEditNotifyReason;
begin
FLineRangeNotificationList.AddCopyFrom(OtherLines.FLineRangeNotificationList, AOwner);
FLineChangeNotificationList.AddCopyFrom(OtherLines.FLineChangeNotificationList, AOwner);
FLineEditNotificationList.AddCopyFrom(OtherLines.FLineEditNotificationList, AOwner);
FLineInvalidateNotificationList.AddCopyFrom(OtherLines.FLineInvalidateNotificationList, AOwner);
FUndoRedoAddedNotificationList.AddCopyFrom(OtherLines.FUndoRedoAddedNotificationList, AOwner);
FOnChangeList.AddCopyFrom(OtherLines.FOnChangeList, AOwner);
FOnChangingList.AddCopyFrom(OtherLines.FOnChangingList, AOwner);
FOnClearedList.AddCopyFrom(OtherLines.FOnClearedList, AOwner);
for i := low(TSynEditNotifyReason) to high(TSynEditNotifyReason) do
FNotifyLists[i].AddCopyFrom(OtherLines.FNotifyLists[i], AOwner);
end;
procedure TSynEditStringList.RemoveHanlders(AOwner: TObject);
var
i: TSynEditNotifyReason;
begin
FLineRangeNotificationList.RemoveAllMethodsOfObject(AOwner);
FLineChangeNotificationList.RemoveAllMethodsOfObject(AOwner);
FLineEditNotificationList.RemoveAllMethodsOfObject(AOwner);
FLineInvalidateNotificationList.RemoveAllMethodsOfObject(AOwner);
FUndoRedoAddedNotificationList.RemoveAllMethodsOfObject(AOwner);
FOnChangeList.RemoveAllMethodsOfObject(AOwner);
FOnChangingList.RemoveAllMethodsOfObject(AOwner);
FOnClearedList.RemoveAllMethodsOfObject(AOwner);
for i := low(TSynEditNotifyReason) to high(TSynEditNotifyReason) do
FNotifyLists[i].RemoveAllMethodsOfObject(AOwner);
end;
procedure TSynEditStringList.SetCapacity(NewCapacity: integer);
@ -972,9 +969,9 @@ end;
procedure TSynEditStringList.SetUpdateState(Updating: Boolean);
begin
if Updating then begin
FOnChangingList.CallNotifyEvents(Self);
FNotifyLists[senrBeginUpdate].CallNotifyEvents(Self);
end else begin
FOnChangeList.CallNotifyEvents(Self);
FNotifyLists[senrEndUpdate].CallNotifyEvents(Self);
end;
end;
@ -1070,6 +1067,14 @@ begin
SendNotification(senrEditAction, self, LogY, -ACount, 1, 0, '');
end;
procedure TSynEditStringList.IncreaseTextChangeStamp;
begin
if FTextChangeStamp=High(FTextChangeStamp) then
FTextChangeStamp:=Low(FTextChangeStamp)
else
inc(FTextChangeStamp);
end;
procedure TSynEditStringList.EditRedo(Item: TSynEditUndoItem);
begin
Item.PerformUndo(self);
@ -1081,15 +1086,13 @@ procedure TSynEditStringList.SendNotification(AReason: TSynEditNotifyReason;
begin
if FIgnoreSendNotification[AReason] > 0 then exit;
case AReason of
senrLineChange:
FLineChangeNotificationList.CallRangeNotifyEvents(ASender, aIndex, aCount);
senrLineCount:
FLineRangeNotificationList.CallRangeNotifyEvents(ASender, aIndex, aCount);
senrLineChange, senrLineCount, senrHighlightChanged:
TLineRangeNotificationList(FNotifyLists[AReason])
.CallRangeNotifyEvents(ASender, aIndex, aCount);
senrEditAction:
FLineEditNotificationList.CallRangeNotifyEvents(ASender, aIndex, // aindex is mis-named (linepos) for edit action
aBytePos, aLen, aCount, aTxt);
senrHighlightChanged:
FLineInvalidateNotificationList.CallRangeNotifyEvents(ASender, aIndex, aCount);
// aindex is mis-named (linepos) for edit action
TLineEditNotificationList(FNotifyLists[senrEditAction])
.CallRangeNotifyEvents(ASender, aIndex, aBytePos, aLen, aCount, aTxt);
end;
end;