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.command.conflict.RelationMemberConflictResolverCommand; 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.AbstractListMergeModel; 018import org.openstreetmap.josm.tools.ImageProvider; 019 020/** 021 * This is the {@link TableCellRenderer} used in the tables of {@link RelationMemberMerger}. 022 * @since 1631 023 */ 024public class RelationMemberTableCellRenderer extends JLabel implements TableCellRenderer { 025 private final transient Border rowNumberBorder; 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(AbstractListMergeModel<RelationMember, RelationMemberConflictResolverCommand>.EntriesTableModel model, 048 RelationMember member, int row, int col, boolean isSelected) { 049 Color bgc = ConflictColors.BGCOLOR.get(); 050 if (col == 0) { 051 if (model.getListMergeModel().isFrozen()) { 052 bgc = ConflictColors.BGCOLOR_FROZEN.get(); 053 } else if (model.isParticipatingInCurrentComparePair()) { 054 bgc = ConflictColors.BGCOLOR_PARTICIPATING_IN_COMPARISON.get(); 055 } else if (isSelected) { 056 bgc = ConflictColors.BGCOLOR_SELECTED.get(); 057 } 058 } else { 059 if (model.getListMergeModel().isFrozen()) { 060 bgc = ConflictColors.BGCOLOR_FROZEN.get(); 061 } else if (member == null) { 062 bgc = ConflictColors.BGCOLOR_EMPTY_ROW.get(); 063 } else if (isSelected) { 064 bgc = ConflictColors.BGCOLOR_SELECTED.get(); 065 } else { 066 if (model.isParticipatingInCurrentComparePair()) { 067 if (model.isSamePositionInOppositeList(row)) { 068 bgc = ConflictColors.BGCOLOR_SAME_POSITION_IN_OPPOSITE.get(); 069 } else if (model.isIncludedInOppositeList(row)) { 070 bgc = ConflictColors.BGCOLOR_IN_OPPOSITE.get(); 071 } else { 072 bgc = ConflictColors.BGCOLOR_NOT_IN_OPPOSITE.get(); 073 } 074 } 075 } 076 } 077 setBackground(bgc); 078 } 079 080 protected void renderForeground(AbstractListMergeModel<RelationMember, RelationMemberConflictResolverCommand>.EntriesTableModel model, 081 RelationMember member, int row, int col, boolean isSelected) { 082 Color fgc = ConflictColors.FGCOLOR.get(); 083 if (col == 0 && model.isParticipatingInCurrentComparePair() && !model.getListMergeModel().isFrozen()) { 084 fgc = ConflictColors.FGCOLOR_PARTICIPATING_IN_COMPARISON.get(); 085 } 086 setForeground(fgc); 087 } 088 089 protected void renderRole(RelationMember member) { 090 setText(member.getRole()); 091 setToolTipText(member.getRole()); 092 } 093 094 protected void renderPrimitive(RelationMember member) { 095 String displayName = member.getMember().getDisplayName(DefaultNameFormatter.getInstance()); 096 setText(displayName); 097 setToolTipText(DefaultNameFormatter.getInstance().buildDefaultToolTip(member.getMember())); 098 setIcon(ImageProvider.get(member.getDisplayType())); 099 } 100 101 /** 102 * render the row id 103 * @param row the row index 104 */ 105 protected void renderRowId(int row) { 106 setBorder(rowNumberBorder); 107 setText(Integer.toString(row+1)); 108 } 109 110 protected void renderEmptyRow() { 111 setIcon(null); 112 setBackground(ConflictColors.BGCOLOR_EMPTY_ROW.get()); 113 setText(""); 114 } 115 116 @Override 117 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, 118 int row, int column) { 119 120 RelationMember member = (RelationMember) value; 121 reset(); 122 if (member == null) { 123 renderEmptyRow(); 124 } else { 125 renderBackground(getModel(table), member, row, column, isSelected); 126 renderForeground(getModel(table), member, row, column, isSelected); 127 switch(column) { 128 case 0: 129 renderRowId(row); 130 break; 131 case 1: 132 renderRole(member); 133 break; 134 case 2: 135 renderPrimitive(member); 136 break; 137 default: 138 // should not happen 139 } 140 } 141 return this; 142 } 143 144 /** 145 * replies the model 146 * @param table the table 147 * @return the table model 148 */ 149 @SuppressWarnings("unchecked") 150 protected AbstractListMergeModel<RelationMember, RelationMemberConflictResolverCommand>.EntriesTableModel getModel(JTable table) { 151 return (AbstractListMergeModel<RelationMember, RelationMemberConflictResolverCommand>.EntriesTableModel) table.getModel(); 152 } 153}