diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.addin b/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.addin index c49b66ece7..fedc8a1f1c 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.addin +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.addin @@ -91,18 +91,18 @@ extensions="*.aspx"/> - - + - - diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/CSharpRazorLanguageBinding.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/CSharpRazorLanguageBinding.cs index 228c97d5ad..3f31f9c197 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/CSharpRazorLanguageBinding.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/CSharpRazorLanguageBinding.cs @@ -5,9 +5,9 @@ using System; namespace ICSharpCode.AspNet.Mvc.Folding { - public class CSharpRazorLanguageBinding : HtmlLanguageBinding + public class CSharpRazorTextEditorExtension : HtmlTextEditorExtension { - public CSharpRazorLanguageBinding() + public CSharpRazorTextEditorExtension() : base( new TextEditorWithParseInformationFoldingFactory(), new RazorFoldGeneratorFactory(".cshtml")) diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/HtmlLanguageBinding.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/HtmlLanguageBinding.cs index c45eedf2a4..bd96d8f23d 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/HtmlLanguageBinding.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/HtmlLanguageBinding.cs @@ -8,13 +8,13 @@ using ICSharpCode.SharpDevelop.Editor; namespace ICSharpCode.AspNet.Mvc.Folding { - public class HtmlLanguageBinding : DefaultLanguageBinding + public class HtmlTextEditorExtension : ITextEditorExtension { ITextEditorWithParseInformationFoldingFactory textEditorFactory; IFoldGeneratorFactory foldGeneratorFactory; IFoldGenerator foldGenerator; - public HtmlLanguageBinding( + public HtmlTextEditorExtension( ITextEditorWithParseInformationFoldingFactory textEditorFactory, IFoldGeneratorFactory foldGeneratorFactory) { @@ -22,11 +22,7 @@ namespace ICSharpCode.AspNet.Mvc.Folding this.foldGeneratorFactory = foldGeneratorFactory; } - public override IFormattingStrategy FormattingStrategy { - get { return new DefaultFormattingStrategy(); } - } - - public override void Attach(ITextEditor editor) + public void Attach(ITextEditor editor) { Attach(textEditorFactory.CreateTextEditor(editor)); } @@ -36,7 +32,7 @@ namespace ICSharpCode.AspNet.Mvc.Folding foldGenerator = foldGeneratorFactory.CreateFoldGenerator(editor); } - public override void Detach() + public void Detach() { foldGenerator.Dispose(); } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/VisualBasicRazorLanguageBinding.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/VisualBasicRazorLanguageBinding.cs index 3fd5838a1b..7becf735c8 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/VisualBasicRazorLanguageBinding.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/VisualBasicRazorLanguageBinding.cs @@ -5,9 +5,9 @@ using System; namespace ICSharpCode.AspNet.Mvc.Folding { - public class VisualBasicRazorLanguageBinding : HtmlLanguageBinding + public class VisualBasicRazorTextEditorExtension : HtmlTextEditorExtension { - public VisualBasicRazorLanguageBinding() + public VisualBasicRazorTextEditorExtension() : base( new TextEditorWithParseInformationFoldingFactory(), new RazorFoldGeneratorFactory(".vbhtml")) diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/WebFormsLanguageBinding.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/WebFormsLanguageBinding.cs index ca57ef3d86..2bb51c2686 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/WebFormsLanguageBinding.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/WebFormsLanguageBinding.cs @@ -6,16 +6,16 @@ using ICSharpCode.SharpDevelop; namespace ICSharpCode.AspNet.Mvc.Folding { - public class WebFormsLanguageBinding : HtmlLanguageBinding + public class WebFormsTextEditorExtension : HtmlTextEditorExtension { - public WebFormsLanguageBinding() + public WebFormsTextEditorExtension() : base( new TextEditorWithParseInformationFoldingFactory(), new WebFormsFoldGeneratorFactory()) { } - public WebFormsLanguageBinding( + public WebFormsTextEditorExtension( ITextEditorWithParseInformationFoldingFactory textEditorFactory, IFoldGeneratorFactory foldGeneratorFactory) : base(textEditorFactory, foldGeneratorFactory) diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.addin b/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.addin index 3ba00867e4..ba2b55cdf0 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.addin +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.addin @@ -69,6 +69,13 @@ extensions=".cs" /> + + + + diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpLanguageBinding.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpLanguageBinding.cs index 91ea98d700..5c4c0d455f 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpLanguageBinding.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpLanguageBinding.cs @@ -25,21 +25,19 @@ namespace CSharpBinding get { return new CSharpFormattingStrategy(); } } -// public override LanguageProperties Properties { -// get { return LanguageProperties.CSharp; } -// } -// public override IBracketSearcher BracketSearcher { get { return new CSharpBracketSearcher(); } } - + } + + public class CSharpTextEditorExtension : ITextEditorExtension + { ITextEditor editor; IssueManager inspectionManager; IList contextActionProviders; - public override void Attach(ITextEditor editor) + public void Attach(ITextEditor editor) { - base.Attach(editor); this.editor = editor; inspectionManager = new IssueManager(editor); //codeManipulation = new CodeManipulation(editor); @@ -50,7 +48,7 @@ namespace CSharpBinding } } - public override void Detach() + public void Detach() { //codeManipulation.Dispose(); if (inspectionManager != null) { @@ -61,7 +59,6 @@ namespace CSharpBinding editor.ContextActionProviders.RemoveAll(contextActionProviders.Contains); } this.editor = null; - base.Detach(); } } } diff --git a/src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlBinding.addin b/src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlBinding.addin index 7f2a58f9be..04669cbb47 100644 --- a/src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlBinding.addin +++ b/src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlBinding.addin @@ -43,10 +43,10 @@ - - + diff --git a/src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlContextResolver.cs b/src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlContextResolver.cs index aec56c894e..5ab19f17cb 100644 --- a/src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlContextResolver.cs +++ b/src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlContextResolver.cs @@ -143,10 +143,10 @@ namespace ICSharpCode.XamlBinding public static XamlCompletionContext ResolveCompletionContext(ITextEditor editor, char typedValue) { - var binding = editor.GetService(typeof(XamlLanguageBinding)) as XamlLanguageBinding; + var binding = editor.GetService(typeof(XamlTextEditorExtension)) as XamlTextEditorExtension; if (binding == null) - throw new InvalidOperationException("Can only use ResolveCompletionContext with a XamlLanguageBinding."); + throw new InvalidOperationException("Can only use ResolveCompletionContext with a XamlTextEditorExtension."); var context = new XamlCompletionContext(ResolveContext(editor.FileName, editor.Document, editor.Caret.Offset)) { PressedKey = typedValue, @@ -158,10 +158,10 @@ namespace ICSharpCode.XamlBinding public static XamlCompletionContext ResolveCompletionContext(ITextEditor editor, char typedValue, int offset) { - var binding = editor.GetService(typeof(XamlLanguageBinding)) as XamlLanguageBinding; + var binding = editor.GetService(typeof(XamlTextEditorExtension)) as XamlTextEditorExtension; if (binding == null) - throw new InvalidOperationException("Can only use ResolveCompletionContext with a XamlLanguageBinding."); + throw new InvalidOperationException("Can only use ResolveCompletionContext with a XamlTextEditorExtension."); var context = new XamlCompletionContext(ResolveContext(editor.FileName, editor.Document, offset)) { PressedKey = typedValue, diff --git a/src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlLanguageBinding.cs b/src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlLanguageBinding.cs index 851a700c63..30fcd3d031 100644 --- a/src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlLanguageBinding.cs +++ b/src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlLanguageBinding.cs @@ -11,10 +11,10 @@ using ICSharpCode.SharpDevelop.Gui; namespace ICSharpCode.XamlBinding { /// - /// Description of XamlLanguageBinding. + /// Description of XamlTextEditorExtension. /// [TextEditorService] - public class XamlLanguageBinding : XmlEditor.XmlLanguageBinding + public class XamlTextEditorExtension : XmlEditor.XmlTextEditorExtension { // XamlColorizer colorizer; TextView textView; @@ -42,7 +42,7 @@ namespace ICSharpCode.XamlBinding textView.Services.AddService(typeof(IOutlineContentHost), contentHost); } // add ILanguageBinding - textView.Services.AddService(typeof(XamlLanguageBinding), this); + textView.Services.AddService(typeof(XamlTextEditorExtension), this); } } @@ -61,7 +61,7 @@ namespace ICSharpCode.XamlBinding textView.Services.RemoveService(typeof(IOutlineContentHost)); contentHost.Dispose(); } - textView.Services.RemoveService(typeof(XamlLanguageBinding)); + textView.Services.RemoveService(typeof(XamlTextEditorExtension)); } } } diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs index cb4c1cb4b3..fe723c5cf6 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs @@ -408,7 +408,7 @@ namespace ICSharpCode.AvalonEdit.AddIn // remove secondary editor this.Children.Remove(secondaryTextEditor); this.Children.Remove(gridSplitter); - secondaryTextEditorAdapter.Language.Detach(); + secondaryTextEditorAdapter.DetachExtensions(); DisposeTextEditor(secondaryTextEditor); secondaryTextEditor = null; secondaryTextEditorAdapter = null; @@ -646,9 +646,9 @@ namespace ICSharpCode.AvalonEdit.AddIn SD.ParserService.ParseInformationUpdated -= ParserServiceParseInformationUpdated; if (primaryTextEditorAdapter.Language != null) - primaryTextEditorAdapter.Language.Detach(); + primaryTextEditorAdapter.DetachExtensions(); if (secondaryTextEditorAdapter != null && secondaryTextEditorAdapter.Language != null) - secondaryTextEditorAdapter.Language.Detach(); + secondaryTextEditorAdapter.DetachExtensions(); if (errorPainter != null) errorPainter.Dispose(); diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorAdapter.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorAdapter.cs index 7590829ae0..e3e304c46b 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorAdapter.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorAdapter.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; - +using System.Security.Cryptography.X509Certificates; using ICSharpCode.AvalonEdit.AddIn.Options; using ICSharpCode.AvalonEdit.AddIn.Snippets; using ICSharpCode.AvalonEdit.Indentation; @@ -41,22 +41,42 @@ namespace ICSharpCode.AvalonEdit.AddIn get { return languageBinding; } } + List extensions; + const string extensionsPath = "/SharpDevelop/ViewContent/TextEditor/Extensions"; + public override ITextEditor PrimaryView { get { return codeEditor.PrimaryTextEditorAdapter; } } internal void FileNameChanged() { - if (languageBinding != null) - languageBinding.Detach(); + DetachExtensions(); + extensions = AddInTree.BuildItems(extensionsPath, this, false); + AttachExtensions(); - languageBinding = LanguageBindingService.CreateBinding(this); // never returns null - languageBinding.Attach(this); + languageBinding = SD.LanguageService.GetLanguageByFileName(PrimaryView.FileName); // update properties set by languageBinding this.TextEditor.TextArea.IndentationStrategy = new OptionControlledIndentationStrategy(this, languageBinding.FormattingStrategy); } + internal void DetachExtensions() + { + if (extensions != null) { + foreach (var extension in extensions) + extension.Detach(); + } + } + + + internal void AttachExtensions() + { + if (extensions != null) { + foreach (var extension in extensions) + extension.Attach(this); + } + } + sealed class OptionControlledIndentationStrategy : IndentationStrategyAdapter { public OptionControlledIndentationStrategy(ITextEditor editor, IFormattingStrategy formattingStrategy) diff --git a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlLanguageBinding.cs b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlLanguageBinding.cs index 45e1159486..1b94fc6878 100644 --- a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlLanguageBinding.cs +++ b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlLanguageBinding.cs @@ -10,27 +10,26 @@ namespace ICSharpCode.XmlEditor { public class XmlLanguageBinding : DefaultLanguageBinding { - XmlFoldingManager foldingManager; - public override IFormattingStrategy FormattingStrategy { get { return new XmlFormattingStrategy(); } } + } + + public class XmlTextEditorExtension : ITextEditorExtension + { + XmlFoldingManager foldingManager; - public override void Attach(ITextEditor editor) + public virtual void Attach(ITextEditor editor) { foldingManager = new XmlFoldingManager(editor); foldingManager.UpdateFolds(); foldingManager.Start(); - - base.Attach(editor); } - public override void Detach() + public virtual void Detach() { foldingManager.Stop(); foldingManager.Dispose(); - - base.Detach(); } } } diff --git a/src/AddIns/DisplayBindings/XmlEditor/Project/XmlEditor.addin b/src/AddIns/DisplayBindings/XmlEditor/Project/XmlEditor.addin index 016ab367c6..84c81b24e8 100644 --- a/src/AddIns/DisplayBindings/XmlEditor/Project/XmlEditor.addin +++ b/src/AddIns/DisplayBindings/XmlEditor/Project/XmlEditor.addin @@ -53,35 +53,42 @@ + + + + + type="Secondary" + insertbefore="Text" + class="ICSharpCode.XmlEditor.XmlDisplayBinding"/> + extensions=".manifest;.config;.xshd;.wxs;.wxi;.wxl;.proj;.csproj;.vbproj;.ilproj;.xfrm;.targets;.xpt;.xft;.map;.wsdl;.disco;.xaml;.nuspec;.booproj;.fsproj;.pyproj;.rbproj;.vcxproj;.wixproj;.ps1xml" + resource="FileIcons.XmlIcon" /> + insertbefore="AllFiles" + name="${res:SharpDevelop.FileFilter.XmlFiles}" + extensions="*.xml"/> + insertbefore="AllFiles" + name="${res:SharpDevelop.FileFilter.XslFiles} (*.xsl;*.xslt)" + extensions="*.xsl;*.xslt"/> @@ -93,23 +100,23 @@ + label="${res:ICSharpCode.XmlEditor.CreateSchemaMenuLabel}" + class="ICSharpCode.XmlEditor.CreateSchemaCommand"/> + label="${res:ICSharpCode.XmlEditor.ValidateXmlMenuLabel}" + class="ICSharpCode.XmlEditor.ValidateXmlCommand" + shortcut="Control|Shift|V"/> + label="${res:ICSharpCode.NAntAddIn.GotoDefinitionMenuLabel}" + class="ICSharpCode.XmlEditor.GoToSchemaDefinitionCommand"/> + label="${res:ICSharpCode.XmlEditor.AssignXSLT}" + class="ICSharpCode.XmlEditor.AssignStylesheetCommand"/> @@ -117,21 +124,21 @@ + label="${res:ICSharpCode.XmlEditor.OpenXSLT}" + class="ICSharpCode.XmlEditor.OpenStylesheetCommand"/> + label="${res:ICSharpCode.XmlEditor.RunXSLT}" + class="ICSharpCode.XmlEditor.RunXslTransformCommand" + shortcut="Control|Shift|T"/> + label="${res:ICSharpCode.XmlEditor.HideXPathResults}" + class="ICSharpCode.XmlEditor.RemoveXPathHighlightingCommand"/> + label="${res:XML.MainMenu.EditMenu.FormatMenu}" + class="ICSharpCode.XmlEditor.FormatXmlCommand"/> @@ -139,34 +146,34 @@ + insertafter="Markers" + label="${res:ICSharpCode.XmlEditor.XmlSchemasPanel.Title}" + class="ICSharpCode.XmlEditor.XmlSchemasPanel"/> + insertafter="Markers" + insertbefore="XmlSchemasPanel" + label="${res:ICSharpCode.XmlEditor.XmlEditorOptionsPanel.Title}" + class="ICSharpCode.XmlEditor.XmlEditorOptionsPanel"/> + category="Tools" + icon="PadIcons.XPathQuery" + title="${res:ICSharpCode.XmlEditor.XPathQueryPad.Title}" + insertafter="UnitTestingPad" + class="ICSharpCode.XmlEditor.XPathQueryPad" + defaultPosition="Bottom, Hidden"/> + insertafter="ShowCodeCoverage" + label="${res:ICSharpCode.XmlEditor.HideXPathResults}" + class="ICSharpCode.XmlEditor.RemoveXPathHighlightingCommand"/> @@ -174,37 +181,37 @@ - + label="${res:ICSharpCode.XmlEditor.XmlTreeView.AddAttributeMenuLabel}" + class="ICSharpCode.XmlEditor.AddAttributeCommand"/> + - + label="${res:ICSharpCode.XmlEditor.XmlTreeView.RemoveAttributeMenuLabel}" + icon="Icons.16x16.DeleteIcon" + class="ICSharpCode.XmlEditor.RemoveAttributeCommand"/> + + label="${res:XML.TextAreaContextMenu.Cut}" + icon="Icons.16x16.CutIcon" + shortcut="Control|X" + class="ICSharpCode.XmlEditor.CutXmlTreeNode"/> + label="${res:XML.TextAreaContextMenu.Copy}" + icon="Icons.16x16.CopyIcon" + shortcut="Control|C" + class="ICSharpCode.XmlEditor.CopyXmlTreeNode"/> + label="${res:XML.TextAreaContextMenu.Paste}" + icon="Icons.16x16.PasteIcon" + shortcut="Control|V" + class="ICSharpCode.XmlEditor.PasteXmlTreeNode"/> + label="${res:XML.MainMenu.EditMenu.Delete}" + icon="Icons.16x16.DeleteIcon" + class="ICSharpCode.XmlEditor.DeleteXmlTreeNode"/> @@ -217,16 +224,16 @@ + label="${res:ICSharpCode.XmlEditor.XmlTreeView.InsertElementBeforeMenuLabel}" + class="ICSharpCode.XmlEditor.InsertElementBeforeCommand"/> + label="${res:ICSharpCode.XmlEditor.XmlTreeView.InsertElementAfterMenuLabel}" + class="ICSharpCode.XmlEditor.InsertElementAfterCommand"/> + label="${res:ICSharpCode.XmlEditor.XmlTreeView.AddChildElementMenuLabel}" + class="ICSharpCode.XmlEditor.AddChildElementCommand"/> @@ -241,16 +248,16 @@ + label="${res:ICSharpCode.XmlEditor.XmlTreeView.InsertTextNodeBeforeMenuLabel}" + class="ICSharpCode.XmlEditor.InsertTextNodeBeforeCommand"/> + label="${res:ICSharpCode.XmlEditor.XmlTreeView.InsertTextNodeAfterMenuLabel}" + class="ICSharpCode.XmlEditor.InsertTextNodeAfterCommand"/> + label="${res:ICSharpCode.XmlEditor.XmlTreeView.AddChildTextNodeAfterMenuLabel}" + class="ICSharpCode.XmlEditor.AddChildTextNodeCommand"/> @@ -260,16 +267,16 @@ + label="${res:ICSharpCode.XmlEditor.XmlTreeView.InsertCommentBeforeMenuLabel}" + class="ICSharpCode.XmlEditor.InsertCommentBeforeCommand"/> + label="${res:ICSharpCode.XmlEditor.XmlTreeView.InsertCommentAfterMenuLabel}" + class="ICSharpCode.XmlEditor.InsertCommentAfterCommand"/> + label="${res:ICSharpCode.XmlEditor.XmlTreeView.AddChildCommentMenuLabel}" + class="ICSharpCode.XmlEditor.AddChildCommentCommand"/> diff --git a/src/AddIns/Misc/SearchAndReplace/Project/SearchAndReplace.addin b/src/AddIns/Misc/SearchAndReplace/Project/SearchAndReplace.addin index 11fb5cb846..0737a17c65 100644 --- a/src/AddIns/Misc/SearchAndReplace/Project/SearchAndReplace.addin +++ b/src/AddIns/Misc/SearchAndReplace/Project/SearchAndReplace.addin @@ -44,9 +44,9 @@ - - + + class="SearchAndReplace.SearchAndReplaceTextEditorExtension" /> diff --git a/src/AddIns/Misc/SearchAndReplace/Project/SearchOptions.cs b/src/AddIns/Misc/SearchAndReplace/Project/SearchOptions.cs index d516b2fc79..18117e5789 100644 --- a/src/AddIns/Misc/SearchAndReplace/Project/SearchOptions.cs +++ b/src/AddIns/Misc/SearchAndReplace/Project/SearchOptions.cs @@ -156,14 +156,13 @@ namespace SearchAndReplace } } - public class SearchAndReplaceBinding : DefaultLanguageBinding + public class SearchAndReplaceTextEditorExtension : ITextEditorExtension { TextArea textArea; SearchInputHandler handler; - public override void Attach(ITextEditor editor) + public void Attach(ITextEditor editor) { - base.Attach(editor); textArea = editor.GetService(typeof(TextArea)) as TextArea; if (textArea != null) { handler = new SearchInputHandler(textArea); @@ -180,9 +179,8 @@ namespace SearchAndReplace SearchOptions.SearchMode = e.UseRegex ? SearchMode.RegEx : SearchMode.Normal; } - public override void Detach() + public void Detach() { - base.Detach(); if (textArea != null) { textArea.DefaultInputHandler.NestedInputHandlers.Remove(handler); textArea = null; diff --git a/src/Main/Base/Project/Editor/AvalonEditTextEditorAdapter.cs b/src/Main/Base/Project/Editor/AvalonEditTextEditorAdapter.cs index d2ce66aad1..9f2c309a38 100644 --- a/src/Main/Base/Project/Editor/AvalonEditTextEditorAdapter.cs +++ b/src/Main/Base/Project/Editor/AvalonEditTextEditorAdapter.cs @@ -58,7 +58,7 @@ namespace ICSharpCode.SharpDevelop.Editor public virtual ITextEditorOptions Options { get; private set; } public virtual ILanguageBinding Language { - get { return AggregatedLanguageBinding.NullLanguageBinding; } + get { return DefaultLanguageBinding.DefaultInstance; } } sealed class CaretAdapter : ITextEditorCaret diff --git a/src/Main/Base/Project/Editor/ITextEditorExtension.cs b/src/Main/Base/Project/Editor/ITextEditorExtension.cs new file mode 100644 index 0000000000..526bebdf20 --- /dev/null +++ b/src/Main/Base/Project/Editor/ITextEditorExtension.cs @@ -0,0 +1,76 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.IO; +using ICSharpCode.Core; + +namespace ICSharpCode.SharpDevelop.Editor +{ + /// + /// Allows add-ins to attach language/project-specific features to ITextEditor (one instance per ITextEditor is created). + /// + public interface ITextEditorExtension + { + /// + /// Callback function for backend bindings to add services to ITextEditor. + /// This is called when the file name of an ITextEditor changes. + /// + void Attach(ITextEditor editor); + + /// + /// Callback function for backend bindings to remove all added services from ITextEditor. + /// This is called when the file name of an ITextEditor changes, to unload all added + /// features properly. + /// + void Detach(); + } + + /// + /// Creates ITextEditorExtension objects for the code editor. + /// + /// + /// Semicolon-separated list of file extensions that are handled by the text editor extension (e.g. .xaml) + /// + /// + /// Name of the ITextEditorExtension class. + /// + /// Only in /SharpDevelop/ViewContent/TextEditor/Extensions + /// + /// The ILanguageBinding object. + /// + public class TextEditorExtensionDoozer : IDoozer + { + public bool HandleConditions { + get { + return false; + } + } + + public object BuildItem(BuildItemArgs args) + { + ITextEditor editor = (ITextEditor)args.Parameter; + string[] extensions = args.Codon["extensions"].Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); + if (CanAttach(extensions, editor.FileName)) { + return args.AddIn.CreateObject(args.Codon["class"]); + } else { + return null; + } + } + + static bool CanAttach(string[] extensions, string fileName) + { + // always attach when no extensions were given + if (extensions.Length == 0) + return true; + if (string.IsNullOrEmpty(fileName)) + return false; + string fileExtension = Path.GetExtension(fileName); + foreach (string ext in extensions) { + if (string.Equals(ext, fileExtension, StringComparison.OrdinalIgnoreCase)) + return true; + } + return false; + } + } +} diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin b/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin index 3b58c9df03..0631355e81 100755 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin @@ -41,6 +41,7 @@ + @@ -81,6 +82,8 @@ class="ICSharpCode.SharpDevelop.Project.BuildService"/> + ToolTipService.cs + ToolTipService.cs @@ -520,7 +521,6 @@ - diff --git a/src/Main/Base/Project/Services/SD.cs b/src/Main/Base/Project/Services/SD.cs index 9d342e930b..7f5176f2e9 100644 --- a/src/Main/Base/Project/Services/SD.cs +++ b/src/Main/Base/Project/Services/SD.cs @@ -230,6 +230,11 @@ namespace ICSharpCode.SharpDevelop get { return GetRequiredService(); } } + /// + public static ILanguageService LanguageService { + get { return GetRequiredService(); } + } + /// public static IUIService UIService { get { return GetRequiredService(); } diff --git a/src/Main/Base/Project/Src/Services/LanguageBinding/AggregatedLanguageBinding.cs b/src/Main/Base/Project/Src/Services/LanguageBinding/AggregatedLanguageBinding.cs deleted file mode 100755 index b01313db87..0000000000 --- a/src/Main/Base/Project/Src/Services/LanguageBinding/AggregatedLanguageBinding.cs +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) -// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) - -using System; -using System.Collections.Generic; -using ICSharpCode.SharpDevelop.Editor; - -namespace ICSharpCode.SharpDevelop -{ - /// - /// Aggregates multiple ILanguageBinding instances to allow more - /// than one language binding for a filename extension. - /// - sealed class AggregatedLanguageBinding : ILanguageBinding - { - public static readonly AggregatedLanguageBinding NullLanguageBinding = new AggregatedLanguageBinding(System.Linq.Enumerable.Empty()); - - readonly IEnumerable allBindings; - - public AggregatedLanguageBinding(IEnumerable bindings) - { - if (bindings == null) - throw new ArgumentNullException("bindings"); - this.allBindings = bindings; - } - - public IFormattingStrategy FormattingStrategy { - get { - foreach (ILanguageBinding binding in allBindings) { - if (binding.FormattingStrategy != null) - return binding.FormattingStrategy; - } - - return DefaultFormattingStrategy.DefaultInstance; - } - } - - /* - public LanguageProperties Properties { - get { - foreach (ILanguageBinding binding in allBindings) { - if (binding.Properties != null) - return binding.Properties; - } - - return LanguageProperties.None; - } - } - */ - - public void Attach(ITextEditor editor) - { - foreach (ILanguageBinding binding in allBindings) - binding.Attach(editor); - } - - public void Detach() - { - foreach (ILanguageBinding binding in allBindings) - binding.Detach(); - } - - public IBracketSearcher BracketSearcher { - get { - foreach (ILanguageBinding binding in allBindings) { - if (binding.BracketSearcher != null) - return binding.BracketSearcher; - } - - return DefaultBracketSearcher.DefaultInstance; - } - } - } -} diff --git a/src/Main/Base/Project/Src/Services/LanguageBinding/DefaultLanguageBinding.cs b/src/Main/Base/Project/Src/Services/LanguageBinding/DefaultLanguageBinding.cs index 240b6b1673..2e401ba247 100644 --- a/src/Main/Base/Project/Src/Services/LanguageBinding/DefaultLanguageBinding.cs +++ b/src/Main/Base/Project/Src/Services/LanguageBinding/DefaultLanguageBinding.cs @@ -3,36 +3,29 @@ using System; using ICSharpCode.SharpDevelop.Editor; +using ICSharpCode.SharpDevelop.Refactoring; namespace ICSharpCode.SharpDevelop { public class DefaultLanguageBinding : ILanguageBinding { + public static readonly DefaultLanguageBinding DefaultInstance = new DefaultLanguageBinding(); + public virtual IFormattingStrategy FormattingStrategy { get { - return null; + return DefaultFormattingStrategy.DefaultInstance; } } - /* - public virtual LanguageProperties Properties { + public virtual IBracketSearcher BracketSearcher { get { - return null; + return DefaultBracketSearcher.DefaultInstance; } } - */ - - public virtual void Attach(ITextEditor editor) - { - } - public virtual void Detach() - { - } - - public virtual IBracketSearcher BracketSearcher { + public virtual ICodeGenerator CodeGenerator { get { - return null; + return DefaultCodeGenerator.DefaultInstance; } } } diff --git a/src/Main/Base/Project/Src/Services/LanguageBinding/ILanguageBinding.cs b/src/Main/Base/Project/Src/Services/LanguageBinding/ILanguageBinding.cs index 0502c2964b..3c6cccf241 100644 --- a/src/Main/Base/Project/Src/Services/LanguageBinding/ILanguageBinding.cs +++ b/src/Main/Base/Project/Src/Services/LanguageBinding/ILanguageBinding.cs @@ -3,30 +3,22 @@ using System; using ICSharpCode.SharpDevelop.Editor; +using ICSharpCode.SharpDevelop.Refactoring; namespace ICSharpCode.SharpDevelop { /// - /// Provides access to language specific features for single files. + /// Provides access to language specific features (independent of files). /// public interface ILanguageBinding { /// /// Provides access to the formatting strategy for this language. /// - IFormattingStrategy FormattingStrategy { + IFormattingStrategy FormattingStrategy { get; } - /* - /// - /// Provides access to the properties for this language. - /// - LanguageProperties Properties { - get; - } - */ - /// /// Provides access to the bracket search logic for this language. /// @@ -35,16 +27,10 @@ namespace ICSharpCode.SharpDevelop } /// - /// Callback function for backend bindings to add services to ITextEditor. - /// This is called when the file name of an ITextEditor changes. + /// Provides access to the code generator for this language. /// - void Attach(ITextEditor editor); - - /// - /// Callback function for backend bindings to remove all added services from ITextEditor. - /// This is called when the file name of an ITextEditor changes, to unload all added - /// features properly. - /// - void Detach(); + ICodeGenerator CodeGenerator { + get; + } } } diff --git a/src/Main/Base/Project/Src/Services/LanguageBinding/LanguageBindingDoozer.cs b/src/Main/Base/Project/Src/Services/LanguageBinding/LanguageBindingDoozer.cs index dbab2158f7..925449e701 100644 --- a/src/Main/Base/Project/Src/Services/LanguageBinding/LanguageBindingDoozer.cs +++ b/src/Main/Base/Project/Src/Services/LanguageBinding/LanguageBindingDoozer.cs @@ -31,25 +31,64 @@ namespace ICSharpCode.SharpDevelop public object BuildItem(BuildItemArgs args) { - ITextEditor editor = (ITextEditor)args.Parameter; - string[] extensions = args.Codon["extensions"].Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); - if (CanAttach(extensions, editor.FileName)) { - return args.AddIn.CreateObject(args.Codon["class"]); - } else { - return null; + return new LanguageBindingDescriptor(args.Codon); + } + } + + class LanguageBindingDescriptor + { + ILanguageBinding binding = null; + Codon codon; + + public ILanguageBinding Binding { + get { + if (binding == null) { + binding = (ILanguageBinding)codon.AddIn.CreateObject(codon.Properties["class"]); + } + return binding; + } + } + + public Codon Codon { + get { + return codon; + } + } + + public LanguageBindingDescriptor(Codon codon) + { + this.codon = codon; + } + + string[] extensions; + + public string[] Extensions { + get { + if (extensions == null) { + if (codon.Properties["extensions"].Length == 0) + extensions = new string[0]; + else + extensions = codon.Properties["extensions"].ToLowerInvariant().Split(';'); + } + return extensions; + } + } + + public string Name { + get { + return codon.Properties["id"]; } } - static bool CanAttach(string[] extensions, string fileName) + public bool CanAttach(string extension) { // always attach when no extensions were given - if (extensions.Length == 0) + if (Extensions.Length == 0) return true; - if (string.IsNullOrEmpty(fileName)) + if (string.IsNullOrEmpty(extension)) return false; - string fileExtension = Path.GetExtension(fileName); - foreach (string ext in extensions) { - if (string.Equals(ext, fileExtension, StringComparison.OrdinalIgnoreCase)) + foreach (string ext in Extensions) { + if (string.Equals(ext, extension, StringComparison.OrdinalIgnoreCase)) return true; } return false; diff --git a/src/Main/Base/Project/Src/Services/LanguageBinding/LanguageBindingService.cs b/src/Main/Base/Project/Src/Services/LanguageBinding/LanguageBindingService.cs index 77b0a73b94..367fcd1e9d 100644 --- a/src/Main/Base/Project/Src/Services/LanguageBinding/LanguageBindingService.cs +++ b/src/Main/Base/Project/Src/Services/LanguageBinding/LanguageBindingService.cs @@ -3,22 +3,50 @@ using System; using System.Collections.Generic; +using System.IO; using ICSharpCode.Core; using ICSharpCode.SharpDevelop.Editor; namespace ICSharpCode.SharpDevelop { - public static class LanguageBindingService + public interface ILanguageService + { + ILanguageBinding GetLanguageByFileName(FileName fileName); + ILanguageBinding GetLanguageByExtension(string extension); + ILanguageBinding GetLanguageByName(string name); + } + + class SDLanguageService : ILanguageService { const string languageBindingPath = "/SharpDevelop/Workbench/LanguageBindings"; + readonly List bindings; + + public SDLanguageService() + { + bindings = AddInTree.BuildItems(languageBindingPath, null, false); + } + + public ILanguageBinding GetLanguageByFileName(FileName fileName) + { + return GetLanguageByExtension(Path.GetExtension(fileName)); + } + + public ILanguageBinding GetLanguageByExtension(string extension) + { + foreach (var language in bindings) { + if (language.CanAttach(extension)) + return language.Binding; + } + return DefaultLanguageBinding.DefaultInstance; + } - /// - /// Creates the binding for the specified text editor. This method never returns null. - /// - public static ILanguageBinding CreateBinding(ITextEditor editor) + public ILanguageBinding GetLanguageByName(string name) { - var bindings = AddInTree.BuildItems(languageBindingPath, editor, false); - return new AggregatedLanguageBinding(bindings); + foreach (var language in bindings) { + if (language.Name == name) + return language.Binding; + } + return DefaultLanguageBinding.DefaultInstance; } } }