diff --git a/components/synedit/synedit.pp b/components/synedit/synedit.pp index 903b9a08bd..c998badbc0 100644 --- a/components/synedit/synedit.pp +++ b/components/synedit/synedit.pp @@ -515,8 +515,6 @@ type {$IFDEF SYN_LAZARUS} function LeftSpaces(const Line: string; Physical: boolean): Integer; {$ENDIF} - procedure LinesChanging(Sender: TObject); - procedure LinesChanged(Sender: TObject); procedure LockUndo; procedure MoveCaretAndSelection( {$IFDEF SYN_LAZARUS}const {$ENDIF}ptBefore, ptAfter: TPoint; @@ -534,8 +532,7 @@ type procedure PrimarySelectionRequest(const RequestedFormatID: TClipboardFormat; Data: TStream); {$ENDIF} - function ScanFrom(Index: integer - {$IFDEF SYN_LAZARUS}; AtLeastTilIndex: integer = -1{$ENDIF}): integer; + function ScanFrom(Index: integer; AtLeastTilIndex: integer = -1): integer; procedure ScrollTimerHandler(Sender: TObject); procedure SelectedColorsChanged(Sender: TObject); procedure DoBlockSelectionChanged(Sender: TObject); @@ -633,11 +630,11 @@ type {$IFDEF SYN_LAZARUS} procedure KeyUp(var Key : Word; Shift : TShiftState); override; {$ENDIF} - procedure ListAdded(Index: integer); //mh 2000-10-10 + Procedure LineCountChanged(Sender: TSynEditStrings; AIndex, ACount : Integer); + Procedure LineTextChanged(Sender: TSynEditStrings; AIndex, ACount : Integer); + procedure LinesChanging(Sender: TObject); + procedure LinesChanged(Sender: TObject); procedure ListCleared(Sender: TObject); - procedure ListDeleted(Index: integer); - procedure ListInserted(Index: integer); - procedure ListPutted(Index: integer); {$IFDEF SYN_LAZARUS} procedure FoldChanged(Index: integer); function GetTopView : Integer; @@ -1293,10 +1290,10 @@ var BufSize: integer; {$ELSE} Mem: HGLOBAL; + Failed: boolean; {$ENDIF} P: PChar; SLen: integer; - Failed: boolean; begin if SText = '' then exit; SLen := Length(SText); @@ -1418,15 +1415,14 @@ begin FTheLinesView := FTabbedLinesView; fCaret.Lines := TSynEditStrings(FTheLinesView); + TSynEditStringList(fLines).AddChangeHandler(senrLineCount, + {$IFDEF FPC}@{$ENDIF}LineCountChanged); + TSynEditStringList(fLines).AddChangeHandler(senrLineChange, + {$IFDEF FPC}@{$ENDIF}LineTextChanged); with TSynEditStringList(fLines) do begin - OnAdded := {$IFDEF FPC}@{$ENDIF}ListAdded; OnChange := {$IFDEF FPC}@{$ENDIF}LinesChanged; OnChanging := {$IFDEF FPC}@{$ENDIF}LinesChanging; OnCleared := {$IFDEF FPC}@{$ENDIF}ListCleared; - OnDeleted := {$IFDEF FPC}@{$ENDIF}ListDeleted; - OnInserted := {$IFDEF FPC}@{$ENDIF}ListInserted; - OnPutted := {$IFDEF FPC}@{$ENDIF}ListPutted; -// OnScanRanges := {$IFDEF FPC}@{$ENDIF}ListScanRanges; end; fFontDummy := TFont.Create; @@ -2112,6 +2108,7 @@ begin if fLastControlIsPressed<>(GetKeyShiftState=[SYNEDIT_LINK_MODIFIER]) then UpdateCtrlMouse; end; + {$ENDIF} procedure TCustomSynEdit.Loaded; @@ -4860,33 +4857,27 @@ begin Update; end; -function TCustomSynEdit.ScanFrom(Index: integer - {$IFDEF SYN_LAZARUS}; AtLeastTilIndex: integer{$ENDIF}): integer; +function TCustomSynEdit.ScanFrom(Index: integer; AtLeastTilIndex: integer): integer; // Index and AtLeastTilIndex are 0 based -{$IFDEF SYN_LAZARUS} var FixFStart: Integer; LastLineDiffers : Boolean; procedure SetCodeFoldAttributes; begin - TSynEditStrings(Lines).FoldMinLevel[Result-1] := fHighlighter.MinimumCodeFoldBlockLevel; - TSynEditStrings(Lines).FoldEndLevel[Result-1] := fHighlighter.CurrentCodeFoldBlockLevel; + FFoldedLinesView.FoldMinLevel[Result-1] := fHighlighter.MinimumCodeFoldBlockLevel; + FFoldedLinesView.FoldEndLevel[Result-1] := fHighlighter.CurrentCodeFoldBlockLevel; if (fHighlighter.LastLineCodeFoldLevelFix <> 0) and (result > 1) then begin - TSynEditStrings(Lines).FoldEndLevel[Result-2] := - TSynEditStrings(Lines).FoldEndLevel[Result-2] + fHighlighter.LastLineCodeFoldLevelFix; - if TSynEditStrings(Lines).FoldMinLevel[Result-2] > TSynEditStrings(Lines).FoldEndLevel[Result-2] then - TSynEditStrings(Lines).FoldMinLevel[Result-2] := TSynEditStrings(Lines).FoldEndLevel[Result-2]; + FFoldedLinesView.FoldEndLevel[Result-2] := + FFoldedLinesView.FoldEndLevel[Result-2] + fHighlighter.LastLineCodeFoldLevelFix; + if FFoldedLinesView.FoldMinLevel[Result-2] > FFoldedLinesView.FoldEndLevel[Result-2] then + FFoldedLinesView.FoldMinLevel[Result-2] := FFoldedLinesView.FoldEndLevel[Result-2]; if Result - 1 < FixFStart then FixFStart := Result - 1; end; end; -{$ENDIF} begin - {$IFDEF SYN_LAZARUS} if Index < 0 then Index := 0; - {$ENDIF} Result := Index; - {$IFDEF SYN_LAZARUS} if not assigned(fHighlighter) or (Index > Lines.Count - 1) then begin FFoldedLinesView.FixFoldingAtTextIndex(Index); fMarkupManager.TextChangedScreen(Max(RowToScreenRow(Index+1), 0), LinesInWindow+1); @@ -4900,7 +4891,6 @@ begin fHighlighter.ReSetRange; TSynEditStrings(Lines).Ranges[0] := fHighlighter.GetRange; end; - {$ENDIF} if Index >= Lines.Count - 1 then begin FFoldedLinesView.FixFoldingAtTextIndex(Index); fMarkupManager.TextChangedScreen(Max(RowToScreenRow(Index+1), 0), LinesInWindow+1); @@ -4911,30 +4901,22 @@ begin fHighlighter.SetLine(Lines[Result], Result); inc(Result); fHighlighter.NextToEol; - {$IFDEF SYN_LAZARUS} LastLineDiffers := True; while (fHighlighter.GetRange <> TSynEditStrings(Lines).Ranges[Result]) or (fHighlighter.LastLineCodeFoldLevelFix <> 0) - or (TSynEditStrings(Lines).FoldMinLevel[Result-1] <> fHighlighter.MinimumCodeFoldBlockLevel) - or (TSynEditStrings(Lines).FoldEndLevel[Result-1] <> fHighlighter.CurrentCodeFoldBlockLevel) + or (FFoldedLinesView.FoldMinLevel[Result-1] <> fHighlighter.MinimumCodeFoldBlockLevel) + or (FFoldedLinesView.FoldEndLevel[Result-1] <> fHighlighter.CurrentCodeFoldBlockLevel) or LastLineDiffers or (Result<=AtLeastTilIndex+1) - {$ELSE} - while (fHighlighter.GetRange <> TSynEditStringList(Lines).Ranges[Result]) - {$ENDIF} do begin //debugln(['TSynCustomHighlighter.ScanFrom WHILE Y=',Result,' Level=',fHighlighter.CurrentCodeFoldBlockLevel,' ScannedLine="',Lines[Result-1],'"']); - {$IFDEF SYN_LAZARUS} LastLineDiffers := (fHighlighter.GetRange <> TSynEditStrings(Lines).Ranges[Result]) or (fHighlighter.LastLineCodeFoldLevelFix <> 0) - or (TSynEditStrings(Lines).FoldMinLevel[Result-1] <> fHighlighter.MinimumCodeFoldBlockLevel) - or (TSynEditStrings(Lines).FoldEndLevel[Result-1] <> fHighlighter.CurrentCodeFoldBlockLevel); + or (FFoldedLinesView.FoldMinLevel[Result-1] <> fHighlighter.MinimumCodeFoldBlockLevel) + or (FFoldedLinesView.FoldEndLevel[Result-1] <> fHighlighter.CurrentCodeFoldBlockLevel); TSynEditStrings(Lines).Ranges[Result] := fHighlighter.GetRange; SetCodeFoldAttributes; //if (Result and $fff)=0 then // debugln('TCustomSynEdit.ScanFrom A Line=', dbgs(Result),' Index=',dbgs(Index),' MinLevel=',dbgs(CodeFoldMinLevel),' EndLevel=',dbgs(CodeFoldEndLevel),' CodeFoldType=',dbgs(ord(CodeFoldType)),' ',dbgs(length(Lines[Result-1]))); - {$ELSE} - TSynEditStringList(Lines).Ranges[Result-1] := fHighlighter.GetRange; - {$ENDIF} fHighlighter.SetLine(Lines[Result], Result); //debugln(['TSynCustomHighlighter.ScanFrom SetLine Y=',Result,' Level=',fHighlighter.CurrentCodeFoldBlockLevel,' Line="',Lines[Result],'"']); fHighlighter.NextToEol; @@ -4943,7 +4925,6 @@ begin if Result = Lines.Count then break; end; - {$IFDEF SYN_LAZARUS} // at least one line changed // => update code fold attributes of last scanned line if (Result>Index+1) and (Result<=Lines.Count) then @@ -4953,55 +4934,33 @@ begin Min(RowToScreenRow(Result), LinesInWindow+1)); Topline := TopLine; if FixFStart < index then Invalidate; - {$ENDIF} Dec(Result); end; -{begin} //mh 2000-10-10 -(* -procedure TCustomSynEdit.ListAdded(Sender: TObject); -var - LastIndex: Integer; +procedure TCustomSynEdit.LineCountChanged(Sender: TSynEditStrings; AIndex, ACount: Integer); begin - if Assigned(fHighlighter) then begin - if Lines.Count > 1 then begin - LastIndex := Lines.Count - 1; - fHighlighter.SetRange(Lines.Objects[LastIndex - 1]); - fHighlighter.SetLine(Lines[LastIndex - 1], LastIndex - 1); - fHighlighter.NextToEol; - Lines.Objects[LastIndex] := fHighlighter.GetRange; - end else begin - fHighlighter.ReSetRange; - Lines.Objects[0] := fHighlighter.GetRange; - end; - end; - LastIndex := Lines.Count; - InvalidateLine(LastIndex); -*) -procedure TCustomSynEdit.ListAdded(Index: integer); -// Index is 0 based -begin - //debugln('TCustomSynEdit.ListAdded ',dbgs(Index),' ',dbgs(Assigned(fHighlighter))); - {$IFDEF SYN_LAZARUS} - ScanFrom(Index - 1); - {$ELSE} - if Assigned(fHighlighter) then begin - if (Index > 0) then begin - // the current line was added, start scanning from the prior line - fHighlighter.SetRange(TSynEditStringList(Lines).Ranges[Index - 1]); - ScanFrom(Index - 1); - end else begin - fHighlighter.ResetRange; - TSynEditStringList(Lines).Ranges[0] := fHighlighter.GetRange; - if (Lines.Count > 1) then - ScanFrom(0); - end; - end; - {$ENDIF} - InvalidateLines(Index + 1, -1); - InvalidateGutterLines(Index + 1, -1); + ScanFrom(AIndex - 1, Min(AIndex, AIndex + ACount)); + InvalidateLines(AIndex + 1, -1); + InvalidateGutterLines(AIndex + 1, -1); +end; + +procedure TCustomSynEdit.LineTextChanged(Sender: TSynEditStrings; AIndex, ACount: Integer); +var + EndIndex: Integer; +begin + if PaintLock>0 then begin + if (fHighlighterNeedsUpdateStartLine<1) + or (fHighlighterNeedsUpdateStartLine>AIndex+1) then + fHighlighterNeedsUpdateStartLine:=AIndex+1; + if (fHighlighterNeedsUpdateEndLine<1) + or (fHighlighterNeedsUpdateEndLine= 1) then begin - if (Index > 0) then begin - // start scanning from prior line -{begin} //mh 2000-10-10 - //DebugLn(['TCustomSynEdit.ListDeleted A Index=',Index]); - fHighlighter.SetRange(TSynEditStringList(Lines).Ranges[Index - 1]); - ScanFrom(Index - 1); - end else begin - //DebugLn(['TCustomSynEdit.ListDeleted B Index=',Index]); - fHighlighter.ResetRange; - TSynEditStringList(Lines).Ranges[0] := fHighlighter.GetRange; -{end} //mh 2000-10-10 - if (Lines.Count > 1) then - ScanFrom(0); - end; - end; - {$ENDIF} - InvalidateLines(Index + 1, -1); - InvalidateGutterLines(Index + 1, -1); -end; - -procedure TCustomSynEdit.ListInserted(Index: Integer); -// Index is 0 based -begin - {$IFDEF SYN_LAZARUS} - ScanFrom(Index - 1); - {$ELSE} - if Assigned(fHighlighter) and (Lines.Count >= 1) then begin - if (Index > 0) then begin - // start scanning from prior line -{begin} //mh 2000-10-10 - // the line and the range of the line - //DebugLn(['TCustomSynEdit.ListInserted A Index=',Index]); - fHighlighter.SetRange(TSynEditStringList(Lines).Ranges[Index - 1]); - ScanFrom(Index - 1); - end else begin - //DebugLn(['TCustomSynEdit.ListInserted B Index=',Index]); - fHighlighter.ReSetRange; - TSynEditStringList(Lines).Ranges[0] := fHighlighter.GetRange; -{end} //mh 2000-10-10 - if (Lines.Count > 1) then - ScanFrom(0); - end; - end; - {$ENDIF} - InvalidateLines(Index + 1, -1); - InvalidateGutterLines(Index + 1, -1); -end; - -procedure TCustomSynEdit.ListPutted(Index: Integer); -// Index is 0 based -{$IFDEF SYN_LAZARUS} -var - EndIndex: Integer; -{$ENDIF} -begin - //DebugLn(['TCustomSynEdit.ListPutted Index=',Index,' PaintLock=',PaintLock]); - {$IFDEF SYN_LAZARUS} - if PaintLock>0 then begin - if (fHighlighterNeedsUpdateStartLine<1) - or (fHighlighterNeedsUpdateStartLine>Index+1) then - fHighlighterNeedsUpdateStartLine:=Index+1; - if (fHighlighterNeedsUpdateEndLine<1) - or (fHighlighterNeedsUpdateEndLine fLinesInWindow) then exit(-1); if (fFoldTypeList[index] = cfEnd) and (fTextIndexList[index] > 0) then - Result := fLines.FoldEndLevel[fTextIndexList[index]-1] + Result := FoldEndLevel[fTextIndexList[index]-1] else - Result := fLines.FoldEndLevel[fTextIndexList[index]]; + Result := FoldEndLevel[fTextIndexList[index]]; end; (* Topline *) @@ -1597,13 +1614,13 @@ begin if (node.IsInFold) and (tpos+1 = node.StartLine) then fFoldTypeList[i] := cfCollapsed else - if fLines.FoldEndLevel[tpos-1] > fLines.FoldMinLevel[tpos-1] + if FoldEndLevel[tpos-1] > FoldMinLevel[tpos-1] then fFoldTypeList[i] := cfExpanded else - if (tpos > 1) and (fLines.FoldEndLevel[tpos-2] > fLines.FoldMinLevel[tpos-1]) + if (tpos > 1) and (FoldEndLevel[tpos-2] > FoldMinLevel[tpos-1]) then fFoldTypeList[i] := cfEnd else - if fLines.FoldEndLevel[tpos-1] > 0 + if FoldEndLevel[tpos-1] > 0 then fFoldTypeList[i] := cfContinue else fFoldTypeList[i] := cfNone; @@ -1660,6 +1677,34 @@ begin end; (* Folding *) +procedure TSynEditFoldedView.SetFoldEndLevel(Index: integer; const AValue: integer); +begin + if (Index >= 0) and (Index < fLines.Count) then + fLines.Attribute[TSynEditFoldEndClass, Index] := Pointer(PtrUInt(AValue)); +end; + +procedure TSynEditFoldedView.SetFoldMinLevel(Index: integer; const AValue: integer); +begin + if (Index >= 0) and (Index < fLines.Count) then + fLines.Attribute[TSynEditFoldMinClass, Index] := Pointer(PtrUInt(AValue)); +end; + +function TSynEditFoldedView.GetFoldEndLevel(Index: integer): integer; +begin + if (Index >= 0) and (Index < fLines.Count) then + Result := Integer(fLines.Attribute[TSynEditFoldEndClass, Index]) + else + Result := 0; +end; + +function TSynEditFoldedView.GetFoldMinLevel(Index: integer): integer; +begin + if (Index >= 0) and (Index < fLines.Count) then + Result := Integer(fLines.Attribute[TSynEditFoldMinClass, Index]) + else + Result := 0; +end; + procedure TSynEditFoldedView.FoldAtLine(AStartLine : Integer); begin FoldAtViewPos(AStartLine + fTopLine); @@ -1676,11 +1721,11 @@ var begin cnt := fLines.Count; // AStartLine is 1-based // FoldEndLevel is 0-based - lvl := fLines.FoldEndLevel[ALine]; + lvl := FoldEndLevel[ALine]; i := ALine+1; - while (i < cnt) and (fLines.FoldMinLevel[i] >= lvl) do inc(i); + while (i < cnt) and (FoldMinLevel[i] >= lvl) do inc(i); // check if fold last line of block (not mixed "end begin") - if (i < cnt) and (fLines.FoldEndLevel[i] <= fLines.FoldMinLevel[i]) then inc(i); + if (i < cnt) and (FoldEndLevel[i] <= FoldMinLevel[i]) then inc(i); Result := i-ALine-1; end; @@ -1741,8 +1786,8 @@ begin fFoldTree.Clear; i := 0; while i < fLines.Count do begin - if (fLines.FoldEndLevel[i] > fLines.FoldMinLevel[i]) - and (fLines.FoldEndLevel[i] > StartLevel) then begin + if (FoldEndLevel[i] > FoldMinLevel[i]) + and (FoldEndLevel[i] > StartLevel) then begin l := LengthForFoldAtTextIndex(i); // i is 0-based // FoldTree is 1-based AND first line remains visble @@ -1807,7 +1852,7 @@ begin LastCount := cnt; // look at the 0-based cfCollapsed (visible) Line - if not(fLines.FoldEndLevel[line -1] > fLines.FoldMinLevel[line - 1]) then begin + if not(FoldEndLevel[line -1] > FoldMinLevel[line - 1]) then begin // the Fold-Begin of this node has gone tmpnode := node.Prev; aFoldTree.RemoveFoldForNodeAtLine(node, -1); // Don't touch any nested node @@ -1852,6 +1897,7 @@ end; procedure TSynEditFoldedView.LineCountChanged(Sender: TSynEditStrings; AIndex, ACount : Integer); begin + LineTextChanged(Sender, AIndex, ACount); // no need for fix folding => synedit will be called, and scanlines will call fixfolding {TODO: a "need fix folding" flag => to ensure it will be called if synedit doesnt} if (fLockCount > 0) and (AIndex < max(fNeedFixFrom, fNeedFixMinEnd)) then begin @@ -1864,6 +1910,16 @@ begin else LinesInsertedAtTextIndex(AIndex, ACount, true); end; +procedure TSynEditFoldedView.LineTextChanged(Sender: TSynEditStrings; AIndex, ACount: Integer); +var + i: integer; +begin + for i := AIndex to AIndex + ACount - 1 do begin + FoldMinLevel[Count-1]:=-1; + FoldEndLevel[Count-1]:=-1; + end; +end; + procedure TSynEditFoldedView.FixFoldingAtTextIndex(AStartIndex: Integer; AMinEndLine : Integer); begin FixFolding(AStartIndex + 1, AMinEndLine, fFoldTree); @@ -1877,8 +1933,8 @@ begin Result := -1; i := ALine-1; - if (i>0) and (fLines.FoldMinLevel[i] < fLines.FoldEndLevel[i-1])then begin - if fLines.FoldMinLevel[i] < fLines.FoldEndLevel[i] then begin + if (i>0) and (FoldMinLevel[i] < FoldEndLevel[i-1])then begin + if FoldMinLevel[i] < FoldEndLevel[i] then begin // this is a combined "end begin" line node := fFoldTree.FindFoldForLine(ALine, true); if node.IsInFold and (node.StartLine = ALine +1) then @@ -1888,8 +1944,8 @@ begin // this is a "end" line dec(i); end; - l := fLines.FoldEndLevel[i]; - end else if fLines.FoldEndLevel[i] = 0 then + l := FoldEndLevel[i]; + end else if FoldEndLevel[i] = 0 then exit else begin // check if current line is cfCollapsed @@ -1897,12 +1953,12 @@ begin if node.IsInFold and (node.StartLine = ALine +1) then dec(i); if i < 0 then exit; - l := fLines.FoldEndLevel[i] + l := FoldEndLevel[i] end; - while (i > 0) and (fLines.FoldMinLevel[i] >= l) do + while (i > 0) and (FoldMinLevel[i] >= l) do dec(i); - if (fLines.FoldEndLevel[i] > 0) then // TODO, check for collapsed at index = 0 + if (FoldEndLevel[i] > 0) then // TODO, check for collapsed at index = 0 Result := i + 1; end; diff --git a/components/synedit/synedittextbase.pas b/components/synedit/synedittextbase.pas index 095456f4b9..55b33f9dfb 100644 --- a/components/synedit/synedittextbase.pas +++ b/components/synedit/synedittextbase.pas @@ -42,22 +42,15 @@ type FIsUtf8: Boolean; function GetIsUtf8 : Boolean; virtual; procedure SetIsUtf8(const AValue : Boolean); virtual; - function GetFoldEndLevel(Index: integer): integer; virtual; abstract; - function GetFoldMinLevel(Index: integer): integer; virtual; abstract; - procedure SetFoldEndLevel(Index: integer; const AValue: integer); virtual; abstract; - procedure SetFoldMinLevel(Index: integer; const AValue: integer); virtual; abstract; function GetRange(Index: integer): TSynEditRange; virtual; abstract; procedure PutRange(Index: integer; ARange: TSynEditRange); virtual; abstract; function GetAttribute(const Owner: TClass; const Index: Integer): Pointer; virtual; abstract; procedure SetAttribute(const Owner: TClass; const Index: Integer; const AValue: Pointer); virtual; abstract; - procedure RegisterAttribute(const Index: TClass; const Size: Word); virtual; abstract; function GetExpandedString(Index: integer): string; virtual; abstract; function GetLengthOfLongestLine: integer; virtual; abstract; procedure SetTextStr(const Value: string); override; - property Attribute[Owner: TClass; Index: Integer]: Pointer - read GetAttribute write SetAttribute; public constructor Create; procedure DeleteLines(Index, NumLines: integer); virtual; abstract; @@ -65,6 +58,9 @@ type procedure InsertStrings(Index: integer; NewStrings: TStrings); virtual; abstract; procedure ClearRanges(ARange: TSynEditRange); virtual; abstract; + procedure RegisterAttribute(const Index: TClass; const Size: Word); virtual; abstract; + property Attribute[Owner: TClass; Index: Integer]: Pointer + read GetAttribute write SetAttribute; procedure AddChangeHandler(AReason: TSynEditNotifyReason; AHandler: TStringListLineCountEvent); virtual; abstract; procedure RemoveChangeHandler(AReason: TSynEditNotifyReason; @@ -89,10 +85,6 @@ type property LengthOfLongestLine: integer read GetLengthOfLongestLine; property IsUtf8: Boolean read GetIsUtf8 write SetIsUtf8; property Ranges[Index: integer]: TSynEditRange read GetRange write PutRange; - property FoldMinLevel[Index: integer]: integer read GetFoldMinLevel - write SetFoldMinLevel; - property FoldEndLevel[Index: integer]: integer read GetFoldEndLevel - write SetFoldEndLevel; end; { TSynEditStringsLinked } @@ -104,17 +96,11 @@ type function GetIsUtf8 : Boolean; override; procedure SetIsUtf8(const AValue : Boolean); override; - function GetFoldEndLevel(Index: integer): integer; override; - function GetFoldMinLevel(Index: integer): integer; override; - procedure SetFoldEndLevel(Index: integer; const AValue: integer); override; - procedure SetFoldMinLevel(Index: integer; const AValue: integer); override; function GetRange(Index: integer): TSynEditRange; override; procedure PutRange(Index: integer; ARange: TSynEditRange); override; function GetAttribute(const Owner: TClass; const Index: Integer): Pointer; override; procedure SetAttribute(const Owner: TClass; const Index: Integer; const AValue: Pointer); override; - // Size: 0 = Bit (TODO); 1..8 Size In Byte "SizeOf()" - procedure RegisterAttribute(const Index: TClass; const Size: Word); override; protected function GetCount: integer; override; function GetCapacity: integer; @@ -142,24 +128,12 @@ type procedure ClearRanges(ARange: TSynEditRange); override; + // Size: 0 = Bit (TODO); 1..8 Size In Byte "SizeOf()" + procedure RegisterAttribute(const Index: TClass; const Size: Word); override; procedure AddChangeHandler(AReason: TSynEditNotifyReason; AHandler: TStringListLineCountEvent); override; procedure RemoveChangeHandler(AReason: TSynEditNotifyReason; AHandler: TStringListLineCountEvent); override; -(* public - // Byte to Char - function LogicalToPhysicalPos(const p: TPoint): TPoint; - function LogicalToPhysicalCol(const Line: string; - LogicalPos: integer): integer; - function LogicalToPhysicalCol(Line: PChar; LineLen: integer; - LogicalPos, StartBytePos, StartPhysicalPos: integer): integer; - // Char to Byte - function PhysicalToLogicalPos(const p: TPoint): TPoint; - function PhysicalToLogicalCol(const Line: string; - PhysicalPos: integer): integer; - function PhysicalToLogicalCol(const Line: string; - PhysicalPos, StartBytePos, StartPhysicalPos: integer): integer; -*) end; @@ -363,27 +337,6 @@ begin FSynStrings.IsUtf8 := AValue; end; -//Fold -function TSynEditStringsLinked.GetFoldEndLevel(Index: integer): integer; -begin - Result:= fSynStrings.FoldEndLevel[Index]; -end; - -function TSynEditStringsLinked.GetFoldMinLevel(Index: integer): integer; -begin - Result:= fSynStrings.FoldMinLevel[Index]; -end; - -procedure TSynEditStringsLinked.SetFoldEndLevel(Index: integer; const AValue: integer); -begin - fSynStrings.FoldEndLevel[Index] := AValue; -end; - -procedure TSynEditStringsLinked.SetFoldMinLevel(Index: integer; const AValue: integer); -begin - fSynStrings.FoldMinLevel[Index] := AValue; -end; - //Ranges function TSynEditStringsLinked.GetRange(Index: integer): TSynEditRange; begin diff --git a/components/synedit/synedittextbuffer.pp b/components/synedit/synedittextbuffer.pp index c75372b40d..9dd24c8351 100644 --- a/components/synedit/synedittextbuffer.pp +++ b/components/synedit/synedittextbuffer.pp @@ -57,14 +57,8 @@ type {$ENDIF} TSynEditRangeClass = class end; // For Register TSynEditFlagsClass = class end; // For Register - TSynEditFoldMinClass = class end; // For Register - TSynEditFoldEndClass = class end; // For Register - TSynEditExpLenClass = class end; // For Register TSynEditStringFlag = ( - sfHasTabs, // - sfHasNoTabs, // - sfExpandedLengthUnknown, // sfModified, // a line is modified and not saved after sfSaved // a line is modified and saved after ); @@ -161,19 +155,9 @@ type Procedure SetAttributeSize(NewSize: Integer); procedure SetFlags(Index: Integer; const AValue: TSynEditStringFlags); protected - fOnAdded: TStringListIndexEvent; fOnCleared: TNotifyEvent; - fOnDeleted: TStringListIndexEvent; - fOnInserted: TStringListIndexEvent; - fOnPutted: TStringListIndexEvent; function GetExpandedString(Index: integer): string; override; function GetLengthOfLongestLine: integer; override; - {$IFDEF SYN_LAZARUS} - function GetFoldEndLevel(Index: integer): integer; override; - function GetFoldMinLevel(Index: integer): integer; override; - procedure SetFoldEndLevel(Index: integer; const AValue: integer); override; - procedure SetFoldMinLevel(Index: integer; const AValue: integer); override; - {$ENDIF} function GetRange(Index: integer): TSynEditRange; {$IFDEF SYN_LAZARUS}override;{$ENDIF} procedure PutRange(Index: integer; ARange: TSynEditRange); {$IFDEF SYN_LAZARUS}override;{$ENDIF} function GetAttribute(const Owner: TClass; const Index: Integer): Pointer; override; @@ -217,25 +201,16 @@ type procedure RemoveChangeHandler(AReason: TSynEditNotifyReason; AHandler: TStringListLineCountEvent); override; public - property DosFileFormat: boolean read fDosFileFormat write fDosFileFormat; + property DosFileFormat: boolean read fDosFileFormat write fDosFileFormat; {begin} //mh 2000-10-19 property ExpandedStrings[Index: integer]: string read GetExpandedString; property LengthOfLongestLine: integer read GetLengthOfLongestLine; {end} //mh 2000-10-19 property Ranges[Index: integer]: TSynEditRange read GetRange write PutRange; - property OnAdded: TStringListIndexEvent read fOnAdded write fOnAdded; property OnChange: TNotifyEvent read fOnChange write fOnChange; property OnChanging: TNotifyEvent read fOnChanging write fOnChanging; property OnCleared: TNotifyEvent read fOnCleared write fOnCleared; - property OnDeleted: TStringListIndexEvent read fOnDeleted write fOnDeleted; - property OnInserted: TStringListIndexEvent read fOnInserted - write fOnInserted; - property OnPutted: TStringListIndexEvent read fOnPutted write fOnPutted; {$IFDEF SYN_LAZARUS} - property FoldMinLevel[Index: integer]: integer read GetFoldMinLevel - write SetFoldMinLevel; - property FoldEndLevel[Index: integer]: integer read GetFoldEndLevel - write SetFoldEndLevel; property Flags[Index: Integer]: TSynEditStringFlags read GetFlags write SetFlags; {$ENDIF} @@ -312,12 +287,11 @@ type implementation {$IFNDEF FPC} - -{$IFDEF SYN_COMPILER_3_UP} //mh 2000-10-18 + {$IFDEF SYN_COMPILER_3_UP} resourcestring -{$ELSE} + {$ELSE} const -{$ENDIF} + {$ENDIF} {$ELSE} const {$ENDIF} @@ -539,9 +513,6 @@ begin SetAttributeSize(0); RegisterAttribute(TSynEditRangeClass, SizeOf(Pointer)); RegisterAttribute(TSynEditFlagsClass, SizeOf(TSynEditStringFlag)); - RegisterAttribute(TSynEditFoldMinClass, SizeOf(Integer)); - RegisterAttribute(TSynEditFoldEndClass, SizeOf(Integer)); - RegisterAttribute(TSynEditExpLenClass, SizeOf(Integer)); fDosFileFormat := TRUE; {begin} //mh 2000-10-19 fIndexOfLongestLine := -1; @@ -567,8 +538,6 @@ begin Result := Count; InsertItem(Result, S); FLineRangeNotificationList.CallRangeNotifyEvents(self, Result, Count - Result); - if Assigned(fOnAdded) then - fOnAdded(Result); EndUpdate; end; @@ -592,16 +561,9 @@ begin Objects[Count-1] := AStrings.Objects[i]; end; SetAttribute(TSynEditRangeClass, Count-1, NullRange); - SetAttribute(TSynEditExpLenClass, Count-1, Pointer(-1)); - Flags[Count-1] := [sfExpandedLengthUnknown]; - {$IFDEF SYN_LAZARUS} - FoldMinLevel[Count-1]:=0; - FoldEndLevel[Count-1]:=0; - {$ENDIF} + Flags[Count-1] := []; end; FLineRangeNotificationList.CallRangeNotifyEvents(self, FirstAdded, Count - FirstAdded); - if Assigned(fOnAdded) then - fOnAdded(FirstAdded); finally EndUpdate; end; @@ -636,8 +598,6 @@ begin SetCount(Count - 1); fIndexOfLongestLine := -1; //mh 2000-10-19 FLineRangeNotificationList.CallRangeNotifyEvents(self, Index, -1); - if Assigned(fOnDeleted) then - fOnDeleted(Index); EndUpdate; end; @@ -662,8 +622,6 @@ begin end; SetCount(Count - NumLines); FLineRangeNotificationList.CallRangeNotifyEvents(self, Index, -NumLines); - if Assigned(fOnDeleted) then - fOnDeleted(Index); end; end; {end} // DJLP 2000-11-01 @@ -695,36 +653,6 @@ begin else Result := []; end; - -function TSynEditStringList.GetFoldEndLevel(Index: integer): integer; -begin - if (Index >= 0) and (Index < Count) then - Result := Integer(GetAttribute(TSynEditFoldEndClass, Index)) - else - Result := 0; -end; - -function TSynEditStringList.GetFoldMinLevel(Index: integer): integer; -begin - if (Index >= 0) and (Index < Count) then - Result := Integer(GetAttribute(TSynEditFoldMinClass, Index)) - else - Result := 0; -end; - -procedure TSynEditStringList.SetFoldEndLevel(Index: integer; - const AValue: integer); -begin - if (Index >= 0) and (Index < Count) then - SetAttribute(TSynEditFoldEndClass, Index, Pointer(PtrUInt(AValue))); -end; - -procedure TSynEditStringList.SetFoldMinLevel(Index: integer; - const AValue: integer); -begin - if (Index >= 0) and (Index < Count) then - SetAttribute(TSynEditFoldMinClass, Index, Pointer(PtrUInt(AValue))); -end; {$ENDIF} function TSynEditStringList.Get(Index: integer): string; @@ -823,8 +751,6 @@ begin {$ENDIF} InsertItem(Index, S); FLineRangeNotificationList.CallRangeNotifyEvents(self, Index, Count - OldCnt); - if Assigned(fOnInserted) then - fOnInserted(Index); EndUpdate; end; @@ -840,12 +766,7 @@ begin fList[Index] := S; FList.Objects[Index] := nil; Ranges[Index] := NullRange; - SetAttribute(TSynEditExpLenClass, Index, Pointer(-1)); - Flags[Index] := [sfExpandedLengthUnknown]; - {$IFDEF SYN_LAZARUS} - FoldMinLevel[Index]:=0; - FoldEndLevel[Index]:=0; - {$ENDIF} + Flags[Index] := []; EndUpdate; end; @@ -861,8 +782,6 @@ begin FList.Move(Index, Index + NumLines, Count-Index); SetCount(Count + NumLines); FLineRangeNotificationList.CallRangeNotifyEvents(self, Index, NumLines); - if Assigned(fOnAdded) then - fOnAdded(Index); finally EndUpdate; end; @@ -909,8 +828,6 @@ begin end; procedure TSynEditStringList.Put(Index: integer; const S: string); -var - f: TSynEditStringFlags; begin if (Index = 0) and (Count = 0) then Add(S) @@ -919,15 +836,8 @@ begin ListIndexOutOfBounds(Index); BeginUpdate; fIndexOfLongestLine := -1; - f := Flags[Index]; - Include(f, sfExpandedLengthUnknown); - Exclude(f, sfHasTabs); - Exclude(f, sfHasNoTabs); - Flags[Index] := f; FList[Index] := S; - if Assigned(fOnPutted) then - fOnPutted(Index); - FLineChangeNotificationList.CallRangeNotifyEvents(self, Index, 1); + FLineChangeNotificationList.CallRangeNotifyEvents(self, Index, 1); EndUpdate; end; end; diff --git a/components/synedit/synedittexttabexpander.pas b/components/synedit/synedittexttabexpander.pas index 79d452bbff..b0fc5c9855 100644 --- a/components/synedit/synedittexttabexpander.pas +++ b/components/synedit/synedittexttabexpander.pas @@ -63,7 +63,7 @@ constructor TSynEditStringTabExpander.Create(ASynStringSource: TSynEditStrings); begin FIndexOfLongestLine := -1; inherited Create(ASynStringSource); - RegisterAttribute(TSynEditStringTabExpander, SizeOf(Integer)); + fSynStrings.RegisterAttribute(TSynEditStringTabExpander, SizeOf(Integer)); TabWidth := 8; fSynStrings.AddChangeHandler(senrLineCount, {$IFDEF FPC}@{$ENDIF}LineCountChanged); fSynStrings.AddChangeHandler(senrLineChange, {$IFDEF FPC}@{$ENDIF}LineCountChanged);