Mercurial > pub > bltoolkit
comparison Source/ComponentModel/Design/GetTypeDialog.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:f990fcb411a9 |
---|---|
1 using System; | |
2 using System.Collections; | |
3 using System.Collections.Generic; | |
4 using System.ComponentModel.Design; | |
5 using System.Diagnostics; | |
6 using System.Reflection; | |
7 using System.Windows.Forms; | |
8 | |
9 namespace BLToolkit.ComponentModel.Design | |
10 { | |
11 public partial class GetTypeDialog : Form | |
12 { | |
13 public GetTypeDialog(IServiceProvider serviceProvider, Type baseType, Predicate<Type> filter) | |
14 { | |
15 _serviceProvider = serviceProvider; | |
16 _baseType = baseType; | |
17 _filter = filter; | |
18 | |
19 InitializeComponent(); | |
20 | |
21 LoadTypes(); | |
22 } | |
23 | |
24 private readonly IServiceProvider _serviceProvider; | |
25 private readonly Type _baseType; | |
26 private readonly Predicate<Type> _filter; | |
27 | |
28 private Type _resultType; | |
29 public Type ResultType | |
30 { | |
31 get { return _resultType; } | |
32 } | |
33 | |
34 delegate TypePicker.TypeNode GetTypeNode(Type t); | |
35 | |
36 private void LoadTypes() | |
37 { | |
38 Cursor = Cursors.WaitCursor; | |
39 | |
40 try | |
41 { | |
42 _treeView.Nodes.Clear(); | |
43 | |
44 var assemblyNodes = new Dictionary<Assembly, TreeNode>(); | |
45 var namespaceNodes = new Dictionary<string, TreeNode>(); | |
46 var typeNodes = new Dictionary<Type, TypePicker.TypeNode>(); | |
47 var service = (ITypeDiscoveryService)_serviceProvider.GetService(typeof(ITypeDiscoveryService)); | |
48 var cTypes = service.GetTypes(_baseType, _systemCheckBox.Checked); | |
49 var types = new List<Type>(cTypes.Count); | |
50 | |
51 foreach (Type type in cTypes) | |
52 types.Add(type); | |
53 | |
54 types.Sort((a, b) => | |
55 a.Assembly == b.Assembly ? | |
56 string.Compare(a.FullName, b.FullName) : | |
57 string.Compare(a.Assembly.FullName, b.Assembly.FullName)); | |
58 | |
59 foreach (var type in types) | |
60 { | |
61 if (_filter != null && _filter(type) == false) | |
62 continue; | |
63 | |
64 var assembly = type.Assembly; | |
65 | |
66 TreeNode assemblyNode; | |
67 | |
68 if (!assemblyNodes.TryGetValue(assembly, out assemblyNode)) | |
69 { | |
70 assemblyNodes[assembly] = assemblyNode = | |
71 _treeView.Nodes.Add(assembly.FullName, assembly.GetName().Name, 1, 1); | |
72 } | |
73 | |
74 var @namespace = type.Namespace ?? string.Empty; | |
75 var namespaceKey = assembly.FullName + ", " + @namespace; | |
76 | |
77 TreeNode namespaceNode; | |
78 | |
79 if (!namespaceNodes.TryGetValue(namespaceKey, out namespaceNode)) | |
80 { | |
81 namespaceNodes[namespaceKey] = namespaceNode = | |
82 assemblyNode.Nodes.Add(namespaceKey, @namespace, 2, 2); | |
83 } | |
84 | |
85 GetTypeNode getTypeNode = null; getTypeNode = t => | |
86 { | |
87 TypePicker.TypeNode node; | |
88 | |
89 if (typeNodes.TryGetValue(t, out node)) | |
90 return node; | |
91 | |
92 if (t.DeclaringType == null) | |
93 { | |
94 namespaceNode.Nodes.Add(node = new TypePicker.TypeNode(t.Name, t, false)); | |
95 } | |
96 else | |
97 { | |
98 TreeNode parent = getTypeNode(t.DeclaringType); | |
99 | |
100 parent.Nodes.Add(node = new TypePicker.TypeNode(t.Name, t, false)); | |
101 } | |
102 | |
103 typeNodes.Add(t, node); | |
104 | |
105 return node; | |
106 }; | |
107 | |
108 getTypeNode(type).IsSelectable = true; | |
109 } | |
110 } | |
111 catch (Exception ex) | |
112 { | |
113 Debug.WriteLine(ex.Message); | |
114 } | |
115 finally | |
116 { | |
117 Cursor = Cursors.Default; | |
118 } | |
119 } | |
120 | |
121 private void systemCheckBox_CheckedChanged(object sender, EventArgs e) | |
122 { | |
123 LoadTypes(); | |
124 } | |
125 | |
126 private void treeView_AfterSelect(object sender, TreeViewEventArgs e) | |
127 { | |
128 var node = e.Node as TypePicker.TypeNode; | |
129 | |
130 _resultType = node != null && node.IsSelectable? node.Type: null; | |
131 | |
132 _okButton.Enabled = _resultType != null; | |
133 } | |
134 | |
135 private void treeView_DoubleClick(object sender, EventArgs e) | |
136 { | |
137 _okButton.PerformClick(); | |
138 } | |
139 | |
140 } | |
141 } |