/*
* Copyright 2004 - 2008 Christian Sprajc. All rights reserved.
*
* This file is part of PowerFolder.
*
* PowerFolder 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.
*
* PowerFolder 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 PowerFolder. If not, see <http://www.gnu.org/licenses/>.
*
* $Id$
*/
package de.dal33t.powerfolder.ui.render;
import java.awt.Component;
import java.util.Date;
import javax.swing.JProgressBar;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import com.jgoodies.forms.factories.Borders;
import de.dal33t.powerfolder.Controller;
import de.dal33t.powerfolder.Member;
import de.dal33t.powerfolder.light.FileInfo;
import de.dal33t.powerfolder.light.FolderInfo;
import de.dal33t.powerfolder.light.MemberInfo;
import de.dal33t.powerfolder.transfer.Download;
import de.dal33t.powerfolder.transfer.Transfer;
import de.dal33t.powerfolder.transfer.TransferProblem;
import de.dal33t.powerfolder.transfer.Upload;
import de.dal33t.powerfolder.ui.util.ColorUtil;
import de.dal33t.powerfolder.ui.util.Icons;
import de.dal33t.powerfolder.ui.util.UIUtil;
import de.dal33t.powerfolder.util.EstimatedTime;
import de.dal33t.powerfolder.util.Format;
import de.dal33t.powerfolder.util.TransferCounter;
import de.dal33t.powerfolder.util.Translation;
/**
* Renderer for any transfer table
*
* @author <a href="mailto:totmacher@powerfolder.com">Christian Sprajc </a>
* @version $Revision: 1.20 $
*/
public class UploadTableCellRenderer extends DefaultTableCellRenderer {
// private static final Logger LOG =
// Logger.getLogger(TransferTableCellRenderer.class);
private Controller controller;
private JProgressBar bar;
/**
* Initalizes the renderer for a transfertable. renderDownloads determines
* if we are rendering ul or dls. Maybe split this class up into two
*
* @param controller
*/
public UploadTableCellRenderer(Controller controller) {
this.controller = controller;
this.bar = new JProgressBar();
bar.setBorderPainted(false);
bar.setBorder(Borders.EMPTY_BORDER);
bar.setStringPainted(true);
// Listen for ui l&f changes
UIUtil.addUIChangeTask(new Runnable() {
public void run() {
bar.updateUI();
}
});
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column)
{
Component defaultComp = super.getTableCellRendererComponent(table,
value, isSelected, hasFocus, row, column);
if (value instanceof Transfer) {
Transfer transfer = (Transfer) value;
TransferCounter counter = transfer.getCounter();
// Show bar
bar.setValue((int) (Math.max(0, transfer.getStateProgress()) * 100));
// bar.setBackground(defaultComp.getBackground());
if (value instanceof Download) {
Download download = (Download) transfer;
if (download.getTransferProblem() != null
&& shouldShowProblem(download.getTransferProblem()))
{
TransferProblem transferProblem = download
.getTransferProblem();
String problemInformation = download
.getProblemInformation();
if (problemInformation == null) {
bar.setString(Translation
.getTranslation(transferProblem.getTranslationId()));
} else {
bar.setString(Translation.getTranslation(
transferProblem.getTranslationId(),
problemInformation));
}
} else {
Transfer.TransferState state = download.getTransferState();
if (state == null) {
state = Transfer.TransferState.NONE;
}
switch (state) {
case MATCHING :
case VERIFYING :
case FILERECORD_REQUEST :
case COPYING :
bar.setString(Translation.getTranslation(state
.getTranslationId()));
break;
case DOWNLOADING :
EstimatedTime et = new EstimatedTime(download
.getDownloadManager().getCounter()
.calculateEstimatedMillisToCompletion(),
!download.isCompleted() && download.isStarted());
// EstimatedTime et = new EstimatedTime(download
// .getCounter()
// .calculateEstimatedMillisToCompletion(),
// !download.isCompleted() && download.isStarted());
String kbs = Translation.getTranslation(
"transfers.kbs", Format.formatDecimal(counter
.calculateCurrentKBS()));
String text = (et.isActive() ? et.toString()
+ " - " : "")
+ kbs;
bar.setString(text);
break;
default :
if (download.isCompleted()) {
Date completedDate = download
.getCompletedDate();
String dateStr = completedDate != null ? Format
.formatDateShort(completedDate, true) : "";
bar.setString(Translation.getTranslation(
"transfers.completed", dateStr));
} else if (download.isQueued()) {
bar.setString(Translation
.getTranslation("transfers.queued"));
} else if (download.isPending()) {
bar.setString(Translation
.getTranslation("transfers.pending"));
} else {
bar.setString(Translation
.getTranslation("transfers.requested"));
}
}
}
} else if (value instanceof Upload) {
Upload upload = (Upload) transfer;
switch (upload.getTransferState()) {
case FILEHASHING :
case REMOTEMATCHING :
bar.setString(Translation.getTranslation(upload
.getTransferState().getTranslationId()));
break;
default :
if (upload.isCompleted()) {
Date completedDate = transfer.getCompletedDate();
String dateStr = completedDate != null ? Format
.formatDateShort(completedDate, true) : "";
bar.setString(Translation.getTranslation(
"transfers.completed", dateStr));
} else if (upload.isStarted()) {
bar.setString(Translation.getTranslation(
"transfers.kbs", Format.formatDecimal(counter
.calculateCurrentKBS())));
} else {
bar.setString(Translation
.getTranslation("transfers.queued"));
}
}
}
return bar;
} else if (value instanceof FileInfo) {
if (column == 0) { // File type
FileInfo fInfo = (FileInfo) value;
setIcon(Icons.getEnabledIconFor(fInfo, controller));
setText("");
} else { // File info
FileInfo fInfo = (FileInfo) value;
setText(fInfo.getFilenameOnly());
setIcon(null);
setHorizontalAlignment(LEFT);
}
} else if (value instanceof Long) {
Long size = (Long) value;
setText(Format.formatBytesShort(size));
setIcon(null);
setHorizontalAlignment(RIGHT);
} else if (value instanceof FolderInfo) {
FolderInfo foInfo = (FolderInfo) value;
setText(foInfo.name);
setHorizontalAlignment(LEFT);
} else if (value instanceof Member) {
Member node = (Member) value;
String nickText = node.getNick();
if (node.isOnLAN()) {
nickText += " ("
+ Translation.getTranslation("transfers.local") + ')';
}
setText(nickText);
setHorizontalAlignment(LEFT);
} else if (value instanceof MemberInfo) {
MemberInfo node = (MemberInfo) value;
String nickText = node.nick;
setText(nickText);
setIcon(null);
setHorizontalAlignment(LEFT);
} else if (value instanceof EstimatedTime) {
EstimatedTime time = (EstimatedTime) value;
if (time.isActive()) {
setText(Format.formatDeltaTime(time.getDeltaTimeMillis()));
} else {
setText("");
}
setIcon(null);
setHorizontalAlignment(CENTER);
} else {
setText(Translation.getTranslation("transfers.searching"));
setIcon(null);
setHorizontalAlignment(LEFT);
}
if (!isSelected) {
setBackground(row % 2 == 0
? ColorUtil.EVEN_TABLE_ROW_COLOR
: ColorUtil.ODD_TABLE_ROW_COLOR);
}
return defaultComp;
}
/**
* Only some types of problem are relevant for display.
* <p>
* TODO COPIED from DownloadsTableModel
*
* @param problem
* the transfer problem
* @return true if it should be displayed.
*/
private static boolean shouldShowProblem(TransferProblem problem) {
return TransferProblem.FILE_NOT_FOUND_EXCEPTION.equals(problem)
|| TransferProblem.IO_EXCEPTION.equals(problem)
|| TransferProblem.TEMP_FILE_DELETE.equals(problem)
|| TransferProblem.TEMP_FILE_OPEN.equals(problem)
|| TransferProblem.TEMP_FILE_WRITE.equals(problem)
|| TransferProblem.MD5_ERROR.equals(problem);
}
}