#region License Information
/* HeuristicLab
* Copyright (C) 2002-2015 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.Generic;
using System.Linq;
using HeuristicLab.Collections;
using HeuristicLab.Core;
using HeuristicLab.Core.Networks;
using HeuristicLab.Core.Networks.Views;
using HeuristicLab.MainForm;
using HeuristicLab.Networks.Views.NetworkVisualization.Views.ChartModes;
using HeuristicLab.Visualization;
using HeuristicLab.Visualization.ChartModes;
namespace HeuristicLab.Networks.Views.NetworkVisualization.Views {
[View("Network Visualization View")]
[Content(typeof(Network), false)]
[Content(typeof(INetwork), false)]
public partial class NetworkVisualizationView : NetworkItemView {
private Dictionary primitiveDict = new Dictionary();
public new INetwork Content {
get { return (INetwork)base.Content; }
set { base.Content = value; }
}
public NetworkVisualizationView() {
InitializeComponent();
var selectMode = new SelectChartMode(chartControl);
selectMode.SelectedPrimitivesChanged += SelectMode_SelectedPrimitivesChanged;
chartControl.AddChartModes(
selectMode,
new PanChartMode(chartControl),
new RulerChartMode(chartControl),
new ZoomInChartMode(chartControl),
new ZoomOutChartMode(chartControl),
new AddNodesChartMode(chartControl),
new AddPortsChartMode(chartControl),
new ConnectPortsChartMode(chartControl)
);
chartControl.Mode = selectMode;
}
protected override void OnContentChanged() {
base.OnContentChanged();
UpdateContent();
chartControl.Tag = Content;
}
protected override void RegisterContentEvents() {
base.RegisterContentEvents();
Content.Nodes.ItemsAdded += Nodes_ItemsAdded;
Content.Nodes.ItemsRemoved += Nodes_ItemsRemoved;
Content.Nodes.ItemsReplaced += Nodes_ItemsReplaced;
Content.Ports.ItemsAdded += Ports_ItemsAdded;
Content.Ports.ItemsRemoved += Ports_ItemsRemoved;
Content.Ports.ItemsReplaced += Ports_ItemsReplaced;
}
protected override void DeregisterContentEvents() {
Content.Nodes.ItemsAdded -= Nodes_ItemsAdded;
Content.Nodes.ItemsRemoved -= Nodes_ItemsRemoved;
Content.Nodes.ItemsReplaced -= Nodes_ItemsReplaced;
Content.Ports.ItemsAdded -= Ports_ItemsAdded;
Content.Ports.ItemsRemoved -= Ports_ItemsRemoved;
Content.Ports.ItemsReplaced -= Ports_ItemsReplaced;
base.DeregisterContentEvents();
}
#region Event Handlers
private void SelectMode_SelectedPrimitivesChanged(object sender, EventArgs e) {
var selectedPrimitives = chartControl.Chart.Group.SelectedPrimitives;
var nodePrimitive = selectedPrimitives.OfType().SingleOrDefault();
viewHost.Content = nodePrimitive != null ? nodePrimitive.NetworkItem : null;
}
#region Nodes Event Handlers
private void Nodes_ItemsAdded(object sender, CollectionItemsChangedEventArgs e) {
// TODO: don't update everything
UpdateContent();
}
private void Nodes_ItemsRemoved(object sender, CollectionItemsChangedEventArgs e) {
// TODO: don't update everything
UpdateContent();
}
private void Nodes_ItemsReplaced(object sender, CollectionItemsChangedEventArgs e) {
// TODO: don't update everything
UpdateContent();
}
#endregion
#region Ports Event Handlers
private void Ports_ItemsAdded(object sender, CollectionItemsChangedEventArgs e) { }
private void Ports_ItemsRemoved(object sender, CollectionItemsChangedEventArgs e) { }
private void Ports_ItemsReplaced(object sender, CollectionItemsChangedEventArgs e) { }
#endregion
private void detailsToggleButton_Click(object sender, EventArgs e) {
splitContainer.Panel2Collapsed = !splitContainer.Panel2Collapsed;
detailsToggleButton.Text = splitContainer.Panel2Collapsed ? "<" : ">";
}
#endregion
#region Helpers
private void UpdateContent() {
if (Content == null) return;
chartControl.SuspendRendering();
try {
chartControl.Chart.Group.Clear();
DrawNodes(Content.Nodes);
ConnectNodes(Content.Nodes);
} finally {
chartControl.ResumeRendering();
}
}
private void DrawNodes(IKeyedItemCollection nodes) {
foreach (var node in nodes) {
var defaultPrimitive = PrimitiveAttribute.CreateDefaultPrimitive(node.GetType(), chartControl.Chart, node);
if (defaultPrimitive == null) continue;
chartControl.Chart.Group.Add(defaultPrimitive);
primitiveDict[node.Name] = defaultPrimitive;
}
}
private void ConnectNodes(IKeyedItemCollection nodes) {
var chart = chartControl.Chart;
foreach (var node in nodes) {
var nodeRectangle = primitiveDict[node.Name] as NodeRectangle;
if (nodeRectangle == null) continue;
foreach (var port in node.Ports.OfType()) {
var connectedPort = port.ConnectedPort as IConnectablePort;
if (connectedPort == null) continue;
var connectedNode = connectedPort.Parent;
if (connectedNode == null) continue;
var connectedRectangle = primitiveDict[connectedNode.Name] as NodeRectangle;
if (connectedRectangle == null) continue;
var leftPortRectangle = (PortRectangle)nodeRectangle.GetPortPrimitive(port);
var rightPortRectangle = (PortRectangle)connectedRectangle.GetPortPrimitive(connectedPort);
var connectionShape = new ConnectionLine(chart, leftPortRectangle, rightPortRectangle);
chart.Group.Add(connectionShape);
}
}
}
#endregion
}
}