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