package gui;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import util.FileSizeFormatter;
/**
* A class representing a row for each browsed files to be uploaded. Each row
* contains the filename, a progressbar, a dropdown menu for choosing type of
* file, a close button and a checkbox for selecting the filerow.
*
* @author oi11ejn
*/
public class UploadFileRow extends JPanel {
private static final long serialVersionUID = -4087152834657635393L;
private ExperimentPanel parent;
private JPanel filePanel;
private JLabel fileLabel;
private JButton closeButton;
private JCheckBox uploadBox;
private JComboBox<String> typeBox, genome;
private JProgressBar uploadBar;
private File file;
/**
* A constructor creating the upload file row.
*
* @param f
* The file to be uploaded.
* @param parent
* The parent of this file row.
* @param newExp
* Boolean indicating if this file row is for a new experiment or
* not.
*/
public UploadFileRow(File f, ExperimentPanel parent, boolean newExp) {
this.parent = parent;
setLayout(new BorderLayout());
this.file = f;
filePanel = new JPanel();
add(filePanel, BorderLayout.SOUTH);
setContent(newExp);
}
/**
* Method setting the content of this file row.
*
* @param newExp
* Boolean indicating if this file row is for a new experiment or
* not.
*/
private void setContent(boolean newExp) {
GridBagLayout gbl = new GridBagLayout();
gbl.columnWidths = new int[] { 0, 0, 0, 0 };
gbl.rowHeights = new int[] { 0, 0 };
gbl.columnWeights = new double[] { 1.0, 0.0, 0.0, Double.MIN_VALUE };
gbl.rowWeights = new double[] { 0.0, Double.MIN_VALUE };
filePanel.setLayout(gbl);
String fileSize = " ("
+ FileSizeFormatter.convertByteToString(file.length()) + ")";
fileLabel = new JLabel(file.getName() + fileSize);
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.WEST;
gbc.insets = new Insets(0, 0, 5, 5);
gbc.gridx = 0;
gbc.gridy = 0;
filePanel.add(fileLabel, gbc);
uploadBar = new JProgressBar(0, 100);
uploadBar.setStringPainted(true);
gbc.insets = new Insets(0, 0, 0, 5);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 0;
gbc.gridy = 1;
filePanel.add(uploadBar, gbc);
String[] fileTypes = { "Profile", "Raw", "Region" };
typeBox = new JComboBox<String>(fileTypes);
typeBox.setSelectedItem("Raw");
typeBox.setPreferredSize(new Dimension(120, 31));
genome = new JComboBox<String>();
genome.setPreferredSize(new Dimension(120, 31));
genome.addItem("NA");
genome.setEnabled(false);
// Add actionlistener which sets the GR-box correctly.
typeBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
genome.removeAllItems();
if (typeBox.getSelectedItem().toString().equals("Profile")
|| typeBox.getSelectedItem().toString()
.equals("Region")) {
ArrayList<String> gr = parent.getGenomeReleases();
for (String g : gr) {
genome.addItem(g);
}
if (genome.getItemCount() > 0) {
genome.setEnabled(true);
typeBox.setSelectedItem(typeBox.getSelectedItem());
} else {
genome.setEnabled(false);
}
} else if (typeBox.getSelectedItem().toString().equals("Raw")) {
genome.removeAllItems();
String genomeString = new String("NA");
genome.addItem(genomeString);
genome.setSelectedItem(genomeString);
genome.setEnabled(false);
}
}
});
gbc.insets = new Insets(0, 0, 0, 5);
gbc.anchor = GridBagConstraints.WEST;
gbc.gridx = 1;
gbc.gridy = 1;
filePanel.add(typeBox, gbc);
gbc.insets = new Insets(0, 0, 0, 5);
gbc.anchor = GridBagConstraints.WEST;
gbc.gridx = 2;
gbc.gridy = 1;
filePanel.add(genome, gbc);
closeButton = new JButton("X");
// Listener closing this file row when a user presses the close button.
addCloseButtonListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
parent.deleteFileRow(file);
}
});
GridBagConstraints gbc_btnX = new GridBagConstraints();
gbc_btnX.gridx = 3;
gbc_btnX.gridy = 1;
filePanel.add(closeButton, gbc_btnX);
if (newExp) {
JLabel selectLabel = new JLabel(" Select:");
gbc.insets = new Insets(0, 0, 0, 5);
gbc.anchor = GridBagConstraints.EAST;
gbc.gridx = 4;
gbc.gridy = 1;
filePanel.add(selectLabel, gbc);
uploadBox = new JCheckBox();
gbc.insets = new Insets(0, 0, 0, 5);
gbc.anchor = GridBagConstraints.EAST;
gbc.gridx = 5;
gbc.gridy = 1;
filePanel.add(uploadBox, gbc);
}
}
/**
* Method adding a listener to the close button.
*
* @param listener
* The listener to be added.
*/
public void addCloseButtonListener(ActionListener listener) {
closeButton.addActionListener(listener);
}
/**
* Method returning the file name of the file associated to this row.
*
* @return a String with the file name.
*/
public String getFileName() {
return file.getName();
}
/**
* Method returning the choosen file type associated with this file row.
*
* @return a String representing the choosen file type.
*/
public String getType() {
return typeBox.getSelectedItem().toString();
}
/**
* Method updating the progress bar of this file row.
*
* @param progress
* The current progress.
*/
public void updateProgressBar(float progress) {
/* Progress is handled as % */
uploadBar.setMinimum(0);
uploadBar.setMaximum(100);
uploadBar.setValue((int) progress);
}
/**
* Boolean indicating if this file row is selected.
*
* @return a Boolean indicating if the row is choosen or not.
*/
public boolean isSelected() {
return uploadBox.isSelected();
}
/**
* Method returning the chosen genome release for the current file.
*
* @return String representing the genome release.
*/
public String getGenomeRelease() {
Object o = genome.getSelectedItem();
if (o == null) return null;
return o.toString();
}
/**
* Method disabling the components of this file row.
* @param enabled TODO
*/
public void setRowEnabled(boolean enabled) {
typeBox.setEnabled(enabled);
genome.setEnabled(enabled);
closeButton.setEnabled(enabled);
if(uploadBox != null) {
uploadBox.setEnabled(enabled);
}
}
/**
* Method used to reset the type combobox, when a new species is chosen in
* the parent panel.
*/
public void resetType() {
typeBox.setSelectedItem(typeBox.getSelectedItem());
}
}