/* * 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.view; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.HashMap; import java.util.Map; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFormattedTextField; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import eu.omp.irap.vespa.epntapclient.utils.Queries; import eu.omp.irap.vespa.epntapclient.votable.controller.VOTableException; /** * @author N. Jourdane */ public class RequestView extends JPanel implements ActionListener { /** The logger for this class. */ private static final Logger logger = LogManager.getLogger(RequestView.class); /** The serial version UID (affected with a random number). */ private static final long serialVersionUID = 1262856496809315405L; /** The EPN-TAP main view. */ private EpnTapMainView mainView; /** The text area where the user put the query. */ private JTextArea queryArea; /** * The parameters fields for the request. */ private Map paramsFields; /** * The parameters fields for the request. */ private Map params; /** The height of the buttons panel. */ private static final int BUTTON_PANEL_HEIGHT = 15; /** * Method constructor * * @param mainView The EPN-TAP main view. */ public RequestView(EpnTapMainView mainView) { this.mainView = mainView; setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); // TODO: Get max row numberfrom the GUI params = new HashMap<>(); //@noformat params.put("target_name", "Galileo"); params.put("dataproduct_type", "sp"); params.put("minTime", new Float(0.0)); params.put("maxTime", new Float(0.0)); params.put("spectral_range_min", new Float(0.0)); params.put("spectral_range_max", new Float(0.0)); //@format this.add(buildParamPanel(), this); this.add(buildQueryPanel(), this); this.add(buildButtonPanel(), this); } /** * @return A JPanel containing graphical elements for the service parameters. */ private JPanel buildParamPanel() { paramsFields = new HashMap(); // TODO: Find a way to set numerical value to "" by default. // TODO: new GUI field column to allow the user to select the comparison operator: // - if the field is a String: listbox with 'xx', '%xx', 'xx%', and '%xx%'. // - if the field is a numeric value: listbox with <, <=, =, =>, >. for (Map.Entry param : params.entrySet()) { Class paramClass = param.getValue().getClass(); if (paramClass == String.class) { paramsFields.put(param.getKey(), new JTextField()); } else if (paramClass == Float.class) { paramsFields.put(param.getKey(), new JFormattedTextField(new Float(0))); } else if (paramClass == Integer.class) { paramsFields.put(param.getKey(), new JFormattedTextField(new Integer(0))); } else { logger.error("Unreconized parameter type " + param.getValue() + " for " + param.getKey() + "."); } } DocumentListener paramListener = new DocumentListener() { @Override public void insertUpdate(DocumentEvent de) { try { for (Map.Entry e : paramsFields.entrySet()) { Class paramClass = params.get(e.getKey()).getClass(); if (paramClass == String.class) { params.put(e.getKey(), e.getValue().getText()); } else if (paramClass == Float.class || paramClass == Integer.class) { params.put(e.getKey(), ((JFormattedTextField) e.getValue()).getValue()); } else { logger.error("Unreconized parameter type " + e.getValue() + " for " + paramClass + "."); } } updateQueryArea(); } catch (Exception e) { logger.error("Can not parse parameters.", e); } } @Override public void removeUpdate(DocumentEvent de) { insertUpdate(de); } @Override public void changedUpdate(DocumentEvent de) { insertUpdate(de); } }; JPanel paramPanel = new JPanel(new GridLayout(0, 2)); paramPanel.setBorder(BorderFactory.createTitledBorder("Query parameters")); for (Map.Entry e : paramsFields.entrySet()) { JLabel label = new JLabel(e.getKey()); paramPanel.add(label); e.getValue().getDocument().addDocumentListener(paramListener); // TODO: Add tooltip text based on rr.table_column.column_description paramPanel.add(e.getValue()); } return paramPanel; } /** * @return A JPanel containing graphical elements for the query. */ private JPanel buildQueryPanel() { JPanel queryPanel = new JPanel(); queryPanel.setBorder(BorderFactory.createTitledBorder("Query for the selected service(s)")); queryArea = new JTextArea(""); queryArea.setToolTipText("The query sent to the service(s)."); queryArea.setLineWrap(true); queryPanel.setLayout(new BorderLayout()); queryPanel.add(queryArea, BorderLayout.CENTER); return queryPanel; } /** * Update the query JTextArea according to the parameters values. */ public void updateQueryArea() { String tableName = mainView.getController().getSelectedTable(); queryArea.setText(Queries.getQuery(tableName, params, 10)); } /** * @return A JPanel containing the button(s). */ private JPanel buildButtonPanel() { JPanel buttonPanel = new JPanel(); JButton btnSend = new JButton("Send query"); btnSend.setName("btnSend"); btnSend.addActionListener(this); buttonPanel.add(btnSend); buttonPanel.setMaximumSize( new Dimension(EpnTapMainView.RIGHT_PANEL_WIDTH, BUTTON_PANEL_HEIGHT)); return buttonPanel; } @Override public void actionPerformed(ActionEvent evt) { if (((JButton) evt.getSource()).getName() == "btnSend") { try { mainView.getController().sendQuery(queryArea.getText()); } catch (VOTableException e) { logger.error("Can not send query when clicking on the send button.", e); } } } }