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

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

@ -5,9 +5,9 @@ using System;
namespace ICSharpCode.AspNet.Mvc.Folding namespace ICSharpCode.AspNet.Mvc.Folding
{ {
public class CSharpRazorLanguageBinding : HtmlLanguageBinding public class CSharpRazorTextEditorExtension : HtmlTextEditorExtension
{ {
public CSharpRazorLanguageBinding() public CSharpRazorTextEditorExtension()
: base( : base(
new TextEditorWithParseInformationFoldingFactory(), new TextEditorWithParseInformationFoldingFactory(),
new RazorFoldGeneratorFactory(".cshtml")) new RazorFoldGeneratorFactory(".cshtml"))

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

@ -8,13 +8,13 @@ using ICSharpCode.SharpDevelop.Editor;
namespace ICSharpCode.AspNet.Mvc.Folding namespace ICSharpCode.AspNet.Mvc.Folding
{ {
public class HtmlLanguageBinding : DefaultLanguageBinding public class HtmlTextEditorExtension : ITextEditorExtension
{ {
ITextEditorWithParseInformationFoldingFactory textEditorFactory; ITextEditorWithParseInformationFoldingFactory textEditorFactory;
IFoldGeneratorFactory foldGeneratorFactory; IFoldGeneratorFactory foldGeneratorFactory;
IFoldGenerator foldGenerator; IFoldGenerator foldGenerator;
public HtmlLanguageBinding( public HtmlTextEditorExtension(
ITextEditorWithParseInformationFoldingFactory textEditorFactory, ITextEditorWithParseInformationFoldingFactory textEditorFactory,
IFoldGeneratorFactory foldGeneratorFactory) IFoldGeneratorFactory foldGeneratorFactory)
{ {
@ -22,11 +22,7 @@ namespace ICSharpCode.AspNet.Mvc.Folding
this.foldGeneratorFactory = foldGeneratorFactory; this.foldGeneratorFactory = foldGeneratorFactory;
} }
public override IFormattingStrategy FormattingStrategy { public void Attach(ITextEditor editor)
get { return new DefaultFormattingStrategy(); }
}
public override void Attach(ITextEditor editor)
{ {
Attach(textEditorFactory.CreateTextEditor(editor)); Attach(textEditorFactory.CreateTextEditor(editor));
} }
@ -36,7 +32,7 @@ namespace ICSharpCode.AspNet.Mvc.Folding
foldGenerator = foldGeneratorFactory.CreateFoldGenerator(editor); foldGenerator = foldGeneratorFactory.CreateFoldGenerator(editor);
} }
public override void Detach() public void Detach()
{ {
foldGenerator.Dispose(); foldGenerator.Dispose();
} }

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

@ -5,9 +5,9 @@ using System;
namespace ICSharpCode.AspNet.Mvc.Folding namespace ICSharpCode.AspNet.Mvc.Folding
{ {
public class VisualBasicRazorLanguageBinding : HtmlLanguageBinding public class VisualBasicRazorTextEditorExtension : HtmlTextEditorExtension
{ {
public VisualBasicRazorLanguageBinding() public VisualBasicRazorTextEditorExtension()
: base( : base(
new TextEditorWithParseInformationFoldingFactory(), new TextEditorWithParseInformationFoldingFactory(),
new RazorFoldGeneratorFactory(".vbhtml")) new RazorFoldGeneratorFactory(".vbhtml"))

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

@ -6,16 +6,16 @@ using ICSharpCode.SharpDevelop;
namespace ICSharpCode.AspNet.Mvc.Folding namespace ICSharpCode.AspNet.Mvc.Folding
{ {
public class WebFormsLanguageBinding : HtmlLanguageBinding public class WebFormsTextEditorExtension : HtmlTextEditorExtension
{ {
public WebFormsLanguageBinding() public WebFormsTextEditorExtension()
: base( : base(
new TextEditorWithParseInformationFoldingFactory(), new TextEditorWithParseInformationFoldingFactory(),
new WebFormsFoldGeneratorFactory()) new WebFormsFoldGeneratorFactory())
{ {
} }
public WebFormsLanguageBinding( public WebFormsTextEditorExtension(
ITextEditorWithParseInformationFoldingFactory textEditorFactory, ITextEditorWithParseInformationFoldingFactory textEditorFactory,
IFoldGeneratorFactory foldGeneratorFactory) IFoldGeneratorFactory foldGeneratorFactory)
: base(textEditorFactory, foldGeneratorFactory) : base(textEditorFactory, foldGeneratorFactory)

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

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

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

@ -25,21 +25,19 @@ namespace CSharpBinding
get { return new CSharpFormattingStrategy(); } get { return new CSharpFormattingStrategy(); }
} }
// public override LanguageProperties Properties {
// get { return LanguageProperties.CSharp; }
// }
//
public override IBracketSearcher BracketSearcher { public override IBracketSearcher BracketSearcher {
get { return new CSharpBracketSearcher(); } get { return new CSharpBracketSearcher(); }
} }
}
public class CSharpTextEditorExtension : ITextEditorExtension
{
ITextEditor editor; ITextEditor editor;
IssueManager inspectionManager; IssueManager inspectionManager;
IList<IContextActionProvider> contextActionProviders; IList<IContextActionProvider> contextActionProviders;
public override void Attach(ITextEditor editor) public void Attach(ITextEditor editor)
{ {
base.Attach(editor);
this.editor = editor; this.editor = editor;
inspectionManager = new IssueManager(editor); inspectionManager = new IssueManager(editor);
//codeManipulation = new CodeManipulation(editor); //codeManipulation = new CodeManipulation(editor);
@ -50,7 +48,7 @@ namespace CSharpBinding
} }
} }
public override void Detach() public void Detach()
{ {
//codeManipulation.Dispose(); //codeManipulation.Dispose();
if (inspectionManager != null) { if (inspectionManager != null) {
@ -61,7 +59,6 @@ namespace CSharpBinding
editor.ContextActionProviders.RemoveAll(contextActionProviders.Contains); editor.ContextActionProviders.RemoveAll(contextActionProviders.Contains);
} }
this.editor = null; this.editor = null;
base.Detach();
} }
} }
} }

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

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

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

@ -143,10 +143,10 @@ namespace ICSharpCode.XamlBinding
public static XamlCompletionContext ResolveCompletionContext(ITextEditor editor, char typedValue) 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) 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)) { var context = new XamlCompletionContext(ResolveContext(editor.FileName, editor.Document, editor.Caret.Offset)) {
PressedKey = typedValue, PressedKey = typedValue,
@ -158,10 +158,10 @@ namespace ICSharpCode.XamlBinding
public static XamlCompletionContext ResolveCompletionContext(ITextEditor editor, char typedValue, int offset) 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) 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)) { var context = new XamlCompletionContext(ResolveContext(editor.FileName, editor.Document, offset)) {
PressedKey = typedValue, PressedKey = typedValue,

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

@ -11,10 +11,10 @@ using ICSharpCode.SharpDevelop.Gui;
namespace ICSharpCode.XamlBinding namespace ICSharpCode.XamlBinding
{ {
/// <summary> /// <summary>
/// Description of XamlLanguageBinding. /// Description of XamlTextEditorExtension.
/// </summary> /// </summary>
[TextEditorService] [TextEditorService]
public class XamlLanguageBinding : XmlEditor.XmlLanguageBinding public class XamlTextEditorExtension : XmlEditor.XmlTextEditorExtension
{ {
// XamlColorizer colorizer; // XamlColorizer colorizer;
TextView textView; TextView textView;
@ -42,7 +42,7 @@ namespace ICSharpCode.XamlBinding
textView.Services.AddService(typeof(IOutlineContentHost), contentHost); textView.Services.AddService(typeof(IOutlineContentHost), contentHost);
} }
// add ILanguageBinding // 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)); textView.Services.RemoveService(typeof(IOutlineContentHost));
contentHost.Dispose(); 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
// remove secondary editor // remove secondary editor
this.Children.Remove(secondaryTextEditor); this.Children.Remove(secondaryTextEditor);
this.Children.Remove(gridSplitter); this.Children.Remove(gridSplitter);
secondaryTextEditorAdapter.Language.Detach(); secondaryTextEditorAdapter.DetachExtensions();
DisposeTextEditor(secondaryTextEditor); DisposeTextEditor(secondaryTextEditor);
secondaryTextEditor = null; secondaryTextEditor = null;
secondaryTextEditorAdapter = null; secondaryTextEditorAdapter = null;
@ -646,9 +646,9 @@ namespace ICSharpCode.AvalonEdit.AddIn
SD.ParserService.ParseInformationUpdated -= ParserServiceParseInformationUpdated; SD.ParserService.ParseInformationUpdated -= ParserServiceParseInformationUpdated;
if (primaryTextEditorAdapter.Language != null) if (primaryTextEditorAdapter.Language != null)
primaryTextEditorAdapter.Language.Detach(); primaryTextEditorAdapter.DetachExtensions();
if (secondaryTextEditorAdapter != null && secondaryTextEditorAdapter.Language != null) if (secondaryTextEditorAdapter != null && secondaryTextEditorAdapter.Language != null)
secondaryTextEditorAdapter.Language.Detach(); secondaryTextEditorAdapter.DetachExtensions();
if (errorPainter != null) if (errorPainter != null)
errorPainter.Dispose(); errorPainter.Dispose();

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

@ -5,7 +5,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Security.Cryptography.X509Certificates;
using ICSharpCode.AvalonEdit.AddIn.Options; using ICSharpCode.AvalonEdit.AddIn.Options;
using ICSharpCode.AvalonEdit.AddIn.Snippets; using ICSharpCode.AvalonEdit.AddIn.Snippets;
using ICSharpCode.AvalonEdit.Indentation; using ICSharpCode.AvalonEdit.Indentation;
@ -41,22 +41,42 @@ namespace ICSharpCode.AvalonEdit.AddIn
get { return languageBinding; } get { return languageBinding; }
} }
List<ITextEditorExtension> extensions;
const string extensionsPath = "/SharpDevelop/ViewContent/TextEditor/Extensions";
public override ITextEditor PrimaryView { public override ITextEditor PrimaryView {
get { return codeEditor.PrimaryTextEditorAdapter; } get { return codeEditor.PrimaryTextEditorAdapter; }
} }
internal void FileNameChanged() internal void FileNameChanged()
{ {
if (languageBinding != null) DetachExtensions();
languageBinding.Detach(); extensions = AddInTree.BuildItems<ITextEditorExtension>(extensionsPath, this, false);
AttachExtensions();
languageBinding = LanguageBindingService.CreateBinding(this); // never returns null languageBinding = SD.LanguageService.GetLanguageByFileName(PrimaryView.FileName);
languageBinding.Attach(this);
// update properties set by languageBinding // update properties set by languageBinding
this.TextEditor.TextArea.IndentationStrategy = new OptionControlledIndentationStrategy(this, languageBinding.FormattingStrategy); 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 sealed class OptionControlledIndentationStrategy : IndentationStrategyAdapter
{ {
public OptionControlledIndentationStrategy(ITextEditor editor, IFormattingStrategy formattingStrategy) public OptionControlledIndentationStrategy(ITextEditor editor, IFormattingStrategy formattingStrategy)

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

@ -10,27 +10,26 @@ namespace ICSharpCode.XmlEditor
{ {
public class XmlLanguageBinding : DefaultLanguageBinding public class XmlLanguageBinding : DefaultLanguageBinding
{ {
XmlFoldingManager foldingManager;
public override IFormattingStrategy FormattingStrategy { public override IFormattingStrategy FormattingStrategy {
get { return new XmlFormattingStrategy(); } 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 = new XmlFoldingManager(editor);
foldingManager.UpdateFolds(); foldingManager.UpdateFolds();
foldingManager.Start(); foldingManager.Start();
base.Attach(editor);
} }
public override void Detach() public virtual void Detach()
{ {
foldingManager.Stop(); foldingManager.Stop();
foldingManager.Dispose(); foldingManager.Dispose();
base.Detach();
} }
} }
} }

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

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

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

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

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

@ -156,14 +156,13 @@ namespace SearchAndReplace
} }
} }
public class SearchAndReplaceBinding : DefaultLanguageBinding public class SearchAndReplaceTextEditorExtension : ITextEditorExtension
{ {
TextArea textArea; TextArea textArea;
SearchInputHandler handler; SearchInputHandler handler;
public override void Attach(ITextEditor editor) public void Attach(ITextEditor editor)
{ {
base.Attach(editor);
textArea = editor.GetService(typeof(TextArea)) as TextArea; textArea = editor.GetService(typeof(TextArea)) as TextArea;
if (textArea != null) { if (textArea != null) {
handler = new SearchInputHandler(textArea); handler = new SearchInputHandler(textArea);
@ -180,9 +179,8 @@ namespace SearchAndReplace
SearchOptions.SearchMode = e.UseRegex ? SearchMode.RegEx : SearchMode.Normal; SearchOptions.SearchMode = e.UseRegex ? SearchMode.RegEx : SearchMode.Normal;
} }
public override void Detach() public void Detach()
{ {
base.Detach();
if (textArea != null) { if (textArea != null) {
textArea.DefaultInputHandler.NestedInputHandlers.Remove(handler); textArea.DefaultInputHandler.NestedInputHandlers.Remove(handler);
textArea = null; textArea = null;

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

@ -58,7 +58,7 @@ namespace ICSharpCode.SharpDevelop.Editor
public virtual ITextEditorOptions Options { get; private set; } public virtual ITextEditorOptions Options { get; private set; }
public virtual ILanguageBinding Language { public virtual ILanguageBinding Language {
get { return AggregatedLanguageBinding.NullLanguageBinding; } get { return DefaultLanguageBinding.DefaultInstance; }
} }
sealed class CaretAdapter : ITextEditorCaret sealed class CaretAdapter : ITextEditorCaret

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

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

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

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

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

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

@ -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 @@
using System; using System;
using ICSharpCode.SharpDevelop.Editor; using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Refactoring;
namespace ICSharpCode.SharpDevelop namespace ICSharpCode.SharpDevelop
{ {
public class DefaultLanguageBinding : ILanguageBinding public class DefaultLanguageBinding : ILanguageBinding
{ {
public static readonly DefaultLanguageBinding DefaultInstance = new DefaultLanguageBinding();
public virtual IFormattingStrategy FormattingStrategy { public virtual IFormattingStrategy FormattingStrategy {
get { get {
return null; return DefaultFormattingStrategy.DefaultInstance;
} }
} }
/* public virtual IBracketSearcher BracketSearcher {
public virtual LanguageProperties Properties {
get { get {
return null; return DefaultBracketSearcher.DefaultInstance;
} }
} }
*/
public virtual void Attach(ITextEditor editor)
{
}
public virtual void Detach() public virtual ICodeGenerator CodeGenerator {
{
}
public virtual IBracketSearcher BracketSearcher {
get { get {
return null; return DefaultCodeGenerator.DefaultInstance;
} }
} }
} }

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

@ -3,30 +3,22 @@
using System; using System;
using ICSharpCode.SharpDevelop.Editor; using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Refactoring;
namespace ICSharpCode.SharpDevelop namespace ICSharpCode.SharpDevelop
{ {
/// <summary> /// <summary>
/// Provides access to language specific features for single files. /// Provides access to language specific features (independent of files).
/// </summary> /// </summary>
public interface ILanguageBinding public interface ILanguageBinding
{ {
/// <summary> /// <summary>
/// Provides access to the formatting strategy for this language. /// Provides access to the formatting strategy for this language.
/// </summary> /// </summary>
IFormattingStrategy FormattingStrategy { IFormattingStrategy FormattingStrategy {
get; get;
} }
/*
/// <summary>
/// Provides access to the properties for this language.
/// </summary>
LanguageProperties Properties {
get;
}
*/
/// <summary> /// <summary>
/// Provides access to the bracket search logic for this language. /// Provides access to the bracket search logic for this language.
/// </summary> /// </summary>
@ -35,16 +27,10 @@ namespace ICSharpCode.SharpDevelop
} }
/// <summary> /// <summary>
/// Callback function for backend bindings to add services to ITextEditor. /// Provides access to the code generator for this language.
/// This is called when the file name of an ITextEditor changes.
/// </summary> /// </summary>
void Attach(ITextEditor editor); ICodeGenerator CodeGenerator {
get;
/// <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();
} }
} }

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

@ -31,25 +31,64 @@ namespace ICSharpCode.SharpDevelop
public object BuildItem(BuildItemArgs args) public object BuildItem(BuildItemArgs args)
{ {
ITextEditor editor = (ITextEditor)args.Parameter; return new LanguageBindingDescriptor(args.Codon);
string[] extensions = args.Codon["extensions"].Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); }
if (CanAttach(extensions, editor.FileName)) { }
return args.AddIn.CreateObject(args.Codon["class"]);
} else { class LanguageBindingDescriptor
return null; {
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 // always attach when no extensions were given
if (extensions.Length == 0) if (Extensions.Length == 0)
return true; return true;
if (string.IsNullOrEmpty(fileName)) if (string.IsNullOrEmpty(extension))
return false; return false;
string fileExtension = Path.GetExtension(fileName); foreach (string ext in Extensions) {
foreach (string ext in extensions) { if (string.Equals(ext, extension, StringComparison.OrdinalIgnoreCase))
if (string.Equals(ext, fileExtension, StringComparison.OrdinalIgnoreCase))
return true; return true;
} }
return false; return false;

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

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

Loading…
Cancel
Save