Free cookie consent management tool by TermsFeed Policy Generator

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

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

added IChartDataRowsModel.AddDataRows method #498

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