#region License Information /* HeuristicLab * Copyright (C) 2002-2014 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 HeuristicLab.Common; using System; using System.Windows.Forms; namespace HeuristicLab.Core.Networks.Views { public partial class NetworkItemSelector : UserControl { protected Func networkItemCondition; protected INetworkItem root; public INetworkItem Root { get { return root; } } public string Caption { get { return networkItemsGroupBox.Text; } set { if (InvokeRequired) Invoke(new Action(s => { Caption = s; }), value); else networkItemsGroupBox.Text = value; } } public TreeView NetworkItemsTreeView { get { return networkItemsTreeView; } } protected INetworkItem selectedNetworkItem; public INetworkItem SelectedNetworkItem { get { return selectedNetworkItem; } protected set { if (selectedNetworkItem != value) { selectedNetworkItem = value; OnSelectedNetworkItemChanged(); } } } public NetworkItemSelector() { InitializeComponent(); root = null; networkItemCondition = null; selectedNetworkItem = null; } public virtual void Configure(INetworkItem root) { Configure(root, null, (e) => true); } public virtual void Configure(INetworkItem root, INetworkItem selectedNetworkItem) { Configure(root, selectedNetworkItem, (e) => true); } public virtual void Configure(INetworkItem root, INetworkItem selectedNetworkItem, Type networkItemType) { Configure(root, selectedNetworkItem, (e) => { return networkItemType.IsAssignableFrom(e.GetType()); }); } public virtual void Configure(INetworkItem root, INetworkItem selectedNetworkItem, Func networkItemCondition) { if (root == null) throw new ArgumentNullException("root"); if (networkItemCondition == null) throw new ArgumentNullException("networkItemCondition"); if (InvokeRequired) Invoke(new Action>(Configure), root, selectedNetworkItem, networkItemCondition); else { this.root = root; this.networkItemCondition = networkItemCondition; this.selectedNetworkItem = null; networkItemsTreeView.Nodes.Clear(); imageList.Images.Clear(); TreeNode selectedNode; var n = CreateTreeNode(Root, selectedNetworkItem, networkItemCondition, out selectedNode); if (n != null) networkItemsTreeView.Nodes.Add(n); if (selectedNode != null) { networkItemsTreeView.SelectedNode = selectedNode; selectedNode.EnsureVisible(); } } } public event EventHandler SelectedNetworkItemChanged; protected virtual void OnSelectedNetworkItemChanged() { var handler = SelectedNetworkItemChanged; if (handler != null) SelectedNetworkItemChanged(this, EventArgs.Empty); } #region Control Events protected virtual void networkItemsTreeView_AfterSelect(object sender, TreeViewEventArgs e) { if (networkItemsTreeView.SelectedNode == null) SelectedNetworkItem = null; else { var selected = (INetworkItem)networkItemsTreeView.SelectedNode.Tag; SelectedNetworkItem = ((networkItemCondition != null) && !networkItemCondition(selected)) ? null : selected; } } #endregion #region Helpers protected virtual TreeNode CreateTreeNode(INetworkItem networkItem, INetworkItem selectedNetworkItem, Func networkItemCondition, out TreeNode selectedNode) { selectedNode = null; if (networkItem == null) return null; TreeNode node = new TreeNode(networkItem.Name); node.Tag = networkItem; foreach (var child in networkItem.Children) { TreeNode selected; var n = CreateTreeNode(child, selectedNetworkItem, networkItemCondition, out selected); if (n != null) { node.Nodes.Add(n); if (selected != null) selectedNode = selected; } } if (!networkItemCondition(networkItem) && (node.Nodes.Count == 0)) return null; imageList.Images.Add(networkItem.ItemImage); node.ImageIndex = imageList.Images.Count - 1; node.SelectedImageIndex = node.ImageIndex; node.ToolTipText = networkItem.GetType().GetPrettyName(); if (networkItem == selectedNetworkItem) selectedNode = node; return node; } #endregion } }