/*******************************************************************************
* 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.trackSettings.layerPanel;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import edu.yu.einstein.genplay.dataStructure.enums.GraphType;
import edu.yu.einstein.genplay.gui.customComponent.tableComponents.BooleanRadioButtonEditor;
import edu.yu.einstein.genplay.gui.customComponent.tableComponents.BooleanRadioButtonRenderer;
import edu.yu.einstein.genplay.gui.customComponent.tableComponents.ColorEditor;
import edu.yu.einstein.genplay.gui.customComponent.tableComponents.ColorRenderer;
import edu.yu.einstein.genplay.gui.customComponent.tableComponents.ComboBoxEditor;
import edu.yu.einstein.genplay.gui.projectFrame.ProjectFrame;
import edu.yu.einstein.genplay.gui.track.layer.ColoredLayer;
import edu.yu.einstein.genplay.gui.track.layer.Layer;
import edu.yu.einstein.genplay.util.JTables;
/**
* Dialog for the settings of the layers of a track
* @author Julien Lajugie
* @author Nicolas Fourel
*/
public class LayerSettingsPanel extends JPanel {
/**
* Simple {@link TableCellRenderer} for layer setting tabl
* @author Julien Lajugie
*/
private class DefaultLayerSettingsTableCellRenderer extends DefaultTableCellRenderer implements TableCellRenderer {
/** generated serial ID */
private static final long serialVersionUID = 1058826355528747187L;
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if (value == null) {
return table.getDefaultRenderer(String.class).getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
}
Component renderedComponent = table.getDefaultRenderer(value.getClass()).getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
renderedComponent.setEnabled(true);
if (row < data.length) {
Layer<?> layer = data[row].getLayer();
// write the layer name with the color of the layer
if ((layer != null) && (layer instanceof ColoredLayer) && !isSelected) {
Color layerColor = ((ColoredLayer) layer).getColor();
renderedComponent.setForeground(layerColor);
} else {
renderedComponent.setForeground(Color.BLACK);
}
renderedComponent.setFont(renderedComponent.getFont().deriveFont(Font.BOLD));
}
return renderedComponent;
}
}
/** Column headers */
protected static final String[] COLUMN_NAMES = {"#", "Name", "Type", "Color", "Graph Type", "Visible", "Active", "Set For Deletion"};
/** Index of the layer number column */
protected static final int LAYER_NUMBER_INDEX = 0;
/** Index of the layer name column */
protected static final int LAYER_NAME_INDEX = 1;
/** Index of the layer type column */
protected static final int LAYER_TYPE_INDEX = 2;
/** Index of the layer color column */
protected static final int LAYER_COLOR_INDEX = 3;
/** Index of the layer graph type column */
protected static final int LAYER_GRAPH_TYPE_INDEX = 4;
/** Index of the "is layer visible" column */
protected static final int IS_LAYER_VISIBLE_INDEX = 5;
/** Index of the "is layer active" column */
protected static final int IS_LAYER_ACTIVE_INDEX = 6;
/** Index of the set for deletion column*/
protected static final int IS_LAYER_SET_FOR_DELETION_INDEX = 7;
private static final long serialVersionUID = 5640779725244792401L; // generated ID
private JTable layerSettingsTable; // table displaying the layer settings
private LayerSettingsRow[] data; // data displayed in the table
private LayerSettingsModel model; // model managing the data
/**
* If some layers have been set for deletion this method ask the user to confirm the deletion
* @return true if:<br>
* - the user want to delete the layers <br>
* - there is no layers set for deletion<br>
* Return false otherwise.
*/
public boolean confirmLayerDeletion() {
String confirmQuestion = "Do you really want to delete the following layers: \n";
boolean deletionRequested = false;
if (data == null) {
return true;
}
for (LayerSettingsRow currentRow: data) {
if (currentRow.isLayerSetForDeletion()) {
deletionRequested = true;
confirmQuestion += currentRow.getLayer().getName() + "\n";
}
}
if (deletionRequested) {
int confirmOption = JOptionPane.showConfirmDialog(getRootPane(), confirmQuestion, "Delete Layers", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
return confirmOption == JOptionPane.YES_OPTION;
} else {
return true;
}
}
/**
* @return the data displayed in the layer settings table
*/
public LayerSettingsRow[] getData() {
return data;
}
/**
* Initializes dialog components
* @param data
*/
public void initialize (LayerSettingsRow[] data) {
this.data = data;
if (data == null) {
add(new JLabel("No layers found."));
} else {
model = new LayerSettingsModel(data);
// table
layerSettingsTable = new JTable(model);
layerSettingsTable.setFillsViewportHeight(true);
// other table properties
layerSettingsTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
// allows the table to save data when a cell loses focus
layerSettingsTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
initializeColumnProperties();
// Move up button
JButton jbUp = new JButton("Up");
jbUp.setEnabled(data.length > 1);
jbUp.setToolTipText(ProjectFrame.SELECT_FILES);
jbUp.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
if (model.moveLayerUp(layerSettingsTable.getSelectedRow())) {
layerSettingsTable.setRowSelectionInterval(layerSettingsTable.getSelectedRow() - 1, layerSettingsTable.getSelectedRow() - 1);
}
}
});
// Move down button
JButton jbDown = new JButton("Down");
jbDown.setEnabled(data.length > 1);
jbDown.setToolTipText(ProjectFrame.UNSELECT_FILES);
jbDown.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
if (model.moveLayerDown(layerSettingsTable.getSelectedRow())) {
layerSettingsTable.setRowSelectionInterval(layerSettingsTable.getSelectedRow() + 1, layerSettingsTable.getSelectedRow() + 1);
}
}
});
////Button panel
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new GridLayout(2, 1));
//TopPane
JPanel topPane = new JPanel();
topPane.add(jbUp);
topPane.add(jbDown);
//Add panels
buttonPanel.add(topPane);
BorderLayout border = new BorderLayout();
setLayout(border);
add(layerSettingsTable.getTableHeader(), BorderLayout.NORTH);
add(layerSettingsTable, BorderLayout.CENTER);
add(buttonPanel, BorderLayout.SOUTH);
}
}
/**
* This method initializes the column properties:
* - name
* - width
* - resizable
*/
private void initializeColumnProperties () {
TableColumn column = null;
for (int columnIndex = 0; columnIndex < COLUMN_NAMES.length; columnIndex++) {
column = layerSettingsTable.getColumnModel().getColumn(columnIndex);
column.setHeaderValue(COLUMN_NAMES[columnIndex]);
column.setResizable(true);
switch (columnIndex) {
case LAYER_NUMBER_INDEX:
column.setPreferredWidth(8);
column.setCellRenderer(new DefaultLayerSettingsTableCellRenderer());
break;
case LAYER_COLOR_INDEX:
column.setCellEditor(new ColorEditor("Select"));
column.setCellRenderer(new ColorRenderer("Select", true));
break;
case LAYER_GRAPH_TYPE_INDEX:
column.setCellEditor(new ComboBoxEditor(GraphType.values()));
column.setCellRenderer(new DefaultLayerSettingsTableCellRenderer());
break;
case IS_LAYER_ACTIVE_INDEX:
column.setCellEditor(new BooleanRadioButtonEditor());
column.setCellRenderer(new BooleanRadioButtonRenderer());
break;
case IS_LAYER_SET_FOR_DELETION_INDEX:
column.setCellRenderer(new DefaultLayerSettingsTableCellRenderer());
column.setPreferredWidth(110);
break;
default:
column.setCellRenderer(new DefaultLayerSettingsTableCellRenderer());
}
JTables.packColumn(layerSettingsTable, columnIndex, 2);
}
}
}