using System; using System.Collections.Generic; using System.Globalization; using System.Xml; using HeuristicLab.Core; using System.Text; namespace HeuristicLab.Visualization{ public delegate void DataRowAddedHandler(IDataRow row); public delegate void DataRowRemovedHandler(IDataRow row); public delegate void ModelChangedHandler(); public class ChartDataRowsModel : ChartDataModelBase, IChartDataRowsModel{ private string title; private string xAxisLabel; private readonly List rows = new List(); private readonly List xLabels = new List(); public List XLabels{ get { return xLabels; } } public List Rows{ get { return rows; } } public string Title { get { return title; } set { title = value; OnModelChanged(); } } public string XAxisLabel { get { return xAxisLabel; } set { xAxisLabel = value; OnModelChanged(); } } public override IView CreateView() { return new LineChart(this); } public void AddLabel(string label) { xLabels.Add(label); OnModelChanged(); } public void AddLabel(string label, int index) { xLabels[index] = label; OnModelChanged(); } public void AddLabels(string[] labels) { foreach (var s in labels){ AddLabel(s); } //OnModelChanged(); } public void AddLabels(string[] labels, int index) { int i = 0; foreach (var s in labels){ AddLabel(s, index + i); i++; } //OnModelChanged(); } public void ModifyLabel(string label, int index) { xLabels[index] = label; OnModelChanged(); } public void ModifyLabels(string[] labels, int index) { int i = 0; foreach (var s in labels){ ModifyLabel(s, index + i); i++; } //OnModelChanged(); } public void RemoveLabel(int index) { xLabels.RemoveAt(index); OnModelChanged(); } public void RemoveLabels(int index, int count) { for (int i = index; i < index + count; i++ ){ RemoveLabel(i); } //OnModelChanged(); } public void AddDataRow(IDataRow row) { rows.Add(row); OnDataRowAdded(row); } public void RemoveDataRow(IDataRow row) { rows.Remove(row); OnDataRowRemoved(row); } public event ModelChangedHandler ModelChanged; protected void OnModelChanged() { if (ModelChanged != null) { ModelChanged(); } } public event DataRowAddedHandler DataRowAdded; protected void OnDataRowAdded(IDataRow row) { if (DataRowAdded != null) { DataRowAdded(row); } } public event DataRowRemovedHandler DataRowRemoved; protected void OnDataRowRemoved(IDataRow row) { if (DataRowRemoved != null) { DataRowRemoved(row); } } public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary persistedObjects) { XmlNode node = base.GetXmlNode(name, document, persistedObjects); foreach (var row in rows) { XmlNode columnElement = document.CreateNode(XmlNodeType.Element, "row", null); XmlAttribute idAttr = document.CreateAttribute("label"); idAttr.Value = row.Label.ToString(); columnElement.Attributes.Append(idAttr); StringBuilder builder = new StringBuilder(); for (int i = 0; i < row.Count; i++) { if (i == 0) { builder.Append(row[i].ToString(CultureInfo.InvariantCulture.NumberFormat)); //columnElement.InnerText += row[i].ToString(CultureInfo.InvariantCulture.NumberFormat); } else { builder.Append(";" + row[i].ToString(CultureInfo.InvariantCulture.NumberFormat)); //columnElement.InnerText += ";" + row[i].ToString(CultureInfo.InvariantCulture.NumberFormat); } } columnElement.InnerText += builder.ToString(); node.AppendChild(columnElement); } return node; } public override void Populate(XmlNode node, IDictionary restoredObjects) { base.Populate(node, restoredObjects); foreach (XmlNode dataRow in node.ChildNodes) { XmlAttributeCollection attrs = dataRow.Attributes; XmlAttribute rowIdAttr = (XmlAttribute)attrs.GetNamedItem("label"); string rowLabel = rowIdAttr.Value; DataRow row = new DataRow(); row.Label = rowLabel; string[] tokens = dataRow.InnerText.Split(';'); double[] data = new double[tokens.Length]; for (int i = 0; i < data.Length; i++) { if (tokens[i].Length != 0) { if ( double.TryParse(tokens[i], NumberStyles.Float, CultureInfo.InvariantCulture.NumberFormat, out data[i]) == false) { throw new FormatException("Can't parse " + tokens[i] + " as double value."); } } } row.AddValues(data); AddDataRow(row); } } } }