Free cookie consent management tool by TermsFeed Policy Generator

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

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

x-axis grid can be enabled/disabled #629

File size: 7.4 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Globalization;
4using System.Xml;
5using HeuristicLab.Core;
6using System.Text;
7using HeuristicLab.Visualization.LabelProvider;
8using HeuristicLab.Visualization.Options;
9
10namespace HeuristicLab.Visualization{
11  public delegate void DataRowAddedHandler(IDataRow row);
12  public delegate void DataRowRemovedHandler(IDataRow row);
13  public delegate void ModelChangedHandler();
14
15  public class ChartDataRowsModel : ChartDataModelBase, IChartDataRowsModel{
16    private string title = "Title";
17    private string xAxisLabel = "";
18    private bool showXAxisLabel = true;
19    private bool showXAxisGrid = true;
20    private ILabelProvider labelProvider = new ContinuousLabelProvider("0.##");
21
22    private ViewSettings viewSettings = new ViewSettings();
23
24    public bool ShowXAxisGrid {
25      get { return showXAxisGrid; }
26      set {
27        this.showXAxisGrid = value;
28        OnModelChanged();
29      }
30    }
31
32    public ILabelProvider XAxisLabelProvider {
33      get { return labelProvider; }
34      set{
35        this.labelProvider = value;
36        OnModelChanged();
37      }
38    }
39
40    public List<YAxisDescriptor> YAxes {
41      get {
42        Dictionary<YAxisDescriptor, object> yaxes = new Dictionary<YAxisDescriptor, object>();
43
44        foreach (IDataRow row in rows) {
45          yaxes[row.YAxis] = null;
46        }
47
48        return new List<YAxisDescriptor>(yaxes.Keys);
49      }
50    }
51
52
53    private readonly List<IDataRow> rows = new List<IDataRow>();
54    //private readonly List<string> xLabels = new List<string>();
55
56    //public List<string> XLabels{
57    //  get { return xLabels; }
58    //}
59
60    public List<IDataRow> Rows{
61      get { return rows; }
62    }
63
64    public string Title {
65      get { return title; }
66      set {
67        title = value;
68        OnModelChanged();
69      }
70    }
71
72    public string XAxisLabel {
73      get { return xAxisLabel; }
74      set {
75        xAxisLabel = value;
76        OnModelChanged();
77      }
78    }
79
80    public bool ShowXAxisLabel {
81      get { return showXAxisLabel; }
82      set {
83        showXAxisLabel = value;
84        OnModelChanged();
85      }
86    }
87
88    public override IView CreateView() {
89      return new LineChart(this);
90    }
91
92    //public void AddLabel(string label) {
93    //  xLabels.Add(label);
94    //  OnModelChanged();
95    //}
96
97    //public void AddLabel(string label, int index) {
98    //  xLabels[index] = label;
99    //  OnModelChanged();
100    //}
101
102    //public void AddLabels(string[] labels) {
103    //  foreach (var s in labels){
104    //    AddLabel(s);
105    //  }
106    //  //OnModelChanged();
107    //}
108
109    //public void AddLabels(string[] labels, int index) {
110    //  int i = 0;
111    //  foreach (var s in labels){
112    //    AddLabel(s, index + i);
113    //    i++;
114    //  }
115    //  //OnModelChanged();
116    //}
117
118    //public void ModifyLabel(string label, int index) {
119    //  xLabels[index] = label;
120    //  OnModelChanged();
121    //}
122
123    //public void ModifyLabels(string[] labels, int index) {
124    //  int i = 0;
125    //  foreach (var s in labels){
126    //    ModifyLabel(s, index + i);
127    //    i++;
128    //  }
129    //  //OnModelChanged();
130    //}
131
132    //public void RemoveLabel(int index) {
133    //  xLabels.RemoveAt(index);
134    //  OnModelChanged();
135    //}
136
137    //public void RemoveLabels(int index, int count) {
138    //  for (int i = index; i < index + count; i++ ){
139    //    RemoveLabel(i);
140    //  }
141    //  //OnModelChanged();
142    //}
143
144    private readonly YAxisDescriptor defaultYAxisDescriptor = new YAxisDescriptor();
145
146    public void AddDataRow(IDataRow row) {
147      if (row.YAxis == null) {
148        row.YAxis = defaultYAxisDescriptor;
149      }
150      rows.Add(row);
151      OnDataRowAdded(row);
152    }
153
154    public void RemoveDataRow(IDataRow row) {
155      rows.Remove(row);
156      OnDataRowRemoved(row);
157    }
158
159    public YAxisDescriptor DefaultYAxis {
160      get { return defaultYAxisDescriptor; }
161    }
162
163    // TODO implement calculation of max data row values
164    public int MaxDataRowValues {
165      get {
166        int max = 0;
167
168        foreach (IDataRow row in rows) {
169          max = Math.Max(max, row.Count);
170        }
171
172        return max;
173      }
174    }
175
176    public ViewSettings ViewSettings {
177      get { return viewSettings; }
178      set { viewSettings = value; }
179    }
180
181    public event ModelChangedHandler ModelChanged;
182
183    protected void OnModelChanged() {
184      if (ModelChanged != null) {
185        ModelChanged();
186      }
187    }
188
189    public event DataRowAddedHandler DataRowAdded;
190
191    protected void OnDataRowAdded(IDataRow row) {
192      if (DataRowAdded != null) {
193        DataRowAdded(row);
194      }
195    }
196
197    public event DataRowRemovedHandler DataRowRemoved;
198
199    protected void OnDataRowRemoved(IDataRow row) {
200      if (DataRowRemoved != null) {
201        DataRowRemoved(row);
202      }
203    }
204
205    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
206      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
207
208      foreach (IDataRow row in rows) {
209        XmlNode columnElement = document.CreateNode(XmlNodeType.Element, "row", null);
210
211        XmlAttribute idAttr = document.CreateAttribute("label");
212        idAttr.Value = row.Label;
213        columnElement.Attributes.Append(idAttr);
214
215        StringBuilder builder = new StringBuilder();
216
217        for (int i = 0; i < row.Count; i++) {
218          if (i == 0) {
219            builder.Append(row[i].ToString(CultureInfo.InvariantCulture.NumberFormat));
220            //columnElement.InnerText += row[i].ToString(CultureInfo.InvariantCulture.NumberFormat);
221          } else {
222            builder.Append(";" + row[i].ToString(CultureInfo.InvariantCulture.NumberFormat));
223            //columnElement.InnerText += ";" + row[i].ToString(CultureInfo.InvariantCulture.NumberFormat);
224          }
225        }
226        columnElement.InnerText += builder.ToString();
227        node.AppendChild(columnElement);
228      }
229
230      XmlNode labelProviderNode = document.ImportNode(labelProvider.GetLabelProviderXmlNode(), true);
231      node.AppendChild(labelProviderNode);
232
233      return node;   
234    }
235
236    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
237      base.Populate(node, restoredObjects);
238
239      foreach (XmlNode dataRow in node.ChildNodes) {
240        if (dataRow.Name.Equals("LabelProvider")) {
241          labelProvider = labelProvider.PopulateLabelProviderXmlNode(dataRow);
242        } else {
243          XmlAttributeCollection attrs = dataRow.Attributes;
244          XmlAttribute rowIdAttr = (XmlAttribute)attrs.GetNamedItem("label");
245          string rowLabel = rowIdAttr.Value;
246          DataRow row = new DataRow();
247          row.Label = rowLabel;
248
249          string[] tokens = dataRow.InnerText.Split(';');
250          double[] data = new double[tokens.Length];
251          for (int i = 0; i < data.Length; i++) {
252            if (tokens[i].Length != 0) {
253              if (
254                double.TryParse(tokens[i], NumberStyles.Float, CultureInfo.InvariantCulture.NumberFormat, out data[i]) ==
255                false) {
256                throw new FormatException("Can't parse " + tokens[i] + " as double value.");
257              }
258            }
259          }
260          row.AddValues(data);
261          AddDataRow(row);
262        }
263      }
264    }
265  }
266}
Note: See TracBrowser for help on using the repository browser.