singrdk/base/Windows/csic/Browser/CodeDomTreeView.cs

115 lines
3.1 KiB
C#
Raw Normal View History

2008-11-17 18:29:00 -05:00
using System;
using System.CodeDom;
using System.Reflection;
using System.Collections;
using System.Windows.Forms;
namespace Browser {
public class CodeDomTreeView {
private TreeView tv;
private Model model;
private Hashtable o2n = new Hashtable();
private CodeCompileUnit cu;
public CodeDomTreeView(Model model, TreeView tv) {
this.model = model;
this.tv = tv;
model.ObjectChangedHandler += new ObjectChangedEventHandler(this.ObjectChanged);
tv.MouseUp += new MouseEventHandler(this.UserAfterSelect);
}
public static Control NewBrowser(Model model) {
TabControl tab = new TabControl();
tab.Alignment = TabAlignment.Bottom;
new SourceTabView(model, tab, new NewControl(CodeDomTreeView.NewControl));
return tab;
}
public static Control NewControl(Model model, object o) {
IHasCoordinate ihc = (IHasCoordinate) o;
TreeView tv = new TreeView();
tv.HideSelection = false;
CodeDomTreeView cdtv = new CodeDomTreeView(model, tv);
if (ihc is AST) {
cdtv.init((AST) ihc);
}
tv.MouseUp += new MouseEventHandler(cdtv.UserAfterSelect);
cdtv.ObjectChanged();
return tv;
}
public void UserAfterSelect(object o, MouseEventArgs argv) {
UserAfterSelect();
}
public void UserAfterSelect() {
object o = tv.SelectedNode.Tag;
model.ChangeObject(o);
}
public void ObjectChanged() {
object o = model.CurrentObject;
if (o != null) {
TreeNode tn = (TreeNode) o2n[o];
if (tn != null) {
tv.SelectedNode = tn;
}
} else {
}
}
private void init(AST ast) {
while (ast != null && !(ast is compilation_unit)) {
ast = ast.parent;
}
if (ast != null) {
cu = AST2CodeDom2.Compile((compilation_unit) ast);
AddKid(cu, tv.Nodes, "", ast);
}
}
private void AddKid(object o, TreeNodeCollection tnc, string name, AST key) {
TreeNode n = new TreeNode();
tnc.Add(n);
if (o == null) {
n.Text = name + ": null";
} else { // o != null
System.Type t = o.GetType();
if (o is CodeObject) {
CodeObject co = (CodeObject) o;
AST ast = (AST) co.UserData["AST"];
int c = co.UserData.Count;
if (ast != null && !o2n.Contains(ast)) { // incredibly bogus because CodeDom synthesizes its own nodes!! void type of property setter...
o2n[ast] = n;
}
n.Tag = ast;
foreach (PropertyInfo pi in t.GetProperties()) {
if (pi.GetIndexParameters().Length == 0) {
if (!(o is CodeObject) || pi.Name != "UserData") {
object x = pi.GetValue(o, null);
AddKid(x, n.Nodes, pi.Name, ast);
}
}
}
n.Text = name + ": " + t.ToString();
} else if (o is IList) {
IList a = (IList) o;
if (a.Count > 0) {
for (int i = 0; i < a.Count; i++) {
object x = a[i];
AddKid(x, n.Nodes, name + "["+i.ToString()+"]", key);
}
n.Tag = key;
n.Text = name + ": " + t.ToString() + "{" + a.Count + "}";
} else {
tnc.Remove(n);
}
} else {
n.Tag = key;
n.Text = name + ": " + t.ToString() + " = " + o.ToString();
}
}
}
}
}