001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.gui.conflict.pair.nodes; 003 004import java.awt.Component; 005import java.text.MessageFormat; 006 007import javax.swing.BorderFactory; 008import javax.swing.ImageIcon; 009import javax.swing.JLabel; 010import javax.swing.JTable; 011import javax.swing.border.Border; 012import javax.swing.table.TableCellRenderer; 013 014import org.openstreetmap.josm.command.conflict.WayNodesConflictResolverCommand; 015import org.openstreetmap.josm.data.osm.DefaultNameFormatter; 016import org.openstreetmap.josm.data.osm.Node; 017import org.openstreetmap.josm.gui.conflict.ConflictColors; 018import org.openstreetmap.josm.gui.conflict.pair.AbstractListMergeModel; 019import org.openstreetmap.josm.tools.ImageProvider; 020 021/** 022 * This is the {@link TableCellRenderer} used in the node tables of {@link NodeListMerger}. 023 * @since 1622 024 */ 025public class NodeListTableCellRenderer extends JLabel implements TableCellRenderer { 026 027 private final ImageIcon icon; 028 private final transient Border rowNumberBorder; 029 030 /** 031 * constructor 032 */ 033 public NodeListTableCellRenderer() { 034 icon = ImageProvider.get("data", "node"); 035 rowNumberBorder = BorderFactory.createEmptyBorder(0, 4, 0, 0); 036 setOpaque(true); 037 } 038 039 /** 040 * reset the renderer 041 */ 042 protected void reset() { 043 setBackground(ConflictColors.BGCOLOR.get()); 044 setForeground(ConflictColors.FGCOLOR.get()); 045 setBorder(null); 046 setIcon(null); 047 setToolTipText(null); 048 } 049 050 /** 051 * render a node 052 * @param model the model 053 * @param node the node 054 * @param row the row 055 * @param isSelected true, if the current row is selected 056 */ 057 protected void renderNode(AbstractListMergeModel<Node, WayNodesConflictResolverCommand>.EntriesTableModel model, Node node, 058 int row, boolean isSelected) { 059 setIcon(icon); 060 setBorder(null); 061 if (model.getListMergeModel().isFrozen()) { 062 setBackground(ConflictColors.BGCOLOR_FROZEN.get()); 063 } else if (isSelected) { 064 setBackground(ConflictColors.BGCOLOR_SELECTED.get()); 065 } else if (model.isParticipatingInCurrentComparePair()) { 066 if (model.isSamePositionInOppositeList(row)) { 067 setBackground(ConflictColors.BGCOLOR_SAME_POSITION_IN_OPPOSITE.get()); 068 } else if (model.isIncludedInOppositeList(row)) { 069 setBackground(ConflictColors.BGCOLOR_IN_OPPOSITE.get()); 070 } else { 071 setBackground(ConflictColors.BGCOLOR_NOT_IN_OPPOSITE.get()); 072 } 073 } 074 setText(node.getDisplayName(DefaultNameFormatter.getInstance())); 075 setToolTipText(DefaultNameFormatter.getInstance().buildDefaultToolTip(node)); 076 } 077 078 /** 079 * render an empty row 080 */ 081 protected void renderEmptyRow() { 082 setIcon(null); 083 setBackground(ConflictColors.BGCOLOR_EMPTY_ROW.get()); 084 setText(""); 085 } 086 087 /** 088 * render the row id 089 * @param model the model 090 * @param row the row index 091 */ 092 protected void renderRowId(AbstractListMergeModel<Node, WayNodesConflictResolverCommand>.EntriesTableModel model, int row) { 093 setIcon(null); 094 setBorder(rowNumberBorder); 095 if (model.getListMergeModel().isFrozen()) { 096 setBackground(ConflictColors.BGCOLOR_FROZEN.get()); 097 } else if (model.isParticipatingInCurrentComparePair()) { 098 setBackground(ConflictColors.BGCOLOR_PARTICIPATING_IN_COMPARISON.get()); 099 setForeground(ConflictColors.FGCOLOR_PARTICIPATING_IN_COMPARISON.get()); 100 } 101 setText(Integer.toString(row+1)); 102 } 103 104 @Override 105 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, 106 int row, int column) { 107 108 Node node = (Node) value; 109 reset(); 110 if (node == null) { 111 renderEmptyRow(); 112 } else { 113 switch(column) { 114 case 0: 115 renderRowId(getModel(table), row); 116 break; 117 case 1: 118 renderNode(getModel(table), node, row, isSelected); 119 break; 120 default: 121 // should not happen 122 throw new IllegalArgumentException(MessageFormat.format("Unexpected column index. Got {0}.", column)); 123 } 124 } 125 return this; 126 } 127 128 /** 129 * replies the model 130 * @param table the table 131 * @return the table model 132 */ 133 @SuppressWarnings("unchecked") 134 protected AbstractListMergeModel<Node, WayNodesConflictResolverCommand>.EntriesTableModel getModel(JTable table) { 135 return (AbstractListMergeModel<Node, WayNodesConflictResolverCommand>.EntriesTableModel) table.getModel(); 136 } 137}