diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.addin b/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.addin
index 6124fdd18c..6a15121bb0 100644
--- a/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.addin
+++ b/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.addin
@@ -148,6 +148,9 @@
label="Code inspection"
class="CSharpBinding.Refactoring.IssueOptions"/>
+
diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj b/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj
index dc6723019d..b09c7a9735 100644
--- a/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj
+++ b/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj
@@ -89,6 +89,18 @@
+
+ CSharpFormattingEditor.xaml
+ Code
+
+
+ CSharpFormattingOptionPanel.xaml
+ Code
+
+
+ CSharpProjectFormattingOptions.xaml
+ Code
+
@@ -235,6 +247,9 @@
+
+
+
diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormattingStrategy/CSharpFormattingOptionsContainer.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormattingStrategy/CSharpFormattingOptionsContainer.cs
index 4613e417c5..25b247390b 100644
--- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormattingStrategy/CSharpFormattingOptionsContainer.cs
+++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormattingStrategy/CSharpFormattingOptionsContainer.cs
@@ -18,6 +18,7 @@
using System;
using System.Collections.Generic;
+using System.ComponentModel;
using System.Linq.Expressions;
using System.Reflection;
using ICSharpCode.NRefactory.CSharp;
@@ -28,33 +29,77 @@ namespace CSharpBinding.FormattingStrategy
/// Generic container for C# formatting options that can be chained together from general to specific and inherit
/// options from parent.
///
- public class CSharpFormattingOptionsContainer
+ public class CSharpFormattingOptionsContainer : INotifyPropertyChanged
{
CSharpFormattingOptionsContainer parent;
- CSharpFormattingOptionsContainer child;
+ CSharpFormattingOptions cachedOptions;
- Dictionary options;
+ HashSet activeOptions;
internal CSharpFormattingOptionsContainer()
{
parent = null;
- child = null;
+ activeOptions = new HashSet();
+ cachedOptions = FormattingOptionsFactory.CreateEmpty();
+ }
+
+ internal CSharpFormattingOptionsContainer(CSharpFormattingOptions options)
+ {
+ parent = null;
+ activeOptions = new HashSet();
- options = new Dictionary();
+ cachedOptions = options;
+ // Activate all options
+ foreach (var property in typeof(CSharpFormattingOptions).GetProperties()) {
+ activeOptions.Add(property.Name);
+ }
}
- public CSharpFormattingOptionsContainer Child
+ public CSharpFormattingOptionsContainer Parent
{
get
{
- return child;
+ return parent;
}
set
{
- if (child != null) {
- child.parent = this;
+ if (parent != null) {
+ parent.PropertyChanged += HandlePropertyChanged;
+ }
+ parent = value;
+ parent.PropertyChanged += HandlePropertyChanged;
+ cachedOptions = CreateOptions();
+ OnPropertyChanged("Parent");
+ }
+ }
+
+ #region INotifyPropertyChanged implementation
+
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ private void OnPropertyChanged(string propertyName)
+ {
+ if (PropertyChanged != null) {
+ PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+ }
+ }
+
+ #endregion
+
+ private void HandlePropertyChanged(object sender, PropertyChangedEventArgs e)
+ {
+ if (e.PropertyName == "Parent") {
+ // Parent of parent has been updated, recreate options object
+ cachedOptions = CreateOptions();
+ } else {
+ // Some other property has changed, check if we have our own value for it
+ if (!activeOptions.Contains(e.PropertyName)) {
+ // We rely on property value from some of the parents and have to update it from there
+ PropertyInfo propertyInfo = typeof(CSharpFormattingOptions).GetProperty(e.PropertyName);
+ if (propertyInfo != null) {
+ propertyInfo.SetValue(cachedOptions, GetOption