package org.limewire.ui.swing.upload.table;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JTable;
import net.miginfocom.swing.MigLayout;
import org.jdesktop.application.Resource;
import org.limewire.core.api.upload.UploadItem;
import org.limewire.core.api.upload.UploadState;
import org.limewire.core.api.upload.UploadItem.UploadItemType;
import org.limewire.ui.swing.components.IconButton;
import org.limewire.ui.swing.table.TableRendererEditor;
import org.limewire.ui.swing.transfer.TransferRendererResources;
import org.limewire.ui.swing.util.GuiUtils;
import org.limewire.ui.swing.util.I18n;
/**
* Cell renderer for the message column in the Uploads table.
*/
class UploadMessageRenderer extends TableRendererEditor {
@Resource private Icon infoIcon;
private final NumberFormat formatter = new DecimalFormat("0.00");
private final UploadActionHandler actionHandler;
private JLabel messageLabel;
private JButton infoButton;
private UploadItem uploadItem;
/**
* Constructs an UploadMessageRenderer.
*/
public UploadMessageRenderer(UploadActionHandler actionHandler) {
this.actionHandler = actionHandler;
new TransferRendererResources().decorateComponent(this);
GuiUtils.assignResources(this);
setLayout(new MigLayout("insets 0, gap 0, aligny center, nogrid, novisualpadding"));
messageLabel = new JLabel();
infoButton = new IconButton(infoIcon);
infoButton.setActionCommand(UploadActionHandler.PROPERTIES_COMMAND);
infoButton.setToolTipText(I18n.tr("Info"));
infoButton.addActionListener(new ButtonListener());
add(messageLabel, "");
add(infoButton, "");
}
@Override
protected Component doTableCellEditorComponent(JTable table, Object value, boolean isSelected,
int row, int column) {
if (value instanceof UploadItem) {
uploadItem = (UploadItem) value;
setButtonVisible(uploadItem);
messageLabel.setText(getMessage(uploadItem));
return this;
} else {
setButtonVisible(null);
return emptyPanel;
}
}
@Override
protected Component doTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
if (value instanceof UploadItem) {
uploadItem = (UploadItem) value;
messageLabel.setText(getMessage(uploadItem));
setButtonVisible(uploadItem);
return this;
} else {
setButtonVisible(null);
return emptyPanel;
}
}
private void setButtonVisible(UploadItem item) {
if(item == null) {
infoButton.setVisible(false);
} else {
infoButton.setVisible(item.getState() != UploadState.BROWSE_HOST && item.getState() != UploadState.BROWSE_HOST_DONE);
}
}
/**
* Returns the display message for the specified upload item.
*/
private String getMessage(UploadItem item) {
switch (item.getState()) {
case BROWSE_HOST:
case BROWSE_HOST_DONE:
return I18n.tr("Library was browsed");
case DONE:
return I18n.tr("Done uploading");
case UPLOADING:
if (UploadItemType.BITTORRENT == item.getUploadItemType()) {
int numConnections = item.getNumUploadConnections();
String ratio = formatter.format(item.getSeedRatio());
return I18n.trn("{0} to {1} person - ratio: {2}",
"{0} to {1} people - ratio: {2}",
numConnections, GuiUtils.formatKilobytesPerSec(item.getUploadSpeed()), numConnections, ratio);
} else {
return I18n.tr("{0} of {1} ({2})",
GuiUtils.formatUnitFromBytes(item.getTotalAmountUploaded()),
GuiUtils.formatUnitFromBytes(item.getFileSize()),
GuiUtils.formatKilobytesPerSec(item.getUploadSpeed()));
}
case PAUSED:
return I18n.tr("Paused");
case QUEUED:
return I18n.tr("Waiting...");
case REQUEST_ERROR:
return I18n.tr("Unable to upload: invalid request");
case LIMIT_REACHED:
return I18n.tr("Unable to upload: upload limit reached");
default:
return "";
}
}
/**
* Action listener for editor buttons.
*/
private class ButtonListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
// Reset cursor if source component is IconButton. If the action
// displays a modal dialog, then IconButton does not receive the
// mouseExited event to reset the default cursor.
if (e.getSource() instanceof IconButton) {
((IconButton) e.getSource()).resetDefaultCursor();
}
actionHandler.performAction(e.getActionCommand(), uploadItem);
cancelCellEditing();
}
}
}