Skip to content

Commit 4ec95f4

Browse files
author
hgupta9
committed
Copy Tree command and combine inherited
1. Add "Copy Tree" and "Copy ID" commands to DataTreeControl 2. Hide full class paths ("flash.display.MovieClip" shows as "MovieClip") 3. List inherited vars alongside main vars of a class instance 4. Add property in DataTreeControl to toggle this behavior 5. Use FD4 code styling (braces on new lines) 6. Add comments for String utilis (StringsHelper)
1 parent c6540ee commit 4ec95f4

File tree

5 files changed

+509
-119
lines changed

5 files changed

+509
-119
lines changed

External/Plugins/FlashDebugger/Controls/DataTree/ValueNode.cs

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,26 @@ public int ChildrenShowLimit
1515
protected Value m_Value;
1616
private bool m_bEditing = false;
1717

18+
public string ID
19+
{
20+
get
21+
{
22+
if (m_Value != null)
23+
{
24+
int type = m_Value.getType();
25+
if (type == VariableType_.MOVIECLIP || type == VariableType_.OBJECT)
26+
{
27+
return m_Value.getTypeName().replaceAll("::", ".").replaceAll("@", " - ").ToString();
28+
}
29+
else if (type == VariableType_.FUNCTION)
30+
{
31+
return "Function - " + m_Value.ToString();
32+
}
33+
}
34+
return "";
35+
}
36+
}
37+
1838
public override string Value
1939
{
2040
get
@@ -27,7 +47,16 @@ public override string Value
2747
string temp = null;
2848
if (type == VariableType_.MOVIECLIP || type == VariableType_.OBJECT)
2949
{
30-
return m_Value.getTypeName();
50+
// return class type without classpath
51+
string typeStr = Strings.AfterLast(m_Value.getTypeName().ToString(), "::", true);
52+
string shortStr = Strings.Before(typeStr, "@");
53+
if (shortStr == "[]")
54+
{
55+
return "Array";
56+
}
57+
return typeStr;
58+
59+
//return m_Value.getTypeName();
3160
}
3261
else if (type == VariableType_.NUMBER)
3362
{
@@ -63,11 +92,10 @@ public override string Value
6392
{
6493
return "null";
6594
}
66-
/*else if (type == VariableType_.FUNCTION)
95+
else if (type == VariableType_.FUNCTION)
6796
{
68-
m_Value.ToString();
69-
//return "<setter>";
70-
}*/
97+
return "Function";
98+
}
7199
temp = m_Value.ToString();
72100
if (!m_bEditing)
73101
{

External/Plugins/FlashDebugger/Controls/DataTreeControl.cs

Lines changed: 181 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,11 @@ public partial class DataTreeControl : UserControl, IToolTipProvider
2121
private DataTreeModel _model;
2222
private static ViewerForm viewerForm;
2323
private ContextMenuStrip _contextMenuStrip;
24-
private ToolStripMenuItem copyMenuItem, viewerMenuItem, watchMenuItem;
24+
private ToolStripMenuItem copyMenuItem, viewerMenuItem, watchMenuItem, copyIDMenuItem, copyTreeMenuItem;
2525
private DataTreeState state;
2626
private bool watchMode;
2727
private bool addingNewExpression;
28+
private static bool combineInherited = false;
2829

2930
public Collection<Node> Nodes
3031
{
@@ -98,8 +99,10 @@ public DataTreeControl(bool watchMode)
9899
this.NameTreeColumn.Header = TextHelper.GetString("Label.Name");
99100
this.ValueTreeColumn.Header = TextHelper.GetString("Label.Value");
100101
copyMenuItem = new ToolStripMenuItem(TextHelper.GetString("Label.Copy"), null, new EventHandler(this.CopyItemClick));
102+
copyIDMenuItem = new ToolStripMenuItem("Copy ID", null, new EventHandler(this.CopyItemIDClick));
103+
copyTreeMenuItem = new ToolStripMenuItem("Copy Tree", null, new EventHandler(this.CopyItemTreeClick));
101104
viewerMenuItem = new ToolStripMenuItem(TextHelper.GetString("Label.Viewer"), null, new EventHandler(this.ViewerItemClick));
102-
_contextMenuStrip.Items.AddRange(new ToolStripMenuItem[] { copyMenuItem, viewerMenuItem});
105+
_contextMenuStrip.Items.AddRange(new ToolStripMenuItem[] { copyMenuItem, copyIDMenuItem, copyTreeMenuItem, viewerMenuItem});
103106
if (watchMode)
104107
watchMenuItem = new ToolStripMenuItem(TextHelper.GetString("Label.Unwatch"), null, new EventHandler(this.WatchItemClick));
105108
else
@@ -355,121 +358,145 @@ void TreeExpanding(Object sender, TreeViewAdvEventArgs e)
355358
{
356359
if (e.Node.Index >= 0)
357360
{
358-
ValueNode node = e.Node.Tag as ValueNode;
359-
if (node != null && node.Nodes.Count == 0 && node.PlayerValue != null)
360-
{
361-
FlashInterface flashInterface = PluginMain.debugManager.FlashInterface;
362-
List<VariableNode> nodes = new List<VariableNode>();
363-
List<VariableNode> inherited = new List<VariableNode>();
364-
List<VariableNode> statics = new List<VariableNode>();
365-
int tmpLimit = node.ChildrenShowLimit;
366-
foreach (Variable member in node.PlayerValue.getMembers(flashInterface.Session))
367-
{
368-
VariableNode memberNode = new VariableNode(member);
369-
370-
if (member.isAttributeSet(VariableAttribute_.IS_STATIC))
371-
{
372-
statics.Add(memberNode);
373-
}
374-
else if (member.getLevel() > 0)
375-
{
376-
inherited.Add(memberNode);
377-
}
378-
else
379-
{
380-
nodes.Add(memberNode);
381-
}
382-
}
383-
if (inherited.Count > 0)
384-
{
385-
ValueNode inheritedNode = new ValueNode("[inherited]");
386-
inherited.Sort();
387-
foreach (DataNode item in inherited)
388-
{
389-
inheritedNode.Nodes.Add(item);
390-
}
391-
node.Nodes.Add(inheritedNode);
392-
}
393-
if (statics.Count > 0)
394-
{
395-
DataNode staticNode = new ValueNode("[static]");
396-
statics.Sort();
397-
foreach (DataNode item in statics)
398-
{
399-
staticNode.Nodes.Add(item);
400-
}
401-
node.Nodes.Add(staticNode);
402-
}
403-
//test children
404-
foreach (String ch in node.PlayerValue.getClassHierarchy(false))
405-
{
406-
if (ch.Equals("flash.display::DisplayObjectContainer"))
407-
{
408-
double numChildren = ((java.lang.Double)node.PlayerValue.getMemberNamed(flashInterface.Session, "numChildren").getValue().getValueAsObject()).doubleValue();
409-
DataNode childrenNode = new ValueNode("[children]");
410-
for (int i = 0; i < numChildren; i++)
411-
{
412-
try
413-
{
414-
IASTBuilder b = new ASTBuilder(false);
415-
string cmd = node.GetVariablePath() + ".getChildAt(" + i + ")";
416-
ValueExp exp = b.parse(new java.io.StringReader(cmd));
417-
var ctx = new ExpressionContext(flashInterface.Session, flashInterface.GetFrames()[PluginMain.debugManager.CurrentFrame]);
418-
var obj = exp.evaluate(ctx);
419-
if (obj is flash.tools.debugger.concrete.DValue) obj = new flash.tools.debugger.concrete.DVariable("getChildAt(" + i + ")", (flash.tools.debugger.concrete.DValue)obj, ((flash.tools.debugger.concrete.DValue)obj).getIsolateId());
420-
DataNode childNode = new VariableNode((Variable)obj);
421-
childNode.Text = "child_" + i;
422-
childrenNode.Nodes.Add(childNode);
423-
}
424-
catch (Exception) { }
425-
}
426-
node.Nodes.Add(childrenNode);
427-
}
428-
else if (ch.Equals("flash.events::EventDispatcher"))
429-
{
430-
Variable list = node.PlayerValue.getMemberNamed(flashInterface.Session, "listeners");
431-
var omg = list.getName();
432-
/*
433-
double numChildren = ((java.lang.Double)node.Variable.getValue().getMemberNamed(flashInterface.Session, "numChildren").getValue().getValueAsObject()).doubleValue();
434-
DataNode childrenNode = new DataNode("[children]");
435-
for (int i = 0; i < numChildren; i++)
436-
{
437-
try
438-
{
439-
440-
IASTBuilder b = new ASTBuilder(false);
441-
string cmd = GetVariablePath(node) + ".getChildAt(" + i + ")";
442-
ValueExp exp = b.parse(new java.io.StringReader(cmd));
443-
var ctx = new ExpressionContext(flashInterface.Session, flashInterface.Session.getFrames()[PluginMain.debugManager.CurrentFrame]);
444-
var obj = exp.evaluate(ctx);
445-
if (obj is flash.tools.debugger.concrete.DValue) obj = new flash.tools.debugger.concrete.DVariable("child_" + i, (flash.tools.debugger.concrete.DValue)obj);
446-
DataNode childNode = new DataNode((Variable)obj);
447-
childrenNode.Nodes.Add(childNode);
448-
}
449-
catch (Exception) { }
450-
}
451-
node.Nodes.Add(childrenNode);
452-
* */
453-
}
454-
}
455-
//test children
456-
nodes.Sort();
457-
_tree.BeginUpdate();
458-
foreach (DataNode item in nodes)
459-
{
460-
if (0 == tmpLimit--) break;
461-
node.Nodes.Add(item);
462-
}
463-
if (tmpLimit == -1)
464-
{
465-
DataNode moreNode = new ContinuedDataNode();
466-
node.Nodes.Add(moreNode);
467-
}
468-
_tree.EndUpdate();
469-
}
361+
ListChildItems(e.Node.Tag as ValueNode);
470362
}
471363
}
472364

365+
public void ListChildItems(ValueNode node)
366+
{
367+
368+
if (node != null && node.Nodes.Count == 0 && node.PlayerValue != null)
369+
{
370+
FlashInterface flashInterface = PluginMain.debugManager.FlashInterface;
371+
List<VariableNode> nodes = new List<VariableNode>();
372+
List<VariableNode> inherited = new List<VariableNode>();
373+
List<VariableNode> statics = new List<VariableNode>();
374+
int tmpLimit = node.ChildrenShowLimit;
375+
foreach (Variable member in node.PlayerValue.getMembers(flashInterface.Session))
376+
{
377+
VariableNode memberNode = new VariableNode(member);
378+
379+
if (member.isAttributeSet(VariableAttribute_.IS_STATIC))
380+
{
381+
statics.Add(memberNode);
382+
}
383+
else if (member.getLevel() > 0)
384+
{
385+
inherited.Add(memberNode);
386+
}
387+
else
388+
{
389+
nodes.Add(memberNode);
390+
}
391+
}
392+
// inherited vars
393+
if (inherited.Count > 0)
394+
{
395+
if (combineInherited)
396+
{
397+
// list inherited alongside main class members
398+
foreach (DataNode item in inherited)
399+
{
400+
node.Nodes.Add(item);
401+
}
402+
403+
}
404+
else
405+
{
406+
// list inherited in a [inherited] group
407+
ValueNode inheritedNode = new ValueNode("[inherited]");
408+
inherited.Sort();
409+
foreach (DataNode item in inherited)
410+
{
411+
inheritedNode.Nodes.Add(item);
412+
}
413+
node.Nodes.Add(inheritedNode);
414+
415+
}
416+
}
417+
418+
// static vars
419+
if (statics.Count > 0)
420+
{
421+
DataNode staticNode = new ValueNode("[static]");
422+
statics.Sort();
423+
foreach (DataNode item in statics)
424+
{
425+
staticNode.Nodes.Add(item);
426+
}
427+
node.Nodes.Add(staticNode);
428+
}
429+
// test children
430+
foreach (String ch in node.PlayerValue.getClassHierarchy(false))
431+
{
432+
if (ch.Equals("flash.display::DisplayObjectContainer"))
433+
{
434+
double numChildren = ((java.lang.Double)node.PlayerValue.getMemberNamed(flashInterface.Session, "numChildren").getValue().getValueAsObject()).doubleValue();
435+
DataNode childrenNode = new ValueNode("[children]");
436+
for (int i = 0; i < numChildren; i++)
437+
{
438+
try
439+
{
440+
IASTBuilder b = new ASTBuilder(false);
441+
string cmd = node.GetVariablePath() + ".getChildAt(" + i + ")";
442+
ValueExp exp = b.parse(new java.io.StringReader(cmd));
443+
var ctx = new ExpressionContext(flashInterface.Session, flashInterface.GetFrames()[PluginMain.debugManager.CurrentFrame]);
444+
var obj = exp.evaluate(ctx);
445+
if (obj is flash.tools.debugger.concrete.DValue) obj = new flash.tools.debugger.concrete.DVariable("getChildAt(" + i + ")", (flash.tools.debugger.concrete.DValue)obj, ((flash.tools.debugger.concrete.DValue)obj).getIsolateId());
446+
DataNode childNode = new VariableNode((Variable)obj);
447+
childNode.Text = "child_" + i;
448+
childrenNode.Nodes.Add(childNode);
449+
}
450+
catch (Exception) { }
451+
}
452+
node.Nodes.Add(childrenNode);
453+
}
454+
else if (ch.Equals("flash.events::EventDispatcher"))
455+
{
456+
Variable list = node.PlayerValue.getMemberNamed(flashInterface.Session, "listeners");
457+
var omg = list.getName();
458+
/*
459+
double numChildren = ((java.lang.Double)node.Variable.getValue().getMemberNamed(flashInterface.Session, "numChildren").getValue().getValueAsObject()).doubleValue();
460+
DataNode childrenNode = new DataNode("[children]");
461+
for (int i = 0; i < numChildren; i++)
462+
{
463+
try
464+
{
465+
466+
IASTBuilder b = new ASTBuilder(false);
467+
string cmd = GetVariablePath(node) + ".getChildAt(" + i + ")";
468+
ValueExp exp = b.parse(new java.io.StringReader(cmd));
469+
var ctx = new ExpressionContext(flashInterface.Session, flashInterface.Session.getFrames()[PluginMain.debugManager.CurrentFrame]);
470+
var obj = exp.evaluate(ctx);
471+
if (obj is flash.tools.debugger.concrete.DValue) obj = new flash.tools.debugger.concrete.DVariable("child_" + i, (flash.tools.debugger.concrete.DValue)obj);
472+
DataNode childNode = new DataNode((Variable)obj);
473+
childrenNode.Nodes.Add(childNode);
474+
}
475+
catch (Exception) { }
476+
}
477+
node.Nodes.Add(childrenNode);
478+
* */
479+
}
480+
}
481+
//test children
482+
nodes.Sort();
483+
484+
// add child items
485+
_tree.BeginUpdate();
486+
foreach (DataNode item in nodes)
487+
{
488+
if (0 == tmpLimit--) break;
489+
node.Nodes.Add(item);
490+
}
491+
if (tmpLimit == -1)
492+
{
493+
DataNode moreNode = new ContinuedDataNode();
494+
node.Nodes.Add(moreNode);
495+
}
496+
_tree.EndUpdate();
497+
}
498+
}
499+
473500
void Tree_NodeMouseDoubleClick(object sender, TreeNodeAdvMouseEventArgs e)
474501
{
475502
DataNode node = e.Node.Tag as ContinuedDataNode;
@@ -563,6 +590,12 @@ private void RestoreScrollState()
563590
if (topNode != null) Tree.EnsureVisible(topNode);
564591
}
565592
}
593+
594+
public static bool CombineInherited
595+
{
596+
get { return DataTreeControl.combineInherited; }
597+
set { DataTreeControl.combineInherited = value; }
598+
}
566599

567600
#region IToolTipProvider Members
568601

@@ -599,6 +632,40 @@ private class DataTreeState
599632
}
600633

601634
#endregion
635+
636+
637+
#region Copy ID & Tree
638+
639+
private void CopyItemIDClick(Object sender, System.EventArgs e)
640+
{
641+
if (Tree.SelectedNode != null)
642+
{
643+
644+
ValueNode node = Tree.SelectedNode.Tag as ValueNode;
645+
Clipboard.SetText(node.ID);
646+
647+
}
648+
}
649+
650+
private void CopyItemTreeClick(Object sender, System.EventArgs e)
651+
{
652+
CopyTreeInternal(0);
653+
}
654+
655+
private void CopyTreeInternal(int levelLimit)
656+
{
657+
if (Tree.SelectedNode != null)
658+
{
659+
660+
ValueNode node = Tree.SelectedNode.Tag as ValueNode;
661+
Clipboard.SetText(CopyTreeHelper.GetTreeAsText(Tree.SelectedNode, node, "\t", this, levelLimit));
662+
663+
}
664+
}
665+
666+
667+
#endregion
668+
602669
}
603670

604671
}

0 commit comments

Comments
 (0)