using System;
using System.Drawing;
using HeuristicLab.Core;
namespace HeuristicLab.Visualization
{
public partial class LineChart : ViewBase
{
private readonly IChartDataRowsModel model;
private Color[] lineColors;
///
/// This constructor shouldn't be called. Only required for the designer.
///
public LineChart()
{
InitializeComponent();
}
///
/// Initializes the chart.
///
/// Referenz to the model, for data
public LineChart(IChartDataRowsModel model) : this()
{
if (model == null)
{
throw new NullReferenceException("Model cannot be null.");
}
this.model = model;
//TODO: read line colors instead of static ones
lineColors = new Color[3];
lineColors[0] = Color.Red;
lineColors[1] = Color.Green;
lineColors[2] = Color.Blue;
//TODO: correct Rectangle to fit
RectangleD clientRectangle = new RectangleD(ClientRectangle.Left, ClientRectangle.Top, ClientRectangle.Right,
ClientRectangle.Bottom);
canvasUI1.MainCanvas.WorldShape = new WorldShape(clientRectangle, clientRectangle);
Reset();
}
///
/// Resets the line chart by deleting all shapes and reloading all data from the model.
///
private void Reset()
{
// TODO an neues model interface anpassen
throw new NotImplementedException();
// BeginUpdate();
//
// // TODO clear existing shapes
//
// WorldShape mainWorld = canvasUI1.MainCanvas.WorldShape;
//
// double spacing = mainWorld.BoundingBox.Width/model.Columns.Count;
// double oldX = 0;
// double currentX = spacing;
// ChartDataRowsModelColumn oldColumn = null;
// // reload data from the model and create shapes
// foreach (ChartDataRowsModelColumn column in model.Columns)
// {
// if (oldColumn != null)
// {
// if (column.Values != null)
// {
// for (int i = 0; i < column.Values.Length; i++)
// {
// LineShape line = new LineShape(oldX, oldColumn.Values[i], currentX, column.Values[i], 0, lineColors[i]);
// mainWorld.AddShape(line);
// }
// oldX = currentX;
// currentX += spacing;
// }
// oldColumn = column;
// }
// else
// {
// oldColumn = column;
// }
//
// canvasUI1.Invalidate();
//
// // AddColumn(column.ColumnId, column.Values);
// }
//
// EndUpdate();
}
///
/// Event handler which gets called when data in the model changes.
///
/// Type of change
/// Id of the changed column
/// Values contained within the changed column
private void OnDataChanged(ChangeType type, long columnId, double[] values)
{
switch (type)
{
case ChangeType.Add:
AddColumn(columnId, values);
break;
case ChangeType.Modify:
ModifyColumn(columnId, values);
break;
case ChangeType.Remove:
RemoveColumn(columnId);
break;
default:
throw new ArgumentOutOfRangeException("type");
}
}
///
/// Adds a new column to the chart.
///
/// Id of the column
/// Values of the column
private void AddColumn(long columnId, double[] values)
{
throw new NotImplementedException();
}
///
/// Modifies an existing column of the chart.
///
/// Id of the column
/// Values of the column
private void ModifyColumn(long columnId, double[] values)
{
throw new NotImplementedException();
}
///
/// Removes a column from the chart.
///
/// Id of the column
private void RemoveColumn(long columnId)
{
throw new NotImplementedException();
}
#region Add-/RemoveItemEvents
protected override void AddItemEvents()
{
// TODO an neues model interface anpassen
throw new NotImplementedException();
// base.AddItemEvents();
// model.ColumnChanged += OnDataChanged;
}
protected override void RemoveItemEvents()
{
// TODO an neues model interface anpassen
throw new NotImplementedException();
// base.RemoveItemEvents();
// model.ColumnChanged -= OnDataChanged;
}
#endregion
#region Begin-/EndUpdate
private int beginUpdateCount = 0;
public void BeginUpdate()
{
beginUpdateCount++;
}
public void EndUpdate()
{
if (beginUpdateCount == 0)
{
throw new InvalidOperationException("Too many EndUpdates.");
}
beginUpdateCount--;
if (beginUpdateCount == 0)
{
Invalidate();
}
}
#endregion
}
}