package org.limewire.ui.swing.downloads.table.renderer;
import java.awt.Component;
import java.util.Collection;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import org.limewire.core.api.download.DownloadItem;
import org.limewire.core.api.download.DownloadState;
import org.limewire.core.api.download.DownloadItem.DownloadItemType;
import org.limewire.core.api.endpoint.RemoteHost;
import org.limewire.friend.api.Friend;
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 DownloadMessageRenderer extends DefaultTableCellRenderer {
@Inject
public DownloadMessageRenderer(){
new DownloadRendererProperties().decorateComponent(this);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
if(value instanceof DownloadItem) {
DownloadItem item = (DownloadItem)value;
return super.getTableCellRendererComponent(table, getPercentMessage(item) + getMessage(item.getState(), item), isSelected, false, row, column);
} else {
return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
}
}
private String getPercentMessage(DownloadItem item){
int percent = item.getPercentComplete();
DownloadState state = item.getState();
if (percent == 0 || state == DownloadState.DONE || state == DownloadState.DOWNLOADING || state == DownloadState.ERROR){
return "";
}
return percent + "% - ";
}
/**
* @return the message displayed after the percentage. Can be null for non-covered states.
*/
private String getMessage(DownloadState state, DownloadItem item) {
switch (state) {
case RESUMING:
return I18n.tr("Resuming");
case CANCELLED:
return I18n.tr("Canceled");
case FINISHING:
return I18n.tr("Finishing...");
case DONE:
return I18n.tr("Done");
case CONNECTING:
Collection<RemoteHost> hosts = item.getRemoteHosts();
if(hosts.size() == 0){
return I18n.tr("Connecting...");
}
//{0}: 1 person, 2 people, etc
return I18n.tr("Connecting to {0}", getPeopleText(item));
case DOWNLOADING:
// {0}: current size
// {1}: total size
// {2}: download speed
// {3}: download source
if(item.getDownloadSourceCount() == 0){
return I18n.tr("{0} of {1} ({2})",
GuiUtils.toUnitbytes(item.getCurrentSize()),
GuiUtils.toUnitbytes(item.getTotalSize()),
GuiUtils.rate2speed(item.getDownloadSpeed()));
} else {
return I18n.tr("{0} of {1} ({2}) from {3}",
GuiUtils.toUnitbytes(item.getCurrentSize()),
GuiUtils.toUnitbytes(item.getTotalSize()),
GuiUtils.rate2speed(item.getDownloadSpeed()),
getPeopleText(item));
}
case TRYING_AGAIN:
return getTryAgainMessage(item.getRemainingTimeInState());
case STALLED:
if(item.getDownloadItemType() == DownloadItemType.BITTORRENT) {
return I18n.tr("Error downloading torrent");
} else {
return I18n.tr("Stalled - {0} of {1}",
GuiUtils.toUnitbytes(item.getCurrentSize()),
GuiUtils.toUnitbytes(item.getTotalSize()));
}
case ERROR:
return I18n.tr("Unable to download: ") + I18n.tr(item.getErrorState().getMessage());
case PAUSED:
// {0}: current size, {1} total size
return I18n.tr("Paused - {0} of {1}",
GuiUtils.toUnitbytes(item.getCurrentSize()), GuiUtils.toUnitbytes(item.getTotalSize()));
case LOCAL_QUEUED:
return getQueueTimeMessage(item.getRemainingTimeInState());
case REMOTE_QUEUED:
if(item.getRemoteQueuePosition() == -1 || item.getRemoteQueuePosition() == Integer.MAX_VALUE){
return getQueueTimeMessage(item.getRemainingTimeInState());
}
return I18n.trn("Waiting - Next in line",
"Waiting - {0} in line",
item.getRemoteQueuePosition(), item.getRemoteQueuePosition());
default:
return null;
}
}
private String getTryAgainMessage(long tryingAgainTime) {
if(tryingAgainTime == DownloadItem.UNKNOWN_TIME){
return I18n.tr("Looking for file...");
} else {
return I18n.tr("Looking for file ({0} left)", CommonUtils.seconds2time(tryingAgainTime));
}
}
private String getPeopleText(DownloadItem item) {
if(item.isStoreDownload()){
return I18n.tr("Store");
}
Collection<RemoteHost> hosts = item.getRemoteHosts();
if (hosts.size() == 0) {
//checking sources to support showing the number of bit torrent hosts.
int downloadSourceCount = item.getDownloadSourceCount();
if(downloadSourceCount < 1) {
return I18n.tr("nobody");
} else {
return I18n.trn("{0} P2P User", "{0} P2P Users", downloadSourceCount);
}
} else if (hosts.size() == 1) {
Friend friend = hosts.iterator().next().getFriendPresence().getFriend();
if (friend.isAnonymous()) {
return I18n.tr("1 P2P User");
} else {
return friend.getRenderName();
}
} else {
boolean hasP2P = false;
boolean hasFriend = false;
for (RemoteHost host : hosts) {
if (host.getFriendPresence().getFriend().isAnonymous()) {
hasP2P = true;
} else {
hasFriend = true;
}
if (hasP2P && hasFriend) {
// We found both. We're done.
break;
}
}
if (hasP2P && hasFriend ) {
return I18n.trn("{0} Person", "{0} People", hosts.size());
} else if (hasP2P) {
return I18n.trn("{0} P2P User", "{0} P2P Users", hosts.size());
} else {
//just friends
return I18n.trn("{0} Friend", "{0} Friends", hosts.size());
}
}
}
private String getQueueTimeMessage(long queueTime){
//if(queueTime == DownloadItem.UNKNOWN_TIME){
return I18n.tr("Waiting...");
//} else {
// return I18n.tr("Waiting...", CommonUtils.seconds2time(queueTime));
//}
}
}