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 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 * @param isSelected true, if the current row is selected 089 */ 090 protected void renderRowId( ListMergeModel<Node>.EntriesTableModel model, int row, boolean isSelected) { 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, isSelected); 114 break; 115 case 1: 116 renderNode(getModel(table), node, row, isSelected); 117 break; 118 default: 119 // should not happen 120 throw new RuntimeException(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}