diff --git a/src/Libraries/NRefactory/Project/Src/PrettyPrinter/CSharp/CSharpOutputVisitor.cs b/src/Libraries/NRefactory/Project/Src/PrettyPrinter/CSharp/CSharpOutputVisitor.cs index 2bbdcf11da..17aeeb0b2a 100644 --- a/src/Libraries/NRefactory/Project/Src/PrettyPrinter/CSharp/CSharpOutputVisitor.cs +++ b/src/Libraries/NRefactory/Project/Src/PrettyPrinter/CSharp/CSharpOutputVisitor.cs @@ -39,13 +39,12 @@ namespace ICSharpCode.NRefactory.PrettyPrinter } } - public object Options { - get { - return prettyPrintOptions; - } - set { - prettyPrintOptions = value as PrettyPrintOptions; - } + AbstractPrettyPrintOptions IOutputAstVisitor.Options { + get { return prettyPrintOptions; } + } + + public PrettyPrintOptions Options { + get { return prettyPrintOptions; } } public IOutputFormatter OutputFormatter { diff --git a/src/Libraries/NRefactory/Project/Src/PrettyPrinter/IOutputAstVisitor.cs b/src/Libraries/NRefactory/Project/Src/PrettyPrinter/IOutputAstVisitor.cs index 8d8435b179..c73230a469 100644 --- a/src/Libraries/NRefactory/Project/Src/PrettyPrinter/IOutputAstVisitor.cs +++ b/src/Libraries/NRefactory/Project/Src/PrettyPrinter/IOutputAstVisitor.cs @@ -27,9 +27,8 @@ namespace ICSharpCode.NRefactory.PrettyPrinter get; } - object Options { + AbstractPrettyPrintOptions Options { get; - set; } IOutputFormatter OutputFormatter { get; diff --git a/src/Libraries/NRefactory/Project/Src/PrettyPrinter/VBNet/VBNetOutputVisitor.cs b/src/Libraries/NRefactory/Project/Src/PrettyPrinter/VBNet/VBNetOutputVisitor.cs index f79b2348aa..e979e0ab27 100644 --- a/src/Libraries/NRefactory/Project/Src/PrettyPrinter/VBNet/VBNetOutputVisitor.cs +++ b/src/Libraries/NRefactory/Project/Src/PrettyPrinter/VBNet/VBNetOutputVisitor.cs @@ -41,13 +41,12 @@ namespace ICSharpCode.NRefactory.PrettyPrinter } } - public object Options { - get { - return prettyPrintOptions; - } - set { - prettyPrintOptions = value as VBNetPrettyPrintOptions; - } + AbstractPrettyPrintOptions IOutputAstVisitor.Options { + get { return prettyPrintOptions; } + } + + public VBNetPrettyPrintOptions Options { + get { return prettyPrintOptions; } } public NodeTracker NodeTracker { diff --git a/src/Main/Base/Project/Src/Services/AmbienceService/AmbienceService.cs b/src/Main/Base/Project/Src/Services/AmbienceService/AmbienceService.cs index c818d1d117..98deebdff9 100644 --- a/src/Main/Base/Project/Src/Services/AmbienceService/AmbienceService.cs +++ b/src/Main/Base/Project/Src/Services/AmbienceService/AmbienceService.cs @@ -8,13 +8,22 @@ using System; using ICSharpCode.Core; using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.SharpDevelop.Dom.Refactoring; +using ICSharpCode.NRefactory.PrettyPrinter; namespace ICSharpCode.SharpDevelop { public static class AmbienceService { - static readonly string ambienceProperty = "SharpDevelop.UI.CurrentAmbience"; - static readonly string codeGenerationProperty = "SharpDevelop.UI.CodeGenerationOptions"; + const string ambienceProperty = "SharpDevelop.UI.CurrentAmbience"; + const string codeGenerationProperty = "SharpDevelop.UI.CodeGenerationOptions"; + const string textEditorProperty = "ICSharpCode.TextEditor.Document.Document.DefaultDocumentAggregatorProperties"; + + static AmbienceService() + { + PropertyService.PropertyChanged += new PropertyChangedEventHandler(PropertyChanged); + ApplyCodeGenerationPropertiesToNRefactory(); + } public static Properties CodeGenerationProperties { get { @@ -22,6 +31,16 @@ namespace ICSharpCode.SharpDevelop } } + static void ApplyCodeGenerationPropertiesToNRefactory() + { + Properties p = CodeGenerationProperties; + LanguageProperties.CSharp.CodeGenerator.Options.EmptyLinesBetweenMembers = p.Get("BlankLinesBetweenMembers", true); + LanguageProperties.CSharp.CodeGenerator.Options.BracesOnSameLine = p.Get("StartBlockOnSameLine", true); + + System.CodeDom.Compiler.CodeGeneratorOptions cdo = new CodeDOMGeneratorUtility().CreateCodeGeneratorOptions; + LanguageProperties.CSharp.CodeGenerator.Options.IndentString = cdo.IndentString; + } + public static bool GenerateDocumentComments { get { return CodeGenerationProperties.Get("GenerateDocumentComments", true); @@ -90,14 +109,11 @@ namespace ICSharpCode.SharpDevelop defaultAmbience = null; OnAmbienceChanged(EventArgs.Empty); } + if (e.Key == codeGenerationProperty || e.Key == textEditorProperty) { + ApplyCodeGenerationPropertiesToNRefactory(); + } } - static AmbienceService() - { - PropertyService.PropertyChanged += new PropertyChangedEventHandler(PropertyChanged); - } - - static void OnAmbienceChanged(EventArgs e) { if (AmbienceChanged != null) { diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/ICSharpCode.SharpDevelop.Dom.csproj b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/ICSharpCode.SharpDevelop.Dom.csproj index 5bcbb4f6bd..c729757248 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/ICSharpCode.SharpDevelop.Dom.csproj +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/ICSharpCode.SharpDevelop.Dom.csproj @@ -88,6 +88,7 @@ + diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Refactoring/CodeGenerator.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Refactoring/CodeGenerator.cs index 019d1deba3..29fe06d42f 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Refactoring/CodeGenerator.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Refactoring/CodeGenerator.cs @@ -243,6 +243,12 @@ namespace ICSharpCode.SharpDevelop.Dom.Refactoring } #endregion + readonly CodeGeneratorOptions options = new CodeGeneratorOptions(); + + public CodeGeneratorOptions Options { + get { return options; } + } + #region Code generation / insertion public virtual void InsertCodeAfter(IMember member, IDocument document, params AbstractNode[] nodes) { @@ -258,13 +264,13 @@ namespace ICSharpCode.SharpDevelop.Dom.Refactoring public virtual void InsertCodeAtEnd(DomRegion region, IDocument document, params AbstractNode[] nodes) { InsertCodeAfter(region.EndLine - 1, document, - GetIndentation(document, region.BeginLine) + '\t', nodes); + GetIndentation(document, region.BeginLine) + options.IndentString, nodes); } public virtual void InsertCodeInClass(IClass c, IDocument document, int targetLine, params AbstractNode[] nodes) { InsertCodeAfter(targetLine, document, - GetIndentation(document, c.Region.BeginLine) + '\t', false, nodes); + GetIndentation(document, c.Region.BeginLine) + options.IndentString, false, nodes); } protected string GetIndentation(IDocument document, int line) @@ -291,8 +297,11 @@ namespace ICSharpCode.SharpDevelop.Dom.Refactoring IDocumentLine lineSegment = document.GetLine(insertLine + 1); StringBuilder b = new StringBuilder(); for (int i = 0; i < nodes.Length; i++) { - if (startWithEmptyLine || i > 0) - b.AppendLine(indentation); + if (options.EmptyLinesBetweenMembers) { + if (startWithEmptyLine || i > 0) { + b.AppendLine(indentation); + } + } b.Append(GenerateCode(nodes[i], indentation)); } document.Insert(lineSegment.Offset, b.ToString()); diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Refactoring/CodeGeneratorOptions.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Refactoring/CodeGeneratorOptions.cs new file mode 100644 index 0000000000..bb5acc8e46 --- /dev/null +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Refactoring/CodeGeneratorOptions.cs @@ -0,0 +1,28 @@ +// +// +// +// +// $Revision$ +// + +using System; + +namespace ICSharpCode.SharpDevelop.Dom.Refactoring +{ + public class CodeGeneratorOptions + { + public bool BracesOnSameLine = true; + public bool EmptyLinesBetweenMembers = true; + string indentString; + + public string IndentString { + get { return indentString; } + set { + if (string.IsNullOrEmpty(value)) { + throw new ArgumentNullException("value"); + } + indentString = value; + } + } + } +} diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Refactoring/NRefactoryCodeGenerator.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Refactoring/NRefactoryCodeGenerator.cs index ab98deb347..ede220eb1a 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Refactoring/NRefactoryCodeGenerator.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Refactoring/NRefactoryCodeGenerator.cs @@ -38,11 +38,31 @@ namespace ICSharpCode.SharpDevelop.Dom.Refactoring public class CSharpCodeGenerator : NRefactoryCodeGenerator { - public static readonly CSharpCodeGenerator Instance = new CSharpCodeGenerator(); + internal static readonly CSharpCodeGenerator Instance = new CSharpCodeGenerator(); public override IOutputAstVisitor CreateOutputVisitor() { - return new CSharpOutputVisitor(); + CSharpOutputVisitor v = new CSharpOutputVisitor(); + PrettyPrintOptions pOpt = v.Options; + + BraceStyle braceStyle; + if (this.Options.BracesOnSameLine) { + braceStyle = BraceStyle.EndOfLine; + } else { + braceStyle = BraceStyle.NextLine; + } + pOpt.StatementBraceStyle = braceStyle; + pOpt.EventAddBraceStyle = braceStyle; + pOpt.EventRemoveBraceStyle = braceStyle; + pOpt.PropertyBraceStyle = braceStyle; + pOpt.PropertyGetBraceStyle = braceStyle; + pOpt.PropertySetBraceStyle = braceStyle; + + pOpt.IndentationChar = this.Options.IndentString[0]; + pOpt.IndentSize = this.Options.IndentString.Length; + pOpt.TabSize = this.Options.IndentString.Length; + + return v; } /// @@ -100,17 +120,24 @@ namespace ICSharpCode.SharpDevelop.Dom.Refactoring } } } - InsertCodeAfter(insertionLine, document, beginLineIndentation + '\t', nodes); + InsertCodeAfter(insertionLine, document, beginLineIndentation + this.Options.IndentString, nodes); } } public class VBNetCodeGenerator : NRefactoryCodeGenerator { - public static readonly VBNetCodeGenerator Instance = new VBNetCodeGenerator(); + internal static readonly VBNetCodeGenerator Instance = new VBNetCodeGenerator(); public override IOutputAstVisitor CreateOutputVisitor() { - return new VBNetOutputVisitor(); + VBNetOutputVisitor v = new VBNetOutputVisitor(); + VBNetPrettyPrintOptions pOpt = v.Options; + + pOpt.IndentationChar = this.Options.IndentString[0]; + pOpt.IndentSize = this.Options.IndentString.Length; + pOpt.TabSize = this.Options.IndentString.Length; + + return v; } public override PropertyDeclaration CreateProperty(IField field, bool createGetter, bool createSetter)