/*
* Copyright (c) 2009 The Jackson Laboratory
*
* This software was developed by Gary Churchill's Lab at The Jackson
* Laboratory (see http://research.jax.org/faculty/churchill).
*
* This 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 software 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 software. If not, see <http://www.gnu.org/licenses/>.
*/
package org.jax.qtl.fit.gui;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.DefaultListModel;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.ListModel;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
import org.jax.qtl.cross.Cross;
import org.jax.qtl.cross.GeneticMarker;
import org.jax.qtl.cross.MarkerPairQtlBasketItem;
import org.jax.qtl.cross.QtlBasket;
import org.jax.qtl.cross.QtlBasketItem;
import org.jax.qtl.cross.SingleMarkerQtlBasketItem;
import org.jax.qtl.fit.FitPredictor;
import org.jax.qtl.fit.FitQtlCommand;
import org.jax.qtl.project.QtlProject;
import org.jax.qtl.project.QtlProjectManager;
import org.jax.qtl.ui.ImputationDialog;
import org.jax.r.RCommand;
import org.jax.r.RUtilities;
import org.jax.r.gui.RCommandEditorPanel;
import org.jax.r.jriutilities.JRIUtilityFunctions;
import org.jax.r.jriutilities.RInterfaceFactory;
import org.jax.util.TextWrapper;
/**
* Use this panel to edit fitqtl R commands
* @author <A HREF="mailto:keith.sheppard@jax.org">Keith Sheppard</A>
*/
public class FitQtlPanel extends RCommandEditorPanel
{
/**
* every {@link java.io.Serializable} is supposed to have one of these
*/
private static final long serialVersionUID = -2891530987811064009L;
/**
* our logger
*/
private static final Logger LOG = Logger.getLogger(
FitQtlPanel.class.getName());
private volatile FitQtlCommand fitQtlCommand;
private final JDialog parentDialog;
/**
* Constructor
* @param parentDialog
* the parent dialog
*/
public FitQtlPanel(JDialog parentDialog)
{
this(parentDialog, null);
}
/**
* Constructor
* @param parentDialog
* the parent dialog
* @param selectedQtlBasket
* the QTL basket selection that this panel should start out
* with
*/
public FitQtlPanel(
JDialog parentDialog,
QtlBasket selectedQtlBasket)
{
this.parentDialog = parentDialog;
this.initComponents();
this.postGuiInit(selectedQtlBasket);
}
/**
* Do the GUI initialization that wasn't handled by the GUI builder
* @param selectedQtlBasket
* the initial QTL basket
*/
private void postGuiInit(QtlBasket selectedQtlBasket)
{
this.fitResultNameTextField.getDocument().addDocumentListener(
new DocumentListener()
{
public void changedUpdate(DocumentEvent e)
{
FitQtlPanel.this.updateRCommand();
}
public void insertUpdate(DocumentEvent e)
{
FitQtlPanel.this.updateRCommand();
}
public void removeUpdate(DocumentEvent e)
{
FitQtlPanel.this.updateRCommand();
}
});
DefaultTableModel modelInputsModel = new DefaultTableModel()
{
private static final long serialVersionUID = 5313156157630746144L;
/**
* {@inheritDoc}
*/
@Override
public boolean isCellEditable(int row, int column)
{
return false;
}
};
modelInputsModel.setColumnIdentifiers(
new String[] {"Input Type", "Input Identifier"});
this.modelInputsTabel.setModel(modelInputsModel);
this.modelInputsTabel.setSelectionMode(
ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
this.modelInputsTabel.getSelectionModel().addListSelectionListener(
new ListSelectionListener()
{
public void valueChanged(ListSelectionEvent e)
{
FitQtlPanel.this.modelSelectionsChanged();
}
});
this.modelTermsList.setModel(new DefaultListModel());
this.modelTermsList.setSelectionMode(
ListSelectionModel.SINGLE_SELECTION);
QtlProject activeProject =
QtlProjectManager.getInstance().getActiveProject();
// add crosses
Cross[] crosses = activeProject.getDataModel().getCrosses();
for(Cross cross: crosses)
{
this.crossComboBox.addItem(cross);
}
if(selectedQtlBasket != null)
{
this.setSelectedCross(selectedQtlBasket.getParentCross());
this.setSelectedQtlBasket(selectedQtlBasket);
}
this.updateRCommand();
this.modelSelectionsChanged();
}
/**
* Getter for the current fit qtl command. Callers should make sure this
* is valid 1st by calling {@link #validateData()}
* @return
* the command
*/
public FitQtlCommand getFitQtlCommand()
{
return this.fitQtlCommand;
}
/**
* {@inheritDoc}
*/
public RCommand[] getCommands()
{
FitQtlCommand fitQtlCommand = this.fitQtlCommand;
if(fitQtlCommand == null)
{
return new RCommand[0];
}
else
{
return new RCommand[] {fitQtlCommand};
}
}
/**
* Convenience function for getting a handle on the table model
* @return
* the table model
*/
private DefaultTableModel getModelInputsTableModel()
{
return (DefaultTableModel)this.modelInputsTabel.getModel();
}
/**
* Convenience function for getting a handle on the list model
* @return
* the list model
*/
private DefaultListModel getModelPredictorsListModel()
{
return (DefaultListModel)this.modelTermsList.getModel();
}
/**
* Getter for the selected cross
* @return
* the selected cross
*/
private Cross getSelectedCross()
{
return (Cross)this.crossComboBox.getSelectedItem();
}
/**
* Setter for the selected cross
* @param selectedCross
* the selected cross
*/
private void setSelectedCross(Cross selectedCross)
{
if(selectedCross != null && selectedCross != this.getSelectedCross())
{
this.crossComboBox.setSelectedItem(selectedCross);
}
else
{
if(LOG.isLoggable(Level.FINE))
{
LOG.fine("ignoring null cross selection");
}
}
}
/**
* Respond to a change in selected cross
*/
private void selectedCrossChanged()
{
// clean up any old stuff that needs to go
this.phenotypeComboBox.removeAllItems();
this.qtlBasketComboBox.removeAllItems();
// add in the new stuff
Cross selectedCross = this.getSelectedCross();
if(selectedCross != null)
{
String[] phenotypes =
selectedCross.getPhenotypeData().getDataNames();
for(String pheno: phenotypes)
{
this.phenotypeComboBox.addItem(pheno);
}
QtlBasket[] qtlBaskets = selectedCross.getQtlBaskets();
for(QtlBasket currQtlBasket: qtlBaskets)
{
this.qtlBasketComboBox.addItem(currQtlBasket);
}
}
this.updateRCommand();
}
/**
* Respond to a change in QTL basket
*/
private void selectedQtlBasketChanged()
{
// clean up any old stuff that needs to go
this.getModelPredictorsListModel().removeAllElements();
DefaultTableModel modelInputsTableModel =
this.getModelInputsTableModel();
modelInputsTableModel.setNumRows(0);
Cross selectedCross = this.getSelectedCross();
QtlBasket selectedQtlBasket = this.getSelectedQtlBasket();
// add in the new stuff
if(selectedCross != null && selectedQtlBasket != null)
{
String[] phenotypeNames =
selectedCross.getPhenotypeData().getDataNames();
List<QtlBasketItem> basketContents =
selectedQtlBasket.getContents();
for(QtlBasketItem qtlBasketItem: basketContents)
{
modelInputsTableModel.addRow(new QtlBasketItemCell[] {
new QtlBasketItemCell(qtlBasketItem, 0),
new QtlBasketItemCell(qtlBasketItem, 1)});
}
for(String currPhenotypeName: phenotypeNames)
{
modelInputsTableModel.addRow(new PhenotypeInputCell[] {
new PhenotypeInputCell(currPhenotypeName, 0),
new PhenotypeInputCell(currPhenotypeName, 1)});
}
}
this.updateRCommand();
}
/**
* Get the currently selected QTL basket
* @return
* the selected basket
*/
private QtlBasket getSelectedQtlBasket()
{
return (QtlBasket)this.qtlBasketComboBox.getSelectedItem();
}
/**
* Set the selected QTL basket
* @param selectedQtlBasket
* the selected QTL basket
*/
private void setSelectedQtlBasket(QtlBasket selectedQtlBasket)
{
if(selectedQtlBasket != null)
{
this.qtlBasketComboBox.setSelectedItem(selectedQtlBasket);
}
else
{
if(LOG.isLoggable(Level.FINE))
{
LOG.fine("ignoring null QTL basket selection");
}
}
}
/**
* Respond to a change in model selection (either inputs tabel or terms)
*/
private void modelSelectionsChanged()
{
this.addTermsButton.setEnabled(
this.modelInputsTabel.getSelectedRowCount() > 0);
this.addInteractiveTermButton.setEnabled(
this.modelInputsTabel.getSelectedRowCount() > 1);
this.appendInteractionsToTermButton.setEnabled(
this.modelInputsTabel.getSelectedRowCount() > 0 &&
this.modelTermsList.getSelectedIndex() != -1);
this.removeTermButton.setEnabled(
this.modelTermsList.getSelectedIndex() != -1);
}
/**
* This function is called when we should update the {@link FitQtlCommand}
* in response to a change in the GUI
*/
private void updateRCommand()
{
FitQtlCommand newFitCommand = new FitQtlCommand(
this.getSelectedCross(),
this.getFitPredictors());
newFitCommand.setPhenotypeToFit(
this.getSelectedPhenotypeName());
newFitCommand.setEstimateQtlEffects(
this.estimateEffectsCheckbox.isSelected());
newFitCommand.setPerformDropOneAnalysis(
this.dropOneAnalysisCheckbox.isSelected());
newFitCommand.setFitResultName(
this.getFitResultName());
this.fitQtlCommand = newFitCommand;
this.fireCommandModified();
}
/**
* Get the fit result name that's currently entered in the GUI
* @return
* the result name that's entered
*/
private String getFitResultName()
{
return this.fitResultNameTextField.getText().trim();
}
/**
* Getter for the phenotype that is selected
* @return
* the phenotype
*/
private String getSelectedPhenotypeName()
{
return (String)this.phenotypeComboBox.getSelectedItem();
}
/**
* Getter for the fit predictors that are currently entered in the GUI
* @return
* the predictors
*/
private List<FitPredictor> getFitPredictors()
{
ListModel modelTermsModel = this.modelTermsList.getModel();
int numTerms = modelTermsModel.getSize();
List<FitPredictor> newPredictors = new ArrayList<FitPredictor>(
numTerms);
for(int i = 0; i < numTerms; i++)
{
newPredictors.add((FitPredictor)modelTermsModel.getElementAt(i));
}
return newPredictors;
}
/**
* A cell class for holding phenotype info
*/
private class PhenotypeInputCell
{
private static final String INPUT_TYPE_NAME = "phenotype";
private final String phenotypeName;
private final int columnNumber;
/**
* Constructor
* @param phenotypeName
* the phenotype name for this cell
* @param columnNumber
* the column number of this cell
*/
public PhenotypeInputCell(String phenotypeName, int columnNumber)
{
this.phenotypeName = phenotypeName;
this.columnNumber = columnNumber;
}
/**
* @return the phenotypeName
*/
public String getPhenotypeName()
{
return this.phenotypeName;
}
/**
* {@inheritDoc}
*/
@Override
public String toString()
{
if(this.columnNumber == 0)
{
return INPUT_TYPE_NAME;
}
else if(this.columnNumber == 1)
{
return this.phenotypeName;
}
else
{
throw new IllegalStateException(
"phenotype column number is not valid: " +
this.columnNumber);
}
}
}
private class QtlBasketItemCell
{
private final int columnNumber;
private final QtlBasketItem basketItem;
/**
* Constructor
* @param basketItem
* the item we're holding
* @param columnNumber
* the column number for this cell
*/
public QtlBasketItemCell(QtlBasketItem basketItem, int columnNumber)
{
this.basketItem = basketItem;
this.columnNumber = columnNumber;
}
/**
* @return the basketItem
*/
public QtlBasketItem getBasketItem()
{
return this.basketItem;
}
/**
* {@inheritDoc}
*/
@Override
public String toString()
{
if(this.columnNumber == 0)
{
if(this.basketItem instanceof SingleMarkerQtlBasketItem)
{
return "marker";
}
else if(this.basketItem instanceof MarkerPairQtlBasketItem)
{
return "marker interaction";
}
else
{
throw new IllegalStateException(
"unknown type: " +
this.basketItem.getClass().getName());
}
}
else if(this.columnNumber == 1)
{
if(this.basketItem instanceof SingleMarkerQtlBasketItem)
{
SingleMarkerQtlBasketItem singleMarkerQtlBasketItem =
(SingleMarkerQtlBasketItem)this.basketItem;
return singleMarkerQtlBasketItem.getMarker().toString();
}
else if(this.basketItem instanceof MarkerPairQtlBasketItem)
{
MarkerPairQtlBasketItem markerPairQtlBasketItem =
(MarkerPairQtlBasketItem)this.basketItem;
return markerPairQtlBasketItem.getMarkerPair().toString();
}
else
{
throw new IllegalStateException(
"unknown type: " +
this.basketItem.getClass().getName());
}
}
else
{
throw new IllegalStateException(
"column number is not valid: " +
this.columnNumber);
}
}
}
/**
* Validate all of the data that the user entered into the GUI
* @return
* true iff the data is valid
*/
public boolean validateData()
{
String message = null;
String fitResultName = this.getFitResultName();
if(fitResultName.length() == 0)
{
message =
"Please enter a name for your fit QTL results or cancel";
}
else if(JRIUtilityFunctions.isTopLevelObject(
this.fitQtlCommand.getFitResultAccessor(),
RInterfaceFactory.getRInterfaceInstance()))
{
message =
"The name \"" + fitResultName + "\" conflicts with " +
"an existing data object. Please choose another name.";
}
else
{
message = RUtilities.getErrorMessageForReadableName(fitResultName);
if(message == null)
{
List<FitPredictor> fitPredictors = this.getFitPredictors();
boolean atLeastOneMarkerInPredictor = false;
for(FitPredictor fitPredictor: fitPredictors)
{
if(!fitPredictor.getInteractingMarkers().isEmpty())
{
atLeastOneMarkerInPredictor = true;
break;
}
}
if(!atLeastOneMarkerInPredictor)
{
message =
"Please include at least one genetic marker as a " +
"fit term or cancel";
}
}
}
if(message == null)
{
return this.validateGenotypeProbabilitiesSimulated();
}
else
{
JOptionPane.showMessageDialog(
this,
TextWrapper.wrapText(
message,
TextWrapper.DEFAULT_DIALOG_COLUMN_COUNT),
"Data Validation Failed",
JOptionPane.WARNING_MESSAGE);
return false;
}
}
/**
* Validate that genotype probabilities were calculated "calc.genoprob"
* @return
* true iff valid
*/
private boolean validateGenotypeProbabilitiesSimulated()
{
final Cross cross = this.getSelectedCross();
if(cross.getSimulateGenotypeWasUsed())
{
return true;
}
else
{
final String message =
"The fitqtl(...) R method requires that " +
"genotype probabilities be simulated. " +
"Would you like to do this now?";
int response = JOptionPane.showConfirmDialog(
FitQtlPanel.this.parentDialog,
TextWrapper.wrapText(
message,
TextWrapper.DEFAULT_DIALOG_COLUMN_COUNT),
"Genotype Probabilities Not Yet Simulated",
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE);
boolean confirmed = response == JOptionPane.OK_OPTION;
if(confirmed)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
ImputationDialog simulateGenotypeProbabilitiesDialog =
new ImputationDialog(
FitQtlPanel.this.parentDialog,
new Cross[] {cross},
cross);
simulateGenotypeProbabilitiesDialog.setVisible(true);
}
});
}
return false;
}
}
/**
* Create a single interactive predictor out of the selected
* inputs
*/
private void addSelectedInputsAsInteractivePredictor()
{
List<String> interactingPhenotypes = new ArrayList<String>();
List<GeneticMarker> interactingMarkers = new ArrayList<GeneticMarker>();
int[] selectedInputRows = this.modelInputsTabel.getSelectedRows();
for(int currSelectedRowIndex: selectedInputRows)
{
Object selectedValue =
this.modelInputsTabel.getValueAt(currSelectedRowIndex, 0);
if(selectedValue instanceof PhenotypeInputCell)
{
PhenotypeInputCell selectedPhenoCell =
(PhenotypeInputCell)selectedValue;
interactingPhenotypes.add(selectedPhenoCell.getPhenotypeName());
}
else
{
QtlBasketItemCell selectedQtlBasketItemCell =
(QtlBasketItemCell)selectedValue;
QtlBasketItem item =
selectedQtlBasketItemCell.getBasketItem();
if(item instanceof SingleMarkerQtlBasketItem)
{
SingleMarkerQtlBasketItem singleMarkerQtlBasketItem =
(SingleMarkerQtlBasketItem)item;
interactingMarkers.add(singleMarkerQtlBasketItem.getMarker());
}
else
{
MarkerPairQtlBasketItem markerPairQtlBasketItem =
(MarkerPairQtlBasketItem)item;
interactingMarkers.add(
markerPairQtlBasketItem.getMarkerPair().getMarkerOne());
interactingMarkers.add(
markerPairQtlBasketItem.getMarkerPair().getMarkerTwo());
}
}
}
FitPredictor newTerm = new FitPredictor(
interactingPhenotypes,
interactingMarkers);
DefaultListModel modelTermsModel =
(DefaultListModel)this.modelTermsList.getModel();
modelTermsModel.addElement(newTerm);
this.updateRCommand();
}
/**
* Create separate one-term predictors out of each selected input
*/
private void addSelectedInputsAsPredictors()
{
DefaultListModel modelTermsModel =
(DefaultListModel)this.modelTermsList.getModel();
int[] selectedInputRows = this.modelInputsTabel.getSelectedRows();
for(int currSelectedRowIndex: selectedInputRows)
{
List<String> interactingPhenotypes = new ArrayList<String>();
List<GeneticMarker> interactingMarkers = new ArrayList<GeneticMarker>();
Object selectedValue =
this.modelInputsTabel.getValueAt(currSelectedRowIndex, 0);
if(selectedValue instanceof PhenotypeInputCell)
{
PhenotypeInputCell selectedPhenoCell =
(PhenotypeInputCell)selectedValue;
interactingPhenotypes.add(selectedPhenoCell.getPhenotypeName());
}
else
{
QtlBasketItemCell selectedQtlBasketItemCell =
(QtlBasketItemCell)selectedValue;
QtlBasketItem item =
selectedQtlBasketItemCell.getBasketItem();
if(item instanceof SingleMarkerQtlBasketItem)
{
SingleMarkerQtlBasketItem singleMarkerQtlBasketItem =
(SingleMarkerQtlBasketItem)item;
interactingMarkers.add(singleMarkerQtlBasketItem.getMarker());
}
else
{
MarkerPairQtlBasketItem markerPairQtlBasketItem =
(MarkerPairQtlBasketItem)item;
interactingMarkers.add(
markerPairQtlBasketItem.getMarkerPair().getMarkerOne());
interactingMarkers.add(
markerPairQtlBasketItem.getMarkerPair().getMarkerTwo());
}
}
FitPredictor newTerm = new FitPredictor(
interactingPhenotypes,
interactingMarkers);
modelTermsModel.addElement(newTerm);
}
this.updateRCommand();
}
/**
* Append selected input terms as interactions to the selected predictor
*/
private void appendSelectedInputsToSelectedPredictor()
{
FitPredictor selectedPredictor =
(FitPredictor)this.modelTermsList.getSelectedValue();
if(selectedPredictor != null)
{
List<String> interactingPhenotypes =
selectedPredictor.getInteractingPhenotypes();
List<GeneticMarker> interactingMarkers =
selectedPredictor.getInteractingMarkers();
int[] selectedInputRows = this.modelInputsTabel.getSelectedRows();
for(int currSelectedRowIndex: selectedInputRows)
{
Object selectedValue =
this.modelInputsTabel.getValueAt(currSelectedRowIndex, 0);
if(selectedValue instanceof PhenotypeInputCell)
{
PhenotypeInputCell selectedPhenoCell =
(PhenotypeInputCell)selectedValue;
interactingPhenotypes.add(selectedPhenoCell.getPhenotypeName());
}
else
{
QtlBasketItemCell selectedQtlBasketItemCell =
(QtlBasketItemCell)selectedValue;
QtlBasketItem item =
selectedQtlBasketItemCell.getBasketItem();
if(item instanceof SingleMarkerQtlBasketItem)
{
SingleMarkerQtlBasketItem singleMarkerQtlBasketItem =
(SingleMarkerQtlBasketItem)item;
interactingMarkers.add(singleMarkerQtlBasketItem.getMarker());
}
else
{
MarkerPairQtlBasketItem markerPairQtlBasketItem =
(MarkerPairQtlBasketItem)item;
interactingMarkers.add(
markerPairQtlBasketItem.getMarkerPair().getMarkerOne());
interactingMarkers.add(
markerPairQtlBasketItem.getMarkerPair().getMarkerTwo());
}
}
}
this.repaint();
this.updateRCommand();
}
}
/**
* Remove any selected predictors
*/
private void removeSelectedPredictors()
{
DefaultListModel modelPredictorsListModel =
this.getModelPredictorsListModel();
int[] selectedPredictorRows = this.modelTermsList.getSelectedIndices();
for(int i = selectedPredictorRows.length - 1; i >= 0 ; i--)
{
modelPredictorsListModel.remove(selectedPredictorRows[i]);
}
this.updateRCommand();
}
/**
* 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("all")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
crossLabel = new javax.swing.JLabel();
crossComboBox = new javax.swing.JComboBox();
phenotypeLabel = new javax.swing.JLabel();
phenotypeComboBox = new javax.swing.JComboBox();
qtlBasketLabel = new javax.swing.JLabel();
qtlBasketComboBox = new javax.swing.JComboBox();
addTermsButton = new javax.swing.JButton();
addInteractiveTermButton = new javax.swing.JButton();
appendInteractionsToTermButton = new javax.swing.JButton();
removeTermButton = new javax.swing.JButton();
modelSplitPane = new javax.swing.JSplitPane();
modelInputsPanel = new javax.swing.JPanel();
modelInputsLabel = new javax.swing.JLabel();
modelInputsScrollPane = new javax.swing.JScrollPane();
modelInputsTabel = new javax.swing.JTable();
modelTermsPanel = new javax.swing.JPanel();
modelTermsLabel = new javax.swing.JLabel();
modelTermsScrollPanel = new javax.swing.JScrollPane();
modelTermsList = new javax.swing.JList();
dropOneAnalysisCheckbox = new javax.swing.JCheckBox();
estimateEffectsCheckbox = new javax.swing.JCheckBox();
fitResultNameLabel = new javax.swing.JLabel();
fitResultNameTextField = new javax.swing.JTextField();
crossLabel.setText("Cross:");
crossComboBox.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
crossComboBoxItemStateChanged(evt);
}
});
phenotypeLabel.setText("Phenotype to Fit:");
phenotypeComboBox.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
phenotypeComboBoxItemStateChanged(evt);
}
});
qtlBasketLabel.setText("QTL Basket:");
qtlBasketComboBox.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
qtlBasketComboBoxItemStateChanged(evt);
}
});
addTermsButton.setText("Add Term(s)");
addTermsButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
addTermsButtonActionPerformed(evt);
}
});
addInteractiveTermButton.setText("Add as Interactive Term");
addInteractiveTermButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
addInteractiveTermButtonActionPerformed(evt);
}
});
appendInteractionsToTermButton.setText("Append Interaction(s) to Term");
appendInteractionsToTermButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
appendInteractionsToTermButtonActionPerformed(evt);
}
});
removeTermButton.setText("Remove Term");
removeTermButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
removeTermButtonActionPerformed(evt);
}
});
modelSplitPane.setResizeWeight(0.5);
modelSplitPane.setMinimumSize(new java.awt.Dimension(13, 100));
modelSplitPane.setPreferredSize(new java.awt.Dimension(13, 100));
modelInputsLabel.setText("Model Inputs:");
modelInputsScrollPane.setViewportView(modelInputsTabel);
org.jdesktop.layout.GroupLayout modelInputsPanelLayout = new org.jdesktop.layout.GroupLayout(modelInputsPanel);
modelInputsPanel.setLayout(modelInputsPanelLayout);
modelInputsPanelLayout.setHorizontalGroup(
modelInputsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(modelInputsPanelLayout.createSequentialGroup()
.add(modelInputsLabel)
.addContainerGap(346, Short.MAX_VALUE))
.add(modelInputsScrollPane, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 432, Short.MAX_VALUE)
);
modelInputsPanelLayout.setVerticalGroup(
modelInputsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(modelInputsPanelLayout.createSequentialGroup()
.add(modelInputsLabel)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(modelInputsScrollPane, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 149, Short.MAX_VALUE))
);
modelSplitPane.setLeftComponent(modelInputsPanel);
modelTermsLabel.setText("Model Terms:");
modelTermsList.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
modelTermsListValueChanged(evt);
}
});
modelTermsScrollPanel.setViewportView(modelTermsList);
org.jdesktop.layout.GroupLayout modelTermsPanelLayout = new org.jdesktop.layout.GroupLayout(modelTermsPanel);
modelTermsPanel.setLayout(modelTermsPanelLayout);
modelTermsPanelLayout.setHorizontalGroup(
modelTermsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(modelTermsPanelLayout.createSequentialGroup()
.add(modelTermsLabel)
.addContainerGap(127, Short.MAX_VALUE))
.add(modelTermsScrollPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 212, Short.MAX_VALUE)
);
modelTermsPanelLayout.setVerticalGroup(
modelTermsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(modelTermsPanelLayout.createSequentialGroup()
.add(modelTermsLabel)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(modelTermsScrollPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 149, Short.MAX_VALUE))
);
modelSplitPane.setRightComponent(modelTermsPanel);
dropOneAnalysisCheckbox.setText("Perform Drop-One-Term Analysis");
dropOneAnalysisCheckbox.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
dropOneAnalysisCheckboxItemStateChanged(evt);
}
});
estimateEffectsCheckbox.setText("Estimate QTL Effects");
estimateEffectsCheckbox.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
estimateEffectsCheckboxItemStateChanged(evt);
}
});
fitResultNameLabel.setText("Name Your Fit Analysis:");
org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.addContainerGap()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(estimateEffectsCheckbox)
.add(layout.createSequentialGroup()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(phenotypeLabel)
.add(qtlBasketLabel)
.add(crossLabel))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(phenotypeComboBox, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(qtlBasketComboBox, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(crossComboBox, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
.add(modelSplitPane, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 657, Short.MAX_VALUE)
.add(layout.createSequentialGroup()
.add(addTermsButton)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(addInteractiveTermButton)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(appendInteractionsToTermButton)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(removeTermButton))
.add(dropOneAnalysisCheckbox)
.add(layout.createSequentialGroup()
.add(fitResultNameLabel)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(fitResultNameTextField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 102, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(20, 20, 20)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(crossLabel)
.add(crossComboBox, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(phenotypeLabel)
.add(phenotypeComboBox, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(qtlBasketLabel)
.add(qtlBasketComboBox, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(modelSplitPane, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 177, Short.MAX_VALUE)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(addTermsButton)
.add(addInteractiveTermButton)
.add(appendInteractionsToTermButton)
.add(removeTermButton))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(dropOneAnalysisCheckbox)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
.add(estimateEffectsCheckbox)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(fitResultNameLabel)
.add(fitResultNameTextField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.addContainerGap())
);
}// </editor-fold>//GEN-END:initComponents
private void addTermsButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addTermsButtonActionPerformed
this.addSelectedInputsAsPredictors();
}//GEN-LAST:event_addTermsButtonActionPerformed
private void addInteractiveTermButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addInteractiveTermButtonActionPerformed
this.addSelectedInputsAsInteractivePredictor();
}//GEN-LAST:event_addInteractiveTermButtonActionPerformed
private void appendInteractionsToTermButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_appendInteractionsToTermButtonActionPerformed
this.appendSelectedInputsToSelectedPredictor();
}//GEN-LAST:event_appendInteractionsToTermButtonActionPerformed
private void removeTermButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removeTermButtonActionPerformed
this.removeSelectedPredictors();
}//GEN-LAST:event_removeTermButtonActionPerformed
private void dropOneAnalysisCheckboxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_dropOneAnalysisCheckboxItemStateChanged
this.updateRCommand();
}//GEN-LAST:event_dropOneAnalysisCheckboxItemStateChanged
private void estimateEffectsCheckboxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_estimateEffectsCheckboxItemStateChanged
this.updateRCommand();
}//GEN-LAST:event_estimateEffectsCheckboxItemStateChanged
private void crossComboBoxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_crossComboBoxItemStateChanged
this.selectedCrossChanged();
}//GEN-LAST:event_crossComboBoxItemStateChanged
private void phenotypeComboBoxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_phenotypeComboBoxItemStateChanged
this.updateRCommand();
}//GEN-LAST:event_phenotypeComboBoxItemStateChanged
private void qtlBasketComboBoxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_qtlBasketComboBoxItemStateChanged
this.selectedQtlBasketChanged();
}//GEN-LAST:event_qtlBasketComboBoxItemStateChanged
private void modelTermsListValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_modelTermsListValueChanged
this.modelSelectionsChanged();
}//GEN-LAST:event_modelTermsListValueChanged
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton addInteractiveTermButton;
private javax.swing.JButton addTermsButton;
private javax.swing.JButton appendInteractionsToTermButton;
private javax.swing.JComboBox crossComboBox;
private javax.swing.JLabel crossLabel;
private javax.swing.JCheckBox dropOneAnalysisCheckbox;
private javax.swing.JCheckBox estimateEffectsCheckbox;
private javax.swing.JLabel fitResultNameLabel;
private javax.swing.JTextField fitResultNameTextField;
private javax.swing.JLabel modelInputsLabel;
private javax.swing.JPanel modelInputsPanel;
private javax.swing.JScrollPane modelInputsScrollPane;
private javax.swing.JTable modelInputsTabel;
private javax.swing.JSplitPane modelSplitPane;
private javax.swing.JLabel modelTermsLabel;
private javax.swing.JList modelTermsList;
private javax.swing.JPanel modelTermsPanel;
private javax.swing.JScrollPane modelTermsScrollPanel;
private javax.swing.JComboBox phenotypeComboBox;
private javax.swing.JLabel phenotypeLabel;
private javax.swing.JComboBox qtlBasketComboBox;
private javax.swing.JLabel qtlBasketLabel;
private javax.swing.JButton removeTermButton;
// End of variables declaration//GEN-END:variables
}