Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Core.Views/3.3/OperatorLibraryView.cs @ 2636

Last change on this file since 2636 was 2546, checked in by swagner, 15 years ago

Continued work on Optimizer and on adapting all views to the new MainForm concept (#770)

File size: 12.5 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using System.Collections;
24using System.Collections.Generic;
25using System.ComponentModel;
26using System.Drawing;
27using System.Data;
28using System.Text;
29using System.Windows.Forms;
30using HeuristicLab.PluginInfrastructure;
31using HeuristicLab.MainForm;
32
33namespace HeuristicLab.Core.Views {
34  /// <summary>
35  /// Visual representation of the class <see cref="IOperatorLibrary"/>.
36  /// </summary>
37  [Content(typeof(OperatorLibrary), true)]
38  public partial class OperatorLibraryView : ItemViewBase {
39    private ChooseOperatorDialog chooseOperatorDialog;
40
41    /// <summary>
42    /// Gets or sets the operator library that should be displayed.
43    /// </summary>
44    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="EditorBase"/>.</remarks>
45    public IOperatorLibrary OperatorLibrary {
46      get { return (IOperatorLibrary)Item; }
47      set { base.Item = value; }
48    }
49
50    /// <summary>
51    /// Initializes a new instance of <see cref="OperatorLibraryEditor"/> with caption
52    /// <c>Operator Library</c>.
53    /// </summary>
54    public OperatorLibraryView() {
55      InitializeComponent();
56      operatorsTreeView.TreeViewNodeSorter = new NodeSorter();
57      Caption = "Operator Library";
58    }
59    /// <summary>
60    /// Initializes a new instance of <see cref="OperatorLibraryEditor"/> with the
61    /// specified <paramref name="operatorLibrary"/>.
62    /// </summary>
63    /// <param name="operatorLibrary">The operator library to display.</param>
64    public OperatorLibraryView(IOperatorLibrary operatorLibrary)
65      : this() {
66      OperatorLibrary = operatorLibrary;
67    }
68
69    private class NodeSorter : IComparer {
70      public int Compare(object x, object y) {
71        TreeNode tx = x as TreeNode;
72        TreeNode ty = y as TreeNode;
73
74        int result = string.Compare(tx.Text, ty.Text);
75        if (result == 0)
76          result = tx.Index.CompareTo(ty.Index);
77        return result;
78      }
79    }
80
81    /// <summary>
82    /// Updates all controls with the latest data of the model.
83    /// </summary>
84    /// <remarks>Calls <see cref="EditorBase.UpdateControls"/> of base class <see cref="EditorBase"/>.</remarks>
85    protected override void UpdateControls() {
86      base.UpdateControls();
87      operatorsTreeView.Nodes.Clear();
88      addGroupButton.Enabled = false;
89      addOperatorButton.Enabled = false;
90      removeButton.Enabled = false;
91      if (OperatorLibrary == null) {
92        Caption = "Operator Library";
93        operatorsGroupBox.Enabled = false;
94      } else {
95        Caption = OperatorLibrary.Group.Name + " (" + OperatorLibrary.GetType().Name + ")";
96        operatorsGroupBox.Enabled = true;
97        operatorsTreeView.Nodes.Add(CreateTreeNode(OperatorLibrary.Group));
98        operatorsTreeView.Sort();
99      }
100    }
101
102    private TreeNode CreateTreeNode(IOperatorGroup group) {
103      TreeNode node = new TreeNode();
104      node.Text = group.Name;
105      node.ForeColor = Color.LightGray;
106      node.Tag = group;
107
108      foreach (IOperator op in group.Operators)
109        node.Nodes.Add(CreateTreeNode(op));
110      foreach (IOperatorGroup subGroup in group.SubGroups)
111        node.Nodes.Add(CreateTreeNode(subGroup));
112      return node;
113    }
114    private TreeNode CreateTreeNode(IOperator op) {
115      TreeNode node = new TreeNode();
116      node.Text = op.Name;
117      node.ToolTipText = op.GetType().Name;
118      node.Tag = op;
119      return node;
120    }
121    private void RemoveTreeNode(TreeNode node) {
122      if (node.Tag is IOperatorGroup) {
123        IOperatorGroup group = node.Tag as IOperatorGroup;
124        IOperatorGroup parent = node.Parent.Tag as IOperatorGroup;
125        parent.RemoveSubGroup(group);
126      } else if (node.Tag is IOperator) {
127        IOperator op = node.Tag as IOperator;
128        IOperatorGroup group = node.Parent.Tag as IOperatorGroup;
129        group.RemoveOperator(op);
130      }
131      node.Remove();
132      EnableDisableButtons();
133    }
134
135    private void EnableDisableButtons() {
136      addGroupButton.Enabled = false;
137      addOperatorButton.Enabled = false;
138      removeButton.Enabled = false;
139      operatorsTreeView.Focus();
140
141      if (operatorsTreeView.SelectedNode != null) {
142        if (operatorsTreeView.SelectedNode.Parent != null)
143          removeButton.Enabled = true;
144        if (operatorsTreeView.SelectedNode.Tag is IOperatorGroup) {
145          addGroupButton.Enabled = true;
146          addOperatorButton.Enabled = true;
147        }
148      }
149    }
150
151    private void MergeOperatorLibrary(IOperatorGroup src, IOperatorGroup dest) {
152      foreach(IOperator op in src.Operators) {
153        if(!Contains(dest, op)) {
154          dest.AddOperator(op);
155        }
156      }
157
158      foreach(OperatorGroup group in src.SubGroups) {
159        bool mergedIntoExistingGroup = false;
160        // try to find a group in dest with matching name
161        foreach(OperatorGroup destGroup in dest.SubGroups) {
162          if(group.Name == destGroup.Name) {
163            MergeOperatorLibrary(group, destGroup);
164            mergedIntoExistingGroup = true;
165            break;
166          }
167        }
168        if(!mergedIntoExistingGroup) {
169          OperatorGroup newGroup = new OperatorGroup();
170          newGroup.Name = group.Name;
171          dest.AddSubGroup(newGroup);
172          MergeOperatorLibrary(group, newGroup);
173        }
174      }
175    }
176
177    private bool Contains(IOperatorGroup group, IOperator op) {
178      foreach(IOperator destOp in group.Operators) {
179        if(op.Name == destOp.Name) {
180          return true;
181        }
182      }
183      return false;
184    }
185
186
187    #region TreeView Events
188    private void operatorsTreeView_AfterSelect(object sender, TreeViewEventArgs e) {
189      EnableDisableButtons();
190    }
191    private void operatorsTreeView_AfterLabelEdit(object sender, NodeLabelEditEventArgs e) {
192      e.CancelEdit = false;
193
194      string name = e.Label;
195      if (name != null) {
196        if (e.Node.Tag is IOperatorGroup)
197          ((IOperatorGroup)e.Node.Tag).Name = name;
198        else if (e.Node.Tag is IOperator)
199          ((IOperator)e.Node.Tag).Name = name;
200      }
201    }
202    private void operatorsTreeView_DoubleClick(object sender, EventArgs e) {
203      if (operatorsTreeView.SelectedNode != null) {
204        IOperator op = operatorsTreeView.SelectedNode.Tag as IOperator;
205        if (op != null) {
206          IView view = MainFormManager.CreateDefaultView(op);
207          if (view != null) MainFormManager.MainForm.ShowView(view);
208        }
209      }
210    }
211    #endregion
212
213    #region Button Events
214    private void addOperatorButton_Click(object sender, EventArgs e) {
215      if (chooseOperatorDialog == null) chooseOperatorDialog = new ChooseOperatorDialog();
216      if (chooseOperatorDialog.ShowDialog(this) == DialogResult.OK) {
217        TreeNode node = operatorsTreeView.SelectedNode;
218        IOperatorGroup group = node.Tag as IOperatorGroup;
219        group.AddOperator(chooseOperatorDialog.Operator);
220        node.Nodes.Add(CreateTreeNode(chooseOperatorDialog.Operator));
221        operatorsTreeView.Sort();
222        EnableDisableButtons();
223      }
224    }
225    private void addGroupButton_Click(object sender, EventArgs e) {
226      TreeNode node = operatorsTreeView.SelectedNode;
227      IOperatorGroup newGroup = new OperatorGroup();
228      IOperatorGroup group = node.Tag as OperatorGroup;
229      group.AddSubGroup(newGroup);
230      node.Nodes.Add(CreateTreeNode(newGroup));
231      operatorsTreeView.Sort();
232      EnableDisableButtons();
233    }
234    private void removeButton_Click(object sender, EventArgs e) {
235      TreeNode node = operatorsTreeView.SelectedNode;
236      RemoveTreeNode(node);
237    }
238    private void importButton_Click(object sender, EventArgs e) {
239      if(openFileDialog.ShowDialog() == DialogResult.OK) {
240        IOperatorLibrary loadedLibrary = (PersistenceManager.Load(openFileDialog.FileName) as IOperatorLibrary);
241        if(loadedLibrary == null) {
242          Auxiliary.ShowErrorMessageBox("The selected file does not contain an operator library");
243        } else {
244          MergeOperatorLibrary(loadedLibrary.Group, OperatorLibrary.Group);
245          Refresh();
246        }
247      }
248    }
249    #endregion
250
251    #region Key Events
252    private void operatorsTreeView_KeyDown(object sender, KeyEventArgs e) {
253      TreeNode node = operatorsTreeView.SelectedNode;
254      if ((e.KeyCode == Keys.Delete) && (node != null) && (node.Parent != null))
255        RemoveTreeNode(operatorsTreeView.SelectedNode);
256      if ((e.KeyCode == Keys.F2) && (node != null))
257        node.BeginEdit();
258    }
259    #endregion
260
261
262    #region Mouse Events
263    private void operatorsTreeView_MouseDown(object sender, MouseEventArgs e) {
264      if (e.Button != MouseButtons.Right) return;
265      TreeNode clickedNode = operatorsTreeView.GetNodeAt(e.X, e.Y);
266      if (clickedNode != null) {
267        operatorsTreeView.SelectedNode = clickedNode;
268        operatorsTreeView.Refresh();
269      }
270    }
271    #endregion
272
273
274    #region Context Menu Events
275    private void contextMenuStrip_Opening(object sender, CancelEventArgs e) {
276      viewToolStripMenuItem.Enabled = false;
277      if (operatorsTreeView.SelectedNode != null) {
278        IOperator op = operatorsTreeView.SelectedNode.Tag as IOperator;
279        if (op != null) {
280          IItemView view = (IItemView)MainFormManager.CreateDefaultView(op);
281          if (view != null) {
282            viewToolStripMenuItem.Enabled = true;
283            viewToolStripMenuItem.Tag = view;
284          }
285        }
286      }
287    }
288    private void viewToolStripMenuItem_Click(object sender, EventArgs e) {
289      IView view = viewToolStripMenuItem.Tag as IView;
290      if (view != null) MainFormManager.MainForm.ShowView(view);
291    }
292    #endregion
293
294    #region Drag and Drop Events
295    private void operatorsTreeView_ItemDrag(object sender, ItemDragEventArgs e) {
296      TreeNode node = (TreeNode)e.Item;
297      IOperator op = node.Tag as IOperator;
298      if (op != null) {
299        DataObject data = new DataObject();
300        data.SetData("IOperator", op);
301        data.SetData("DragSource", operatorsTreeView);
302        DoDragDrop(data, DragDropEffects.Copy);
303      }
304    }
305    private void operatorsTreeView_DragEnter(object sender, DragEventArgs e) {
306      e.Effect = DragDropEffects.None;
307      if (e.Data.GetDataPresent("IOperator")) {
308        Point p = operatorsTreeView.PointToClient(new Point(e.X, e.Y));
309        TreeNode node = operatorsTreeView.GetNodeAt(p);
310        if ((node != null) && (node.Tag is IOperatorGroup))
311          e.Effect = DragDropEffects.Copy;
312      }
313    }
314    private void operatorsTreeView_DragOver(object sender, DragEventArgs e) {
315      e.Effect = DragDropEffects.None;
316      if (e.Data.GetDataPresent("IOperator")) {
317        Point p = operatorsTreeView.PointToClient(new Point(e.X, e.Y));
318        TreeNode node = operatorsTreeView.GetNodeAt(p);
319        if ((node != null) && (node.Tag is IOperatorGroup))
320          e.Effect = DragDropEffects.Copy;
321      }
322    }
323    private void operatorsTreeView_DragDrop(object sender, DragEventArgs e) {
324      if (e.Effect != DragDropEffects.None) {
325        if (e.Data.GetDataPresent("IOperator")) {
326          IOperator op = (IOperator)e.Data.GetData("IOperator");
327          Point p = operatorsTreeView.PointToClient(new Point(e.X, e.Y));
328          TreeNode node = operatorsTreeView.GetNodeAt(p);
329          if (node != null) {
330            op = (IOperator)op.Clone();
331
332            while (op.SubOperators.Count > 0)
333              op.RemoveSubOperator(0);
334
335            IOperatorGroup group = (IOperatorGroup)node.Tag;
336            group.AddOperator(op);
337            node.Nodes.Add(CreateTreeNode(op));
338            operatorsTreeView.Sort();
339            EnableDisableButtons();
340          }
341        }
342      }
343    }
344    #endregion
345
346  }
347}
Note: See TracBrowser for help on using the repository browser.