package org.limewire.ui.swing.downloads.table.renderer; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import javax.swing.JLabel; import javax.swing.JTable; import javax.swing.border.LineBorder; import javax.swing.table.TableCellRenderer; import net.miginfocom.swing.MigLayout; import org.jdesktop.application.Resource; import org.jdesktop.swingx.JXPanel; import org.limewire.core.api.download.DownloadItem; import org.limewire.core.api.download.DownloadState; import org.limewire.ui.swing.components.LimeProgressBar; import org.limewire.ui.swing.components.decorators.ProgressBarDecorator; import org.limewire.ui.swing.util.GuiUtils; import org.limewire.ui.swing.util.I18n; import org.limewire.util.CommonUtils; import com.google.inject.Inject; public class DownloadProgressRenderer extends JXPanel implements TableCellRenderer { @Resource private int progressBarWidth; @Resource private int progressBarHeight; /**the progress bar disappears when the column width is less than this value*/ @Resource private int progressBarCutoffWidth; @Resource private Color progressBarBorder; private LimeProgressBar progressBar; private JLabel timeLabel; @Inject public DownloadProgressRenderer(ProgressBarDecorator progressBarDecorator){ super(new MigLayout("insets 0, gap 0, novisualpadding, nogrid, aligny center")); GuiUtils.assignResources(this); progressBar = new LimeProgressBar(0, 100); progressBarDecorator.decoratePlain(progressBar); progressBar.setBorder(new LineBorder(progressBarBorder)); Dimension size = new Dimension(progressBarWidth, progressBarHeight); progressBar.setMaximumSize(size); progressBar.setPreferredSize(size); timeLabel = new JLabel(); new DownloadRendererProperties().decorateComponent(timeLabel); add(progressBar); add(timeLabel); } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if(value instanceof DownloadItem) { DownloadItem item = (DownloadItem)value; updateProgress(item.getState(), item.getPercentComplete(), table.getColumnModel().getColumn(column).getWidth()); updateTime(item.getState(), item); } else { updateProgress(DownloadState.ERROR, 0, 0); timeLabel.setVisible(false); } return this; } private void updateProgress(DownloadState state, int percentComplete, int columnWidth) { progressBar.setValue(percentComplete); progressBar.setVisible(columnWidth > progressBarCutoffWidth && (state == DownloadState.DOWNLOADING || state == DownloadState.PAUSED)); progressBar.setEnabled(state != DownloadState.PAUSED); } private void updateTime(DownloadState state, DownloadItem item){ if (state != DownloadState.DOWNLOADING || item.getRemainingDownloadTime() > Long.MAX_VALUE - 1000) { timeLabel.setVisible(false); } else { timeLabel.setText(I18n.tr("{0} left", CommonUtils.seconds2time(item .getRemainingDownloadTime()))); timeLabel.setMinimumSize(timeLabel.getPreferredSize()); timeLabel.setVisible(true); } } }