// Copyright (c) 2014 AlphaSierraPapa for the SharpDevelop Team // // Permission is hereby granted, free of charge, to any person obtaining a copy of this // software and associated documentation files (the "Software"), to deal in the Software // without restriction, including without limitation the rights to use, copy, modify, merge, // publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons // to whom the Software is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all copies or // substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE // FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. using System; using System.Collections.Generic; using System.Threading; using ICSharpCode.AvalonEdit.Highlighting; using ICSharpCode.NRefactory; using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.SharpDevelop.Editor.CodeCompletion; using CSharpBinding.Completion; using CSharpBinding.FormattingStrategy; using CSharpBinding.Refactoring; using ICSharpCode.Core; using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop.Editor; using ICSharpCode.SharpDevelop.Refactoring; namespace CSharpBinding { /// /// Description of CSharpLanguageBinding. /// public class CSharpLanguageBinding : DefaultLanguageBinding { public CSharpLanguageBinding() { this.container.AddService(typeof(IFormattingStrategy), new CSharpFormattingStrategy()); this.container.AddService(typeof(IBracketSearcher), new CSharpBracketSearcher()); this.container.AddService(typeof(CodeGenerator), new CSharpCodeGenerator()); this.container.AddService(typeof(System.CodeDom.Compiler.CodeDomProvider), new Microsoft.CSharp.CSharpCodeProvider()); } public override ICodeCompletionBinding CreateCompletionBinding(FileName fileName, TextLocation currentLocation, ICSharpCode.NRefactory.Editor.ITextSource fileContent) { if (fileName == null) throw new ArgumentNullException("fileName"); return new CSharpCompletionBinding(fileName, currentLocation, fileContent); } } public class CSharpTextEditorExtension : ITextEditorExtension { ITextEditor editor; IssueManager inspectionManager; IList contextActionProviders; CodeManipulation codeManipulation; CaretReferenceHighlightRenderer renderer; public void Attach(ITextEditor editor) { this.editor = editor; inspectionManager = new IssueManager(editor); codeManipulation = new CodeManipulation(editor); renderer = new CaretReferenceHighlightRenderer(editor); // Patch editor options (indentation) to project-specific settings var optionsContainer = CSharpFormattingPolicies.Instance.GetProjectOptions( SD.ProjectService.FindProjectContainingFile(editor.FileName)); CustomizeEditorOptions(optionsContainer.OptionsContainer, editor.Options, this.editor); CSharpFormattingPolicies.Instance.FormattingPolicyUpdated += (sender, e) => CustomizeEditorOptions(optionsContainer.OptionsContainer, this.editor.Options, this.editor); if (!editor.ContextActionProviders.IsReadOnly) { contextActionProviders = AddInTree.BuildItems("/SharpDevelop/ViewContent/TextEditor/C#/ContextActions", null); editor.ContextActionProviders.AddRange(contextActionProviders); } } public void Detach() { codeManipulation.Dispose(); if (inspectionManager != null) { inspectionManager.Dispose(); inspectionManager = null; } if (contextActionProviders != null) { editor.ContextActionProviders.RemoveAll(contextActionProviders.Contains); } renderer.Dispose(); this.editor = null; } private void CustomizeEditorOptions(CSharpFormattingOptionsContainer container, ITextEditorOptions editorOptions, ITextEditor editor) { if (container == null) return; var textEditorOptions = editorOptions as ICSharpCode.AvalonEdit.TextEditorOptions; if (textEditorOptions == null) return; int? indentationSize = container.GetEffectiveIndentationSize(); if (indentationSize.HasValue) { // textEditorOptions.IndentationSize = indentationSize.Value; } // bool? convertTabsToSpaces = container.GetEffectiveConvertTabsToSpaces(); // if (convertTabsToSpaces.HasValue) { // textEditorOptions.ConvertTabsToSpaces = convertTabsToSpaces.Value; // } } } }