@@ -21,10 +21,11 @@ public partial class DataTreeControl : UserControl, IToolTipProvider
21
21
private DataTreeModel _model ;
22
22
private static ViewerForm viewerForm ;
23
23
private ContextMenuStrip _contextMenuStrip ;
24
- private ToolStripMenuItem copyMenuItem , viewerMenuItem , watchMenuItem ;
24
+ private ToolStripMenuItem copyMenuItem , viewerMenuItem , watchMenuItem , copyIDMenuItem , copyTreeMenuItem ;
25
25
private DataTreeState state ;
26
26
private bool watchMode ;
27
27
private bool addingNewExpression ;
28
+ private static bool combineInherited = false ;
28
29
29
30
public Collection < Node > Nodes
30
31
{
@@ -98,8 +99,10 @@ public DataTreeControl(bool watchMode)
98
99
this . NameTreeColumn . Header = TextHelper . GetString ( "Label.Name" ) ;
99
100
this . ValueTreeColumn . Header = TextHelper . GetString ( "Label.Value" ) ;
100
101
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 ) ) ;
101
104
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 } ) ;
103
106
if ( watchMode )
104
107
watchMenuItem = new ToolStripMenuItem ( TextHelper . GetString ( "Label.Unwatch" ) , null , new EventHandler ( this . WatchItemClick ) ) ;
105
108
else
@@ -355,121 +358,145 @@ void TreeExpanding(Object sender, TreeViewAdvEventArgs e)
355
358
{
356
359
if ( e . Node . Index >= 0 )
357
360
{
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 ) ;
470
362
}
471
363
}
472
364
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
+
473
500
void Tree_NodeMouseDoubleClick ( object sender , TreeNodeAdvMouseEventArgs e )
474
501
{
475
502
DataNode node = e . Node . Tag as ContinuedDataNode ;
@@ -563,6 +590,12 @@ private void RestoreScrollState()
563
590
if ( topNode != null ) Tree . EnsureVisible ( topNode ) ;
564
591
}
565
592
}
593
+
594
+ public static bool CombineInherited
595
+ {
596
+ get { return DataTreeControl . combineInherited ; }
597
+ set { DataTreeControl . combineInherited = value ; }
598
+ }
566
599
567
600
#region IToolTipProvider Members
568
601
@@ -599,6 +632,40 @@ private class DataTreeState
599
632
}
600
633
601
634
#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
+
602
669
}
603
670
604
671
}
0 commit comments