/*
* #%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.analysis.wizard;
import org.gitools.ui.core.utils.DocumentChangeListener;
import org.gitools.ui.core.utils.FileChooserUtils;
import org.gitools.ui.platform.IconUtils;
import org.gitools.ui.platform.dialog.MessageStatus;
import org.gitools.ui.platform.icons.IconNames;
import org.gitools.ui.platform.settings.Settings;
import org.gitools.ui.platform.wizard.AbstractWizardPage;
import org.gitools.utils.cutoffcmp.CutoffCmp;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.File;
public class DataFilterPage extends AbstractWizardPage {
private static final long serialVersionUID = 3840797252370672587L;
public DataFilterPage() {
setTitle("Select data filtering options");
setLogo(IconUtils.getImageIconResourceScaledByHeight(IconNames.LOGO_DATA, 96));
initComponents();
DocumentChangeListener docCompleteListener = new DocumentChangeListener() {
@Override
protected void update(DocumentEvent e) {
updateState();
}
};
ItemListener itemListener = new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
updateState();
}
};
populationCheck.addItemListener(itemListener);
populationFilePath.getDocument().addDocumentListener(docCompleteListener);
cutoffEnabledCheck.addItemListener(itemListener);
String[] cmpNames = new String[CutoffCmp.comparators.length];
for (int i = 0; i < cmpNames.length; i++)
cmpNames[i] = CutoffCmp.comparators[i].getLongName();
cutoffCmpCb.setModel(new DefaultComboBoxModel(cmpNames));
cutoffCmpCb.setSelectedItem(CutoffCmp.GE.getLongName());
cutoffValue.getDocument().addDocumentListener(docCompleteListener);
cutoffValue.setText("1.5");
discardNonMappedRowsCheck.addItemListener(itemListener);
discardNonMappedRowsCheck.setVisible(false);
}
private void updateState() {
boolean binaryFilterEnabled = true; //FIXME
cutoffEnabledCheck.setEnabled(binaryFilterEnabled);
cutoffCmpCb.setEnabled(binaryFilterEnabled && cutoffEnabledCheck.isSelected());
cutoffValue.setEnabled(binaryFilterEnabled && cutoffEnabledCheck.isSelected());
setMessage(MessageStatus.INFO, "");
boolean complete = true;
if (cutoffEnabledCheck.isSelected()) {
boolean fail = false;
try {
Double.valueOf(cutoffValue.getText());
} catch (NumberFormatException e) {
fail = true;
setStatus(MessageStatus.ERROR);
setMessage("Cutoff value should be a real number.");
}
complete = !fail && !cutoffValue.getText().isEmpty();
}
String rowsFilterPath = populationFilePath.getText();
if (!rowsFilterPath.isEmpty()) {
File rowsFilterFile = new File(rowsFilterPath);
if (!rowsFilterFile.exists()) {
complete = false;
setMessage(MessageStatus.ERROR, "File not found: " + rowsFilterPath);
}
}
boolean populationChecked = populationCheck.isSelected();
populationFilePath.setEnabled(populationChecked);
populationFileBrowserBtn.setEnabled(populationChecked);
populationNote.setEnabled(populationChecked);
populationDefaultValueLabel.setEnabled(populationChecked);
populationDefaultValueCb.setEnabled(populationChecked);
if (populationChecked && populationFilePath.getDocument().getLength() == 0) {
complete = false;
setMessage(MessageStatus.ERROR, "Select a file containing rows");
}
setComplete(complete);
}
@Override
public JComponent createControls() {
return this;
}
/**
* 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.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
buttonGroup1 = new javax.swing.ButtonGroup();
buttonGroup2 = new javax.swing.ButtonGroup();
cutoffEnabledCheck = new javax.swing.JCheckBox();
cutoffCmpCb = new javax.swing.JComboBox();
cutoffValue = new javax.swing.JTextField();
populationFilePath = new javax.swing.JTextField();
populationFileBrowserBtn = new javax.swing.JButton();
discardNonMappedRowsCheck = new javax.swing.JCheckBox();
populationCheck = new javax.swing.JCheckBox();
populationNote = new javax.swing.JLabel();
populationDefaultValueLabel = new javax.swing.JLabel();
populationDefaultValueCb = new javax.swing.JComboBox();
populationNote1 = new javax.swing.JLabel();
populationNote3 = new javax.swing.JLabel();
cutoffEnabledCheck.setText("Transform to 1 (0 otherwise) cells with value");
cutoffEnabledCheck.setEnabled(false);
cutoffCmpCb.setEnabled(false);
cutoffValue.setColumns(6);
cutoffValue.setEnabled(false);
populationFileBrowserBtn.setText("Browse...");
populationFileBrowserBtn.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
populationFileBrowserBtnActionPerformed(evt);
}
});
discardNonMappedRowsCheck.setText("Filter out rows for which no information appears in the modules");
populationCheck.setText("Population / Background elements:");
populationNote.setFont(populationNote.getFont().deriveFont((populationNote.getFont().getStyle() | java.awt.Font.ITALIC), populationNote.getFont().getSize()-3));
populationNote.setText("This should be a file containing one row id per line.");
populationDefaultValueLabel.setText("Default value to use when a row doesn't exist in the data");
populationDefaultValueCb.setEditable(true);
populationDefaultValueCb.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "0", "Empty" }));
populationNote1.setFont(populationNote1.getFont().deriveFont((populationNote1.getFont().getStyle() | java.awt.Font.ITALIC), populationNote1.getFont().getSize()-3));
populationNote1.setText("Binarize continuous data (f.ex. if you have selected Binomial or Fisher test)");
populationNote3.setFont(populationNote3.getFont().deriveFont((populationNote3.getFont().getStyle() | java.awt.Font.ITALIC), populationNote3.getFont().getSize()-3));
populationNote3.setText("Either a value or Null");
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)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(populationCheck)
.addComponent(discardNonMappedRowsCheck))
.addGap(0, 0, Short.MAX_VALUE))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addComponent(cutoffEnabledCheck)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(cutoffCmpCb, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(cutoffValue, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createSequentialGroup()
.addGap(12, 12, 12)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(populationFilePath)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(populationFileBrowserBtn))
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(populationNote3)
.addComponent(populationNote)
.addGroup(layout.createSequentialGroup()
.addComponent(populationDefaultValueLabel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(populationDefaultValueCb, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addGap(0, 0, Short.MAX_VALUE))
.addComponent(populationNote1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(populationCheck)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(populationFilePath, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(populationFileBrowserBtn))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(populationNote)
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(populationDefaultValueLabel)
.addComponent(populationDefaultValueCb, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(populationNote3)
.addGap(26, 26, 26)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(cutoffEnabledCheck)
.addComponent(cutoffCmpCb, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(cutoffValue, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(populationNote1)
.addGap(41, 41, 41)
.addComponent(discardNonMappedRowsCheck)
.addContainerGap(99, Short.MAX_VALUE))
);
}// </editor-fold>//GEN-END:initComponents
private void populationFileBrowserBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_populationFileBrowserBtnActionPerformed
File selPath = FileChooserUtils.selectFile("Select file", Settings.get().getLastDataPath(), FileChooserUtils.MODE_OPEN).getFile();
if (selPath != null) {
populationFilePath.setText(selPath.getAbsolutePath());
Settings.get().setLastDataPath(selPath.getAbsolutePath());
}
}//GEN-LAST:event_populationFileBrowserBtnActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.ButtonGroup buttonGroup1;
private javax.swing.ButtonGroup buttonGroup2;
private javax.swing.JComboBox cutoffCmpCb;
private javax.swing.JCheckBox cutoffEnabledCheck;
private javax.swing.JTextField cutoffValue;
private javax.swing.JCheckBox discardNonMappedRowsCheck;
private javax.swing.JCheckBox populationCheck;
private javax.swing.JComboBox populationDefaultValueCb;
private javax.swing.JLabel populationDefaultValueLabel;
private javax.swing.JButton populationFileBrowserBtn;
private javax.swing.JTextField populationFilePath;
private javax.swing.JLabel populationNote;
private javax.swing.JLabel populationNote1;
private javax.swing.JLabel populationNote3;
// End of variables declaration//GEN-END:variables
public void setRowsFilterFileVisible(boolean visible) {
populationCheck.setVisible(visible);
populationFilePath.setVisible(visible);
populationFileBrowserBtn.setVisible(visible);
populationNote.setVisible(visible);
}
public File getPopulationFile() {
String text = populationFilePath.getText();
return populationCheck.isSelected() && !text.isEmpty() ? new File(text) : null;
}
public boolean isBinaryCutoffEnabled() {
return cutoffEnabledCheck.isSelected();
}
public void setBinaryCutoffEnabled(boolean enabled) {
cutoffEnabledCheck.setSelected(enabled);
}
public CutoffCmp getBinaryCutoffCmp() {
return CutoffCmp.getFromName((String) cutoffCmpCb.getSelectedItem());
}
public void setBinaryCutoffCmp(CutoffCmp cmp) {
cutoffCmpCb.setSelectedItem(cmp.getLongName());
}
public double getBinaryCutoffValue() {
return Double.parseDouble(cutoffValue.getText());
}
public void setBinaryCutoffValue(double value) {
cutoffValue.setText(Double.toString(value));
}
public boolean isDiscardNonMappedRowsEnabled() {
return discardNonMappedRowsCheck.isSelected();
}
public void setDiscardNonMappedRowsEnabled(boolean enabled) {
discardNonMappedRowsCheck.setSelected(enabled);
}
public boolean isDiscardNonMappedRowsVisible() {
return discardNonMappedRowsCheck.isVisible();
}
public void setDiscardNonMappedRowsVisible(boolean visible) {
discardNonMappedRowsCheck.setVisible(visible);
}
public Double getPopulationDefaultValue() {
String value = (String) populationDefaultValueCb.getSelectedItem();
Double v = Double.NaN;
try {
v = Double.parseDouble(value);
} catch (NumberFormatException ex) {
}
return v;
}
}