// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.gui.conflict.pair.nodes;
import java.awt.Component;
import java.text.MessageFormat;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.border.Border;
import javax.swing.table.TableCellRenderer;
import org.openstreetmap.josm.command.conflict.WayNodesConflictResolverCommand;
import org.openstreetmap.josm.data.osm.Node;
import org.openstreetmap.josm.gui.DefaultNameFormatter;
import org.openstreetmap.josm.gui.conflict.ConflictColors;
import org.openstreetmap.josm.gui.conflict.pair.AbstractListMergeModel;
import org.openstreetmap.josm.tools.ImageProvider;
/**
* This is the {@link TableCellRenderer} used in the node tables of {@link NodeListMerger}.
* @since 1622
*/
public class NodeListTableCellRenderer extends JLabel implements TableCellRenderer {
private final ImageIcon icon;
private final transient Border rowNumberBorder;
/**
* constructor
*/
public NodeListTableCellRenderer() {
icon = ImageProvider.get("data", "node");
rowNumberBorder = BorderFactory.createEmptyBorder(0, 4, 0, 0);
setOpaque(true);
}
/**
* reset the renderer
*/
protected void reset() {
setBackground(ConflictColors.BGCOLOR.get());
setForeground(ConflictColors.FGCOLOR.get());
setBorder(null);
setIcon(null);
setToolTipText(null);
}
/**
* render a node
* @param model the model
* @param node the node
* @param row the row
* @param isSelected true, if the current row is selected
*/
protected void renderNode(AbstractListMergeModel<Node, WayNodesConflictResolverCommand>.EntriesTableModel model, Node node,
int row, boolean isSelected) {
setIcon(icon);
setBorder(null);
if (model.getListMergeModel().isFrozen()) {
setBackground(ConflictColors.BGCOLOR_FROZEN.get());
} else if (isSelected) {
setBackground(ConflictColors.BGCOLOR_SELECTED.get());
} else if (model.isParticipatingInCurrentComparePair()) {
if (model.isSamePositionInOppositeList(row)) {
setBackground(ConflictColors.BGCOLOR_SAME_POSITION_IN_OPPOSITE.get());
} else if (model.isIncludedInOppositeList(row)) {
setBackground(ConflictColors.BGCOLOR_IN_OPPOSITE.get());
} else {
setBackground(ConflictColors.BGCOLOR_NOT_IN_OPPOSITE.get());
}
}
setText(node.getDisplayName(DefaultNameFormatter.getInstance()));
setToolTipText(DefaultNameFormatter.getInstance().buildDefaultToolTip(node));
}
/**
* render an empty row
*/
protected void renderEmptyRow() {
setIcon(null);
setBackground(ConflictColors.BGCOLOR_EMPTY_ROW.get());
setText("");
}
/**
* render the row id
* @param model the model
* @param row the row index
*/
protected void renderRowId(AbstractListMergeModel<Node, WayNodesConflictResolverCommand>.EntriesTableModel model, int row) {
setIcon(null);
setBorder(rowNumberBorder);
if (model.getListMergeModel().isFrozen()) {
setBackground(ConflictColors.BGCOLOR_FROZEN.get());
} else if (model.isParticipatingInCurrentComparePair()) {
setBackground(ConflictColors.BGCOLOR_PARTICIPATING_IN_COMPARISON.get());
setForeground(ConflictColors.FGCOLOR_PARTICIPATING_IN_COMPARISON.get());
}
setText(Integer.toString(row+1));
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
Node node = (Node) value;
reset();
if (node == null) {
renderEmptyRow();
} else {
switch(column) {
case 0:
renderRowId(getModel(table), row);
break;
case 1:
renderNode(getModel(table), node, row, isSelected);
break;
default:
// should not happen
throw new IllegalArgumentException(MessageFormat.format("Unexpected column index. Got {0}.", column));
}
}
return this;
}
/**
* replies the model
* @param table the table
* @return the table model
*/
@SuppressWarnings("unchecked")
protected AbstractListMergeModel<Node, WayNodesConflictResolverCommand>.EntriesTableModel getModel(JTable table) {
return (AbstractListMergeModel<Node, WayNodesConflictResolverCommand>.EntriesTableModel) table.getModel();
}
}