Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Visualization/3.2/ChartDataRowsModel.cs @ 1881

Last change on this file since 1881 was 1881, checked in by mstoeger, 15 years ago

renamed xaxis-properties #498

File size: 5.4 KB
RevLine 
[680]1using System;
2using System.Collections.Generic;
[864]3using System.Globalization;
[726]4using System.Xml;
5using HeuristicLab.Core;
[1061]6using System.Text;
[1341]7using HeuristicLab.Visualization.Options;
[680]8
[685]9namespace 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
[1881]146      XmlNode labelProviderNode = document.ImportNode(XAxis.LabelProvider.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")) {
[1881]157          XAxis.LabelProvider = XAxis.LabelProvider.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}
Note: See TracBrowser for help on using the repository browser.