@@ -22,7 +22,7 @@ public partial class DataTreeControl : UserControl, IToolTipProvider
22
22
private static ViewerForm viewerForm ;
23
23
private ContextMenuStrip _contextMenuStrip ;
24
24
private ToolStripMenuItem copyMenuItem , viewerMenuItem , watchMenuItem ;
25
- private List < String > expandedList = new List < String > ( ) ;
25
+ private DataTreeState state ;
26
26
private bool watchMode ;
27
27
private bool addingNewExpression ;
28
28
@@ -68,22 +68,25 @@ public DataTreeControl(bool watchMode)
68
68
NameNodeTextBox . DrawText += NameNodeTextBox_DrawText ;
69
69
NameNodeTextBox . EditorShowing += NameNodeTextBox_EditorShowing ;
70
70
NameNodeTextBox . EditorHided += NameNodeTextBox_EditorHided ;
71
+ NameNodeTextBox . IsEditEnabledValueNeeded += NameNodeTextBox_IsEditEnabledValueNeeded ;
71
72
NameNodeTextBox . LabelChanged += NameNodeTextBox_LabelChanged ;
73
+ _tree . NodeMouseClick += Tree_NameNodeMouseClick ;
72
74
}
73
75
74
76
_model = new DataTreeModel ( ) ;
75
77
_tree . Model = _model ;
78
+ _tree . FullRowSelect = true ;
76
79
Controls . Add ( _tree ) ;
77
80
_tree . Expanding += TreeExpanding ;
78
81
_tree . SelectionChanged += TreeSelectionChanged ;
82
+ _tree . NodeMouseDoubleClick += Tree_NodeMouseDoubleClick ;
79
83
_tree . LoadOnDemand = true ;
80
84
_tree . AutoRowHeight = true ;
81
85
ValueNodeTextBox . DrawText += ValueNodeTextBox_DrawText ;
82
86
ValueNodeTextBox . IsEditEnabledValueNeeded += ValueNodeTextBox_IsEditEnabledValueNeeded ;
83
87
ValueNodeTextBox . EditorShowing += ValueNodeTextBox_EditorShowing ;
84
88
ValueNodeTextBox . EditorHided += ValueNodeTextBox_EditorHided ;
85
89
ValueNodeTextBox . LabelChanged += ValueNodeTextBox_LabelChanged ;
86
- _tree . NodeMouseDoubleClick += Tree_NodeMouseDoubleClick ;
87
90
_contextMenuStrip = new ContextMenuStrip ( ) ;
88
91
if ( PluginBase . MainForm != null && PluginBase . Settings != null )
89
92
{
@@ -97,13 +100,9 @@ public DataTreeControl(bool watchMode)
97
100
viewerMenuItem = new ToolStripMenuItem ( TextHelper . GetString ( "Label.Viewer" ) , null , new EventHandler ( this . ViewerItemClick ) ) ;
98
101
_contextMenuStrip . Items . AddRange ( new ToolStripMenuItem [ ] { copyMenuItem , viewerMenuItem } ) ;
99
102
if ( watchMode )
100
- {
101
103
watchMenuItem = new ToolStripMenuItem ( TextHelper . GetString ( "Label.Unwatch" ) , null , new EventHandler ( this . WatchItemClick ) ) ;
102
- }
103
104
else
104
- {
105
105
watchMenuItem = new ToolStripMenuItem ( TextHelper . GetString ( "Label.Watch" ) , null , new EventHandler ( this . WatchItemClick ) ) ;
106
- }
107
106
_contextMenuStrip . Items . Add ( watchMenuItem ) ;
108
107
TreeSelectionChanged ( null , null ) ;
109
108
viewerForm = new ViewerForm ( ) ;
@@ -114,7 +113,7 @@ void NameNodeTextBox_DrawText(object sender, DrawEventArgs e)
114
113
{
115
114
try
116
115
{
117
- if ( e . Node . NextNode == null && ! addingNewExpression )
116
+ if ( e . Node . NextNode == null && e . Node . Level == 1 && ! addingNewExpression )
118
117
{
119
118
e . Font = new Font ( e . Font , FontStyle . Italic ) ;
120
119
}
@@ -149,13 +148,18 @@ void NameNodeTextBox_EditorShowing(object sender, System.ComponentModel.CancelEv
149
148
addingNewExpression = false ;
150
149
}
151
150
151
+ void NameNodeTextBox_IsEditEnabledValueNeeded ( object sender , NodeControlValueEventArgs e )
152
+ {
153
+ e . Value = e . Node . Level == 1 ;
154
+ }
155
+
152
156
void NameNodeTextBox_LabelChanged ( object sender , LabelEventArgs e )
153
157
{
154
158
NodeTextBox box = sender as NodeTextBox ;
155
159
if ( box . Parent . CurrentNode == null ) return ;
156
160
DataNode node = box . Parent . CurrentNode . Tag as DataNode ;
157
161
158
- if ( e . NewLabel . Trim ( ) == "" )
162
+ if ( e . NewLabel . Trim ( ) == "" || e . NewLabel . Trim ( ) == TextHelper . GetString ( "Label.AddExpression" ) )
159
163
{
160
164
node . Text = e . OldLabel != "" ? e . OldLabel : TextHelper . GetString ( "Label.AddExpression" ) ;
161
165
return ;
@@ -170,6 +174,16 @@ void NameNodeTextBox_LabelChanged(object sender, LabelEventArgs e)
170
174
if ( ! newExp ) node . Text = e . OldLabel ;
171
175
}
172
176
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
+
173
187
void ValueNodeTextBox_LabelChanged ( object sender , LabelEventArgs e )
174
188
{
175
189
NodeTextBox box = sender as NodeTextBox ;
@@ -247,7 +261,6 @@ void ValueNodeTextBox_DrawText(object sender, DrawEventArgs e)
247
261
public DataNode AddNode ( DataNode node )
248
262
{
249
263
_model . Root . Nodes . Add ( node ) ;
250
- RestoreExpanded ( ) ;
251
264
return node ;
252
265
}
253
266
@@ -262,13 +275,6 @@ public string GetFullPath(DataNode node)
262
275
return _model . GetFullPath ( node ) ;
263
276
}
264
277
265
- public void Clear ( )
266
- {
267
- if ( Nodes . Count > 0 ) SaveExpanded ( ) ;
268
- Nodes . Clear ( ) ;
269
- }
270
-
271
-
272
278
private void CopyItemClick ( Object sender , System . EventArgs e )
273
279
{
274
280
if ( Tree . SelectedNode != null )
@@ -467,43 +473,81 @@ void Tree_NodeMouseDoubleClick(object sender, TreeNodeAdvMouseEventArgs e)
467
473
}
468
474
}
469
475
470
- public void SaveExpanded ( )
476
+ public void SaveState ( )
471
477
{
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 ( ) ;
474
484
}
475
485
476
486
private void SaveExpanded ( Collection < Node > nodes )
477
487
{
478
- if ( nodes == null ) return ;
479
488
foreach ( Node node in nodes )
480
489
{
481
- if ( Tree . FindNode ( _model . GetPath ( node ) ) . IsExpanded )
490
+ if ( ! node . IsLeaf && Tree . FindNode ( _model . GetPath ( node ) ) . IsExpanded )
482
491
{
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 ) ;
485
495
}
486
496
}
487
497
}
488
498
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 ( )
490
513
{
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 ( ) ;
492
520
}
493
521
494
522
private void RestoreExpanded ( Collection < Node > nodes )
495
523
{
496
- if ( nodes == null ) return ;
497
524
foreach ( Node node in nodes )
498
525
{
499
- if ( expandedList . Contains ( _model . GetFullPath ( node ) ) )
526
+ if ( ! node . IsLeaf && state . Expanded . Contains ( _model . GetFullPath ( node ) ) )
500
527
{
501
528
Tree . FindNode ( _model . GetPath ( node ) ) . Expand ( ) ;
502
- RestoreExpanded ( node . Nodes ) ;
529
+ if ( node . Nodes . Count > 0 )
530
+ RestoreExpanded ( node . Nodes ) ;
503
531
}
504
532
}
505
533
}
506
534
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
+ }
507
551
508
552
#region IToolTipProvider Members
509
553
@@ -527,6 +571,19 @@ public string GetToolTip(TreeNodeAdv node, NodeControl nodeControl)
527
571
}
528
572
529
573
#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
530
587
}
531
588
532
589
}
0 commit comments