Skip to content
This repository was archived by the owner on Oct 16, 2020. It is now read-only.

Commit 6ebd1e6

Browse files
committed
Don't use ModelCollectionTreeNode for class browser nodes that don't use a IModelCollection.
1 parent 8990ebe commit 6ebd1e6

15 files changed

Lines changed: 84 additions & 279 deletions

File tree

src/AddIns/Analysis/UnitTesting/Pad/UnitTestNode.cs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,18 +37,20 @@ public UnitTestNode(ITest test)
3737
if (test == null)
3838
throw new ArgumentNullException("test");
3939
this.test = test;
40-
test.DisplayNameChanged += test_NameChanged;
41-
test.ResultChanged += test_ResultChanged;
42-
LazyLoading = true;
4340
}
4441

45-
protected override void DetachEventHandlers()
42+
protected override void OnIsVisibleChanged()
4643
{
47-
// TODO: figure out when we can call this method
48-
test.DisplayNameChanged -= test_NameChanged;
49-
test.ResultChanged -= test_ResultChanged;
50-
51-
base.DetachEventHandlers();
44+
base.OnIsVisibleChanged();
45+
if (IsVisible) {
46+
test.DisplayNameChanged += test_NameChanged;
47+
test.ResultChanged += test_ResultChanged;
48+
// If the node isn't visible; we don't need to raise the PropertyChanged event for the items shown in the visible
49+
// tree node; so we don't need to catch up on missed updates.
50+
} else {
51+
test.DisplayNameChanged -= test_NameChanged;
52+
test.ResultChanged -= test_ResultChanged;
53+
}
5254
}
5355

5456
public new ITest Model {

src/AddIns/Debugger/Debugger.AddIn/Pads/ClassBrowserSupport.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
using System;
2020
using System.IO;
21+
using System.Windows.Controls;
2122
using Debugger;
2223
using ICSharpCode.Core.Presentation;
2324
using ICSharpCode.NRefactory;
@@ -233,12 +234,9 @@ public override object Text {
233234
}
234235
}
235236

236-
public override void ShowContextMenu()
237+
public override void ShowContextMenu(ContextMenuEventArgs e)
237238
{
238-
var assemblyModel = this.Model as IAssemblyModel;
239-
if (assemblyModel != null) {
240-
var ctx = MenuService.ShowContextMenu(null, assemblyModel, "/SharpDevelop/Services/DebuggerService/ModuleContextMenu");
241-
}
239+
MenuService.ShowContextMenu(null, this.Model, "/SharpDevelop/Services/DebuggerService/ModuleContextMenu");
242240
}
243241
}
244242

src/Libraries/SharpTreeView/ICSharpCode.TreeView/SharpTreeNode.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -721,7 +721,7 @@ public void RaisePropertyChanged(string name)
721721
/// Gets the underlying model object.
722722
/// </summary>
723723
/// <remarks>
724-
/// This property calls the virtual <see cref="GetModelObject"/> helper method.
724+
/// This property calls the virtual <see cref="GetModel()"/> helper method.
725725
/// I didn't make the property itself virtual because deriving classes
726726
/// may wish to replace it with a more specific return type,
727727
/// but C# doesn't support variance in override declarations.
@@ -743,6 +743,10 @@ public virtual void ActivateItem(RoutedEventArgs e)
743743
{
744744
}
745745

746+
public virtual void ShowContextMenu(ContextMenuEventArgs e)
747+
{
748+
}
749+
746750
public override string ToString()
747751
{
748752
// used for keyboard navigation

src/Libraries/SharpTreeView/ICSharpCode.TreeView/SharpTreeViewItem.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,11 @@ protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e)
116116
}
117117
}
118118

119+
protected override void OnContextMenuOpening(ContextMenuEventArgs e)
120+
{
121+
Node.ShowContextMenu(e);
122+
}
123+
119124
#endregion
120125

121126
#region Drag and Drop

src/Main/Base/Project/Dom/ClassBrowser/AssemblyReferenceTreeNode.cs

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,17 @@
1717
// DEALINGS IN THE SOFTWARE.
1818

1919
using System;
20+
using System.Windows.Controls;
2021
using ICSharpCode.Core.Presentation;
22+
using ICSharpCode.TreeView;
2123
using ICSharpCode.SharpDevelop.Parser;
2224

2325
namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
2426
{
2527
/// <summary>
2628
/// Tree node representing one single referenced assembly.
2729
/// </summary>
28-
public class AssemblyReferenceTreeNode : ModelCollectionTreeNode
30+
public class AssemblyReferenceTreeNode : SharpTreeNode
2931
{
3032
private IAssemblyReferenceModel model;
3133

@@ -44,19 +46,6 @@ protected override object GetModel()
4446
return model;
4547
}
4648

47-
protected override IModelCollection<object> ModelChildren {
48-
get {
49-
// TODO Show assemblies referenced by this assembly?
50-
return ImmutableModelCollection<object>.Empty;
51-
}
52-
}
53-
54-
protected override System.Collections.Generic.IComparer<ICSharpCode.TreeView.SharpTreeNode> NodeComparer {
55-
get {
56-
return NodeTextComparer;
57-
}
58-
}
59-
6049
public override object Text {
6150
get {
6251
return model.AssemblyName.ShortName;
@@ -69,12 +58,9 @@ public override object Icon {
6958
}
7059
}
7160

72-
public override void ShowContextMenu()
61+
public override void ShowContextMenu(ContextMenuEventArgs e)
7362
{
74-
var assemblyReferenceModel = this.Model as IAssemblyReferenceModel;
75-
if (assemblyReferenceModel != null) {
76-
var ctx = MenuService.ShowContextMenu(null, assemblyReferenceModel, "/SharpDevelop/Pads/ClassBrowser/AssemblyReferenceContextMenu");
77-
}
63+
MenuService.ShowContextMenu(null, model, "/SharpDevelop/Pads/ClassBrowser/AssemblyReferenceContextMenu");
7864
}
7965
}
8066
}

src/Main/Base/Project/Dom/ClassBrowser/AssemblyReferencesTreeNode.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
using System;
2020
using System.Linq;
21+
using System.Windows.Controls;
2122
using ICSharpCode.Core.Presentation;
2223
using ICSharpCode.SharpDevelop.Dom;
2324
using ICSharpCode.SharpDevelop.Parser;
@@ -73,12 +74,9 @@ public override object Icon
7374
}
7475
}
7576

76-
public override void ShowContextMenu()
77+
public override void ShowContextMenu(ContextMenuEventArgs e)
7778
{
78-
var assemblyReferencesModel = this.Model as IAssemblyReferencesModel;
79-
if (assemblyReferencesModel != null) {
80-
var ctx = MenuService.ShowContextMenu(null, assemblyReferencesModel, "/SharpDevelop/Pads/ClassBrowser/AssemblyReferencesContextMenu");
81-
}
79+
MenuService.ShowContextMenu(null, model, "/SharpDevelop/Pads/ClassBrowser/AssemblyReferencesContextMenu");
8280
}
8381
}
8482
}

src/Main/Base/Project/Dom/ClassBrowser/AssemblyTreeNode.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
using System;
2020
using System.Collections.Generic;
21+
using System.Windows.Controls;
2122
using ICSharpCode.Core.Presentation;
2223
using ICSharpCode.TreeView;
2324

@@ -82,12 +83,9 @@ public override object Icon {
8283
}
8384
}
8485

85-
public override void ShowContextMenu()
86+
public override void ShowContextMenu(ContextMenuEventArgs e)
8687
{
87-
var assemblyModel = this.Model as IAssemblyModel;
88-
if (assemblyModel != null) {
89-
var ctx = MenuService.ShowContextMenu(null, assemblyModel, "/SharpDevelop/Pads/ClassBrowser/AssemblyContextMenu");
90-
}
88+
MenuService.ShowContextMenu(null, model, "/SharpDevelop/Pads/ClassBrowser/AssemblyContextMenu");
9189
}
9290
}
9391
}

src/Main/Base/Project/Dom/ClassBrowser/BaseTypesTreeNode.cs

Lines changed: 18 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -29,66 +29,53 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
2929
/// <summary>
3030
/// Represents the "Base types" sub-node of type nodes in ClassBrowser tree.
3131
/// </summary>
32-
public class BaseTypesTreeNode : ModelCollectionTreeNode
32+
public class BaseTypesTreeNode : SharpTreeNode
3333
{
34-
ITypeDefinitionModel definition;
34+
readonly ITypeDefinitionModel definition;
3535
string text;
36-
bool childrenLoaded;
37-
SimpleModelCollection<ITypeDefinitionModel> baseTypes;
3836

3937
public BaseTypesTreeNode(ITypeDefinitionModel definition)
4038
{
4139
if (definition == null)
4240
throw new ArgumentNullException("definition");
4341
this.definition = definition;
44-
this.definition.Updated += (sender, e) => UpdateBaseTypes();
4542
this.text = SD.ResourceService.GetString("MainWindow.Windows.ClassBrowser.BaseTypes");
46-
baseTypes = new SimpleModelCollection<ITypeDefinitionModel>();
47-
childrenLoaded = false;
4843
}
4944

50-
protected override IModelCollection<object> ModelChildren {
51-
get {
52-
if (!childrenLoaded) {
53-
UpdateBaseTypes();
54-
childrenLoaded = true;
55-
}
56-
return baseTypes;
45+
protected override void OnIsVisibleChanged()
46+
{
47+
base.OnIsVisibleChanged();
48+
if (IsVisible) {
49+
definition.Updated += OnDefinitionUpdated;
50+
} else {
51+
definition.Updated -= OnDefinitionUpdated;
52+
LazyLoading = true;
5753
}
5854
}
59-
60-
public override SharpTreeNode FindChildNodeRecursively(Func<SharpTreeNode, bool> predicate)
55+
56+
void OnDefinitionUpdated(object sender, EventArgs e)
6157
{
62-
// Don't search children of this node, because they are repeating type nodes from elsewhere
63-
return null;
58+
// If the list of children was created, update it
59+
if (!LazyLoading)
60+
LoadChildren();
6461
}
6562

66-
public override bool CanFindChildNodeRecursively {
67-
get { return false; }
68-
}
69-
70-
void UpdateBaseTypes()
63+
protected override void LoadChildren()
7164
{
72-
baseTypes.Clear();
65+
Children.Clear();
7366
ITypeDefinition currentTypeDef = definition.Resolve();
7467
if (currentTypeDef != null) {
7568
foreach (var baseType in currentTypeDef.DirectBaseTypes) {
7669
ITypeDefinition baseTypeDef = baseType.GetDefinition();
7770
if (baseTypeDef != null) {
7871
ITypeDefinitionModel baseTypeModel = baseTypeDef.GetModel();
7972
if (baseTypeModel != null)
80-
baseTypes.Add(baseTypeModel);
73+
Children.Add(SD.TreeNodeFactory.CreateTreeNode(baseTypeModel));
8174
}
8275
}
8376
}
8477
}
8578

86-
protected override System.Collections.Generic.IComparer<ICSharpCode.TreeView.SharpTreeNode> NodeComparer {
87-
get {
88-
return NodeTextComparer;
89-
}
90-
}
91-
9279
public override object Text {
9380
get {
9481
return text;

src/Main/Base/Project/Dom/ClassBrowser/ClassBrowserTreeView.cs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,6 @@ public ClassBrowserTreeView()
4343
this.Root = root;
4444
}
4545

46-
protected override void OnContextMenuOpening(ContextMenuEventArgs e)
47-
{
48-
var treeNode = this.SelectedItem as ModelCollectionTreeNode;
49-
if (treeNode != null) {
50-
treeNode.ShowContextMenu();
51-
}
52-
}
53-
5446
private SharpTreeNode FindAssemblyTreeNode(string fullAssemblyName)
5547
{
5648
var assemblyTreeNode = this.Root.Children.FirstOrDefault(

0 commit comments

Comments
 (0)