diff options
author | Lluis Sanchez <lluis@xamarin.com> | 2013-08-22 19:12:24 +0400 |
---|---|---|
committer | Lluis Sanchez <lluis@xamarin.com> | 2013-08-22 19:15:59 +0400 |
commit | f3c24797b1d6a5be2270b72223b8522b0e7115a1 (patch) | |
tree | 19bf49d0843cc6ae4a7747b53436084b692a2b7a /main/src | |
parent | 5a366906d6b730e80e2c6c0223bcb470227ce8dc (diff) |
[Debugger] Add support for "default" visualizers
Diffstat (limited to 'main/src')
7 files changed, 230 insertions, 49 deletions
diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Visualizer/CStringVisualizer.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Visualizer/CStringVisualizer.cs index 48c210687c..0286f4c8cb 100644 --- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Visualizer/CStringVisualizer.cs +++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Visualizer/CStringVisualizer.cs @@ -34,7 +34,7 @@ using MonoDevelop.Core; namespace MonoDevelop.Debugger.Visualizer { - public class CStringVisualizer : IValueVisualizer + public class CStringVisualizer : ValueVisualizer { TextView textView; @@ -42,11 +42,11 @@ namespace MonoDevelop.Debugger.Visualizer { } - public string Name { + public override string Name { get { return GettextCatalog.GetString ("C String"); } } - public bool CanVisualize (ObjectValue val) + public override bool CanVisualize (ObjectValue val) { switch (val.TypeName) { case "sbyte[]": return true; @@ -116,7 +116,7 @@ namespace MonoDevelop.Debugger.Visualizer textView.Buffer.Insert (ref iter, text); } - public Widget GetVisualizerWidget (ObjectValue val) + public override Widget GetVisualizerWidget (ObjectValue val) { textView = new TextView () { WrapMode = WrapMode.Char }; @@ -145,15 +145,5 @@ namespace MonoDevelop.Debugger.Visualizer return box; } - - public bool StoreValue (ObjectValue val) - { - return false; - } - - public bool CanEdit (ObjectValue val) - { - return false; - } } } diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Visualizer/IValueVisualizer.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Visualizer/IValueVisualizer.cs index 8c5f827978..a83810bf4e 100644 --- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Visualizer/IValueVisualizer.cs +++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Visualizer/IValueVisualizer.cs @@ -29,6 +29,7 @@ using Mono.Debugging.Client; namespace MonoDevelop.Debugger { + [Obsolete ("Please use the ValueVisualizer class")] public interface IValueVisualizer { /// <summary> @@ -106,5 +107,48 @@ namespace MonoDevelop.Debugger /// </remarks> bool CanEdit (ObjectValue val); } + + class ValueVisualizerWrapper: ValueVisualizer + { +#pragma warning disable 618 + IValueVisualizer wrapped; + + public ValueVisualizerWrapper (IValueVisualizer wrapped) + { + this.wrapped = wrapped; + } +#pragma warning restore 618 + + public override bool CanVisualize (ObjectValue val) + { + return wrapped.CanVisualize (val); + } + + public override Gtk.Widget GetVisualizerWidget (ObjectValue val) + { + return wrapped.GetVisualizerWidget (val); + } + + public override string Name { + get { + return wrapped.Name; + } + } + + public override bool CanEdit (ObjectValue val) + { + return wrapped.CanEdit (val); + } + + public override bool IsDefaultVisualizer (ObjectValue val) + { + return false; + } + + public override bool StoreValue (ObjectValue val) + { + return wrapped.StoreValue (val); + } + } } diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Visualizer/PixbufVisualizer.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Visualizer/PixbufVisualizer.cs index d637512ba8..1937ffc3e1 100644 --- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Visualizer/PixbufVisualizer.cs +++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Visualizer/PixbufVisualizer.cs @@ -30,20 +30,20 @@ using Mono.Debugging.Client; namespace MonoDevelop.Debugger.Visualizer { - public class PixbufVisualizer: IValueVisualizer + public class PixbufVisualizer: ValueVisualizer { #region IValueVisualizer implementation - public bool CanVisualize (ObjectValue val) + public override bool CanVisualize (ObjectValue val) { return val.TypeName == "Gdk.Pixbuf"; } - - public bool CanEdit (ObjectValue val) + + public override bool IsDefaultVisualizer (ObjectValue val) { - return false; + return true; } - public Gtk.Widget GetVisualizerWidget (ObjectValue val) + public override Gtk.Widget GetVisualizerWidget (ObjectValue val) { Gdk.Pixbuf pixbuf; string file = Path.GetTempFileName (); @@ -63,15 +63,8 @@ namespace MonoDevelop.Debugger.Visualizer sc.ShowAll (); return sc; } - - - public bool StoreValue (ObjectValue val) - { - return true; - } - - - public string Name { + + public override string Name { get { return "Pixbuf"; } diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Visualizer/TextVisualizer.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Visualizer/TextVisualizer.cs index 8b7fb31388..0159eb4db8 100644 --- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Visualizer/TextVisualizer.cs +++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Visualizer/TextVisualizer.cs @@ -35,7 +35,7 @@ using MonoDevelop.Core; namespace MonoDevelop.Debugger.Visualizer { - public class TextVisualizer: IValueVisualizer + public class TextVisualizer: ValueVisualizer { const int CHUNK_SIZE = 1024; @@ -50,11 +50,11 @@ namespace MonoDevelop.Debugger.Visualizer { } - public string Name { + public override string Name { get { return GettextCatalog.GetString ("Text"); } } - public bool CanVisualize (ObjectValue val) + public override bool CanVisualize (ObjectValue val) { switch (val.TypeName) { case "char[]": return true; @@ -62,6 +62,11 @@ namespace MonoDevelop.Debugger.Visualizer default: return false; } } + + public override bool IsDefaultVisualizer (ObjectValue val) + { + return true; + } bool GetNextStringChunk () { @@ -118,7 +123,7 @@ namespace MonoDevelop.Debugger.Visualizer } } - public Widget GetVisualizerWidget (ObjectValue val) + public override Widget GetVisualizerWidget (ObjectValue val) { textView = new TextView () { WrapMode = WrapMode.Char }; @@ -150,7 +155,7 @@ namespace MonoDevelop.Debugger.Visualizer return box; } - public bool StoreValue (ObjectValue val) + public override bool StoreValue (ObjectValue val) { switch (val.TypeName) { case "char[]": @@ -164,7 +169,7 @@ namespace MonoDevelop.Debugger.Visualizer } } - public bool CanEdit (ObjectValue val) + public override bool CanEdit (ObjectValue val) { switch (val.TypeName) { case "char[]": return true; diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Visualizer/ValueVisualizer.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Visualizer/ValueVisualizer.cs new file mode 100644 index 0000000000..d8eb850f96 --- /dev/null +++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Visualizer/ValueVisualizer.cs @@ -0,0 +1,133 @@ +// +// ValueVisualizer.cs +// +// Author: +// Lluis Sanchez <lluis@xamarin.com> +// +// Copyright (c) 2013 Xamarin Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +using System; +using Mono.Debugging.Client; + +namespace MonoDevelop.Debugger +{ + public abstract class ValueVisualizer + { + /// <summary> + /// Display name of the visualizer + /// </summary> + /// <remarks> + /// This name is shown in a combo box at the top of the visualizer dialog when + /// there is more than one visualizer available for a value + /// </remarks> + public abstract string Name { get; } + + /// <summary> + /// Determines whether this instance can visualize the specified value + /// </summary> + /// <returns> + /// <c>true</c> if this instance can visualize the specified value; otherwise, <c>false</c>. + /// </returns> + /// <param name='val'> + /// The value + /// </param> + /// <remarks> + /// This method must check the value and return <c>true</c> if it is able to display that value. + /// Typically, this method will check the TypeName of the value. + /// </remarks> + public abstract bool CanVisualize (ObjectValue val); + + /// <summary> + /// Determines whether this instance is the default visualizer for the specified value + /// </summary> + /// <returns> + /// <c>true</c> if this instance is the default visualizer for the specified value; otherwise, <c>false</c>. + /// </returns> + /// <param name='val'> + /// The value + /// </param> + /// <remarks> + /// The default visualizer will be selected by default in the visualizer dialog + /// </remarks> + public virtual bool IsDefaultVisualizer (ObjectValue val) + { + return false; + } + + /// <summary> + /// Gets a visualizer widget for a value + /// </summary> + /// <returns> + /// The visualizer widget. + /// </returns> + /// <param name='val'> + /// A value + /// </param> + /// <remarks> + /// This method is called to get a widget for displaying the specified value. + /// The method should create the widget and load the required information from + /// the value. Notice that the ObjectValue.Value property returns a string + /// representation of the value. If the visualizer needs to get values from + /// the object properties, it can use the ObjectValue.GetRawValue method. + /// </remarks> + public abstract Gtk.Widget GetVisualizerWidget (ObjectValue val); + + /// <summary> + /// Saves changes done in the visualizer + /// </summary> + /// <returns> + /// <c>true</c> if the changes could be saved + /// </returns> + /// <param name='val'> + /// The value on which to store changes + /// </param> + /// <remarks> + /// This method is called to save changes done in the visualizer. + /// The implementation should use ObjectValue.SetRawValue to store the changes. + /// This method is only called if CanEdit returns <c>true</c>. + /// </remarks> + public virtual bool StoreValue (ObjectValue val) + { + return false; + } + + /// <summary> + /// Determines whether this instance supports editing the specified value + /// </summary> + /// <returns> + /// <c>true</c> if this instance can edit the specified value; otherwise, <c>false</c>. + /// </returns> + /// <param name='val'> + /// The value + /// </param> + /// <remarks> + /// This method is called to determine if this visualizer supports value editing, + /// in addition to visualization. + /// The method is called only if CanVisualize returns <c>true</c> for the value, and + /// if the value doesn't have the ReadOnly flag. + /// Editing support is optional. The default implementation returns <c>false</c>. + /// </remarks> + public virtual bool CanEdit (ObjectValue val) + { + return false; + } + } +} + diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Visualizer/ValueVisualizerDialog.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Visualizer/ValueVisualizerDialog.cs index 0b8b2bc933..ab85147757 100644 --- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Visualizer/ValueVisualizerDialog.cs +++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.Visualizer/ValueVisualizerDialog.cs @@ -33,9 +33,9 @@ namespace MonoDevelop.Debugger.Viewers { public partial class ValueVisualizerDialog : Gtk.Dialog { - List<IValueVisualizer> visualizers; + List<ValueVisualizer> visualizers; Gtk.Widget currentWidget; - IValueVisualizer currentVisualizer; + ValueVisualizer currentVisualizer; ObjectValue value; public ValueVisualizerDialog () @@ -46,13 +46,20 @@ namespace MonoDevelop.Debugger.Viewers public void Show (ObjectValue val) { value = val; - visualizers = new List<IValueVisualizer> (DebuggingService.GetValueVisualizers (val)); - visualizers.Sort (delegate (IValueVisualizer v1, IValueVisualizer v2) { + visualizers = new List<ValueVisualizer> (DebuggingService.GetValueVisualizers (val)); + visualizers.Sort (delegate (ValueVisualizer v1, ValueVisualizer v2) { return v1.Name.CompareTo (v2.Name); }); - foreach (IValueVisualizer vis in visualizers) + + int defaultVis = 0; + int n = 0; + foreach (ValueVisualizer vis in visualizers) { comboVisualizers.AppendText (vis.Name); - comboVisualizers.Active = 0; + if (vis.IsDefaultVisualizer (val)) + defaultVis = n; + n++; + } + comboVisualizers.Active = defaultVis; if (val.IsReadOnly || !visualizers.Where (v => v.CanEdit (val)).Any ()) { buttonCancel.Hide (); buttonOk.Label = Gtk.Stock.Close; diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggingService.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggingService.cs index 1de15dbfdd..7d7f330baf 100644 --- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggingService.cs +++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggingService.cs @@ -46,6 +46,7 @@ using ICSharpCode.NRefactory.Semantics; * exceptions, now we error out silently, this needs a real solution. */ using MonoDevelop.Ide.TextEditing; +using System.Linq; namespace MonoDevelop.Debugger { @@ -184,19 +185,27 @@ namespace MonoDevelop.Debugger } } - internal static IEnumerable<IValueVisualizer> GetValueVisualizers (ObjectValue val) + internal static IEnumerable<ValueVisualizer> GetValueVisualizers (ObjectValue val) { - foreach (IValueVisualizer v in AddinManager.GetExtensionObjects ("/MonoDevelop/Debugging/ValueVisualizers", false)) - if (v.CanVisualize (val)) - yield return v; + foreach (object v in AddinManager.GetExtensionObjects ("/MonoDevelop/Debugging/ValueVisualizers", false)) { + if (v is ValueVisualizer) { + var vv = (ValueVisualizer)v; + if (vv.CanVisualize (val)) + yield return vv; + } +#pragma warning disable 618 + if (v is IValueVisualizer) { + var vv = (IValueVisualizer)v; + if (vv.CanVisualize (val)) + yield return new ValueVisualizerWrapper (vv); + } +#pragma warning restore 618 + } } internal static bool HasValueVisualizers (ObjectValue val) { - foreach (IValueVisualizer v in AddinManager.GetExtensionObjects ("/MonoDevelop/Debugging/ValueVisualizers", false)) - if (v.CanVisualize (val)) - return true; - return false; + return GetValueVisualizers (val).Any (); } public static void ShowValueVisualizer (ObjectValue val) |