Commit bd930b1fb8fc567b92ef5083bde274cf54f946ff
1 parent
4a9845fd
Exists in
master
fix #9
Showing
11 changed files
with
855 additions
and
668 deletions
Show diff stats
src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/ParamField.java deleted
... | ... | @@ -1,664 +0,0 @@ |
1 | -/* | |
2 | - * This file is a part of EpnTAPClient. | |
3 | - * This program aims to provide EPN-TAP support for software clients, like CASSIS spectrum analyzer. | |
4 | - * See draft specifications: https://voparis-confluence.obspm.fr/pages/viewpage.action?pageId=559861 | |
5 | - * Copyright (C) 2016 Institut de Recherche en Astrophysique et Planétologie. | |
6 | - * | |
7 | - * This program is free software: you can | |
8 | - * redistribute it and/or modify it under the terms of the GNU General Public License as published | |
9 | - * by the Free Software Foundation, either version 3 of the License, or (at your option) any later | |
10 | - * version. This program is distributed in the hope that it will be useful, but WITHOUT ANY | |
11 | - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR | |
12 | - * PURPOSE. See the GNU General Public License for more details. You should have received a copy of | |
13 | - * the GNU General Public License along with this program. If not, see | |
14 | - * <http://www.gnu.org/licenses/>. | |
15 | - */ | |
16 | - | |
17 | -package eu.omp.irap.vespa.epntapclient.gui.requestpanel; | |
18 | - | |
19 | -import java.awt.Color; | |
20 | -import java.awt.Dimension; | |
21 | -import java.awt.event.ActionEvent; | |
22 | -import java.awt.event.ActionListener; | |
23 | -import java.text.DateFormat; | |
24 | -import java.text.ParseException; | |
25 | -import java.text.SimpleDateFormat; | |
26 | -import java.util.ArrayList; | |
27 | -import java.util.List; | |
28 | -import java.util.Locale; | |
29 | -import java.util.logging.Level; | |
30 | -import java.util.logging.Logger; | |
31 | - | |
32 | -import javax.swing.BoxLayout; | |
33 | -import javax.swing.JComboBox; | |
34 | -import javax.swing.JLabel; | |
35 | -import javax.swing.JPanel; | |
36 | -import javax.swing.JTextField; | |
37 | -import javax.swing.SwingUtilities; | |
38 | -import javax.swing.event.DocumentEvent; | |
39 | -import javax.swing.event.DocumentListener; | |
40 | - | |
41 | -import eu.omp.irap.vespa.epntapclient.EpnTapGet; | |
42 | -import eu.omp.irap.vespa.epntapclient.gui.mainPanel.ViewListener; | |
43 | -import eu.omp.irap.vespa.votable.utils.CantSendQueryException; | |
44 | - | |
45 | -/** | |
46 | - * A field used to set a service parameter to build the query (in the parameter panel). ParamField | |
47 | - * is an abstract method and all type of parameter field should extend it. See | |
48 | - * https://voparis-confluence.obspm.fr/display/VES/4+-+EPN-TAP+queries to get all parameters | |
49 | - * details. | |
50 | - * | |
51 | - * @author N. Jourdane | |
52 | - */ | |
53 | -public abstract class ParamField extends JPanel { | |
54 | - | |
55 | - /** The serial version UID. */ | |
56 | - private static final long serialVersionUID = 1L; | |
57 | - | |
58 | - /** The logger for the class ParamField. */ | |
59 | - protected static final Logger logger = Logger.getLogger(ParamField.class.getName()); | |
60 | - | |
61 | - /** The minimum width of the field. */ | |
62 | - private static final int MIN_FIELD_WIDTH = 30; | |
63 | - | |
64 | - /** The preferred field height. */ | |
65 | - private static final int FIELD_HEIGHT = 20; | |
66 | - | |
67 | - /** The maximum width of the field. */ | |
68 | - private static final int MAX_FIELD_WIDTH = 400; | |
69 | - | |
70 | - /** The preferred label width. */ | |
71 | - private static final int LABEL_WIDTH = 140; | |
72 | - | |
73 | - /** The date format used in the DateRange field */ | |
74 | - private static final String DATE_FORMAT = "dd/MM/yyyy"; | |
75 | - | |
76 | - /** The regex used to validate the Date fields */ | |
77 | - 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)$)"; | |
78 | - | |
79 | - /** The suffix used in REG-TAP parameters names, indicating that it's a beginning of a range. */ | |
80 | - private static final String MIN_SUFFIX = "min"; | |
81 | - | |
82 | - /** The suffix used in REG-TAP parameters names, indicating that it is a end of a range. */ | |
83 | - private static final String MAX_SUFFIX = "max"; | |
84 | - | |
85 | - /** The main view of the application. */ | |
86 | - protected ViewListener viewListener; | |
87 | - | |
88 | - /** The parameter name of the field */ | |
89 | - protected String paramName; | |
90 | - | |
91 | - | |
92 | - /** | |
93 | - * Method constructor for the parameter field abstract class, which do all common action for all | |
94 | - * type of field, such as displaying the name of the parameter. | |
95 | - * | |
96 | - * @param mainView The main view of the application. | |
97 | - * @param paramName The name of the parameter. | |
98 | - */ | |
99 | - public ParamField(ViewListener viewListener, String paramName) { | |
100 | - super(); | |
101 | - | |
102 | - this.viewListener = viewListener; | |
103 | - this.paramName = paramName; | |
104 | - | |
105 | - buildParamField(); | |
106 | - } | |
107 | - | |
108 | - private void buildParamField() { | |
109 | - setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); | |
110 | - | |
111 | - setMaximumSize(new Dimension(ParamField.MAX_FIELD_WIDTH, ParamField.FIELD_HEIGHT)); | |
112 | - | |
113 | - String strLabel = paramName.replaceAll("_", " ").trim(); | |
114 | - JLabel label = new JLabel(strLabel.substring(0, 1).toUpperCase() + strLabel.substring(1)); | |
115 | - label.setPreferredSize(new Dimension(ParamField.LABEL_WIDTH, ParamField.FIELD_HEIGHT)); | |
116 | - | |
117 | - this.add(label); | |
118 | - } | |
119 | - | |
120 | - | |
121 | - /** | |
122 | - * The string field is used for parameter with a `String` class. It is a simple JTextField with | |
123 | - * no verification. The parameter is sent to the controller each time it is modified. | |
124 | - * | |
125 | - * @author N. Jourdane | |
126 | - */ | |
127 | - public static class StringField extends ParamField implements TextFieldListener { | |
128 | - | |
129 | - /** The serial version UID. */ | |
130 | - private static final long serialVersionUID = 1L; | |
131 | - | |
132 | - /** The JTextField used to put the parameter value. */ | |
133 | - JTextField field; | |
134 | - | |
135 | - | |
136 | - /** | |
137 | - * Method constructor for the string field. | |
138 | - * | |
139 | - * @param mainView The main view of the application. | |
140 | - * @param paramName The name of the parameter. | |
141 | - */ | |
142 | - public StringField(ViewListener viewListener, String paramName) { | |
143 | - super(viewListener, paramName); | |
144 | - field = new JTextField(); | |
145 | - ParamField.addChangeListener(this, field); | |
146 | - this.add(field); | |
147 | - } | |
148 | - | |
149 | - /** | |
150 | - * This method is called each time the field is modified. | |
151 | - */ | |
152 | - @Override | |
153 | - public void update(JTextField textField) { | |
154 | - if (textField.getText().isEmpty()) { | |
155 | - viewListener.onParameterChanged(paramName, null); | |
156 | - } else { | |
157 | - viewListener.onParameterChanged(paramName, textField.getText()); | |
158 | - } | |
159 | - } | |
160 | - } | |
161 | - | |
162 | - /** | |
163 | - * The float field is used for parameter with a `Float` class. It is a JTextField which checks | |
164 | - * if the content is a valid float. If the parameter is valid or if it is empty, then the float | |
165 | - * value is sent to the controller. | |
166 | - * | |
167 | - * @author N. Jourdane | |
168 | - */ | |
169 | - public static class FloatField extends ParamField implements TextFieldListener { | |
170 | - | |
171 | - /** The serial version UID. */ | |
172 | - private static final long serialVersionUID = 1L; | |
173 | - | |
174 | - /** The JTextField used to put the parameter value. */ | |
175 | - JTextField field; | |
176 | - | |
177 | - | |
178 | - /** | |
179 | - * Method constructor | |
180 | - * | |
181 | - * @param mainView The main view of the application. | |
182 | - * @param paramName The name of the parameter. | |
183 | - */ | |
184 | - public FloatField(ViewListener viewListener, String paramName) { | |
185 | - super(viewListener, paramName); | |
186 | - field = new JTextField(); | |
187 | - ParamField.addChangeListener(this, field); | |
188 | - this.add(field); | |
189 | - } | |
190 | - | |
191 | - /** | |
192 | - * This method is called each time the field is modified. | |
193 | - */ | |
194 | - @Override | |
195 | - public void update(JTextField textField) { | |
196 | - if (textField.getText().isEmpty()) { | |
197 | - textField.setBackground(Color.WHITE); | |
198 | - viewListener.onParameterRemoved(paramName); | |
199 | - } else { | |
200 | - try { | |
201 | - float value = Float.parseFloat(textField.getText()); | |
202 | - viewListener.onParameterChanged(paramName, value); | |
203 | - textField.setBackground(Color.WHITE); | |
204 | - } catch (@SuppressWarnings("unused") NumberFormatException e) { | |
205 | - textField.setBackground(Color.PINK); | |
206 | - } | |
207 | - } | |
208 | - } | |
209 | - } | |
210 | - | |
211 | - /** | |
212 | - * The date range field is used for couples of parameter with both a `Date` type (actually only | |
213 | - * `time_min` and `time_max` parameters is concerned for now). These are JTextFields which check | |
214 | - * if the content is a valid date, according to DATE_FORMAT. If the parameter is valid or if it | |
215 | - * is empty, then the dates value are sent to the controller, in Julian Day format. | |
216 | - * | |
217 | - * @author N. Jourdane | |
218 | - */ | |
219 | - public static class DateRangeField extends ParamField implements TextFieldListener { | |
220 | - | |
221 | - /** The serial version UID. */ | |
222 | - private static final long serialVersionUID = 1L; | |
223 | - | |
224 | - /** The JTextField used to put the parameter minimum value of the range. */ | |
225 | - JTextField fieldMin; | |
226 | - | |
227 | - /** The JTextField used to put the parameter maximum value of the range. */ | |
228 | - JTextField fieldMax; | |
229 | - | |
230 | - | |
231 | - /** | |
232 | - * Method constructor | |
233 | - * | |
234 | - * @param mainView The main view of the application. | |
235 | - * @param paramName The name of the parameter. | |
236 | - */ | |
237 | - public DateRangeField(ViewListener viewListener, String paramName) { | |
238 | - super(viewListener, paramName); | |
239 | - this.add(new JLabel("min ")); | |
240 | - fieldMin = new JTextField(); | |
241 | - fieldMin.setName(ParamField.MIN_SUFFIX); | |
242 | - fieldMin.setPreferredSize( | |
243 | - new Dimension(ParamField.MIN_FIELD_WIDTH, ParamField.FIELD_HEIGHT)); | |
244 | - ParamField.addChangeListener(this, fieldMin); | |
245 | - this.add(fieldMin); | |
246 | - | |
247 | - this.add(new JLabel("max ")); | |
248 | - fieldMax = new JTextField(); | |
249 | - fieldMax.setName(ParamField.MAX_SUFFIX); | |
250 | - fieldMax.setPreferredSize( | |
251 | - new Dimension(ParamField.MIN_FIELD_WIDTH, ParamField.FIELD_HEIGHT)); | |
252 | - ParamField.addChangeListener(this, fieldMin); | |
253 | - this.add(fieldMax); | |
254 | - } | |
255 | - | |
256 | - /** | |
257 | - * This method is called each time the field is modified. | |
258 | - */ | |
259 | - @Override | |
260 | - public void update(JTextField field) { | |
261 | - DateFormat df = new SimpleDateFormat(ParamField.DATE_FORMAT, Locale.ENGLISH); | |
262 | - if (field.getText().isEmpty()) { | |
263 | - field.setBackground(Color.WHITE); | |
264 | - viewListener.onParameterRemoved(paramName + field.getName()); | |
265 | - } else if (field.getText().matches(ParamField.DATE_REGEX)) { | |
266 | - try { | |
267 | - long date = df.parse(field.getText()).getTime(); | |
268 | - date = Math.round(date / 86400000.0 + 2440587.5); // to JD | |
269 | - viewListener.onParameterChanged(paramName + field.getName(), | |
270 | - date); | |
271 | - field.setBackground(Color.WHITE); | |
272 | - } catch (@SuppressWarnings("unused") ParseException e) { | |
273 | - field.setBackground(Color.PINK); | |
274 | - } | |
275 | - // TODO: check if date min < date max | |
276 | - } else { | |
277 | - field.setBackground(Color.PINK); | |
278 | - } | |
279 | - } | |
280 | - } | |
281 | - | |
282 | - /** | |
283 | - * The float range field is used for couples of parameter with both a `Float` class. These are | |
284 | - * JTextFields which check if the content is a valid float. If the parameter is valid or if it | |
285 | - * is empty, then the float value are sent to the controller. | |
286 | - * | |
287 | - * @author N. Jourdane | |
288 | - */ | |
289 | - public static class FloatRangeField extends ParamField implements TextFieldListener { | |
290 | - | |
291 | - /** The serial version UID. */ | |
292 | - private static final long serialVersionUID = 1L; | |
293 | - | |
294 | - /** The JTextField used to put the parameter minimum value of the range. */ | |
295 | - JTextField fieldMin; | |
296 | - | |
297 | - /** The JTextField used to put the parameter maximum value of the range. */ | |
298 | - JTextField fieldMax; | |
299 | - | |
300 | - | |
301 | - /** | |
302 | - * Method constructor | |
303 | - * | |
304 | - * @param mainView The main view of the application. | |
305 | - * @param paramName The name of the parameter. | |
306 | - */ | |
307 | - public FloatRangeField(ViewListener viewListener, String paramName) { | |
308 | - super(viewListener, paramName); | |
309 | - fieldMin = new JTextField(); | |
310 | - fieldMin.setName(ParamField.MIN_SUFFIX); | |
311 | - ParamField.addChangeListener(this, fieldMin); | |
312 | - this.add(fieldMin); | |
313 | - | |
314 | - fieldMax = new JTextField(); | |
315 | - fieldMax.setName(ParamField.MAX_SUFFIX); | |
316 | - ParamField.addChangeListener(this, fieldMax); | |
317 | - this.add(fieldMax); | |
318 | - } | |
319 | - | |
320 | - /** | |
321 | - * This method is called each time the field is modified. | |
322 | - */ | |
323 | - @Override | |
324 | - public void update(JTextField field) { | |
325 | - if (field.getText().isEmpty()) { | |
326 | - field.setBackground(Color.WHITE); | |
327 | - viewListener.onParameterRemoved(paramName + field.getName()); | |
328 | - } else { | |
329 | - try { | |
330 | - viewListener.onParameterChanged(paramName + field.getName(), | |
331 | - Float.parseFloat(field.getText())); | |
332 | - field.setBackground(Color.WHITE); | |
333 | - } catch (@SuppressWarnings("unused") NumberFormatException e) { | |
334 | - field.setBackground(Color.PINK); | |
335 | - } | |
336 | - } | |
337 | - } | |
338 | - } | |
339 | - | |
340 | - /** | |
341 | - * The target name field is used only for the `target_name` parameter. It is a ComboBox which is | |
342 | - * automatically filled with actual target names which begins by the entered characters, by | |
343 | - * asking to an online resolver (RESOLVER_URL). The parameter is sent to the controller each | |
344 | - * time it is updated, so it is possible to enter a parameter that the resolver do not know. | |
345 | - * | |
346 | - * @author N. Jourdane | |
347 | - */ | |
348 | - public static class TargetNameField extends ParamField implements TextFieldListener { | |
349 | - | |
350 | - /** The serial version UID. */ | |
351 | - private static final long serialVersionUID = 1L; | |
352 | - | |
353 | - /** The comboBox to enter the target_name and display target name propositions. */ | |
354 | - JComboBox<String> comboBox; | |
355 | - | |
356 | - /** The JTextField related to the ComboBox, allowing to listen for text content update. */ | |
357 | - JTextField field; | |
358 | - | |
359 | - /** | |
360 | - * The content of the last entered value. It is used to avoid recursions, because each time | |
361 | - * an update event is detected, the resolver is called and the ComboBox is filled with new | |
362 | - * values, which trigger a new event. | |
363 | - */ | |
364 | - String lastContent; | |
365 | - | |
366 | - /** | |
367 | - * This method is called each time the field is modified. A Runnable is used it is | |
368 | - * impossible to modify the comboBox from a DocumentEvent. | |
369 | - */ | |
370 | - Runnable updateComboBox = new Runnable() { | |
371 | - | |
372 | - @Override | |
373 | - public void run() { | |
374 | - String content = field.getText(); | |
375 | - if (!content.equals(lastContent)) { | |
376 | - if (content.length() >= 2) { | |
377 | - lastContent = content; | |
378 | - comboBox.removeAllItems(); | |
379 | - try { | |
380 | - for (String s : EpnTapGet.getTargetNames(content)) { | |
381 | - comboBox.addItem(s); | |
382 | - } | |
383 | - } catch (CantSendQueryException e) { | |
384 | - ParamField.logger.log(Level.WARNING, | |
385 | - "Can't get table names for the resolver", e); | |
386 | - } | |
387 | - comboBox.getEditor().setItem(content); | |
388 | - comboBox.showPopup(); | |
389 | - } | |
390 | - if (content.isEmpty()) { | |
391 | - viewListener.onParameterRemoved(paramName); | |
392 | - } else { | |
393 | - viewListener.onParameterChanged(paramName, content); | |
394 | - } | |
395 | - } | |
396 | - } | |
397 | - }; | |
398 | - | |
399 | - | |
400 | - /** | |
401 | - * Method constructor | |
402 | - * | |
403 | - * @param mainView The main view of the application. | |
404 | - * @param paramName The name of the parameter. | |
405 | - */ | |
406 | - public TargetNameField(ViewListener viewListener, String paramName) { | |
407 | - super(viewListener, paramName); | |
408 | - comboBox = new JComboBox<>(); | |
409 | - comboBox.setPreferredSize( | |
410 | - new Dimension(ParamField.MIN_FIELD_WIDTH, ParamField.FIELD_HEIGHT)); | |
411 | - | |
412 | - comboBox.setEditable(true); | |
413 | - field = (JTextField) comboBox.getEditor().getEditorComponent(); | |
414 | - ParamField.addChangeListener(this, field); | |
415 | - this.add(comboBox); | |
416 | - } | |
417 | - | |
418 | - /** | |
419 | - * This method is called each time the field is modified. | |
420 | - */ | |
421 | - @Override | |
422 | - public void update(JTextField textField) { | |
423 | - SwingUtilities.invokeLater(updateComboBox); | |
424 | - } | |
425 | - } | |
426 | - | |
427 | - /** | |
428 | - * The data product type field is used only for the `dataproduct_type` parameter. It is a | |
429 | - * ComboBox filled with a list of static data product types (see | |
430 | - * https://voparis-confluence.obspm.fr/display/VES/4+-+EPN-TAP+queries#id-4-EPN-TAPqueries- | |
431 | - * __RefHeading__35_312326667_Toc3037660444.2.4DataProductType). The parameter is sent to the | |
432 | - * controller each time it is updated. | |
433 | - * | |
434 | - * @author N. Jourdane | |
435 | - */ | |
436 | - public static class DataProductTypeField extends ParamField { | |
437 | - | |
438 | - /** The serial version UID. */ | |
439 | - private static final long serialVersionUID = 1L; | |
440 | - | |
441 | - /** The comboBox used to select the data product type. */ | |
442 | - JComboBox<DataProductType> comboBox; | |
443 | - | |
444 | - | |
445 | - /** | |
446 | - * An enumeration of all available data product types. Each values comes with an id because | |
447 | - * EPN-TAP table can possibly be filled with the id instead of the name, so the query have | |
448 | - * to ask for both of them. | |
449 | - * | |
450 | - * @author N. Jourdane | |
451 | - */ | |
452 | - @SuppressWarnings("javadoc") | |
453 | - enum DataProductType { | |
454 | - // @noformat | |
455 | - ALL("All", "all"), IM("Image", "im"), SP("Spectrum", "sp"), | |
456 | - DS("Dynamic spectrum", "ds"), SC("Spectral cube", "sc"), PR("Profile", "pr"), | |
457 | - VO("Volume", "vo"), MO("Movie", "mo"), CU("Cube", "cu"), | |
458 | - TS("Time series", "ts"), CA("Catalog", "ca"), SV("Spatial vector", "sv"); | |
459 | - // @format | |
460 | - | |
461 | - /** The full name of the data product type, such as `Dynamic spectrum`. */ | |
462 | - private String name = ""; | |
463 | - | |
464 | - /** The id of the data product type, such as `ds`. */ | |
465 | - private String id = ""; | |
466 | - | |
467 | - | |
468 | - /** | |
469 | - * Method constructor for the enumeration. | |
470 | - * | |
471 | - * @param name The full name of the data product type, such as `Dynamic spectrum`. | |
472 | - * @param id The id of the data product type, such as `ds`. | |
473 | - */ | |
474 | - DataProductType(String name, String id) { | |
475 | - this.name = name; | |
476 | - this.id = id; | |
477 | - } | |
478 | - | |
479 | - /** | |
480 | - * @return A list of two strings, containing the name (formated for the query) and the | |
481 | - * id, used in the query. A list is used instead of a array because the getQuery | |
482 | - * function ( @see Queries) needs to know the parameter type. | |
483 | - */ | |
484 | - public List<String> query() { | |
485 | - List<String> item = new ArrayList<>(); | |
486 | - item.add(name.replace(" ", "-").toLowerCase()); | |
487 | - item.add(id); | |
488 | - return item; | |
489 | - } | |
490 | - | |
491 | - @Override | |
492 | - public String toString() { | |
493 | - return name; | |
494 | - } | |
495 | - } | |
496 | - | |
497 | - | |
498 | - /** | |
499 | - * Method constructor | |
500 | - * | |
501 | - * @param mainView The main view of the application. | |
502 | - * @param paramName The name of the parameter. | |
503 | - */ | |
504 | - public DataProductTypeField(ViewListener viewListener, String paramName) { | |
505 | - super(viewListener, paramName); | |
506 | - comboBox = new JComboBox<>(DataProductType.values()); | |
507 | - comboBox.setSelectedItem(DataProductType.ALL); | |
508 | - comboBox.setPreferredSize( | |
509 | - new Dimension(ParamField.MIN_FIELD_WIDTH, ParamField.FIELD_HEIGHT)); | |
510 | - comboBox.addActionListener(new ActionListener() { | |
511 | - | |
512 | - @Override | |
513 | - public void actionPerformed(ActionEvent e) { | |
514 | - update(); | |
515 | - } | |
516 | - }); | |
517 | - this.add(comboBox); | |
518 | - } | |
519 | - | |
520 | - /** | |
521 | - * This method is called each time the field is modified. | |
522 | - */ | |
523 | - void update() { | |
524 | - DataProductType item = (DataProductType) comboBox.getSelectedItem(); | |
525 | - if (DataProductType.ALL.equals(item)) { | |
526 | - viewListener.onParameterRemoved(paramName); | |
527 | - } else { | |
528 | - viewListener.onParameterChanged(paramName, item.query()); | |
529 | - } | |
530 | - } | |
531 | - } | |
532 | - | |
533 | - /** | |
534 | - * The target class field is used only for the `target_class` parameter. It is a ComboBox filled | |
535 | - * with a list of static target classes (see | |
536 | - * https://voparis-confluence.obspm.fr/display/VES/4+-+EPN-TAP+queries#id-4-EPN-TAPqueries- | |
537 | - * __RefHeading__39_312326667_Toc3037660464.2.6TargetClass). The parameter is sent to the | |
538 | - * controller each time it is updated. | |
539 | - * | |
540 | - * @author N. Jourdane | |
541 | - */ | |
542 | - public static class TargetClassField extends ParamField { | |
543 | - | |
544 | - /** The serial version UID. */ | |
545 | - private static final long serialVersionUID = 1L; | |
546 | - | |
547 | - /** The comboBox used to select the target class. */ | |
548 | - JComboBox<TargetClass> comboBox; | |
549 | - | |
550 | - | |
551 | - /** | |
552 | - * An enumeration of all available target classes. | |
553 | - * | |
554 | - * @author N. Jourdane | |
555 | - */ | |
556 | - @SuppressWarnings("javadoc") | |
557 | - enum TargetClass { | |
558 | - // @noformat | |
559 | - ALL("All"), COMET("Comet"), EXOPLANET("Exoplanet"), RING("Ring"), | |
560 | - SAMPLE("Sample"), SKY("Sky"), SPACECRAFT("Spacecraft"), SPACEJUNK("Spacejunk"), | |
561 | - STAR("Star"), INTERPLANETARY_MEDIUM("Interplanetary medium"); | |
562 | - // @format | |
563 | - | |
564 | - /** The name of the target class. */ | |
565 | - String name; | |
566 | - | |
567 | - | |
568 | - /** | |
569 | - * Method constructor for the enumeration. | |
570 | - * | |
571 | - * @param name The name of the target class. | |
572 | - */ | |
573 | - TargetClass(String name) { | |
574 | - this.name = name; | |
575 | - } | |
576 | - | |
577 | - /** | |
578 | - * @return The name formated for the query. | |
579 | - */ | |
580 | - String query() { | |
581 | - return name.replace(" ", "_").toLowerCase(); | |
582 | - } | |
583 | - } | |
584 | - | |
585 | - | |
586 | - /** | |
587 | - * Method constructor | |
588 | - * | |
589 | - * @param mainView The main view of the application. | |
590 | - * @param paramName The name of the parameter. | |
591 | - */ | |
592 | - public TargetClassField(ViewListener viewListener, String paramName) { | |
593 | - super(viewListener, paramName); | |
594 | - comboBox = new JComboBox<>(TargetClass.values()); | |
595 | - comboBox.setPreferredSize( | |
596 | - new Dimension(ParamField.MIN_FIELD_WIDTH, ParamField.FIELD_HEIGHT)); | |
597 | - comboBox.addActionListener(new ActionListener() { | |
598 | - | |
599 | - @Override | |
600 | - public void actionPerformed(ActionEvent e) { | |
601 | - update(); | |
602 | - } | |
603 | - }); | |
604 | - this.add(comboBox); | |
605 | - } | |
606 | - | |
607 | - /** | |
608 | - * This method is called each time the field is modified. | |
609 | - */ | |
610 | - void update() { | |
611 | - TargetClass value = (TargetClass) comboBox.getSelectedItem(); | |
612 | - if (TargetClass.ALL.equals(value)) { | |
613 | - viewListener.onParameterRemoved(paramName); | |
614 | - } else { | |
615 | - viewListener.onParameterChanged(paramName, value.query()); | |
616 | - } | |
617 | - } | |
618 | - } | |
619 | - | |
620 | - /** | |
621 | - * The listener of text field, it aims to provide a simple way to listen a text field without to | |
622 | - * override removeUpdate(DocumentEvent de), insertUpdate(DocumentEvent de) and | |
623 | - * changedUpdate(DocumentEvent de) on each field to listen. | |
624 | - * | |
625 | - * @author N. Jourdane | |
626 | - */ | |
627 | - interface TextFieldListener { | |
628 | - | |
629 | - /** | |
630 | - * When the content of the JTextField is updated. | |
631 | - * | |
632 | - * @param field The JTextField. Is useful for classes containing several text fields, such | |
633 | - * as DateRangeField, to know which one triggered the event. | |
634 | - */ | |
635 | - void update(JTextField field); | |
636 | - } | |
637 | - | |
638 | - | |
639 | - /** | |
640 | - * To add the listener. @see TextFieldListener | |
641 | - * | |
642 | - * @param changeListener The listener of text fields. | |
643 | - * @param field The field to listen. | |
644 | - */ | |
645 | - static void addChangeListener(final TextFieldListener changeListener, final JTextField field) { | |
646 | - field.getDocument().addDocumentListener(new DocumentListener() { | |
647 | - | |
648 | - @Override | |
649 | - public void removeUpdate(DocumentEvent de) { | |
650 | - changeListener.update(field); | |
651 | - } | |
652 | - | |
653 | - @Override | |
654 | - public void insertUpdate(DocumentEvent de) { | |
655 | - changeListener.update(field); | |
656 | - } | |
657 | - | |
658 | - @Override | |
659 | - public void changedUpdate(DocumentEvent de) { | |
660 | - changeListener.update(field); | |
661 | - } | |
662 | - }); | |
663 | - } | |
664 | -} | |
665 | 0 | \ No newline at end of file |
src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/RequestPanelView.java
... | ... | @@ -30,10 +30,11 @@ import javax.swing.JPanel; |
30 | 30 | import javax.swing.JTextArea; |
31 | 31 | |
32 | 32 | import eu.omp.irap.vespa.epntapclient.gui.mainPanel.ViewListener; |
33 | -import eu.omp.irap.vespa.epntapclient.gui.requestpanel.ParamField.DataProductTypeField; | |
34 | -import eu.omp.irap.vespa.epntapclient.gui.requestpanel.ParamField.DateRangeField; | |
35 | -import eu.omp.irap.vespa.epntapclient.gui.requestpanel.ParamField.FloatRangeField; | |
36 | -import eu.omp.irap.vespa.epntapclient.gui.requestpanel.ParamField.TargetNameField; | |
33 | +import eu.omp.irap.vespa.epntapclient.gui.requestpanel.paramfield.DataProductTypeField; | |
34 | +import eu.omp.irap.vespa.epntapclient.gui.requestpanel.paramfield.DateRangeField; | |
35 | +import eu.omp.irap.vespa.epntapclient.gui.requestpanel.paramfield.FloatRangeField; | |
36 | +import eu.omp.irap.vespa.epntapclient.gui.requestpanel.paramfield.ParamField; | |
37 | +import eu.omp.irap.vespa.epntapclient.gui.requestpanel.paramfield.TargetNameField; | |
37 | 38 | |
38 | 39 | /** |
39 | 40 | * The view of the panel where the user builds the query. | ... | ... |
src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/paramfield/DataProductTypeField.java
0 → 100644
... | ... | @@ -0,0 +1,136 @@ |
1 | +/* | |
2 | + * This file is a part of EpnTAPClient. | |
3 | + * This program aims to provide EPN-TAP support for software clients, like CASSIS spectrum analyzer. | |
4 | + * See draft specifications: https://voparis-confluence.obspm.fr/pages/viewpage.action?pageId=559861 | |
5 | + * Copyright (C) 2016 Institut de Recherche en Astrophysique et Planétologie. | |
6 | + * | |
7 | + * This program is free software: you can | |
8 | + * redistribute it and/or modify it under the terms of the GNU General Public License as published | |
9 | + * by the Free Software Foundation, either version 3 of the License, or (at your option) any later | |
10 | + * version. This program is distributed in the hope that it will be useful, but WITHOUT ANY | |
11 | + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR | |
12 | + * PURPOSE. See the GNU General Public License for more details. You should have received a copy of | |
13 | + * the GNU General Public License along with this program. If not, see | |
14 | + * <http://www.gnu.org/licenses/>. | |
15 | + */ | |
16 | + | |
17 | +package eu.omp.irap.vespa.epntapclient.gui.requestpanel.paramfield; | |
18 | + | |
19 | +import java.awt.Dimension; | |
20 | +import java.awt.event.ActionEvent; | |
21 | +import java.awt.event.ActionListener; | |
22 | +import java.util.ArrayList; | |
23 | +import java.util.List; | |
24 | + | |
25 | +import javax.swing.JComboBox; | |
26 | + | |
27 | +import eu.omp.irap.vespa.epntapclient.gui.mainPanel.ViewListener; | |
28 | + | |
29 | +/** | |
30 | + * The data product type field is used only for the `dataproduct_type` parameter. It is a ComboBox | |
31 | + * filled with a list of static data product types (see | |
32 | + * https://voparis-confluence.obspm.fr/display/VES/4+-+EPN-TAP+queries#id-4-EPN-TAPqueries- | |
33 | + * __RefHeading__35_312326667_Toc3037660444.2.4DataProductType). The parameter is sent to the | |
34 | + * controller each time it is updated. | |
35 | + * | |
36 | + * @author N. Jourdane | |
37 | + */ | |
38 | +public class DataProductTypeField extends ParamField { | |
39 | + | |
40 | + /** The serial version UID. */ | |
41 | + private static final long serialVersionUID = 1L; | |
42 | + | |
43 | + /** The comboBox used to select the data product type. */ | |
44 | + JComboBox<DataProductType> comboBox; | |
45 | + | |
46 | + | |
47 | + /** | |
48 | + * Method constructor | |
49 | + * | |
50 | + * @param mainView The main view of the application. | |
51 | + * @param paramName The name of the parameter. | |
52 | + */ | |
53 | + public DataProductTypeField(ViewListener viewListener, String paramName) { | |
54 | + super(viewListener, paramName); | |
55 | + comboBox = new JComboBox<>(DataProductType.values()); | |
56 | + comboBox.setSelectedItem(DataProductType.ALL); | |
57 | + comboBox.setPreferredSize( | |
58 | + new Dimension(ParamField.MIN_FIELD_WIDTH, ParamField.FIELD_HEIGHT)); | |
59 | + | |
60 | + comboBox.addActionListener(new ActionListener() { | |
61 | + | |
62 | + @Override | |
63 | + public void actionPerformed(ActionEvent e) { | |
64 | + update(); | |
65 | + } | |
66 | + }); | |
67 | + | |
68 | + this.add(comboBox); | |
69 | + } | |
70 | + | |
71 | + /** | |
72 | + * This method is called each time the field is modified. | |
73 | + */ | |
74 | + public void update() { | |
75 | + DataProductType item = (DataProductType) comboBox.getSelectedItem(); | |
76 | + if (DataProductType.ALL.equals(item)) { | |
77 | + viewListener.onParameterRemoved(paramName); | |
78 | + } else { | |
79 | + viewListener.onParameterChanged(paramName, item.query()); | |
80 | + } | |
81 | + } | |
82 | + | |
83 | + | |
84 | + /** | |
85 | + * An enumeration of all available data product types. Each values comes with an id because | |
86 | + * EPN-TAP table can possibly be filled with the id instead of the name, so the query have to | |
87 | + * ask for both of them. | |
88 | + * | |
89 | + * @author N. Jourdane | |
90 | + */ | |
91 | + @SuppressWarnings("javadoc") | |
92 | + enum DataProductType { | |
93 | + // @noformat | |
94 | + ALL("All", "all"), IM("Image", "im"), SP("Spectrum", "sp"), | |
95 | + DS("Dynamic spectrum", "ds"), SC("Spectral cube", "sc"), PR("Profile", "pr"), | |
96 | + VO("Volume", "vo"), MO("Movie", "mo"), CU("Cube", "cu"), | |
97 | + TS("Time series", "ts"), CA("Catalog", "ca"), SV("Spatial vector", "sv"); | |
98 | + // @format | |
99 | + | |
100 | + /** The full name of the data product type, such as `Dynamic spectrum`. */ | |
101 | + private String name = ""; | |
102 | + | |
103 | + /** The id of the data product type, such as `ds`. */ | |
104 | + private String id = ""; | |
105 | + | |
106 | + | |
107 | + /** | |
108 | + * Method constructor for the enumeration. | |
109 | + * | |
110 | + * @param name The full name of the data product type, such as `Dynamic spectrum`. | |
111 | + * @param id The id of the data product type, such as `ds`. | |
112 | + */ | |
113 | + DataProductType(String name, String id) { | |
114 | + this.name = name; | |
115 | + this.id = id; | |
116 | + } | |
117 | + | |
118 | + /** | |
119 | + * @return A list of two strings, containing the name (formated for the query) and the id, | |
120 | + * used in the query. A list is used instead of a array because the getQuery | |
121 | + * function ( @see Queries) needs to know the parameter type. | |
122 | + */ | |
123 | + public List<String> query() { | |
124 | + List<String> item = new ArrayList<>(); | |
125 | + item.add(name.replace(" ", "-").toLowerCase()); | |
126 | + item.add(id); | |
127 | + return item; | |
128 | + } | |
129 | + | |
130 | + @Override | |
131 | + public String toString() { | |
132 | + return name; | |
133 | + } | |
134 | + } | |
135 | + | |
136 | +} | |
0 | 137 | \ No newline at end of file | ... | ... |
src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/paramfield/DateRangeField.java
0 → 100644
... | ... | @@ -0,0 +1,106 @@ |
1 | +/* | |
2 | + * This file is a part of EpnTAPClient. | |
3 | + * This program aims to provide EPN-TAP support for software clients, like CASSIS spectrum analyzer. | |
4 | + * See draft specifications: https://voparis-confluence.obspm.fr/pages/viewpage.action?pageId=559861 | |
5 | + * Copyright (C) 2016 Institut de Recherche en Astrophysique et Planétologie. | |
6 | + * | |
7 | + * This program is free software: you can | |
8 | + * redistribute it and/or modify it under the terms of the GNU General Public License as published | |
9 | + * by the Free Software Foundation, either version 3 of the License, or (at your option) any later | |
10 | + * version. This program is distributed in the hope that it will be useful, but WITHOUT ANY | |
11 | + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR | |
12 | + * PURPOSE. See the GNU General Public License for more details. You should have received a copy of | |
13 | + * the GNU General Public License along with this program. If not, see | |
14 | + * <http://www.gnu.org/licenses/>. | |
15 | + */ | |
16 | + | |
17 | +package eu.omp.irap.vespa.epntapclient.gui.requestpanel.paramfield; | |
18 | + | |
19 | +import java.awt.Color; | |
20 | +import java.awt.Dimension; | |
21 | +import java.text.DateFormat; | |
22 | +import java.text.ParseException; | |
23 | +import java.text.SimpleDateFormat; | |
24 | +import java.util.Locale; | |
25 | + | |
26 | +import javax.swing.JLabel; | |
27 | +import javax.swing.JTextField; | |
28 | + | |
29 | +import eu.omp.irap.vespa.epntapclient.gui.mainPanel.ViewListener; | |
30 | + | |
31 | +/** | |
32 | + * The date range field is used for couples of parameter with both a `Date` type (actually only | |
33 | + * `time_min` and `time_max` parameters is concerned for now). These are JTextFields which check if | |
34 | + * the content is a valid date, according to DATE_FORMAT. If the parameter is valid or if it is | |
35 | + * empty, then the dates value are sent to the controller, in Julian Day format. | |
36 | + * | |
37 | + * @author N. Jourdane | |
38 | + */ | |
39 | +public class DateRangeField extends ParamField implements TextFieldListener { | |
40 | + | |
41 | + /** The serial version UID. */ | |
42 | + private static final long serialVersionUID = 1L; | |
43 | + | |
44 | + /** The date format used in the DateRange field */ | |
45 | + private static final String DATE_FORMAT = "dd/MM/yyyy"; | |
46 | + | |
47 | + /** The regex used to validate the Date fields */ | |
48 | + 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)$)"; | |
49 | + | |
50 | + /** The JTextField used to put the parameter minimum value of the range. */ | |
51 | + JTextField fieldMin; | |
52 | + | |
53 | + /** The JTextField used to put the parameter maximum value of the range. */ | |
54 | + JTextField fieldMax; | |
55 | + | |
56 | + | |
57 | + /** | |
58 | + * Method constructor | |
59 | + * | |
60 | + * @param mainView The main view of the application. | |
61 | + * @param paramName The name of the parameter. | |
62 | + */ | |
63 | + public DateRangeField(ViewListener viewListener, String paramName) { | |
64 | + super(viewListener, paramName); | |
65 | + this.add(new JLabel("min ")); | |
66 | + fieldMin = new JTextField(); | |
67 | + fieldMin.setName(MIN_SUFFIX); | |
68 | + fieldMin.setPreferredSize( | |
69 | + new Dimension(MIN_FIELD_WIDTH, FIELD_HEIGHT)); | |
70 | + addChangeListener(this, fieldMin); | |
71 | + this.add(fieldMin); | |
72 | + | |
73 | + this.add(new JLabel("max ")); | |
74 | + fieldMax = new JTextField(); | |
75 | + fieldMax.setName(MAX_SUFFIX); | |
76 | + fieldMax.setPreferredSize( | |
77 | + new Dimension(MIN_FIELD_WIDTH, FIELD_HEIGHT)); | |
78 | + addChangeListener(this, fieldMin); | |
79 | + this.add(fieldMax); | |
80 | + } | |
81 | + | |
82 | + /** | |
83 | + * This method is called each time the field is modified. | |
84 | + */ | |
85 | + @Override | |
86 | + public void update(JTextField field) { | |
87 | + DateFormat df = new SimpleDateFormat(DATE_FORMAT, Locale.ENGLISH); | |
88 | + if (field.getText().isEmpty()) { | |
89 | + field.setBackground(Color.WHITE); | |
90 | + viewListener.onParameterRemoved(paramName + field.getName()); | |
91 | + } else if (field.getText().matches(DATE_REGEX)) { | |
92 | + try { | |
93 | + long date = df.parse(field.getText()).getTime(); | |
94 | + date = Math.round(date / 86400000.0 + 2440587.5); // to JD | |
95 | + viewListener.onParameterChanged(paramName + field.getName(), | |
96 | + date); | |
97 | + field.setBackground(Color.WHITE); | |
98 | + } catch (@SuppressWarnings("unused") ParseException e) { | |
99 | + field.setBackground(Color.PINK); | |
100 | + } | |
101 | + // TODO: check if date min < date max | |
102 | + } else { | |
103 | + field.setBackground(Color.PINK); | |
104 | + } | |
105 | + } | |
106 | +} | |
0 | 107 | \ No newline at end of file | ... | ... |
src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/paramfield/FloatField.java
0 → 100644
... | ... | @@ -0,0 +1,72 @@ |
1 | +/* | |
2 | + * This file is a part of EpnTAPClient. | |
3 | + * This program aims to provide EPN-TAP support for software clients, like CASSIS spectrum analyzer. | |
4 | + * See draft specifications: https://voparis-confluence.obspm.fr/pages/viewpage.action?pageId=559861 | |
5 | + * Copyright (C) 2016 Institut de Recherche en Astrophysique et Planétologie. | |
6 | + * | |
7 | + * This program is free software: you can | |
8 | + * redistribute it and/or modify it under the terms of the GNU General Public License as published | |
9 | + * by the Free Software Foundation, either version 3 of the License, or (at your option) any later | |
10 | + * version. This program is distributed in the hope that it will be useful, but WITHOUT ANY | |
11 | + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR | |
12 | + * PURPOSE. See the GNU General Public License for more details. You should have received a copy of | |
13 | + * the GNU General Public License along with this program. If not, see | |
14 | + * <http://www.gnu.org/licenses/>. | |
15 | + */ | |
16 | + | |
17 | +package eu.omp.irap.vespa.epntapclient.gui.requestpanel.paramfield; | |
18 | + | |
19 | +import java.awt.Color; | |
20 | + | |
21 | +import javax.swing.JTextField; | |
22 | + | |
23 | +import eu.omp.irap.vespa.epntapclient.gui.mainPanel.ViewListener; | |
24 | + | |
25 | +/** | |
26 | + * The float field is used for parameter with a `Float` class. It is a JTextField which checks if | |
27 | + * the content is a valid float. If the parameter is valid or if it is empty, then the float value | |
28 | + * is sent to the controller. | |
29 | + * | |
30 | + * @author N. Jourdane | |
31 | + */ | |
32 | +public class FloatField extends ParamField implements TextFieldListener { | |
33 | + | |
34 | + /** The serial version UID. */ | |
35 | + private static final long serialVersionUID = 1L; | |
36 | + | |
37 | + /** The JTextField used to put the parameter value. */ | |
38 | + JTextField field; | |
39 | + | |
40 | + | |
41 | + /** | |
42 | + * Method constructor | |
43 | + * | |
44 | + * @param mainView The main view of the application. | |
45 | + * @param paramName The name of the parameter. | |
46 | + */ | |
47 | + public FloatField(ViewListener viewListener, String paramName) { | |
48 | + super(viewListener, paramName); | |
49 | + field = new JTextField(); | |
50 | + ParamField.addChangeListener(this, field); | |
51 | + this.add(field); | |
52 | + } | |
53 | + | |
54 | + /** | |
55 | + * This method is called each time the field is modified. | |
56 | + */ | |
57 | + @Override | |
58 | + public void update(JTextField textField) { | |
59 | + if (textField.getText().isEmpty()) { | |
60 | + textField.setBackground(Color.WHITE); | |
61 | + viewListener.onParameterRemoved(paramName); | |
62 | + } else { | |
63 | + try { | |
64 | + float value = Float.parseFloat(textField.getText()); | |
65 | + viewListener.onParameterChanged(paramName, value); | |
66 | + textField.setBackground(Color.WHITE); | |
67 | + } catch (@SuppressWarnings("unused") NumberFormatException e) { | |
68 | + textField.setBackground(Color.PINK); | |
69 | + } | |
70 | + } | |
71 | + } | |
72 | +} | |
0 | 73 | \ No newline at end of file | ... | ... |
src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/paramfield/FloatRangeField.java
0 → 100644
... | ... | @@ -0,0 +1,81 @@ |
1 | +/* | |
2 | + * This file is a part of EpnTAPClient. | |
3 | + * This program aims to provide EPN-TAP support for software clients, like CASSIS spectrum analyzer. | |
4 | + * See draft specifications: https://voparis-confluence.obspm.fr/pages/viewpage.action?pageId=559861 | |
5 | + * Copyright (C) 2016 Institut de Recherche en Astrophysique et Planétologie. | |
6 | + * | |
7 | + * This program is free software: you can | |
8 | + * redistribute it and/or modify it under the terms of the GNU General Public License as published | |
9 | + * by the Free Software Foundation, either version 3 of the License, or (at your option) any later | |
10 | + * version. This program is distributed in the hope that it will be useful, but WITHOUT ANY | |
11 | + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR | |
12 | + * PURPOSE. See the GNU General Public License for more details. You should have received a copy of | |
13 | + * the GNU General Public License along with this program. If not, see | |
14 | + * <http://www.gnu.org/licenses/>. | |
15 | + */ | |
16 | + | |
17 | +package eu.omp.irap.vespa.epntapclient.gui.requestpanel.paramfield; | |
18 | + | |
19 | +import java.awt.Color; | |
20 | + | |
21 | +import javax.swing.JTextField; | |
22 | + | |
23 | +import eu.omp.irap.vespa.epntapclient.gui.mainPanel.ViewListener; | |
24 | + | |
25 | +/** | |
26 | + * The float range field is used for couples of parameter with both a `Float` class. These are | |
27 | + * JTextFields which check if the content is a valid float. If the parameter is valid or if it is | |
28 | + * empty, then the float value are sent to the controller. | |
29 | + * | |
30 | + * @author N. Jourdane | |
31 | + */ | |
32 | +public class FloatRangeField extends ParamField implements TextFieldListener { | |
33 | + | |
34 | + /** The serial version UID. */ | |
35 | + private static final long serialVersionUID = 1L; | |
36 | + | |
37 | + /** The JTextField used to put the parameter minimum value of the range. */ | |
38 | + JTextField fieldMin; | |
39 | + | |
40 | + /** The JTextField used to put the parameter maximum value of the range. */ | |
41 | + JTextField fieldMax; | |
42 | + | |
43 | + | |
44 | + /** | |
45 | + * Method constructor | |
46 | + * | |
47 | + * @param mainView The main view of the application. | |
48 | + * @param paramName The name of the parameter. | |
49 | + */ | |
50 | + public FloatRangeField(ViewListener viewListener, String paramName) { | |
51 | + super(viewListener, paramName); | |
52 | + fieldMin = new JTextField(); | |
53 | + fieldMin.setName(ParamField.MIN_SUFFIX); | |
54 | + ParamField.addChangeListener(this, fieldMin); | |
55 | + this.add(fieldMin); | |
56 | + | |
57 | + fieldMax = new JTextField(); | |
58 | + fieldMax.setName(ParamField.MAX_SUFFIX); | |
59 | + ParamField.addChangeListener(this, fieldMax); | |
60 | + this.add(fieldMax); | |
61 | + } | |
62 | + | |
63 | + /** | |
64 | + * This method is called each time the field is modified. | |
65 | + */ | |
66 | + @Override | |
67 | + public void update(JTextField field) { | |
68 | + if (field.getText().isEmpty()) { | |
69 | + field.setBackground(Color.WHITE); | |
70 | + viewListener.onParameterRemoved(paramName + field.getName()); | |
71 | + } else { | |
72 | + try { | |
73 | + viewListener.onParameterChanged(paramName + field.getName(), | |
74 | + Float.parseFloat(field.getText())); | |
75 | + field.setBackground(Color.WHITE); | |
76 | + } catch (@SuppressWarnings("unused") NumberFormatException e) { | |
77 | + field.setBackground(Color.PINK); | |
78 | + } | |
79 | + } | |
80 | + } | |
81 | +} | |
0 | 82 | \ No newline at end of file | ... | ... |
src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/paramfield/ParamField.java
0 → 100644
... | ... | @@ -0,0 +1,127 @@ |
1 | +/* | |
2 | + * This file is a part of EpnTAPClient. | |
3 | + * This program aims to provide EPN-TAP support for software clients, like CASSIS spectrum analyzer. | |
4 | + * See draft specifications: https://voparis-confluence.obspm.fr/pages/viewpage.action?pageId=559861 | |
5 | + * Copyright (C) 2016 Institut de Recherche en Astrophysique et Planétologie. | |
6 | + * | |
7 | + * This program is free software: you can | |
8 | + * redistribute it and/or modify it under the terms of the GNU General Public License as published | |
9 | + * by the Free Software Foundation, either version 3 of the License, or (at your option) any later | |
10 | + * version. This program is distributed in the hope that it will be useful, but WITHOUT ANY | |
11 | + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR | |
12 | + * PURPOSE. See the GNU General Public License for more details. You should have received a copy of | |
13 | + * the GNU General Public License along with this program. If not, see | |
14 | + * <http://www.gnu.org/licenses/>. | |
15 | + */ | |
16 | + | |
17 | +package eu.omp.irap.vespa.epntapclient.gui.requestpanel.paramfield; | |
18 | + | |
19 | +import java.awt.Dimension; | |
20 | +import java.util.logging.Logger; | |
21 | + | |
22 | +import javax.swing.BoxLayout; | |
23 | +import javax.swing.JLabel; | |
24 | +import javax.swing.JPanel; | |
25 | +import javax.swing.JTextField; | |
26 | +import javax.swing.event.DocumentEvent; | |
27 | +import javax.swing.event.DocumentListener; | |
28 | + | |
29 | +import eu.omp.irap.vespa.epntapclient.gui.mainPanel.ViewListener; | |
30 | + | |
31 | +/** | |
32 | + * A field used to set a service parameter to build the query (in the parameter panel). ParamField | |
33 | + * is an abstract method and all type of parameter field should extend it. See | |
34 | + * https://voparis-confluence.obspm.fr/display/VES/4+-+EPN-TAP+queries to get all parameters | |
35 | + * details. | |
36 | + * | |
37 | + * @author N. Jourdane | |
38 | + */ | |
39 | +public abstract class ParamField extends JPanel { | |
40 | + | |
41 | + /** The serial version UID. */ | |
42 | + private static final long serialVersionUID = 1L; | |
43 | + | |
44 | + /** The logger for the class ParamField. */ | |
45 | + static final Logger logger = Logger.getLogger(ParamField.class.getName()); | |
46 | + | |
47 | + /** The minimum width of the field. */ | |
48 | + static final int MIN_FIELD_WIDTH = 30; | |
49 | + | |
50 | + /** The preferred field height. */ | |
51 | + static final int FIELD_HEIGHT = 20; | |
52 | + | |
53 | + /** The maximum width of the field. */ | |
54 | + static final int MAX_FIELD_WIDTH = 400; | |
55 | + | |
56 | + /** The preferred label width. */ | |
57 | + static final int LABEL_WIDTH = 140; | |
58 | + | |
59 | + /** The suffix used in REG-TAP parameters names, indicating that it's a beginning of a range. */ | |
60 | + static final String MIN_SUFFIX = "min"; | |
61 | + | |
62 | + /** The suffix used in REG-TAP parameters names, indicating that it is a end of a range. */ | |
63 | + static final String MAX_SUFFIX = "max"; | |
64 | + | |
65 | + /** The main view of the application. */ | |
66 | + ViewListener viewListener; | |
67 | + | |
68 | + /** The parameter name of the field */ | |
69 | + String paramName; | |
70 | + | |
71 | + | |
72 | + /** | |
73 | + * Method constructor for the parameter field abstract class, which do all common action for all | |
74 | + * type of field, such as displaying the name of the parameter. | |
75 | + * | |
76 | + * @param mainView The main view of the application. | |
77 | + * @param paramName The name of the parameter. | |
78 | + */ | |
79 | + public ParamField(ViewListener viewListener, String paramName) { | |
80 | + super(); | |
81 | + | |
82 | + this.viewListener = viewListener; | |
83 | + this.paramName = paramName; | |
84 | + | |
85 | + buildParamField(); | |
86 | + } | |
87 | + | |
88 | + private void buildParamField() { | |
89 | + setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); | |
90 | + | |
91 | + setMaximumSize(new Dimension(ParamField.MAX_FIELD_WIDTH, ParamField.FIELD_HEIGHT)); | |
92 | + | |
93 | + String strLabel = paramName.replaceAll("_", " ").trim(); | |
94 | + JLabel label = new JLabel(strLabel.substring(0, 1).toUpperCase() + strLabel.substring(1)); | |
95 | + label.setPreferredSize(new Dimension(ParamField.LABEL_WIDTH, ParamField.FIELD_HEIGHT)); | |
96 | + | |
97 | + this.add(label); | |
98 | + } | |
99 | + | |
100 | + /** | |
101 | + * To add the listener. @see TextFieldListener | |
102 | + * | |
103 | + * @param changeListener The listener of text fields. | |
104 | + * @param field The field to listen. | |
105 | + */ | |
106 | + static void addChangeListener(final TextFieldListener changeListener, final JTextField field) { | |
107 | + | |
108 | + field.getDocument().addDocumentListener(new DocumentListener() { | |
109 | + | |
110 | + @Override | |
111 | + public void removeUpdate(DocumentEvent de) { | |
112 | + changeListener.update(field); | |
113 | + } | |
114 | + | |
115 | + @Override | |
116 | + public void insertUpdate(DocumentEvent de) { | |
117 | + changeListener.update(field); | |
118 | + } | |
119 | + | |
120 | + @Override | |
121 | + public void changedUpdate(DocumentEvent de) { | |
122 | + changeListener.update(field); | |
123 | + } | |
124 | + | |
125 | + }); | |
126 | + } | |
127 | +} | |
0 | 128 | \ No newline at end of file | ... | ... |
src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/paramfield/StringField.java
0 → 100644
... | ... | @@ -0,0 +1,62 @@ |
1 | +/* | |
2 | + * This file is a part of EpnTAPClient. | |
3 | + * This program aims to provide EPN-TAP support for software clients, like CASSIS spectrum analyzer. | |
4 | + * See draft specifications: https://voparis-confluence.obspm.fr/pages/viewpage.action?pageId=559861 | |
5 | + * Copyright (C) 2016 Institut de Recherche en Astrophysique et Planétologie. | |
6 | + * | |
7 | + * This program is free software: you can | |
8 | + * redistribute it and/or modify it under the terms of the GNU General Public License as published | |
9 | + * by the Free Software Foundation, either version 3 of the License, or (at your option) any later | |
10 | + * version. This program is distributed in the hope that it will be useful, but WITHOUT ANY | |
11 | + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR | |
12 | + * PURPOSE. See the GNU General Public License for more details. You should have received a copy of | |
13 | + * the GNU General Public License along with this program. If not, see | |
14 | + * <http://www.gnu.org/licenses/>. | |
15 | + */ | |
16 | + | |
17 | +package eu.omp.irap.vespa.epntapclient.gui.requestpanel.paramfield; | |
18 | + | |
19 | +import javax.swing.JTextField; | |
20 | + | |
21 | +import eu.omp.irap.vespa.epntapclient.gui.mainPanel.ViewListener; | |
22 | + | |
23 | +/** | |
24 | + * The string field is used for parameter with a `String` class. It is a simple JTextField with no | |
25 | + * verification. The parameter is sent to the controller each time it is modified. | |
26 | + * | |
27 | + * @author N. Jourdane | |
28 | + */ | |
29 | +public class StringField extends ParamField implements TextFieldListener { | |
30 | + | |
31 | + /** The serial version UID. */ | |
32 | + private static final long serialVersionUID = 1L; | |
33 | + | |
34 | + /** The JTextField used to put the parameter value. */ | |
35 | + JTextField field; | |
36 | + | |
37 | + | |
38 | + /** | |
39 | + * Method constructor for the string field. | |
40 | + * | |
41 | + * @param mainView The main view of the application. | |
42 | + * @param paramName The name of the parameter. | |
43 | + */ | |
44 | + public StringField(ViewListener viewListener, String paramName) { | |
45 | + super(viewListener, paramName); | |
46 | + field = new JTextField(); | |
47 | + ParamField.addChangeListener(this, field); | |
48 | + this.add(field); | |
49 | + } | |
50 | + | |
51 | + /** | |
52 | + * This method is called each time the field is modified. | |
53 | + */ | |
54 | + @Override | |
55 | + public void update(JTextField textField) { | |
56 | + if (textField.getText().isEmpty()) { | |
57 | + viewListener.onParameterChanged(paramName, null); | |
58 | + } else { | |
59 | + viewListener.onParameterChanged(paramName, textField.getText()); | |
60 | + } | |
61 | + } | |
62 | +} | |
0 | 63 | \ No newline at end of file | ... | ... |
src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/paramfield/TargetClassField.java
0 → 100644
... | ... | @@ -0,0 +1,113 @@ |
1 | +/* | |
2 | + * This file is a part of EpnTAPClient. | |
3 | + * This program aims to provide EPN-TAP support for software clients, like CASSIS spectrum analyzer. | |
4 | + * See draft specifications: https://voparis-confluence.obspm.fr/pages/viewpage.action?pageId=559861 | |
5 | + * Copyright (C) 2016 Institut de Recherche en Astrophysique et Planétologie. | |
6 | + * | |
7 | + * This program is free software: you can | |
8 | + * redistribute it and/or modify it under the terms of the GNU General Public License as published | |
9 | + * by the Free Software Foundation, either version 3 of the License, or (at your option) any later | |
10 | + * version. This program is distributed in the hope that it will be useful, but WITHOUT ANY | |
11 | + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR | |
12 | + * PURPOSE. See the GNU General Public License for more details. You should have received a copy of | |
13 | + * the GNU General Public License along with this program. If not, see | |
14 | + * <http://www.gnu.org/licenses/>. | |
15 | + */ | |
16 | + | |
17 | +package eu.omp.irap.vespa.epntapclient.gui.requestpanel.paramfield; | |
18 | + | |
19 | +import java.awt.Dimension; | |
20 | +import java.awt.event.ActionEvent; | |
21 | +import java.awt.event.ActionListener; | |
22 | + | |
23 | +import javax.swing.JComboBox; | |
24 | + | |
25 | +import eu.omp.irap.vespa.epntapclient.gui.mainPanel.ViewListener; | |
26 | + | |
27 | +/** | |
28 | + * The target class field is used only for the `target_class` parameter. It is a ComboBox filled | |
29 | + * with a list of static target classes (see | |
30 | + * https://voparis-confluence.obspm.fr/display/VES/4+-+EPN-TAP+queries#id-4-EPN-TAPqueries- | |
31 | + * __RefHeading__39_312326667_Toc3037660464.2.6TargetClass). The parameter is sent to the controller | |
32 | + * each time it is updated. | |
33 | + * | |
34 | + * @author N. Jourdane | |
35 | + */ | |
36 | +public class TargetClassField extends ParamField { | |
37 | + | |
38 | + /** The serial version UID. */ | |
39 | + private static final long serialVersionUID = 1L; | |
40 | + | |
41 | + /** The comboBox used to select the target class. */ | |
42 | + JComboBox<TargetClass> comboBox; | |
43 | + | |
44 | + | |
45 | + /** | |
46 | + * Method constructor | |
47 | + * | |
48 | + * @param mainView The main view of the application. | |
49 | + * @param paramName The name of the parameter. | |
50 | + */ | |
51 | + public TargetClassField(ViewListener viewListener, String paramName) { | |
52 | + super(viewListener, paramName); | |
53 | + comboBox = new JComboBox<>(TargetClass.values()); | |
54 | + comboBox.setPreferredSize( | |
55 | + new Dimension(ParamField.MIN_FIELD_WIDTH, ParamField.FIELD_HEIGHT)); | |
56 | + comboBox.addActionListener(new ActionListener() { | |
57 | + | |
58 | + @Override | |
59 | + public void actionPerformed(ActionEvent e) { | |
60 | + update(); | |
61 | + } | |
62 | + }); | |
63 | + this.add(comboBox); | |
64 | + } | |
65 | + | |
66 | + /** | |
67 | + * This method is called each time the field is modified. | |
68 | + */ | |
69 | + public void update() { | |
70 | + TargetClass value = (TargetClass) comboBox.getSelectedItem(); | |
71 | + if (TargetClass.ALL.equals(value)) { | |
72 | + viewListener.onParameterRemoved(paramName); | |
73 | + } else { | |
74 | + viewListener.onParameterChanged(paramName, value.query()); | |
75 | + } | |
76 | + } | |
77 | + | |
78 | + | |
79 | + /** | |
80 | + * An enumeration of all available target classes. | |
81 | + * | |
82 | + * @author N. Jourdane | |
83 | + */ | |
84 | + @SuppressWarnings("javadoc") | |
85 | + enum TargetClass { | |
86 | + // @noformat | |
87 | + ALL("All"), COMET("Comet"), EXOPLANET("Exoplanet"), RING("Ring"), | |
88 | + SAMPLE("Sample"), SKY("Sky"), SPACECRAFT("Spacecraft"), SPACEJUNK("Spacejunk"), | |
89 | + STAR("Star"), INTERPLANETARY_MEDIUM("Interplanetary medium"); | |
90 | + // @format | |
91 | + | |
92 | + /** The name of the target class. */ | |
93 | + String name; | |
94 | + | |
95 | + | |
96 | + /** | |
97 | + * Method constructor for the enumeration. | |
98 | + * | |
99 | + * @param name The name of the target class. | |
100 | + */ | |
101 | + TargetClass(String name) { | |
102 | + this.name = name; | |
103 | + } | |
104 | + | |
105 | + /** | |
106 | + * @return The name formated for the query. | |
107 | + */ | |
108 | + String query() { | |
109 | + return name.replace(" ", "_").toLowerCase(); | |
110 | + } | |
111 | + } | |
112 | + | |
113 | +} | |
0 | 114 | \ No newline at end of file | ... | ... |
src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/paramfield/TargetNameField.java
0 → 100644
... | ... | @@ -0,0 +1,116 @@ |
1 | +/* | |
2 | + * This file is a part of EpnTAPClient. | |
3 | + * This program aims to provide EPN-TAP support for software clients, like CASSIS spectrum analyzer. | |
4 | + * See draft specifications: https://voparis-confluence.obspm.fr/pages/viewpage.action?pageId=559861 | |
5 | + * Copyright (C) 2016 Institut de Recherche en Astrophysique et Planétologie. | |
6 | + * | |
7 | + * This program is free software: you can | |
8 | + * redistribute it and/or modify it under the terms of the GNU General Public License as published | |
9 | + * by the Free Software Foundation, either version 3 of the License, or (at your option) any later | |
10 | + * version. This program is distributed in the hope that it will be useful, but WITHOUT ANY | |
11 | + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR | |
12 | + * PURPOSE. See the GNU General Public License for more details. You should have received a copy of | |
13 | + * the GNU General Public License along with this program. If not, see | |
14 | + * <http://www.gnu.org/licenses/>. | |
15 | + */ | |
16 | + | |
17 | +package eu.omp.irap.vespa.epntapclient.gui.requestpanel.paramfield; | |
18 | + | |
19 | +import java.awt.Dimension; | |
20 | +import java.util.logging.Level; | |
21 | + | |
22 | +import javax.swing.JComboBox; | |
23 | +import javax.swing.JTextField; | |
24 | +import javax.swing.SwingUtilities; | |
25 | + | |
26 | +import eu.omp.irap.vespa.epntapclient.EpnTapGet; | |
27 | +import eu.omp.irap.vespa.epntapclient.gui.mainPanel.ViewListener; | |
28 | +import eu.omp.irap.vespa.votable.utils.CantSendQueryException; | |
29 | + | |
30 | +/** | |
31 | + * The target name field is used only for the `target_name` parameter. It is a ComboBox which is | |
32 | + * automatically filled with actual target names which begins by the entered characters, by asking | |
33 | + * to an online resolver (RESOLVER_URL). The parameter is sent to the controller each time it is | |
34 | + * updated, so it is possible to enter a parameter that the resolver do not know. | |
35 | + * | |
36 | + * @author N. Jourdane | |
37 | + */ | |
38 | +public class TargetNameField extends ParamField implements TextFieldListener { | |
39 | + | |
40 | + /** The serial version UID. */ | |
41 | + private static final long serialVersionUID = 1L; | |
42 | + | |
43 | + /** The comboBox to enter the target_name and display target name propositions. */ | |
44 | + JComboBox<String> comboBox; | |
45 | + | |
46 | + /** The JTextField related to the ComboBox, allowing to listen for text content update. */ | |
47 | + JTextField field; | |
48 | + | |
49 | + /** | |
50 | + * The content of the last entered value. It is used to avoid recursions, because each time an | |
51 | + * update event is detected, the resolver is called and the ComboBox is filled with new values, | |
52 | + * which trigger a new event. | |
53 | + */ | |
54 | + String lastContent; | |
55 | + | |
56 | + | |
57 | + /** | |
58 | + * Method constructor | |
59 | + * | |
60 | + * @param mainView The main view of the application. | |
61 | + * @param paramName The name of the parameter. | |
62 | + */ | |
63 | + public TargetNameField(ViewListener viewListener, String paramName) { | |
64 | + super(viewListener, paramName); | |
65 | + comboBox = new JComboBox<>(); | |
66 | + comboBox.setPreferredSize( | |
67 | + new Dimension(ParamField.MIN_FIELD_WIDTH, ParamField.FIELD_HEIGHT)); | |
68 | + | |
69 | + comboBox.setEditable(true); | |
70 | + field = (JTextField) comboBox.getEditor().getEditorComponent(); | |
71 | + ParamField.addChangeListener(this, field); | |
72 | + this.add(comboBox); | |
73 | + } | |
74 | + | |
75 | + /** | |
76 | + * This method is called each time the field is modified. | |
77 | + */ | |
78 | + @Override | |
79 | + public void update(JTextField textField) { | |
80 | + SwingUtilities.invokeLater(updateComboBox); | |
81 | + } | |
82 | + | |
83 | + | |
84 | + /** | |
85 | + * This method is called each time the field is modified. A Runnable is used it is impossible to | |
86 | + * modify the comboBox from a DocumentEvent. | |
87 | + */ | |
88 | + Runnable updateComboBox = new Runnable() { | |
89 | + | |
90 | + @Override | |
91 | + public void run() { | |
92 | + String content = field.getText(); | |
93 | + if (!content.equals(lastContent)) { | |
94 | + if (content.length() >= 2) { | |
95 | + lastContent = content; | |
96 | + comboBox.removeAllItems(); | |
97 | + try { | |
98 | + for (String s : EpnTapGet.getTargetNames(content)) { | |
99 | + comboBox.addItem(s); | |
100 | + } | |
101 | + } catch (CantSendQueryException e) { | |
102 | + ParamField.logger.log(Level.WARNING, | |
103 | + "Can't get table names for the resolver", e); | |
104 | + } | |
105 | + comboBox.getEditor().setItem(content); | |
106 | + comboBox.showPopup(); | |
107 | + } | |
108 | + if (content.isEmpty()) { | |
109 | + viewListener.onParameterRemoved(paramName); | |
110 | + } else { | |
111 | + viewListener.onParameterChanged(paramName, content); | |
112 | + } | |
113 | + } | |
114 | + } | |
115 | + }; | |
116 | +} | |
0 | 117 | \ No newline at end of file | ... | ... |
src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/paramfield/TextFieldListener.java
0 → 100644
... | ... | @@ -0,0 +1,37 @@ |
1 | +/* | |
2 | + * This file is a part of EpnTAPClient. | |
3 | + * This program aims to provide EPN-TAP support for software clients, like CASSIS spectrum analyzer. | |
4 | + * See draft specifications: https://voparis-confluence.obspm.fr/pages/viewpage.action?pageId=559861 | |
5 | + * Copyright (C) 2016 Institut de Recherche en Astrophysique et Planétologie. | |
6 | + * | |
7 | + * This program is free software: you can | |
8 | + * redistribute it and/or modify it under the terms of the GNU General Public License as published | |
9 | + * by the Free Software Foundation, either version 3 of the License, or (at your option) any later | |
10 | + * version. This program is distributed in the hope that it will be useful, but WITHOUT ANY | |
11 | + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR | |
12 | + * PURPOSE. See the GNU General Public License for more details. You should have received a copy of | |
13 | + * the GNU General Public License along with this program. If not, see | |
14 | + * <http://www.gnu.org/licenses/>. | |
15 | + */ | |
16 | + | |
17 | +package eu.omp.irap.vespa.epntapclient.gui.requestpanel.paramfield; | |
18 | + | |
19 | +import javax.swing.JTextField; | |
20 | + | |
21 | +/** | |
22 | + * The listener of text field, it aims to provide a simple way to listen a text field without to | |
23 | + * override removeUpdate(DocumentEvent de), insertUpdate(DocumentEvent de) and | |
24 | + * changedUpdate(DocumentEvent de) on each field to listen. | |
25 | + * | |
26 | + * @author N. Jourdane | |
27 | + */ | |
28 | +interface TextFieldListener { | |
29 | + | |
30 | + /** | |
31 | + * When the content of the JTextField is updated. | |
32 | + * | |
33 | + * @param field The JTextField. Is useful for classes containing several text fields, such as | |
34 | + * DateRangeField, to know which one triggered the event. | |
35 | + */ | |
36 | + void update(JTextField field); | |
37 | +} | |
0 | 38 | \ No newline at end of file | ... | ... |