Skip to content

Commit 0902cb4

Browse files
committed
Merge pull request #586 from Neverbirth/debugging_refresh
More debugging user experience improvements
2 parents 0107acf + fb4621c commit 0902cb4

File tree

11 files changed

+155
-68
lines changed

11 files changed

+155
-68
lines changed

External/3rdParty/Aga-1.7/Aga.Controls/Tree/TreeViewAdv.Properties.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,27 @@ internal int FirstVisibleRow
170170
}
171171
}
172172

173+
public TreeNodeAdv FirstVisibleNode
174+
{
175+
get
176+
{
177+
if (_firstVisibleRow >= 0 && _firstVisibleRow < RowMap.Count)
178+
return RowMap[_firstVisibleRow];
179+
return null;
180+
}
181+
}
182+
183+
public TreeNodeAdv LastVisibleNode
184+
{
185+
get
186+
{
187+
int lastVisibleRow = _firstVisibleRow + CurrentPageSize - 1;
188+
if (lastVisibleRow >= 0 && lastVisibleRow < RowMap.Count)
189+
return RowMap[lastVisibleRow];
190+
return null;
191+
}
192+
}
193+
173194
private int _offsetX;
174195
public int OffsetX
175196
{

External/Plugins/FlashDebugger/Controls/DataTreeControl.cs

Lines changed: 85 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public partial class DataTreeControl : UserControl, IToolTipProvider
2222
private static ViewerForm viewerForm;
2323
private ContextMenuStrip _contextMenuStrip;
2424
private ToolStripMenuItem copyMenuItem, viewerMenuItem, watchMenuItem;
25-
private List<String> expandedList = new List<String>();
25+
private DataTreeState state;
2626
private bool watchMode;
2727
private bool addingNewExpression;
2828

@@ -68,22 +68,25 @@ public DataTreeControl(bool watchMode)
6868
NameNodeTextBox.DrawText += NameNodeTextBox_DrawText;
6969
NameNodeTextBox.EditorShowing += NameNodeTextBox_EditorShowing;
7070
NameNodeTextBox.EditorHided += NameNodeTextBox_EditorHided;
71+
NameNodeTextBox.IsEditEnabledValueNeeded += NameNodeTextBox_IsEditEnabledValueNeeded;
7172
NameNodeTextBox.LabelChanged += NameNodeTextBox_LabelChanged;
73+
_tree.NodeMouseClick += Tree_NameNodeMouseClick;
7274
}
7375

7476
_model = new DataTreeModel();
7577
_tree.Model = _model;
78+
_tree.FullRowSelect = true;
7679
Controls.Add(_tree);
7780
_tree.Expanding += TreeExpanding;
7881
_tree.SelectionChanged += TreeSelectionChanged;
82+
_tree.NodeMouseDoubleClick += Tree_NodeMouseDoubleClick;
7983
_tree.LoadOnDemand = true;
8084
_tree.AutoRowHeight = true;
8185
ValueNodeTextBox.DrawText += ValueNodeTextBox_DrawText;
8286
ValueNodeTextBox.IsEditEnabledValueNeeded += ValueNodeTextBox_IsEditEnabledValueNeeded;
8387
ValueNodeTextBox.EditorShowing += ValueNodeTextBox_EditorShowing;
8488
ValueNodeTextBox.EditorHided += ValueNodeTextBox_EditorHided;
8589
ValueNodeTextBox.LabelChanged += ValueNodeTextBox_LabelChanged;
86-
_tree.NodeMouseDoubleClick += Tree_NodeMouseDoubleClick;
8790
_contextMenuStrip = new ContextMenuStrip();
8891
if (PluginBase.MainForm != null && PluginBase.Settings != null)
8992
{
@@ -97,13 +100,9 @@ public DataTreeControl(bool watchMode)
97100
viewerMenuItem = new ToolStripMenuItem(TextHelper.GetString("Label.Viewer"), null, new EventHandler(this.ViewerItemClick));
98101
_contextMenuStrip.Items.AddRange(new ToolStripMenuItem[] { copyMenuItem, viewerMenuItem});
99102
if (watchMode)
100-
{
101103
watchMenuItem = new ToolStripMenuItem(TextHelper.GetString("Label.Unwatch"), null, new EventHandler(this.WatchItemClick));
102-
}
103104
else
104-
{
105105
watchMenuItem = new ToolStripMenuItem(TextHelper.GetString("Label.Watch"), null, new EventHandler(this.WatchItemClick));
106-
}
107106
_contextMenuStrip.Items.Add(watchMenuItem);
108107
TreeSelectionChanged(null, null);
109108
viewerForm = new ViewerForm();
@@ -114,7 +113,7 @@ void NameNodeTextBox_DrawText(object sender, DrawEventArgs e)
114113
{
115114
try
116115
{
117-
if (e.Node.NextNode == null && !addingNewExpression)
116+
if (e.Node.NextNode == null && e.Node.Level == 1 && !addingNewExpression)
118117
{
119118
e.Font = new Font(e.Font, FontStyle.Italic);
120119
}
@@ -149,13 +148,18 @@ void NameNodeTextBox_EditorShowing(object sender, System.ComponentModel.CancelEv
149148
addingNewExpression = false;
150149
}
151150

151+
void NameNodeTextBox_IsEditEnabledValueNeeded(object sender, NodeControlValueEventArgs e)
152+
{
153+
e.Value = e.Node.Level == 1;
154+
}
155+
152156
void NameNodeTextBox_LabelChanged(object sender, LabelEventArgs e)
153157
{
154158
NodeTextBox box = sender as NodeTextBox;
155159
if (box.Parent.CurrentNode == null) return;
156160
DataNode node = box.Parent.CurrentNode.Tag as DataNode;
157161

158-
if (e.NewLabel.Trim() == "")
162+
if (e.NewLabel.Trim() == "" || e.NewLabel.Trim() == TextHelper.GetString("Label.AddExpression"))
159163
{
160164
node.Text = e.OldLabel != "" ? e.OldLabel : TextHelper.GetString("Label.AddExpression");
161165
return;
@@ -170,6 +174,16 @@ void NameNodeTextBox_LabelChanged(object sender, LabelEventArgs e)
170174
if (!newExp) node.Text = e.OldLabel;
171175
}
172176

177+
void Tree_NameNodeMouseClick(object sender, TreeNodeAdvMouseEventArgs e)
178+
{
179+
if (e.Node.Level == 1 && e.Control == NameNodeTextBox && !e.Node.CanExpand &&
180+
(Tree.SelectedNode == null || Tree.SelectedNode == e.Node))
181+
{
182+
NameNodeTextBox.BeginEdit();
183+
e.Handled = true;
184+
}
185+
}
186+
173187
void ValueNodeTextBox_LabelChanged(object sender, LabelEventArgs e)
174188
{
175189
NodeTextBox box = sender as NodeTextBox;
@@ -247,7 +261,6 @@ void ValueNodeTextBox_DrawText(object sender, DrawEventArgs e)
247261
public DataNode AddNode(DataNode node)
248262
{
249263
_model.Root.Nodes.Add(node);
250-
RestoreExpanded();
251264
return node;
252265
}
253266

@@ -262,13 +275,6 @@ public string GetFullPath(DataNode node)
262275
return _model.GetFullPath(node);
263276
}
264277

265-
public void Clear()
266-
{
267-
if (Nodes.Count > 0) SaveExpanded();
268-
Nodes.Clear();
269-
}
270-
271-
272278
private void CopyItemClick(Object sender, System.EventArgs e)
273279
{
274280
if (Tree.SelectedNode != null)
@@ -467,43 +473,81 @@ void Tree_NodeMouseDoubleClick(object sender, TreeNodeAdvMouseEventArgs e)
467473
}
468474
}
469475

470-
public void SaveExpanded()
476+
public void SaveState()
471477
{
472-
expandedList.Clear();
473-
SaveExpanded(Nodes);
478+
if (state == null) state = new DataTreeState();
479+
state.Selected = _tree.SelectedNode == null ? null : _model.GetFullPath(_tree.SelectedNode.Tag as Node);
480+
state.Expanded.Clear();
481+
if (Nodes != null && Nodes.Count > 0)
482+
SaveExpanded(Nodes);
483+
SaveScrollState();
474484
}
475485

476486
private void SaveExpanded(Collection<Node> nodes)
477487
{
478-
if (nodes == null) return;
479488
foreach (Node node in nodes)
480489
{
481-
if (Tree.FindNode(_model.GetPath(node)).IsExpanded)
490+
if (!node.IsLeaf && Tree.FindNode(_model.GetPath(node)).IsExpanded)
482491
{
483-
expandedList.Add(_model.GetFullPath(node));
484-
SaveExpanded(node.Nodes);
492+
state.Expanded.Add(_model.GetFullPath(node));
493+
if (node.Nodes.Count > 0)
494+
SaveExpanded(node.Nodes);
485495
}
486496
}
487497
}
488498

489-
public void RestoreExpanded()
499+
private void SaveScrollState()
500+
{
501+
if (Nodes.Count < 1)
502+
{
503+
state.TopPath = state.BottomPath = null;
504+
return;
505+
}
506+
var topNode = _tree.FirstVisibleNode;
507+
state.TopPath = topNode != null ? _model.GetFullPath(_tree.FirstVisibleNode.Tag as Node) : null;
508+
var bottomNode = _tree.LastVisibleNode;
509+
state.BottomPath = bottomNode != null ? _model.GetFullPath(bottomNode.Tag as Node) : null;
510+
}
511+
512+
public void RestoreState()
490513
{
491-
RestoreExpanded(Nodes);
514+
if (state == null) return;
515+
if (state.Expanded != null && state.Expanded.Count > 0)
516+
RestoreExpanded(Nodes);
517+
if (state.Selected != null)
518+
_tree.SelectedNode = _tree.FindNodeByTag(_model.FindNode(state.Selected));
519+
RestoreScrollState();
492520
}
493521

494522
private void RestoreExpanded(Collection<Node> nodes)
495523
{
496-
if (nodes == null) return;
497524
foreach (Node node in nodes)
498525
{
499-
if (expandedList.Contains(_model.GetFullPath(node)))
526+
if (!node.IsLeaf && state.Expanded.Contains(_model.GetFullPath(node)))
500527
{
501528
Tree.FindNode(_model.GetPath(node)).Expand();
502-
RestoreExpanded(node.Nodes);
529+
if (node.Nodes.Count > 0)
530+
RestoreExpanded(node.Nodes);
503531
}
504532
}
505533
}
506534

535+
private void RestoreScrollState()
536+
{
537+
if (Nodes.Count < 1) return;
538+
539+
if (state.BottomPath != null)
540+
{
541+
var bottomNode = Tree.FindNodeByTag(_model.FindNode(state.BottomPath));
542+
if (bottomNode != null) Tree.EnsureVisible(bottomNode);
543+
}
544+
545+
if (state.TopPath != null)
546+
{
547+
var topNode = Tree.FindNodeByTag(_model.FindNode(state.TopPath));
548+
if (topNode != null) Tree.EnsureVisible(topNode);
549+
}
550+
}
507551

508552
#region IToolTipProvider Members
509553

@@ -527,6 +571,19 @@ public string GetToolTip(TreeNodeAdv node, NodeControl nodeControl)
527571
}
528572

529573
#endregion
574+
575+
#region State Class
576+
577+
private class DataTreeState
578+
{
579+
580+
public HashSet<string> Expanded = new HashSet<String>();
581+
public string Selected;
582+
public string TopPath;
583+
public string BottomPath;
584+
}
585+
586+
#endregion
530587
}
531588

532589
}

External/Plugins/FlashDebugger/Controls/DataTreeModel.cs

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using Aga.Controls.Tree;
1+
using System.Text;
2+
using Aga.Controls.Tree;
23

34
namespace FlashDebugger.Controls
45
{
@@ -9,37 +10,41 @@ public class DataTreeModel : TreeModel
910
public string GetFullPath(Node node)
1011
{
1112
if (node == Root) return string.Empty;
12-
else
13+
14+
var path = new StringBuilder();
15+
while (node != Root && node != null)
1316
{
14-
string path = string.Empty;
15-
while (node != Root && node != null)
16-
{
17-
path = string.Format("{0}.{1}", node.Text, path);
18-
node = node.Parent;
19-
}
20-
return path.TrimEnd(chTrims);
17+
path.Insert(0, node.Text).Insert(node.Text.Length, ".");
18+
node = node.Parent;
2119
}
20+
if (path.Length > 0) path.Length--;
21+
22+
return path.ToString();
2223
}
2324

2425
public Node FindNode(string path)
2526
{
26-
if (path == string.Empty) return Root;
27-
else return FindNode(Root, path, 0);
27+
if (string.IsNullOrEmpty(path)) return Root;
28+
return FindNode(Root, path, new StringBuilder());
2829
}
2930

30-
private Node FindNode(Node root, string path, int level)
31+
private Node FindNode(Node root, string path, StringBuilder nodePath)
3132
{
33+
int initialLength = nodePath.Length;
3234
foreach (Node node in root.Nodes)
3335
{
34-
if (path == GetFullPath(node)) return node;
35-
else
36+
nodePath = nodePath.Append(node.Text);
37+
if (path == nodePath.ToString()) return node;
38+
nodePath.Append(".");
39+
if (path.StartsWith(nodePath.ToString()))
3640
{
3741
if (node.Nodes.Count > 0)
3842
{
39-
Node tmp = FindNode(node, path, level + 1);
43+
Node tmp = FindNode(node, path, nodePath);
4044
if (tmp != null) return tmp;
4145
}
4246
}
47+
else nodePath.Length = initialLength;
4348
}
4449
return null;
4550
}

External/Plugins/FlashDebugger/PluginUI.cs renamed to External/Plugins/FlashDebugger/Controls/LocalsUI.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@
77

88
namespace FlashDebugger
99
{
10-
class PluginUI : DockPanelControl
10+
class LocalsUI : DockPanelControl
1111
{
1212
private PluginMain pluginMain;
1313
private DataTreeControl treeControl;
1414
private static Char[] chTrims = { '.' };
1515

16-
public PluginUI(PluginMain pluginMain)
16+
public LocalsUI(PluginMain pluginMain)
1717
{
1818
this.pluginMain = pluginMain;
1919
this.treeControl = new DataTreeControl();
@@ -40,7 +40,7 @@ public DataTreeControl TreeControl
4040

4141
public void Clear()
4242
{
43-
treeControl.Clear();
43+
treeControl.Nodes.Clear();
4444
}
4545

4646
public void SetData(Variable[] variables)

External/Plugins/FlashDebugger/Controls/WatchUI.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ public void Clear()
8282
public void UpdateElements()
8383
{
8484
treeControl.Tree.BeginUpdate();
85+
treeControl.SaveState();
86+
8587
treeControl.Nodes.Clear();
8688
foreach (String item in watches)
8789
{
@@ -109,7 +111,7 @@ public void UpdateElements()
109111
}
110112

111113
treeControl.AddNode(new ValueNode(TextHelper.GetString("Label.AddExpression")));
112-
((NodeTextBox)treeControl.Tree.NodeControls[treeControl.Tree.NodeControls.Count - 2]).EditOnClick = true;
114+
treeControl.RestoreState();
113115
treeControl.Tree.EndUpdate();
114116
treeControl.Enabled = true;
115117
}

0 commit comments

Comments
 (0)