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 @@ |
|||||||
|
// <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 @@ |
|||||||
|
// <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