// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.gui.history;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.awt.Color;
import java.awt.Component;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.data.osm.OsmPrimitive;
import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive;
import org.openstreetmap.josm.gui.layer.OsmDataLayer;
import org.openstreetmap.josm.tools.ImageProvider;
/**
* The {@see TableCellRenderer} for a list of versions in {@see HistoryBrower}
*
*/
public class VersionTableCellRenderer extends JLabel implements TableCellRenderer {
@SuppressWarnings("unused")
static private Logger logger = Logger.getLogger(VersionTableCellRenderer.class.getName());
public final static Color BGCOLOR_SELECTED = new Color(143,170,255);
public final static Color BGCOLOR_IS_REFERENCE_POINT = new Color(255,197,197);
protected HashMap<OsmPrimitiveType, ImageIcon> icons = null;
public VersionTableCellRenderer() {
loadIcons();
setOpaque(true);
}
protected void loadIcons() {
icons = new HashMap<OsmPrimitiveType, ImageIcon>();
icons.put(OsmPrimitiveType.NODE, ImageProvider.get("data", "node"));
icons.put(OsmPrimitiveType.WAY, ImageProvider.get("data", "way"));
icons.put(OsmPrimitiveType.RELATION, ImageProvider.get("data", "relation"));
}
protected void renderIcon(OsmPrimitiveType type) {
ImageIcon icon = type == null? null : icons.get(type);
setIcon(icon);
}
protected void renderText(HistoryOsmPrimitive primitive) {
// render label text
//
StringBuilder sb = new StringBuilder();
if (primitive == null) {
sb.append("");
} else {
String msg = tr(
"Version {0}, {1} (by {2})",
Long.toString(primitive.getVersion()),
new SimpleDateFormat().format(primitive.getTimestamp()),
primitive.getUser()
);
sb.append(msg);
}
setText(sb.toString());
// render tooltip text
//
sb = new StringBuilder();
if (primitive == null) {
sb.append("");
} else {
sb.append(
tr("Version {0} created on {1} by {2}",
Long.toString(primitive.getVersion()),
new SimpleDateFormat().format(primitive.getTimestamp()),
primitive.getUser()
)
);
}
setToolTipText(sb.toString());
}
protected OsmDataLayer getEditLayer() {
try {
return Main.map.mapView.getEditLayer();
} catch(NullPointerException e) {
return null;
}
}
protected void renderLatestText(OsmPrimitive primitive) {
// -- label text
StringBuffer sb = new StringBuffer();
if (primitive == null) {
setText("");
return;
}
if (primitive.isModified()) {
sb.append("*");
}
sb.append(tr("Version {0} in editor", primitive.getVersion()));
if (primitive.isDeleted()) {
sb.append(tr("[deleted]"));
}
setText(sb.toString());
// -- tooltip text
sb = new StringBuffer();
OsmDataLayer l = getEditLayer();
sb.append(
tr(
"Version {0} currently edited in data layer ''{1}''",
primitive.getId(),
l == null ? tr("unknown") : l.getName()
)
);
setToolTipText(sb.toString());
}
protected void renderBackground(JTable table, int row, boolean isSelected) {
Color bgColor = Color.WHITE;
if (isSelected) {
bgColor = BGCOLOR_SELECTED;
} else if (getModel(table).isReferencePointInTime(row)) {
bgColor = BGCOLOR_IS_REFERENCE_POINT;
}
setBackground(bgColor);
}
public void renderVersionFromHistory(HistoryOsmPrimitive primitive, JTable table, int row, boolean isSelected) {
renderIcon(primitive == null? null : primitive.getType());
renderText(primitive);
renderBackground(table, row, isSelected);
}
public void renderLatest(OsmPrimitive primitive, JTable table, int row, boolean isSelected) {
renderIcon(primitive.getType());
renderLatestText(getModel(table).getLatest());
renderBackground(table, row, isSelected);
}
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
if (getModel(table).isLatest(row)) {
renderLatest(getModel(table).getLatest(),table, row, isSelected);
} else {
renderVersionFromHistory((HistoryOsmPrimitive)value, table, row, isSelected);
}
return this;
}
protected HistoryBrowserModel.VersionTableModel getModel(JTable table) {
return (HistoryBrowserModel.VersionTableModel)table.getModel();
}
}