#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
}
}