#region License Information /* HeuristicLab * Copyright (C) 2002-2008 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 . */ #endregion using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using HeuristicLab.PluginInfrastructure; using HeuristicLab.Core; using HeuristicLab.PluginInfrastructure.Manager; namespace HeuristicLab.OptimizationFrontend { public partial class AvailableOperatorsForm : Form { #region Inner Class TreeNodeSorter private class TreeNodeSorter : IComparer { public int Compare(object x, object y) { TreeNode tx = x as TreeNode; TreeNode ty = y as TreeNode; int result = string.Compare(tx.Text, ty.Text); if (result == 0) result = tx.Index.CompareTo(ty.Index); return result; } } #endregion private IOperatorLibrary operatorLibrary; public AvailableOperatorsForm() { InitializeComponent(); operatorLibrary = null; TreeNodeSorter nodeSorter = new TreeNodeSorter(); operatorLibraryOperatorsTreeView.TreeViewNodeSorter = nodeSorter; builtinOperatorsTreeView.TreeViewNodeSorter = nodeSorter; foreach(PluginDescription plugin in ApplicationManager.Manager.Plugins) { TreeNode pluginItem = new TreeNode(); pluginItem.Text = plugin.Name; pluginItem.Tag = plugin; Type[] operators = ApplicationManager.Manager.GetTypes(typeof(IOperator), plugin).ToArray(); foreach(Type type in operators) { if(!type.IsAbstract) { TreeNode operatorItem = new TreeNode(); operatorItem.Text = type.Name; operatorItem.Tag = type; pluginItem.Nodes.Add(operatorItem); } } // add plugin node only if it contains operators if(pluginItem.Nodes.Count > 0) { builtinOperatorsTreeView.Nodes.Add(pluginItem); } } if (builtinOperatorsTreeView.Nodes.Count == 0) { builtinOperatorsTreeView.Enabled = false; builtinOperatorsTreeView.Nodes.Add("No operators available"); } builtinOperatorsTreeView.Sort(); } private void UpdateOperatorsTreeView() { operatorLibraryOperatorsTreeView.Nodes.Clear(); operatorLibraryOperatorsTreeView.Nodes.Add(CreateTreeNode(operatorLibrary.Group)); operatorLibraryOperatorsTreeView.Sort(); } private TreeNode CreateTreeNode(IOperatorGroup group) { TreeNode node = new TreeNode(); node.Text = group.Name; node.ForeColor = Color.LightGray; node.Tag = group; foreach (IOperator op in group.Operators) node.Nodes.Add(CreateTreeNode(op)); foreach (IOperatorGroup subGroup in group.SubGroups) node.Nodes.Add(CreateTreeNode(subGroup)); return node; } private TreeNode CreateTreeNode(IOperator op) { TreeNode node = new TreeNode(); node.Text = op.Name; node.ToolTipText = op.GetType().Name; node.Tag = op; return node; } #region Selection Events private void operatorsTreeView_AfterSelect(object sender, TreeViewEventArgs e) { operatorLibraryOperatorsDescriptionTextBox.Text = ""; if ((operatorLibraryOperatorsTreeView.SelectedNode != null) && (operatorLibraryOperatorsTreeView.SelectedNode.Tag is IOperator)) operatorLibraryOperatorsDescriptionTextBox.Text = ((IOperator)operatorLibraryOperatorsTreeView.SelectedNode.Tag).Description; } private void builtinOperatorsTreeView_AfterSelect(object sender, TreeViewEventArgs e) { builtinOperatorsDescriptionTextBox.Text = ""; if ((builtinOperatorsTreeView.SelectedNode != null) && (builtinOperatorsTreeView.SelectedNode.Tag is Type)) builtinOperatorsDescriptionTextBox.Text = ((IOperator)Activator.CreateInstance((Type)builtinOperatorsTreeView.SelectedNode.Tag)).Description; } #endregion #region Click Events private void loadButton_Click(object sender, EventArgs e) { if (openFileDialog.ShowDialog(this) == DialogResult.OK) { operatorLibrary = (IOperatorLibrary)PersistenceManager.Load(openFileDialog.FileName); operatorLibraryTextBox.Text = openFileDialog.FileName; toolTip.SetToolTip(operatorLibraryTextBox, openFileDialog.FileName); operatorLibraryOperatorsGroupBox.Enabled = true; UpdateOperatorsTreeView(); } } private void closeButton_Click(object sender, EventArgs e) { this.Close(); } #endregion #region Drag and Drop Events private void operatorLibraryOperatorsTreeView_ItemDrag(object sender, ItemDragEventArgs e) { TreeNode node = e.Item as TreeNode; if ((node != null) && (node.Tag is IOperator)) { IOperator op = (IOperator)node.Tag; op = (IOperator)op.Clone(); DataObject data = new DataObject(); data.SetData("IOperator", op); data.SetData("DragSource", operatorLibraryOperatorsTreeView); DoDragDrop(data, DragDropEffects.Copy); } } private void builtinOperatorsTreeView_ItemDrag(object sender, ItemDragEventArgs e) { TreeNode node = e.Item as TreeNode; if ((node != null) && (node.Tag is Type)) { IOperator op = (IOperator)Activator.CreateInstance((Type)node.Tag); DataObject data = new DataObject(); data.SetData("IOperator", op); data.SetData("DragSource", builtinOperatorsTreeView); DoDragDrop(data, DragDropEffects.Copy); } } #endregion } }