Blame view

src/main/java/eu/omp/irap/vespa/epntapclient/view/ParamField.java 8.26 KB
eb483599   Nathanael Jourdane   Add missing Param...
1
2
3
4
5
6
7
8
9
10
11
12
package eu.omp.irap.vespa.epntapclient.view;

import java.awt.Color;
import java.awt.Dimension;
import java.beans.PropertyChangeEvent;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Locale;
import java.util.Objects;

import javax.swing.BoxLayout;
f00cb6bb   Nathanael Jourdane   Add a JComboBox f...
13
import javax.swing.JComboBox;
eb483599   Nathanael Jourdane   Add missing Param...
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.Document;
import javax.swing.text.JTextComponent;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public abstract class ParamField extends JPanel {

	/** The logger for this class. */
	private static final Logger logger = LogManager.getLogger(ParamField.class);

	private static final String DATE_FORMAT = "dd/MM/yyyy";
	private static final String DATE_REGEX = "(^(((0[1-9]|1[0-9]|2[0-8])[\\/](0[1-9]|1[012]))|((29|30|31)[\\/](0[13578]|1[02]))|((29|30)[\\/](0[4,6,9]|11)))[\\/](19|[2-9][0-9])\\d\\d$)|(^29[\\/]02[\\/](19|[2-9][0-9])(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)$)";

	private static final String MIN_SUFFIX = "min";
	private static final String MAX_SUFFIX = "max";

	protected static RequestView requestView;
	protected String paramName;

eb483599   Nathanael Jourdane   Add missing Param...
42
43
44
45
46
47
48
	public ParamField(RequestView requestView, String paramName) {
		super();
		this.setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
		String strLabel = paramName.replaceAll("_", " ").trim();
		JLabel label = new JLabel(strLabel.substring(0, 1).toUpperCase() + strLabel.substring(1));
		label.setPreferredSize(new Dimension(140, 15));
		this.add(label);
41133475   Nathanael Jourdane   build floatRangeF...
49
		// TODO: Add tooltip text based on rr.table_column.column_description
eb483599   Nathanael Jourdane   Add missing Param...
50
51
52
53
54
		this.requestView = requestView;
		this.paramName = paramName;
	}

	public static class StringField extends ParamField {
667dd80c   Nathanael Jourdane   JTextField as Par...
55
56
		JTextField field;

eb483599   Nathanael Jourdane   Add missing Param...
57
58
		StringField(RequestView requestView, String paramName) {
			super(requestView, paramName);
667dd80c   Nathanael Jourdane   JTextField as Par...
59
60
			field = new JTextField();
			addChangeListener(field, e -> onUpdate());
eb483599   Nathanael Jourdane   Add missing Param...
61
62
63
			this.add(field);
		}

667dd80c   Nathanael Jourdane   JTextField as Par...
64
		private void onUpdate() {
eb483599   Nathanael Jourdane   Add missing Param...
65
66
67
68
69
70
71
72
73
			if ("".equals(field.getText())) {
				requestView.updateParam(paramName, null);
			} else {
				requestView.updateParam(paramName, field.getText());
			}
		}
	}

	public static class FloatField extends ParamField {
667dd80c   Nathanael Jourdane   JTextField as Par...
74
75
		JTextField field;

eb483599   Nathanael Jourdane   Add missing Param...
76
77
		FloatField(RequestView requestView, String paramName) {
			super(requestView, paramName);
667dd80c   Nathanael Jourdane   JTextField as Par...
78
79
			field = new JTextField();
			addChangeListener(field, e -> onUpdate());
eb483599   Nathanael Jourdane   Add missing Param...
80
81
82
			this.add(field);
		}

667dd80c   Nathanael Jourdane   JTextField as Par...
83
		private void onUpdate() {
eb483599   Nathanael Jourdane   Add missing Param...
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
			if ("".equals(field.getText())) {
				field.setBackground(Color.WHITE);
				requestView.updateParam(paramName, null);
			} else {
				try {
					requestView.updateParam(paramName, Float.parseFloat(field.getText()));
					field.setBackground(Color.WHITE);
				} catch (NumberFormatException e) {
					field.setBackground(Color.PINK);
				}
			}
		}
	}

	public static class DateRangeField extends ParamField {
667dd80c   Nathanael Jourdane   JTextField as Par...
99
100
101
		JTextField fieldMin;
		JTextField fieldMax;

eb483599   Nathanael Jourdane   Add missing Param...
102
103
		DateRangeField(RequestView requestView, String paramName) {
			super(requestView, paramName);
667dd80c   Nathanael Jourdane   JTextField as Par...
104
			fieldMin = new JTextField();
eb483599   Nathanael Jourdane   Add missing Param...
105
106
107
			addChangeListener(fieldMin, e -> onUpdate(fieldMin, MIN_SUFFIX));
			this.add(fieldMin);

667dd80c   Nathanael Jourdane   JTextField as Par...
108
			fieldMax = new JTextField();
eb483599   Nathanael Jourdane   Add missing Param...
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
			addChangeListener(fieldMax, e -> onUpdate(fieldMax, MAX_SUFFIX));
			this.add(fieldMax);
		}

		private void onUpdate(JTextField field, String suffix) {
			DateFormat df = new SimpleDateFormat(DATE_FORMAT, Locale.ENGLISH);
			if ("".equals(field.getText())) {
				field.setBackground(Color.WHITE);
				requestView.updateParam(paramName + suffix, null);
			} else if (field.getText().matches(DATE_REGEX)) {
				try {
					long date = df.parse(field.getText()).getTime();
					date = (Math.round((date / 86400000.0) + 2440587.5)); // to JD
					requestView.updateParam(paramName + suffix, date);
					field.setBackground(Color.WHITE);
				} catch (ParseException e) {
					field.setBackground(Color.PINK);
				}
				// TODO: check if date min < date max
			} else {
				field.setBackground(Color.PINK);
			}
		}
	}

	public static class FloatRangeField extends ParamField {
41133475   Nathanael Jourdane   build floatRangeF...
135
136
		JTextField fieldMin;
		JTextField fieldMax;
eb483599   Nathanael Jourdane   Add missing Param...
137
138
139

		FloatRangeField(RequestView requestView, String paramName) {
			super(requestView, paramName);
41133475   Nathanael Jourdane   build floatRangeF...
140
141
			fieldMin = new JTextField();
			addChangeListener(fieldMin, e -> onUpdate(fieldMin, MIN_SUFFIX));
eb483599   Nathanael Jourdane   Add missing Param...
142
143
			this.add(fieldMin);

41133475   Nathanael Jourdane   build floatRangeF...
144
145
			fieldMax = new JTextField();
			addChangeListener(fieldMax, e -> onUpdate(fieldMax, MAX_SUFFIX));
eb483599   Nathanael Jourdane   Add missing Param...
146
147
			this.add(fieldMax);
		}
41133475   Nathanael Jourdane   build floatRangeF...
148
149
150
151
152
153
154
155
156
157
158
159
160
161

		private void onUpdate(JTextField field, String suffix) {
			if ("".equals(field.getText())) {
				field.setBackground(Color.WHITE);
				requestView.updateParam(paramName + suffix, null);
			} else {
				try {
					requestView.updateParam(paramName + suffix, Float.parseFloat(field.getText()));
					field.setBackground(Color.WHITE);
				} catch (NumberFormatException e) {
					field.setBackground(Color.PINK);
				}
			}
		}
eb483599   Nathanael Jourdane   Add missing Param...
162
163
164
	}

	public static class TargetNameField extends ParamField {
f00cb6bb   Nathanael Jourdane   Add a JComboBox f...
165
		JComboBox<String> comboBox;
667dd80c   Nathanael Jourdane   JTextField as Par...
166
		JTextField field;
f00cb6bb   Nathanael Jourdane   Add a JComboBox f...
167
		String lastContent;
667dd80c   Nathanael Jourdane   JTextField as Par...
168

eb483599   Nathanael Jourdane   Add missing Param...
169
170
		TargetNameField(RequestView requestView, String paramName) {
			super(requestView, paramName);
f00cb6bb   Nathanael Jourdane   Add a JComboBox f...
171
172
173
			comboBox = new JComboBox();
			comboBox.setEditable(true);
			field = (JTextField) comboBox.getEditor().getEditorComponent();
667dd80c   Nathanael Jourdane   JTextField as Par...
174
			addChangeListener(field, e -> onUpdate());
f00cb6bb   Nathanael Jourdane   Add a JComboBox f...
175
176
177
178
179
180
			this.add(comboBox);
		}

		private String[] getTargetNames(String begining) {
			String[] targetNames = { begining + "Bird", begining + "Cat", begining + "Dog" };
			return targetNames;
eb483599   Nathanael Jourdane   Add missing Param...
181
182
		}

667dd80c   Nathanael Jourdane   JTextField as Par...
183
		private void onUpdate() {
f00cb6bb   Nathanael Jourdane   Add a JComboBox f...
184
185
186
187
188
189
190
191
192
193
			String content = field.getText();
			if (content.length() >= 2 && !content.equals(lastContent)) {
				lastContent = content;
				int nbItems = comboBox.getItemCount();
				comboBox.removeAllItems();
				for (String s : getTargetNames(content)) {
					comboBox.addItem(s);
				}
				field.setText(content);
				requestView.updateParam(paramName, content);
eb483599   Nathanael Jourdane   Add missing Param...
194
195
196
197
198
			}
		}
	}

	public static class DataProductTypeField extends ParamField {
667dd80c   Nathanael Jourdane   JTextField as Par...
199
200
		JTextField field;

eb483599   Nathanael Jourdane   Add missing Param...
201
202
		DataProductTypeField(RequestView requestView, String paramName) {
			super(requestView, paramName);
f00cb6bb   Nathanael Jourdane   Add a JComboBox f...
203
			JTextField field = new JTextField();
eb483599   Nathanael Jourdane   Add missing Param...
204
			// TODO: listbox with enumerated values instead of JTextField
667dd80c   Nathanael Jourdane   JTextField as Par...
205
			addChangeListener(field, e -> onUpdate());
eb483599   Nathanael Jourdane   Add missing Param...
206
207
208
			this.add(field);
		}

667dd80c   Nathanael Jourdane   JTextField as Par...
209
		private void onUpdate() {
eb483599   Nathanael Jourdane   Add missing Param...
210
211
212
213
214
215
216
217
218
			if ("".equals(field.getText())) {
				requestView.updateParam(paramName, null);
			} else {
				requestView.updateParam(paramName, field.getText());
			}
		}
	}

	public static class TargetClassField extends ParamField {
667dd80c   Nathanael Jourdane   JTextField as Par...
219
220
		JTextField field;

eb483599   Nathanael Jourdane   Add missing Param...
221
222
223
224
		TargetClassField(RequestView requestView, String paramName) {
			super(requestView, paramName);
			JTextField field = new JTextField();
			// TODO: listbox with enumerated values instead of JTextField
667dd80c   Nathanael Jourdane   JTextField as Par...
225
			addChangeListener(field, e -> onUpdate());
eb483599   Nathanael Jourdane   Add missing Param...
226
227
228
			this.add(field);
		}

667dd80c   Nathanael Jourdane   JTextField as Par...
229
		private void onUpdate() {
eb483599   Nathanael Jourdane   Add missing Param...
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
			if ("".equals(field.getText())) {
				requestView.updateParam(paramName, null);
			} else {
				requestView.updateParam(paramName, field.getText());
			}
		}
	}

	// public class EnumParamField extends ParamField {
	// EnumParamField() {
	// super();
	// }
	// }

	public static void addChangeListener(JTextComponent text, ChangeListener changeListener) {
		Objects.requireNonNull(text);
		Objects.requireNonNull(changeListener);
		DocumentListener dl = new DocumentListener() {
			private int lastChange = 0, lastNotifiedChange = 0;

			@Override
			public void insertUpdate(DocumentEvent e) {
				changedUpdate(e);
			}

			@Override
			public void removeUpdate(DocumentEvent e) {
				changedUpdate(e);
			}

			@Override
			public void changedUpdate(DocumentEvent e) {
				lastChange++;
				SwingUtilities.invokeLater(() -> {
					if (lastNotifiedChange != lastChange) {
						lastNotifiedChange = lastChange;
						changeListener.stateChanged(new ChangeEvent(text));
					}
				});
			}
		};
		text.addPropertyChangeListener("document", (PropertyChangeEvent e) -> {
			Document d1 = (Document) e.getOldValue();
			Document d2 = (Document) e.getNewValue();
			if (d1 != null)
				d1.removeDocumentListener(dl);
			if (d2 != null)
				d2.addDocumentListener(dl);
			dl.changedUpdate(null);
		});
		Document d = text.getDocument();
		if (d != null)
			d.addDocumentListener(dl);
	}
}