diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Document/TextDocument.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Document/TextDocument.cs
index 2bc060ab8e..37ff1f7270 100644
--- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Document/TextDocument.cs
+++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Document/TextDocument.cs
@@ -5,10 +5,10 @@ using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
+using System.ComponentModel.Design;
using System.Diagnostics;
using System.Globalization;
using System.Threading;
-
using ICSharpCode.AvalonEdit.Utils;
using ICSharpCode.Editor;
@@ -440,6 +440,21 @@ namespace ICSharpCode.AvalonEdit.Document
///
///
public event EventHandler UpdateFinished;
+
+ void IDocument.StartUndoableAction()
+ {
+ BeginUpdate();
+ }
+
+ void IDocument.EndUndoableAction()
+ {
+ EndUpdate();
+ }
+
+ IDisposable IDocument.OpenUndoGroup()
+ {
+ return RunUpdate();
+ }
#endregion
#region Fire events after update
@@ -897,19 +912,36 @@ namespace ICSharpCode.AvalonEdit.Document
throw new NotImplementedException();
}
- void IDocument.StartUndoableAction()
- {
- throw new NotImplementedException();
- }
+ #region Service Provider
+ IServiceProvider serviceProvider;
- void IDocument.EndUndoableAction()
- {
- throw new NotImplementedException();
+ ///
+ /// Gets/Sets the service provider associated with this document.
+ /// By default, every TextDocument has its own ServiceContainer; and has the document itself
+ /// registered as and .
+ ///
+ public IServiceProvider ServiceProvider {
+ get {
+ VerifyAccess();
+ if (serviceProvider == null) {
+ var container = new ServiceContainer();
+ container.AddService(typeof(IDocument), this);
+ container.AddService(typeof(TextDocument), this);
+ }
+ return serviceProvider;
+ }
+ set {
+ VerifyAccess();
+ if (value == null)
+ throw new ArgumentNullException();
+ serviceProvider = value;
+ }
}
- IDisposable IDocument.OpenUndoGroup()
+ object IServiceProvider.GetService(Type serviceType)
{
- throw new NotImplementedException();
+ return this.ServiceProvider.GetService(serviceType);
}
+ #endregion
}
}
diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/TextView.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/TextView.cs
index ec4fe2ff9f..4101a270b1 100644
--- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/TextView.cs
+++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/TextView.cs
@@ -1638,9 +1638,18 @@ namespace ICSharpCode.AvalonEdit.Rendering
get { return services; }
}
- object IServiceProvider.GetService(Type serviceType)
+ ///
+ /// Retrieves a service from the text view.
+ /// If the service is not found in the container,
+ /// this method will also look for it in the current document's service provider.
+ ///
+ public object GetService(Type serviceType)
{
- return services.GetService(serviceType);
+ object instance = services.GetService(serviceType);
+ if (instance == null && document != null) {
+ instance = document.ServiceProvider.GetService(serviceType);
+ }
+ return instance;
}
void ConnectToTextView(object obj)
diff --git a/src/Libraries/NRefactory/ICSharpCode.Editor/IDocument.cs b/src/Libraries/NRefactory/ICSharpCode.Editor/IDocument.cs
index 71cc6f8acc..2e20ec1f65 100644
--- a/src/Libraries/NRefactory/ICSharpCode.Editor/IDocument.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.Editor/IDocument.cs
@@ -10,7 +10,7 @@ namespace ICSharpCode.Editor
/// Line and column counting starts at 1.
/// Offset counting starts at 0.
///
- public interface IDocument : ITextSource
+ public interface IDocument : ITextSource, IServiceProvider
{
///
/// Gets/Sets the text of the whole document..
diff --git a/src/Libraries/NRefactory/ICSharpCode.Editor/ReadOnlyDocument.cs b/src/Libraries/NRefactory/ICSharpCode.Editor/ReadOnlyDocument.cs
index 2cdb7556ac..27823a1d64 100644
--- a/src/Libraries/NRefactory/ICSharpCode.Editor/ReadOnlyDocument.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.Editor/ReadOnlyDocument.cs
@@ -312,8 +312,7 @@ namespace ICSharpCode.Editor
return textSource.IndexOfAny(anyOf, startIndex, count);
}
- ///
- public object GetService(Type serviceType)
+ object IServiceProvider.GetService(Type serviceType)
{
return null;
}