using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; using System.Reflection; using Brains.Framework.Behaviors; using Brains.Framework.Designer; using System.Xml.Serialization; namespace Designer { public partial class Form1 : Form { List _assemblies; BehaviorNode _rootNode; public Form1() { InitializeComponent(); LoadAIBehaviorData(); } string assemblyPath; private void LoadAIBehaviorData() { _assemblies = new List(); string path = Properties.Settings.Default.Behaviors; assemblyPath = Path.GetDirectoryName(path); //File.Copy( // path, // Application.StartupPath +"\\"+ Path.GetFileName(path),true); AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); LoadAssembly(Application.StartupPath + "\\" + "Brains.Framework.dll"); LoadAssembly(path); } Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) { Console.Write(""); return null; } private void LoadAssembly(string file) { try { Assembly _asm = Assembly.LoadFrom(file); _assemblies.Add(_asm); foreach (var item in _asm.GetTypes()) { if (item.GetInterface(typeof(ICompositeBehavior).FullName)!=null) { object[] att = item.GetCustomAttributes(true); if (att.Length == 1) { TreeNode node = CreateNode(((BehaviorAttribute)att[0]).FriendlyName, item); ToolStripItem mnu = compositeToolStripMenuItem.DropDownItems.Add(item.Name); mnu.Click += new EventHandler(CompositeItemClick); mnu.Tag = node; } } if (item.GetInterface(typeof(IActionBehavior).FullName) != null) { object[] att = item.GetCustomAttributes(true); if (att.Length == 1) { TreeNode node = CreateNode(((BehaviorAttribute)att[0]).FriendlyName, item); ToolStripItem mnu = actionsToolStripMenuItem.DropDownItems.Add(item.Name); mnu.Click += new EventHandler(CompositeItemClick); mnu.Tag = node; } } if (item.GetInterface(typeof(IConditionBehavior).FullName) != null) { object[] att = item.GetCustomAttributes(true); if (att.Length == 1) { TreeNode node = CreateNode(((BehaviorAttribute)att[0]).FriendlyName, item); ToolStripItem mnu = conditionToolStripMenuItem.DropDownItems.Add(item.Name); mnu.Click += new EventHandler(CompositeItemClick); mnu.Tag = node; } } } } catch(Exception err) { Console.Write(err.ToString()); } } void CompositeItemClick(object sender, EventArgs e) { if (((ToolStripItem)sender).Tag != null) { BehaviorNode _node = new BehaviorNode(); TreeNode node = (TreeNode)((ToolStripItem)sender).Tag; _node.Name = node.Text; _node.Type = ((BehaviorNode)node.Tag).Type; foreach (var item in _node.Type.GetProperties()) { object[] attribs = item.GetCustomAttributes(true); if (attribs.Length == 1) { BehaviorParameterAttribute par = (BehaviorParameterAttribute)attribs[0]; _node.Parameters.Add(new Parameter(par.FriendlyName, "")); } } TreeNode _newTreeNode = (TreeNode)node.Clone(); _newTreeNode.Tag = _node; ((BehaviorNode)treeView1.SelectedNode.Tag).SubBehaviors.Add(_node); treeView1.SelectedNode.Nodes.Add(_newTreeNode); treeView1.SelectedNode.Expand(); behaviorTreeViewer1.Invalidate(); } } private void toolStripButton1_Click(object sender, EventArgs e) { treeView1.Nodes.Clear(); _rootNode = new BehaviorNode(); _rootNode.Name = "Behavior"; _rootNode.AddParameter("RootType", ""); _rootNode.BehaviorName = "Root"; TreeNode _rootBehaviorNode = new TreeNode(_rootNode.Name); _rootBehaviorNode.Tag = _rootNode; treeView1.Nodes.Add(_rootBehaviorNode); behaviorTreeViewer1.rootBehavior = _rootNode; } private TreeNode CreateNode(string name, Type type) { TreeNode _no = new TreeNode(name); BehaviorNode _n = new BehaviorNode(); _n.Name = name; if(type!=null) _n.BehaviorName = type.Name; _n.Type =type; _no.Tag = _n; return _no; } private void treeView1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { treeView1.SelectedNode = treeView1.GetNodeAt(e.X, e.Y); } } private void actionsToolStripMenuItem_Click(object sender, EventArgs e) { } private void toolStripButton2_Click(object sender, EventArgs e) { XmlSerializer ser = new XmlSerializer(typeof(BehaviorNode)); StreamWriter sw=new StreamWriter("Output.xml"); ser.Serialize(sw, treeView1.Nodes[0].Tag as BehaviorNode); sw.Close(); } private void toolStripButton3_Click(object sender, EventArgs e) { OpenFileDialog _ofd = new OpenFileDialog(); _ofd.ShowDialog(); string filename = _ofd.FileName; if (filename != string.Empty) { StreamReader _sr=new StreamReader(filename); XmlSerializer _ser = new XmlSerializer(typeof(BehaviorNode)); _rootNode=(BehaviorNode)_ser.Deserialize(_sr); _sr.Close(); PopulateTree(); } } private void PopulateTree() { treeView1.Nodes.Clear(); TreeNode _node = CreateNode("Behavior", null); _node.Tag = _rootNode; treeView1.Nodes.Add(_node); RecursiveNode(_rootNode,_node); } private void RecursiveNode(BehaviorNode node,TreeNode parentTreeNode) { foreach (var item in node.SubBehaviors) { item.Type = GetTypeByName(item.TypeName); TreeNode _node = CreateNode(item.Name, item.Type); parentTreeNode.Nodes.Add(_node); RecursiveNode(item,_node); } } private Type GetTypeByName(string p) { if (p == "") return null; foreach (var item in _assemblies) { Type t=item.GetType(p); if (t != null) return t; } return null; } private void conditionToolStripMenuItem_Click(object sender, EventArgs e) { } private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) { propertyGrid1.SelectedObject = treeView1.SelectedNode.Tag; //TreeNode node = treeView1.SelectedNode; //splitContainer1.Panel2.Controls.Clear(); //BehaviorNode _node=node.Tag as BehaviorNode; //Point _controlPosition = new Point(15, 25); //int gap = 25; //foreach (var item in _node.Parameters) //{ // Label label = new Label(); // label.AutoSize = true; // label.Text = item.Name; // label.Location = _controlPosition; // splitContainer1.Panel2.Controls.Add(label); // Control ctrl = CreateParameterControl(item); // ctrl.Location = new Point(_controlPosition.X + 60, _controlPosition.Y-2); // splitContainer1.Panel2.Controls.Add(ctrl); // _controlPosition.Y += gap; //} } private Control CreateParameterControl(Parameter item) { TextBox txt = new TextBox(); txt.Tag = item; txt.TextChanged += new EventHandler(txt_TextChanged); txt.Text = item.Value; return txt; } void txt_TextChanged(object sender, EventArgs e) { ((Parameter)((Control)sender).Tag).Value = ((TextBox)sender).Text; } private void propertyGrid1_Click(object sender, EventArgs e) { } private void propertyGrid1_PropertyValueChanged(object s, PropertyValueChangedEventArgs e) { RefreshTreeNode(); } private void RefreshTreeNode() { if (((BehaviorNode)treeView1.SelectedNode.Tag).BehaviorName != null) treeView1.SelectedNode.Text = ((BehaviorNode)treeView1.SelectedNode.Tag).BehaviorName; else if (((BehaviorNode)treeView1.SelectedNode.Tag).Type != null) treeView1.SelectedNode.Text = ((BehaviorNode)treeView1.SelectedNode.Tag).Type.Name; else treeView1.SelectedNode.Text = "Root"; } } }