Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg Munn <gregm@microsoft.com>2019-07-25 21:21:56 +0300
committerGreg Munn <gregm@microsoft.com>2019-07-25 21:21:56 +0300
commit812d2ecbd59ad1c4c978c7f0b82095b3d7574824 (patch)
treef0cb81eef628676c1ff3f360b10c17c0a4b1def3 /main/src/addins
parent078fddba50e186a770c11090cf9fd099f0493d89 (diff)
[ObjectValue] Some more refactoring to invert controller and view communication
Diffstat (limited to 'main/src/addins')
-rw-r--r--main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValue/Gtk/GtkObjectValueTreeView.cs25
-rw-r--r--main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValue/ObjectValueTreeViewController.cs30
2 files changed, 38 insertions, 17 deletions
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<Mono.Debugging.Client.CompletionData> 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<Mono.Debugging.Client.CompletionData> 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<Mono.Debugging.Client.CompletionData> 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;
+ }
+
/// <summary>
/// Clears the controller of nodes and resets the root to a new empty node
/// </summary>
@@ -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));