Free cookie consent management tool by TermsFeed Policy Generator

source: branches/2521_ProblemRefactoring/HeuristicLab.Parameters/3.3/ParameterChangeHandler.cs @ 17587

Last change on this file since 17587 was 17587, checked in by abeham, 4 years ago

#2521: refactoring in progress

File size: 11.6 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 HeuristicLab.Core;
24using HeuristicLab.Data;
25
26namespace HeuristicLab.Parameters {
27  public abstract class ParameterChangeHandler<TItem> where TItem : class, IItem {
28    protected Action handler;
29
30    protected ParameterChangeHandler(IValueParameter<TItem> parameter, Action handler) {
31      if (!(parameter is IFixedValueParameter<TItem>))
32        parameter.ValueChanged += ParameterOnValueChanged;
33      this.handler = handler;
34    }
35
36    protected virtual void ParameterOnValueChanged(object sender, EventArgs e) {
37      handler();
38    }
39  }
40
41  public class ValueTypeValueParameterChangeHandler<TItem, TValue> : ParameterChangeHandler<TItem>
42    where TValue : struct
43    where TItem : ValueTypeValue<TValue> {
44    private ValueTypeValue<TValue> last;
45
46    protected ValueTypeValueParameterChangeHandler(IValueParameter<TItem> parameter, Action handler)
47      : base(parameter, handler) {
48      last = parameter.Value;
49      if (last != null && !last.ReadOnly)
50        last.ValueChanged += ParameterValueOnValueChanged;
51    }
52
53    protected override void ParameterOnValueChanged(object sender, EventArgs e) {
54      if (last != null) last.ValueChanged -= ParameterValueOnValueChanged;
55      last = ((IValueParameter<TItem>)sender).Value;
56      if (last != null && !last.ReadOnly)
57        last.ValueChanged += ParameterValueOnValueChanged;
58      base.ParameterOnValueChanged(sender, e);
59    }
60
61    protected void ParameterValueOnValueChanged(object sender, EventArgs e) {
62      handler();
63    }
64
65    public static ValueTypeValueParameterChangeHandler<TItem, TValue> Create(IValueParameter<TItem> parameter, Action handler)
66      => new ValueTypeValueParameterChangeHandler<TItem, TValue>(parameter, handler);
67  }
68  public class ValueTypeArrayParameterChangeHandler<TItem, TValue> : ParameterChangeHandler<TItem>
69    where TValue : struct
70    where TItem : ValueTypeArray<TValue> {
71    private ValueTypeArray<TValue> last;
72
73    protected ValueTypeArrayParameterChangeHandler(IValueParameter<TItem> parameter, Action handler)
74      : base(parameter, handler) {
75      last = parameter.Value;
76      if (last != null && !last.ReadOnly)
77        last.ToStringChanged += ParameterValueOnValueChanged;
78    }
79
80    protected override void ParameterOnValueChanged(object sender, EventArgs e) {
81      if (last != null) last.ToStringChanged -= ParameterValueOnValueChanged;
82      last = ((IValueParameter<TItem>)sender).Value;
83      if (last != null && !last.ReadOnly)
84        last.ToStringChanged += ParameterValueOnValueChanged;
85      base.ParameterOnValueChanged(sender, e);
86    }
87
88    protected void ParameterValueOnValueChanged(object sender, EventArgs e) {
89      handler();
90    }
91
92    public static ValueTypeArrayParameterChangeHandler<TItem, TValue> Create(IValueParameter<TItem> parameter, Action handler)
93      => new ValueTypeArrayParameterChangeHandler<TItem, TValue>(parameter, handler);
94  }
95
96  public class ValueTypeMatrixParameterChangeHandler<TItem, TValue> : ParameterChangeHandler<TItem>
97    where TValue : struct
98    where TItem : ValueTypeMatrix<TValue> {
99    private ValueTypeMatrix<TValue> last;
100
101    protected ValueTypeMatrixParameterChangeHandler(IValueParameter<TItem> parameter, Action handler)
102      : base(parameter, handler) {
103      last = parameter.Value;
104      if (last != null && !last.ReadOnly)
105        last.ToStringChanged += ParameterValueOnValueChanged;
106    }
107
108    protected override void ParameterOnValueChanged(object sender, EventArgs e) {
109      if (last != null) last.ToStringChanged -= ParameterValueOnValueChanged;
110      last = ((IValueParameter<TItem>)sender).Value;
111      if (last != null && !last.ReadOnly)
112        last.ToStringChanged += ParameterValueOnValueChanged;
113      base.ParameterOnValueChanged(sender, e);
114    }
115
116    protected void ParameterValueOnValueChanged(object sender, EventArgs e) {
117      handler();
118    }
119
120    public static ValueTypeMatrixParameterChangeHandler<TItem, TValue> Create(IValueParameter<TItem> parameter, Action handler)
121      => new ValueTypeMatrixParameterChangeHandler<TItem, TValue>(parameter, handler);
122  }
123
124  public class BoolValueParameterChangeHandler : ValueTypeValueParameterChangeHandler<BoolValue, bool> {
125    private BoolValueParameterChangeHandler(IValueParameter<BoolValue> parameter, Action handler) : base(parameter, handler) { }
126    public static new BoolValueParameterChangeHandler Create(IValueParameter<BoolValue> parameter, Action handler)
127      => new BoolValueParameterChangeHandler(parameter, handler);
128  }
129  public class IntValueParameterChangeHandler : ValueTypeValueParameterChangeHandler<IntValue, int> {
130    private IntValueParameterChangeHandler(IValueParameter<IntValue> parameter, Action handler) : base(parameter, handler) { }
131    public static new IntValueParameterChangeHandler Create(IValueParameter<IntValue> parameter, Action handler)
132      => new IntValueParameterChangeHandler(parameter, handler);
133  }
134  public class DoubleValueParameterChangeHandler : ValueTypeValueParameterChangeHandler<DoubleValue, double> {
135    private DoubleValueParameterChangeHandler(IValueParameter<DoubleValue> parameter, Action handler) : base(parameter, handler) { }
136    public static new DoubleValueParameterChangeHandler Create(IValueParameter<DoubleValue> parameter, Action handler)
137      => new DoubleValueParameterChangeHandler(parameter, handler);
138  }
139  public class PercentValueParameterChangeHandler : ValueTypeValueParameterChangeHandler<PercentValue, double> {
140    private PercentValueParameterChangeHandler(IValueParameter<PercentValue> parameter, Action handler) : base(parameter, handler) { }
141    public static new PercentValueParameterChangeHandler Create(IValueParameter<PercentValue> parameter, Action handler)
142      => new PercentValueParameterChangeHandler(parameter, handler);
143  }
144  public class DateTimeValueParameterChangeHandler : ValueTypeValueParameterChangeHandler<DateTimeValue, DateTime> {
145    private DateTimeValueParameterChangeHandler(IValueParameter<DateTimeValue> parameter, Action handler) : base(parameter, handler) { }
146    public static new DateTimeValueParameterChangeHandler Create(IValueParameter<DateTimeValue> parameter, Action handler)
147      => new DateTimeValueParameterChangeHandler(parameter, handler);
148  }
149  public class TimeSpanValueParameterChangeHandler : ValueTypeValueParameterChangeHandler<TimeSpanValue, TimeSpan> {
150    private TimeSpanValueParameterChangeHandler(IValueParameter<TimeSpanValue> parameter, Action handler) : base(parameter, handler) { }
151    public static new TimeSpanValueParameterChangeHandler Create(IValueParameter<TimeSpanValue> parameter, Action handler)
152      => new TimeSpanValueParameterChangeHandler(parameter, handler);
153  }
154  public class EnumValueParameterChangeHandler<TEnum> : ValueTypeValueParameterChangeHandler<EnumValue<TEnum>, TEnum> where TEnum : struct, IComparable {
155    private EnumValueParameterChangeHandler(IValueParameter<EnumValue<TEnum>> parameter, Action handler) : base(parameter, handler) { }
156    public static new EnumValueParameterChangeHandler<TEnum> Create(IValueParameter<EnumValue<TEnum>> parameter, Action handler)
157      => new EnumValueParameterChangeHandler<TEnum>(parameter, handler);
158  }
159  public class BoolArrayParameterChangeHandler : ValueTypeArrayParameterChangeHandler<BoolArray, bool> {
160    private BoolArrayParameterChangeHandler(IValueParameter<BoolArray> parameter, Action handler) : base(parameter, handler) { }
161    public static new BoolArrayParameterChangeHandler Create(IValueParameter<BoolArray> parameter, Action handler)
162      => new BoolArrayParameterChangeHandler(parameter, handler);
163  }
164  public class IntArrayParameterChangeHandler : ValueTypeArrayParameterChangeHandler<IntArray, int> {
165    private IntArrayParameterChangeHandler(IValueParameter<IntArray> parameter, Action handler) : base(parameter, handler) { }
166    public static new IntArrayParameterChangeHandler Create(IValueParameter<IntArray> parameter, Action handler)
167      => new IntArrayParameterChangeHandler(parameter, handler);
168  }
169  public class DoubleArrayParameterChangeHandler : ValueTypeArrayParameterChangeHandler<DoubleArray, double> {
170    private DoubleArrayParameterChangeHandler(IValueParameter<DoubleArray> parameter, Action handler) : base(parameter, handler) { }
171    public static new DoubleArrayParameterChangeHandler Create(IValueParameter<DoubleArray> parameter, Action handler)
172      => new DoubleArrayParameterChangeHandler(parameter, handler);
173  }
174  public class BoolMatrixParameterChangeHandler : ValueTypeMatrixParameterChangeHandler<BoolMatrix, bool> {
175    private BoolMatrixParameterChangeHandler(IValueParameter<BoolMatrix> parameter, Action handler) : base(parameter, handler) { }
176    public static new BoolMatrixParameterChangeHandler Create(IValueParameter<BoolMatrix> parameter, Action handler)
177      => new BoolMatrixParameterChangeHandler(parameter, handler);
178  }
179  public class IntMatrixParameterChangeHandler : ValueTypeMatrixParameterChangeHandler<IntMatrix, int> {
180    private IntMatrixParameterChangeHandler(IValueParameter<IntMatrix> parameter, Action handler) : base(parameter, handler) { }
181    public static new IntMatrixParameterChangeHandler Create(IValueParameter<IntMatrix> parameter, Action handler)
182      => new IntMatrixParameterChangeHandler(parameter, handler);
183  }
184  public class DoubleMatrixParameterChangeHandler : ValueTypeMatrixParameterChangeHandler<DoubleMatrix, double> {
185    private DoubleMatrixParameterChangeHandler(IValueParameter<DoubleMatrix> parameter, Action handler) : base(parameter, handler) { }
186    public static new DoubleMatrixParameterChangeHandler Create(IValueParameter<DoubleMatrix> parameter, Action handler)
187      => new DoubleMatrixParameterChangeHandler(parameter, handler);
188  }
189  public class StringValueParameterChangeHandler : ParameterChangeHandler<StringValue> { // StringValue does not derive from ValueTypeValue
190    private StringValue last;
191
192    private StringValueParameterChangeHandler(IValueParameter<StringValue> parameter, Action handler) : base(parameter, handler) {
193      last = parameter.Value;
194      if (last != null && !last.ReadOnly)
195        last.ValueChanged += ParameterValueOnValueChanged;
196    }
197
198    protected override void ParameterOnValueChanged(object sender, EventArgs e) {
199      if (last != null) last.ValueChanged -= ParameterValueOnValueChanged;
200      last = ((IValueParameter<StringValue>)sender).Value;
201      if (last != null && !last.ReadOnly)
202        last.ValueChanged += ParameterValueOnValueChanged;
203      base.ParameterOnValueChanged(sender, e);
204    }
205
206    private void ParameterValueOnValueChanged(object sender, EventArgs e) {
207      handler();
208    }
209    public static StringValueParameterChangeHandler Create(IValueParameter<StringValue> parameter, Action handler)
210     => new StringValueParameterChangeHandler(parameter, handler);
211  }
212}
Note: See TracBrowser for help on using the repository browser.