/*
* #%L
* gitools-ui-app
* %%
* Copyright (C) 2013 Universitat Pompeu Fabra - Biomedical Genomics group
* %%
* 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
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
package org.gitools.ui.app.datasources.biomart.filter;
import org.gitools.datasources.biomart.restful.model.Filter;
import org.gitools.datasources.biomart.restful.model.FilterDescription;
import org.gitools.datasources.biomart.restful.model.Option;
import org.gitools.ui.core.Application;
import org.gitools.ui.core.utils.FileChooserUtils;
import org.gitools.ui.platform.dialog.ExceptionGlassPane;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class FilterTextComponent extends FilterComponent {
private String component;
private final Integer FIELD_HEIGHT = 45;
private final Integer TEXTAREA_HEIGHT = 130;
FilterTextComponent(FilterDescription d, FilterDescriptionPanel parent) {
super(d, parent);
initComponents();
buildComponent();
}
FilterTextComponent(Option o) {
super(o);
initComponents();
buildComponent();
}
/**
* This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jLabel1 = new javax.swing.JLabel();
txtField = new javax.swing.JTextField();
jScrollPane1 = new javax.swing.JScrollPane();
txtArea = new javax.swing.JTextArea();
nameDescription = new javax.swing.JLabel();
browsePanel = new javax.swing.JPanel();
folder = new javax.swing.JTextField();
browse = new javax.swing.JButton();
jLabel1.setText("jLabel1");
txtArea.setColumns(20);
txtArea.setRows(5);
jScrollPane1.setViewportView(txtArea);
nameDescription.setText("Name");
folder.setEnabled(false);
browse.setLabel("Browse...");
browse.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
selectFileAction(evt);
}
});
javax.swing.GroupLayout browsePanelLayout = new javax.swing.GroupLayout(browsePanel);
browsePanel.setLayout(browsePanelLayout);
browsePanelLayout.setHorizontalGroup(browsePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(javax.swing.GroupLayout.Alignment.TRAILING, browsePanelLayout.createSequentialGroup().addComponent(folder, javax.swing.GroupLayout.DEFAULT_SIZE, 282, Short.MAX_VALUE).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED).addComponent(browse)));
browsePanelLayout.setVerticalGroup(browsePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(browsePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE).addComponent(folder, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE).addComponent(browse)));
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap().addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(browsePanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 361, Short.MAX_VALUE).addComponent(txtField, javax.swing.GroupLayout.DEFAULT_SIZE, 361, Short.MAX_VALUE).addGroup(layout.createSequentialGroup().addComponent(nameDescription, javax.swing.GroupLayout.DEFAULT_SIZE, 69, Short.MAX_VALUE).addGap(292, 292, 292))).addContainerGap()));
layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addGap(6, 6, 6).addComponent(nameDescription).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED).addComponent(txtField, javax.swing.GroupLayout.PREFERRED_SIZE, 24, javax.swing.GroupLayout.PREFERRED_SIZE).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 98, javax.swing.GroupLayout.PREFERRED_SIZE).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(browsePanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE).addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)));
}// </editor-fold>//GEN-END:initComponents
private void selectFileAction(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_selectFileAction
File selPath = FileChooserUtils.selectFile("Select file", folder.getText(), FileChooserUtils.MODE_OPEN).getFile();
if (selPath != null) {
folder.setText(selPath.getAbsolutePath());
try {
txtArea.setText(readFileAsString(folder.getText()));
} catch (IOException ex) {
ExceptionGlassPane dlg = new ExceptionGlassPane(Application.get(), ex);
dlg.setVisible(true);
}
}
}//GEN-LAST:event_selectFileAction
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton browse;
private javax.swing.JPanel browsePanel;
private javax.swing.JTextField folder;
private javax.swing.JLabel jLabel1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JLabel nameDescription;
private javax.swing.JTextArea txtArea;
private javax.swing.JTextField txtField;
// End of variables declaration//GEN-END:variables
//FIXME : Test the way how to initialise components (default value or empty string).
// Not clear from Biomart
private void buildComponent() {
String txt = null;
if (parentPanel != null && parentPanel.getRenderLabel()) {
nameDescription.setVisible(true);
} else {
nameDescription.setVisible(false);
}
if (filterDescription != null) {
txt = filterDescription.getDefaultValue() != null ? filterDescription.getDefaultValue() : "";
if (filterDescription.getMultipleValues() == 0) {
component = "Field";
} else {
component = "TextArea";
}
} else {
if (filterOptions != null) {
txt = filterOptions.getDefaultValue() != null ? filterOptions.getDefaultValue() : "";
if (filterOptions.getMultipleValues() == 0) {
component = "Field";
} else {
component = "TextArea";
}
} else {
return;
}
}
if (component.equals("Field")) {
txtField.setAlignmentY(TOP_ALIGNMENT);
txtField.setText(txt);
txtField.setVisible(true);
jScrollPane1.setVisible(false);
txtArea.setVisible(false);
browsePanel.setVisible(false);
currentHeight = FIELD_HEIGHT;
} else {
component = "TextArea";
jScrollPane1.setAlignmentY(TOP_ALIGNMENT);
jScrollPane1.setVisible(true);
txtArea.setAlignmentY(TOP_ALIGNMENT);
txtArea.setVisible(true);
txtArea.setText("");
browsePanel.setVisible(true);
txtField.setVisible(false);
txtField.setAlignmentY(BOTTOM_ALIGNMENT);
currentHeight = TEXTAREA_HEIGHT;
}
if (filterDescription != null && filterDescription.getDisplayName() != null)
{
nameDescription.setText(filterDescription.getDisplayName());
}
}
@Override
public List<Filter> getFilters() {
List<Filter> filters = new ArrayList<>();
Filter f = new Filter();
// When filterDescription is null,
// means this component is a child (it belongs to a container component)
if (filterDescription != null && filterDescription.getInternalName() != null) {
f.setName(filterDescription.getInternalName());
}
if (component.equals("Field")) {
f.setValue(txtField.getText());
} else {
f.setValue(txtArea.getText().replace("\n", ","));
}
f.setValue(f.getValue().replace("\\", "\\\\"));
f.setValue(f.getValue().replace("\"", "\\\""));
while (f.getValue().startsWith(","))
f.setValue(f.getValue().substring(1));
while (f.getValue().endsWith(","))
f.setValue(f.getValue().substring(0, f.getValue().length() - 1));
filters.add(f);
return filters;
}
@Override
//FIXME : Check initial component value (default value or empty string). Not clear from Biomart
public Boolean hasChanged() {
if (component.equals("Field")) {
return (txtField.getText().equals((filterDescription.getDefaultValue() != null) ? filterDescription.getDefaultValue() : ""));
} else {
return (txtArea.getText().equals(filterDescription.getValue()));
}
}
/**
* Read file as String. Content is stored in a Filter object.
* Fix: Move into utils package
*
* @param filePath
* @return
* @throws java.io.IOException
*/
private static String readFileAsString(String filePath) throws java.io.IOException {
byte[] buffer = new byte[(int) new File(filePath).length()];
BufferedInputStream f = new BufferedInputStream(new FileInputStream(filePath));
f.read(buffer);
return new String(buffer);
}
@Override
public void setListOptions(List<Option> optionList) {
}
}