Browse Source

Improved support for read-only text sections in the text editor: fixed some bugs, removed CustomLineManager, read-only sections now are created using text markers.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@3205 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 18 years ago
parent
commit
6898622e89
  1. 23
      src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/ConsolePad.cs
  2. 6
      src/AddIns/Misc/SearchAndReplace/Test/MockDocument.cs
  3. 2
      src/Libraries/DockPanel_Src/WinFormsUI/WinFormsUI.csproj
  4. 2
      src/Libraries/ICSharpCode.TextEditor/Project/ICSharpCode.TextEditor.csproj
  5. 100
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Actions/MiscActions.cs
  6. 217
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/CustomLineManager/CustomLineManager.cs
  7. 72
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/CustomLineManager/ICustomLineManager.cs
  8. 57
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/DefaultDocument.cs
  9. 8
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/DefaultTextEditorProperties.cs
  10. 1
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/DocumentFactory.cs
  11. 7
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/IDocument.cs
  12. 4
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/ITextEditorProperties.cs
  13. 5
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/MarkerStrategy/TextMarker.cs
  14. 20
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/Selection/SelectionManager.cs
  15. 72
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextArea.cs
  16. 38
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextAreaClipboardHandler.cs
  17. 39
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextAreaDragDropHandler.cs
  18. 3
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextAreaMouseHandler.cs
  19. 4
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextView.cs
  20. 1
      src/Libraries/ICSharpCode.TextEditor/Test/ICSharpCode.TextEditor.Tests.csproj
  21. 165
      src/Libraries/ICSharpCode.TextEditor/Test/TextMarkerTests.cs
  22. 10
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/SharpDevelopTextEditorProperties.cs

23
src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/ConsolePad.cs

@ -45,10 +45,15 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads @@ -45,10 +45,15 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads
set { process = value; }
}
TextMarker readOnlyMarker;
public ConsoleControl()
{
SetHighlighting("C#");
this.TextEditorProperties.SupportReadOnlySegments = true;
PrintPrompt();
readOnlyMarker = new TextMarker(0, this.Document.TextLength, TextMarkerType.Underlined) { IsReadOnly = true };
this.Document.MarkerStrategy.AddMarker(readOnlyMarker);
}
protected override void InitializeTextAreaControl(TextAreaControl newControl)
@ -61,6 +66,10 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads @@ -61,6 +66,10 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads
{
this.Document.Insert(this.Document.TextLength, "> ");
this.ActiveTextAreaControl.Caret.Position = this.Document.OffsetToPosition(this.Document.TextLength);
if (readOnlyMarker != null) {
readOnlyMarker.Offset = 0;
readOnlyMarker.Length = this.Document.TextLength;
}
this.Document.UndoStack.ClearAll(); // prevent user from undoing the prompt insertion
}
@ -72,20 +81,6 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads @@ -72,20 +81,6 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads
bool HandleDialogKey(Keys keys)
{
// All lines except the last one are read-only
int codeStart = this.Document.PositionToOffset(new TextLocation(2, this.Document.LineSegmentCollection.Count - 1));
// make document read-only if caret is before codeStart or there is a selection before codeStart
this.Document.ReadOnly = (this.ActiveTextAreaControl.Caret.Offset < codeStart);
foreach (ISelection selection in this.ActiveTextAreaControl.SelectionManager.SelectionCollection) {
if (selection.Offset < codeStart)
this.Document.ReadOnly = true;
}
if (keys == Keys.Back) {
if (this.ActiveTextAreaControl.Caret.Offset <= codeStart) {
return true;
}
}
if (keys == Keys.Enter) {
string code = GetLastLineText();
if (string.IsNullOrEmpty(code)) return true;

6
src/AddIns/Misc/SearchAndReplace/Test/MockDocument.cs

@ -92,12 +92,6 @@ namespace SearchAndReplace.Tests.Utils @@ -92,12 +92,6 @@ namespace SearchAndReplace.Tests.Utils
}
}
public ICustomLineManager CustomLineManager {
get {
throw new NotImplementedException();
}
}
public MarkerStrategy MarkerStrategy {
get {
throw new NotImplementedException();

2
src/Libraries/DockPanel_Src/WinFormsUI/WinFormsUI.csproj

@ -206,4 +206,4 @@ @@ -206,4 +206,4 @@
<Target Name="AfterBuild">
</Target>
-->
</Project>
</Project>

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

@ -64,8 +64,6 @@ @@ -64,8 +64,6 @@
<Compile Include="Src\Document\TextLocation.cs" />
<Compile Include="Src\Document\TextUtilities.cs" />
<Compile Include="Src\Document\BookmarkManager\BookmarkManager.cs" />
<Compile Include="Src\Document\CustomLineManager\CustomLineManager.cs" />
<Compile Include="Src\Document\CustomLineManager\ICustomLineManager.cs" />
<Compile Include="Src\Document\BookmarkManager\BookmarkManagerMemento.cs" />
<Compile Include="Src\Document\FormattingStrategy\DefaultFormattingStrategy.cs" />
<Compile Include="Src\Document\FormattingStrategy\IFormattingStrategy.cs" />

100
src/Libraries/ICSharpCode.TextEditor/Project/Src/Actions/MiscActions.cs

@ -6,6 +6,7 @@ @@ -6,6 +6,7 @@
// </file>
using System;
using System.Diagnostics;
using System.Drawing;
using System.Text;
@ -525,8 +526,8 @@ namespace ICSharpCode.TextEditor.Actions @@ -525,8 +526,8 @@ namespace ICSharpCode.TextEditor.Actions
{
int hashCode = 0;
unchecked {
if (commentStart != null) hashCode += 1000000007 * commentStart.GetHashCode();
if (commentEnd != null) hashCode += 1000000009 * commentEnd.GetHashCode();
if (commentStart != null) hashCode += 1000000007 * commentStart.GetHashCode();
if (commentEnd != null) hashCode += 1000000009 * commentEnd.GetHashCode();
hashCode += 1000000021 * startOffset.GetHashCode();
hashCode += 1000000033 * endOffset.GetHashCode();
}
@ -536,7 +537,7 @@ namespace ICSharpCode.TextEditor.Actions @@ -536,7 +537,7 @@ namespace ICSharpCode.TextEditor.Actions
public override bool Equals(object obj)
{
BlockCommentRegion other = obj as BlockCommentRegion;
if (other == null) return false;
if (other == null) return false;
return this.commentStart == other.commentStart && this.commentEnd == other.commentEnd && this.startOffset == other.startOffset && this.endOffset == other.endOffset;
}
}
@ -573,17 +574,10 @@ namespace ICSharpCode.TextEditor.Actions @@ -573,17 +574,10 @@ namespace ICSharpCode.TextEditor.Actions
/// <param name="textArea">The <see cref="ItextArea"/> which is used for callback purposes</param>
public override void Execute(TextArea textArea)
{
if (textArea.Document.ReadOnly) {
return;
}
if (textArea.SelectionManager.HasSomethingSelected) {
textArea.BeginUpdate();
textArea.Caret.Position = textArea.SelectionManager.SelectionCollection[0].StartPosition;
textArea.SelectionManager.RemoveSelectedText();
textArea.ScrollToCaret();
textArea.EndUpdate();
Delete.DeleteSelection(textArea);
} else {
if (textArea.Caret.Offset > 0) {
if (textArea.Caret.Offset > 0 && !textArea.IsReadOnly(textArea.Caret.Offset - 1)) {
textArea.BeginUpdate();
int curLineNr = textArea.Document.GetLineNumberForOffset(textArea.Caret.Offset);
int curLineOffset = textArea.Document.GetLineSegment(curLineNr).Offset;
@ -596,15 +590,14 @@ namespace ICSharpCode.TextEditor.Actions @@ -596,15 +590,14 @@ namespace ICSharpCode.TextEditor.Actions
textArea.Document.Remove(lineEndOffset, curLineOffset - lineEndOffset);
textArea.Caret.Position = new TextLocation(lineLength, curLineNr - 1);
textArea.Document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.PositionToEnd, new TextLocation(0, curLineNr - 1)));
textArea.EndUpdate();
} else {
int caretOffset = textArea.Caret.Offset - 1;
textArea.Caret.Position = textArea.Document.OffsetToPosition(caretOffset);
textArea.Document.Remove(caretOffset, 1);
textArea.Document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.PositionToLineEnd, new TextLocation(textArea.Caret.Offset - textArea.Document.GetLineSegment(curLineNr).Offset, curLineNr)));
textArea.EndUpdate();
}
textArea.EndUpdate();
}
}
}
@ -612,22 +605,29 @@ namespace ICSharpCode.TextEditor.Actions @@ -612,22 +605,29 @@ namespace ICSharpCode.TextEditor.Actions
public class Delete : AbstractEditAction
{
internal static void DeleteSelection(TextArea textArea)
{
Debug.Assert(textArea.SelectionManager.HasSomethingSelected);
if (textArea.SelectionManager.SelectionIsReadonly)
return;
textArea.BeginUpdate();
textArea.Caret.Position = textArea.SelectionManager.SelectionCollection[0].StartPosition;
textArea.SelectionManager.RemoveSelectedText();
textArea.ScrollToCaret();
textArea.EndUpdate();
}
/// <remarks>
/// Executes this edit action
/// </remarks>
/// <param name="textArea">The <see cref="ItextArea"/> which is used for callback purposes</param>
public override void Execute(TextArea textArea)
{
if (textArea.Document.ReadOnly) {
return;
}
if (textArea.SelectionManager.HasSomethingSelected) {
textArea.BeginUpdate();
textArea.Caret.Position = textArea.SelectionManager.SelectionCollection[0].StartPosition;
textArea.SelectionManager.RemoveSelectedText();
textArea.ScrollToCaret();
textArea.EndUpdate();
DeleteSelection(textArea);
} else {
if (textArea.IsReadOnly(textArea.Caret.Offset))
return;
if (textArea.Caret.Offset < textArea.Document.TextLength) {
textArea.BeginUpdate();
@ -780,37 +780,39 @@ namespace ICSharpCode.TextEditor.Actions @@ -780,37 +780,39 @@ namespace ICSharpCode.TextEditor.Actions
public override void Execute(TextArea textArea)
{
// if anything is selected we will just delete it first
textArea.BeginUpdate();
if (textArea.SelectionManager.HasSomethingSelected) {
textArea.SelectionManager.RemoveSelectedText();
textArea.ScrollToCaret();
Delete.DeleteSelection(textArea);
return;
}
textArea.BeginUpdate();
// now delete from the caret to the beginning of the word
LineSegment line =
textArea.Document.GetLineSegmentForOffset(textArea.Caret.Offset);
// if we are not at the beginning of a line
if(textArea.Caret.Offset > line.Offset) {
if (textArea.Caret.Offset > line.Offset) {
int prevWordStart = TextUtilities.FindPrevWordStart(textArea.Document,
textArea.Caret.Offset);
if(prevWordStart < textArea.Caret.Offset) {
textArea.Document.Remove(prevWordStart,textArea.Caret.Offset -
prevWordStart);
textArea.Caret.Position = textArea.Document.OffsetToPosition(prevWordStart);
if (prevWordStart < textArea.Caret.Offset) {
if (!textArea.IsReadOnly(prevWordStart, textArea.Caret.Offset - prevWordStart)) {
textArea.Document.Remove(prevWordStart,
textArea.Caret.Offset - prevWordStart);
textArea.Caret.Position = textArea.Document.OffsetToPosition(prevWordStart);
}
}
}
// if we are now at the beginning of a line
if(textArea.Caret.Offset == line.Offset) {
if (textArea.Caret.Offset == line.Offset) {
// if we are not on the first line
int curLineNr =
textArea.Document.GetLineNumberForOffset(textArea.Caret.Offset);
if(curLineNr > 0) {
int curLineNr = textArea.Document.GetLineNumberForOffset(textArea.Caret.Offset);
if (curLineNr > 0) {
// move to the end of the line above
LineSegment lineAbove = textArea.Document.GetLineSegment(curLineNr -
1);
LineSegment lineAbove = textArea.Document.GetLineSegment(curLineNr - 1);
int endOfLineAbove = lineAbove.Offset + lineAbove.Length;
int charsToDelete = textArea.Caret.Offset - endOfLineAbove;
textArea.Document.Remove(endOfLineAbove,charsToDelete);
textArea.Caret.Position = textArea.Document.OffsetToPosition(endOfLineAbove);
if (!textArea.IsReadOnly(endOfLineAbove, charsToDelete)) {
textArea.Document.Remove(endOfLineAbove, charsToDelete);
textArea.Caret.Position = textArea.Document.OffsetToPosition(endOfLineAbove);
}
}
}
textArea.SetDesiredColumn();
@ -835,15 +837,14 @@ namespace ICSharpCode.TextEditor.Actions @@ -835,15 +837,14 @@ namespace ICSharpCode.TextEditor.Actions
/// <param name="textArea">The <see cref="ItextArea"/> which is used for callback purposes</param>
public override void Execute(TextArea textArea)
{
// if anything is selected we will just delete it first
textArea.BeginUpdate();
if (textArea.SelectionManager.HasSomethingSelected) {
textArea.SelectionManager.RemoveSelectedText();
textArea.ScrollToCaret();
DeleteSelection(textArea);
return;
}
// if anything is selected we will just delete it first
textArea.BeginUpdate();
// now delete from the caret to the beginning of the word
LineSegment line =
textArea.Document.GetLineSegmentForOffset(textArea.Caret.Offset);
LineSegment line = textArea.Document.GetLineSegmentForOffset(textArea.Caret.Offset);
if(textArea.Caret.Offset == line.Offset + line.Length) {
// if we are at the end of a line
base.Execute(textArea);
@ -851,9 +852,10 @@ namespace ICSharpCode.TextEditor.Actions @@ -851,9 +852,10 @@ namespace ICSharpCode.TextEditor.Actions
int nextWordStart = TextUtilities.FindNextWordStart(textArea.Document,
textArea.Caret.Offset);
if(nextWordStart > textArea.Caret.Offset) {
textArea.Document.Remove(textArea.Caret.Offset,nextWordStart -
textArea.Caret.Offset);
// cursor never moves with this command
if (!textArea.IsReadOnly(textArea.Caret.Offset, nextWordStart - textArea.Caret.Offset)) {
textArea.Document.Remove(textArea.Caret.Offset, nextWordStart - textArea.Caret.Offset);
// cursor never moves with this command
}
}
}
textArea.UpdateMatchingBracket();
@ -870,6 +872,8 @@ namespace ICSharpCode.TextEditor.Actions @@ -870,6 +872,8 @@ namespace ICSharpCode.TextEditor.Actions
{
int lineNr = textArea.Caret.Line;
LineSegment line = textArea.Document.GetLineSegment(lineNr);
if (textArea.IsReadOnly(line.Offset, line.Length))
return;
textArea.Document.Remove(line.Offset, line.TotalLength);
textArea.Caret.Position = textArea.Document.OffsetToPosition(line.Offset);
@ -887,7 +891,7 @@ namespace ICSharpCode.TextEditor.Actions @@ -887,7 +891,7 @@ namespace ICSharpCode.TextEditor.Actions
LineSegment line = textArea.Document.GetLineSegment(lineNr);
int numRemove = (line.Offset + line.Length) - textArea.Caret.Offset;
if (numRemove > 0) {
if (numRemove > 0 && !textArea.IsReadOnly(textArea.Caret.Offset, numRemove)) {
textArea.Document.Remove(textArea.Caret.Offset, numRemove);
textArea.Document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.SingleLine, new TextLocation(0, lineNr)));
textArea.Document.CommitUpdate();

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

@ -1,217 +0,0 @@ @@ -1,217 +0,0 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Ivo Kovacka" email="ivok@internet.sk"/>
// <version>$Revision$</version>
// </file>
using System;
using System.Collections.Generic;
using System.Drawing;
namespace ICSharpCode.TextEditor.Document
{
/// <summary>
/// This class is used to store a pair of lineNr and its color
/// </summary>
public class CustomLine
{
public int StartLineNr;
public int EndLineNr;
public Color Color;
public bool ReadOnly;
public CustomLine(int lineNr, Color customColor, bool readOnly)
{
this.StartLineNr = this.EndLineNr = lineNr;
this.Color = customColor;
this.ReadOnly = readOnly;
}
public CustomLine(int startLineNr, int endLineNr, Color customColor, bool readOnly)
{
this.StartLineNr = startLineNr;
this.EndLineNr = endLineNr;
this.Color = customColor;
this.ReadOnly = readOnly;
}
}
/// <summary>
/// This class handles the bookmarks for a buffer
/// </summary>
public class CustomLineManager : ICustomLineManager
{
List<CustomLine> lines = new List<CustomLine>();
/// <summary>
/// Creates a new instance of <see cref="CustomLineManager"/>
/// </summary>
internal CustomLineManager(LineManager lineTracker)
{
lineTracker.LineCountChanged += MoveIndices;
}
/// <value>
/// Contains all custom lines
/// </value>
public List<CustomLine> CustomLines {
get {
return lines;
}
}
/// <remarks>
/// Returns the Color if the line <code>lineNr</code> has custom bg color
/// otherwise returns <code>defaultColor</code>
/// </remarks>
public Color GetCustomColor(int lineNr, Color defaultColor)
{
foreach(CustomLine line in lines)
if (line.StartLineNr <= lineNr && line.EndLineNr >= lineNr)
return line.Color;
return defaultColor;
}
/// <remarks>
/// Returns the ReadOnly if the line <code>lineNr</code> is custom
/// otherwise returns <code>default</code>
/// </remarks>
public bool IsReadOnly(int lineNr, bool defaultReadOnly)
{
foreach(CustomLine line in lines)
if (line.StartLineNr <= lineNr && line.EndLineNr >= lineNr)
return line.ReadOnly;
return defaultReadOnly;
}
/// <remarks>
/// Returns true if <code>selection</code> is read only
/// </remarks>
public bool IsReadOnly(ISelection selection, bool defaultReadOnly)
{
int startLine = selection.StartPosition.Y;
int endLine = selection.EndPosition.Y;
foreach (CustomLine customLine in lines) {
if (customLine.ReadOnly == false)
continue;
if (startLine < customLine.StartLineNr && endLine < customLine.StartLineNr)
continue;
if (startLine > customLine.EndLineNr && endLine > customLine.EndLineNr)
continue;
return true;
}
return defaultReadOnly;
}
/// <remarks>
/// Clears all custom lines
/// </remarks>
public void Clear()
{
OnBeforeChanged();
lines.Clear();
OnChanged();
}
/// <remarks>
/// Is fired before the change
/// </remarks>
public event EventHandler BeforeChanged;
/// <remarks>
/// Is fired after the change
/// </remarks>
public event EventHandler Changed;
void OnChanged()
{
if (Changed != null) {
Changed(this, null);
}
}
void OnBeforeChanged()
{
if (BeforeChanged != null) {
BeforeChanged(this, null);
}
}
/// <remarks>
/// Set Custom Line at the line <code>lineNr</code>
/// </remarks>
public void AddCustomLine(int lineNr, Color customColor, bool readOnly)
{
OnBeforeChanged();
lines.Add(new CustomLine(lineNr, customColor, readOnly));
OnChanged();
}
/// <remarks>
/// Add Custom Lines from the line <code>startLineNr</code> to the line <code>endLineNr</code>
/// </remarks>
public void AddCustomLine(int startLineNr, int endLineNr, Color customColor, bool readOnly)
{
OnBeforeChanged();
lines.Add(new CustomLine(startLineNr, endLineNr, customColor, readOnly));
OnChanged();
}
/// <remarks>
/// Remove Custom Line at the line <code>lineNr</code>
/// </remarks>
public void RemoveCustomLine(int lineNr)
{
for (int i = 0; i < lines.Count; ++i) {
if (((CustomLine)lines[i]).StartLineNr <= lineNr && ((CustomLine)lines[i]).EndLineNr >= lineNr) {
OnBeforeChanged();
lines.RemoveAt(i);
OnChanged();
return;
}
}
}
/// <summary>
/// This method moves all indices from index upward count lines
/// (useful for deletion/insertion of text)
/// </summary>
void MoveIndices(object sender, LineCountChangeEventArgs e)
{
bool changed = false;
OnBeforeChanged();
for (int i = 0; i < lines.Count; ++i) {
int startLineNr = ((CustomLine)lines[i]).StartLineNr;
int endLineNr = ((CustomLine)lines[i]).EndLineNr;
if (e.LineStart >= startLineNr && e.LineStart < endLineNr) {
changed = true;
((CustomLine)lines[i]).EndLineNr += e.LinesMoved;
}
else if (e.LineStart < startLineNr) {
((CustomLine)lines[i]).StartLineNr += e.LinesMoved;
((CustomLine)lines[i]).EndLineNr += e.LinesMoved;
}
else {
}
/*
if (e.LinesMoved < 0 && lineNr == e.LineStart) {
lines.RemoveAt(i);
--i;
changed = true;
} else if (lineNr > e.LineStart + 1 || (e.LinesMoved < 0 && lineNr > e.LineStart)) {
changed = true;
((CustomLine)lines[i]).StartLineNr += e.LinesMoved;
((CustomLine)lines[i]).EndLineNr += e.LinesMoved;
}
*/
}
if (changed) {
OnChanged();
}
}
}
}

72
src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/CustomLineManager/ICustomLineManager.cs

@ -1,72 +0,0 @@ @@ -1,72 +0,0 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Ivo Kovacka" email="ivok@internet.sk"/>
// <version>$Revision$</version>
// </file>
using System;
using System.Collections.Generic;
using System.Drawing;
namespace ICSharpCode.TextEditor.Document
{
/// <summary>
/// This class handles the custom lines for a buffer
/// </summary>
public interface ICustomLineManager
{
/// <value>
/// Contains all custom lines
/// </value>
List<CustomLine> CustomLines {
get;
}
/// <remarks>
/// Returns the Color if the line <code>lineNr</code> has custom bg color
/// otherwise returns <code>defaultColor</code>
/// </remarks>
Color GetCustomColor(int lineNr, Color defaultColor);
/// <remarks>
/// Returns true if the line <code>lineNr</code> is read only
/// </remarks>
bool IsReadOnly(int lineNr, bool defaultReadOnly);
/// <remarks>
/// Returns true if <code>selection</code> is read only
/// </remarks>
bool IsReadOnly(ISelection selection, bool defaultReadOnly);
/// <remarks>
/// Add Custom Line at the line <code>lineNr</code>
/// </remarks>
void AddCustomLine(int lineNr, Color customColor, bool readOnly);
/// <remarks>
/// Add Custom Lines from the line <code>startLineNr</code> to the line <code>endLineNr</code>
/// </remarks>
void AddCustomLine(int startLineNr, int endLineNr, Color customColor, bool readOnly);
/// <remarks>
/// Remove Custom Line at the line <code>lineNr</code>
/// </remarks>
void RemoveCustomLine(int lineNr);
/// <remarks>
/// Clears all custom color lines
/// </remarks>
void Clear();
/// <remarks>
/// Is fired before the change
/// </remarks>
event EventHandler BeforeChanged;
/// <remarks>
/// Is fired after the change
/// </remarks>
event EventHandler Changed;
}
}

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

@ -95,7 +95,6 @@ namespace ICSharpCode.TextEditor.Document @@ -95,7 +95,6 @@ namespace ICSharpCode.TextEditor.Document
bool readOnly = false;
LineManager lineTrackingStrategy;
ICustomLineManager customLineManager;
BookmarkManager bookmarkManager;
ITextBufferStrategy textBufferStrategy;
IFormattingStrategy formattingStrategy;
@ -209,15 +208,6 @@ namespace ICSharpCode.TextEditor.Document @@ -209,15 +208,6 @@ namespace ICSharpCode.TextEditor.Document
}
public ICustomLineManager CustomLineManager {
get {
return customLineManager;
}
set {
customLineManager = value;
}
}
public string TextContent {
get {
return GetText(0, textBufferStrategy.Length);
@ -364,34 +354,41 @@ namespace ICSharpCode.TextEditor.Document @@ -364,34 +354,41 @@ namespace ICSharpCode.TextEditor.Document
public void UpdateSegmentListOnDocumentChange<T>(List<T> list, DocumentEventArgs e) where T : ISegment
{
int removedCharacters = e.Length > 0 ? e.Length : 0;
int insertedCharacters = e.Text != null ? e.Text.Length : 0;
for (int i = 0; i < list.Count; ++i) {
ISegment fm = list[i];
ISegment s = list[i];
int segmentStart = s.Offset;
int segmentEnd = s.Offset + s.Length;
if (e.Offset <= segmentStart) {
segmentStart -= removedCharacters;
if (segmentStart < e.Offset)
segmentStart = e.Offset;
}
if (e.Offset < segmentEnd) {
segmentEnd -= removedCharacters;
if (segmentEnd < e.Offset)
segmentEnd = e.Offset;
}
if (e.Offset <= fm.Offset && fm.Offset <= e.Offset + e.Length ||
e.Offset <= fm.Offset + fm.Length && fm.Offset + fm.Length <= e.Offset + e.Length) {
Debug.Assert(segmentStart <= segmentEnd);
if (segmentStart == segmentEnd) {
list.RemoveAt(i);
--i;
continue;
}
if (fm.Offset <= e.Offset && e.Offset <= fm.Offset + fm.Length) {
if (e.Text != null) {
fm.Length += e.Text.Length;
}
if (e.Length > 0) {
fm.Length -= e.Length;
}
continue;
}
if (e.Offset <= segmentStart)
segmentStart += insertedCharacters;
if (e.Offset < segmentEnd)
segmentEnd += insertedCharacters;
if (fm.Offset >= e.Offset) {
if (e.Text != null) {
fm.Offset += e.Text.Length;
}
if (e.Length > 0) {
fm.Offset -= e.Length;
}
}
Debug.Assert(segmentStart < segmentEnd);
s.Offset = segmentStart;
s.Length = segmentEnd - segmentStart;
}
}

8
src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/DefaultTextEditorProperties.cs

@ -62,7 +62,7 @@ namespace ICSharpCode.TextEditor.Document @@ -62,7 +62,7 @@ namespace ICSharpCode.TextEditor.Document
LineViewerStyle lineViewerStyle = LineViewerStyle.None;
string lineTerminator = "\r\n";
bool autoInsertCurlyBracket = true;
bool useCustomLine = false;
bool supportReadOnlySegments = false;
public int TabIndent {
get {
@ -295,12 +295,12 @@ namespace ICSharpCode.TextEditor.Document @@ -295,12 +295,12 @@ namespace ICSharpCode.TextEditor.Document
}
}
public bool UseCustomLine {
public bool SupportReadOnlySegments {
get {
return useCustomLine;
return supportReadOnlySegments;
}
set {
useCustomLine = value;
supportReadOnlySegments = value;
}
}
}

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

@ -30,7 +30,6 @@ namespace ICSharpCode.TextEditor.Document @@ -30,7 +30,6 @@ namespace ICSharpCode.TextEditor.Document
doc.FoldingManager.FoldingStrategy = null; //new ParserFoldingStrategy();
doc.MarkerStrategy = new MarkerStrategy(doc);
doc.BookmarkManager = new BookmarkManager(doc, doc.LineManager);
doc.CustomLineManager = new CustomLineManager(doc.LineManager);
return doc;
}

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

@ -72,13 +72,6 @@ namespace ICSharpCode.TextEditor.Document @@ -72,13 +72,6 @@ namespace ICSharpCode.TextEditor.Document
get;
}
/// <summary>
/// The <see cref="ICustomColorLineManager"/> attached to the <see cref="IDocument"/> instance
/// </summary>
ICustomLineManager CustomLineManager {
get;
}
MarkerStrategy MarkerStrategy {
get;
}

4
src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/ITextEditorProperties.cs

@ -163,9 +163,9 @@ namespace ICSharpCode.TextEditor.Document @@ -163,9 +163,9 @@ namespace ICSharpCode.TextEditor.Document
set;
}
bool UseCustomLine {
bool SupportReadOnlySegments {
get;
set;
}
}
}
}

5
src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/MarkerStrategy/TextMarker.cs

@ -52,6 +52,11 @@ namespace ICSharpCode.TextEditor.Document @@ -52,6 +52,11 @@ namespace ICSharpCode.TextEditor.Document
}
}
/// <summary>
/// Marks the text segment as read-only.
/// </summary>
public bool IsReadOnly { get; set; }
public string ToolTip {
get {
return toolTip;

20
src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/Selection/SelectionManager.cs

@ -54,16 +54,22 @@ namespace ICSharpCode.TextEditor.Document @@ -54,16 +54,22 @@ namespace ICSharpCode.TextEditor.Document
get {
if (document.ReadOnly)
return true;
if (document.TextEditorProperties.UseCustomLine) {
foreach (ISelection sel in selectionCollection) {
if (document.CustomLineManager.IsReadOnly(sel, false))
return true;
}
foreach (ISelection sel in selectionCollection) {
if (SelectionIsReadOnly(document, sel))
return true;
}
return false;
}
}
internal static bool SelectionIsReadOnly(IDocument document, ISelection sel)
{
if (document.TextEditorProperties.SupportReadOnlySegments)
return document.MarkerStrategy.GetMarkers(sel.Offset, sel.Length).Exists(m=>m.IsReadOnly);
else
return false;
}
/// <value>
/// The text that is currently selected.
/// </value>
@ -286,6 +292,10 @@ namespace ICSharpCode.TextEditor.Document @@ -286,6 +292,10 @@ namespace ICSharpCode.TextEditor.Document
/// </remarks>
public void RemoveSelectedText()
{
if (SelectionIsReadonly) {
ClearSelection();
return;
}
List<int> lines = new List<int>();
int offset = -1;
bool oneLine = true;

72
src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextArea.cs

@ -579,18 +579,37 @@ namespace ICSharpCode.TextEditor @@ -579,18 +579,37 @@ namespace ICSharpCode.TextEditor
return true;
}
public void SimulateKeyPress(char ch)
internal bool IsReadOnly(int offset)
{
if (Document.ReadOnly) {
return;
return true;
}
if (TextEditorProperties.UseCustomLine == true) {
if (SelectionManager.HasSomethingSelected) {
if (SelectionManager.SelectionIsReadonly)
return;
} else if (Document.CustomLineManager.IsReadOnly(Caret.Line, false) == true)
if (TextEditorProperties.SupportReadOnlySegments) {
return Document.MarkerStrategy.GetMarkers(offset).Exists(m=>m.IsReadOnly);
} else {
return false;
}
}
internal bool IsReadOnly(int offset, int length)
{
if (Document.ReadOnly) {
return true;
}
if (TextEditorProperties.SupportReadOnlySegments) {
return Document.MarkerStrategy.GetMarkers(offset, length).Exists(m=>m.IsReadOnly);
} else {
return false;
}
}
public void SimulateKeyPress(char ch)
{
if (SelectionManager.HasSomethingSelected) {
if (SelectionManager.SelectionIsReadonly)
return;
} else if (IsReadOnly(Caret.Offset)) {
return;
}
if (ch < ' ') {
@ -650,29 +669,6 @@ namespace ICSharpCode.TextEditor @@ -650,29 +669,6 @@ namespace ICSharpCode.TextEditor
return true;
}
if (keyData == Keys.Back || keyData == Keys.Delete || keyData == Keys.Enter) {
if (TextEditorProperties.UseCustomLine == true) {
if (SelectionManager.HasSomethingSelected) {
if (SelectionManager.SelectionIsReadonly)
return true;
} else {
int curLineNr = Document.GetLineNumberForOffset(Caret.Offset);
if (Document.CustomLineManager.IsReadOnly(curLineNr, false) == true)
return true;
if ((Caret.Column == 0) && (curLineNr - 1 >= 0) && keyData == Keys.Back &&
Document.CustomLineManager.IsReadOnly(curLineNr - 1, false) == true)
return true;
if (keyData == Keys.Delete) {
LineSegment curLine = Document.GetLineSegment(curLineNr);
if (curLine.Offset + curLine.Length == Caret.Offset &&
Document.CustomLineManager.IsReadOnly(curLineNr + 1, false) == true) {
return true;
}
}
}
}
}
// if not (or the process was 'silent', use the standard edit actions
IEditAction action = motherTextEditorControl.GetEditAction(keyData);
AutoClearSelection = true;
@ -726,16 +722,10 @@ namespace ICSharpCode.TextEditor @@ -726,16 +722,10 @@ namespace ICSharpCode.TextEditor
get {
if (motherTextAreaControl == null)
return false;
if (TextEditorProperties.UseCustomLine == true) {
if (SelectionManager.HasSomethingSelected == true) {
if (SelectionManager.SelectionIsReadonly)
return false;
}
if (Document.CustomLineManager.IsReadOnly(Caret.Line, false) == true)
return false;
}
return true;
if (SelectionManager.HasSomethingSelected)
return !SelectionManager.SelectionIsReadonly;
else
return !IsReadOnly(Caret.Offset);
}
}

38
src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextAreaClipboardHandler.cs

@ -65,12 +65,7 @@ namespace ICSharpCode.TextEditor @@ -65,12 +65,7 @@ namespace ICSharpCode.TextEditor
// ((DefaultWorkbench)WorkbenchSingleton.Workbench).UpdateToolbars();
}
string LineSelectedType
{
get {
return "MSDEVLineSelect"; // This is the type VS 2003 and 2005 use for flagging a whole line copy
}
}
const string LineSelectedType = "MSDEVLineSelect"; // This is the type VS 2003 and 2005 use for flagging a whole line copy
bool CopyTextToClipboard(string stringToCopy, bool asLine)
{
@ -128,26 +123,25 @@ namespace ICSharpCode.TextEditor @@ -128,26 +123,25 @@ namespace ICSharpCode.TextEditor
public void Cut(object sender, EventArgs e)
{
if (textArea.TextEditorProperties.UseCustomLine == true) {
if (textArea.SelectionManager.HasSomethingSelected) {
if (textArea.SelectionManager.HasSomethingSelected) {
if (CopyTextToClipboard(textArea.SelectionManager.SelectedText)) {
if (textArea.SelectionManager.SelectionIsReadonly)
return;
} else if (textArea.Document.CustomLineManager.IsReadOnly(textArea.Caret.Line, false) == true)
return;
}
if (CopyTextToClipboard(textArea.SelectionManager.SelectedText)) {
// Remove text
textArea.BeginUpdate();
textArea.Caret.Position = textArea.SelectionManager.SelectionCollection[0].StartPosition;
textArea.SelectionManager.RemoveSelectedText();
textArea.EndUpdate();
} else if (textArea.Document.TextEditorProperties.CutCopyWholeLine){
// Remove text
textArea.BeginUpdate();
textArea.Caret.Position = textArea.SelectionManager.SelectionCollection[0].StartPosition;
textArea.SelectionManager.RemoveSelectedText();
textArea.EndUpdate();
}
} else if (textArea.Document.TextEditorProperties.CutCopyWholeLine) {
// No text was selected, select and cut the entire line
int curLineNr = textArea.Document.GetLineNumberForOffset(textArea.Caret.Offset);
LineSegment lineWhereCaretIs = textArea.Document.GetLineSegment(curLineNr);
string caretLineText = textArea.Document.GetText(lineWhereCaretIs.Offset, lineWhereCaretIs.TotalLength);
textArea.SelectionManager.SetSelection(textArea.Document.OffsetToPosition(lineWhereCaretIs.Offset), textArea.Document.OffsetToPosition(lineWhereCaretIs.Offset + lineWhereCaretIs.TotalLength));
if (CopyTextToClipboard(caretLineText, true)) {
if (textArea.SelectionManager.SelectionIsReadonly)
return;
// remove line
textArea.BeginUpdate();
textArea.Caret.Position = textArea.Document.OffsetToPosition(lineWhereCaretIs.Offset);
@ -171,12 +165,8 @@ namespace ICSharpCode.TextEditor @@ -171,12 +165,8 @@ namespace ICSharpCode.TextEditor
public void Paste(object sender, EventArgs e)
{
if (textArea.TextEditorProperties.UseCustomLine == true) {
if (textArea.SelectionManager.HasSomethingSelected) {
if (textArea.SelectionManager.SelectionIsReadonly)
return;
} else if (textArea.Document.CustomLineManager.IsReadOnly(textArea.Caret.Line, false) == true)
return;
if (!textArea.EnableCutOrPaste) {
return;
}
// Clipboard.GetDataObject may throw an exception...
for (int i = 0;; i++) {

39
src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextAreaDragDropHandler.cs

@ -15,6 +15,8 @@ namespace ICSharpCode.TextEditor @@ -15,6 +15,8 @@ namespace ICSharpCode.TextEditor
{
public class TextAreaDragDropHandler
{
public static Action<Exception> OnDragDropException = ex => MessageBox.Show(ex.ToString());
TextArea textArea;
public void Attach(TextArea textArea)
@ -22,9 +24,24 @@ namespace ICSharpCode.TextEditor @@ -22,9 +24,24 @@ namespace ICSharpCode.TextEditor
this.textArea = textArea;
textArea.AllowDrop = true;
textArea.DragEnter += new DragEventHandler(OnDragEnter);
textArea.DragDrop += new DragEventHandler(OnDragDrop);
textArea.DragOver += new DragEventHandler(OnDragOver);
textArea.DragEnter += MakeDragEventHandler(OnDragEnter);
textArea.DragDrop += MakeDragEventHandler(OnDragDrop);
textArea.DragOver += MakeDragEventHandler(OnDragOver);
}
/// <summary>
/// Create a drag'n'drop event handler.
/// Windows Forms swallows unhandled exceptions during drag'n'drop, so we report them here.
/// </summary>
static DragEventHandler MakeDragEventHandler(DragEventHandler h)
{
return (sender, e) => {
try {
h(sender, e);
} catch (Exception ex) {
OnDragDropException(ex);
}
};
}
static DragDropEffects GetDragDropEffect(DragEventArgs e)
@ -65,24 +82,20 @@ namespace ICSharpCode.TextEditor @@ -65,24 +82,20 @@ namespace ICSharpCode.TextEditor
if (e.Data.GetDataPresent(typeof(string))) {
textArea.BeginUpdate();
textArea.Document.UndoStack.StartUndoGroup();
try {
int offset = textArea.Caret.Offset;
if (textArea.TextEditorProperties.UseCustomLine
&& textArea.Document.CustomLineManager.IsReadOnly(textArea.Caret.Line, false))
{
if (textArea.IsReadOnly(offset)) {
// prevent dragging text into readonly section
return;
}
textArea.Document.UndoStack.StartUndoGroup();
if (e.Data.GetDataPresent(typeof(DefaultSelection))) {
ISelection sel = (ISelection)e.Data.GetData(typeof(DefaultSelection));
if (sel.ContainsPosition(textArea.Caret.Position)) {
return;
}
if (GetDragDropEffect(e) == DragDropEffects.Move) {
if (textArea.TextEditorProperties.UseCustomLine
&& textArea.Document.CustomLineManager.IsReadOnly(sel, false))
{
if (SelectionManager.SelectionIsReadOnly(textArea.Document, sel)) {
// prevent dragging text out of readonly section
return;
}
@ -118,9 +131,13 @@ namespace ICSharpCode.TextEditor @@ -118,9 +131,13 @@ namespace ICSharpCode.TextEditor
textArea.Caret.Position = new TextLocation(realmousepos.X, lineNr);
textArea.SetDesiredColumn();
if (e.Data.GetDataPresent(typeof(string))) {
if (e.Data.GetDataPresent(typeof(string)) && !textArea.IsReadOnly(textArea.Caret.Offset)) {
e.Effect = GetDragDropEffect(e);
} else {
e.Effect = DragDropEffects.None;
}
} else {
e.Effect = DragDropEffects.None;
}
}
}

3
src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextAreaMouseHandler.cs

@ -175,12 +175,13 @@ namespace ICSharpCode.TextEditor @@ -175,12 +175,13 @@ namespace ICSharpCode.TextEditor
ISelection selection = textArea.SelectionManager.GetSelectionAt(textArea.Caret.Offset);
if (selection != null) {
string text = selection.SelectedText;
bool isReadOnly = SelectionManager.SelectionIsReadOnly(textArea.Document, selection);
if (text != null && text.Length > 0) {
DataObject dataObject = new DataObject ();
dataObject.SetData(DataFormats.UnicodeText, true, text);
dataObject.SetData(selection);
dodragdrop = true;
textArea.DoDragDrop(dataObject, DragDropEffects.All);
textArea.DoDragDrop(dataObject, isReadOnly ? DragDropEffects.All & ~DragDropEffects.Move : DragDropEffects.All);
}
}
}

4
src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextView.cs

@ -276,10 +276,6 @@ namespace ICSharpCode.TextEditor @@ -276,10 +276,6 @@ namespace ICSharpCode.TextEditor
}
HighlightColor background = textArea.Document.HighlightingStrategy.GetColorFor("Default");
Color bgColor = background.BackgroundColor;
if (textArea.MotherTextAreaControl.TextEditorProperties.UseCustomLine == true)
{
bgColor = textArea.Document.CustomLineManager.GetCustomColor(lineNumber, bgColor);
}
return BrushRegistry.GetBrush(bgColor);
}

1
src/Libraries/ICSharpCode.TextEditor/Test/ICSharpCode.TextEditor.Tests.csproj

@ -45,6 +45,7 @@ @@ -45,6 +45,7 @@
<Compile Include="DocumentTests.cs" />
<Compile Include="BlockCommentTests.cs" />
<Compile Include="FoldingManagerTests.cs" />
<Compile Include="TextMarkerTests.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Project\ICSharpCode.TextEditor.csproj">

165
src/Libraries/ICSharpCode.TextEditor/Test/TextMarkerTests.cs

@ -0,0 +1,165 @@ @@ -0,0 +1,165 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <author name="Daniel Grunwald"/>
// <version>$Revision$</version>
// </file>
using ICSharpCode.TextEditor.Document;
using System;
using NUnit.Framework;
using NUnit.Framework.SyntaxHelpers;
namespace ICSharpCode.TextEditor.Tests
{
[TestFixture]
public class TextMarkerTests
{
IDocument document;
TextMarker marker;
[SetUp]
public void SetUp()
{
document = new DocumentFactory().CreateDocument();
document.TextContent = "0123456789";
marker = new TextMarker(3, 3, TextMarkerType.Underlined);
document.MarkerStrategy.AddMarker(marker);
}
[Test]
public void RemoveTextBeforeMarker()
{
document.Remove(1, 1);
Assert.AreEqual(1, document.MarkerStrategy.GetMarkers(0, document.TextLength).Count);
Assert.AreEqual("345", document.GetText(marker));
}
[Test]
public void RemoveTextImmediatelyBeforeMarker()
{
document.Remove(2, 1);
Assert.AreEqual(1, document.MarkerStrategy.GetMarkers(0, document.TextLength).Count);
Assert.AreEqual("345", document.GetText(marker));
}
[Test]
public void RemoveTextBeforeMarkerIntoMarker()
{
document.Remove(2, 2);
Assert.AreEqual(1, document.MarkerStrategy.GetMarkers(0, document.TextLength).Count);
Assert.AreEqual("45", document.GetText(marker));
}
[Test]
public void RemoveTextBeforeMarkerUntilMarkerEnd()
{
document.Remove(2, 4);
Assert.AreEqual(0, document.MarkerStrategy.GetMarkers(0, document.TextLength).Count);
}
[Test]
public void RemoveTextBeforeMarkerOverMarkerEnd()
{
document.Remove(2, 5);
Assert.AreEqual(0, document.MarkerStrategy.GetMarkers(0, document.TextLength).Count);
}
[Test]
public void RemoveTextFromMarkerStartIntoMarker()
{
document.Remove(3, 1);
Assert.AreEqual(1, document.MarkerStrategy.GetMarkers(0, document.TextLength).Count);
Assert.AreEqual("45", document.GetText(marker));
}
[Test]
public void RemoveTextFromMarkerStartUntilMarkerEnd()
{
document.Remove(3, 3);
Assert.AreEqual(0, document.MarkerStrategy.GetMarkers(0, document.TextLength).Count);
}
[Test]
public void RemoveTextFromMarkerStartOverMarkerEnd()
{
document.Remove(3, 4);
Assert.AreEqual(0, document.MarkerStrategy.GetMarkers(0, document.TextLength).Count);
}
[Test]
public void RemoveTextInsideMarker()
{
document.Remove(4, 1);
Assert.AreEqual(1, document.MarkerStrategy.GetMarkers(0, document.TextLength).Count);
Assert.AreEqual("35", document.GetText(marker));
}
[Test]
public void RemoveTextInsideMarkerUntilMarkerEnd()
{
document.Remove(4, 2);
Assert.AreEqual(1, document.MarkerStrategy.GetMarkers(0, document.TextLength).Count);
Assert.AreEqual("3", document.GetText(marker));
}
[Test]
public void RemoveTextInsideMarkerOverMarkerEnd()
{
document.Remove(4, 3);
Assert.AreEqual(1, document.MarkerStrategy.GetMarkers(0, document.TextLength).Count);
Assert.AreEqual("3", document.GetText(marker));
}
[Test]
public void RemoveTextImmediatelyAfterMarker()
{
document.Remove(6, 1);
Assert.AreEqual(1, document.MarkerStrategy.GetMarkers(0, document.TextLength).Count);
Assert.AreEqual("345", document.GetText(marker));
}
[Test]
public void RemoveTextAfterMarker()
{
document.Remove(7, 1);
Assert.AreEqual(1, document.MarkerStrategy.GetMarkers(0, document.TextLength).Count);
Assert.AreEqual("345", document.GetText(marker));
}
[Test]
public void InsertTextBeforeMarker()
{
document.Insert(1, "ab");
Assert.AreEqual("345", document.GetText(marker));
}
[Test]
public void InsertTextImmediatelyBeforeMarker()
{
document.Insert(3, "ab");
Assert.AreEqual("345", document.GetText(marker));
}
[Test]
public void InsertTextInsideMarker()
{
document.Insert(4, "ab");
Assert.AreEqual("3ab45", document.GetText(marker));
}
[Test]
public void InsertTextImmediatelyAfterMarker()
{
document.Insert(6, "ab");
Assert.AreEqual("345", document.GetText(marker));
}
[Test]
public void InsertTextAfterMarker()
{
document.Insert(7, "ab");
Assert.AreEqual("345", document.GetText(marker));
}
}
}

10
src/Main/Base/Project/Src/TextEditor/Gui/Editor/SharpDevelopTextEditorProperties.cs

@ -331,15 +331,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -331,15 +331,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
}
}
bool useCustomLine = false;
public bool UseCustomLine {
get {
return useCustomLine;
}
set {
useCustomLine = value;
}
}
public bool SupportReadOnlySegments { get; set; }
public TextRenderingHint TextRenderingHint {
get {

Loading…
Cancel
Save