- Timestamp:
- 01/20/10 05:04:31 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Core.Views/3.3/OperatorGraphView.cs
r2546 r2655 30 30 using HeuristicLab.Common; 31 31 using HeuristicLab.MainForm; 32 using HeuristicLab.Collections; 32 33 33 34 namespace HeuristicLab.Core.Views { 34 35 /// <summary> 35 /// The visual representation of an <see cref=" IOperatorGraph"/>.36 /// The visual representation of an <see cref="OperatorGraph"/>. 36 37 /// </summary> 37 38 [Content(typeof(OperatorGraph), true)] 38 39 public partial class OperatorGraphView : ItemViewBase { 39 private ChooseOperatorDialog chooseOperatorDialog;40 private Dictionary<IOperator, IList<TreeNode>> operatorNodeTable;41 42 40 /// <summary> 43 41 /// Gets or sets the operator graph to represent visually. … … 45 43 /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>. 46 44 /// No own data storage present.</remarks> 47 public IOperatorGraph OperatorGraph {48 get { return ( IOperatorGraph)Item; }45 public OperatorGraph OperatorGraph { 46 get { return (OperatorGraph)Item; } 49 47 set { base.Item = value; } 50 48 } … … 55 53 public OperatorGraphView() { 56 54 InitializeComponent(); 57 operatorNodeTable = new Dictionary<IOperator, IList<TreeNode>>();58 operatorsListView.Columns[0].Width = Math.Max(0, operatorsListView.Width - 25);59 55 Caption = "Operator Graph"; 60 56 } … … 65 61 /// <remarks>Calls <see cref="OperatorGraphView()"/>.</remarks> 66 62 /// <param name="operatorGraph">The operator graph to represent visually.</param> 67 public OperatorGraphView( IOperatorGraph operatorGraph)63 public OperatorGraphView(OperatorGraph operatorGraph) 68 64 : this() { 69 65 OperatorGraph = operatorGraph; … … 74 70 /// </summary> 75 71 /// <remarks>Calls <see cref="ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.</remarks> 76 protected override void RemoveItemEvents() { 77 OperatorGraph.OperatorAdded -= new EventHandler<EventArgs<IOperator>>(OperatorGraph_OperatorAdded); 78 OperatorGraph.OperatorRemoved -= new EventHandler<EventArgs<IOperator>>(OperatorGraph_OperatorRemoved); 72 protected override void DeregisterObjectEvents() { 79 73 OperatorGraph.InitialOperatorChanged -= new EventHandler(OperatorGraph_InitialOperatorChanged); 80 base. RemoveItemEvents();74 base.DeregisterObjectEvents(); 81 75 } 76 82 77 /// <summary> 83 78 /// Adds eventhandlers to the underlying <see cref="IOperatorGraph"/>. 84 79 /// </summary> 85 80 /// <remarks>Calls <see cref="ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.</remarks> 86 protected override void AddItemEvents() { 87 base.AddItemEvents(); 88 OperatorGraph.OperatorAdded += new EventHandler<EventArgs<IOperator>>(OperatorGraph_OperatorAdded); 89 OperatorGraph.OperatorRemoved += new EventHandler<EventArgs<IOperator>>(OperatorGraph_OperatorRemoved); 81 protected override void RegisterObjectEvents() { 82 base.RegisterObjectEvents(); 90 83 OperatorGraph.InitialOperatorChanged += new EventHandler(OperatorGraph_InitialOperatorChanged); 91 84 } … … 95 88 /// </summary> 96 89 /// <remarks>Calls <see cref="ViewBase.UpdateControls"/> of base class <see cref="ViewBase"/>.</remarks> 97 protected override void UpdateControls() { 98 base.UpdateControls(); 99 if (graphTreeView.Nodes.Count > 0) 100 RemoveTreeNode(graphTreeView.Nodes[0]); 101 graphTreeView.SelectedNode = null; 102 graphTreeView.Nodes.Clear(); 103 graphTreeView.Enabled = false; 104 operatorsListView.Items.Clear(); 105 removeButton.Enabled = false; 90 protected override void OnObjectChanged() { 91 base.OnObjectChanged(); 92 operatorsView.ItemSet = null; 93 operatorsView.Enabled = false; 94 graphView.Operator = null; 95 graphView.Enabled = false; 106 96 if (OperatorGraph == null) { 107 97 Caption = "Operator Graph"; 108 operatorsListView.Enabled = false; 109 addOperatorButton.Enabled = false; 98 operatorsView.ItemSet = null; 99 operatorsView.Enabled = false; 100 graphView.Operator = null; 101 graphView.Enabled = false; 110 102 } else { 111 Caption = "Operator Graph (" + OperatorGraph.GetType().Name + ")"; 112 foreach (IOperator op in OperatorGraph.Operators) { 113 operatorsListView.Items.Add(CreateListViewItem(op)); 114 } 115 operatorsListView.Enabled = true; 116 addOperatorButton.Enabled = true; 117 if (OperatorGraph.InitialOperator != null) { 118 graphTreeView.Nodes.Add(CreateTreeNode(OperatorGraph.InitialOperator)); 119 graphTreeView.Enabled = true; 120 } 103 Caption = OperatorGraph.ItemName + " (" + OperatorGraph.GetType().Name + ")"; 104 operatorsView.ItemSet = OperatorGraph.Operators; 105 operatorsView.Enabled = true; 106 MarkInitialOperator(); 107 graphView.Operator = OperatorGraph.InitialOperator; 108 graphView.Enabled = true; 121 109 } 122 110 } 123 111 124 private ListViewItem CreateListViewItem(IOperator op) { 125 ListViewItem item = new ListViewItem(); 126 item.Text = op.Name; 127 item.Tag = op; 128 item.ImageIndex = 0; 129 if (op.GetType().Name == "CombinedOperator") 130 item.ImageIndex = 1; 131 else if (op.GetType().Name == "ProgrammableOperator") 132 item.ImageIndex = 2; 133 if (op == OperatorGraph.InitialOperator) 134 item.Font = new Font(operatorsListView.Font, FontStyle.Bold); 135 return item; 136 } 137 138 private TreeNode CreateTreeNode(IOperator op) { 139 TreeNode node = new TreeNode(); 140 node.Text = op.Name; 141 node.Tag = op; 142 if (op.Breakpoint) 143 node.ForeColor = Color.Red; 144 145 if (!operatorNodeTable.ContainsKey(op)) { 146 operatorNodeTable.Add(op, new List<TreeNode>()); 147 op.NameChanged += new EventHandler(Operator_NameChanged); 148 op.BreakpointChanged += new EventHandler(Operator_BreakpointChanged); 149 op.SubOperatorAdded += new EventHandler<EventArgs<IOperator, int>>(Operator_SubOperatorAdded); 150 op.SubOperatorRemoved += new EventHandler<EventArgs<IOperator, int>>(Operator_SubOperatorRemoved); 151 } 152 operatorNodeTable[op].Add(node); 153 154 for (int i = 0; i < op.SubOperators.Count; i++) 155 node.Nodes.Add(new TreeNode()); 156 return node; 157 } 158 159 private void RemoveTreeNode(TreeNode node) { 160 foreach (TreeNode child in node.Nodes) 161 RemoveTreeNode(child); 162 163 IOperator op = (IOperator)node.Tag; 164 if (op != null) { 165 operatorNodeTable[op].Remove(node); 166 if (operatorNodeTable[op].Count == 0) { 167 op.NameChanged -= new EventHandler(Operator_NameChanged); 168 op.BreakpointChanged -= new EventHandler(Operator_BreakpointChanged); 169 op.SubOperatorAdded -= new EventHandler<EventArgs<IOperator, int>>(Operator_SubOperatorAdded); 170 op.SubOperatorRemoved -= new EventHandler<EventArgs<IOperator, int>>(Operator_SubOperatorRemoved); 171 operatorNodeTable.Remove(op); 172 } 112 private void MarkInitialOperator() { 113 foreach (ListViewItem item in operatorsView.ItemsListView.Items) { 114 if ((OperatorGraph.InitialOperator != null) && (((IOperator)item.Tag) == OperatorGraph.InitialOperator)) 115 item.Font = new Font(operatorsView.ItemsListView.Font, FontStyle.Bold); 116 else 117 item.Font = operatorsView.ItemsListView.Font; 173 118 } 174 119 } 175 120 176 #region ListView Events177 private void operatorsListView_SelectedIndexChanged(object sender, EventArgs e) {178 removeButton.Enabled = false;179 if (operatorsListView.SelectedItems.Count > 0) {180 removeButton.Enabled = true;181 }182 }183 private void operatorsListView_DoubleClick(object sender, EventArgs e) {184 if (operatorsListView.SelectedItems.Count == 1) {185 IOperator op = (IOperator)operatorsListView.SelectedItems[0].Tag;186 IView view = MainFormManager.CreateDefaultView(op);187 if (view != null) MainFormManager.MainForm.ShowView(view);188 }189 }190 #endregion191 192 #region TreeView Events193 private void graphTreeView_BeforeExpand(object sender, TreeViewCancelEventArgs e) {194 TreeNode node = e.Node;195 IOperator op = (IOperator)node.Tag;196 for (int i = 0; i < node.Nodes.Count; i++) {197 if (node.Nodes[i].Tag == null) {198 node.Nodes[i].Remove();199 node.Nodes.Insert(i, CreateTreeNode(op.SubOperators[i]));200 }201 }202 }203 private void graphTreeView_AfterSelect(object sender, TreeViewEventArgs e) {204 IOperator op = (IOperator)e.Node.Tag;205 foreach (ListViewItem item in operatorsListView.Items)206 item.Selected = item.Tag == op;207 }208 #endregion209 210 #region Size Changed Events211 private void operatorsListView_SizeChanged(object sender, EventArgs e) {212 if (operatorsListView.Columns.Count > 0)213 operatorsListView.Columns[0].Width = Math.Max(0, operatorsListView.Width - 25);214 }215 #endregion216 217 #region Key Events218 private void operatorsListView_KeyDown(object sender, KeyEventArgs e) {219 if (e.KeyCode == Keys.Delete) {220 if (operatorsListView.SelectedItems.Count > 0) {221 foreach (ListViewItem item in operatorsListView.SelectedItems)222 OperatorGraph.RemoveOperator((IOperator)item.Tag);223 }224 }225 if (e.KeyCode == Keys.F2) {226 if (operatorsListView.SelectedItems.Count == 1)227 operatorsListView.SelectedItems[0].BeginEdit();228 }229 }230 private void graphTreeView_KeyDown(object sender, KeyEventArgs e) {231 if (e.KeyCode == Keys.Delete) {232 TreeNode node = graphTreeView.SelectedNode;233 if ((node != null) && (node.Parent != null)) {234 IOperator parent = (IOperator)node.Parent.Tag;235 parent.RemoveSubOperator(node.Index);236 }237 }238 }239 #endregion240 241 #region Edit Events242 private void operatorsListView_AfterLabelEdit(object sender, LabelEditEventArgs e) {243 e.CancelEdit = false;244 245 string name = e.Label;246 if (name != null) {247 IOperator op = (IOperator)operatorsListView.Items[e.Item].Tag;248 op.Name = name;249 }250 }251 #endregion252 253 #region Button Events254 private void addOperatorButton_Click(object sender, EventArgs e) {255 if (chooseOperatorDialog == null) chooseOperatorDialog = new ChooseOperatorDialog();256 if (chooseOperatorDialog.ShowDialog(this) == DialogResult.OK)257 OperatorGraph.AddOperator(chooseOperatorDialog.Operator);258 }259 private void removeButton_Click(object sender, EventArgs e) {260 if (operatorsListView.SelectedItems.Count > 0) {261 foreach (ListViewItem item in operatorsListView.SelectedItems)262 OperatorGraph.RemoveOperator((IOperator)item.Tag);263 }264 }265 #endregion266 267 #region Drag and Drop Events268 private void operatorsListView_ItemDrag(object sender, ItemDragEventArgs e) {269 ListViewItem item = (ListViewItem)e.Item;270 IOperator op = (IOperator)item.Tag;271 DataObject data = new DataObject();272 data.SetData("IOperator", op);273 data.SetData("DragSource", operatorsListView);274 DoDragDrop(data, DragDropEffects.Copy);275 }276 private void operatorsListView_DragEnter(object sender, DragEventArgs e) {277 e.Effect = DragDropEffects.None;278 if (e.Data.GetDataPresent("IOperator"))279 e.Effect = DragDropEffects.Copy;280 }281 private void operatorsListView_DragOver(object sender, DragEventArgs e) {282 e.Effect = DragDropEffects.None;283 if (e.Data.GetDataPresent("IOperator"))284 e.Effect = DragDropEffects.Copy;285 }286 private void operatorsListView_DragDrop(object sender, DragEventArgs e) {287 if (e.Effect != DragDropEffects.None) {288 if (e.Data.GetDataPresent("IOperator")) {289 IOperator op = (IOperator)e.Data.GetData("IOperator");290 op = (IOperator)op.Clone();291 OperatorGraph.AddOperator(op);292 }293 }294 }295 private void graphTreeView_ItemDrag(object sender, ItemDragEventArgs e) {296 TreeNode node = (TreeNode)e.Item;297 if (node.Parent != null) {298 IOperator op = (IOperator)node.Tag;299 IOperator parent = (IOperator)node.Parent.Tag;300 int index = node.Index;301 DataObject data = new DataObject();302 data.SetData("IOperator", op);303 data.SetData("DragSource", graphTreeView);304 data.SetData("ParentOperator", parent);305 data.SetData("Index", index);306 DoDragDrop(data, DragDropEffects.Move);307 }308 }309 private void graphTreeView_DragEnter(object sender, DragEventArgs e) {310 e.Effect = DragDropEffects.None;311 if (e.Data.GetDataPresent("IOperator")) {312 Point p = graphTreeView.PointToClient(new Point(e.X, e.Y));313 TreeNode node = graphTreeView.GetNodeAt(p);314 if (node != null) {315 if ((e.Data.GetDataPresent("ParentOperator")) && (node.Parent != null)) {316 if ((e.Data.GetDataPresent("DragSource")) && (e.Data.GetData("DragSource") == graphTreeView))317 e.Effect = DragDropEffects.Move;318 } else {319 if ((e.Data.GetDataPresent("DragSource")) && (e.Data.GetData("DragSource") == operatorsListView))320 e.Effect = DragDropEffects.Copy;321 }322 }323 }324 }325 private void graphTreeView_DragOver(object sender, DragEventArgs e) {326 e.Effect = DragDropEffects.None;327 if (e.Data.GetDataPresent("IOperator")) {328 Point p = graphTreeView.PointToClient(new Point(e.X, e.Y));329 TreeNode node = graphTreeView.GetNodeAt(p);330 if (node != null) {331 if ((e.Data.GetDataPresent("ParentOperator")) && (node.Parent != null)) {332 if ((e.Data.GetDataPresent("DragSource")) && (e.Data.GetData("DragSource") == graphTreeView))333 e.Effect = DragDropEffects.Move;334 } else {335 if ((e.Data.GetDataPresent("DragSource")) && (e.Data.GetData("DragSource") == operatorsListView))336 e.Effect = DragDropEffects.Copy;337 }338 }339 }340 }341 private void graphTreeView_DragDrop(object sender, DragEventArgs e) {342 if (e.Effect != DragDropEffects.None) {343 if (e.Data.GetDataPresent("IOperator")) {344 IOperator op = (IOperator)e.Data.GetData("IOperator");345 Point p = graphTreeView.PointToClient(new Point(e.X, e.Y));346 TreeNode node = graphTreeView.GetNodeAt(p);347 if (e.Data.GetDataPresent("ParentOperator")) {348 if (node.Parent != null) {349 TreeNode parentNode = node.Parent;350 IOperator oldParent = (IOperator)e.Data.GetData("ParentOperator");351 int oldIndex = (int)e.Data.GetData("Index");352 IOperator newParent = (IOperator)node.Parent.Tag;353 int newIndex = node.Index;354 oldParent.RemoveSubOperator(oldIndex);355 newParent.AddSubOperator(op, newIndex);356 graphTreeView.SelectedNode = parentNode.Nodes[newIndex];357 }358 } else {359 if (node != null) {360 IOperator parent = (IOperator)node.Tag;361 parent.AddSubOperator(op);362 graphTreeView.SelectedNode = node.Nodes[node.Nodes.Count - 1];363 }364 }365 }366 }367 }368 #endregion369 370 121 #region Context Menu Events 371 122 private void operatorsContextMenuStrip_Opening(object sender, CancelEventArgs e) { 372 viewToolStripMenuItem.Enabled = false;373 123 initialOperatorToolStripMenuItem.Enabled = false; 374 124 initialOperatorToolStripMenuItem.Checked = false; 375 if (operatorsListView.SelectedItems.Count == 1) { 376 IOperator op = (IOperator)operatorsListView.SelectedItems[0].Tag; 377 IView view = MainFormManager.CreateDefaultView(op); 378 if (view != null) { 379 viewToolStripMenuItem.Enabled = true; 380 viewToolStripMenuItem.Tag = view; 381 } 125 if (operatorsView.ItemsListView.SelectedItems.Count == 1) { 126 IOperator op = (IOperator)operatorsView.ItemsListView.SelectedItems[0].Tag; 382 127 initialOperatorToolStripMenuItem.Enabled = true; 383 128 initialOperatorToolStripMenuItem.Tag = op; … … 386 131 } 387 132 } 388 private void viewToolStripMenuItem_Click(object sender, EventArgs e) {389 IView view = ((ToolStripMenuItem)sender).Tag as IView;390 if (view != null) MainFormManager.MainForm.ShowView(view);391 }392 133 private void initialOperatorToolStripMenuItem_Click(object sender, EventArgs e) { 393 if (initialOperatorToolStripMenuItem.Checked) { 394 foreach (ListViewItem item in operatorsListView.Items) 395 item.Font = operatorsListView.Font; 396 operatorsListView.SelectedItems[0].Font = new Font(operatorsListView.Font, FontStyle.Bold); 134 if (initialOperatorToolStripMenuItem.Checked) 397 135 OperatorGraph.InitialOperator = (IOperator)initialOperatorToolStripMenuItem.Tag; 398 } else { 399 operatorsListView.SelectedItems[0].Font = operatorsListView.Font; 136 else 400 137 OperatorGraph.InitialOperator = null; 401 }402 }403 private void graphContextMenuStrip_Opening(object sender, CancelEventArgs e) {404 viewToolStripMenuItem1.Enabled = false;405 breakpointToolStripMenuItem.Enabled = false;406 breakpointToolStripMenuItem.Checked = false;407 if (graphTreeView.SelectedNode != null) {408 IOperator op = (IOperator)graphTreeView.SelectedNode.Tag;409 IView view = MainFormManager.CreateDefaultView(op);410 if (view != null) {411 viewToolStripMenuItem1.Enabled = true;412 viewToolStripMenuItem1.Tag = view;413 }414 breakpointToolStripMenuItem.Enabled = true;415 breakpointToolStripMenuItem.Tag = op;416 if (op.Breakpoint)417 breakpointToolStripMenuItem.Checked = true;418 }419 }420 private void breakpointToolStripMenuItem_Click(object sender, EventArgs e) {421 IOperator op = (IOperator)breakpointToolStripMenuItem.Tag;422 op.Breakpoint = breakpointToolStripMenuItem.Checked;423 138 } 424 139 #endregion 425 140 426 141 #region OperatorGraph Events 427 private void OperatorGraph_OperatorAdded(object sender, EventArgs<IOperator> e) {428 operatorsListView.Items.Add(CreateListViewItem(e.Value));429 }430 private void OperatorGraph_OperatorRemoved(object sender, EventArgs<IOperator> e) {431 ListViewItem itemToDelete = null;432 foreach (ListViewItem item in operatorsListView.Items) {433 if (item.Tag == e.Value)434 itemToDelete = item;435 }436 itemToDelete.Remove();437 }438 142 private void OperatorGraph_InitialOperatorChanged(object sender, EventArgs e) { 439 Refresh(); 440 } 441 #endregion 442 443 #region Operator Events 444 private void Operator_NameChanged(object sender, EventArgs e) { 445 IOperator op = (IOperator)sender; 446 foreach (TreeNode node in operatorNodeTable[op]) 447 node.Text = op.Name; 448 } 449 private void Operator_BreakpointChanged(object sender, EventArgs e) { 450 IOperator op = (IOperator)sender; 451 foreach (TreeNode node in operatorNodeTable[op]) { 452 if (op.Breakpoint) 453 node.ForeColor = Color.Red; 454 else 455 node.ForeColor = graphTreeView.ForeColor; 456 } 457 } 458 private void Operator_SubOperatorAdded(object sender, EventArgs<IOperator, int> e) { 459 IOperator op = (IOperator)sender; 460 if (operatorNodeTable.ContainsKey(op)) { 461 TreeNode[] nodes = new TreeNode[operatorNodeTable[op].Count]; 462 operatorNodeTable[op].CopyTo(nodes, 0); 463 foreach (TreeNode node in nodes) 464 node.Nodes.Insert(e.Value2, CreateTreeNode(e.Value)); 465 } 466 } 467 private void Operator_SubOperatorRemoved(object sender, EventArgs<IOperator, int> e) { 468 IOperator op = (IOperator)sender; 469 if (operatorNodeTable.ContainsKey(op)) { 470 TreeNode[] nodes = new TreeNode[operatorNodeTable[op].Count]; 471 operatorNodeTable[op].CopyTo(nodes, 0); 472 foreach (TreeNode node in nodes) { 473 RemoveTreeNode(node.Nodes[e.Value2]); 474 node.Nodes.RemoveAt(e.Value2); 475 } 143 if (InvokeRequired) 144 Invoke(new EventHandler(OperatorGraph_InitialOperatorChanged), sender, e); 145 else { 146 MarkInitialOperator(); 147 graphView.Operator = OperatorGraph.InitialOperator; 476 148 } 477 149 } 478 150 #endregion 479 151 480 #region Mouse Events 481 private void graphTreeView_MouseDown(object sender, MouseEventArgs e) { 482 if (e.Button != MouseButtons.Right) return; 483 TreeNode clickedNode = graphTreeView.GetNodeAt(e.X, e.Y); 484 if (clickedNode != null) { 485 graphTreeView.SelectedNode = clickedNode; 486 graphTreeView.Refresh(); 487 } 152 private void operatorsView_Load(object sender, EventArgs e) { 153 operatorsView.ItemsListView.ContextMenuStrip = operatorsContextMenuStrip; 488 154 } 489 #endregion490 491 155 } 492 156 }
Note: See TracChangeset
for help on using the changeset viewer.