Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Operators.Programmable/3.3/ProgrammableOperatorView.cs @ 2799

Last change on this file since 2799 was 2799, checked in by epitzer, 14 years ago

towards migration of ProgrammableOperator to HL 3.3 (#842)

File size: 11.8 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.Generic;
24using System.ComponentModel;
25using System.Drawing;
26using System.Data;
27using System.Text;
28using System.Linq;
29using System.Windows.Forms;
30using HeuristicLab.Core;
31using HeuristicLab.Operators;
32using System.CodeDom.Compiler;
33using System.Reflection;
34using HeuristicLab.CodeEditor;
35using HeuristicLab.Core.Views;
36
37namespace HeuristicLab.Operators.Programmable {
38
39  public partial class ProgrammableOperatorView : NamedItemView {
40
41    public ProgrammableOperator ProgrammableOperator {
42      get { return (ProgrammableOperator)base.Content; }
43      set { base.Content = (NamedItem)value; }
44    }
45
46    public ProgrammableOperatorView() {
47      InitializeComponent();
48    }
49
50    public ProgrammableOperatorView(ProgrammableOperator programmableOperator)
51      : this() {
52      ProgrammableOperator = programmableOperator;
53    }
54
55    protected override void DeregisterContentEvents() {     
56      //operatorBaseVariableInfosView.Operator = null;
57      //operatorBaseVariablesView.Operator = null;
58      //constrainedItemBaseView.ConstrainedItem = null;
59      ProgrammableOperator.CodeChanged -= new EventHandler(ProgrammableOperator_CodeChanged);
60      ProgrammableOperator.DescriptionChanged -= new EventHandler(ProgrammableOperator_DescriptionChanged);
61      base.DeregisterContentEvents();           
62    }
63
64
65    protected override void RegisterContentEvents() {
66      base.RegisterContentEvents();
67      //operatorBaseVariableInfosView.Operator = ProgrammableOperator;
68      //operatorBaseVariablesView.Operator = ProgrammableOperator;
69      //constrainedItemBaseView.ConstrainedItem = ProgrammableOperator;
70      ProgrammableOperator.CodeChanged += new EventHandler(ProgrammableOperator_CodeChanged);
71      ProgrammableOperator.DescriptionChanged += new EventHandler(ProgrammableOperator_DescriptionChanged);
72    }
73
74
75    protected override void OnContentChanged() {
76      base.OnContentChanged();   
77      if (ProgrammableOperator == null) {
78        codeEditor.Text = "";
79        codeEditor.Enabled = false;
80        addVariableInfoButton.Enabled = false;
81        removeVariableInfoButton.Enabled = false;
82        descriptionTextBox.Text = "";
83        descriptionTextBox.Enabled = false;
84        codeEditor.Prefix = @"using System
85
86public class Operator {
87  public static IOperation Execute(IOperator op, IScope scope, parameters ...) {
88";
89        codeEditor.Suffix = @"
90    return null;
91  }
92}";
93        assembliesTreeView.Nodes.Clear();
94      } else {
95        codeEditor.Enabled = true;
96        addVariableInfoButton.Enabled = true;
97        //removeVariableInfoButton.Enabled = operatorBaseVariableInfosView.SelectedVariableInfos.Count > 0;
98        descriptionTextBox.Text = ProgrammableOperator.Description;
99        descriptionTextBox.Enabled = true;
100        codeEditor.Prefix = GetGeneratedPrefix();
101        codeEditor.Suffix = @"
102    return null;
103  }
104}";
105        codeEditor.UserCode = ProgrammableOperator.Code;
106        if (codeEditor.UserCode == "")
107          codeEditor.UserCode = "\n\n\n";
108        InitializeAssemblyList();
109        InitializeNamespacesList();
110        foreach (var a in ProgrammableOperator.SelectedAssemblies) {
111          codeEditor.AddAssembly(a);
112        }
113        codeEditor.ScrollAfterPrefix();
114      }
115    }
116
117
118    private string GetGeneratedPrefix() {
119      StringBuilder prefix = new StringBuilder();
120      foreach (var ns in ProgrammableOperator.GetSelectedAndValidNamespaces()) {
121        prefix.Append("using ").Append(ns).AppendLine(";");
122      }
123      prefix.AppendLine();
124      prefix.Append("public class ").Append(ProgrammableOperator.CompiledTypeName).AppendLine(" {");
125      prefix.Append("  ").Append(ProgrammableOperator.Signature).AppendLine(" {");
126      return prefix.ToString();
127    }
128
129    private void codeEditor_Validated(object sender, EventArgs e) {
130      ProgrammableOperator.Code = codeEditor.UserCode;
131    }
132   
133    /*
134    private void operatorBaseVariableInfosView_SelectedVariableInfosChanged(object sender, EventArgs e) {
135      removeVariableInfoButton.Enabled = operatorBaseVariableInfosView.SelectedVariableInfos.Count > 0;
136    }
137   
138    private void descriptionTextBox_Validated(object sender, EventArgs e) {
139      ProgrammableOperator.SetDescription(descriptionTextBox.Text);
140    }
141
142    private void addVariableInfoButton_Click(object sender, EventArgs e) {
143      AddVariableInfoDialog dialog = new AddVariableInfoDialog();
144      if (dialog.ShowDialog(this) == DialogResult.OK) {
145        if (ProgrammableOperator.GetVariableInfo(dialog.VariableInfo.FormalName) != null) {
146          Auxiliary.ShowErrorMessageBox("A variable info with the same formal name already exists.");
147        } else {
148          ProgrammableOperator.AddVariableInfo(dialog.VariableInfo);
149          Recompile();
150        }
151      }
152      dialog.Dispose();
153    }
154
155    private void removeVariableInfoButton_Click(object sender, EventArgs e) {
156      IVariableInfo[] selected = new IVariableInfo[operatorBaseVariableInfosView.SelectedVariableInfos.Count];
157      operatorBaseVariableInfosView.SelectedVariableInfos.CopyTo(selected, 0);
158      for (int i = 0; i < selected.Length; i++)
159        ProgrammableOperator.RemoveVariableInfo(selected[i].FormalName);
160      Recompile();
161    } */
162
163    private void Recompile() {
164      this.Enabled = false;
165      try {
166        ProgrammableOperator.Compile();
167        MessageBox.Show("Compilation successful", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
168      } catch (Exception ex) {
169        Auxiliary.ShowErrorMessageBox(ex);
170      }
171      OnContentChanged();
172      codeEditor.ShowCompileErrors(ProgrammableOperator.CompileErrors, "ProgrammableOperator");
173      this.Enabled = true;
174    }
175
176    private void compileButton_Click(object sender, EventArgs e) {
177      Recompile();
178    }
179
180    #region ProgrammableOperator Events
181    private void ProgrammableOperator_CodeChanged(object sender, EventArgs e) {
182      codeEditor.Text = ProgrammableOperator.Code;
183    }
184    private void ProgrammableOperator_DescriptionChanged(object sender, EventArgs e) {
185      descriptionTextBox.Text = ProgrammableOperator.Description;
186    }
187    #endregion
188
189    private void assembliesTreeView_AfterCheck(object sender, TreeViewEventArgs e) {
190      if (initializing)
191        return;
192      Assembly a = e.Node.Tag as Assembly;
193      if (a == null && e.Node.Nodes.Count > 0) {
194        foreach (TreeNode n in e.Node.Nodes)
195          n.Checked = e.Node.Checked;
196        return;
197      } else {
198        if (e.Node.Checked) {
199          ProgrammableOperator.SelectAssembly(a);
200          codeEditor.AddAssembly(a);
201        } else {
202          ProgrammableOperator.UnselectAssembly(a);
203          codeEditor.RemoveAssembly(a);
204        }
205      }
206      InitializeNamespacesList();
207      codeEditor.Prefix = GetGeneratedPrefix();
208    }
209
210    private bool initializing = false;
211    private void InitializeAssemblyList() {
212      initializing = true;
213      assembliesTreeView.Enabled = false;
214      namespacesTreeView.Enabled = false;
215      assembliesTreeView.BeginUpdate();
216      assembliesTreeView.Nodes.Clear();
217      var selectedAssemblies = new HashSet<Assembly>(ProgrammableOperator.SelectedAssemblies);
218      foreach (var p in ProgrammableOperator.Plugins) {
219        var node = assembliesTreeView.Nodes.Add(p.Key);
220        node.Tag = p;
221        foreach (var a in p.Value) {
222          var aNode = node.Nodes.Add(a.GetName().Name);
223          aNode.Tag = a;
224          if (selectedAssemblies.Contains(a))
225            aNode.Checked = true;
226        }
227        if (node.Nodes.Count == 1 && node.Nodes[0].Name == node.Nodes[0].Name) {
228          node.Tag = node.Nodes[0].Tag;
229          node.Nodes.Clear();
230        } else if (node.Nodes.Count > 0 && node.Nodes.Cast<TreeNode>().All(n => n.Checked)) {
231          node.Checked = true;
232        }
233      }
234      assembliesTreeView.EndUpdate();
235      assembliesTreeView.Enabled = true;
236      namespacesTreeView.Enabled = true;
237      initializing = false;
238    }
239
240    private void InitializeNamespacesList() {
241      initializing = true;
242      namespacesTreeView.Enabled = false;
243      namespacesTreeView.BeginUpdate();
244      TreeNode oldTree = new TreeNode("root");
245      CloneTreeNodeCollection(oldTree, namespacesTreeView.Nodes);
246      namespacesTreeView.Nodes.Clear();
247      var selectedNamespaces = new HashSet<string>(ProgrammableOperator.Namespaces);
248      foreach (var ns in ProgrammableOperator.GetAllNamespaces(true))
249        AddNamespace(namespacesTreeView.Nodes, ns, selectedNamespaces.Contains(ns), oldTree);
250      codeEditor.Prefix = GetGeneratedPrefix();
251      namespacesTreeView.EndUpdate();
252      namespacesTreeView.Enabled = true;
253      initializing = false;
254    }
255
256    private void CloneTreeNodeCollection(TreeNode root, TreeNodeCollection nodes) {
257      foreach (TreeNode n in nodes) {
258        TreeNode newNode = root.Nodes.Add(n.Text, n.Text);
259        newNode.Checked = n.Checked;
260        CloneTreeNodeCollection(newNode, n.Nodes);
261        if (n.IsExpanded)
262          newNode.Expand();
263      }
264    }
265
266    private bool AddNamespace(TreeNodeCollection parentNodes, string ns, bool isSelected, TreeNode oldTree) {
267      int dotIndex = ns.IndexOf('.');
268      string prefix = ns;
269      if (dotIndex != -1)
270        prefix = ns.Substring(0, dotIndex);
271      TreeNode node = GetOrCreateNode(parentNodes, prefix);
272      TreeNode oldNode = MaybeGetNode(oldTree, prefix);
273      bool isNew = oldNode == null;
274      if (dotIndex != -1 && dotIndex + 1 < ns.Length) {
275        isNew = AddNamespace(node.Nodes, ns.Substring(dotIndex + 1, ns.Length - (dotIndex + 1)), isSelected, oldNode);
276      } else {
277        node.Checked = isSelected;
278      }
279      if (isNew || oldNode != null && oldNode.IsExpanded)
280        node.Expand();
281      if (isNew)
282        namespacesTreeView.SelectedNode = node;
283      return isNew;
284    }
285
286    private static TreeNode MaybeGetNode(TreeNode parentNode, string key) {
287      if (parentNode == null)
288        return null;
289      if (parentNode.Nodes.ContainsKey(key))
290        return parentNode.Nodes[key];
291      return null;
292    }
293
294    private static TreeNode GetOrCreateNode(TreeNodeCollection parentNodes, string key) {
295      TreeNode node = null;
296      if (parentNodes.ContainsKey(key)) {
297        node = parentNodes[key];
298      } else {
299        node = parentNodes.Add(key, key);
300      }
301      return node;
302    }
303
304    private void namespacesTreeView_AfterCheck(object sender, TreeViewEventArgs e) {
305      if (initializing)
306        return;
307      if (e.Node.Checked) {
308        ProgrammableOperator.SelectNamespace(e.Node.FullPath);
309      } else {
310        ProgrammableOperator.UnselectNamespace(e.Node.FullPath);
311      }
312      codeEditor.Prefix = GetGeneratedPrefix();
313    }
314
315    private void showCodeButton_Click(object sender, EventArgs e) {
316      new CodeViewer(ProgrammableOperator.CompilationUnitCode).ShowDialog(this);
317    }
318
319
320  }
321}
Note: See TracBrowser for help on using the repository browser.