diff --git a/src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/ParamField.java b/src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/ParamField.java deleted file mode 100644 index a3c6e58..0000000 --- a/src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/ParamField.java +++ /dev/null @@ -1,664 +0,0 @@ -/* - * This file is a part of EpnTAPClient. - * This program aims to provide EPN-TAP support for software clients, like CASSIS spectrum analyzer. - * See draft specifications: https://voparis-confluence.obspm.fr/pages/viewpage.action?pageId=559861 - * Copyright (C) 2016 Institut de Recherche en Astrophysique et Planétologie. - * - * This program is free software: you can - * redistribute it and/or modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or (at your option) any later - * version. This program is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. You should have received a copy of - * the GNU General Public License along with this program. If not, see - * . - */ - -package eu.omp.irap.vespa.epntapclient.gui.requestpanel; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.text.DateFormat; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; -import java.util.logging.Level; -import java.util.logging.Logger; - -import javax.swing.BoxLayout; -import javax.swing.JComboBox; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JTextField; -import javax.swing.SwingUtilities; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; - -import eu.omp.irap.vespa.epntapclient.EpnTapGet; -import eu.omp.irap.vespa.epntapclient.gui.mainPanel.ViewListener; -import eu.omp.irap.vespa.votable.utils.CantSendQueryException; - -/** - * A field used to set a service parameter to build the query (in the parameter panel). ParamField - * is an abstract method and all type of parameter field should extend it. See - * https://voparis-confluence.obspm.fr/display/VES/4+-+EPN-TAP+queries to get all parameters - * details. - * - * @author N. Jourdane - */ -public abstract class ParamField extends JPanel { - - /** The serial version UID. */ - private static final long serialVersionUID = 1L; - - /** The logger for the class ParamField. */ - protected static final Logger logger = Logger.getLogger(ParamField.class.getName()); - - /** The minimum width of the field. */ - private static final int MIN_FIELD_WIDTH = 30; - - /** The preferred field height. */ - private static final int FIELD_HEIGHT = 20; - - /** The maximum width of the field. */ - private static final int MAX_FIELD_WIDTH = 400; - - /** The preferred label width. */ - private static final int LABEL_WIDTH = 140; - - /** The date format used in the DateRange field */ - private static final String DATE_FORMAT = "dd/MM/yyyy"; - - /** The regex used to validate the Date fields */ - 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)$)"; - - /** The suffix used in REG-TAP parameters names, indicating that it's a beginning of a range. */ - private static final String MIN_SUFFIX = "min"; - - /** The suffix used in REG-TAP parameters names, indicating that it is a end of a range. */ - private static final String MAX_SUFFIX = "max"; - - /** The main view of the application. */ - protected ViewListener viewListener; - - /** The parameter name of the field */ - protected String paramName; - - - /** - * Method constructor for the parameter field abstract class, which do all common action for all - * type of field, such as displaying the name of the parameter. - * - * @param mainView The main view of the application. - * @param paramName The name of the parameter. - */ - public ParamField(ViewListener viewListener, String paramName) { - super(); - - this.viewListener = viewListener; - this.paramName = paramName; - - buildParamField(); - } - - private void buildParamField() { - setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); - - setMaximumSize(new Dimension(ParamField.MAX_FIELD_WIDTH, ParamField.FIELD_HEIGHT)); - - String strLabel = paramName.replaceAll("_", " ").trim(); - JLabel label = new JLabel(strLabel.substring(0, 1).toUpperCase() + strLabel.substring(1)); - label.setPreferredSize(new Dimension(ParamField.LABEL_WIDTH, ParamField.FIELD_HEIGHT)); - - this.add(label); - } - - - /** - * The string field is used for parameter with a `String` class. It is a simple JTextField with - * no verification. The parameter is sent to the controller each time it is modified. - * - * @author N. Jourdane - */ - public static class StringField extends ParamField implements TextFieldListener { - - /** The serial version UID. */ - private static final long serialVersionUID = 1L; - - /** The JTextField used to put the parameter value. */ - JTextField field; - - - /** - * Method constructor for the string field. - * - * @param mainView The main view of the application. - * @param paramName The name of the parameter. - */ - public StringField(ViewListener viewListener, String paramName) { - super(viewListener, paramName); - field = new JTextField(); - ParamField.addChangeListener(this, field); - this.add(field); - } - - /** - * This method is called each time the field is modified. - */ - @Override - public void update(JTextField textField) { - if (textField.getText().isEmpty()) { - viewListener.onParameterChanged(paramName, null); - } else { - viewListener.onParameterChanged(paramName, textField.getText()); - } - } - } - - /** - * The float field is used for parameter with a `Float` class. It is a JTextField which checks - * if the content is a valid float. If the parameter is valid or if it is empty, then the float - * value is sent to the controller. - * - * @author N. Jourdane - */ - public static class FloatField extends ParamField implements TextFieldListener { - - /** The serial version UID. */ - private static final long serialVersionUID = 1L; - - /** The JTextField used to put the parameter value. */ - JTextField field; - - - /** - * Method constructor - * - * @param mainView The main view of the application. - * @param paramName The name of the parameter. - */ - public FloatField(ViewListener viewListener, String paramName) { - super(viewListener, paramName); - field = new JTextField(); - ParamField.addChangeListener(this, field); - this.add(field); - } - - /** - * This method is called each time the field is modified. - */ - @Override - public void update(JTextField textField) { - if (textField.getText().isEmpty()) { - textField.setBackground(Color.WHITE); - viewListener.onParameterRemoved(paramName); - } else { - try { - float value = Float.parseFloat(textField.getText()); - viewListener.onParameterChanged(paramName, value); - textField.setBackground(Color.WHITE); - } catch (@SuppressWarnings("unused") NumberFormatException e) { - textField.setBackground(Color.PINK); - } - } - } - } - - /** - * The date range field is used for couples of parameter with both a `Date` type (actually only - * `time_min` and `time_max` parameters is concerned for now). These are JTextFields which check - * if the content is a valid date, according to DATE_FORMAT. If the parameter is valid or if it - * is empty, then the dates value are sent to the controller, in Julian Day format. - * - * @author N. Jourdane - */ - public static class DateRangeField extends ParamField implements TextFieldListener { - - /** The serial version UID. */ - private static final long serialVersionUID = 1L; - - /** The JTextField used to put the parameter minimum value of the range. */ - JTextField fieldMin; - - /** The JTextField used to put the parameter maximum value of the range. */ - JTextField fieldMax; - - - /** - * Method constructor - * - * @param mainView The main view of the application. - * @param paramName The name of the parameter. - */ - public DateRangeField(ViewListener viewListener, String paramName) { - super(viewListener, paramName); - this.add(new JLabel("min ")); - fieldMin = new JTextField(); - fieldMin.setName(ParamField.MIN_SUFFIX); - fieldMin.setPreferredSize( - new Dimension(ParamField.MIN_FIELD_WIDTH, ParamField.FIELD_HEIGHT)); - ParamField.addChangeListener(this, fieldMin); - this.add(fieldMin); - - this.add(new JLabel("max ")); - fieldMax = new JTextField(); - fieldMax.setName(ParamField.MAX_SUFFIX); - fieldMax.setPreferredSize( - new Dimension(ParamField.MIN_FIELD_WIDTH, ParamField.FIELD_HEIGHT)); - ParamField.addChangeListener(this, fieldMin); - this.add(fieldMax); - } - - /** - * This method is called each time the field is modified. - */ - @Override - public void update(JTextField field) { - DateFormat df = new SimpleDateFormat(ParamField.DATE_FORMAT, Locale.ENGLISH); - if (field.getText().isEmpty()) { - field.setBackground(Color.WHITE); - viewListener.onParameterRemoved(paramName + field.getName()); - } else if (field.getText().matches(ParamField.DATE_REGEX)) { - try { - long date = df.parse(field.getText()).getTime(); - date = Math.round(date / 86400000.0 + 2440587.5); // to JD - viewListener.onParameterChanged(paramName + field.getName(), - date); - field.setBackground(Color.WHITE); - } catch (@SuppressWarnings("unused") ParseException e) { - field.setBackground(Color.PINK); - } - // TODO: check if date min < date max - } else { - field.setBackground(Color.PINK); - } - } - } - - /** - * The float range field is used for couples of parameter with both a `Float` class. These are - * JTextFields which check if the content is a valid float. If the parameter is valid or if it - * is empty, then the float value are sent to the controller. - * - * @author N. Jourdane - */ - public static class FloatRangeField extends ParamField implements TextFieldListener { - - /** The serial version UID. */ - private static final long serialVersionUID = 1L; - - /** The JTextField used to put the parameter minimum value of the range. */ - JTextField fieldMin; - - /** The JTextField used to put the parameter maximum value of the range. */ - JTextField fieldMax; - - - /** - * Method constructor - * - * @param mainView The main view of the application. - * @param paramName The name of the parameter. - */ - public FloatRangeField(ViewListener viewListener, String paramName) { - super(viewListener, paramName); - fieldMin = new JTextField(); - fieldMin.setName(ParamField.MIN_SUFFIX); - ParamField.addChangeListener(this, fieldMin); - this.add(fieldMin); - - fieldMax = new JTextField(); - fieldMax.setName(ParamField.MAX_SUFFIX); - ParamField.addChangeListener(this, fieldMax); - this.add(fieldMax); - } - - /** - * This method is called each time the field is modified. - */ - @Override - public void update(JTextField field) { - if (field.getText().isEmpty()) { - field.setBackground(Color.WHITE); - viewListener.onParameterRemoved(paramName + field.getName()); - } else { - try { - viewListener.onParameterChanged(paramName + field.getName(), - Float.parseFloat(field.getText())); - field.setBackground(Color.WHITE); - } catch (@SuppressWarnings("unused") NumberFormatException e) { - field.setBackground(Color.PINK); - } - } - } - } - - /** - * The target name field is used only for the `target_name` parameter. It is a ComboBox which is - * automatically filled with actual target names which begins by the entered characters, by - * asking to an online resolver (RESOLVER_URL). The parameter is sent to the controller each - * time it is updated, so it is possible to enter a parameter that the resolver do not know. - * - * @author N. Jourdane - */ - public static class TargetNameField extends ParamField implements TextFieldListener { - - /** The serial version UID. */ - private static final long serialVersionUID = 1L; - - /** The comboBox to enter the target_name and display target name propositions. */ - JComboBox comboBox; - - /** The JTextField related to the ComboBox, allowing to listen for text content update. */ - JTextField field; - - /** - * The content of the last entered value. It is used to avoid recursions, because each time - * an update event is detected, the resolver is called and the ComboBox is filled with new - * values, which trigger a new event. - */ - String lastContent; - - /** - * This method is called each time the field is modified. A Runnable is used it is - * impossible to modify the comboBox from a DocumentEvent. - */ - Runnable updateComboBox = new Runnable() { - - @Override - public void run() { - String content = field.getText(); - if (!content.equals(lastContent)) { - if (content.length() >= 2) { - lastContent = content; - comboBox.removeAllItems(); - try { - for (String s : EpnTapGet.getTargetNames(content)) { - comboBox.addItem(s); - } - } catch (CantSendQueryException e) { - ParamField.logger.log(Level.WARNING, - "Can't get table names for the resolver", e); - } - comboBox.getEditor().setItem(content); - comboBox.showPopup(); - } - if (content.isEmpty()) { - viewListener.onParameterRemoved(paramName); - } else { - viewListener.onParameterChanged(paramName, content); - } - } - } - }; - - - /** - * Method constructor - * - * @param mainView The main view of the application. - * @param paramName The name of the parameter. - */ - public TargetNameField(ViewListener viewListener, String paramName) { - super(viewListener, paramName); - comboBox = new JComboBox<>(); - comboBox.setPreferredSize( - new Dimension(ParamField.MIN_FIELD_WIDTH, ParamField.FIELD_HEIGHT)); - - comboBox.setEditable(true); - field = (JTextField) comboBox.getEditor().getEditorComponent(); - ParamField.addChangeListener(this, field); - this.add(comboBox); - } - - /** - * This method is called each time the field is modified. - */ - @Override - public void update(JTextField textField) { - SwingUtilities.invokeLater(updateComboBox); - } - } - - /** - * The data product type field is used only for the `dataproduct_type` parameter. It is a - * ComboBox filled with a list of static data product types (see - * https://voparis-confluence.obspm.fr/display/VES/4+-+EPN-TAP+queries#id-4-EPN-TAPqueries- - * __RefHeading__35_312326667_Toc3037660444.2.4DataProductType). The parameter is sent to the - * controller each time it is updated. - * - * @author N. Jourdane - */ - public static class DataProductTypeField extends ParamField { - - /** The serial version UID. */ - private static final long serialVersionUID = 1L; - - /** The comboBox used to select the data product type. */ - JComboBox comboBox; - - - /** - * An enumeration of all available data product types. Each values comes with an id because - * EPN-TAP table can possibly be filled with the id instead of the name, so the query have - * to ask for both of them. - * - * @author N. Jourdane - */ - @SuppressWarnings("javadoc") - enum DataProductType { - // @noformat - ALL("All", "all"), IM("Image", "im"), SP("Spectrum", "sp"), - DS("Dynamic spectrum", "ds"), SC("Spectral cube", "sc"), PR("Profile", "pr"), - VO("Volume", "vo"), MO("Movie", "mo"), CU("Cube", "cu"), - TS("Time series", "ts"), CA("Catalog", "ca"), SV("Spatial vector", "sv"); - // @format - - /** The full name of the data product type, such as `Dynamic spectrum`. */ - private String name = ""; - - /** The id of the data product type, such as `ds`. */ - private String id = ""; - - - /** - * Method constructor for the enumeration. - * - * @param name The full name of the data product type, such as `Dynamic spectrum`. - * @param id The id of the data product type, such as `ds`. - */ - DataProductType(String name, String id) { - this.name = name; - this.id = id; - } - - /** - * @return A list of two strings, containing the name (formated for the query) and the - * id, used in the query. A list is used instead of a array because the getQuery - * function ( @see Queries) needs to know the parameter type. - */ - public List query() { - List item = new ArrayList<>(); - item.add(name.replace(" ", "-").toLowerCase()); - item.add(id); - return item; - } - - @Override - public String toString() { - return name; - } - } - - - /** - * Method constructor - * - * @param mainView The main view of the application. - * @param paramName The name of the parameter. - */ - public DataProductTypeField(ViewListener viewListener, String paramName) { - super(viewListener, paramName); - comboBox = new JComboBox<>(DataProductType.values()); - comboBox.setSelectedItem(DataProductType.ALL); - comboBox.setPreferredSize( - new Dimension(ParamField.MIN_FIELD_WIDTH, ParamField.FIELD_HEIGHT)); - comboBox.addActionListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent e) { - update(); - } - }); - this.add(comboBox); - } - - /** - * This method is called each time the field is modified. - */ - void update() { - DataProductType item = (DataProductType) comboBox.getSelectedItem(); - if (DataProductType.ALL.equals(item)) { - viewListener.onParameterRemoved(paramName); - } else { - viewListener.onParameterChanged(paramName, item.query()); - } - } - } - - /** - * The target class field is used only for the `target_class` parameter. It is a ComboBox filled - * with a list of static target classes (see - * https://voparis-confluence.obspm.fr/display/VES/4+-+EPN-TAP+queries#id-4-EPN-TAPqueries- - * __RefHeading__39_312326667_Toc3037660464.2.6TargetClass). The parameter is sent to the - * controller each time it is updated. - * - * @author N. Jourdane - */ - public static class TargetClassField extends ParamField { - - /** The serial version UID. */ - private static final long serialVersionUID = 1L; - - /** The comboBox used to select the target class. */ - JComboBox comboBox; - - - /** - * An enumeration of all available target classes. - * - * @author N. Jourdane - */ - @SuppressWarnings("javadoc") - enum TargetClass { - // @noformat - ALL("All"), COMET("Comet"), EXOPLANET("Exoplanet"), RING("Ring"), - SAMPLE("Sample"), SKY("Sky"), SPACECRAFT("Spacecraft"), SPACEJUNK("Spacejunk"), - STAR("Star"), INTERPLANETARY_MEDIUM("Interplanetary medium"); - // @format - - /** The name of the target class. */ - String name; - - - /** - * Method constructor for the enumeration. - * - * @param name The name of the target class. - */ - TargetClass(String name) { - this.name = name; - } - - /** - * @return The name formated for the query. - */ - String query() { - return name.replace(" ", "_").toLowerCase(); - } - } - - - /** - * Method constructor - * - * @param mainView The main view of the application. - * @param paramName The name of the parameter. - */ - public TargetClassField(ViewListener viewListener, String paramName) { - super(viewListener, paramName); - comboBox = new JComboBox<>(TargetClass.values()); - comboBox.setPreferredSize( - new Dimension(ParamField.MIN_FIELD_WIDTH, ParamField.FIELD_HEIGHT)); - comboBox.addActionListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent e) { - update(); - } - }); - this.add(comboBox); - } - - /** - * This method is called each time the field is modified. - */ - void update() { - TargetClass value = (TargetClass) comboBox.getSelectedItem(); - if (TargetClass.ALL.equals(value)) { - viewListener.onParameterRemoved(paramName); - } else { - viewListener.onParameterChanged(paramName, value.query()); - } - } - } - - /** - * The listener of text field, it aims to provide a simple way to listen a text field without to - * override removeUpdate(DocumentEvent de), insertUpdate(DocumentEvent de) and - * changedUpdate(DocumentEvent de) on each field to listen. - * - * @author N. Jourdane - */ - interface TextFieldListener { - - /** - * When the content of the JTextField is updated. - * - * @param field The JTextField. Is useful for classes containing several text fields, such - * as DateRangeField, to know which one triggered the event. - */ - void update(JTextField field); - } - - - /** - * To add the listener. @see TextFieldListener - * - * @param changeListener The listener of text fields. - * @param field The field to listen. - */ - static void addChangeListener(final TextFieldListener changeListener, final JTextField field) { - field.getDocument().addDocumentListener(new DocumentListener() { - - @Override - public void removeUpdate(DocumentEvent de) { - changeListener.update(field); - } - - @Override - public void insertUpdate(DocumentEvent de) { - changeListener.update(field); - } - - @Override - public void changedUpdate(DocumentEvent de) { - changeListener.update(field); - } - }); - } -} \ No newline at end of file diff --git a/src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/RequestPanelView.java b/src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/RequestPanelView.java index 43f937e..5cbc302 100644 --- a/src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/RequestPanelView.java +++ b/src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/RequestPanelView.java @@ -30,10 +30,11 @@ import javax.swing.JPanel; import javax.swing.JTextArea; import eu.omp.irap.vespa.epntapclient.gui.mainPanel.ViewListener; -import eu.omp.irap.vespa.epntapclient.gui.requestpanel.ParamField.DataProductTypeField; -import eu.omp.irap.vespa.epntapclient.gui.requestpanel.ParamField.DateRangeField; -import eu.omp.irap.vespa.epntapclient.gui.requestpanel.ParamField.FloatRangeField; -import eu.omp.irap.vespa.epntapclient.gui.requestpanel.ParamField.TargetNameField; +import eu.omp.irap.vespa.epntapclient.gui.requestpanel.paramfield.DataProductTypeField; +import eu.omp.irap.vespa.epntapclient.gui.requestpanel.paramfield.DateRangeField; +import eu.omp.irap.vespa.epntapclient.gui.requestpanel.paramfield.FloatRangeField; +import eu.omp.irap.vespa.epntapclient.gui.requestpanel.paramfield.ParamField; +import eu.omp.irap.vespa.epntapclient.gui.requestpanel.paramfield.TargetNameField; /** * The view of the panel where the user builds the query. diff --git a/src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/paramfield/DataProductTypeField.java b/src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/paramfield/DataProductTypeField.java new file mode 100644 index 0000000..5d4618b --- /dev/null +++ b/src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/paramfield/DataProductTypeField.java @@ -0,0 +1,136 @@ +/* + * This file is a part of EpnTAPClient. + * This program aims to provide EPN-TAP support for software clients, like CASSIS spectrum analyzer. + * See draft specifications: https://voparis-confluence.obspm.fr/pages/viewpage.action?pageId=559861 + * Copyright (C) 2016 Institut de Recherche en Astrophysique et Planétologie. + * + * This program is free software: you can + * redistribute it and/or modify it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, or (at your option) any later + * version. This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. You should have received a copy of + * the GNU General Public License along with this program. If not, see + * . + */ + +package eu.omp.irap.vespa.epntapclient.gui.requestpanel.paramfield; + +import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JComboBox; + +import eu.omp.irap.vespa.epntapclient.gui.mainPanel.ViewListener; + +/** + * The data product type field is used only for the `dataproduct_type` parameter. It is a ComboBox + * filled with a list of static data product types (see + * https://voparis-confluence.obspm.fr/display/VES/4+-+EPN-TAP+queries#id-4-EPN-TAPqueries- + * __RefHeading__35_312326667_Toc3037660444.2.4DataProductType). The parameter is sent to the + * controller each time it is updated. + * + * @author N. Jourdane + */ +public class DataProductTypeField extends ParamField { + + /** The serial version UID. */ + private static final long serialVersionUID = 1L; + + /** The comboBox used to select the data product type. */ + JComboBox comboBox; + + + /** + * Method constructor + * + * @param mainView The main view of the application. + * @param paramName The name of the parameter. + */ + public DataProductTypeField(ViewListener viewListener, String paramName) { + super(viewListener, paramName); + comboBox = new JComboBox<>(DataProductType.values()); + comboBox.setSelectedItem(DataProductType.ALL); + comboBox.setPreferredSize( + new Dimension(ParamField.MIN_FIELD_WIDTH, ParamField.FIELD_HEIGHT)); + + comboBox.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + update(); + } + }); + + this.add(comboBox); + } + + /** + * This method is called each time the field is modified. + */ + public void update() { + DataProductType item = (DataProductType) comboBox.getSelectedItem(); + if (DataProductType.ALL.equals(item)) { + viewListener.onParameterRemoved(paramName); + } else { + viewListener.onParameterChanged(paramName, item.query()); + } + } + + + /** + * An enumeration of all available data product types. Each values comes with an id because + * EPN-TAP table can possibly be filled with the id instead of the name, so the query have to + * ask for both of them. + * + * @author N. Jourdane + */ + @SuppressWarnings("javadoc") + enum DataProductType { + // @noformat + ALL("All", "all"), IM("Image", "im"), SP("Spectrum", "sp"), + DS("Dynamic spectrum", "ds"), SC("Spectral cube", "sc"), PR("Profile", "pr"), + VO("Volume", "vo"), MO("Movie", "mo"), CU("Cube", "cu"), + TS("Time series", "ts"), CA("Catalog", "ca"), SV("Spatial vector", "sv"); + // @format + + /** The full name of the data product type, such as `Dynamic spectrum`. */ + private String name = ""; + + /** The id of the data product type, such as `ds`. */ + private String id = ""; + + + /** + * Method constructor for the enumeration. + * + * @param name The full name of the data product type, such as `Dynamic spectrum`. + * @param id The id of the data product type, such as `ds`. + */ + DataProductType(String name, String id) { + this.name = name; + this.id = id; + } + + /** + * @return A list of two strings, containing the name (formated for the query) and the id, + * used in the query. A list is used instead of a array because the getQuery + * function ( @see Queries) needs to know the parameter type. + */ + public List query() { + List item = new ArrayList<>(); + item.add(name.replace(" ", "-").toLowerCase()); + item.add(id); + return item; + } + + @Override + public String toString() { + return name; + } + } + +} \ No newline at end of file diff --git a/src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/paramfield/DateRangeField.java b/src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/paramfield/DateRangeField.java new file mode 100644 index 0000000..1a0dd68 --- /dev/null +++ b/src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/paramfield/DateRangeField.java @@ -0,0 +1,106 @@ +/* + * This file is a part of EpnTAPClient. + * This program aims to provide EPN-TAP support for software clients, like CASSIS spectrum analyzer. + * See draft specifications: https://voparis-confluence.obspm.fr/pages/viewpage.action?pageId=559861 + * Copyright (C) 2016 Institut de Recherche en Astrophysique et Planétologie. + * + * This program is free software: you can + * redistribute it and/or modify it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, or (at your option) any later + * version. This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. You should have received a copy of + * the GNU General Public License along with this program. If not, see + * . + */ + +package eu.omp.irap.vespa.epntapclient.gui.requestpanel.paramfield; + +import java.awt.Color; +import java.awt.Dimension; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Locale; + +import javax.swing.JLabel; +import javax.swing.JTextField; + +import eu.omp.irap.vespa.epntapclient.gui.mainPanel.ViewListener; + +/** + * The date range field is used for couples of parameter with both a `Date` type (actually only + * `time_min` and `time_max` parameters is concerned for now). These are JTextFields which check if + * the content is a valid date, according to DATE_FORMAT. If the parameter is valid or if it is + * empty, then the dates value are sent to the controller, in Julian Day format. + * + * @author N. Jourdane + */ +public class DateRangeField extends ParamField implements TextFieldListener { + + /** The serial version UID. */ + private static final long serialVersionUID = 1L; + + /** The date format used in the DateRange field */ + private static final String DATE_FORMAT = "dd/MM/yyyy"; + + /** The regex used to validate the Date fields */ + 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)$)"; + + /** The JTextField used to put the parameter minimum value of the range. */ + JTextField fieldMin; + + /** The JTextField used to put the parameter maximum value of the range. */ + JTextField fieldMax; + + + /** + * Method constructor + * + * @param mainView The main view of the application. + * @param paramName The name of the parameter. + */ + public DateRangeField(ViewListener viewListener, String paramName) { + super(viewListener, paramName); + this.add(new JLabel("min ")); + fieldMin = new JTextField(); + fieldMin.setName(MIN_SUFFIX); + fieldMin.setPreferredSize( + new Dimension(MIN_FIELD_WIDTH, FIELD_HEIGHT)); + addChangeListener(this, fieldMin); + this.add(fieldMin); + + this.add(new JLabel("max ")); + fieldMax = new JTextField(); + fieldMax.setName(MAX_SUFFIX); + fieldMax.setPreferredSize( + new Dimension(MIN_FIELD_WIDTH, FIELD_HEIGHT)); + addChangeListener(this, fieldMin); + this.add(fieldMax); + } + + /** + * This method is called each time the field is modified. + */ + @Override + public void update(JTextField field) { + DateFormat df = new SimpleDateFormat(DATE_FORMAT, Locale.ENGLISH); + if (field.getText().isEmpty()) { + field.setBackground(Color.WHITE); + viewListener.onParameterRemoved(paramName + field.getName()); + } 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 + viewListener.onParameterChanged(paramName + field.getName(), + date); + field.setBackground(Color.WHITE); + } catch (@SuppressWarnings("unused") ParseException e) { + field.setBackground(Color.PINK); + } + // TODO: check if date min < date max + } else { + field.setBackground(Color.PINK); + } + } +} \ No newline at end of file diff --git a/src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/paramfield/FloatField.java b/src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/paramfield/FloatField.java new file mode 100644 index 0000000..da64868 --- /dev/null +++ b/src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/paramfield/FloatField.java @@ -0,0 +1,72 @@ +/* + * This file is a part of EpnTAPClient. + * This program aims to provide EPN-TAP support for software clients, like CASSIS spectrum analyzer. + * See draft specifications: https://voparis-confluence.obspm.fr/pages/viewpage.action?pageId=559861 + * Copyright (C) 2016 Institut de Recherche en Astrophysique et Planétologie. + * + * This program is free software: you can + * redistribute it and/or modify it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, or (at your option) any later + * version. This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. You should have received a copy of + * the GNU General Public License along with this program. If not, see + * . + */ + +package eu.omp.irap.vespa.epntapclient.gui.requestpanel.paramfield; + +import java.awt.Color; + +import javax.swing.JTextField; + +import eu.omp.irap.vespa.epntapclient.gui.mainPanel.ViewListener; + +/** + * The float field is used for parameter with a `Float` class. It is a JTextField which checks if + * the content is a valid float. If the parameter is valid or if it is empty, then the float value + * is sent to the controller. + * + * @author N. Jourdane + */ +public class FloatField extends ParamField implements TextFieldListener { + + /** The serial version UID. */ + private static final long serialVersionUID = 1L; + + /** The JTextField used to put the parameter value. */ + JTextField field; + + + /** + * Method constructor + * + * @param mainView The main view of the application. + * @param paramName The name of the parameter. + */ + public FloatField(ViewListener viewListener, String paramName) { + super(viewListener, paramName); + field = new JTextField(); + ParamField.addChangeListener(this, field); + this.add(field); + } + + /** + * This method is called each time the field is modified. + */ + @Override + public void update(JTextField textField) { + if (textField.getText().isEmpty()) { + textField.setBackground(Color.WHITE); + viewListener.onParameterRemoved(paramName); + } else { + try { + float value = Float.parseFloat(textField.getText()); + viewListener.onParameterChanged(paramName, value); + textField.setBackground(Color.WHITE); + } catch (@SuppressWarnings("unused") NumberFormatException e) { + textField.setBackground(Color.PINK); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/paramfield/FloatRangeField.java b/src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/paramfield/FloatRangeField.java new file mode 100644 index 0000000..9958255 --- /dev/null +++ b/src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/paramfield/FloatRangeField.java @@ -0,0 +1,81 @@ +/* + * This file is a part of EpnTAPClient. + * This program aims to provide EPN-TAP support for software clients, like CASSIS spectrum analyzer. + * See draft specifications: https://voparis-confluence.obspm.fr/pages/viewpage.action?pageId=559861 + * Copyright (C) 2016 Institut de Recherche en Astrophysique et Planétologie. + * + * This program is free software: you can + * redistribute it and/or modify it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, or (at your option) any later + * version. This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. You should have received a copy of + * the GNU General Public License along with this program. If not, see + * . + */ + +package eu.omp.irap.vespa.epntapclient.gui.requestpanel.paramfield; + +import java.awt.Color; + +import javax.swing.JTextField; + +import eu.omp.irap.vespa.epntapclient.gui.mainPanel.ViewListener; + +/** + * The float range field is used for couples of parameter with both a `Float` class. These are + * JTextFields which check if the content is a valid float. If the parameter is valid or if it is + * empty, then the float value are sent to the controller. + * + * @author N. Jourdane + */ +public class FloatRangeField extends ParamField implements TextFieldListener { + + /** The serial version UID. */ + private static final long serialVersionUID = 1L; + + /** The JTextField used to put the parameter minimum value of the range. */ + JTextField fieldMin; + + /** The JTextField used to put the parameter maximum value of the range. */ + JTextField fieldMax; + + + /** + * Method constructor + * + * @param mainView The main view of the application. + * @param paramName The name of the parameter. + */ + public FloatRangeField(ViewListener viewListener, String paramName) { + super(viewListener, paramName); + fieldMin = new JTextField(); + fieldMin.setName(ParamField.MIN_SUFFIX); + ParamField.addChangeListener(this, fieldMin); + this.add(fieldMin); + + fieldMax = new JTextField(); + fieldMax.setName(ParamField.MAX_SUFFIX); + ParamField.addChangeListener(this, fieldMax); + this.add(fieldMax); + } + + /** + * This method is called each time the field is modified. + */ + @Override + public void update(JTextField field) { + if (field.getText().isEmpty()) { + field.setBackground(Color.WHITE); + viewListener.onParameterRemoved(paramName + field.getName()); + } else { + try { + viewListener.onParameterChanged(paramName + field.getName(), + Float.parseFloat(field.getText())); + field.setBackground(Color.WHITE); + } catch (@SuppressWarnings("unused") NumberFormatException e) { + field.setBackground(Color.PINK); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/paramfield/ParamField.java b/src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/paramfield/ParamField.java new file mode 100644 index 0000000..02b4197 --- /dev/null +++ b/src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/paramfield/ParamField.java @@ -0,0 +1,127 @@ +/* + * This file is a part of EpnTAPClient. + * This program aims to provide EPN-TAP support for software clients, like CASSIS spectrum analyzer. + * See draft specifications: https://voparis-confluence.obspm.fr/pages/viewpage.action?pageId=559861 + * Copyright (C) 2016 Institut de Recherche en Astrophysique et Planétologie. + * + * This program is free software: you can + * redistribute it and/or modify it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, or (at your option) any later + * version. This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. You should have received a copy of + * the GNU General Public License along with this program. If not, see + * . + */ + +package eu.omp.irap.vespa.epntapclient.gui.requestpanel.paramfield; + +import java.awt.Dimension; +import java.util.logging.Logger; + +import javax.swing.BoxLayout; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; + +import eu.omp.irap.vespa.epntapclient.gui.mainPanel.ViewListener; + +/** + * A field used to set a service parameter to build the query (in the parameter panel). ParamField + * is an abstract method and all type of parameter field should extend it. See + * https://voparis-confluence.obspm.fr/display/VES/4+-+EPN-TAP+queries to get all parameters + * details. + * + * @author N. Jourdane + */ +public abstract class ParamField extends JPanel { + + /** The serial version UID. */ + private static final long serialVersionUID = 1L; + + /** The logger for the class ParamField. */ + static final Logger logger = Logger.getLogger(ParamField.class.getName()); + + /** The minimum width of the field. */ + static final int MIN_FIELD_WIDTH = 30; + + /** The preferred field height. */ + static final int FIELD_HEIGHT = 20; + + /** The maximum width of the field. */ + static final int MAX_FIELD_WIDTH = 400; + + /** The preferred label width. */ + static final int LABEL_WIDTH = 140; + + /** The suffix used in REG-TAP parameters names, indicating that it's a beginning of a range. */ + static final String MIN_SUFFIX = "min"; + + /** The suffix used in REG-TAP parameters names, indicating that it is a end of a range. */ + static final String MAX_SUFFIX = "max"; + + /** The main view of the application. */ + ViewListener viewListener; + + /** The parameter name of the field */ + String paramName; + + + /** + * Method constructor for the parameter field abstract class, which do all common action for all + * type of field, such as displaying the name of the parameter. + * + * @param mainView The main view of the application. + * @param paramName The name of the parameter. + */ + public ParamField(ViewListener viewListener, String paramName) { + super(); + + this.viewListener = viewListener; + this.paramName = paramName; + + buildParamField(); + } + + private void buildParamField() { + setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); + + setMaximumSize(new Dimension(ParamField.MAX_FIELD_WIDTH, ParamField.FIELD_HEIGHT)); + + String strLabel = paramName.replaceAll("_", " ").trim(); + JLabel label = new JLabel(strLabel.substring(0, 1).toUpperCase() + strLabel.substring(1)); + label.setPreferredSize(new Dimension(ParamField.LABEL_WIDTH, ParamField.FIELD_HEIGHT)); + + this.add(label); + } + + /** + * To add the listener. @see TextFieldListener + * + * @param changeListener The listener of text fields. + * @param field The field to listen. + */ + static void addChangeListener(final TextFieldListener changeListener, final JTextField field) { + + field.getDocument().addDocumentListener(new DocumentListener() { + + @Override + public void removeUpdate(DocumentEvent de) { + changeListener.update(field); + } + + @Override + public void insertUpdate(DocumentEvent de) { + changeListener.update(field); + } + + @Override + public void changedUpdate(DocumentEvent de) { + changeListener.update(field); + } + + }); + } +} \ No newline at end of file diff --git a/src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/paramfield/StringField.java b/src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/paramfield/StringField.java new file mode 100644 index 0000000..f7b5a8c --- /dev/null +++ b/src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/paramfield/StringField.java @@ -0,0 +1,62 @@ +/* + * This file is a part of EpnTAPClient. + * This program aims to provide EPN-TAP support for software clients, like CASSIS spectrum analyzer. + * See draft specifications: https://voparis-confluence.obspm.fr/pages/viewpage.action?pageId=559861 + * Copyright (C) 2016 Institut de Recherche en Astrophysique et Planétologie. + * + * This program is free software: you can + * redistribute it and/or modify it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, or (at your option) any later + * version. This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. You should have received a copy of + * the GNU General Public License along with this program. If not, see + * . + */ + +package eu.omp.irap.vespa.epntapclient.gui.requestpanel.paramfield; + +import javax.swing.JTextField; + +import eu.omp.irap.vespa.epntapclient.gui.mainPanel.ViewListener; + +/** + * The string field is used for parameter with a `String` class. It is a simple JTextField with no + * verification. The parameter is sent to the controller each time it is modified. + * + * @author N. Jourdane + */ +public class StringField extends ParamField implements TextFieldListener { + + /** The serial version UID. */ + private static final long serialVersionUID = 1L; + + /** The JTextField used to put the parameter value. */ + JTextField field; + + + /** + * Method constructor for the string field. + * + * @param mainView The main view of the application. + * @param paramName The name of the parameter. + */ + public StringField(ViewListener viewListener, String paramName) { + super(viewListener, paramName); + field = new JTextField(); + ParamField.addChangeListener(this, field); + this.add(field); + } + + /** + * This method is called each time the field is modified. + */ + @Override + public void update(JTextField textField) { + if (textField.getText().isEmpty()) { + viewListener.onParameterChanged(paramName, null); + } else { + viewListener.onParameterChanged(paramName, textField.getText()); + } + } +} \ No newline at end of file diff --git a/src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/paramfield/TargetClassField.java b/src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/paramfield/TargetClassField.java new file mode 100644 index 0000000..8d4aab9 --- /dev/null +++ b/src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/paramfield/TargetClassField.java @@ -0,0 +1,113 @@ +/* + * This file is a part of EpnTAPClient. + * This program aims to provide EPN-TAP support for software clients, like CASSIS spectrum analyzer. + * See draft specifications: https://voparis-confluence.obspm.fr/pages/viewpage.action?pageId=559861 + * Copyright (C) 2016 Institut de Recherche en Astrophysique et Planétologie. + * + * This program is free software: you can + * redistribute it and/or modify it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, or (at your option) any later + * version. This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. You should have received a copy of + * the GNU General Public License along with this program. If not, see + * . + */ + +package eu.omp.irap.vespa.epntapclient.gui.requestpanel.paramfield; + +import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.JComboBox; + +import eu.omp.irap.vespa.epntapclient.gui.mainPanel.ViewListener; + +/** + * The target class field is used only for the `target_class` parameter. It is a ComboBox filled + * with a list of static target classes (see + * https://voparis-confluence.obspm.fr/display/VES/4+-+EPN-TAP+queries#id-4-EPN-TAPqueries- + * __RefHeading__39_312326667_Toc3037660464.2.6TargetClass). The parameter is sent to the controller + * each time it is updated. + * + * @author N. Jourdane + */ +public class TargetClassField extends ParamField { + + /** The serial version UID. */ + private static final long serialVersionUID = 1L; + + /** The comboBox used to select the target class. */ + JComboBox comboBox; + + + /** + * Method constructor + * + * @param mainView The main view of the application. + * @param paramName The name of the parameter. + */ + public TargetClassField(ViewListener viewListener, String paramName) { + super(viewListener, paramName); + comboBox = new JComboBox<>(TargetClass.values()); + comboBox.setPreferredSize( + new Dimension(ParamField.MIN_FIELD_WIDTH, ParamField.FIELD_HEIGHT)); + comboBox.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + update(); + } + }); + this.add(comboBox); + } + + /** + * This method is called each time the field is modified. + */ + public void update() { + TargetClass value = (TargetClass) comboBox.getSelectedItem(); + if (TargetClass.ALL.equals(value)) { + viewListener.onParameterRemoved(paramName); + } else { + viewListener.onParameterChanged(paramName, value.query()); + } + } + + + /** + * An enumeration of all available target classes. + * + * @author N. Jourdane + */ + @SuppressWarnings("javadoc") + enum TargetClass { + // @noformat + ALL("All"), COMET("Comet"), EXOPLANET("Exoplanet"), RING("Ring"), + SAMPLE("Sample"), SKY("Sky"), SPACECRAFT("Spacecraft"), SPACEJUNK("Spacejunk"), + STAR("Star"), INTERPLANETARY_MEDIUM("Interplanetary medium"); + // @format + + /** The name of the target class. */ + String name; + + + /** + * Method constructor for the enumeration. + * + * @param name The name of the target class. + */ + TargetClass(String name) { + this.name = name; + } + + /** + * @return The name formated for the query. + */ + String query() { + return name.replace(" ", "_").toLowerCase(); + } + } + +} \ No newline at end of file diff --git a/src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/paramfield/TargetNameField.java b/src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/paramfield/TargetNameField.java new file mode 100644 index 0000000..8bbdf9a --- /dev/null +++ b/src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/paramfield/TargetNameField.java @@ -0,0 +1,116 @@ +/* + * This file is a part of EpnTAPClient. + * This program aims to provide EPN-TAP support for software clients, like CASSIS spectrum analyzer. + * See draft specifications: https://voparis-confluence.obspm.fr/pages/viewpage.action?pageId=559861 + * Copyright (C) 2016 Institut de Recherche en Astrophysique et Planétologie. + * + * This program is free software: you can + * redistribute it and/or modify it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, or (at your option) any later + * version. This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. You should have received a copy of + * the GNU General Public License along with this program. If not, see + * . + */ + +package eu.omp.irap.vespa.epntapclient.gui.requestpanel.paramfield; + +import java.awt.Dimension; +import java.util.logging.Level; + +import javax.swing.JComboBox; +import javax.swing.JTextField; +import javax.swing.SwingUtilities; + +import eu.omp.irap.vespa.epntapclient.EpnTapGet; +import eu.omp.irap.vespa.epntapclient.gui.mainPanel.ViewListener; +import eu.omp.irap.vespa.votable.utils.CantSendQueryException; + +/** + * The target name field is used only for the `target_name` parameter. It is a ComboBox which is + * automatically filled with actual target names which begins by the entered characters, by asking + * to an online resolver (RESOLVER_URL). The parameter is sent to the controller each time it is + * updated, so it is possible to enter a parameter that the resolver do not know. + * + * @author N. Jourdane + */ +public class TargetNameField extends ParamField implements TextFieldListener { + + /** The serial version UID. */ + private static final long serialVersionUID = 1L; + + /** The comboBox to enter the target_name and display target name propositions. */ + JComboBox comboBox; + + /** The JTextField related to the ComboBox, allowing to listen for text content update. */ + JTextField field; + + /** + * The content of the last entered value. It is used to avoid recursions, because each time an + * update event is detected, the resolver is called and the ComboBox is filled with new values, + * which trigger a new event. + */ + String lastContent; + + + /** + * Method constructor + * + * @param mainView The main view of the application. + * @param paramName The name of the parameter. + */ + public TargetNameField(ViewListener viewListener, String paramName) { + super(viewListener, paramName); + comboBox = new JComboBox<>(); + comboBox.setPreferredSize( + new Dimension(ParamField.MIN_FIELD_WIDTH, ParamField.FIELD_HEIGHT)); + + comboBox.setEditable(true); + field = (JTextField) comboBox.getEditor().getEditorComponent(); + ParamField.addChangeListener(this, field); + this.add(comboBox); + } + + /** + * This method is called each time the field is modified. + */ + @Override + public void update(JTextField textField) { + SwingUtilities.invokeLater(updateComboBox); + } + + + /** + * This method is called each time the field is modified. A Runnable is used it is impossible to + * modify the comboBox from a DocumentEvent. + */ + Runnable updateComboBox = new Runnable() { + + @Override + public void run() { + String content = field.getText(); + if (!content.equals(lastContent)) { + if (content.length() >= 2) { + lastContent = content; + comboBox.removeAllItems(); + try { + for (String s : EpnTapGet.getTargetNames(content)) { + comboBox.addItem(s); + } + } catch (CantSendQueryException e) { + ParamField.logger.log(Level.WARNING, + "Can't get table names for the resolver", e); + } + comboBox.getEditor().setItem(content); + comboBox.showPopup(); + } + if (content.isEmpty()) { + viewListener.onParameterRemoved(paramName); + } else { + viewListener.onParameterChanged(paramName, content); + } + } + } + }; +} \ No newline at end of file diff --git a/src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/paramfield/TextFieldListener.java b/src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/paramfield/TextFieldListener.java new file mode 100644 index 0000000..adddf01 --- /dev/null +++ b/src/main/java/eu/omp/irap/vespa/epntapclient/gui/requestpanel/paramfield/TextFieldListener.java @@ -0,0 +1,37 @@ +/* + * This file is a part of EpnTAPClient. + * This program aims to provide EPN-TAP support for software clients, like CASSIS spectrum analyzer. + * See draft specifications: https://voparis-confluence.obspm.fr/pages/viewpage.action?pageId=559861 + * Copyright (C) 2016 Institut de Recherche en Astrophysique et Planétologie. + * + * This program is free software: you can + * redistribute it and/or modify it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, or (at your option) any later + * version. This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. You should have received a copy of + * the GNU General Public License along with this program. If not, see + * . + */ + +package eu.omp.irap.vespa.epntapclient.gui.requestpanel.paramfield; + +import javax.swing.JTextField; + +/** + * The listener of text field, it aims to provide a simple way to listen a text field without to + * override removeUpdate(DocumentEvent de), insertUpdate(DocumentEvent de) and + * changedUpdate(DocumentEvent de) on each field to listen. + * + * @author N. Jourdane + */ +interface TextFieldListener { + + /** + * When the content of the JTextField is updated. + * + * @param field The JTextField. Is useful for classes containing several text fields, such as + * DateRangeField, to know which one triggered the event. + */ + void update(JTextField field); +} \ No newline at end of file -- libgit2 0.21.2