Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
03/12/13 12:20:25 (11 years ago)
Author:
sforsten
Message:

#2018:

  • added column names to the ValueTypeArray and StringArray
  • added batch update methods to IStringConvertibleArray similar to methods in IStringConvertibleMatrix
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/ImprovingStringConvertibleMatrix/HeuristicLab.Data/3.3/ValueTypeArray.cs

    r8587 r9308  
    3333  [Item("ValueTypeArray", "An abstract base class for representing arrays of value types.")]
    3434  [StorableClass]
    35   public abstract class ValueTypeArray<T> : Item, IEnumerable<T> where T : struct {
     35  public abstract class ValueTypeArray<T> : Item, IEnumerable<T>, IStringConvertibleArray where T : struct {
    3636    public static new Image StaticItemImage {
    3737      get { return HeuristicLab.Common.Resources.VSImageLibrary.Class; }
     
    4040    [Storable]
    4141    protected T[] array;
     42
     43    [Storable]
     44    protected List<string> columnNames;
     45    public virtual IEnumerable<string> ColumnNames {
     46      get { return this.columnNames; }
     47      set {
     48        if (ReadOnly) throw new NotSupportedException("ColumnNames cannot be set. ValueTypeArray is read-only.");
     49        if (value == null || value.Count() == 0)
     50          columnNames = new List<string>();
     51        else if (value.Count() != Length)
     52          throw new ArgumentException("A column name must be specified for each column.");
     53        else
     54          columnNames = new List<string>(value);
     55        OnColumnNamesChanged();
     56      }
     57    }
    4258
    4359    public virtual int Length {
     
    4965        if (value != Length) {
    5066          Array.Resize<T>(ref array, value);
     67          while (columnNames.Count > value)
     68            columnNames.RemoveAt(columnNames.Count - 1);
     69          while (columnNames.Count < value)
     70            columnNames.Add("Column " + columnNames.Count);
     71          OnColumnNamesChanged();
    5172          OnReset();
    5273        }
     
    6081        if (!value.Equals(array[index])) {
    6182          array[index] = value;
    62           OnItemChanged(index);
     83          OnItemsChanged(new List<int>(1) { index });
    6384        }
    6485      }
     86    }
     87
     88    public virtual void SetValues(IEnumerable<ArrayValue<T>> arrayValues) {
     89      if (ReadOnly) throw new NotSupportedException("Item cannot be set. ValueTypeMatrix is read-only.");
     90      List<int> positions = new List<int>();
     91      foreach (var arrayValue in arrayValues) {
     92        if (!arrayValue.Value.Equals(array[arrayValue.Index])) {
     93          array[arrayValue.Index] = arrayValue.Value;
     94          positions.Add(arrayValue.Index);
     95        }
     96      }
     97      OnItemsChanged(positions);
    6598    }
    6699
     
    69102    public virtual bool ReadOnly {
    70103      get { return readOnly; }
     104    }
     105
     106    [StorableHook(HookType.AfterDeserialization)]
     107    private void AfterDeserialization() {
     108      if (columnNames == null) {
     109        columnNames = new List<string>(array.Length);
     110        while (columnNames.Count < array.Length)
     111          columnNames.Add("Column " + columnNames.Count);
     112      }
    71113    }
    72114
     
    76118      : base(original, cloner) {
    77119      this.array = (T[])original.array.Clone();
     120      this.columnNames = new List<string>(original.columnNames);
    78121      this.readOnly = original.readOnly;
    79122    }
    80123    protected ValueTypeArray() {
    81124      array = new T[0];
     125      columnNames = new List<string>();
    82126      readOnly = false;
    83127    }
    84128    protected ValueTypeArray(int length) {
    85129      array = new T[length];
     130      columnNames = new List<string>(length);
    86131      readOnly = false;
    87132    }
     
    89134      if (elements == null) throw new ArgumentNullException();
    90135      array = (T[])elements.Clone();
     136      columnNames = new List<string>(elements.Length);
    91137      readOnly = false;
    92138    }
     
    118164    }
    119165
    120     public event EventHandler<EventArgs<int>> ItemChanged;
    121     protected virtual void OnItemChanged(int index) {
    122       if (ItemChanged != null)
    123         ItemChanged(this, new EventArgs<int>(index));
     166    public event EventHandler ColumnNamesChanged;
     167    protected virtual void OnColumnNamesChanged() {
     168      EventHandler handler = ColumnNamesChanged;
     169      if (handler != null)
     170        handler(this, EventArgs.Empty);
     171    }
     172    public event EventHandler<ArrayValuesChangedEventArgs> ItemsChanged;
     173    protected virtual void OnItemsChanged(IEnumerable<int> indices) {
     174      if (ItemsChanged != null)
     175        ItemsChanged(this, new ArrayValuesChangedEventArgs(indices));
    124176      OnToStringChanged();
    125177    }
     
    130182      OnToStringChanged();
    131183    }
     184
     185    protected abstract bool Validate(string value, out string errorMessage);
     186    protected abstract string GetValue(int index);
     187    protected abstract bool SetValue(string value, int index);
     188    protected abstract bool SetValues(IEnumerable<ArrayValue<string>> arrayValues);
     189
     190    #region IStringConvertibleArray Members
     191    int IStringConvertibleArray.Length {
     192      get { return Length; }
     193      set { Length = value; }
     194    }
     195    bool IStringConvertibleArray.Validate(string value, out string errorMessage) {
     196      return Validate(value, out errorMessage);
     197    }
     198    string IStringConvertibleArray.GetValue(int index) {
     199      return GetValue(index);
     200    }
     201    bool IStringConvertibleArray.SetValue(string value, int index) {
     202      return SetValue(value, index);
     203    }
     204    bool IStringConvertibleArray.SetValue(ArrayValue<string> arrayValue) {
     205      return SetValue(arrayValue.Value, arrayValue.Index);
     206    }
     207    bool IStringConvertibleArray.SetValues(IEnumerable<ArrayValue<string>> arrayValues) {
     208      return SetValues(arrayValues);
     209    }
     210    #endregion
    132211  }
    133212}
Note: See TracChangeset for help on using the changeset viewer.