Free cookie consent management tool by TermsFeed Policy Generator

source: branches/2719_HeuristicLab.DatastreamAnalysis/HeuristicLab.DatastreamAnalysis/3.4/ExtendedDataTable.cs @ 18242

Last change on this file since 18242 was 17980, checked in by jzenisek, 3 years ago

#2719 merged head of HeuristicLab.Problems.DataAnalysis into branch; added several minor items

File size: 14.1 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20 #endregion
21
22using System;
23using System.Collections.Generic;
24using System.ComponentModel;
25using System.Linq;
26using System.Drawing;
27using HeuristicLab.Common;
28using HeuristicLab.Core;
29using HeuristicLab.Data;
30using HeuristicLab.Analysis;
31using HeuristicLab.Collections;
32using HEAL.Attic;
33
34namespace HeuristicLab.DatastreamAnalysis {
35  /// <summary>
36  /// A table of data values or intervals.
37  /// </summary>
38  [Item("ExtendedDataTable", "A data table where the points are either double values or ranges")]
39  [StorableType("8E716B16-5B9C-441D-97BB-8C362E8D5BC4")]
40  public class ExtendedDataTable : NamedItem, IStringConvertibleMatrix, IContent {
41    public static new Image StaticItemImage {
42      get { return HeuristicLab.Common.Resources.VSImageLibrary.Performance; }
43    }
44
45    private DataTableVisualProperties visualProperties;
46    public DataTableVisualProperties VisualProperties {
47      get { return visualProperties; }
48      set {
49        if (visualProperties != value) {
50          if (value == null) throw new ArgumentNullException("VisualProperties");
51          if (visualProperties != null) visualProperties.PropertyChanged -= new PropertyChangedEventHandler(VisualProperties_PropertyChanged);
52          visualProperties = value;
53          visualProperties.PropertyChanged += new PropertyChangedEventHandler(VisualProperties_PropertyChanged);
54          OnVisualPropertiesChanged();
55        }
56      }
57    }
58
59    private NamedItemCollection<RangeDataRow> rows;
60    public NamedItemCollection<RangeDataRow> Rows {
61      get { return rows; }
62      private set {
63        if (rows != null) throw new InvalidOperationException("Rows already set.");
64        rows = value;
65        if (rows != null) RegisterRowsEvents();
66      }
67    }
68
69    #region Persistence Properties
70    [Storable(Name = "VisualProperties")]
71    private DataTableVisualProperties StorableVisualProperties {
72      get { return visualProperties; }
73      set {
74        visualProperties = value;
75        visualProperties.PropertyChanged += new PropertyChangedEventHandler(VisualProperties_PropertyChanged);
76      }
77    }
78    [Storable(Name = "rows")]
79    private IEnumerable<RangeDataRow> StorableRows {
80      get { return rows; }
81      set { rows = new NamedItemCollection<RangeDataRow>(value); }
82    }
83    #endregion
84
85    #region constructors, cloner,...
86    [StorableConstructor]
87    protected ExtendedDataTable(StorableConstructorFlag _) : base(_) { }
88    protected ExtendedDataTable(ExtendedDataTable original, Cloner cloner) : base(original, cloner) {
89      VisualProperties = (DataTableVisualProperties)cloner.Clone(original.visualProperties);
90      rows = cloner.Clone(original.rows);
91      this.RegisterRowsEvents();
92    }
93    public ExtendedDataTable() : base() {
94      Name = "ExtendedDataTable";
95      VisualProperties = new DataTableVisualProperties();
96      rows = new NamedItemCollection<RangeDataRow>();
97      this.RegisterRowsEvents();
98    }
99    public ExtendedDataTable(string name) : base(name) {
100      VisualProperties = new DataTableVisualProperties();
101      rows = new NamedItemCollection<RangeDataRow>();
102      this.RegisterRowsEvents();
103    }
104    public ExtendedDataTable(string name, string description) : base(name, description) {
105      VisualProperties = new DataTableVisualProperties();
106      rows = new NamedItemCollection<RangeDataRow>();
107      this.RegisterRowsEvents();
108    }
109
110    public override IDeepCloneable Clone(Cloner cloner) {
111      return new ExtendedDataTable(this, cloner);
112    }
113    #endregion constructors, cloner,...
114
115    #region events
116    public event EventHandler VisualPropertiesChanged;
117    protected virtual void OnVisualPropertiesChanged() {
118      var handler = VisualPropertiesChanged;
119      if (handler != null) handler(this, EventArgs.Empty);
120    }
121
122    private void VisualProperties_PropertyChanged(object sender, PropertyChangedEventArgs e) {
123      OnVisualPropertiesChanged();
124    }
125
126    private void RegisterRowsEvents() {
127      rows.ItemsAdded += new CollectionItemsChangedEventHandler<RangeDataRow>(Rows_ItemsAdded);
128      rows.ItemsRemoved += new CollectionItemsChangedEventHandler<RangeDataRow>(Rows_ItemsRemoved);
129      rows.ItemsReplaced += new CollectionItemsChangedEventHandler<RangeDataRow>(Rows_ItemsReplaced);
130      rows.CollectionReset += new CollectionItemsChangedEventHandler<RangeDataRow>(Rows_CollectionReset);
131      foreach (var row in Rows) RegisterRowEvents(row);
132    }
133
134    protected virtual void Rows_ItemsAdded(object sender, CollectionItemsChangedEventArgs<RangeDataRow> e) {
135      foreach (var row in e.Items)
136        this.RegisterRowEvents(row);
137
138      this.OnColumnsChanged();
139      this.OnColumnNamesChanged();
140      this.OnReset();
141    }
142    protected virtual void Rows_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<RangeDataRow> e) {
143      foreach (var row in e.Items)
144        this.DeregisterRowEvents(row);
145
146      this.OnColumnsChanged();
147      this.OnColumnNamesChanged();
148      this.OnReset();
149    }
150    protected virtual void Rows_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<RangeDataRow> e) {
151      foreach (var row in e.OldItems)
152        this.DeregisterRowEvents(row);
153      foreach (var row in e.Items)
154        this.RegisterRowEvents(row);
155
156      this.OnColumnsChanged();
157      this.OnColumnNamesChanged();
158      this.OnReset();
159    }
160    protected virtual void Rows_CollectionReset(object sender, CollectionItemsChangedEventArgs<RangeDataRow> e) {
161      foreach (var row in e.OldItems)
162        this.DeregisterRowEvents(row);
163      foreach (var row in e.Items)
164        this.RegisterRowEvents(row);
165
166      if (e.OldItems.Count() != e.Items.Count())
167        this.OnColumnsChanged();
168      this.OnColumnNamesChanged();
169      this.OnReset();
170    }
171
172    private void RegisterRowEvents(RangeDataRow row) {
173      row.Values.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<Tuple<double, double>>>(Values_ItemsAdded);
174      row.Values.ItemsMoved += new CollectionItemsChangedEventHandler<IndexedItem<Tuple<double, double>>>(Values_ItemsMoved);
175      row.Values.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<Tuple<double, double>>>(Values_ItemsRemoved);
176      row.Values.ItemsReplaced += new CollectionItemsChangedEventHandler<IndexedItem<Tuple<double, double>>>(Values_ItemsReplaced);
177      row.Values.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<Tuple<double, double>>>(Values_CollectionReset);
178      //if (row is DataRow) {
179      //  DataRow _row = row as DataRow;
180      //  _row.Values.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsAdded);
181      //  _row.Values.ItemsMoved += new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsMoved);
182      //  _row.Values.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsRemoved);
183      //  _row.Values.ItemsReplaced += new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_ItemsReplaced);
184      //  _row.Values.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<double>>(Values_CollectionReset);
185      //} else if(row is RangeDataRow) {
186      //  RangeDataRow _row = row as RangeDataRow;
187      //  _row.Values.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<Tuple<double, double>>>(Values_ItemsAdded);
188      //  _row.Values.ItemsMoved += new CollectionItemsChangedEventHandler<IndexedItem<Tuple<double, double>>>(Values_ItemsMoved);
189      //  _row.Values.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<Tuple<double, double>>>(Values_ItemsRemoved);
190      //  _row.Values.ItemsReplaced += new CollectionItemsChangedEventHandler<IndexedItem<Tuple<double, double>>>(Values_ItemsReplaced);
191      //  _row.Values.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<Tuple<double, double>>>(Values_CollectionReset);
192      //}
193    }
194    private void DeregisterRowEvents(RangeDataRow row) {
195      row.Values.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<Tuple<double, double>>>(Values_ItemsAdded);
196      row.Values.ItemsMoved -= new CollectionItemsChangedEventHandler<IndexedItem<Tuple<double, double>>>(Values_ItemsMoved);
197      row.Values.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<Tuple<double, double>>>(Values_ItemsRemoved);
198      row.Values.ItemsReplaced -= new CollectionItemsChangedEventHandler<IndexedItem<Tuple<double, double>>>(Values_ItemsReplaced);
199      row.Values.CollectionReset -= new CollectionItemsChangedEventHandler<IndexedItem<Tuple<double, double>>>(Values_CollectionReset);
200    }
201    #endregion events
202
203    #region RangeDataRow Value Events
204    private void Values_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<Tuple<double, double>>> e) {
205      this.OnReset();
206    }
207    private void Values_ItemsMoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<Tuple<double, double>>> e) {
208      this.OnReset();
209    }
210    private void Values_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<Tuple<double, double>>> e) {
211      this.OnReset();
212    }
213    private void Values_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<Tuple<double, double>>> e) {
214      this.OnReset();
215    }
216    private void Values_CollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedItem<Tuple<double, double>>> e) {
217      this.OnReset();
218    }
219    #endregion
220
221    #region IStringConvertibleMatrix Members
222
223    int IStringConvertibleMatrix.Rows {
224      get {
225        //int maxDR = rows.OfType<DataRow>().Max(r => r.Values.Count);
226        //int maxIDR = rows.OfType<RangeDataRow>().Max(r => r.Values.Count);
227        //return rows.Count == 0 ? 0 : maxDR >= maxIDR ? maxDR : maxIDR;
228        return rows.Count == 0 ? 0 : rows.Max(r => r.Values.Count);
229      }
230      set { throw new NotSupportedException(); }
231    }
232    int IStringConvertibleMatrix.Columns {
233      get { return rows.Count; }
234      set { throw new NotSupportedException(); }
235    }
236    IEnumerable<string> IStringConvertibleMatrix.ColumnNames {
237      get { return rows.Select(r => r.Name); }
238      set { throw new NotSupportedException(); }
239    }
240    IEnumerable<string> IStringConvertibleMatrix.RowNames {
241      get { return Enumerable.Empty<string>(); }
242      set { throw new NotSupportedException(); }
243    }
244
245    bool IStringConvertibleMatrix.SortableView {
246      get { return true; }
247      set { throw new NotSupportedException(); }
248    }
249    bool IStringConvertibleMatrix.ReadOnly {
250      get { return true; }
251    }
252
253    string IStringConvertibleMatrix.GetValue(int rowIndex, int columnIndex) {
254      if (columnIndex < rows.Count) {
255        string columnName = ((IStringConvertibleMatrix)this).ColumnNames.ElementAt(columnIndex);
256        if(rows.ContainsKey(columnName)) {
257          RangeDataRow row = rows[columnName];
258          if(rowIndex < row.Values.Count) return "[" + row.Values[rowIndex].Item1 + "," + row.Values[rowIndex].Item1 + "]";
259        }
260        //if(rows.ContainsKey(columnName)) {
261        //  if(rows[columnName] is DataRow) {
262        //    DataRow row = rows[columnName] as DataRow;
263        //    if (rowIndex < row.Values.Count) return row.Values[rowIndex].ToString();
264        //  } else if(rows[columnName] is RangeDataRow) {
265        //    RangeDataRow row = rows[columnName] as RangeDataRow;
266        //    if (rowIndex < row.Values.Count) return "[" + row.Values[rowIndex].Item1 + "," + row.Values[rowIndex].Item1 + "]";
267        //  }
268        //}
269      }
270      return string.Empty;
271    }
272
273    bool IStringConvertibleMatrix.Validate(string value, out string errorMessage) {
274      throw new NotSupportedException();
275    }
276    bool IStringConvertibleMatrix.SetValue(string value, int rowIndex, int columnIndex) {
277      throw new NotSupportedException();
278    }
279
280    public event EventHandler<EventArgs<int, int>> ItemChanged;
281    protected virtual void OnItemChanged(int rowIndex, int columnIndex) {
282      var handler = ItemChanged;
283      if (handler != null) handler(this, new EventArgs<int, int>(rowIndex, columnIndex));
284      OnToStringChanged();
285    }
286    public event EventHandler Reset;
287    protected virtual void OnReset() {
288      var handler = Reset;
289      if (handler != null) handler(this, EventArgs.Empty);
290    }
291    public event EventHandler ColumnsChanged;
292    protected virtual void OnColumnsChanged() {
293      var handler = ColumnsChanged;
294      if (handler != null) handler(this, EventArgs.Empty);
295    }
296    public event EventHandler RowsChanged;
297    protected virtual void OnRowsChanged() {
298      var handler = RowsChanged;
299      if (handler != null) handler(this, EventArgs.Empty);
300    }
301    public event EventHandler ColumnNamesChanged;
302    protected virtual void OnColumnNamesChanged() {
303      var handler = ColumnNamesChanged;
304      if (handler != null) handler(this, EventArgs.Empty);
305    }
306    public event EventHandler RowNamesChanged;
307    protected virtual void OnRowNamesChanged() {
308      var handler = RowNamesChanged;
309      if (handler != null) handler(this, EventArgs.Empty);
310    }
311    public event EventHandler SortableViewChanged;
312    protected virtual void OnSortableViewChanged() {
313      var handler = SortableViewChanged;
314      if (handler != null) handler(this, EventArgs.Empty);
315    }
316    #endregion
317  }
318}
Note: See TracBrowser for help on using the repository browser.