Index: trunk/sources/HeuristicLab 3.3.sln
===================================================================
--- trunk/sources/HeuristicLab 3.3.sln	(revision 3704)
+++ trunk/sources/HeuristicLab 3.3.sln	(revision 3705)
@@ -103,5 +103,5 @@
 	EndProjectSection
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Tracing-3.2", "HeuristicLab.Tracing\3.3\HeuristicLab.Tracing-3.3.csproj", "{EE2034D9-6E27-48A1-B855-42D45F69A4FC}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Tracing-3.3", "HeuristicLab.Tracing\3.3\HeuristicLab.Tracing-3.3.csproj", "{EE2034D9-6E27-48A1-B855-42D45F69A4FC}"
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Common.Resources-3.3", "HeuristicLab.Common.Resources\3.3\HeuristicLab.Common.Resources-3.3.csproj", "{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}"
@@ -148,5 +148,5 @@
 	EndProjectSection
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.CodeEditor-3.2", "HeuristicLab.CodeEditor\3.2\HeuristicLab.CodeEditor-3.2.csproj", "{489CFE09-FDF7-4C89-BAB5-BD09CADD61AD}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.CodeEditor-3.3", "HeuristicLab.CodeEditor\3.3\HeuristicLab.CodeEditor-3.3.csproj", "{489CFE09-FDF7-4C89-BAB5-BD09CADD61AD}"
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "HeuristicLab.SharpDevelop", "HeuristicLab.SharpDevelop", "{F94E41E4-F25F-4302-8486-0BEF121CF5C8}"
Index: trunk/sources/HeuristicLab 3.3/Files.txt
===================================================================
--- trunk/sources/HeuristicLab 3.3/Files.txt	(revision 3704)
+++ trunk/sources/HeuristicLab 3.3/Files.txt	(revision 3705)
@@ -14,5 +14,5 @@
 HeuristicLab.Analysis\3.3:HeuristicLab.Analysis-3.3.dll
 HeuristicLab.Analysis.Views\3.3:HeuristicLab.Analysis.Views-3.3.dll
-HeuristicLab.CodeEditor\3.2:HeuristicLab.CodeEditor-3.2.dll
+HeuristicLab.CodeEditor\3.3:HeuristicLab.CodeEditor-3.3.dll
 HeuristicLab.Collections\3.3:HeuristicLab.Collections-3.3.dll
 HeuristicLab.Common\3.3:HeuristicLab.Common-3.3.dll
Index: trunk/sources/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/Tests/HeuristicLab.Algorithms.GeneticAlgorithm-3.3.Tests.csproj
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/Tests/HeuristicLab.Algorithms.GeneticAlgorithm-3.3.Tests.csproj	(revision 3704)
+++ trunk/sources/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/Tests/HeuristicLab.Algorithms.GeneticAlgorithm-3.3.Tests.csproj	(revision 3705)
@@ -148,5 +148,5 @@
     <ProjectReference Include="..\..\..\HeuristicLab.Tracing\3.3\HeuristicLab.Tracing-3.3.csproj">
       <Project>{EE2034D9-6E27-48A1-B855-42D45F69A4FC}</Project>
-      <Name>HeuristicLab.Tracing-3.2</Name>
+      <Name>HeuristicLab.Tracing-3.3</Name>
     </ProjectReference>
     <ProjectReference Include="..\HeuristicLab.Algorithms.GeneticAlgorithm-3.3.csproj">
Index: trunk/sources/HeuristicLab.CodeEditor/3.3/CSharpCodeCompletion.sln
===================================================================
--- trunk/sources/HeuristicLab.CodeEditor/3.3/CSharpCodeCompletion.sln	(revision 3705)
+++ trunk/sources/HeuristicLab.CodeEditor/3.3/CSharpCodeCompletion.sln	(revision 3705)
@@ -0,0 +1,44 @@
+﻿
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.SharpDevelop-3.1.1.5327", "..\HeuristicLab.SharpDevelop-3.1.1.5327\HeuristicLab.SharpDevelop-3.1.1.5327.csproj", "{4ABA047D-46DD-4608-9E4A-41C5F92FDBB1}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodeCompletionTestForm", "..\CodeCompletionTestForm\CodeCompletionTestForm.csproj", "{F5DFD748-7BC5-4AAE-BBBB-05338D4E8D0B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.CodeEditor-3.2", "HeuristicLab.CodeEditor-3.2.csproj", "{489CFE09-FDF7-4C89-BAB5-BD09CADD61AD}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Debug|x86 = Debug|x86
+		Release|Any CPU = Release|Any CPU
+		Release|x86 = Release|x86
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{4ABA047D-46DD-4608-9E4A-41C5F92FDBB1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{4ABA047D-46DD-4608-9E4A-41C5F92FDBB1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{4ABA047D-46DD-4608-9E4A-41C5F92FDBB1}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{4ABA047D-46DD-4608-9E4A-41C5F92FDBB1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{4ABA047D-46DD-4608-9E4A-41C5F92FDBB1}.Release|Any CPU.Build.0 = Release|Any CPU
+		{4ABA047D-46DD-4608-9E4A-41C5F92FDBB1}.Release|x86.ActiveCfg = Release|Any CPU
+		{F5DFD748-7BC5-4AAE-BBBB-05338D4E8D0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{F5DFD748-7BC5-4AAE-BBBB-05338D4E8D0B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{F5DFD748-7BC5-4AAE-BBBB-05338D4E8D0B}.Debug|x86.ActiveCfg = Debug|x86
+		{F5DFD748-7BC5-4AAE-BBBB-05338D4E8D0B}.Debug|x86.Build.0 = Debug|x86
+		{F5DFD748-7BC5-4AAE-BBBB-05338D4E8D0B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{F5DFD748-7BC5-4AAE-BBBB-05338D4E8D0B}.Release|Any CPU.Build.0 = Release|Any CPU
+		{F5DFD748-7BC5-4AAE-BBBB-05338D4E8D0B}.Release|x86.ActiveCfg = Release|x86
+		{F5DFD748-7BC5-4AAE-BBBB-05338D4E8D0B}.Release|x86.Build.0 = Release|x86
+		{489CFE09-FDF7-4C89-BAB5-BD09CADD61AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{489CFE09-FDF7-4C89-BAB5-BD09CADD61AD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{489CFE09-FDF7-4C89-BAB5-BD09CADD61AD}.Debug|x86.ActiveCfg = Debug|x86
+		{489CFE09-FDF7-4C89-BAB5-BD09CADD61AD}.Debug|x86.Build.0 = Debug|x86
+		{489CFE09-FDF7-4C89-BAB5-BD09CADD61AD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{489CFE09-FDF7-4C89-BAB5-BD09CADD61AD}.Release|Any CPU.Build.0 = Release|Any CPU
+		{489CFE09-FDF7-4C89-BAB5-BD09CADD61AD}.Release|x86.ActiveCfg = Release|x86
+		{489CFE09-FDF7-4C89-BAB5-BD09CADD61AD}.Release|x86.Build.0 = Release|x86
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
Index: trunk/sources/HeuristicLab.CodeEditor/3.3/CodeCompletionData.cs
===================================================================
--- trunk/sources/HeuristicLab.CodeEditor/3.3/CodeCompletionData.cs	(revision 3705)
+++ trunk/sources/HeuristicLab.CodeEditor/3.3/CodeCompletionData.cs	(revision 3705)
@@ -0,0 +1,165 @@
+/*
+ * Erstellt mit SharpDevelop.
+ * Benutzer: grunwald
+ * Datum: 27.08.2007
+ * Zeit: 14:25
+ * 
+ * Sie können diese Vorlage unter Extras > Optionen > Codeerstellung > Standardheader ändern.
+ */
+
+using System;
+using System.IO;
+using System.Text;
+using System.Xml;
+using System.Linq;
+
+using ICSharpCode.SharpDevelop.Dom;
+using ICSharpCode.SharpDevelop.Dom.CSharp;
+using ICSharpCode.SharpDevelop.Dom.VBNet;
+using ICSharpCode.TextEditor.Gui.CompletionWindow;
+using System.Collections.Generic;
+
+namespace HeuristicLab.CodeEditor {
+  /// <summary>
+  /// Represents an item in the code completion window.
+  /// </summary>
+  class CodeCompletionData : DefaultCompletionData, ICompletionData {
+
+    List<IMember> members;
+    IClass c;
+    static CSharpAmbience csharpAmbience = new CSharpAmbience();
+
+    public CodeCompletionData(IMember member)
+      : base(member.Name, null, GetMemberImageIndex(member)) {
+      this.members = new List<IMember>() { member };
+    }
+
+    public CodeCompletionData(IClass c)
+      : base(c.Name, null, GetClassImageIndex(c)) {
+      this.c = c;
+    }
+
+    int overloads = 0;
+
+    public void AddOverload(IMember m) {
+      overloads++;
+      members.Add(m);
+    }
+
+    static int GetMemberImageIndex(IMember member) {
+      // Missing: different icons for private/public member
+      if (member is IMethod)
+        return 1;
+      if (member is IProperty)
+        return 2;
+      if (member is IField)
+        return 3;
+      if (member is IEvent)
+        return 6;
+      return 3;
+    }
+
+    static int GetClassImageIndex(IClass c) {
+      switch (c.ClassType) {
+        case ClassType.Enum:
+          return 4;
+        default:
+          return 0;
+      }
+    }
+
+    string description;
+
+    // DefaultCompletionData.Description is not virtual, but we can reimplement
+    // the interface to get the same effect as overriding.
+    string ICompletionData.Description {
+      get {
+        if (description == null) {
+          if (members != null)
+            description = string.Join("\n\n\n", members.Select(m => GetDocumentation(m)).ToArray());
+          else
+            description = GetDocumentation(c);
+        }
+        return description;
+      }
+    }
+
+    public static string GetDocumentation(IEntity entity) {
+      return string.Format("{0}\n{1}",
+        GetText(entity),
+        XmlDocumentationToText(entity.Documentation));
+    }
+
+    /// <summary>
+    /// Converts a member to text.
+    /// Returns the declaration of the member as C# or VB code, e.g.
+    /// "public void MemberName(string parameter)"
+    /// </summary>
+    static string GetText(IEntity entity) {
+      IAmbience ambience = csharpAmbience;
+      if (entity is IMethod)
+        return ambience.Convert(entity as IMethod);
+      if (entity is IProperty)
+        return ambience.Convert(entity as IProperty);
+      if (entity is IEvent)
+        return ambience.Convert(entity as IEvent);
+      if (entity is IField)
+        return ambience.Convert(entity as IField);
+      if (entity is IClass)
+        return ambience.Convert(entity as IClass);
+      // unknown entity:
+      return entity.ToString();
+    }
+
+    public static string XmlDocumentationToText(string xmlDoc) {
+      System.Diagnostics.Debug.WriteLine(xmlDoc);
+      StringBuilder b = new StringBuilder();
+      try {
+        using (XmlTextReader reader = new XmlTextReader(new StringReader("<root>" + xmlDoc + "</root>"))) {
+          reader.XmlResolver = null;
+          while (reader.Read()) {
+            switch (reader.NodeType) {
+              case XmlNodeType.Text:
+                b.Append(reader.Value);
+                break;
+              case XmlNodeType.Element:
+                switch (reader.Name) {
+                  case "filterpriority":
+                    reader.Skip();
+                    break;
+                  case "returns":
+                    b.AppendLine();
+                    b.Append("Returns: ");
+                    break;
+                  case "param":
+                    b.AppendLine();
+                    b.Append(reader.GetAttribute("name") + ": ");
+                    break;
+                  case "remarks":
+                    b.AppendLine();
+                    b.Append("Remarks: ");
+                    break;
+                  case "see":
+                    if (reader.IsEmptyElement) {
+                      b.Append(reader.GetAttribute("cref"));
+                    } else {
+                      reader.MoveToContent();
+                      if (reader.HasValue) {
+                        b.Append(reader.Value);
+                      } else {
+                        b.Append(reader.GetAttribute("cref"));
+                      }
+                    }
+                    break;
+                }
+                break;
+            }
+          }
+        }
+        return b.ToString();
+      } catch (XmlException) {
+        return xmlDoc;
+      }
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.CodeEditor/3.3/CodeCompletionKeyHandler.cs
===================================================================
--- trunk/sources/HeuristicLab.CodeEditor/3.3/CodeCompletionKeyHandler.cs	(revision 3705)
+++ trunk/sources/HeuristicLab.CodeEditor/3.3/CodeCompletionKeyHandler.cs	(revision 3705)
@@ -0,0 +1,97 @@
+﻿// CSharp Editor Example with Code Completion
+// Copyright (c) 2006, Daniel Grunwald
+// All rights reserved.
+// 
+// Redistribution and use in source and binary forms, with or without modification, are 
+// permitted provided that the following conditions are met:
+// 
+// - Redistributions of source code must retain the above copyright notice, this list 
+//   of conditions and the following disclaimer.
+// 
+// - Redistributions in binary form must reproduce the above copyright notice, this list
+//   of conditions and the following disclaimer in the documentation and/or other materials 
+//   provided with the distribution.
+// 
+// - Neither the name of the ICSharpCode team nor the names of its contributors may be used to 
+//   endorse or promote products derived from this software without specific prior written 
+//   permission.
+// 
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &AS IS& AND ANY EXPRESS 
+// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 
+// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 
+// IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Windows.Forms;
+using System.IO;
+using System.Threading;
+
+using ICSharpCode.TextEditor;
+using ICSharpCode.TextEditor.Gui;
+using ICSharpCode.TextEditor.Gui.CompletionWindow;
+
+namespace HeuristicLab.CodeEditor {
+  class CodeCompletionKeyHandler {
+    CodeEditor codeEditor;
+    TextEditorControl editor;
+    CodeCompletionWindow codeCompletionWindow;
+
+    private CodeCompletionKeyHandler(CodeEditor codeEditor, TextEditorControl editor) {
+      this.codeEditor = codeEditor;
+      this.editor = editor;
+    }
+
+    public static CodeCompletionKeyHandler Attach(CodeEditor codeEditor, TextEditorControl editor) {
+      CodeCompletionKeyHandler h = new CodeCompletionKeyHandler(codeEditor, editor);
+
+      editor.ActiveTextAreaControl.TextArea.KeyEventHandler += h.TextAreaKeyEventHandler;
+
+      // When the editor is disposed, close the code completion window
+      editor.Disposed += h.CloseCodeCompletionWindow;
+
+      return h;
+    }
+
+    /// <summary>
+    /// Return true to handle the keypress, return false to let the text area handle the keypress
+    /// </summary>
+    bool TextAreaKeyEventHandler(char key) {
+      if (codeCompletionWindow != null) {
+        // If completion window is open and wants to handle the key, don't let the text area
+        // handle it
+        if (codeCompletionWindow.ProcessKeyEvent(key))
+          return true;
+      }
+      if (key == '.') {
+        ICompletionDataProvider completionDataProvider = new CodeCompletionProvider(codeEditor);
+
+        codeCompletionWindow = CodeCompletionWindow.ShowCompletionWindow(
+          codeEditor.ParentForm,      // The parent window for the completion window
+          editor,                   // The text editor to show the window for
+          CodeEditor.DummyFileName,    // Filename - will be passed back to the provider
+          completionDataProvider,    // Provider to get the list of possible completions
+          key                        // Key pressed - will be passed to the provider
+        );
+        if (codeCompletionWindow != null) {
+          // ShowCompletionWindow can return null when the provider returns an empty list
+          codeCompletionWindow.Closed += new EventHandler(CloseCodeCompletionWindow);
+        }
+      }
+      return false;
+    }
+
+    void CloseCodeCompletionWindow(object sender, EventArgs e) {
+      if (codeCompletionWindow != null) {
+        codeCompletionWindow.Closed -= new EventHandler(CloseCodeCompletionWindow);
+        codeCompletionWindow.Dispose();
+        codeCompletionWindow = null;
+      }
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.CodeEditor/3.3/CodeCompletionProvider.cs
===================================================================
--- trunk/sources/HeuristicLab.CodeEditor/3.3/CodeCompletionProvider.cs	(revision 3705)
+++ trunk/sources/HeuristicLab.CodeEditor/3.3/CodeCompletionProvider.cs	(revision 3705)
@@ -0,0 +1,154 @@
+﻿// CSharp Editor Example with Code Completion
+// Copyright (c) 2006, Daniel Grunwald
+// All rights reserved.
+// 
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+// 
+// - Redistributions of source code must retain the above copyright notice, this list
+//   of conditions and the following disclaimer.
+// 
+// - Redistributions in binary form must reproduce the above copyright notice, this list
+//   of conditions and the following disclaimer in the documentation and/or other materials
+//   provided with the distribution.
+// 
+// - Neither the name of the ICSharpCode team nor the names of its contributors may be used to
+//   endorse or promote products derived from this software without specific prior written
+//   permission.
+// 
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &AS IS& AND ANY EXPRESS
+// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+// IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using ICSharpCode.TextEditor;
+using ICSharpCode.TextEditor.Gui.CompletionWindow;
+
+using Dom = ICSharpCode.SharpDevelop.Dom;
+using NRefactoryResolver = ICSharpCode.SharpDevelop.Dom.NRefactoryResolver.NRefactoryResolver;
+
+namespace HeuristicLab.CodeEditor {
+  class CodeCompletionProvider : ICompletionDataProvider {
+    CodeEditor codeEditor;
+
+    public CodeCompletionProvider(CodeEditor codeEditor) {
+      this.codeEditor = codeEditor;
+    }
+
+    public ImageList ImageList {
+      get {
+        return codeEditor.imageList1;
+      }
+    }
+
+    public string PreSelection {
+      get {
+        return null;
+      }
+    }
+
+    public int DefaultIndex {
+      get {
+        return -1;
+      }
+    }
+
+    public CompletionDataProviderKeyResult ProcessKey(char key) {
+      if (char.IsLetterOrDigit(key) || key == '_') {
+        return CompletionDataProviderKeyResult.NormalKey;
+      } else {
+        // key triggers insertion of selected items
+        return CompletionDataProviderKeyResult.InsertionKey;
+      }
+    }
+
+    /// <summary>
+    /// Called when entry should be inserted. Forward to the insertion action of the completion data.
+    /// </summary>
+    public bool InsertAction(ICompletionData data, TextArea textArea, int insertionOffset, char key) {
+      textArea.Caret.Position = textArea.Document.OffsetToPosition(insertionOffset);
+      return data.InsertAction(textArea, key);
+    }
+
+    public ICompletionData[] GenerateCompletionData(string fileName, TextArea textArea, char charTyped) {
+      // We can return code-completion items like this:
+
+      //return new ICompletionData[] {
+      //	new DefaultCompletionData("Text", "Description", 1)
+      //};
+
+      NRefactoryResolver resolver = new NRefactoryResolver(codeEditor.projectContent.Language);
+      Dom.ResolveResult rr = resolver.Resolve(FindExpression(textArea),
+                                              codeEditor.parseInformation,
+                                              textArea.MotherTextEditorControl.Text);
+      List<ICompletionData> resultList = new List<ICompletionData>();
+      if (rr != null) {
+        ArrayList completionData = rr.GetCompletionData(codeEditor.projectContent);
+        if (completionData != null) {
+          AddCompletionData(resultList, completionData);
+        }
+      }
+      return resultList.ToArray();
+    }
+
+    /// <summary>
+    /// Find the expression the cursor is at.
+    /// Also determines the context (using statement, "new"-expression etc.) the
+    /// cursor is at.
+    /// </summary>
+    Dom.ExpressionResult FindExpression(TextArea textArea) {
+      Dom.IExpressionFinder finder;
+      finder = new Dom.CSharp.CSharpExpressionFinder(codeEditor.parseInformation);
+      Dom.ExpressionResult expression = finder.FindExpression(textArea.Document.TextContent, textArea.Caret.Offset);
+      if (expression.Region.IsEmpty) {
+        expression.Region = new Dom.DomRegion(textArea.Caret.Line + 1, textArea.Caret.Column + 1);
+      }
+      return expression;
+    }
+
+    void AddCompletionData(List<ICompletionData> resultList, ArrayList completionData) {
+      // used to store the method names for grouping overloads
+      Dictionary<string, CodeCompletionData> nameDictionary = new Dictionary<string, CodeCompletionData>();
+
+      // Add the completion data as returned by SharpDevelop.Dom to the
+      // list for the text editor
+      foreach (object obj in completionData) {
+        if (obj is string) {
+          // namespace names are returned as string
+          resultList.Add(new DefaultCompletionData((string)obj, "namespace " + obj, 5));
+        } else if (obj is Dom.IClass) {
+          Dom.IClass c = (Dom.IClass)obj;
+          resultList.Add(new CodeCompletionData(c));
+        } else if (obj is Dom.IMember) {
+          Dom.IMember m = (Dom.IMember)obj;
+          if (m is Dom.IMethod && ((m as Dom.IMethod).IsConstructor)) {
+            // Skip constructors
+            continue;
+          }
+          // Group results by name and add "(x Overloads)" to the
+          // description if there are multiple results with the same name.
+
+          CodeCompletionData data;
+          if (nameDictionary.TryGetValue(m.Name, out data)) {
+            data.AddOverload(m);
+          } else {
+            nameDictionary[m.Name] = data = new CodeCompletionData(m);
+            resultList.Add(data);
+          }
+        } else {
+          // Current ICSharpCode.SharpDevelop.Dom should never return anything else
+          throw new NotSupportedException();
+        }
+      }
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.CodeEditor/3.3/CodeEditor.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.CodeEditor/3.3/CodeEditor.Designer.cs	(revision 3705)
+++ trunk/sources/HeuristicLab.CodeEditor/3.3/CodeEditor.Designer.cs	(revision 3705)
@@ -0,0 +1,131 @@
+﻿using System;
+namespace HeuristicLab.CodeEditor {
+  public partial class CodeEditor : System.Windows.Forms.UserControl {
+    /// <summary>
+    /// Designer variable used to keep track of non-visual components.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Disposes resources used by the form.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      runParser = false;
+      if (disposing) {
+        if (components != null) {
+          components.Dispose();
+        }
+      }
+      base.Dispose(disposing);
+    }
+
+    /// <summary>
+    /// This method is required for Windows Forms designer support.
+    /// Do not change the method contents inside the source code editor. The Forms designer might
+    /// not be able to load this method if it was changed manually.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      System.Windows.Forms.ToolStripStatusLabel toolStripFiller;
+      this.textEditor = new ICSharpCode.TextEditor.TextEditorControl();
+      this.statusStrip1 = new System.Windows.Forms.StatusStrip();
+      this.parserThreadLabel = new System.Windows.Forms.ToolStripStatusLabel();
+      this.errorLabel = new System.Windows.Forms.ToolStripStatusLabel();
+      this.sharpDevelopLabel = new System.Windows.Forms.ToolStripStatusLabel();
+      this.imageList1 = new System.Windows.Forms.ImageList(this.components);
+      toolStripFiller = new System.Windows.Forms.ToolStripStatusLabel();
+      this.statusStrip1.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // toolStripFiller
+      // 
+      toolStripFiller.Name = "toolStripFiller";
+      toolStripFiller.Size = new System.Drawing.Size(395, 17);
+      toolStripFiller.Spring = true;
+      // 
+      // textEditor
+      // 
+      this.textEditor.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.textEditor.ConvertTabsToSpaces = true;
+      this.textEditor.IndentStyle = ICSharpCode.TextEditor.Document.IndentStyle.Auto;
+      this.textEditor.IsIconBarVisible = true;
+      this.textEditor.IsReadOnly = false;
+      this.textEditor.Location = new System.Drawing.Point(0, 0);
+      this.textEditor.Name = "textEditor";
+      this.textEditor.ShowEOLMarkers = true;
+      this.textEditor.ShowSpaces = true;
+      this.textEditor.ShowTabs = true;
+      this.textEditor.ShowVRuler = false;
+      this.textEditor.Size = new System.Drawing.Size(556, 245);
+      this.textEditor.TabIndent = 2;
+      this.textEditor.TabIndex = 0;
+      // 
+      // statusStrip1
+      // 
+      this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.parserThreadLabel,
+            toolStripFiller,
+            this.errorLabel,
+            this.sharpDevelopLabel});
+      this.statusStrip1.Location = new System.Drawing.Point(0, 248);
+      this.statusStrip1.Name = "statusStrip1";
+      this.statusStrip1.Size = new System.Drawing.Size(556, 22);
+      this.statusStrip1.TabIndex = 1;
+      this.statusStrip1.Text = "statusStrip1";
+      // 
+      // parserThreadLabel
+      // 
+      this.parserThreadLabel.Name = "parserThreadLabel";
+      this.parserThreadLabel.Size = new System.Drawing.Size(39, 17);
+      this.parserThreadLabel.Text = "Ready";
+      // 
+      // errorLabel
+      // 
+      this.errorLabel.ForeColor = System.Drawing.Color.Red;
+      this.errorLabel.Name = "errorLabel";
+      this.errorLabel.Size = new System.Drawing.Size(0, 17);
+      // 
+      // sharpDevelopLabel
+      // 
+      this.sharpDevelopLabel.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.sharpDevelopLabel.IsLink = true;
+      this.sharpDevelopLabel.Name = "sharpDevelopLabel";
+      this.sharpDevelopLabel.Size = new System.Drawing.Size(107, 17);
+      this.sharpDevelopLabel.Tag = "http://www.icsharpcode.net/OpenSource/SD/";
+      this.sharpDevelopLabel.Text = "powered by #develop";
+      this.sharpDevelopLabel.ToolTipText = "Syntax highlighting and code completion facilities provided through #develop libr" +
+          "aries";
+      this.sharpDevelopLabel.Click += new System.EventHandler(this.toolStripStatusLabel1_Click);
+      // 
+      // imageList1
+      // 
+      this.imageList1.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit;
+      this.imageList1.ImageSize = new System.Drawing.Size(16, 16);
+      this.imageList1.TransparentColor = System.Drawing.Color.White;
+      // 
+      // CodeEditor
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.textEditor);
+      this.Controls.Add(this.statusStrip1);
+      this.Name = "CodeEditor";
+      this.Size = new System.Drawing.Size(556, 270);
+      this.Resize += new System.EventHandler(this.CodeEditor_Resize);
+      this.statusStrip1.ResumeLayout(false);
+      this.statusStrip1.PerformLayout();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+    internal System.Windows.Forms.ImageList imageList1;
+    private System.Windows.Forms.ToolStripStatusLabel parserThreadLabel;
+    private System.Windows.Forms.StatusStrip statusStrip1;
+    private ICSharpCode.TextEditor.TextEditorControl textEditor;
+    private System.Windows.Forms.ToolStripStatusLabel sharpDevelopLabel;
+    private System.Windows.Forms.ToolStripStatusLabel errorLabel;
+  }
+}
Index: trunk/sources/HeuristicLab.CodeEditor/3.3/CodeEditor.cs
===================================================================
--- trunk/sources/HeuristicLab.CodeEditor/3.3/CodeEditor.cs	(revision 3705)
+++ trunk/sources/HeuristicLab.CodeEditor/3.3/CodeEditor.cs	(revision 3705)
@@ -0,0 +1,392 @@
+﻿// CSharp Editor Example with Code Completion
+// Copyright (c) 2006, Daniel Grunwald
+// All rights reserved.
+// 
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+// 
+// - Redistributions of source code must retain the above copyright notice, this list
+//   of conditions and the following disclaimer.
+// 
+// - Redistributions in binary form must reproduce the above copyright notice, this list
+//   of conditions and the following disclaimer in the documentation and/or other materials
+//   provided with the distribution.
+// 
+// - Neither the name of the ICSharpCode team nor the names of its contributors may be used to
+//   endorse or promote products derived from this software without specific prior written
+//   permission.
+// 
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &AS IS& AND ANY EXPRESS
+// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+// IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+using System;
+using System.Linq;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Windows.Forms;
+using System.IO;
+using System.Threading;
+using HeuristicLab.Common.Resources;
+
+using NRefactory = ICSharpCode.NRefactory;
+using Dom = ICSharpCode.SharpDevelop.Dom;
+using ICSharpCode.TextEditor.Document;
+using System.CodeDom.Compiler;
+using ICSharpCode.TextEditor;
+using System.Reflection;
+using System.Diagnostics;
+
+namespace HeuristicLab.CodeEditor {
+
+  public partial class CodeEditor : UserControl {
+
+    #region Fields & Properties
+
+    internal Dom.ProjectContentRegistry projectContentRegistry;
+    internal Dom.DefaultProjectContent projectContent;
+    internal Dom.ParseInformation parseInformation = new Dom.ParseInformation();
+    Dom.ICompilationUnit lastCompilationUnit;
+    Thread parserThread;
+
+    /// <summary>
+    /// Many SharpDevelop.Dom methods take a file name, which is really just a unique identifier
+    /// for a file - Dom methods don't try to access code files on disk, so the file does not have
+    /// to exist.
+    /// SharpDevelop itself uses internal names of the kind "[randomId]/Class1.cs" to support
+    /// code-completion in unsaved files.
+    /// </summary>
+    public const string DummyFileName = "edited.cs";
+
+    private IDocument Doc {
+      get {
+        return textEditor.Document;
+      }
+    }
+
+    private string prefix = "";
+    private TextMarker prefixMarker =
+      new TextMarker(0, 1, TextMarkerType.SolidBlock, Color.LightGray) {
+        IsReadOnly = true,
+      };
+    public string Prefix {
+      get {
+        return prefix;
+      }
+      set {
+        if (value == null) value = "";
+        if (prefix == value) return;
+        Doc.MarkerStrategy.RemoveMarker(prefixMarker);
+        Doc.Remove(0, prefix.Length);
+        prefix = value;
+        if (value.Length > 0) {
+          Doc.Insert(0, value);
+          prefixMarker.Offset = 0;
+          prefixMarker.Length = prefix.Length;
+          Doc.MarkerStrategy.AddMarker(prefixMarker);
+        }
+        Doc.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.WholeTextArea));
+        Doc.CommitUpdate();
+      }
+    }
+
+    private string suffix = "";
+    private TextMarker suffixMarker =
+      new TextMarker(0, 1, TextMarkerType.SolidBlock, Color.LightGray) {
+        IsReadOnly = true,
+      };
+    public string Suffix {
+      get {
+        return suffix;
+      }
+      set {
+        if (value == null) value = "";
+        if (suffix == value) return;
+        Doc.MarkerStrategy.RemoveMarker(suffixMarker);
+        Doc.Remove(Doc.TextLength - suffix.Length, suffix.Length);
+        suffix = value;
+        if (value.Length > 0) {
+          suffixMarker.Offset = Doc.TextLength;
+          Doc.Insert(Doc.TextLength, value);
+          suffixMarker.Length = suffix.Length;
+          Doc.MarkerStrategy.AddMarker(suffixMarker);
+        }
+        Doc.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.WholeTextArea));
+        Doc.CommitUpdate();
+      }
+    }
+
+    public string UserCode {
+      get {
+        return Doc.GetText(
+          prefix.Length,
+          Doc.TextLength - suffix.Length - prefix.Length);
+      }
+      set {
+        Doc.Replace(prefix.Length, Doc.TextLength - suffix.Length - prefix.Length, value);
+        Doc.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.WholeTextArea));
+        Doc.CommitUpdate();
+      }
+    }
+
+    #endregion
+
+    public event EventHandler TextEditorValidated;
+
+    protected void OnTextEditorValidated() {
+      if (TextEditorValidated != null)
+        TextEditorValidated(this, EventArgs.Empty);
+    }
+
+    public CodeEditor() {
+      InitializeComponent();
+
+      textEditor.ActiveTextAreaControl.TextEditorProperties.SupportReadOnlySegments = true;
+
+      textEditor.SetHighlighting("C#");
+      textEditor.ShowEOLMarkers = false;
+      textEditor.ShowInvalidLines = false;
+      HostCallbackImplementation.Register(this);
+      CodeCompletionKeyHandler.Attach(this, textEditor);
+      ToolTipProvider.Attach(this, textEditor);
+
+      projectContentRegistry = new Dom.ProjectContentRegistry(); // Default .NET 2.0 registry
+      try {
+        string persistencePath = Path.Combine(Path.GetTempPath(), "HeuristicLab.CodeEditor");
+        if (!Directory.Exists(persistencePath))
+          Directory.CreateDirectory(persistencePath);
+        FileStream fs = File.Create(Path.Combine(persistencePath, "test.tmp"));
+        fs.Close();
+        File.Delete(Path.Combine(persistencePath, "test.tmp"));
+        // if we made it this far, enable on-disk parsing cache
+        projectContentRegistry.ActivatePersistence(persistencePath);
+      } catch (NotSupportedException) {
+      } catch (IOException) {
+      } catch (System.Security.SecurityException) {
+      } catch (UnauthorizedAccessException) {
+      } catch (ArgumentException) {
+      }
+      projectContent = new Dom.DefaultProjectContent();
+      projectContent.Language = Dom.LanguageProperties.CSharp;
+    }
+
+    protected override void OnLoad(EventArgs e) {
+      base.OnLoad(e);
+
+      if (DesignMode)
+        return;
+
+      textEditor.ActiveTextAreaControl.TextArea.KeyEventHandler += new ICSharpCode.TextEditor.KeyEventHandler(TextArea_KeyEventHandler);
+      textEditor.ActiveTextAreaControl.TextArea.DoProcessDialogKey += new DialogKeyProcessor(TextArea_DoProcessDialogKey);
+
+      parserThread = new Thread(ParserThread);
+      parserThread.IsBackground = true;
+      parserThread.Start();
+
+      textEditor.Validated += (s, a) => { OnTextEditorValidated(); };
+      InitializeImageList();
+    }
+
+    private void InitializeImageList() {
+      imageList1.Images.Clear();
+      imageList1.Images.Add("Icons.16x16.Class.png", VS2008ImageLibrary.Class);
+      imageList1.Images.Add("Icons.16x16.Method.png", VS2008ImageLibrary.Method);
+      imageList1.Images.Add("Icons.16x16.Property.png", VS2008ImageLibrary.Properties);
+      imageList1.Images.Add("Icons.16x16.Field.png", VS2008ImageLibrary.Field);
+      imageList1.Images.Add("Icons.16x16.Enum.png", VS2008ImageLibrary.Enum);
+      imageList1.Images.Add("Icons.16x16.NameSpace.png", VS2008ImageLibrary.Namespace);
+      imageList1.Images.Add("Icons.16x16.Event.png", VS2008ImageLibrary.Event);
+    }
+
+    #region keyboard handlers: filter input in read-only areas
+
+    bool TextArea_KeyEventHandler(char ch) {
+      int caret = textEditor.ActiveTextAreaControl.Caret.Offset;
+      return caret < prefix.Length || caret > Doc.TextLength - suffix.Length;
+    }
+
+    bool TextArea_DoProcessDialogKey(Keys keyData) {
+      if (keyData == Keys.Return) {
+        int caret = textEditor.ActiveTextAreaControl.Caret.Offset;
+        if (caret < prefix.Length ||
+            caret > Doc.TextLength - suffix.Length) {
+          return true;
+        }
+      }
+      return false;
+    }
+
+    #endregion
+
+    public void ScrollAfterPrefix() {
+      int lineNr = prefix != null ? Doc.OffsetToPosition(prefix.Length).Line : 0;
+      textEditor.ActiveTextAreaControl.JumpTo(lineNr + 1);
+    }
+
+    private List<TextMarker> errorMarkers = new List<TextMarker>();
+    private List<Bookmark> errorBookmarks = new List<Bookmark>();
+    public void ShowCompileErrors(CompilerErrorCollection compilerErrors, string filename) {
+      Doc.MarkerStrategy.RemoveAll(m => errorMarkers.Contains(m));
+      Doc.BookmarkManager.RemoveMarks(m => errorBookmarks.Contains(m));
+      errorMarkers.Clear();
+      errorBookmarks.Clear();
+      errorLabel.Text = "";
+      errorLabel.ToolTipText = null;
+      if (compilerErrors == null)
+        return;
+      foreach (CompilerError error in compilerErrors) {
+        if (!error.FileName.EndsWith(filename)) {
+          errorLabel.Text = "error in generated code";
+          errorLabel.ToolTipText = string.Format("{0}{1}:{2} -> {3}",
+            errorLabel.ToolTipText != null ? (errorLabel.ToolTipText + "\n\n") : "",
+            error.Line, error.Column,
+            error.ErrorText);
+          continue;
+        }
+        var startPosition = Doc.OffsetToPosition(prefix.Length);
+        if (error.Line == 1)
+          error.Column += startPosition.Column;
+        error.Line += startPosition.Line;
+        AddErrorMarker(error);
+        AddErrorBookmark(error);
+      }
+      Doc.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.WholeTextArea));
+      Doc.CommitUpdate();
+    }
+
+    private void AddErrorMarker(CompilerError error) {
+      var segment = GetSegmentAtOffset(error.Line, error.Column);
+      Color color = error.IsWarning ? Color.Blue : Color.Red;
+      var marker = new TextMarker(segment.Offset, segment.Length, TextMarkerType.WaveLine, color) {
+        ToolTip = error.ErrorText,
+      };
+      errorMarkers.Add(marker);
+      Doc.MarkerStrategy.AddMarker(marker);
+    }
+
+    private void AddErrorBookmark(CompilerError error) {
+      var bookmark = new ErrorBookmark(Doc, new TextLocation(error.Column, error.Line - 1));
+      errorBookmarks.Add(bookmark);
+      Doc.BookmarkManager.AddMark(bookmark);
+    }
+
+    private AbstractSegment GetSegmentAtOffset(int lineNr, int columnNr) {
+      lineNr = Math.Max(Doc.OffsetToPosition(prefix.Length).Line, lineNr);
+      lineNr = Math.Min(Doc.OffsetToPosition(Doc.TextLength - suffix.Length).Line, lineNr);
+      var line = Doc.GetLineSegment(lineNr - 1);
+      columnNr = Math.Max(0, columnNr);
+      columnNr = Math.Min(line.Length, columnNr);
+      var word = line.GetWord(columnNr);
+      AbstractSegment segment = new AbstractSegment();
+      if (word != null) {
+        segment.Offset = line.Offset + word.Offset;
+        segment.Length = word.Length;
+      } else {
+        segment.Offset = line.Offset + columnNr - 1;
+        segment.Length = 1;
+      }
+      return segment;
+    }
+
+    private HashSet<Assembly> assemblies = new HashSet<Assembly>();
+    public IEnumerable<Assembly> ReferencedAssemblies {
+      get { return assemblies; }
+    }
+    public void AddAssembly(Assembly a) {
+      ShowMessage("Loading " + a.GetName().Name + "...");
+      if (assemblies.Contains(a))
+        return;
+      var reference = projectContentRegistry.GetProjectContentForReference(a.GetName().Name, a.Location);
+      projectContent.AddReferencedContent(reference);
+      assemblies.Add(a);
+      ShowMessage("Ready");
+    }
+    public void RemoveAssembly(Assembly a) {
+      ShowMessage("Unloading " + a.GetName().Name + "...");
+      if (!assemblies.Contains(a))
+        return;
+      var content = projectContentRegistry.GetExistingProjectContent(a.Location);
+      if (content != null) {
+        projectContent.ReferencedContents.Remove(content);
+        projectContentRegistry.UnloadProjectContent(content);
+      }
+      ShowMessage("Ready");
+    }
+
+    private bool runParser = true;
+    private void ParserThread() {
+      BeginInvoke(new MethodInvoker(delegate { parserThreadLabel.Text = "Loading mscorlib..."; }));
+      projectContent.AddReferencedContent(projectContentRegistry.Mscorlib);
+      ParseStep();
+      BeginInvoke(new MethodInvoker(delegate { parserThreadLabel.Text = "Ready"; }));
+      while (runParser && !IsDisposed) {
+        ParseStep();
+        Thread.Sleep(2000);
+      }
+    }
+
+    private void ParseStep() {
+      try {
+        string code = null;
+        Invoke(new MethodInvoker(delegate { code = textEditor.Text; }));
+        TextReader textReader = new StringReader(code);
+        Dom.ICompilationUnit newCompilationUnit;
+        NRefactory.SupportedLanguage supportedLanguage;
+        supportedLanguage = NRefactory.SupportedLanguage.CSharp;
+        using (NRefactory.IParser p = NRefactory.ParserFactory.CreateParser(supportedLanguage, textReader)) {
+          p.ParseMethodBodies = false;
+          p.Parse();
+          newCompilationUnit = ConvertCompilationUnit(p.CompilationUnit);
+        }
+        projectContent.UpdateCompilationUnit(lastCompilationUnit, newCompilationUnit, DummyFileName);
+        lastCompilationUnit = newCompilationUnit;
+        parseInformation.SetCompilationUnit(newCompilationUnit);
+      } catch { }
+    }
+
+    Dom.ICompilationUnit ConvertCompilationUnit(NRefactory.Ast.CompilationUnit cu) {
+      Dom.NRefactoryResolver.NRefactoryASTConvertVisitor converter;
+      converter = new Dom.NRefactoryResolver.NRefactoryASTConvertVisitor(projectContent);
+      cu.AcceptVisitor(converter, null);
+      return converter.Cu;
+    }
+
+    private void ShowMessage(string m) {
+      if (this.Handle == null)
+        return;
+      BeginInvoke(new Action(() => parserThreadLabel.Text = m));
+    }
+
+    private void toolStripStatusLabel1_Click(object sender, EventArgs e) {
+      var proc = new Process();
+      proc.StartInfo.FileName = sharpDevelopLabel.Tag.ToString();
+      proc.Start();
+    }
+
+    private void CodeEditor_Resize(object sender, EventArgs e) {
+      var textArea = textEditor.ActiveTextAreaControl.TextArea;
+      var vScrollBar = textEditor.ActiveTextAreaControl.VScrollBar;
+      var hScrollBar = textEditor.ActiveTextAreaControl.HScrollBar;
+
+      textArea.SuspendLayout();
+      textArea.Width = textEditor.Width - vScrollBar.Width;
+      textArea.Height = textEditor.Height - hScrollBar.Height;
+      textArea.ResumeLayout();
+
+      vScrollBar.SuspendLayout();
+      vScrollBar.Location = new Point(textArea.Width, 0);
+      vScrollBar.Height = textArea.Height;
+      vScrollBar.ResumeLayout();
+
+      hScrollBar.SuspendLayout();
+      hScrollBar.Location = new Point(0, textArea.Height);
+      hScrollBar.Width = textArea.Width;
+      hScrollBar.ResumeLayout();
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.CodeEditor/3.3/CodeEditor.resx
===================================================================
--- trunk/sources/HeuristicLab.CodeEditor/3.3/CodeEditor.resx	(revision 3705)
+++ trunk/sources/HeuristicLab.CodeEditor/3.3/CodeEditor.resx	(revision 3705)
@@ -0,0 +1,129 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="toolStripFiller.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </metadata>
+  <metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>127, 17</value>
+  </metadata>
+  <metadata name="imageList1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
Index: trunk/sources/HeuristicLab.CodeEditor/3.3/CodeViewer.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.CodeEditor/3.3/CodeViewer.Designer.cs	(revision 3705)
+++ trunk/sources/HeuristicLab.CodeEditor/3.3/CodeViewer.Designer.cs	(revision 3705)
@@ -0,0 +1,76 @@
+﻿namespace HeuristicLab.CodeEditor {
+  partial class CodeViewer {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.button1 = new System.Windows.Forms.Button();
+      this.textEditorControl1 = new ICSharpCode.TextEditor.TextEditorControl();
+      this.SuspendLayout();
+      // 
+      // button1
+      // 
+      this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.button1.Location = new System.Drawing.Point(509, 296);
+      this.button1.Name = "button1";
+      this.button1.Size = new System.Drawing.Size(75, 23);
+      this.button1.TabIndex = 1;
+      this.button1.Text = "OK";
+      this.button1.UseVisualStyleBackColor = true;
+      this.button1.Click += new System.EventHandler(this.button1_Click);
+      // 
+      // textEditorControl1
+      // 
+      this.textEditorControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.textEditorControl1.IsReadOnly = false;
+      this.textEditorControl1.Location = new System.Drawing.Point(12, 12);
+      this.textEditorControl1.Name = "textEditorControl1";
+      this.textEditorControl1.ShowEOLMarkers = true;
+      this.textEditorControl1.ShowSpaces = true;
+      this.textEditorControl1.ShowTabs = true;
+      this.textEditorControl1.ShowVRuler = false;
+      this.textEditorControl1.Size = new System.Drawing.Size(572, 278);
+      this.textEditorControl1.TabIndex = 2;
+      this.textEditorControl1.Text = "textEditorControl1";
+      // 
+      // CodeViewer
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(596, 331);
+      this.Controls.Add(this.textEditorControl1);
+      this.Controls.Add(this.button1);
+      this.Icon = HeuristicLab.Common.Resources.Resources.HeuristicLabIcon;
+      this.Name = "CodeViewer";
+      this.Text = "GeneratedCode";
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button button1;
+    private ICSharpCode.TextEditor.TextEditorControl textEditorControl1;
+  }
+}
Index: trunk/sources/HeuristicLab.CodeEditor/3.3/CodeViewer.cs
===================================================================
--- trunk/sources/HeuristicLab.CodeEditor/3.3/CodeViewer.cs	(revision 3705)
+++ trunk/sources/HeuristicLab.CodeEditor/3.3/CodeViewer.cs	(revision 3705)
@@ -0,0 +1,27 @@
+﻿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;
+
+namespace HeuristicLab.CodeEditor {
+  public partial class CodeViewer : Form {
+
+    public CodeViewer() {
+      InitializeComponent();
+      textEditorControl1.IsReadOnly = true;
+      textEditorControl1.SetHighlighting("C#");
+    }
+
+    public CodeViewer(string code) : this() {
+      textEditorControl1.Text = code;
+    }
+
+    private void button1_Click(object sender, EventArgs e) {
+      Close();
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.CodeEditor/3.3/CodeViewer.resx
===================================================================
--- trunk/sources/HeuristicLab.CodeEditor/3.3/CodeViewer.resx	(revision 3705)
+++ trunk/sources/HeuristicLab.CodeEditor/3.3/CodeViewer.resx	(revision 3705)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: trunk/sources/HeuristicLab.CodeEditor/3.3/ErrorBookmark.cs
===================================================================
--- trunk/sources/HeuristicLab.CodeEditor/3.3/ErrorBookmark.cs	(revision 3705)
+++ trunk/sources/HeuristicLab.CodeEditor/3.3/ErrorBookmark.cs	(revision 3705)
@@ -0,0 +1,29 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Drawing;
+using ICSharpCode.TextEditor.Document;
+using ICSharpCode.TextEditor;
+
+namespace HeuristicLab.CodeEditor {
+  public class ErrorBookmark : Bookmark {
+
+    public override bool CanToggle { get { return false; } }
+
+    public ErrorBookmark(IDocument document, TextLocation location)
+      : base(document, location) {
+    }
+
+    public override void Draw(IconBarMargin margin, System.Drawing.Graphics g, System.Drawing.Point p) {      
+      int delta = margin.TextArea.TextView.FontHeight / 4;
+			Rectangle rect = new Rectangle(
+        2,
+        p.Y + delta,
+        margin.DrawingPosition.Width - 6,
+        margin.TextArea.TextView.FontHeight - delta * 2);
+      g.FillRectangle(Brushes.Red, rect);
+      g.DrawRectangle(Pens.White, rect);
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.CodeEditor/3.3/HeuristicLab.CodeEditor-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.CodeEditor/3.3/HeuristicLab.CodeEditor-3.3.csproj	(revision 3705)
+++ trunk/sources/HeuristicLab.CodeEditor/3.3/HeuristicLab.CodeEditor-3.3.csproj	(revision 3705)
@@ -0,0 +1,165 @@
+﻿<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <OutputType>Library</OutputType>
+    <RootNamespace>HeuristicLab.CodeEditor</RootNamespace>
+    <AssemblyName>HeuristicLab.CodeEditor-3.3</AssemblyName>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{489CFE09-FDF7-4C89-BAB5-BD09CADD61AD}</ProjectGuid>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <NoStdLib>False</NoStdLib>
+    <WarningLevel>4</WarningLevel>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <StartupObject>
+    </StartupObject>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
+    <OutputPath>bin\Debug\</OutputPath>
+    <Optimize>False</Optimize>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>Full</DebugType>
+    <CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
+    <OutputPath>bin\Release\</OutputPath>
+    <Optimize>True</Optimize>
+    <DefineConstants>TRACE</DefineConstants>
+    <DebugSymbols>False</DebugSymbols>
+    <DebugType>None</DebugType>
+    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Platform)' == 'AnyCPU' ">
+    <RegisterForComInterop>False</RegisterForComInterop>
+    <GenerateSerializationAssemblies>Auto</GenerateSerializationAssemblies>
+    <BaseAddress>4194304</BaseAddress>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <FileAlignment>4096</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x86\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
+    <FileAlignment>4096</FileAlignment>
+    <DebugType>Full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>bin\x86\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <FileAlignment>4096</FileAlignment>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <DocumentationFile>bin\x86\Release\HeuristicLab.CodeEditor-3.3.xml</DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x64\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
+    <FileAlignment>4096</FileAlignment>
+    <DebugType>Full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>bin\x64\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <FileAlignment>4096</FileAlignment>
+    <DebugType>None</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <DocumentationFile>bin\x64\Release\HeuristicLab.CodeEditor-3.3.xml</DocumentationFile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DocumentationFile>bin\Release\HeuristicLab.CodeEditor-3.3.xml</DocumentationFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="ICSharpCode.NRefactory, Version=3.1.1.5327, Culture=neutral, PublicKeyToken=efe927acf176eea2, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\HeuristicLab.ExtLibs\HeuristicLab.SharpDevelop\3.1.1.5327\ICSharpCode.NRefactory.dll</HintPath>
+    </Reference>
+    <Reference Include="ICSharpCode.SharpDevelop.Dom, Version=3.1.1.5327, Culture=neutral, PublicKeyToken=f829da5c02be14ee, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\HeuristicLab.ExtLibs\HeuristicLab.SharpDevelop\3.1.1.5327\ICSharpCode.SharpDevelop.Dom.dll</HintPath>
+    </Reference>
+    <Reference Include="ICSharpCode.TextEditor, Version=3.1.1.5327, Culture=neutral, PublicKeyToken=4d61825e8dd49f1a, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\HeuristicLab.ExtLibs\HeuristicLab.SharpDevelop\3.1.1.5327\ICSharpCode.TextEditor.dll</HintPath>
+    </Reference>
+    <Reference Include="Mono.Cecil, Version=0.6.9.1, Culture=neutral, PublicKeyToken=0738eb9f132ed756, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\HeuristicLab.ExtLibs\HeuristicLab.SharpDevelop\3.1.1.5327\Mono.Cecil.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="CodeCompletionData.cs" />
+    <EmbeddedResource Include="CodeEditor.resx">
+      <DependentUpon>CodeEditor.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="CodeViewer.resx">
+      <DependentUpon>CodeViewer.cs</DependentUpon>
+    </EmbeddedResource>
+    <Compile Include="CodeCompletionProvider.cs" />
+    <Compile Include="CodeCompletionKeyHandler.cs" />
+    <Compile Include="CodeViewer.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="CodeViewer.Designer.cs">
+      <DependentUpon>CodeViewer.cs</DependentUpon>
+    </Compile>
+    <None Include="HeuristicLabCodeEditorPlugin.cs.frame" />
+    <Compile Include="HeuristicLabCodeEditorPlugin.cs" />
+    <Compile Include="ErrorBookmark.cs" />
+    <Compile Include="HostCallbackImplementation.cs" />
+    <Compile Include="CodeEditor.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="CodeEditor.Designer.cs">
+      <DependentUpon>CodeEditor.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="ToolTipProvider.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Properties\AssemblyInfo.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Common.Resources\3.3\HeuristicLab.Common.Resources-3.3.csproj">
+      <Project>{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}</Project>
+      <Name>HeuristicLab.Common.Resources-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.ExtLibs\HeuristicLab.SharpDevelop\3.1.1.5327\HeuristicLab.SharpDevelop-3.1.1.5327.csproj">
+      <Project>{4ABA047D-46DD-4608-9E4A-41C5F92FDBB1}</Project>
+      <Name>HeuristicLab.SharpDevelop-3.1.1.5327</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+SubWCRev "%25ProjectDir%25\" "%25ProjectDir%25\HeuristicLabCodeEditorPlugin.cs.frame" "%25ProjectDir%25\HeuristicLabCodeEditorPlugin.cs"</PreBuildEvent>
+  </PropertyGroup>
+</Project>
Index: trunk/sources/HeuristicLab.CodeEditor/3.3/HeuristicLabCodeEditorPlugin.cs.frame
===================================================================
--- trunk/sources/HeuristicLab.CodeEditor/3.3/HeuristicLabCodeEditorPlugin.cs.frame	(revision 3705)
+++ trunk/sources/HeuristicLab.CodeEditor/3.3/HeuristicLabCodeEditorPlugin.cs.frame	(revision 3705)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.CodeEditor {
+  [Plugin("HeuristicLab.CodeEditor", "3.3.0.$WCREV$")]
+  [PluginFile("HeuristicLab.CodeEditor-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+  [PluginDependency("HeuristicLab.SharpDevelop", "3.1.1.5327")]
+  public class HeuristicLabCodeEditorPlugin : PluginBase {
+  }
+}
Index: trunk/sources/HeuristicLab.CodeEditor/3.3/HostCallbackImplementation.cs
===================================================================
--- trunk/sources/HeuristicLab.CodeEditor/3.3/HostCallbackImplementation.cs	(revision 3705)
+++ trunk/sources/HeuristicLab.CodeEditor/3.3/HostCallbackImplementation.cs	(revision 3705)
@@ -0,0 +1,62 @@
+﻿// CSharp Editor Example with Code Completion
+// Copyright (c) 2006, Daniel Grunwald
+// All rights reserved.
+// 
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+// 
+// - Redistributions of source code must retain the above copyright notice, this list
+//   of conditions and the following disclaimer.
+// 
+// - Redistributions in binary form must reproduce the above copyright notice, this list
+//   of conditions and the following disclaimer in the documentation and/or other materials
+//   provided with the distribution.
+// 
+// - Neither the name of the ICSharpCode team nor the names of its contributors may be used to
+//   endorse or promote products derived from this software without specific prior written
+//   permission.
+// 
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &AS IS& AND ANY EXPRESS
+// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+// IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+using System;
+using System.Windows.Forms;
+using ICSharpCode.SharpDevelop.Dom;
+
+namespace HeuristicLab.CodeEditor {
+  /// <summary>
+  /// ICSharpCode.SharpDevelop.Dom was created by extracting code from ICSharpCode.SharpDevelop.dll.
+  /// There are a few static method calls that refer to GUI code or the code for keeping the parse
+  /// information. These calls have to be implemented by the application hosting
+  /// ICSharpCode.SharpDevelop.Dom by settings static fields with a delegate to their method
+  /// implementation.
+  /// </summary>
+  static class HostCallbackImplementation {
+    public static void Register(CodeEditor codeEditor) {
+      // Must be implemented. Gets the project content of the active project.
+      HostCallback.GetCurrentProjectContent = delegate {
+        return codeEditor.projectContent;
+      };
+
+      // The default implementation just logs to Log4Net. We want to display a MessageBox.
+      // Note that we use += here - in this case, we want to keep the default Log4Net implementation.
+      HostCallback.ShowError += delegate(string message, Exception ex) {
+        MessageBox.Show(message + Environment.NewLine + ex.ToString());
+      };
+      HostCallback.ShowMessage += delegate(string message) {
+        MessageBox.Show(message);
+      };
+      HostCallback.ShowAssemblyLoadError += delegate(string fileName, string include, string message) {
+        MessageBox.Show("Error loading code-completion information for "
+                        + include + " from " + fileName
+                        + ":\r\n" + message + "\r\n");
+      };
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.CodeEditor/3.3/Properties/AssemblyInfo.frame
===================================================================
--- trunk/sources/HeuristicLab.CodeEditor/3.3/Properties/AssemblyInfo.frame	(revision 3705)
+++ trunk/sources/HeuristicLab.CodeEditor/3.3/Properties/AssemblyInfo.frame	(revision 3705)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.CodeEditor")]
+[assembly: AssemblyDescription("C# code editor with syntax highlighting and code completion")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2010 HEAL & Daniel Grunwald (#develop)")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+[assembly: Guid("956e2f0e-4f77-4575-a8d4-05892194c32d")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+[assembly: AssemblyVersion("3.2.0.0")]
+[assembly: AssemblyFileVersion("3.2.0.$WCREV$")]
Index: trunk/sources/HeuristicLab.CodeEditor/3.3/ToolTipProvider.cs
===================================================================
--- trunk/sources/HeuristicLab.CodeEditor/3.3/ToolTipProvider.cs	(revision 3705)
+++ trunk/sources/HeuristicLab.CodeEditor/3.3/ToolTipProvider.cs	(revision 3705)
@@ -0,0 +1,139 @@
+// CSharp Editor Example with Code Completion
+// Copyright (c) 2007, Daniel Grunwald
+// All rights reserved.
+// 
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+// 
+// - Redistributions of source code must retain the above copyright notice, this list
+//   of conditions and the following disclaimer.
+// 
+// - Redistributions in binary form must reproduce the above copyright notice, this list
+//   of conditions and the following disclaimer in the documentation and/or other materials
+//   provided with the distribution.
+// 
+// - Neither the name of the ICSharpCode team nor the names of its contributors may be used to
+//   endorse or promote products derived from this software without specific prior written
+//   permission.
+// 
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &AS IS& AND ANY EXPRESS
+// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+// IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+using System;
+using System.Text;
+using ICSharpCode.SharpDevelop.Dom;
+using ICSharpCode.SharpDevelop.Dom.CSharp;
+using ICSharpCode.SharpDevelop.Dom.VBNet;
+using TextEditor = ICSharpCode.TextEditor;
+using NRefactoryResolver = ICSharpCode.SharpDevelop.Dom.NRefactoryResolver.NRefactoryResolver;
+
+namespace HeuristicLab.CodeEditor {
+  sealed class ToolTipProvider {
+    CodeEditor codeEditor;
+    TextEditor.TextEditorControl editor;
+
+    private ToolTipProvider(CodeEditor codeEditor, TextEditor.TextEditorControl editor) {
+      this.codeEditor = codeEditor;
+      this.editor = editor;
+    }
+
+    public static void Attach(CodeEditor codeEditor, TextEditor.TextEditorControl editor) {
+      ToolTipProvider tp = new ToolTipProvider(codeEditor, editor);
+      editor.ActiveTextAreaControl.TextArea.ToolTipRequest += tp.OnToolTipRequest;
+    }
+
+    void OnToolTipRequest(object sender, TextEditor.ToolTipRequestEventArgs e) {
+      if (e.InDocument && !e.ToolTipShown) {
+        IExpressionFinder expressionFinder;
+        expressionFinder = new CSharpExpressionFinder(codeEditor.parseInformation);        
+        ExpressionResult expression = expressionFinder.FindFullExpression(
+          editor.Text,
+          editor.Document.PositionToOffset(e.LogicalPosition));
+        if (expression.Region.IsEmpty) {
+          expression.Region = new DomRegion(e.LogicalPosition.Line + 1, e.LogicalPosition.Column + 1);
+        }
+
+        TextEditor.TextArea textArea = editor.ActiveTextAreaControl.TextArea;
+        NRefactoryResolver resolver = new NRefactoryResolver(codeEditor.projectContent.Language);
+        ResolveResult rr = resolver.Resolve(expression,
+                                            codeEditor.parseInformation,
+                                            textArea.MotherTextEditorControl.Text);
+        string toolTipText = GetText(rr);
+        if (toolTipText != null) {
+          e.ShowToolTip(toolTipText);
+        }
+      }
+    }
+
+    static string GetText(ResolveResult result) {
+      if (result == null) {
+        return null;
+      }
+      if (result is MixedResolveResult)
+        return GetText(((MixedResolveResult)result).PrimaryResult);
+      IAmbience ambience = new CSharpAmbience();
+      ambience.ConversionFlags = ConversionFlags.StandardConversionFlags | ConversionFlags.ShowAccessibility;
+      if (result is MemberResolveResult) {
+        return GetMemberText(ambience, ((MemberResolveResult)result).ResolvedMember);
+      } else if (result is LocalResolveResult) {
+        LocalResolveResult rr = (LocalResolveResult)result;
+        ambience.ConversionFlags = ConversionFlags.UseFullyQualifiedTypeNames
+          | ConversionFlags.ShowReturnType;
+        StringBuilder b = new StringBuilder();
+        if (rr.IsParameter)
+          b.Append("parameter ");
+        else
+          b.Append("local variable ");
+        b.Append(ambience.Convert(rr.Field));
+        return b.ToString();
+      } else if (result is NamespaceResolveResult) {
+        return "namespace " + ((NamespaceResolveResult)result).Name;
+      } else if (result is TypeResolveResult) {
+        IClass c = ((TypeResolveResult)result).ResolvedClass;
+        if (c != null)
+          return GetMemberText(ambience, c);
+        else
+          return ambience.Convert(result.ResolvedType);
+      } else if (result is MethodGroupResolveResult) {
+        MethodGroupResolveResult mrr = result as MethodGroupResolveResult;
+        IMethod m = mrr.GetMethodIfSingleOverload();
+        if (m != null)
+          return GetMemberText(ambience, m);
+        else
+          return "Overload of " + ambience.Convert(mrr.ContainingType) + "." + mrr.Name;
+      } else {
+        return null;
+      }
+    }
+
+    static string GetMemberText(IAmbience ambience, IEntity member) {
+      StringBuilder text = new StringBuilder();
+      if (member is IField) {
+        text.Append(ambience.Convert(member as IField));
+      } else if (member is IProperty) {
+        text.Append(ambience.Convert(member as IProperty));
+      } else if (member is IEvent) {
+        text.Append(ambience.Convert(member as IEvent));
+      } else if (member is IMethod) {
+        text.Append(ambience.Convert(member as IMethod));
+      } else if (member is IClass) {
+        text.Append(ambience.Convert(member as IClass));
+      } else {
+        text.Append("unknown member ");
+        text.Append(member.ToString());
+      }
+      string documentation = member.Documentation;
+      if (documentation != null && documentation.Length > 0) {
+        text.Append('\n');
+        text.Append(CodeCompletionData.XmlDocumentationToText(documentation));
+      }
+      return text.ToString();
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Operators.Programmable/3.3/HeuristicLab.Operators.Programmable-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Operators.Programmable/3.3/HeuristicLab.Operators.Programmable-3.3.csproj	(revision 3704)
+++ trunk/sources/HeuristicLab.Operators.Programmable/3.3/HeuristicLab.Operators.Programmable-3.3.csproj	(revision 3705)
@@ -101,7 +101,7 @@
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\..\HeuristicLab.CodeEditor\3.2\HeuristicLab.CodeEditor-3.2.csproj">
+    <ProjectReference Include="..\..\HeuristicLab.CodeEditor\3.3\HeuristicLab.CodeEditor-3.3.csproj">
       <Project>{489CFE09-FDF7-4C89-BAB5-BD09CADD61AD}</Project>
-      <Name>HeuristicLab.CodeEditor-3.2</Name>
+      <Name>HeuristicLab.CodeEditor-3.3</Name>
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Collections\3.3\HeuristicLab.Collections-3.3.csproj">
Index: trunk/sources/HeuristicLab.Operators.Programmable/3.3/HeuristicLabOperatorsProgrammablePlugin.cs.frame
===================================================================
--- trunk/sources/HeuristicLab.Operators.Programmable/3.3/HeuristicLabOperatorsProgrammablePlugin.cs.frame	(revision 3704)
+++ trunk/sources/HeuristicLab.Operators.Programmable/3.3/HeuristicLabOperatorsProgrammablePlugin.cs.frame	(revision 3705)
@@ -28,5 +28,5 @@
   [Plugin("HeuristicLab.Operators.Programmable", "3.3.0.$WCREV$")]
   [PluginFile("HeuristicLab.Operators.Programmable-3.3.dll", PluginFileType.Assembly)]
-  [PluginDependency("HeuristicLab.CodeEditor", "3.2")]
+  [PluginDependency("HeuristicLab.CodeEditor", "3.3")]
   [PluginDependency("HeuristicLab.Collections", "3.3")]
   [PluginDependency("HeuristicLab.Core", "3.3")]
