From d75b2d4a9453fb050c5085b998f2ab9cb7ea9f3f Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Fri, 16 Oct 2009 15:01:52 +0000 Subject: [PATCH] Started work on new text editor options. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@5073 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- AddIns/ICSharpCode.SharpDevelop.addin | 23 ++------ .../AvalonEdit.AddIn/AvalonEdit.AddIn.addin | 17 ++++++ .../AvalonEdit.AddIn/AvalonEdit.AddIn.csproj | 15 ++++++ .../AvalonEdit.AddIn/Src/CodeEditor.cs | 4 -- .../AvalonEdit.AddIn/Src/CodeEditorView.cs | 1 + .../Src/Options/BehaviorOptions.xaml | 38 +++++++++++++ .../Src/Options/BehaviorOptions.xaml.cs | 32 +++++++++++ .../Src/Options/CodeEditorOptions.cs | 32 +++++++++++ .../Src/Options/GeneralEditorOptions.xaml | 20 +++++++ .../Src/Options/GeneralEditorOptions.xaml.cs | 32 +++++++++++ .../OptionBinding.cs | 54 ++++++++++++++----- 11 files changed, 234 insertions(+), 34 deletions(-) create mode 100644 src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/BehaviorOptions.xaml create mode 100644 src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/BehaviorOptions.xaml.cs create mode 100644 src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/CodeEditorOptions.cs create mode 100644 src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/GeneralEditorOptions.xaml create mode 100644 src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/GeneralEditorOptions.xaml.cs diff --git a/AddIns/ICSharpCode.SharpDevelop.addin b/AddIns/ICSharpCode.SharpDevelop.addin index f4109fc880..470f37d11d 100644 --- a/AddIns/ICSharpCode.SharpDevelop.addin +++ b/AddIns/ICSharpCode.SharpDevelop.addin @@ -1926,24 +1926,11 @@ class = "ICSharpCode.SharpDevelop.BrowserDisplayBinding.NewWindow"/> - - - - - - - + + diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.addin b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.addin index dcd36be26d..22a74391ad 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.addin +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.addin @@ -81,4 +81,21 @@ label = "${res:Dialog.Options.CodeTemplatesText}" class = "ICSharpCode.AvalonEdit.AddIn.Snippets.SnippetOptionPanel"/> + + + + + + + + diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj index 2564f6f2f4..c0643399b3 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj @@ -55,6 +55,9 @@ 3.0 + + 3.0 + @@ -78,6 +81,15 @@ + + BehaviorOptions.xaml + Code + + + GeneralEditorOptions.xaml + Code + + @@ -97,6 +109,7 @@ + {6C55B776-26D4-4DB3-A6AB-87E783B2F3D1} @@ -129,6 +142,8 @@ False + + SnippetOptionPanel.cs diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs index 590b6fbfd5..eaccd6f245 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs @@ -144,9 +144,6 @@ namespace ICSharpCode.AvalonEdit.AddIn primaryTextEditorAdapter = (CodeEditorAdapter)primaryTextEditor.TextArea.GetService(typeof(ITextEditor)); Debug.Assert(primaryTextEditorAdapter != null); - // always support scrolling below the end of the document - it's better when folding is enabled - primaryTextEditor.Options.AllowScrollBelowDocument = true; - this.primaryBracketRenderer = new BracketHighlightRenderer(primaryTextEditor.TextArea.TextView); this.Document = primaryTextEditor.Document; @@ -248,7 +245,6 @@ namespace ICSharpCode.AvalonEdit.AddIn secondaryTextEditor.SetBinding(TextEditor.DocumentProperty, new Binding(TextEditor.DocumentProperty.Name) { Source = primaryTextEditor }); secondaryTextEditor.SyntaxHighlighting = primaryTextEditor.SyntaxHighlighting; - secondaryTextEditor.Options = primaryTextEditor.Options; gridSplitter = new GridSplitter { Height = 4, diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs index 98c5e3c171..cfba9ff987 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs @@ -37,6 +37,7 @@ namespace ICSharpCode.AvalonEdit.AddIn public CodeEditorView() { this.CommandBindings.Add(new CommandBinding(ApplicationCommands.Help, OnHelpExecuted)); + this.Options = ICSharpCode.AvalonEdit.AddIn.Options.CodeEditorOptions.Instance; this.MouseHover += TextEditorMouseHover; this.MouseHoverStopped += TextEditorMouseHoverStopped; diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/BehaviorOptions.xaml b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/BehaviorOptions.xaml new file mode 100644 index 0000000000..81e2dea366 --- /dev/null +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/BehaviorOptions.xaml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/BehaviorOptions.xaml.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/BehaviorOptions.xaml.cs new file mode 100644 index 0000000000..f33124da12 --- /dev/null +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/BehaviorOptions.xaml.cs @@ -0,0 +1,32 @@ +// +// +// +// +// $Revision$ +// + +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; + +using ICSharpCode.SharpDevelop.Gui; + +namespace ICSharpCode.AvalonEdit.AddIn.Options +{ + /// + /// Interaction logic for BehaviorOptions.xaml + /// + public partial class BehaviorOptions : OptionPanel + { + public BehaviorOptions() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/CodeEditorOptions.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/CodeEditorOptions.cs new file mode 100644 index 0000000000..4b3f474acb --- /dev/null +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/CodeEditorOptions.cs @@ -0,0 +1,32 @@ +// +// +// +// +// $Revision$ +// + +using System; +using System.ComponentModel; +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Gui; + +namespace ICSharpCode.AvalonEdit.AddIn.Options +{ + [Serializable] + public class CodeEditorOptions : TextEditorOptions + { + public static CodeEditorOptions Instance { + get { return PropertyService.Get("CodeEditorOptions", new CodeEditorOptions()); } + } + + // always support scrolling below the end of the document - it's better when folding is enabled + [DefaultValue(true)] + public override bool AllowScrollBelowDocument { + get { return true; } + set { + if (value == false) + throw new NotSupportedException(); + } + } + } +} diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/GeneralEditorOptions.xaml b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/GeneralEditorOptions.xaml new file mode 100644 index 0000000000..35df556068 --- /dev/null +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/GeneralEditorOptions.xaml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/GeneralEditorOptions.xaml.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/GeneralEditorOptions.xaml.cs new file mode 100644 index 0000000000..110e483248 --- /dev/null +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/GeneralEditorOptions.xaml.cs @@ -0,0 +1,32 @@ +// +// +// +// +// $Revision$ +// + +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; + +using ICSharpCode.SharpDevelop.Gui; + +namespace ICSharpCode.AvalonEdit.AddIn.Options +{ + /// + /// Interaction logic for GeneralEditorOptions.xaml + /// + public partial class GeneralEditorOptions : OptionPanel + { + public GeneralEditorOptions() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/src/Main/ICSharpCode.Core.Presentation/OptionBinding.cs b/src/Main/ICSharpCode.Core.Presentation/OptionBinding.cs index b51ebe6623..6cda10e7db 100644 --- a/src/Main/ICSharpCode.Core.Presentation/OptionBinding.cs +++ b/src/Main/ICSharpCode.Core.Presentation/OptionBinding.cs @@ -39,8 +39,10 @@ namespace ICSharpCode.Core.Presentation DependencyObject target; DependencyProperty dp; + bool isStatic; + Type propertyDeclaringType; - object propertyInfo; + MemberInfo propertyInfo; public OptionBinding(string propertyName) { @@ -65,9 +67,21 @@ namespace ICSharpCode.Core.Presentation string[] name = PropertyName.Split('.'); IXamlTypeResolver typeResolver = provider.GetService(typeof(IXamlTypeResolver)) as IXamlTypeResolver; - Type t = typeResolver.Resolve(name[0]); - - this.propertyInfo = t.GetProperty(name[1]); + propertyDeclaringType = typeResolver.Resolve(name[0]); + if (propertyDeclaringType == null) + throw new ArgumentException("Could not find type " + name[0]); + + this.propertyInfo = propertyDeclaringType.GetProperty(name[1]); + if (this.propertyInfo != null) { + isStatic = (propertyInfo as PropertyInfo).GetGetMethod().IsStatic; + } else { + this.propertyInfo = propertyDeclaringType.GetField(name[1]); + if (this.propertyInfo != null) { + isStatic = (propertyInfo as FieldInfo).IsStatic; + } else { + throw new ArgumentException("Could not find property " + name[1]); + } + } IOptionBindingContainer container = TryFindContainer(target as FrameworkElement); @@ -76,22 +90,37 @@ namespace ICSharpCode.Core.Presentation container.AddBinding(this); + object instance = isStatic ? null : FetchInstance(propertyDeclaringType); try { object result = null; - if (this.propertyInfo is PropertyInfo) - result = (propertyInfo as PropertyInfo).GetValue(null, null); - else { - this.propertyInfo = t.GetField(name[1]); + if (this.propertyInfo is PropertyInfo) { + result = (propertyInfo as PropertyInfo).GetValue(instance, null); + } else { if (this.propertyInfo is FieldInfo) - result = (propertyInfo as FieldInfo).GetValue(null); + result = (propertyInfo as FieldInfo).GetValue(instance); } return ConvertOnDemand(result, dp.PropertyType); } catch (Exception e) { - throw new Exception("Failing to convert " + dp.Name + " " + dp.PropertyType, e); + throw new Exception("Failing to convert " + this.PropertyName + " to " + + dp.OwnerType.Name + "." + dp.Name + " (" + dp.PropertyType + ")", e); } } + + /// + /// Gets the 'Instance' from a singleton type. + /// + static object FetchInstance(Type type) + { + PropertyInfo instanceProp = type.GetProperty("Instance", type); + if (instanceProp != null) + return instanceProp.GetValue(null, null); + FieldInfo instanceField = type.GetField("Instance"); + if (instanceField != null) + return instanceField.GetValue(null); + throw new ArgumentException("Type " + type.FullName + " has no 'Instance' property. Only singletons can be used with OptionBinding."); + } object ConvertOnDemand(object result, Type returnType) { @@ -138,13 +167,14 @@ namespace ICSharpCode.Core.Presentation value = ConvertOnDemand(value, returnType); + object instance = isStatic ? null : FetchInstance(propertyDeclaringType); if (propertyInfo is PropertyInfo) { - (propertyInfo as PropertyInfo).SetValue(null, value, null); + (propertyInfo as PropertyInfo).SetValue(instance, value, null); return true; } if (propertyInfo is FieldInfo) { - (propertyInfo as FieldInfo).SetValue(null, value); + (propertyInfo as FieldInfo).SetValue(instance, value); return true; }