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-11-26 18:50:37 +0300
committerGitHub <noreply@github.com>2019-11-26 18:50:37 +0300
commit41d6410fe5e80283612d4ceac04d21dd71e1e7d6 (patch)
tree5cb98082e42abbab771e63df29c63c435753b937
parent37234f136d079b42e5deef1ca8f1f24628c73314 (diff)
parent261a2adac99e0d8b8a98ff15452d8fb93916ec04 (diff)
Merge pull request #9355 from mono/jstedfast-debugger-load-children-incrementally
[Debugger] Incrementally load new children rather than remove-all and…
-rw-r--r--main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/LocalsPad.cs33
-rw-r--r--main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValue/Mac/MacObjectValueTreeView.cs14
-rw-r--r--main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValue/Mac/MacObjectValueTreeViewDataSource.cs79
-rw-r--r--main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValue/ObjectValueTreeViewController.cs13
4 files changed, 92 insertions, 47 deletions
diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/LocalsPad.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/LocalsPad.cs
index 00e893bf9e..97cf84202a 100644
--- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/LocalsPad.cs
+++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/LocalsPad.cs
@@ -25,12 +25,36 @@
//
//
+using System;
+
using Mono.Debugging.Client;
namespace MonoDevelop.Debugger
{
public class LocalsPad : ObjectValuePad
{
+ static readonly bool EnableFakeNodes;
+
+ static LocalsPad ()
+ {
+ var env = Environment.GetEnvironmentVariable ("VSMAC_DEBUGGER_TESTING");
+
+ if (!string.IsNullOrEmpty (env)) {
+ var options = env.Split (new char [] { ',' });
+
+ for (int i = 0; i < options.Length; i++) {
+ var option = options[i].Trim ();
+
+ if (option == "fake-locals") {
+ EnableFakeNodes = true;
+ return;
+ }
+ }
+ }
+
+ EnableFakeNodes = false;
+ }
+
public LocalsPad ()
{
if (UseNewTreeView) {
@@ -41,7 +65,6 @@ namespace MonoDevelop.Debugger
}
}
-#if ADD_FAKE_NODES
void AddFakeNodes ()
{
var xx = new System.Collections.Generic.List<ObjectValueNode> ();
@@ -60,7 +83,6 @@ namespace MonoDevelop.Debugger
controller.AddValues (xx);
}
-#endif
void ReloadValues ()
{
@@ -84,9 +106,10 @@ namespace MonoDevelop.Debugger
} finally {
_treeview.EndUpdates ();
}
-#if ADD_FAKE_NODES
- AddFakeNodes ();
-#endif
+
+
+ if (EnableFakeNodes)
+ AddFakeNodes ();
} else {
tree.ClearValues ();
tree.AddValues (locals);
diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValue/Mac/MacObjectValueTreeView.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValue/Mac/MacObjectValueTreeView.cs
index defc2afe67..c3607d30e2 100644
--- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValue/Mac/MacObjectValueTreeView.cs
+++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValue/Mac/MacObjectValueTreeView.cs
@@ -348,19 +348,13 @@ namespace MonoDevelop.Debugger
public override void ExpandItem (NSObject item, bool expandChildren)
{
- NSAnimationContext.BeginGrouping ();
- NSAnimationContext.CurrentContext.Duration = 0;
base.ExpandItem (item, expandChildren);
- NSAnimationContext.EndGrouping ();
OptimizeColumnSizes ();
}
public override void ExpandItem (NSObject item)
{
- NSAnimationContext.BeginGrouping ();
- NSAnimationContext.CurrentContext.Duration = 0;
base.ExpandItem (item);
- NSAnimationContext.EndGrouping ();
OptimizeColumnSizes ();
}
@@ -376,19 +370,13 @@ namespace MonoDevelop.Debugger
public override void CollapseItem (NSObject item, bool collapseChildren)
{
- NSAnimationContext.BeginGrouping ();
- NSAnimationContext.CurrentContext.Duration = 0;
base.CollapseItem (item, collapseChildren);
- NSAnimationContext.EndGrouping ();
OptimizeColumnSizes ();
}
public override void CollapseItem (NSObject item)
{
- NSAnimationContext.BeginGrouping ();
- NSAnimationContext.CurrentContext.Duration = 0;
base.CollapseItem (item);
- NSAnimationContext.EndGrouping ();
OptimizeColumnSizes ();
}
@@ -551,7 +539,7 @@ namespace MonoDevelop.Debugger
if (disposed)
return;
- dataSource.ReloadChildren (node);
+ dataSource.LoadChildren (node, startIndex, count);
OptimizeColumnSizes ();
}
diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValue/Mac/MacObjectValueTreeViewDataSource.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValue/Mac/MacObjectValueTreeViewDataSource.cs
index 8a4c282cfe..f3d89fd23f 100644
--- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValue/Mac/MacObjectValueTreeViewDataSource.cs
+++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValue/Mac/MacObjectValueTreeViewDataSource.cs
@@ -89,7 +89,10 @@ namespace MonoDevelop.Debugger
var value = new MacObjectValueNode (parent, node);
mapping[node] = value;
- parent.Children.Insert (index, value);
+ if (index < parent.Children.Count)
+ parent.Children.Insert (index, value);
+ else
+ parent.Children.Add (value);
if (treeView.AllowExpanding) {
foreach (var child in node.Children)
@@ -181,7 +184,7 @@ namespace MonoDevelop.Debugger
removed[i].Dispose ();
}
- public void ReloadChildren (ObjectValueNode node)
+ public void LoadChildren (ObjectValueNode node, int startIndex, int count)
{
if (!TryGetValue (node, out var parent))
return;
@@ -189,36 +192,66 @@ namespace MonoDevelop.Debugger
treeView.BeginUpdates ();
try {
- NSIndexSet indexes;
+ int lastIndex = parent.Children.Count - 1;
+ bool needShowMore = !node.ChildrenLoaded;
+ bool haveShowMore = false;
+ NSIndexSet indexes = null;
NSRange range;
- if (parent.Children.Count > 0) {
- range = new NSRange (0, parent.Children.Count);
- indexes = NSIndexSet.FromNSRange (range);
+ if (lastIndex >= 0 && parent.Children[lastIndex].Target is ShowMoreValuesObjectValueNode)
+ haveShowMore = true;
+ if (startIndex < parent.Children.Count) {
+ // Note: This can only happen if we have either a "Loading..." node or a "Show More" node.
var removed = new List<MacObjectValueNode> ();
- foreach (var child in parent.Children)
- Remove (child, removed);
-
- parent.Children.Clear ();
-
- if (parent.Target is RootObjectValueNode)
- treeView.RemoveItems (indexes, null, NSTableViewAnimation.None);
- else
- treeView.RemoveItems (indexes, parent, NSTableViewAnimation.None);
-
- for (int i = 0; i < removed.Count; i++)
- removed[i].Dispose ();
+ int extra = parent.Children.Count - startIndex;
+
+ if (lastIndex == 0 && parent.Children[0].Target is LoadingObjectValueNode) {
+ // Remove the "Loading..." node
+ indexes = NSIndexSet.FromIndex (0);
+ Remove (parent.Children[0], removed);
+ parent.Children.Clear ();
+ } else if (haveShowMore && extra == 1) {
+ // Only remove the "Show More" node if we don't need it anymore...
+ if (!needShowMore) {
+ indexes = NSIndexSet.FromIndex (lastIndex);
+ Remove (parent.Children[lastIndex], removed);
+ parent.Children.RemoveAt (lastIndex);
+ }
+ } else {
+ // Unexpected, but let's try to deal with this...
+ range = new NSRange (startIndex, extra);
+ indexes = NSIndexSet.FromNSRange (range);
+
+ for (int i = parent.Children.Count - 1; i >= startIndex; i--) {
+ Remove (parent.Children[i], removed);
+ parent.Children.RemoveAt (i);
+ }
+
+ haveShowMore = false;
+ }
+
+ if (indexes != null) {
+ if (parent.Target is RootObjectValueNode)
+ treeView.RemoveItems (indexes, null, NSTableViewAnimation.None);
+ else
+ treeView.RemoveItems (indexes, parent, NSTableViewAnimation.None);
+
+ for (int i = 0; i < removed.Count; i++)
+ removed[i].Dispose ();
+ }
}
- for (int i = 0; i < node.Children.Count; i++)
- Add (parent, node.Children[i]);
+ for (int i = startIndex; i < startIndex + count; i++)
+ Insert (parent, i, node.Children[i]);
- // if we did not load all the children, add a Show More node
- if (!node.ChildrenLoaded)
+ // Add a "Show More" node only if we need one and don't already have one.
+ if (needShowMore && !haveShowMore) {
Add (parent, new ShowMoreValuesObjectValueNode (node));
+ count++;
+ }
- range = new NSRange (0, parent.Children.Count);
+ range = new NSRange (startIndex, count);
indexes = NSIndexSet.FromNSRange (range);
if (parent.Target is RootObjectValueNode)
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 0183375d4f..614204b8cc 100644
--- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValue/ObjectValueTreeViewController.cs
+++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/ObjectValue/ObjectValueTreeViewController.cs
@@ -670,21 +670,22 @@ namespace MonoDevelop.Debugger
node.IsExpanded = true;
- int loadedCount = 0;
+ int index = node.Children.Count;
+ int count = 0;
+
if (node.IsEnumerable) {
// if we already have some loaded, don't load more - that is a specific user gesture
- if (node.Children.Count == 0) {
+ if (index == 0) {
// page the children in, instead of loading them all at once
- loadedCount = await FetchChildrenAsync (node, MaxEnumerableChildrenToFetch, cancellationTokenSource.Token);
+ count = await FetchChildrenAsync (node, MaxEnumerableChildrenToFetch, cancellationTokenSource.Token);
}
} else {
- loadedCount = await FetchChildrenAsync (node, 0, cancellationTokenSource.Token);
+ count = await FetchChildrenAsync (node, -1, cancellationTokenSource.Token);
}
await Runtime.RunInMainThread (() => {
// tell the view about the children, even if there are, in fact, none
- view.LoadNodeChildren (node, 0, node.Children.Count);
-
+ view.LoadNodeChildren (node, index, count);
view.OnNodeExpanded (node);
});
}