Browse Source

move Attach/Detach to ITextEditorExtension and use ILanguageBinding as extensible replacement for old "LanguageProperties"

pull/32/merge
Siegfried Pammer 12 years ago
parent
commit
7c0e667388
  1. 14
      src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.addin
  2. 4
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/CSharpRazorLanguageBinding.cs
  3. 12
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/HtmlLanguageBinding.cs
  4. 4
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/VisualBasicRazorLanguageBinding.cs
  5. 6
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/WebFormsLanguageBinding.cs
  6. 7
      src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.addin
  7. 13
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpLanguageBinding.cs
  8. 6
      src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlBinding.addin
  9. 8
      src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlContextResolver.cs
  10. 8
      src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlLanguageBinding.cs
  11. 6
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs
  12. 30
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorAdapter.cs
  13. 15
      src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlLanguageBinding.cs
  14. 179
      src/AddIns/DisplayBindings/XmlEditor/Project/XmlEditor.addin
  15. 6
      src/AddIns/Misc/SearchAndReplace/Project/SearchAndReplace.addin
  16. 8
      src/AddIns/Misc/SearchAndReplace/Project/SearchOptions.cs
  17. 2
      src/Main/Base/Project/Editor/AvalonEditTextEditorAdapter.cs
  18. 76
      src/Main/Base/Project/Editor/ITextEditorExtension.cs
  19. 3
      src/Main/Base/Project/ICSharpCode.SharpDevelop.addin
  20. 2
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  21. 5
      src/Main/Base/Project/Services/SD.cs
  22. 74
      src/Main/Base/Project/Src/Services/LanguageBinding/AggregatedLanguageBinding.cs
  23. 23
      src/Main/Base/Project/Src/Services/LanguageBinding/DefaultLanguageBinding.cs
  24. 26
      src/Main/Base/Project/Src/Services/LanguageBinding/ILanguageBinding.cs
  25. 63
      src/Main/Base/Project/Src/Services/LanguageBinding/LanguageBindingDoozer.cs
  26. 42
      src/Main/Base/Project/Src/Services/LanguageBinding/LanguageBindingService.cs

14
src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.addin

@ -91,18 +91,18 @@ @@ -91,18 +91,18 @@
extensions="*.aspx"/>
</Path>
<Path name="/SharpDevelop/Workbench/LanguageBindings">
<LanguageBinding
<Path name="/SharpDevelop/ViewContent/TextEditor/Extensions">
<TextEditorExtension
id="WebForms"
class="ICSharpCode.AspNet.Mvc.Folding.WebFormsLanguageBinding"
class="ICSharpCode.AspNet.Mvc.Folding.WebFormsTextEditorExtension"
extensions=".aspx;.ascx;.master;.html;.htm" />
<LanguageBinding
<TextEditorExtension
id="CSharp.Razor"
class="ICSharpCode.AspNet.Mvc.Folding.CSharpRazorLanguageBinding"
class="ICSharpCode.AspNet.Mvc.Folding.CSharpRazorTextEditorExtension"
extensions=".cshtml" />
<LanguageBinding
<TextEditorExtension
id="VisualBasic.Razor"
class="ICSharpCode.AspNet.Mvc.Folding.VisualBasicRazorLanguageBinding"
class="ICSharpCode.AspNet.Mvc.Folding.VisualBasicRazorTextEditorExtension"
extensions=".vbhtml" />
</Path>

4
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/CSharpRazorLanguageBinding.cs

@ -5,9 +5,9 @@ using System; @@ -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"))

12
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/HtmlLanguageBinding.cs

@ -8,13 +8,13 @@ using ICSharpCode.SharpDevelop.Editor; @@ -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 @@ -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 @@ -36,7 +32,7 @@ namespace ICSharpCode.AspNet.Mvc.Folding
foldGenerator = foldGeneratorFactory.CreateFoldGenerator(editor);
}
public override void Detach()
public void Detach()
{
foldGenerator.Dispose();
}

4
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/VisualBasicRazorLanguageBinding.cs

@ -5,9 +5,9 @@ using System; @@ -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"))

6
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/WebFormsLanguageBinding.cs

@ -6,16 +6,16 @@ using ICSharpCode.SharpDevelop; @@ -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)

7
src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.addin

@ -69,6 +69,13 @@ @@ -69,6 +69,13 @@
extensions=".cs" />
</Path>
<Path name="/SharpDevelop/ViewContent/TextEditor/Extensions">
<TextEditorExtension
id="CSharp"
class="CSharpBinding.CSharpTextEditorExtension"
extensions=".cs" />
</Path>
<Path name = "/SharpDevelop/ViewContent/AvalonEdit/SyntaxModes">
<SyntaxMode id="C#" name="C#" extensions=".cs" resource="CSharpBinding.Resources.CSharp-Semantic.xshd" />
</Path>

13
src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpLanguageBinding.cs

@ -25,21 +25,19 @@ namespace CSharpBinding @@ -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<IContextActionProvider> 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 @@ -50,7 +48,7 @@ namespace CSharpBinding
}
}
public override void Detach()
public void Detach()
{
//codeManipulation.Dispose();
if (inspectionManager != null) {
@ -61,7 +59,6 @@ namespace CSharpBinding @@ -61,7 +59,6 @@ namespace CSharpBinding
editor.ContextActionProviders.RemoveAll(contextActionProviders.Contains);
}
this.editor = null;
base.Detach();
}
}
}

6
src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlBinding.addin

@ -43,10 +43,10 @@ @@ -43,10 +43,10 @@
<CodeCompletionBinding id = "XAML" extensions = ".xaml" class = "ICSharpCode.XamlBinding.XamlCodeCompletionBinding"/>
</Path>
<Path name="/SharpDevelop/Workbench/LanguageBindings">
<LanguageBinding
<Path name="/SharpDevelop/ViewContent/TextEditor/Extensions">
<TextEditorExtension
id="XAML"
class="ICSharpCode.XamlBinding.XamlLanguageBinding"
class="ICSharpCode.XamlBinding.XamlTextEditorExtension"
extensions=".xaml" />
</Path>

8
src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlContextResolver.cs

@ -143,10 +143,10 @@ namespace ICSharpCode.XamlBinding @@ -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 @@ -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,

8
src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlLanguageBinding.cs

@ -11,10 +11,10 @@ using ICSharpCode.SharpDevelop.Gui; @@ -11,10 +11,10 @@ using ICSharpCode.SharpDevelop.Gui;
namespace ICSharpCode.XamlBinding
{
/// <summary>
/// Description of XamlLanguageBinding.
/// Description of XamlTextEditorExtension.
/// </summary>
[TextEditorService]
public class XamlLanguageBinding : XmlEditor.XmlLanguageBinding
public class XamlTextEditorExtension : XmlEditor.XmlTextEditorExtension
{
// XamlColorizer colorizer;
TextView textView;
@ -42,7 +42,7 @@ namespace ICSharpCode.XamlBinding @@ -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 @@ -61,7 +61,7 @@ namespace ICSharpCode.XamlBinding
textView.Services.RemoveService(typeof(IOutlineContentHost));
contentHost.Dispose();
}
textView.Services.RemoveService(typeof(XamlLanguageBinding));
textView.Services.RemoveService(typeof(XamlTextEditorExtension));
}
}
}

6
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs

@ -408,7 +408,7 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -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 @@ -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();

30
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorAdapter.cs

@ -5,7 +5,7 @@ using System; @@ -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 @@ -41,22 +41,42 @@ namespace ICSharpCode.AvalonEdit.AddIn
get { return languageBinding; }
}
List<ITextEditorExtension> 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<ITextEditorExtension>(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)

15
src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlLanguageBinding.cs

@ -10,27 +10,26 @@ namespace ICSharpCode.XmlEditor @@ -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();
}
}
}

179
src/AddIns/DisplayBindings/XmlEditor/Project/XmlEditor.addin

@ -53,35 +53,42 @@ @@ -53,35 +53,42 @@
<Path name="/SharpDevelop/Workbench/LanguageBindings">
<LanguageBinding
id="Xml"
id="XML"
class="ICSharpCode.XmlEditor.XmlLanguageBinding"
extensions=".xml;.xsl;.xslt;.xsd;.manifest;.config;.addin;.xshd;.wxs;.wxi;.wxl;.proj;.csproj;.vbproj;.ilproj;.build;.xfrm;.targets;.xpt;.xft;.map;.wsdl;.disco;.nuspec;.booproj;.fsproj;.pyproj;.rbproj;.vcxproj;.wixproj;.ps1xml" />
</Path>
<Path name="/SharpDevelop/ViewContent/TextEditor/Extensions">
<TextEditorExtension
id="XML"
class="ICSharpCode.XmlEditor.XmlTextEditorExtension"
extensions=".xml;.xsl;.xslt;.xsd;.manifest;.config;.addin;.xshd;.wxs;.wxi;.wxl;.proj;.csproj;.vbproj;.ilproj;.build;.xfrm;.targets;.xpt;.xft;.map;.wsdl;.disco;.nuspec;.booproj;.fsproj;.pyproj;.rbproj;.vcxproj;.wixproj;.ps1xml" />
</Path>
<Path name="/SharpDevelop/Workbench/DisplayBindings">
<DisplayBinding id="XmlTreeView"
type="Secondary"
insertbefore="Text"
class="ICSharpCode.XmlEditor.XmlDisplayBinding"/>
type="Secondary"
insertbefore="Text"
class="ICSharpCode.XmlEditor.XmlDisplayBinding"/>
</Path>
<!-- Extra project browser icons -->
<Path name="/Workspace/Icons">
<Icon id="ExtraXmlFileIcon"
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" />
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" />
</Path>
<!-- Xml file filter -->
<Path name="/SharpDevelop/Workbench/FileFilter">
<FileFilter id="Xml"
insertbefore="AllFiles"
name="${res:SharpDevelop.FileFilter.XmlFiles}"
extensions="*.xml"/>
insertbefore="AllFiles"
name="${res:SharpDevelop.FileFilter.XmlFiles}"
extensions="*.xml"/>
<FileFilter id="Xsl"
insertbefore="AllFiles"
name="${res:SharpDevelop.FileFilter.XslFiles} (*.xsl;*.xslt)"
extensions="*.xsl;*.xslt"/>
insertbefore="AllFiles"
name="${res:SharpDevelop.FileFilter.XslFiles} (*.xsl;*.xslt)"
extensions="*.xsl;*.xslt"/>
</Path>
<!-- XML menu -->
@ -93,23 +100,23 @@ @@ -93,23 +100,23 @@
</Or>
<MenuItem id="Xml" insertafter="View" insertbefore="Tools" label="&amp;XML" type="Menu">
<MenuItem id="CreateSchema"
label="${res:ICSharpCode.XmlEditor.CreateSchemaMenuLabel}"
class="ICSharpCode.XmlEditor.CreateSchemaCommand"/>
label="${res:ICSharpCode.XmlEditor.CreateSchemaMenuLabel}"
class="ICSharpCode.XmlEditor.CreateSchemaCommand"/>
<MenuItem id="ValidateXml"
label="${res:ICSharpCode.XmlEditor.ValidateXmlMenuLabel}"
class="ICSharpCode.XmlEditor.ValidateXmlCommand"
shortcut="Control|Shift|V"/>
label="${res:ICSharpCode.XmlEditor.ValidateXmlMenuLabel}"
class="ICSharpCode.XmlEditor.ValidateXmlCommand"
shortcut="Control|Shift|V"/>
<MenuItem id="GoToDefinition"
label="${res:ICSharpCode.NAntAddIn.GotoDefinitionMenuLabel}"
class="ICSharpCode.XmlEditor.GoToSchemaDefinitionCommand"/>
label="${res:ICSharpCode.NAntAddIn.GotoDefinitionMenuLabel}"
class="ICSharpCode.XmlEditor.GoToSchemaDefinitionCommand"/>
<MenuItem id="Separator1" type="Separator"/>
<ComplexCondition action="Disable">
<Not>
<Condition name="WindowActive" activewindow="ICSharpCode.XmlEditor.XslOutputView"/>
</Not>
<MenuItem id="AssignStylesheet"
label="${res:ICSharpCode.XmlEditor.AssignXSLT}"
class="ICSharpCode.XmlEditor.AssignStylesheetCommand"/>
label="${res:ICSharpCode.XmlEditor.AssignXSLT}"
class="ICSharpCode.XmlEditor.AssignStylesheetCommand"/>
<ComplexCondition action="Disable">
<!-- evaluate StylesheetAssigned only when XmlView is active - important for lazy loading! -->
<And>
@ -117,21 +124,21 @@ @@ -117,21 +124,21 @@
<Condition name="StylesheetAssigned" action="Disable"/>
</And>
<MenuItem id="OpenStylesheet"
label="${res:ICSharpCode.XmlEditor.OpenXSLT}"
class="ICSharpCode.XmlEditor.OpenStylesheetCommand"/>
label="${res:ICSharpCode.XmlEditor.OpenXSLT}"
class="ICSharpCode.XmlEditor.OpenStylesheetCommand"/>
</ComplexCondition>
<MenuItem id="RunTransform"
label="${res:ICSharpCode.XmlEditor.RunXSLT}"
class="ICSharpCode.XmlEditor.RunXslTransformCommand"
shortcut="Control|Shift|T"/>
label="${res:ICSharpCode.XmlEditor.RunXSLT}"
class="ICSharpCode.XmlEditor.RunXslTransformCommand"
shortcut="Control|Shift|T"/>
</ComplexCondition>
<MenuItem id="Separator2" type="Separator"/>
<MenuItem id="HideXPathResults"
label="${res:ICSharpCode.XmlEditor.HideXPathResults}"
class="ICSharpCode.XmlEditor.RemoveXPathHighlightingCommand"/>
label="${res:ICSharpCode.XmlEditor.HideXPathResults}"
class="ICSharpCode.XmlEditor.RemoveXPathHighlightingCommand"/>
<MenuItem id="Format"
label="${res:XML.MainMenu.EditMenu.FormatMenu}"
class="ICSharpCode.XmlEditor.FormatXmlCommand"/>
label="${res:XML.MainMenu.EditMenu.FormatMenu}"
class="ICSharpCode.XmlEditor.FormatXmlCommand"/>
</MenuItem>
</ComplexCondition>
</Path>
@ -139,34 +146,34 @@ @@ -139,34 +146,34 @@
<!-- Options panel -->
<Path path="/SharpDevelop/Dialogs/OptionsDialog/TextEditorOptions">
<OptionPanel id="XmlSchemasPanel"
insertafter="Markers"
label="${res:ICSharpCode.XmlEditor.XmlSchemasPanel.Title}"
class="ICSharpCode.XmlEditor.XmlSchemasPanel"/>
insertafter="Markers"
label="${res:ICSharpCode.XmlEditor.XmlSchemasPanel.Title}"
class="ICSharpCode.XmlEditor.XmlSchemasPanel"/>
<OptionPanel id="XmlEditorOptionsPanel"
insertafter="Markers"
insertbefore="XmlSchemasPanel"
label="${res:ICSharpCode.XmlEditor.XmlEditorOptionsPanel.Title}"
class="ICSharpCode.XmlEditor.XmlEditorOptionsPanel"/>
insertafter="Markers"
insertbefore="XmlSchemasPanel"
label="${res:ICSharpCode.XmlEditor.XmlEditorOptionsPanel.Title}"
class="ICSharpCode.XmlEditor.XmlEditorOptionsPanel"/>
</Path>
<!-- XPath Query pad -->
<Path name="/SharpDevelop/Workbench/Pads">
<Pad id="XPathQueryPad"
category="Tools"
icon="PadIcons.XPathQuery"
title="${res:ICSharpCode.XmlEditor.XPathQueryPad.Title}"
insertafter="UnitTestingPad"
class="ICSharpCode.XmlEditor.XPathQueryPad"
defaultPosition="Bottom, Hidden"/>
category="Tools"
icon="PadIcons.XPathQuery"
title="${res:ICSharpCode.XmlEditor.XPathQueryPad.Title}"
insertafter="UnitTestingPad"
class="ICSharpCode.XmlEditor.XPathQueryPad"
defaultPosition="Bottom, Hidden"/>
</Path>
<!-- Menu options to turn off XPath Query result highlighting -->
<Path name="/SharpDevelop/Workbench/MainMenu/Edit/Format">
<Condition name="WindowActive" activewindow="ICSharpCode.XmlEditor.XmlView">
<MenuItem id="RemoveXPathHighlighting"
insertafter="ShowCodeCoverage"
label="${res:ICSharpCode.XmlEditor.HideXPathResults}"
class="ICSharpCode.XmlEditor.RemoveXPathHighlightingCommand"/>
insertafter="ShowCodeCoverage"
label="${res:ICSharpCode.XmlEditor.HideXPathResults}"
class="ICSharpCode.XmlEditor.RemoveXPathHighlightingCommand"/>
</Condition>
</Path>
@ -174,37 +181,37 @@ @@ -174,37 +181,37 @@
<Path name="/AddIns/XmlEditor/XmlTree/AttributesGrid/ContextMenu">
<Condition name="Ownerstate" ownerstate="ElementSelected" action="Disable">
<MenuItem id="AddAttribute"
label="${res:ICSharpCode.XmlEditor.XmlTreeView.AddAttributeMenuLabel}"
class="ICSharpCode.XmlEditor.AddAttributeCommand"/>
</Condition>
label="${res:ICSharpCode.XmlEditor.XmlTreeView.AddAttributeMenuLabel}"
class="ICSharpCode.XmlEditor.AddAttributeCommand"/>
</Condition>
<Condition name="Ownerstate" ownerstate="AttributeSelected" action="Disable">
<MenuItem id="RemoveAttribute"
label="${res:ICSharpCode.XmlEditor.XmlTreeView.RemoveAttributeMenuLabel}"
icon="Icons.16x16.DeleteIcon"
class="ICSharpCode.XmlEditor.RemoveAttributeCommand"/>
</Condition>
label="${res:ICSharpCode.XmlEditor.XmlTreeView.RemoveAttributeMenuLabel}"
icon="Icons.16x16.DeleteIcon"
class="ICSharpCode.XmlEditor.RemoveAttributeCommand"/>
</Condition>
</Path>
<Path name="/AddIns/XmlEditor/XmlTree/ContextMenu">
<MenuItem id="Cut"
label="${res:XML.TextAreaContextMenu.Cut}"
icon="Icons.16x16.CutIcon"
shortcut="Control|X"
class="ICSharpCode.XmlEditor.CutXmlTreeNode"/>
label="${res:XML.TextAreaContextMenu.Cut}"
icon="Icons.16x16.CutIcon"
shortcut="Control|X"
class="ICSharpCode.XmlEditor.CutXmlTreeNode"/>
<MenuItem id="Copy"
label="${res:XML.TextAreaContextMenu.Copy}"
icon="Icons.16x16.CopyIcon"
shortcut="Control|C"
class="ICSharpCode.XmlEditor.CopyXmlTreeNode"/>
label="${res:XML.TextAreaContextMenu.Copy}"
icon="Icons.16x16.CopyIcon"
shortcut="Control|C"
class="ICSharpCode.XmlEditor.CopyXmlTreeNode"/>
<MenuItem id="Paste"
label="${res:XML.TextAreaContextMenu.Paste}"
icon="Icons.16x16.PasteIcon"
shortcut="Control|V"
class="ICSharpCode.XmlEditor.PasteXmlTreeNode"/>
label="${res:XML.TextAreaContextMenu.Paste}"
icon="Icons.16x16.PasteIcon"
shortcut="Control|V"
class="ICSharpCode.XmlEditor.PasteXmlTreeNode"/>
<MenuItem id="Delete"
label="${res:XML.MainMenu.EditMenu.Delete}"
icon="Icons.16x16.DeleteIcon"
class="ICSharpCode.XmlEditor.DeleteXmlTreeNode"/>
label="${res:XML.MainMenu.EditMenu.Delete}"
icon="Icons.16x16.DeleteIcon"
class="ICSharpCode.XmlEditor.DeleteXmlTreeNode"/>
<MenuItem id="EditItemsSeparator" type="Separator"/>
<ComplexCondition action="Disable">
<Or>
@ -217,16 +224,16 @@ @@ -217,16 +224,16 @@
</And>
</Or>
<MenuItem id="InsertElementBefore"
label="${res:ICSharpCode.XmlEditor.XmlTreeView.InsertElementBeforeMenuLabel}"
class="ICSharpCode.XmlEditor.InsertElementBeforeCommand"/>
label="${res:ICSharpCode.XmlEditor.XmlTreeView.InsertElementBeforeMenuLabel}"
class="ICSharpCode.XmlEditor.InsertElementBeforeCommand"/>
<MenuItem id="InsertElementAfter"
label="${res:ICSharpCode.XmlEditor.XmlTreeView.InsertElementAfterMenuLabel}"
class="ICSharpCode.XmlEditor.InsertElementAfterCommand"/>
label="${res:ICSharpCode.XmlEditor.XmlTreeView.InsertElementAfterMenuLabel}"
class="ICSharpCode.XmlEditor.InsertElementAfterCommand"/>
</ComplexCondition>
<Condition name="Ownerstate" ownerstate="ElementSelected" action="Disable">
<MenuItem id="AddChildElement"
label="${res:ICSharpCode.XmlEditor.XmlTreeView.AddChildElementMenuLabel}"
class="ICSharpCode.XmlEditor.AddChildElementCommand"/>
label="${res:ICSharpCode.XmlEditor.XmlTreeView.AddChildElementMenuLabel}"
class="ICSharpCode.XmlEditor.AddChildElementCommand"/>
</Condition>
<ComplexCondition action="Disable">
<Or>
@ -241,16 +248,16 @@ @@ -241,16 +248,16 @@
</Or>
<MenuItem id="TextNodeCommandsSeparator" type="Separator"/>
<MenuItem id="InsertTextNodeBefore"
label="${res:ICSharpCode.XmlEditor.XmlTreeView.InsertTextNodeBeforeMenuLabel}"
class="ICSharpCode.XmlEditor.InsertTextNodeBeforeCommand"/>
label="${res:ICSharpCode.XmlEditor.XmlTreeView.InsertTextNodeBeforeMenuLabel}"
class="ICSharpCode.XmlEditor.InsertTextNodeBeforeCommand"/>
<MenuItem id="InsertTextNodeAfter"
label="${res:ICSharpCode.XmlEditor.XmlTreeView.InsertTextNodeAfterMenuLabel}"
class="ICSharpCode.XmlEditor.InsertTextNodeAfterCommand"/>
label="${res:ICSharpCode.XmlEditor.XmlTreeView.InsertTextNodeAfterMenuLabel}"
class="ICSharpCode.XmlEditor.InsertTextNodeAfterCommand"/>
</ComplexCondition>
<Condition name="Ownerstate" ownerstate="ElementSelected" action="Disable">
<MenuItem id="AddChildTextNode"
label="${res:ICSharpCode.XmlEditor.XmlTreeView.AddChildTextNodeAfterMenuLabel}"
class="ICSharpCode.XmlEditor.AddChildTextNodeCommand"/>
label="${res:ICSharpCode.XmlEditor.XmlTreeView.AddChildTextNodeAfterMenuLabel}"
class="ICSharpCode.XmlEditor.AddChildTextNodeCommand"/>
</Condition>
<ComplexCondition action="Disable">
<Or>
@ -260,16 +267,16 @@ @@ -260,16 +267,16 @@
</Or>
<MenuItem id="CommentNodeCommandsSeparator" type="Separator"/>
<MenuItem id="InsertCommentBefore"
label="${res:ICSharpCode.XmlEditor.XmlTreeView.InsertCommentBeforeMenuLabel}"
class="ICSharpCode.XmlEditor.InsertCommentBeforeCommand"/>
label="${res:ICSharpCode.XmlEditor.XmlTreeView.InsertCommentBeforeMenuLabel}"
class="ICSharpCode.XmlEditor.InsertCommentBeforeCommand"/>
<MenuItem id="InsertCommentAfter"
label="${res:ICSharpCode.XmlEditor.XmlTreeView.InsertCommentAfterMenuLabel}"
class="ICSharpCode.XmlEditor.InsertCommentAfterCommand"/>
label="${res:ICSharpCode.XmlEditor.XmlTreeView.InsertCommentAfterMenuLabel}"
class="ICSharpCode.XmlEditor.InsertCommentAfterCommand"/>
</ComplexCondition>
<Condition name="Ownerstate" ownerstate="ElementSelected" action="Disable">
<MenuItem id="AddChildCommentNode"
label="${res:ICSharpCode.XmlEditor.XmlTreeView.AddChildCommentMenuLabel}"
class="ICSharpCode.XmlEditor.AddChildCommentCommand"/>
label="${res:ICSharpCode.XmlEditor.XmlTreeView.AddChildCommentMenuLabel}"
class="ICSharpCode.XmlEditor.AddChildCommentCommand"/>
</Condition>
</Path>
</AddIn>

6
src/AddIns/Misc/SearchAndReplace/Project/SearchAndReplace.addin

@ -44,9 +44,9 @@ @@ -44,9 +44,9 @@
<Class id="DefaultSearchResultFactory" class="SearchAndReplace.DefaultSearchResultFactory"/>
</Path>
<Path name="/SharpDevelop/Workbench/LanguageBindings">
<LanguageBinding
<Path name="/SharpDevelop/ViewContent/TextEditor/Extensions">
<TextEditorExtension
id="SearchAndReplace"
class="SearchAndReplace.SearchAndReplaceBinding" />
class="SearchAndReplace.SearchAndReplaceTextEditorExtension" />
</Path>
</AddIn>

8
src/AddIns/Misc/SearchAndReplace/Project/SearchOptions.cs

@ -156,14 +156,13 @@ namespace SearchAndReplace @@ -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 @@ -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;

2
src/Main/Base/Project/Editor/AvalonEditTextEditorAdapter.cs

@ -58,7 +58,7 @@ namespace ICSharpCode.SharpDevelop.Editor @@ -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

76
src/Main/Base/Project/Editor/ITextEditorExtension.cs

@ -0,0 +1,76 @@ @@ -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
{
/// <summary>
/// Allows add-ins to attach language/project-specific features to ITextEditor (one instance per ITextEditor is created).
/// </summary>
public interface ITextEditorExtension
{
/// <summary>
/// Callback function for backend bindings to add services to ITextEditor.
/// This is called when the file name of an ITextEditor changes.
/// </summary>
void Attach(ITextEditor editor);
/// <summary>
/// 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.
/// </summary>
void Detach();
}
/// <summary>
/// Creates ITextEditorExtension objects for the code editor.
/// </summary>
/// <attribute name="extensions" use="required">
/// Semicolon-separated list of file extensions that are handled by the text editor extension (e.g. .xaml)
/// </attribute>
/// <attribute name="class" use="required">
/// Name of the ITextEditorExtension class.
/// </attribute>
/// <usage>Only in /SharpDevelop/ViewContent/TextEditor/Extensions</usage>
/// <returns>
/// The ILanguageBinding object.
/// </returns>
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;
}
}
}

3
src/Main/Base/Project/ICSharpCode.SharpDevelop.addin

@ -41,6 +41,7 @@ @@ -41,6 +41,7 @@
<Doozer name="Pad" class="ICSharpCode.SharpDevelop.PadDoozer"/>
<Doozer name="ProjectBinding" class="ICSharpCode.SharpDevelop.ProjectBindingDoozer"/>
<Doozer name="LanguageBinding" class="ICSharpCode.SharpDevelop.LanguageBindingDoozer"/>
<Doozer name="TextEditorExtension" class="ICSharpCode.SharpDevelop.Editor.TextEditorExtensionDoozer"/>
<Doozer name="BrowserSchemeExtension" class="ICSharpCode.SharpDevelop.BrowserDisplayBinding.SchemeExtensionDoozer"/>
<Doozer name="CodeCompletionBinding" class="ICSharpCode.SharpDevelop.Editor.CodeCompletion.CodeCompletionBindingDoozer"/>
<Doozer name="Debugger" class="ICSharpCode.SharpDevelop.Debugging.DebuggerDoozer"/>
@ -81,6 +82,8 @@ @@ -81,6 +82,8 @@
class="ICSharpCode.SharpDevelop.Project.BuildService"/>
<Service id="ICSharpCode.SharpDevelop.Project.IProjectService"
class="ICSharpCode.SharpDevelop.Project.SDProjectService"/>
<Service id="ICSharpCode.SharpDevelop.ILanguageService"
class="ICSharpCode.SharpDevelop.SDLanguageService"/>
<Service id="ICSharpCode.SharpDevelop.Project.IMSBuildEngine"
class="ICSharpCode.SharpDevelop.Project.MSBuildEngine"/>
<Service id="ICSharpCode.SharpDevelop.Editor.Bookmarks.IBookmarkManager"

2
src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj

@ -119,6 +119,7 @@ @@ -119,6 +119,7 @@
<DependentUpon>ToolTipService.cs</DependentUpon>
</Compile>
<Compile Include="Editor\ITextEditor.cs" />
<Compile Include="Editor\ITextEditorExtension.cs" />
<Compile Include="Editor\ITextMarker.cs" />
<Compile Include="Editor\ITooltip.cs">
<DependentUpon>ToolTipService.cs</DependentUpon>
@ -520,7 +521,6 @@ @@ -520,7 +521,6 @@
<Compile Include="Src\Services\Debugger\BreakpointBookmarkEventArgs.cs" />
<Compile Include="Workbench\File\IFileService.cs" />
<Compile Include="Workbench\File\OpenedFile.cs" />
<Compile Include="Src\Services\LanguageBinding\AggregatedLanguageBinding.cs" />
<Compile Include="Src\Services\LanguageBinding\DefaultLanguageBinding.cs" />
<Compile Include="Src\Services\LanguageBinding\ILanguageBinding.cs" />
<Compile Include="Src\Services\LanguageBinding\LanguageBindingDoozer.cs" />

5
src/Main/Base/Project/Services/SD.cs

@ -230,6 +230,11 @@ namespace ICSharpCode.SharpDevelop @@ -230,6 +230,11 @@ namespace ICSharpCode.SharpDevelop
get { return GetRequiredService<IProjectService>(); }
}
/// <inheritdoc see="ILanguageService"/>
public static ILanguageService LanguageService {
get { return GetRequiredService<ILanguageService>(); }
}
/// <inheritdoc see="IUIService"/>
public static IUIService UIService {
get { return GetRequiredService<IUIService>(); }

74
src/Main/Base/Project/Src/Services/LanguageBinding/AggregatedLanguageBinding.cs

@ -1,74 +0,0 @@ @@ -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
{
/// <summary>
/// Aggregates multiple ILanguageBinding instances to allow more
/// than one language binding for a filename extension.
/// </summary>
sealed class AggregatedLanguageBinding : ILanguageBinding
{
public static readonly AggregatedLanguageBinding NullLanguageBinding = new AggregatedLanguageBinding(System.Linq.Enumerable.Empty<ILanguageBinding>());
readonly IEnumerable<ILanguageBinding> allBindings;
public AggregatedLanguageBinding(IEnumerable<ILanguageBinding> 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;
}
}
}
}

23
src/Main/Base/Project/Src/Services/LanguageBinding/DefaultLanguageBinding.cs

@ -3,36 +3,29 @@ @@ -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;
}
}
}

26
src/Main/Base/Project/Src/Services/LanguageBinding/ILanguageBinding.cs

@ -3,11 +3,12 @@ @@ -3,11 +3,12 @@
using System;
using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Refactoring;
namespace ICSharpCode.SharpDevelop
{
/// <summary>
/// Provides access to language specific features for single files.
/// Provides access to language specific features (independent of files).
/// </summary>
public interface ILanguageBinding
{
@ -18,15 +19,6 @@ namespace ICSharpCode.SharpDevelop @@ -18,15 +19,6 @@ namespace ICSharpCode.SharpDevelop
get;
}
/*
/// <summary>
/// Provides access to the properties for this language.
/// </summary>
LanguageProperties Properties {
get;
}
*/
/// <summary>
/// Provides access to the bracket search logic for this language.
/// </summary>
@ -35,16 +27,10 @@ namespace ICSharpCode.SharpDevelop @@ -35,16 +27,10 @@ namespace ICSharpCode.SharpDevelop
}
/// <summary>
/// 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.
/// </summary>
void Attach(ITextEditor editor);
/// <summary>
/// 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.
/// </summary>
void Detach();
ICodeGenerator CodeGenerator {
get;
}
}
}

63
src/Main/Base/Project/Src/Services/LanguageBinding/LanguageBindingDoozer.cs

@ -31,25 +31,64 @@ namespace ICSharpCode.SharpDevelop @@ -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;

42
src/Main/Base/Project/Src/Services/LanguageBinding/LanguageBindingService.cs

@ -3,22 +3,50 @@ @@ -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<LanguageBindingDescriptor> bindings;
public SDLanguageService()
{
bindings = AddInTree.BuildItems<LanguageBindingDescriptor>(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;
}
/// <summary>
/// Creates the binding for the specified text editor. This method never returns null.
/// </summary>
public static ILanguageBinding CreateBinding(ITextEditor editor)
public ILanguageBinding GetLanguageByName(string name)
{
var bindings = AddInTree.BuildItems<ILanguageBinding>(languageBindingPath, editor, false);
return new AggregatedLanguageBinding(bindings);
foreach (var language in bindings) {
if (language.Name == name)
return language.Binding;
}
return DefaultLanguageBinding.DefaultInstance;
}
}
}

Loading…
Cancel
Save