001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.gui.conflict.pair.relation; 003 004import java.awt.Color; 005import java.awt.Component; 006 007import javax.swing.BorderFactory; 008import javax.swing.JLabel; 009import javax.swing.JTable; 010import javax.swing.border.Border; 011import javax.swing.table.TableCellRenderer; 012 013import org.openstreetmap.josm.data.osm.Node; 014import org.openstreetmap.josm.data.osm.RelationMember; 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 tables of {@link RelationMemberMerger}. 022 * 023 */ 024public class RelationMemberTableCellRenderer extends JLabel implements TableCellRenderer { 025 private Border rowNumberBorder = null; 026 027 /** 028 * constructor 029 */ 030 public RelationMemberTableCellRenderer() { 031 setIcon(null); 032 setOpaque(true); 033 rowNumberBorder = BorderFactory.createEmptyBorder(0,4,0,0); 034 } 035 036 /** 037 * reset the renderer 038 */ 039 protected void reset() { 040 setBackground(ConflictColors.BGCOLOR.get()); 041 setForeground(ConflictColors.FGCOLOR.get()); 042 setBorder(null); 043 setIcon(null); 044 setToolTipText(null); 045 } 046 047 protected void renderBackground(ListMergeModel<Node>.EntriesTableModel model, RelationMember member, int row, int col, boolean isSelected) { 048 Color bgc = ConflictColors.BGCOLOR.get(); 049 if (col == 0) { 050 if (model.getListMergeModel().isFrozen()) { 051 bgc = ConflictColors.BGCOLOR_FROZEN.get(); 052 } else if (model.isParticipatingInCurrentComparePair()) { 053 bgc = ConflictColors.BGCOLOR_PARTICIPATING_IN_COMPARISON.get(); 054 } else if (isSelected) { 055 bgc = ConflictColors.BGCOLOR_SELECTED.get(); 056 } 057 } else { 058 if (model.getListMergeModel().isFrozen()) { 059 bgc = ConflictColors.BGCOLOR_FROZEN.get(); 060 } else if (member == null) { 061 bgc = ConflictColors.BGCOLOR_EMPTY_ROW.get(); 062 } else if (isSelected) { 063 bgc = ConflictColors.BGCOLOR_SELECTED.get(); 064 } else { 065 if (model.isParticipatingInCurrentComparePair()) { 066 if (model.isSamePositionInOppositeList(row)) { 067 bgc = ConflictColors.BGCOLOR_SAME_POSITION_IN_OPPOSITE.get(); 068 } else if (model.isIncludedInOppositeList(row)) { 069 bgc = ConflictColors.BGCOLOR_IN_OPPOSITE.get(); 070 } else { 071 bgc = ConflictColors.BGCOLOR_NOT_IN_OPPOSITE.get(); 072 } 073 } 074 } 075 } 076 setBackground(bgc); 077 } 078 079 protected void renderForeground(ListMergeModel<Node>.EntriesTableModel model, RelationMember member, int row, int col, boolean isSelected) { 080 Color fgc = ConflictColors.FGCOLOR.get(); 081 if (col == 0 && model.isParticipatingInCurrentComparePair() && ! model.getListMergeModel().isFrozen()) { 082 fgc = ConflictColors.FGCOLOR_PARTICIPATING_IN_COMPARISON.get(); 083 } 084 setForeground(fgc); 085 } 086 087 protected void renderRole(RelationMember member) { 088 setText(member.getRole()); 089 setToolTipText(member.getRole()); 090 } 091 092 protected void renderPrimitive(RelationMember member) { 093 String displayName = member.getMember().getDisplayName(DefaultNameFormatter.getInstance()); 094 setText(displayName); 095 setToolTipText(DefaultNameFormatter.getInstance().buildDefaultToolTip(member.getMember())); 096 setIcon(ImageProvider.get(member.getDisplayType())); 097 } 098 099 /** 100 * render the row id 101 * @param row the row index 102 */ 103 protected void renderRowId(int row) { 104 setBorder(rowNumberBorder); 105 setText(Integer.toString(row+1)); 106 } 107 108 protected void renderEmptyRow() { 109 setIcon(null); 110 setBackground(ConflictColors.BGCOLOR_EMPTY_ROW.get()); 111 setText(""); 112 } 113 114 @Override 115 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, 116 int row, int column) { 117 118 RelationMember member = (RelationMember)value; 119 reset(); 120 if (member == null) { 121 renderEmptyRow(); 122 } else { 123 renderBackground(getModel(table), member, row, column, isSelected); 124 renderForeground(getModel(table), member, row, column, isSelected); 125 switch(column) { 126 case 0: 127 renderRowId(row); 128 break; 129 case 1: 130 renderRole(member); 131 break; 132 case 2: 133 renderPrimitive(member); 134 break; 135 default: 136 // should not happen 137 } 138 } 139 return this; 140 } 141 142 /** 143 * replies the model 144 * @param table the table 145 * @return the table model 146 */ 147 @SuppressWarnings("unchecked") 148 protected ListMergeModel<Node>.EntriesTableModel getModel(JTable table) { 149 return (ListMergeModel<Node>.EntriesTableModel)table.getModel(); 150 } 151}