[680] | 1 | using System;
|
---|
| 2 | using System.Collections.Generic;
|
---|
[864] | 3 | using System.Globalization;
|
---|
[726] | 4 | using System.Xml;
|
---|
| 5 | using HeuristicLab.Core;
|
---|
[1061] | 6 | using System.Text;
|
---|
[1341] | 7 | using HeuristicLab.Visualization.Options;
|
---|
[680] | 8 |
|
---|
[685] | 9 | namespace HeuristicLab.Visualization{
|
---|
[761] | 10 | public delegate void DataRowAddedHandler(IDataRow row);
|
---|
| 11 | public delegate void DataRowRemovedHandler(IDataRow row);
|
---|
| 12 | public delegate void ModelChangedHandler();
|
---|
[685] | 13 |
|
---|
[859] | 14 | public class ChartDataRowsModel : ChartDataModelBase, IChartDataRowsModel{
|
---|
[1182] | 15 | private string title = "Title";
|
---|
[726] | 16 |
|
---|
[1341] | 17 | private ViewSettings viewSettings = new ViewSettings();
|
---|
| 18 |
|
---|
[1880] | 19 | private readonly XAxisDescriptor xAxisDescriptor = new XAxisDescriptor();
|
---|
| 20 |
|
---|
| 21 | public ChartDataRowsModel() {
|
---|
| 22 | this.XAxis.XAxisDescriptorChanged += delegate { OnModelChanged(); };
|
---|
[1876] | 23 | }
|
---|
| 24 |
|
---|
[1880] | 25 | public XAxisDescriptor XAxis {
|
---|
| 26 | get { return xAxisDescriptor; }
|
---|
[1190] | 27 | }
|
---|
| 28 |
|
---|
[1350] | 29 | public List<YAxisDescriptor> YAxes {
|
---|
| 30 | get {
|
---|
| 31 | Dictionary<YAxisDescriptor, object> yaxes = new Dictionary<YAxisDescriptor, object>();
|
---|
[1190] | 32 |
|
---|
[1350] | 33 | foreach (IDataRow row in rows) {
|
---|
| 34 | yaxes[row.YAxis] = null;
|
---|
| 35 | }
|
---|
| 36 |
|
---|
| 37 | return new List<YAxisDescriptor>(yaxes.Keys);
|
---|
| 38 | }
|
---|
| 39 | }
|
---|
| 40 |
|
---|
| 41 |
|
---|
[859] | 42 | private readonly List<IDataRow> rows = new List<IDataRow>();
|
---|
[726] | 43 |
|
---|
[859] | 44 | public List<IDataRow> Rows{
|
---|
| 45 | get { return rows; }
|
---|
[761] | 46 | }
|
---|
[685] | 47 |
|
---|
[761] | 48 | public string Title {
|
---|
| 49 | get { return title; }
|
---|
| 50 | set {
|
---|
| 51 | title = value;
|
---|
| 52 | OnModelChanged();
|
---|
[728] | 53 | }
|
---|
[761] | 54 | }
|
---|
[685] | 55 |
|
---|
[859] | 56 | public override IView CreateView() {
|
---|
| 57 | return new LineChart(this);
|
---|
| 58 | }
|
---|
| 59 |
|
---|
[1350] | 60 | private readonly YAxisDescriptor defaultYAxisDescriptor = new YAxisDescriptor();
|
---|
| 61 |
|
---|
[761] | 62 | public void AddDataRow(IDataRow row) {
|
---|
[1350] | 63 | if (row.YAxis == null) {
|
---|
| 64 | row.YAxis = defaultYAxisDescriptor;
|
---|
| 65 | }
|
---|
[761] | 66 | rows.Add(row);
|
---|
| 67 | OnDataRowAdded(row);
|
---|
[697] | 68 | }
|
---|
[726] | 69 |
|
---|
[761] | 70 | public void RemoveDataRow(IDataRow row) {
|
---|
| 71 | rows.Remove(row);
|
---|
| 72 | OnDataRowRemoved(row);
|
---|
| 73 | }
|
---|
[726] | 74 |
|
---|
[1387] | 75 | public YAxisDescriptor DefaultYAxis {
|
---|
| 76 | get { return defaultYAxisDescriptor; }
|
---|
| 77 | }
|
---|
| 78 |
|
---|
[1285] | 79 | // TODO implement calculation of max data row values
|
---|
| 80 | public int MaxDataRowValues {
|
---|
| 81 | get {
|
---|
| 82 | int max = 0;
|
---|
| 83 |
|
---|
| 84 | foreach (IDataRow row in rows) {
|
---|
| 85 | max = Math.Max(max, row.Count);
|
---|
| 86 | }
|
---|
| 87 |
|
---|
| 88 | return max;
|
---|
| 89 | }
|
---|
| 90 | }
|
---|
| 91 |
|
---|
[1341] | 92 | public ViewSettings ViewSettings {
|
---|
| 93 | get { return viewSettings; }
|
---|
| 94 | set { viewSettings = value; }
|
---|
| 95 | }
|
---|
| 96 |
|
---|
[859] | 97 | public event ModelChangedHandler ModelChanged;
|
---|
| 98 |
|
---|
| 99 | protected void OnModelChanged() {
|
---|
| 100 | if (ModelChanged != null) {
|
---|
| 101 | ModelChanged();
|
---|
| 102 | }
|
---|
| 103 | }
|
---|
| 104 |
|
---|
[761] | 105 | public event DataRowAddedHandler DataRowAdded;
|
---|
[726] | 106 |
|
---|
[761] | 107 | protected void OnDataRowAdded(IDataRow row) {
|
---|
| 108 | if (DataRowAdded != null) {
|
---|
| 109 | DataRowAdded(row);
|
---|
| 110 | }
|
---|
| 111 | }
|
---|
[726] | 112 |
|
---|
[761] | 113 | public event DataRowRemovedHandler DataRowRemoved;
|
---|
[727] | 114 |
|
---|
[761] | 115 | protected void OnDataRowRemoved(IDataRow row) {
|
---|
| 116 | if (DataRowRemoved != null) {
|
---|
| 117 | DataRowRemoved(row);
|
---|
[726] | 118 | }
|
---|
[761] | 119 | }
|
---|
[726] | 120 |
|
---|
[761] | 121 | public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
|
---|
[979] | 122 | XmlNode node = base.GetXmlNode(name, document, persistedObjects);
|
---|
| 123 |
|
---|
[1194] | 124 | foreach (IDataRow row in rows) {
|
---|
[979] | 125 | XmlNode columnElement = document.CreateNode(XmlNodeType.Element, "row", null);
|
---|
| 126 |
|
---|
| 127 | XmlAttribute idAttr = document.CreateAttribute("label");
|
---|
[1194] | 128 | idAttr.Value = row.Label;
|
---|
[979] | 129 | columnElement.Attributes.Append(idAttr);
|
---|
| 130 |
|
---|
[1061] | 131 | StringBuilder builder = new StringBuilder();
|
---|
| 132 |
|
---|
[979] | 133 | for (int i = 0; i < row.Count; i++) {
|
---|
| 134 | if (i == 0) {
|
---|
[1061] | 135 | builder.Append(row[i].ToString(CultureInfo.InvariantCulture.NumberFormat));
|
---|
| 136 | //columnElement.InnerText += row[i].ToString(CultureInfo.InvariantCulture.NumberFormat);
|
---|
[979] | 137 | } else {
|
---|
[1061] | 138 | builder.Append(";" + row[i].ToString(CultureInfo.InvariantCulture.NumberFormat));
|
---|
| 139 | //columnElement.InnerText += ";" + row[i].ToString(CultureInfo.InvariantCulture.NumberFormat);
|
---|
[979] | 140 | }
|
---|
| 141 | }
|
---|
[1061] | 142 | columnElement.InnerText += builder.ToString();
|
---|
[979] | 143 | node.AppendChild(columnElement);
|
---|
| 144 | }
|
---|
[1385] | 145 |
|
---|
[1880] | 146 | XmlNode labelProviderNode = document.ImportNode(XAxis.XAxisLabelProvider.GetLabelProviderXmlNode(), true);
|
---|
[1385] | 147 | node.AppendChild(labelProviderNode);
|
---|
| 148 |
|
---|
[979] | 149 | return node;
|
---|
[761] | 150 | }
|
---|
| 151 |
|
---|
[726] | 152 | public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
|
---|
[979] | 153 | base.Populate(node, restoredObjects);
|
---|
[731] | 154 |
|
---|
[979] | 155 | foreach (XmlNode dataRow in node.ChildNodes) {
|
---|
[1385] | 156 | if (dataRow.Name.Equals("LabelProvider")) {
|
---|
[1880] | 157 | XAxis.XAxisLabelProvider = XAxis.XAxisLabelProvider.PopulateLabelProviderXmlNode(dataRow);
|
---|
[1385] | 158 | } else {
|
---|
| 159 | XmlAttributeCollection attrs = dataRow.Attributes;
|
---|
| 160 | XmlAttribute rowIdAttr = (XmlAttribute)attrs.GetNamedItem("label");
|
---|
| 161 | string rowLabel = rowIdAttr.Value;
|
---|
| 162 | DataRow row = new DataRow();
|
---|
| 163 | row.Label = rowLabel;
|
---|
[979] | 164 |
|
---|
[1385] | 165 | string[] tokens = dataRow.InnerText.Split(';');
|
---|
| 166 | double[] data = new double[tokens.Length];
|
---|
| 167 | for (int i = 0; i < data.Length; i++) {
|
---|
| 168 | if (tokens[i].Length != 0) {
|
---|
| 169 | if (
|
---|
| 170 | double.TryParse(tokens[i], NumberStyles.Float, CultureInfo.InvariantCulture.NumberFormat, out data[i]) ==
|
---|
| 171 | false) {
|
---|
| 172 | throw new FormatException("Can't parse " + tokens[i] + " as double value.");
|
---|
| 173 | }
|
---|
[979] | 174 | }
|
---|
| 175 | }
|
---|
[1385] | 176 | row.AddValues(data);
|
---|
| 177 | AddDataRow(row);
|
---|
[979] | 178 | }
|
---|
| 179 | }
|
---|
[726] | 180 | }
|
---|
[680] | 181 | }
|
---|
[761] | 182 | }
|
---|