From 812d2ecbd59ad1c4c978c7f0b82095b3d7574824 Mon Sep 17 00:00:00 2001 From: Greg Munn Date: Thu, 25 Jul 2019 14:21:56 -0400 Subject: [ObjectValue] Some more refactoring to invert controller and view communication --- .../ObjectValue/Gtk/GtkObjectValueTreeView.cs | 25 ++++++++---------- .../ObjectValue/ObjectValueTreeViewController.cs | 30 ++++++++++++++++++++-- 2 files changed, 38 insertions(+), 17 deletions(-) (limited to 'main/src/addins') diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValue/Gtk/GtkObjectValueTreeView.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValue/Gtk/GtkObjectValueTreeView.cs index 8fad8a33e3..d24cb57222 100644 --- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValue/Gtk/GtkObjectValueTreeView.cs +++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValue/Gtk/GtkObjectValueTreeView.cs @@ -55,6 +55,7 @@ namespace MonoDevelop.Debugger new Gtk.TargetEntry ("text/plain;charset=utf-8", Gtk.TargetFlags.App, 0) }; + readonly IObjectValueDebuggerService debuggerService; readonly ObjectValueTreeViewController controller; // the root node @@ -75,7 +76,6 @@ namespace MonoDevelop.Debugger readonly TreeStore store; readonly string createMsg; bool restoringState; - StackFrame frame; bool disposed; bool columnsAdjusted; @@ -139,6 +139,7 @@ namespace MonoDevelop.Debugger } public GtkObjectValueTreeView ( + IObjectValueDebuggerService debuggerService, ObjectValueTreeViewController controller, bool allowEditing, bool headersVisible, @@ -802,7 +803,7 @@ namespace MonoDevelop.Debugger valPath = GetIterPath (parent) + "/" + name; if (val.IsUnknown) { - if (frame != null) { + if (debuggerService.Frame != null) { strval = GettextCatalog.GetString ("The name '{0}' does not exist in the current context.", val.Name); nameColor = Ide.Gui.Styles.ColorGetHex (Styles.ObjectValueTreeValueDisabledText); } else { @@ -1012,7 +1013,8 @@ namespace MonoDevelop.Debugger string strVal = null; if (val != null) { if (val.TypeName == "string") { - var opt = frame.DebuggerSession.Options.EvaluationOptions.Clone (); + // HACK: we need a better abstraction of the stack frame, better yet would be to not really need it in the view + var opt = debuggerService.Frame.GetStackFrame().DebuggerSession.Options.EvaluationOptions.Clone (); opt.EllipsizeStrings = false; strVal = '"' + Mono.Debugging.Evaluation.ExpressionEvaluator.EscapeString ((string)val.GetRawValue (opt)) + '"'; } else { @@ -1113,7 +1115,7 @@ namespace MonoDevelop.Debugger string expr = entry.Text.Substring (0, entry.CursorPosition); cts.Cancel (); cts = new CancellationTokenSource (); - currentCompletionData = await GetCompletionDataAsync (expr, cts.Token); + currentCompletionData = await debuggerService.GetCompletionDataAsync (expr, cts.Token); if (currentCompletionData != null) { var dataList = new DebugCompletionDataList (currentCompletionData); ctx = ((ICompletionWidget)this).CreateCodeCompletionContext (expr.Length - currentCompletionData.ExpressionLength); @@ -1334,7 +1336,7 @@ namespace MonoDevelop.Debugger bool clickProcessed = false; TreeIter it; - if (this.controller.CanQueryDebugger && evnt.Button == 1 && GetCellAtPos ((int)evnt.X, (int)evnt.Y, out path, out col, out cr) && store.GetIter (out it, path)) { + if (this.debuggerService.CanQueryDebugger && evnt.Button == 1 && GetCellAtPos ((int)evnt.X, (int)evnt.Y, out path, out col, out cr) && store.GetIter (out it, path)) { if (cr == crpViewer) { clickProcessed = true; var node = GetNodeAtIter (it); @@ -1518,7 +1520,8 @@ namespace MonoDevelop.Debugger if (type == "string") { var objVal = GetDebuggerObjectValueAtIter (iter); if (objVal != null) { - var opt = frame.DebuggerSession.Options.EvaluationOptions.Clone (); + // HACK: we need a better abstraction of the stack frame, better yet would be to not really need it in the view + var opt = debuggerService.Frame.GetStackFrame().DebuggerSession.Options.EvaluationOptions.Clone (); opt.EllipsizeStrings = false; value = '"' + Mono.Debugging.Evaluation.ExpressionEvaluator.EscapeString ((string)objVal.GetRawValue (opt)) + '"'; } @@ -1622,7 +1625,7 @@ namespace MonoDevelop.Debugger { base.OnRowActivated (path, column); - if (!controller.CanQueryDebugger) + if (!debuggerService.CanQueryDebugger) return; TreePath [] selected = Selection.GetSelectedRows (); @@ -1806,14 +1809,6 @@ namespace MonoDevelop.Debugger #endregion - async Task GetCompletionDataAsync (string expression, CancellationToken token) - { - if (controller.CanQueryDebugger && frame != null) - return await DebuggingService.GetCompletionDataAsync (frame, expression, token); - - return null; - } - internal void SetCustomFont (Pango.FontDescription font) { crpButton.FontDesc = crtExp.FontDesc = crtType.FontDesc = crtValue.FontDesc = font; diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValue/ObjectValueTreeViewController.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValue/ObjectValueTreeViewController.cs index 31c95a4aa2..f5f011b30d 100644 --- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValue/ObjectValueTreeViewController.cs +++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValue/ObjectValueTreeViewController.cs @@ -36,6 +36,16 @@ using MonoDevelop.Core; namespace MonoDevelop.Debugger { + public interface IObjectValueDebuggerService + { + bool CanQueryDebugger { get; } + IStackFrame Frame { get; } + Task GetCompletionDataAsync (string expression, CancellationToken token); + } + + + + /* * Issues? * @@ -43,7 +53,7 @@ namespace MonoDevelop.Debugger * refreshing a node (which may replace it's children nodes) * */ - public class ObjectValueTreeViewController + public class ObjectValueTreeViewController : IObjectValueDebuggerService { readonly CancellationTokenSource cancellationTokenSource = new CancellationTokenSource (); public const int MaxEnumerableChildrenToFetch = 20; @@ -188,11 +198,12 @@ namespace MonoDevelop.Debugger if (view != null) throw new InvalidOperationException ("You can only get the control once for each controller instance"); - view = new GtkObjectValueTreeView (this, AllowEditing, headersVisible, AllowWatchExpressions, compactView, allowPinning, allowPopupMenu, rootPinVisible) { + view = new GtkObjectValueTreeView (this, this, AllowEditing, headersVisible, AllowWatchExpressions, compactView, allowPinning, allowPopupMenu, rootPinVisible) { AllowExpanding = this.AllowExpanding, PinnedWatch = this.PinnedWatch, }; + view.NodeExpanded += OnViewNodeExpanded; view.NodeCollapsed += OnViewNodeCollapsed; view.NodeLoadMoreChildren += OnViewNodeLoadMoreChildren; @@ -214,6 +225,16 @@ namespace MonoDevelop.Debugger cancellationTokenSource.Cancel (); } + public async Task GetCompletionDataAsync (string expression, CancellationToken token) + { + if (CanQueryDebugger && Frame != null) { + // TODO: improve how we get at the underlying real stack frame + return await DebuggingService.GetCompletionDataAsync (Frame.GetStackFrame (), expression, token); + } + + return null; + } + /// /// Clears the controller of nodes and resets the root to a new empty node /// @@ -909,6 +930,11 @@ namespace MonoDevelop.Debugger return (controller.Frame as ProxyStackFrame)?.StackFrame; } + public static StackFrame GetStackFrame (this IStackFrame frame) + { + return (frame as ProxyStackFrame)?.StackFrame; + } + public static void AddValue (this ObjectValueTreeViewController controller, ObjectValue value) { controller.AddValue (new DebuggerObjectValueNode (value)); -- cgit v1.2.3