Free cookie consent management tool by TermsFeed Policy Generator

source: branches/GBT/HeuristicLab.Operators.Programmable.Views/3.3/ProgrammableOperatorView.cs @ 12495

Last change on this file since 12495 was 12495, checked in by gkronber, 9 years ago

#2261: merged trunk changes to branch
r12494
#2403: added a null check in the MatlabParameterVectorEvaluator to prevent exceptions when clearstate is called


r12493
#2369: added support for squared errors and relative errors to error-characteristic-curve view


r12492
#2392: implemented PearsonsRCalculator to fix incorrect correlation values in the correlation matrix.


r12491
#2402 don't set task state to waiting when it fails


r12490
#2401 added missing Mono.Cecil plugin dependency


r12488
#2400 - Interfaces for Capaciated-, PickupAndDelivery- and TimeWindowed-ProblemInstances now specify an additional penalty parameter to set the current penalty factor for the constraint relaxation. - The setter of the penalty-property in ...


r12485
#2374 made RegressionSolution and ClassificationSolution non-abstract


r12482
#2320: Fixed warnings in unit test solutions introduced in r12420 by marking methods as obsolete.


r12481
#2320: Fixed AfterDeserialization of GEArtifialAntEvaluator.


r12480
#2320: Fixed error in symbolicexpressiontree crossover regarding the wiring of lookup parameters if persisted file is loaded.


r12479
#2397 moved GeoIP project into ExtLibs


r12478
#2329 fixed bug in simple code editor


r12476
#2331 removed outdated plugins


r12475
#2368 fixed compile warnings


r12474
#2399 worked on Mono project prepare script


r12473
#2329 added a simple code editor for Linux


r12472
#2399 - fixed MathJax.js file name - worked on Mono project prepare script


r12471
#2399 worked on Mono project prepare script


r12470
#2399 fixed pre-build events in project files


r12465
#2399 worked on mono project prepare script


r12464
#2399 added patch to project


r12463
#2399 fixed EPPlus so that it compiles on Linux


r12461
#2398: Skip root and start symbols when calculating impacts and replacement values in the pruning operators.


r12458
#2354 show label when no data is displayed and don't show the legend


r12457
#2353 removed duplicated call to Any() in Hive Status page


r12456
#2368 fixed modifier


r12455
#2368 added support in persistence for typecaches in streams


r12445
#2394: Changed Web.config compilation from debug to release to force script bundling. Changed history loading type from lazy to eager loading to increase performance. Fixed "getCoreStatus" typo in statusCtrl.js


r12443
#2394: Fixed UserTaskQuery and GetStatusHistory in the WebApp.Status plugin


r12442
#2394 added nuget folders to svn ignore list


r12435
#2394: Improved PluginManager and updated hive status monitor.


r12434
#2396 added symbolic expression tree formatter for C#


r12433
#2395: Minor change in DoubleValue.GetValue.


r12432
#2395 Use simple round-trip format for doubles because G17 prints some strange numbers (20.22 to 20.219999999999999999). Some accuracy can still be lost on 64bit machines, but should be very rare and minimal. double.MaxValue can still be pa...


r12431
#2395 Fixed parsing issues by using the G17 format.


r12430
#2394 added missing package config


r12429
#2394 added missing package config


r12428
#2394 added web app and status page to trunk


r12424
#2320: Adapted plugin file and updated project file of SymbolicExpressionTreeEncoding.


r12422
#2320: Merged the encoding class and all accompanying changes in the trunk.


r12401
#2387 Fixed a bug where the automatic selection of the first element behaved differently for the NewItemDialog.


r12400
#2387 Forgot to commit a file.


r12399
#2387 - Added context-menu for expanding and collapsing tree-nodes. - Improve response time when expanding/collapsing all nodes for TypeSelector and NewItemDialog.


r12398
#2387 - Added clearSearch-button in TypeSelector. - Adapted behavior of TypeSelector and NewItemDialog that a selected node stays selected as long as it matches the search criteria.


r12397
#2387 - Adapted behavior of the matching in the TypeSelector that it behave the same as the NewItemDialog. The search string is tokenized by space and matches if all tokens are contained, (eg. "Sym Reg" matches "SymbolicRegression...")...


r12393
#2025 - Removed Expand/CollapseAll buttons. - Removed cycling of items.


r12392
#2386: Updated GetHashCode method in the EnumerableBoolEqualityComparer.


File size: 12.2 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2015 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.Drawing;
25using System.Linq;
26using System.Reflection;
27using System.Text;
28using System.Windows.Forms;
29using HeuristicLab.CodeEditor;
30using HeuristicLab.Common.Resources;
31using HeuristicLab.Core.Views;
32using HeuristicLab.MainForm;
33using HeuristicLab.PluginInfrastructure;
34
35namespace HeuristicLab.Operators.Programmable {
36
37  [View("ProgrammableOperator View")]
38  [Content(typeof(ProgrammableOperator), true)]
39  public partial class ProgrammableOperatorView : NamedItemView {
40
41    public ProgrammableOperator ProgrammableOperator {
42      get { return (ProgrammableOperator)base.Content; }
43      set { base.Content = (ProgrammableOperator)value; }
44    }
45
46    public ProgrammableOperatorView() {
47      InitializeComponent();
48      namespacesTreeView.ImageList = new ImageList();
49      namespacesTreeView.ImageList.Images.Add(VSImageLibrary.Namespace);
50      assembliesTreeView.ImageList = new ImageList();
51      assembliesTreeView.ImageList.Images.Add(VSImageLibrary.Assembly);
52      assembliesTreeView.ImageList.Images.Add(VSImageLibrary.Module);
53    }
54
55    protected override void RegisterContentEvents() {
56      base.RegisterContentEvents();
57      ProgrammableOperator.CodeChanged += ProgrammableOperator_CodeChanged;
58      ProgrammableOperator.SignatureChanged += ProgrammableOperator_SignatureChanged;
59      ProgrammableOperator.BreakpointChanged += ProgrammableOperator_BreakpointChanged;
60    }
61
62    protected override void DeregisterContentEvents() {
63      ProgrammableOperator.CodeChanged -= ProgrammableOperator_CodeChanged;
64      ProgrammableOperator.SignatureChanged -= ProgrammableOperator_SignatureChanged;
65      ProgrammableOperator.BreakpointChanged -= ProgrammableOperator_BreakpointChanged;
66      base.DeregisterContentEvents();
67    }
68
69    #region Content event handlers
70    void ProgrammableOperator_BreakpointChanged(object sender, EventArgs e) {
71      breakpointCheckBox.Checked = ProgrammableOperator.Breakpoint;
72    }
73    private void ProgrammableOperator_CodeChanged(object sender, EventArgs e) {
74      codeEditor.UserCode = ProgrammableOperator.Code;
75    }
76    private void ProgrammableOperator_SignatureChanged(object sender, EventArgs args) {
77      codeEditor.Prefix = GetGeneratedPrefix();
78    }
79    #endregion
80
81    protected override void OnContentChanged() {
82      base.OnContentChanged();
83      if (ProgrammableOperator == null) {
84        codeEditor.UserCode = string.Empty;
85        assembliesTreeView.Nodes.Clear();
86        parameterCollectionView.Content = null;
87      } else {
88        codeEditor.Prefix = GetGeneratedPrefix();
89        codeEditor.Suffix = String.Format("    {0}{1}  }}{1}}}", ProgrammableOperator.MethodSuffix, Environment.NewLine);
90        codeEditor.UserCode = ProgrammableOperator.Code;
91        if (codeEditor.UserCode == string.Empty)
92          codeEditor.UserCode = string.Format("    {0}", Environment.NewLine);
93        InitializeAssemblyList();
94        InitializeNamespacesList();
95        codeEditor.AddAssemblies(ProgrammableOperator.SelectedAssemblies);
96        codeEditor.ScrollAfterPrefix();
97        codeEditor.ShowCompileErrors(ProgrammableOperator.CompileErrors);
98        showCodeButton.Enabled = !string.IsNullOrEmpty(ProgrammableOperator.CompilationUnitCode);
99        parameterCollectionView.Content = ProgrammableOperator.Parameters;
100        if (ProgrammableOperator.CompileErrors == null) {
101          compilationLabel.ForeColor = SystemColors.ControlDarkDark;
102          compilationLabel.Text = "Not compiled";
103        } else if (ProgrammableOperator.CompileErrors.HasErrors) {
104          compilationLabel.ForeColor = Color.DarkRed;
105          compilationLabel.Text = "Compilation failed";
106        } else {
107          compilationLabel.ForeColor = Color.DarkGreen;
108          compilationLabel.Text = "Compilation successful";
109        }
110
111      }
112    }
113
114    protected override void SetEnabledStateOfControls() {
115      base.SetEnabledStateOfControls();
116      breakpointCheckBox.Enabled = Content != null && !Locked;
117      parameterCollectionView.Enabled = Content != null;
118      assembliesTreeView.Enabled = Content != null && !ReadOnly;
119      namespacesTreeView.Enabled = Content != null && !ReadOnly;
120      compileButton.Enabled = Content != null && !ReadOnly;
121      codeEditor.Enabled = Content != null && !ReadOnly;
122      showCodeButton.Enabled = Content != null && !string.IsNullOrEmpty(ProgrammableOperator.CompilationUnitCode) && !ReadOnly;
123    }
124
125    #region Child Control event handlers
126    private void compileButton_Click(object sender, EventArgs e) {
127      Recompile();
128    }
129    private void breakpointCheckBox_CheckedChanged(object sender, EventArgs e) {
130      if (ProgrammableOperator != null) ProgrammableOperator.Breakpoint = breakpointCheckBox.Checked;
131    }
132    private void showCodeButton_Click(object sender, EventArgs e) {
133#if __MonoCS__
134      new TextDialog("CodeViewer", ProgrammableOperator.CompilationUnitCode, true).ShowDialog(this);
135#else
136      new CodeViewer(ProgrammableOperator.CompilationUnitCode).ShowDialog(this);
137#endif
138    }
139    private void codeEditor_Validated(object sender, EventArgs e) {
140      ProgrammableOperator.Code = codeEditor.UserCode;
141    }
142    private void assembliesTreeView_AfterCheck(object sender, TreeViewEventArgs e) {
143      if (initializing)
144        return;
145      Assembly a = e.Node.Tag as Assembly;
146      if (a == null && e.Node.Nodes.Count > 0) {
147        foreach (TreeNode n in e.Node.Nodes)
148          n.Checked = e.Node.Checked;
149        return;
150      } else {
151        if (e.Node.Checked) {
152          ProgrammableOperator.SelectAssembly(a);
153          codeEditor.AddAssembly(a);
154        } else {
155          ProgrammableOperator.UnselectAssembly(a);
156          codeEditor.RemoveAssembly(a);
157        }
158      }
159      InitializeNamespacesList();
160      codeEditor.Prefix = GetGeneratedPrefix();
161    }
162    private void namespacesTreeView_AfterCheck(object sender, TreeViewEventArgs e) {
163      if (initializing)
164        return;
165      if (e.Node.Checked) {
166        ProgrammableOperator.SelectNamespace(e.Node.FullPath);
167      } else {
168        ProgrammableOperator.UnselectNamespace(e.Node.FullPath);
169      }
170      codeEditor.Prefix = GetGeneratedPrefix();
171    }
172    #endregion
173
174    #region global HotKeys
175    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
176      if (keyData == Keys.F6) {
177        Control activeControl = ActiveControl;
178        compileButton.Focus();
179        Recompile();
180        if (activeControl != null)
181          activeControl.Focus();
182        return true;
183      }
184      return base.ProcessCmdKey(ref msg, keyData);
185    }
186    #endregion
187
188    #region Auxiliary functions
189
190    private string GetGeneratedPrefix() {
191      StringBuilder prefix = new StringBuilder();
192      foreach (var ns in ProgrammableOperator.GetSelectedAndValidNamespaces()) {
193        prefix.Append("using ").Append(ns).AppendLine(";");
194      }
195      prefix.AppendLine();
196      prefix.Append("public class ").Append(ProgrammableOperator.CompiledTypeName).AppendLine(" {");
197      prefix.Append("  ").Append(ProgrammableOperator.Signature).AppendLine(" {");
198      return prefix.ToString();
199    }
200
201    private void Recompile() {
202      this.Enabled = false;
203      try {
204        ProgrammableOperator.Compile();
205      }
206      catch (Exception ex) {
207        ErrorHandling.ShowErrorDialog(this, ex);
208      }
209      OnContentChanged();
210      this.Enabled = true;
211    }
212
213    private bool initializing = false;
214    private void InitializeAssemblyList() {
215      initializing = true;
216      assembliesTreeView.Enabled = false;
217      namespacesTreeView.Enabled = false;
218      assembliesTreeView.BeginUpdate();
219      assembliesTreeView.Nodes.Clear();
220      var selectedAssemblies = new HashSet<Assembly>(ProgrammableOperator.SelectedAssemblies);
221      foreach (var p in ProgrammableOperator.Plugins) {
222        var node = assembliesTreeView.Nodes.Add(p.Key);
223        node.Tag = p;
224        node.ImageIndex = 1;
225        foreach (var a in p.Value) {
226          var aNode = node.Nodes.Add(a.GetName().Name);
227          aNode.Tag = a;
228          aNode.ImageIndex = 0;
229          if (selectedAssemblies.Contains(a))
230            aNode.Checked = true;
231        }
232        if (node.Nodes.Count == 1 && node.Nodes[0].Name == node.Nodes[0].Name) {
233          node.Tag = node.Nodes[0].Tag;
234          node.ImageIndex = node.Nodes[0].ImageIndex;
235          node.Checked = node.Nodes[0].Checked;
236          node.Nodes.Clear();
237        } else if (node.Nodes.Count > 0 && node.Nodes.Cast<TreeNode>().All(n => n.Checked)) {
238          node.Checked = true;
239        }
240      }
241      assembliesTreeView.Sort();
242      assembliesTreeView.EndUpdate();
243      assembliesTreeView.Enabled = true;
244      namespacesTreeView.Enabled = true;
245      initializing = false;
246    }
247
248    private void InitializeNamespacesList() {
249      initializing = true;
250      namespacesTreeView.Enabled = false;
251      namespacesTreeView.BeginUpdate();
252      TreeNode oldTree = new TreeNode("root");
253      CloneTreeNodeCollection(oldTree, namespacesTreeView.Nodes);
254      namespacesTreeView.Nodes.Clear();
255      var selectedNamespaces = new HashSet<string>(ProgrammableOperator.Namespaces);
256      foreach (var ns in ProgrammableOperator.GetAllNamespaces(true))
257        AddNamespace(namespacesTreeView.Nodes, ns, selectedNamespaces.Contains(ns), oldTree);
258      codeEditor.Prefix = GetGeneratedPrefix();
259      namespacesTreeView.Sort();
260      namespacesTreeView.EndUpdate();
261      namespacesTreeView.Enabled = true;
262      initializing = false;
263    }
264
265    private void CloneTreeNodeCollection(TreeNode root, TreeNodeCollection nodes) {
266      foreach (TreeNode n in nodes) {
267        TreeNode newNode = root.Nodes.Add(n.Text, n.Text);
268        newNode.Checked = n.Checked;
269        newNode.ImageIndex = n.ImageIndex;
270        CloneTreeNodeCollection(newNode, n.Nodes);
271        if (n.IsExpanded)
272          newNode.Expand();
273      }
274    }
275
276    private bool AddNamespace(TreeNodeCollection parentNodes, string ns, bool isSelected, TreeNode oldTree) {
277      int dotIndex = ns.IndexOf('.');
278      string prefix = ns;
279      if (dotIndex != -1)
280        prefix = ns.Substring(0, dotIndex);
281      TreeNode node = GetOrCreateNode(parentNodes, prefix);
282      TreeNode oldNode = MaybeGetNode(oldTree, prefix);
283      bool isNew = oldNode == null;
284      if (dotIndex != -1 && dotIndex + 1 < ns.Length) {
285        isNew = AddNamespace(node.Nodes, ns.Substring(dotIndex + 1, ns.Length - (dotIndex + 1)), isSelected, oldNode);
286      } else {
287        node.Checked = isSelected;
288      }
289      if (isNew || oldNode != null && oldNode.IsExpanded)
290        node.Expand();
291      if (isNew) {
292        namespacesTreeView.SelectedNode = node;
293        node.ImageIndex = 0;
294      } else {
295        node.ImageIndex = oldNode.ImageIndex;
296      }
297      return isNew;
298    }
299
300    private static TreeNode MaybeGetNode(TreeNode parentNode, string key) {
301      if (parentNode == null)
302        return null;
303      if (parentNode.Nodes.ContainsKey(key))
304        return parentNode.Nodes[key];
305      return null;
306    }
307
308    private static TreeNode GetOrCreateNode(TreeNodeCollection parentNodes, string key) {
309      TreeNode node = null;
310      if (parentNodes.ContainsKey(key)) {
311        node = parentNodes[key];
312      } else {
313        node = parentNodes.Add(key, key);
314      }
315      return node;
316    }
317
318    #endregion
319  }
320}
Note: See TracBrowser for help on using the repository browser.