Browse Source
git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@5063 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61shortcuts
9 changed files with 271 additions and 239 deletions
@ -0,0 +1,84 @@
@@ -0,0 +1,84 @@
|
||||
// <file>
|
||||
// <copyright see="prj:///doc/copyright.txt"/>
|
||||
// <license see="prj:///doc/license.txt"/>
|
||||
// <owner name="Daniel Grunwald"/>
|
||||
// <version>$Revision$</version>
|
||||
// </file>
|
||||
|
||||
using System; |
||||
using ICSharpCode.AvalonEdit.Document; |
||||
|
||||
namespace ICSharpCode.AvalonEdit.Indentation.CSharp |
||||
{ |
||||
/// <summary>
|
||||
/// Smart indentation for C#.
|
||||
/// </summary>
|
||||
public class CSharpIndentationStrategy : DefaultIndentationStrategy |
||||
{ |
||||
/// <summary>
|
||||
/// Creates a new CSharpIndentationStrategy.
|
||||
/// </summary>
|
||||
public CSharpIndentationStrategy() |
||||
{ |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// Creates a new CSharpIndentationStrategy and initializes the settings using the text editor options.
|
||||
/// </summary>
|
||||
public CSharpIndentationStrategy(TextEditorOptions options) |
||||
{ |
||||
this.IndentationString = options.IndentationString; |
||||
} |
||||
|
||||
string indentationString = "\t"; |
||||
|
||||
/// <summary>
|
||||
/// Gets/Sets the indentation string.
|
||||
/// </summary>
|
||||
public string IndentationString { |
||||
get { return indentationString; } |
||||
set { |
||||
if (string.IsNullOrEmpty(value)) |
||||
throw new ArgumentException("Indentation string must not be null or empty"); |
||||
indentationString = value; |
||||
} |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// Performs indentation using the specified document accessor.
|
||||
/// </summary>
|
||||
/// <param name="document">Object used for accessing the document line-by-line</param>
|
||||
/// <param name="keepEmptyLines">Specifies whether empty lines should be kept</param>
|
||||
public void Indent(IDocumentAccessor document, bool keepEmptyLines) |
||||
{ |
||||
if (document == null) |
||||
throw new ArgumentNullException("document"); |
||||
IndentationSettings settings = new IndentationSettings(); |
||||
settings.IndentString = this.IndentationString; |
||||
settings.LeaveEmptyLines = keepEmptyLines; |
||||
|
||||
IndentationReformatter r = new IndentationReformatter(); |
||||
r.Reformat(document, settings); |
||||
} |
||||
|
||||
/// <inheritdoc cref="IIndentationStrategy.IndentLine"/>
|
||||
public override void IndentLine(TextDocument document, DocumentLine line) |
||||
{ |
||||
int lineNr = line.LineNumber; |
||||
TextDocumentAccessor acc = new TextDocumentAccessor(document, lineNr, lineNr); |
||||
Indent(acc, false); |
||||
|
||||
string t = acc.Text; |
||||
if (t.Length == 0) { |
||||
// use AutoIndentation for new lines in comments / verbatim strings.
|
||||
base.IndentLine(document, line); |
||||
} |
||||
} |
||||
|
||||
/// <inheritdoc cref="IIndentationStrategy.IndentLines"/>
|
||||
public override void IndentLines(TextDocument document, int beginLine, int endLine) |
||||
{ |
||||
Indent(new TextDocumentAccessor(document, beginLine, endLine), true); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,111 @@
@@ -0,0 +1,111 @@
|
||||
// <file>
|
||||
// <copyright see="prj:///doc/copyright.txt"/>
|
||||
// <license see="prj:///doc/license.txt"/>
|
||||
// <owner name="Daniel Grunwald" email="daniel@danielgrunwald.de"/>
|
||||
// <version>$Revision$</version>
|
||||
// </file>
|
||||
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
using System.IO; |
||||
|
||||
using ICSharpCode.AvalonEdit.Document; |
||||
|
||||
namespace ICSharpCode.AvalonEdit.Indentation.CSharp |
||||
{ |
||||
/// <summary>
|
||||
/// Interface used for the indentation class to access the document.
|
||||
/// </summary>
|
||||
public interface IDocumentAccessor |
||||
{ |
||||
/// <summary>Gets if the current line is read only (because it is not in the
|
||||
/// selected text region)</summary>
|
||||
bool ReadOnly { get; } |
||||
/// <summary>Gets the number of the current line.</summary>
|
||||
int LineNumber { get; } |
||||
/// <summary>Gets/Sets the text of the current line.</summary>
|
||||
string Text { get; set; } |
||||
/// <summary>Advances to the next line.</summary>
|
||||
bool Next(); |
||||
} |
||||
|
||||
#region TextDocumentAccessor
|
||||
/// <summary>
|
||||
/// Adapter IDocumentAccessor -> TextDocument
|
||||
/// </summary>
|
||||
public sealed class TextDocumentAccessor : IDocumentAccessor |
||||
{ |
||||
readonly TextDocument doc; |
||||
readonly int minLine; |
||||
readonly int maxLine; |
||||
|
||||
/// <summary>
|
||||
/// Creates a new TextDocumentAccessor.
|
||||
/// </summary>
|
||||
public TextDocumentAccessor(TextDocument document) |
||||
{ |
||||
if (document == null) |
||||
throw new ArgumentNullException("document"); |
||||
doc = document; |
||||
this.minLine = 1; |
||||
this.maxLine = doc.LineCount; |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// Creates a new TextDocumentAccessor that indents only a part of the document.
|
||||
/// </summary>
|
||||
public TextDocumentAccessor(TextDocument document, int minLine, int maxLine) |
||||
{ |
||||
if (document == null) |
||||
throw new ArgumentNullException("document"); |
||||
doc = document; |
||||
this.minLine = minLine; |
||||
this.maxLine = maxLine; |
||||
} |
||||
|
||||
int num; |
||||
string text; |
||||
DocumentLine line; |
||||
|
||||
/// <inheritdoc/>
|
||||
public bool ReadOnly { |
||||
get { |
||||
return num < minLine; |
||||
} |
||||
} |
||||
|
||||
/// <inheritdoc/>
|
||||
public int LineNumber { |
||||
get { |
||||
return num; |
||||
} |
||||
} |
||||
|
||||
bool lineDirty; |
||||
|
||||
/// <inheritdoc/>
|
||||
public string Text { |
||||
get { return text; } |
||||
set { |
||||
if (num < minLine) return; |
||||
text = value; |
||||
lineDirty = true; |
||||
} |
||||
} |
||||
|
||||
/// <inheritdoc/>
|
||||
public bool Next() |
||||
{ |
||||
if (lineDirty) { |
||||
doc.Replace(line, text); |
||||
lineDirty = false; |
||||
} |
||||
++num; |
||||
if (num > maxLine) return false; |
||||
line = doc.GetLineByNumber(num); |
||||
text = doc.GetText(line); |
||||
return true; |
||||
} |
||||
} |
||||
#endregion
|
||||
} |
Loading…
Reference in new issue