/*******************************************************************************
* GenPlay, Einstein Genome Analyzer
* Copyright (C) 2009, 2014 Albert Einstein College of Medicine
*
* 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/>.
* Authors: Julien Lajugie <julien.lajugie@einstein.yu.edu>
* Nicolas Fourel <nicolas.fourel@einstein.yu.edu>
* Eric Bouhassira <eric.bouhassira@einstein.yu.edu>
*
* Website: <http://genplay.einstein.yu.edu>
******************************************************************************/
package edu.yu.einstein.genplay.gui.dialog.multiGenomeDialog.addOrEditVariantLayer;
import java.awt.Color;
import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JDialog;
import edu.yu.einstein.genplay.core.manager.project.ProjectManager;
import edu.yu.einstein.genplay.dataStructure.enums.AlleleType;
import edu.yu.einstein.genplay.dataStructure.enums.VariantType;
import edu.yu.einstein.genplay.gui.MGDisplaySettings.VariantLayerDisplaySettings;
/**
*
* @author Julien Lajugie
*/
public class AddOrEditVariantLayerDialog extends JDialog {
/** generated serial ID */
private static final long serialVersionUID = 6669098909120555543L;
/** Return value when OK has been clicked */
public static final int APPROVE_OPTION = 0;
/** Return value when Cancel has been clicked */
public static final int CANCEL_OPTION = 1;
/** Selected genome */
private static VariantLayerDisplaySettings selectedGenome;
/**
* Shows the dialog to select variant types and colors
* @param parentComponent parent component of the dialog to show
* @return the {@link VariantLayerDisplaySettings} to add. Null if canceled
*/
public static VariantLayerDisplaySettings showAddDialog(Component parentComponent) {
AddOrEditVariantLayerDialog addOrEditVariantLayerDialog = new AddOrEditVariantLayerDialog(null, true);
addOrEditVariantLayerDialog.setLocationRelativeTo(parentComponent);
addOrEditVariantLayerDialog.setTitle("Add Variant Layer");
addOrEditVariantLayerDialog.setVisible(true);
if (addOrEditVariantLayerDialog.approved == APPROVE_OPTION) {
return selectedGenome;
} else {
return null;
}
}
/**
* Show the dialog to edit variant types and colors
* @param initialSelection initial selection shown on the dialog.
* @return the edited {@link VariantLayerDisplaySettings}. Null if canceled
*/
public static VariantLayerDisplaySettings showEditDialog(Component parentComponent, VariantLayerDisplaySettings initialSelection) {
List<VariantLayerDisplaySettings> variantData = new ArrayList<VariantLayerDisplaySettings>();
// we copy the input data because it will be directly modified
variantData.add(new VariantLayerDisplaySettings(initialSelection.getGenome(),
initialSelection.getAlleleType(),
initialSelection.getVariationTypeList(),
initialSelection.getColorList()));
AddOrEditVariantLayerDialog addOrEditVariantLayerDialog = new AddOrEditVariantLayerDialog(variantData, false);
addOrEditVariantLayerDialog.setLocationRelativeTo(parentComponent);
addOrEditVariantLayerDialog.setTitle("Edit Variant Layer");
addOrEditVariantLayerDialog.setVisible(true);
if (addOrEditVariantLayerDialog.approved == APPROVE_OPTION) {
return selectedGenome;
} else {
return null;
}
}
/** Equals APPROVE_OPTION if user clicked OK, CANCEL_OPTION if not */
private int approved = CANCEL_OPTION;
/** Ok button */
private final JButton jbOk;
/**
* Creates an instance of {@link AddOrEditVariantLayerDialog}
* @param data data to display in the dialog
*/
public AddOrEditVariantLayerDialog (List<VariantLayerDisplaySettings> variantList, boolean isGenomeSelectable) {
if(variantList == null) {
variantList = createNewVariantDataList();
}
selectedGenome = variantList.get(0);
// variant selection panel
final VariantTypeSelectionPanel variantTypeSelectionPanel = new VariantTypeSelectionPanel(variantList);
variantTypeSelectionPanel.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals(VariantTypeSelectionPanel.SELECTED_VARIANT_TYPES_PROPERTY_NAME)) {
refreshOkButtonState();
}
}
});
// Genomes selection panel
GenomeSelectionPanel genomeSelectionPanel = new GenomeSelectionPanel(variantList);
genomeSelectionPanel.setEnabled(isGenomeSelectable);
genomeSelectionPanel.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals(GenomeSelectionPanel.SELECTED_GENOME_PROPERTY_NAME)) {
selectedGenome = (VariantLayerDisplaySettings) evt.getNewValue();
variantTypeSelectionPanel.setSelectedGenome(selectedGenome);
refreshOkButtonState();
}
}
});
// ok button
jbOk = new JButton("OK");
jbOk.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
approved = APPROVE_OPTION;
setVisible(false);
}
});
refreshOkButtonState();
getRootPane().setDefaultButton(jbOk);
// cancel button
JButton jbCancel = new JButton("Cancel");
jbCancel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
setVisible(false);
}
});
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.BOTH;
gbc.anchor = GridBagConstraints.PAGE_START;
add(genomeSelectionPanel, gbc);
variantTypeSelectionPanel.setPreferredSize(genomeSelectionPanel.getPreferredSize());
gbc.gridx = 1;
add(variantTypeSelectionPanel, gbc);
jbOk.setPreferredSize(jbCancel.getPreferredSize());
gbc.fill = GridBagConstraints.NONE;
gbc.anchor = GridBagConstraints.LINE_END;
gbc.gridx = 0;
gbc.gridy = 1;
add(jbOk, gbc);
gbc.anchor = GridBagConstraints.LINE_START;
gbc.gridx = 1;
add(jbCancel, gbc);
// add components
setModalityType(ModalityType.APPLICATION_MODAL);
setResizable(false);
pack();
}
/**
* @return a list with VariantData for each of the genomes of the multigenome project
*/
private List<VariantLayerDisplaySettings> createNewVariantDataList() {
List<VariantLayerDisplaySettings> data = new ArrayList<VariantLayerDisplaySettings>();
List<String> allGenomeNames = ProjectManager.getInstance().getMultiGenomeProject().getGenomeNames();
for (String genomeName: allGenomeNames) {
VariantLayerDisplaySettings variant = new VariantLayerDisplaySettings(genomeName, AlleleType.BOTH, new ArrayList<VariantType>(), new ArrayList<Color>());
data.add(variant);
}
return data;
}
/**
* Enables the ok button if a genome and at least one variant type are selected. Disables ok button otherwise
*/
private void refreshOkButtonState() {
jbOk.setEnabled((selectedGenome != null) && (selectedGenome.getVariationTypeList() != null) && !selectedGenome.getVariationTypeList().isEmpty());
}
}