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 * 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 isSelected true, if the current row is selected 054 */ 055 protected void renderNode(ListMergeModel<Node>.EntriesTableModel model, Node node, int row, boolean isSelected) { 056 setIcon(icon); 057 setBorder(null); 058 if (model.getListMergeModel().isFrozen()) { 059 setBackground(ConflictColors.BGCOLOR_FROZEN.get()); 060 } else if (isSelected) { 061 setBackground(ConflictColors.BGCOLOR_SELECTED.get()); 062 } else if (model.isParticipatingInCurrentComparePair()) { 063 if (model.isSamePositionInOppositeList(row)) { 064 setBackground(ConflictColors.BGCOLOR_SAME_POSITION_IN_OPPOSITE.get()); 065 } else if (model.isIncludedInOppositeList(row)) { 066 setBackground(ConflictColors.BGCOLOR_IN_OPPOSITE.get()); 067 } else { 068 setBackground(ConflictColors.BGCOLOR_NOT_IN_OPPOSITE.get()); 069 } 070 } 071 setText(node.getDisplayName(DefaultNameFormatter.getInstance())); 072 setToolTipText(DefaultNameFormatter.getInstance().buildDefaultToolTip(node)); 073 } 074 075 /** 076 * render an empty row 077 */ 078 protected void renderEmptyRow() { 079 setIcon(null); 080 setBackground(ConflictColors.BGCOLOR_EMPTY_ROW.get()); 081 setText(""); 082 } 083 084 /** 085 * render the row id 086 * @param model the model 087 * @param row the row index 088 */ 089 protected void renderRowId(ListMergeModel<Node>.EntriesTableModel model, int row) { 090 setIcon(null); 091 setBorder(rowNumberBorder); 092 if (model.getListMergeModel().isFrozen()) { 093 setBackground(ConflictColors.BGCOLOR_FROZEN.get()); 094 } else if (model.isParticipatingInCurrentComparePair()) { 095 setBackground(ConflictColors.BGCOLOR_PARTICIPATING_IN_COMPARISON.get()); 096 setForeground(ConflictColors.FGCOLOR_PARTICIPATING_IN_COMPARISON.get()); 097 } 098 setText(Integer.toString(row+1)); 099 } 100 101 @Override 102 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, 103 int row, int column) { 104 105 Node node = (Node) value; 106 reset(); 107 if (node == null) { 108 renderEmptyRow(); 109 } else { 110 switch(column) { 111 case 0: 112 renderRowId(getModel(table), row); 113 break; 114 case 1: 115 renderNode(getModel(table), node, row, isSelected); 116 break; 117 default: 118 // should not happen 119 throw new RuntimeException(MessageFormat.format("Unexpected column index. Got {0}.", column)); 120 } 121 } 122 return this; 123 } 124 125 /** 126 * replies the model 127 * @param table the table 128 * @return the table model 129 */ 130 @SuppressWarnings("unchecked") 131 protected ListMergeModel<Node>.EntriesTableModel getModel(JTable table) { 132 return (ListMergeModel<Node>.EntriesTableModel) table.getModel(); 133 } 134}