Browse Source

Fixed SD2-1378: Bookmarks behave incorrectly when removing text

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@2691 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 19 years ago
parent
commit
a8c71399b6
  1. 8
      src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/WixDocumentEditor.cs
  2. 3
      src/Libraries/ICSharpCode.TextEditor/Project/ICSharpCode.TextEditor.csproj
  3. 43
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/BookmarkManager/Bookmark.cs
  4. 64
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/BookmarkManager/BookmarkManager.cs
  5. 6
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/CustomLineManager/CustomLineManager.cs
  6. 59
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/DefaultDocument.cs
  7. 2
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/DocumentFactory.cs
  8. 2
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/FoldingStrategy/FoldingManager.cs
  9. 7
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/IDocument.cs
  10. 147
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/LineManager/ILineManager.cs
  11. 53
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/LineManager/LineManager.cs
  12. 33
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/LineManager/LineManagerEventArgs.cs
  13. 5
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/LineManager/LineSegment.cs
  14. 8
      src/Main/Base/Project/Src/TextEditor/Bookmarks/Bookmark.cs
  15. 6
      src/Main/Base/Project/Src/TextEditor/Bookmarks/Pad/Nodes/BookmarkNode.cs
  16. 13
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/SharpDevelopTextAreaControl.cs

8
src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/WixDocumentEditor.cs

@ -36,9 +36,9 @@ namespace ICSharpCode.WixBinding @@ -36,9 +36,9 @@ namespace ICSharpCode.WixBinding
ISegment segment = WixDocument.ConvertRegionToSegment(document, region);
// Replace the original xml with the new xml and indent it.
int originalLineCount = document.LineSegmentCollection.Count;
int originalLineCount = document.TotalNumberOfLines;
document.Replace(segment.Offset, segment.Length, xml);
int addedLineCount = document.LineSegmentCollection.Count - originalLineCount;
int addedLineCount = document.TotalNumberOfLines - originalLineCount;
// Make sure the text inserted is visible.
textAreaControl.ScrollTo(region.BeginLine);
@ -59,10 +59,10 @@ namespace ICSharpCode.WixBinding @@ -59,10 +59,10 @@ namespace ICSharpCode.WixBinding
ISegment segment = document.GetLineSegment(line);
// Insert the xml and indent it.
int originalLineCount = document.LineSegmentCollection.Count;
int originalLineCount = document.TotalNumberOfLines;
int offset = segment.Offset + column;
document.Insert(offset, xml);
int addedLineCount = document.LineSegmentCollection.Count - originalLineCount;
int addedLineCount = document.TotalNumberOfLines - originalLineCount;
// Make sure the text inserted is visible.
textAreaControl.ScrollTo(line);

3
src/Libraries/ICSharpCode.TextEditor/Project/ICSharpCode.TextEditor.csproj

@ -84,8 +84,7 @@ @@ -84,8 +84,7 @@
<Compile Include="Src\Document\HighlightingStrategy\PrevMarker.cs" />
<Compile Include="Src\Document\HighlightingStrategy\Span.cs" />
<Compile Include="Src\Document\HighlightingStrategy\TextWord.cs" />
<Compile Include="Src\Document\LineManager\DefaultLineManager.cs" />
<Compile Include="Src\Document\LineManager\ILineManager.cs" />
<Compile Include="Src\Document\LineManager\LineManager.cs" />
<Compile Include="Src\Document\LineManager\LineSegment.cs" />
<Compile Include="Src\Document\LineManager\LineManagerEventArgs.cs" />
<Compile Include="Src\Document\TextBufferStrategy\GapTextBufferStrategy.cs" />

43
src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/BookmarkManager/Bookmark.cs

@ -17,8 +17,9 @@ namespace ICSharpCode.TextEditor.Document @@ -17,8 +17,9 @@ namespace ICSharpCode.TextEditor.Document
public class Bookmark
{
IDocument document;
int lineNumber;
bool isEnabled = true;
LineSegment line;
int lineNumber;
bool isEnabled = true;
public IDocument Document {
get {
@ -26,7 +27,14 @@ namespace ICSharpCode.TextEditor.Document @@ -26,7 +27,14 @@ namespace ICSharpCode.TextEditor.Document
}
set {
if (document != value) {
if (line != null) {
lineNumber = line.LineNumber;
line = null;
}
document = value;
if (document != null) {
line = document.GetLineSegment(Math.Min(lineNumber, document.TotalNumberOfLines-1));
}
OnDocumentChanged(EventArgs.Empty);
}
}
@ -66,29 +74,32 @@ namespace ICSharpCode.TextEditor.Document @@ -66,29 +74,32 @@ namespace ICSharpCode.TextEditor.Document
}
}
/// <summary>
/// Gets the line the bookmark belongs to.
/// Is null if the bookmark is not connected to a document.
/// </summary>
public LineSegment Line {
get { return line; }
}
public int LineNumber {
get {
return lineNumber;
if (line != null)
return line.LineNumber;
else
return lineNumber;
}
set {
if (value < 0)
throw new ArgumentOutOfRangeException("value", value, "line number must be >= 0");
if (lineNumber != value) {
if (document == null) {
lineNumber = value;
OnLineNumberChanged(EventArgs.Empty);
} else {
line = document.GetLineSegment(value);
}
}
}
public event EventHandler LineNumberChanged;
protected virtual void OnLineNumberChanged(EventArgs e)
{
if (LineNumberChanged != null) {
LineNumberChanged(this, e);
}
}
/// <summary>
/// Gets if the bookmark can be toggled off using the 'set/unset bookmark' command.
/// </summary>
@ -104,11 +115,9 @@ namespace ICSharpCode.TextEditor.Document @@ -104,11 +115,9 @@ namespace ICSharpCode.TextEditor.Document
public Bookmark(IDocument document, int lineNumber, bool isEnabled)
{
if (lineNumber < 0)
throw new ArgumentOutOfRangeException("lineNumber", lineNumber, "line number must be >= 0");
this.document = document;
this.lineNumber = lineNumber;
this.isEnabled = isEnabled;
this.LineNumber = lineNumber;
}
public virtual bool Click(SWF.Control parent, SWF.MouseEventArgs e)

64
src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/BookmarkManager/BookmarkManager.cs

@ -41,10 +41,18 @@ namespace ICSharpCode.TextEditor.Document @@ -41,10 +41,18 @@ namespace ICSharpCode.TextEditor.Document
/// <summary>
/// Creates a new instance of <see cref="BookmarkManager"/>
/// </summary>
public BookmarkManager(IDocument document, ILineManager lineTracker)
internal BookmarkManager(IDocument document, LineManager lineTracker)
{
this.document = document;
lineTracker.LineCountChanged += new LineManagerEventHandler(MoveIndices);
lineTracker.LineDeleted += delegate(object sender, LineEventArgs e) {
for (int i = 0; i < bookmark.Count; i++) {
Bookmark b = bookmark[i];
if (b.Line == e.LineSegment) {
bookmark.RemoveAt(i--);
OnRemoved(new BookmarkEventArgs(b));
}
}
};
}
IBookmarkFactory factory;
@ -78,28 +86,24 @@ namespace ICSharpCode.TextEditor.Document @@ -78,28 +86,24 @@ namespace ICSharpCode.TextEditor.Document
if (mark.LineNumber == lineNr && mark.CanToggle && mark.GetType() == newMarkType) {
bookmark.RemoveAt(i);
OnRemoved(new BookmarkEventArgs(mark));
OnChanged(EventArgs.Empty);
return;
}
}
bookmark.Add(newMark);
OnAdded(new BookmarkEventArgs(newMark));
OnChanged(EventArgs.Empty);
}
public void AddMark(Bookmark mark)
{
bookmark.Add(mark);
OnAdded(new BookmarkEventArgs(mark));
OnChanged(EventArgs.Empty);
}
public void RemoveMark(Bookmark mark)
{
bookmark.Remove(mark);
OnRemoved(new BookmarkEventArgs(mark));
OnChanged(EventArgs.Empty);
}
public void RemoveMarks(Predicate<Bookmark> predicate)
@ -111,7 +115,6 @@ namespace ICSharpCode.TextEditor.Document @@ -111,7 +115,6 @@ namespace ICSharpCode.TextEditor.Document
OnRemoved(new BookmarkEventArgs(bm));
}
}
OnChanged(EventArgs.Empty);
}
/// <returns>
@ -127,38 +130,6 @@ namespace ICSharpCode.TextEditor.Document @@ -127,38 +130,6 @@ namespace ICSharpCode.TextEditor.Document
return false;
}
/// <summary>
/// This method moves all indices from index upward count lines
/// (useful for deletion/insertion of text)
/// </summary>
void MoveIndices(object sender,LineManagerEventArgs e)
{
bool changed = false;
for (int i = 0; i < bookmark.Count; ++i) {
Bookmark mark = bookmark[i];
if (e.LinesMoved < 0 && mark.LineNumber == e.LineStart) {
bookmark.RemoveAt(i);
OnRemoved(new BookmarkEventArgs(mark));
--i;
changed = true;
} else if (mark.LineNumber > e.LineStart) {
changed = true;
int newLine = mark.LineNumber + e.LinesMoved;
if (newLine >= 0) {
bookmark[i].LineNumber = newLine;
} else {
bookmark.RemoveAt(i);
OnRemoved(new BookmarkEventArgs(mark));
--i;
}
}
}
if (changed) {
OnChanged(EventArgs.Empty);
}
}
/// <remarks>
/// Clears all bookmark
/// </remarks>
@ -168,7 +139,6 @@ namespace ICSharpCode.TextEditor.Document @@ -168,7 +139,6 @@ namespace ICSharpCode.TextEditor.Document
OnRemoved(new BookmarkEventArgs(mark));
}
bookmark.Clear();
OnChanged(EventArgs.Empty);
}
/// <value>
@ -264,14 +234,6 @@ namespace ICSharpCode.TextEditor.Document @@ -264,14 +234,6 @@ namespace ICSharpCode.TextEditor.Document
return prev;
}
protected virtual void OnChanged(EventArgs e)
{
if (Changed != null) {
Changed(this, e);
}
}
protected virtual void OnRemoved(BookmarkEventArgs e)
{
if (Removed != null) {
@ -279,7 +241,6 @@ namespace ICSharpCode.TextEditor.Document @@ -279,7 +241,6 @@ namespace ICSharpCode.TextEditor.Document
}
}
protected virtual void OnAdded(BookmarkEventArgs e)
{
if (Added != null) {
@ -289,10 +250,5 @@ namespace ICSharpCode.TextEditor.Document @@ -289,10 +250,5 @@ namespace ICSharpCode.TextEditor.Document
public event BookmarkEventHandler Removed;
public event BookmarkEventHandler Added;
/// <summary>
/// Is fired after the bookmarks change
/// </summary>
public event EventHandler Changed;
}
}

6
src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/CustomLineManager/CustomLineManager.cs

@ -47,9 +47,9 @@ namespace ICSharpCode.TextEditor.Document @@ -47,9 +47,9 @@ namespace ICSharpCode.TextEditor.Document
/// <summary>
/// Creates a new instance of <see cref="CustomLineManager"/>
/// </summary>
public CustomLineManager(ILineManager lineTracker)
internal CustomLineManager(LineManager lineTracker)
{
lineTracker.LineCountChanged += new LineManagerEventHandler(MoveIndices);
lineTracker.LineCountChanged += MoveIndices;
}
/// <value>
@ -178,7 +178,7 @@ namespace ICSharpCode.TextEditor.Document @@ -178,7 +178,7 @@ namespace ICSharpCode.TextEditor.Document
/// This method moves all indices from index upward count lines
/// (useful for deletion/insertion of text)
/// </summary>
void MoveIndices(object sender,LineManagerEventArgs e)
void MoveIndices(object sender, LineCountChangeEventArgs e)
{
bool changed = false;
OnBeforeChanged();

59
src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/DefaultDocument.cs

@ -90,27 +90,41 @@ namespace ICSharpCode.TextEditor.Document @@ -90,27 +90,41 @@ namespace ICSharpCode.TextEditor.Document
/// <summary>
/// The default <see cref="IDocument"/> implementation.
/// </summary>
internal class DefaultDocument : IDocument
internal sealed class DefaultDocument : IDocument
{
bool readOnly = false;
ILineManager lineTrackingStrategy = null;
ICustomLineManager customLineManager = null;
BookmarkManager bookmarkManager = null;
ITextBufferStrategy textBufferStrategy = null;
IFormattingStrategy formattingStrategy = null;
FoldingManager foldingManager = null;
UndoStack undoStack = new UndoStack();
LineManager lineTrackingStrategy;
ICustomLineManager customLineManager;
BookmarkManager bookmarkManager;
ITextBufferStrategy textBufferStrategy;
IFormattingStrategy formattingStrategy;
FoldingManager foldingManager;
UndoStack undoStack = new UndoStack();
ITextEditorProperties textEditorProperties = new DefaultTextEditorProperties();
MarkerStrategy markerStrategy = null;
MarkerStrategy markerStrategy;
public LineManager LineManager {
get { return lineTrackingStrategy; }
set { lineTrackingStrategy = value; }
}
public event EventHandler<LineLengthChangeEventArgs> LineLengthChanged {
add { lineTrackingStrategy.LineLengthChanged += value; }
remove { lineTrackingStrategy.LineLengthChanged -= value; }
}
public event EventHandler<LineCountChangeEventArgs> LineCountChanged {
add { lineTrackingStrategy.LineCountChanged += value; }
remove { lineTrackingStrategy.LineCountChanged -= value; }
}
public event EventHandler<LineEventArgs> LineDeleted {
add { lineTrackingStrategy.LineDeleted += value; }
remove { lineTrackingStrategy.LineDeleted -= value; }
}
public MarkerStrategy MarkerStrategy {
get {
return markerStrategy;
}
set {
markerStrategy = value;
}
get { return markerStrategy; }
set { markerStrategy = value; }
}
public ITextEditorProperties TextEditorProperties {
@ -143,15 +157,6 @@ namespace ICSharpCode.TextEditor.Document @@ -143,15 +157,6 @@ namespace ICSharpCode.TextEditor.Document
}
}
public ILineManager LineManager {
get {
return lineTrackingStrategy;
}
set {
lineTrackingStrategy = value;
}
}
public ITextBufferStrategy TextBufferStrategy {
get {
return textBufferStrategy;
@ -390,14 +395,14 @@ namespace ICSharpCode.TextEditor.Document @@ -390,14 +395,14 @@ namespace ICSharpCode.TextEditor.Document
}
}
protected void OnDocumentAboutToBeChanged(DocumentEventArgs e)
void OnDocumentAboutToBeChanged(DocumentEventArgs e)
{
if (DocumentAboutToBeChanged != null) {
DocumentAboutToBeChanged(this, e);
}
}
protected void OnDocumentChanged(DocumentEventArgs e)
void OnDocumentChanged(DocumentEventArgs e)
{
if (DocumentChanged != null) {
DocumentChanged(this, e);
@ -436,7 +441,7 @@ namespace ICSharpCode.TextEditor.Document @@ -436,7 +441,7 @@ namespace ICSharpCode.TextEditor.Document
}
}
protected virtual void OnTextContentChanged(EventArgs e)
void OnTextContentChanged(EventArgs e)
{
if (TextContentChanged != null) {
TextContentChanged(this, e);

2
src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/DocumentFactory.cs

@ -25,7 +25,7 @@ namespace ICSharpCode.TextEditor.Document @@ -25,7 +25,7 @@ namespace ICSharpCode.TextEditor.Document
DefaultDocument doc = new DefaultDocument();
doc.TextBufferStrategy = new GapTextBufferStrategy();
doc.FormattingStrategy = new DefaultFormattingStrategy();
doc.LineManager = new DefaultLineManager(doc, null);
doc.LineManager = new LineManager(doc, null);
doc.FoldingManager = new FoldingManager(doc, doc.LineManager);
doc.FoldingManager.FoldingStrategy = null; //new ParserFoldingStrategy();
doc.MarkerStrategy = new MarkerStrategy(doc);

2
src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/FoldingStrategy/FoldingManager.cs

@ -34,7 +34,7 @@ namespace ICSharpCode.TextEditor.Document @@ -34,7 +34,7 @@ namespace ICSharpCode.TextEditor.Document
}
}
public FoldingManager(IDocument document, ILineManager lineTracker)
internal FoldingManager(IDocument document, LineManager lineTracker)
{
this.document = document;
document.DocumentChanged += new DocumentEventHandler(DocumentChanged);

7
src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/IDocument.cs

@ -104,8 +104,7 @@ namespace ICSharpCode.TextEditor.Document @@ -104,8 +104,7 @@ namespace ICSharpCode.TextEditor.Document
}
/// <value>
/// The total number of lines, this may be != ArrayList.Count
/// if the last line ends with a delimiter.
/// The total number of lines in the document.
/// </value>
int TotalNumberOfLines {
get;
@ -189,6 +188,10 @@ namespace ICSharpCode.TextEditor.Document @@ -189,6 +188,10 @@ namespace ICSharpCode.TextEditor.Document
/// Get the next visible line below lineNumber
/// </remarks>
int GetNextVisibleLineBelow(int lineNumber, int lineCount);
event EventHandler<LineLengthChangeEventArgs> LineLengthChanged;
event EventHandler<LineCountChangeEventArgs> LineCountChanged;
event EventHandler<LineEventArgs> LineDeleted;
#endregion
#region ITextBufferStrategy interface

147
src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/LineManager/ILineManager.cs

@ -1,147 +0,0 @@ @@ -1,147 +0,0 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Mike Krüger" email="mike@icsharpcode.net"/>
// <version>$Revision$</version>
// </file>
using System.Collections.Generic;
namespace ICSharpCode.TextEditor.Document
{
/// <summary>
/// The line tracker keeps track of all lines in a document.
/// </summary>
public interface ILineManager
{
/// <value>
/// A collection of all line segments
/// </value>
IList<LineSegment> LineSegmentCollection {
get;
}
/// <value>
/// The total number of lines, this may be != ArrayList.Count
/// if the last line ends with a delimiter.
/// </value>
int TotalNumberOfLines {
get;
}
/// <value>
/// The current <see cref="IHighlightingStrategy"/> attached to this line manager
/// </value>
IHighlightingStrategy HighlightingStrategy {
get;
set;
}
/// <summary>
/// Returns a valid line number for the given offset.
/// </summary>
/// <param name="offset">
/// A offset which points to a character in the line which
/// line number is returned.
/// </param>
/// <returns>
/// An int which value is the line number.
/// </returns>
/// <exception cref="System.ArgumentException">If offset points not to a valid position</exception>
int GetLineNumberForOffset(int offset);
/// <summary>
/// Returns a <see cref="LineSegment"/> for the given offset.
/// </summary>
/// <param name="offset">
/// A offset which points to a character in the line which
/// is returned.
/// </param>
/// <returns>
/// A <see cref="LineSegment"/> object.
/// </returns>
/// <exception cref="System.ArgumentException">If offset points not to a valid position</exception>
LineSegment GetLineSegmentForOffset(int offset);
/// <summary>
/// Returns a <see cref="LineSegment"/> for the given line number.
/// This function should be used to get a line instead of getting the
/// line using the <see cref="ArrayList"/>.
/// </summary>
/// <param name="lineNumber">
/// The line number which is requested.
/// </param>
/// <returns>
/// A <see cref="LineSegment"/> object.
/// </returns>
/// <exception cref="System.ArgumentException">If offset points not to a valid position</exception>
LineSegment GetLineSegment(int lineNumber);
/// <summary>
/// Used internally, do not call yourself.
/// </summary>
void Insert(int offset, string text);
/// <summary>
/// Used internally, do not call yourself.
/// </summary>
void Remove(int offset, int length);
/// <summary>
/// Used internally, do not call yourself.
/// </summary>
void Replace(int offset, int length, string text);
/// <summary>
/// Sets the content of this line manager = break the text
/// into lines.
/// </summary>
void SetContent(string text);
/// <summary>
/// Get the first logical line for a given visible line.
/// example : lineNumber == 100 foldings are in the linetracker
/// between 0..1 (2 folded, invisible lines) this method returns 102
/// the 'logical' line number
/// </summary>
int GetFirstLogicalLine(int lineNumber);
/// <summary>
/// Get the last logical line for a given visible line.
/// example : lineNumber == 100 foldings are in the linetracker
/// between 0..1 (2 folded, invisible lines) this method returns 102
/// the 'logical' line number
/// </summary>
int GetLastLogicalLine(int lineNumber);
/// <summary>
/// Get the visible line for a given logical line.
/// example : lineNumber == 100 foldings are in the linetracker
/// between 0..1 (2 folded, invisible lines) this method returns 98
/// the 'visible' line number
/// </summary>
int GetVisibleLine(int lineNumber);
// /// <summary>
// /// Get the visible column for a given logical line and logical column.
// /// </summary>
// int GetVisibleColumn(int logicalLine, int logicalColumn);
/// <summary>
/// Get the next visible line after lineNumber
/// </summary>
int GetNextVisibleLineAbove(int lineNumber, int lineCount);
/// <summary>
/// Get the next visible line below lineNumber
/// </summary>
int GetNextVisibleLineBelow(int lineNumber, int lineCount);
/// <summary>
/// Is fired when lines are inserted or removed
/// </summary>
event LineManagerEventHandler LineCountChanged;
event LineLengthEventHandler LineLengthChanged;
}
}

53
src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/LineManager/DefaultLineManager.cs → src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/LineManager/LineManager.cs

@ -11,7 +11,7 @@ using System.Diagnostics; @@ -11,7 +11,7 @@ using System.Diagnostics;
namespace ICSharpCode.TextEditor.Document
{
internal class DefaultLineManager : ILineManager
internal sealed class LineManager
{
LineSegmentTree lineCollection = new LineSegmentTree();
@ -44,7 +44,7 @@ namespace ICSharpCode.TextEditor.Document @@ -44,7 +44,7 @@ namespace ICSharpCode.TextEditor.Document
}
}
public DefaultLineManager(IDocument document, IHighlightingStrategy highlightingStrategy)
public LineManager(IDocument document, IHighlightingStrategy highlightingStrategy)
{
this.document = document;
this.highlightingStrategy = highlightingStrategy;
@ -80,7 +80,7 @@ namespace ICSharpCode.TextEditor.Document @@ -80,7 +80,7 @@ namespace ICSharpCode.TextEditor.Document
// Console.WriteLine("Replace offset="+offset+" length="+length+" text.Length="+text.Length);
int lineStart = GetLineNumberForOffset(offset);
int oldNumberOfLines = this.TotalNumberOfLines;
RemoveInternal(offset, length);
List<LineSegment> removedLines = RemoveInternal(offset, length);
int numberOfLinesAfterRemoving = this.TotalNumberOfLines;
if (!string.IsNullOrEmpty(text)) {
InsertInternal(offset, text);
@ -92,15 +92,19 @@ namespace ICSharpCode.TextEditor.Document @@ -92,15 +92,19 @@ namespace ICSharpCode.TextEditor.Document
// Console.WriteLine("'" + document.TextContent + "'");
// #endif
RunHighlighter(lineStart, 1 + Math.Max(0, this.TotalNumberOfLines - numberOfLinesAfterRemoving));
if (removedLines != null) {
foreach (LineSegment ls in removedLines)
OnLineDeleted(new LineEventArgs(document, ls));
}
if (this.TotalNumberOfLines != oldNumberOfLines) {
OnLineCountChanged(new LineManagerEventArgs(document, lineStart, this.TotalNumberOfLines - oldNumberOfLines));
OnLineCountChanged(new LineCountChangeEventArgs(document, lineStart, this.TotalNumberOfLines - oldNumberOfLines));
}
}
void RemoveInternal(int offset, int length)
List<LineSegment> RemoveInternal(int offset, int length)
{
Debug.Assert(length >= 0);
if (length == 0) return;
if (length == 0) return null;
LineSegmentTree.Enumerator it = lineCollection.GetEnumeratorForOffset(offset);
LineSegment startSegment = it.Current;
int startSegmentOffset = startSegment.Offset;
@ -108,7 +112,7 @@ namespace ICSharpCode.TextEditor.Document @@ -108,7 +112,7 @@ namespace ICSharpCode.TextEditor.Document
// just removing a part of this line segment
startSegment.RemovedLinePart(offset - startSegmentOffset, length);
SetSegmentLength(startSegment, startSegment.TotalLength - length);
return;
return null;
}
// merge startSegment with another line segment because startSegment's delimiter was deleted
// possibly remove lines in between if multiple delimiters were deleted
@ -122,7 +126,7 @@ namespace ICSharpCode.TextEditor.Document @@ -122,7 +126,7 @@ namespace ICSharpCode.TextEditor.Document
// special case: we are removing a part of the last line up to the
// end of the document
SetSegmentLength(startSegment, startSegment.TotalLength - length);
return;
return null;
}
int endSegmentOffset = endSegment.Offset;
int charactersLeftInEndLine = endSegmentOffset + endSegment.TotalLength - (offset + length);
@ -132,13 +136,16 @@ namespace ICSharpCode.TextEditor.Document @@ -132,13 +136,16 @@ namespace ICSharpCode.TextEditor.Document
startSegment.DelimiterLength = endSegment.DelimiterLength;
// remove all segments between startSegment (excl.) and endSegment (incl.)
it.MoveNext();
List<LineSegment> removedLines = new List<LineSegment>();
LineSegment segmentToRemove;
do {
segmentToRemove = it.Current;
it.MoveNext();
lineCollection.RemoveSegment(segmentToRemove);
removedLines.Add(segmentToRemove);
segmentToRemove.Deleted();
} while (segmentToRemove != endSegment);
return removedLines;
}
void InsertInternal(int offset, string text)
@ -181,7 +188,7 @@ namespace ICSharpCode.TextEditor.Document @@ -181,7 +188,7 @@ namespace ICSharpCode.TextEditor.Document
int delta = newTotalLength - segment.TotalLength;
if (delta != 0) {
lineCollection.SetSegmentLength(segment, newTotalLength);
OnLineLengthChanged(new LineLengthEventArgs(document, segment, delta));
OnLineLengthChanged(new LineLengthChangeEventArgs(document, segment, delta));
}
}
@ -298,13 +305,6 @@ namespace ICSharpCode.TextEditor.Document @@ -298,13 +305,6 @@ namespace ICSharpCode.TextEditor.Document
return Math.Max(0, curLineNumber);
}
protected virtual void OnLineCountChanged(LineManagerEventArgs e)
{
if (LineCountChanged != null) {
LineCountChanged(this, e);
}
}
// use always the same DelimiterSegment object for the NextDelimiter
DelimiterSegment delimiterSegment = new DelimiterSegment();
@ -330,15 +330,30 @@ namespace ICSharpCode.TextEditor.Document @@ -330,15 +330,30 @@ namespace ICSharpCode.TextEditor.Document
return null;
}
protected virtual void OnLineLengthChanged(LineLengthEventArgs e)
void OnLineCountChanged(LineCountChangeEventArgs e)
{
if (LineCountChanged != null) {
LineCountChanged(this, e);
}
}
void OnLineLengthChanged(LineLengthChangeEventArgs e)
{
if (LineLengthChanged != null) {
LineLengthChanged(this, e);
}
}
public event LineLengthEventHandler LineLengthChanged;
public event LineManagerEventHandler LineCountChanged;
void OnLineDeleted(LineEventArgs e)
{
if (LineDeleted != null) {
LineDeleted(this, e);
}
}
public event EventHandler<LineLengthChangeEventArgs> LineLengthChanged;
public event EventHandler<LineCountChangeEventArgs> LineCountChanged;
public event EventHandler<LineEventArgs> LineDeleted;
sealed class DelimiterSegment
{

33
src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/LineManager/LineManagerEventArgs.cs

@ -9,10 +9,7 @@ using System; @@ -9,10 +9,7 @@ using System;
namespace ICSharpCode.TextEditor.Document
{
public delegate void LineManagerEventHandler(object sender, LineManagerEventArgs e);
public delegate void LineLengthEventHandler(object sender, LineLengthEventArgs e);
public class LineManagerEventArgs : EventArgs
public class LineCountChangeEventArgs : EventArgs
{
IDocument document;
int start;
@ -45,7 +42,7 @@ namespace ICSharpCode.TextEditor.Document @@ -45,7 +42,7 @@ namespace ICSharpCode.TextEditor.Document
}
}
public LineManagerEventArgs(IDocument document, int lineStart, int linesMoved)
public LineCountChangeEventArgs(IDocument document, int lineStart, int linesMoved)
{
this.document = document;
this.start = lineStart;
@ -53,11 +50,10 @@ namespace ICSharpCode.TextEditor.Document @@ -53,11 +50,10 @@ namespace ICSharpCode.TextEditor.Document
}
}
public class LineLengthEventArgs : EventArgs
public class LineEventArgs : EventArgs
{
IDocument document;
LineSegment lineSegment;
int lengthDelta;
public IDocument Document {
get { return document; }
@ -67,20 +63,35 @@ namespace ICSharpCode.TextEditor.Document @@ -67,20 +63,35 @@ namespace ICSharpCode.TextEditor.Document
get { return lineSegment; }
}
public LineEventArgs(IDocument document, LineSegment lineSegment)
{
this.document = document;
this.lineSegment = lineSegment;
}
public override string ToString()
{
return string.Format("[LineEventArgs Document={0} LineSegment={1}]", this.document, this.lineSegment);
}
}
public class LineLengthChangeEventArgs : LineEventArgs
{
int lengthDelta;
public int LengthDelta {
get { return lengthDelta; }
}
public LineLengthEventArgs(IDocument document, LineSegment lineSegment, int moved)
public LineLengthChangeEventArgs(IDocument document, LineSegment lineSegment, int moved)
: base(document, lineSegment)
{
this.document = document;
this.lineSegment = lineSegment;
this.lengthDelta = moved;
}
public override string ToString()
{
return string.Format("[LineLengthEventArgs Document={0} LineSegment={1} LengthDelta={2}]", this.document, this.lineSegment, this.lengthDelta);
return string.Format("[LineLengthEventArgs Document={0} LineSegment={1} LengthDelta={2}]", this.Document, this.LineSegment, this.lengthDelta);
}
}
}

5
src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/LineManager/LineSegment.cs

@ -106,7 +106,10 @@ namespace ICSharpCode.TextEditor.Document @@ -106,7 +106,10 @@ namespace ICSharpCode.TextEditor.Document
/// </summary>
public override string ToString()
{
return "[LineSegment: Offset = "+ Offset +", Length = " + Length + ", TotalLength = " + TotalLength + ", DelimiterLength = " + delimiterLength + "]";
if (IsDeleted)
return "[LineSegment: (deleted) Length = " + Length + ", TotalLength = " + TotalLength + ", DelimiterLength = " + delimiterLength + "]";
else
return "[LineSegment: LineNumber=" + LineNumber + ", Offset = "+ Offset +", Length = " + Length + ", TotalLength = " + TotalLength + ", DelimiterLength = " + delimiterLength + "]";
}
#region Anchor management

8
src/Main/Base/Project/Src/TextEditor/Bookmarks/Bookmark.cs

@ -46,6 +46,14 @@ namespace ICSharpCode.SharpDevelop.Bookmarks @@ -46,6 +46,14 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
}
}
public event EventHandler LineNumberChanged;
internal void RaiseLineNumberChanged()
{
if (LineNumberChanged != null)
LineNumberChanged(this, EventArgs.Empty);
}
bool isSaved = true;
/// <summary>

6
src/Main/Base/Project/Src/TextEditor/Bookmarks/Pad/Nodes/BookmarkNode.cs

@ -75,8 +75,8 @@ namespace ICSharpCode.SharpDevelop.Bookmarks @@ -75,8 +75,8 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
{
Graphics g = e.Graphics;
int x = MeasureTextWidth(g, positionText, BoldMonospacedFont);
if (line != null) {
x += MeasureTextWidth(g, bookmark.Document.GetText(line).Replace("\t", " "), BoldMonospacedFont);
if (line != null && !line.IsDeleted) {
x += MeasureTextWidth(g, bookmark.Document.GetText(line).Replace("\t", " "), BoldMonospacedFont);
}
return x;
}
@ -89,7 +89,7 @@ namespace ICSharpCode.SharpDevelop.Bookmarks @@ -89,7 +89,7 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
spaceSize = g.MeasureString("-", RegularBigFont, new PointF(0, 0), StringFormat.GenericTypographic);
if (line != null) {
if (line != null && !line.IsDeleted) {
DrawLine(g, line, e.Bounds.Y, x, e.State);
}
}

13
src/Main/Base/Project/Src/TextEditor/Gui/Editor/SharpDevelopTextAreaControl.cs

@ -58,6 +58,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -58,6 +58,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
Document.BookmarkManager.Factory = new Bookmarks.SDBookmarkFactory(Document.BookmarkManager);
Document.BookmarkManager.Added += new BookmarkEventHandler(BookmarkAdded);
Document.BookmarkManager.Removed += new BookmarkEventHandler(BookmarkRemoved);
Document.LineCountChanged += BookmarkLineCountChanged;
GenerateEditActions();
TextEditorProperties = SharpDevelopTextEditorProperties.Instance;
@ -79,6 +80,18 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -79,6 +80,18 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
}
}
void BookmarkLineCountChanged(object sender, LineCountChangeEventArgs e)
{
foreach (Bookmark b in Document.BookmarkManager.Marks) {
if (b.LineNumber >= e.LineStart) {
Bookmarks.SDBookmark sdb = b as Bookmarks.SDBookmark;
if (sdb != null) {
sdb.RaiseLineNumberChanged();
}
}
}
}
protected override void InitializeTextAreaControl(TextAreaControl newControl)
{
base.InitializeTextAreaControl(newControl);

Loading…
Cancel
Save