001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.gui.conflict.tags; 003 004import static org.openstreetmap.josm.tools.I18n.tr; 005 006import java.awt.Component; 007import java.util.EnumSet; 008 009import javax.swing.JTable; 010import javax.swing.table.DefaultTableCellRenderer; 011import javax.swing.table.DefaultTableColumnModel; 012import javax.swing.table.TableCellRenderer; 013import javax.swing.table.TableColumn; 014 015import org.openstreetmap.josm.gui.PrimitiveRenderer; 016import org.openstreetmap.josm.gui.conflict.ConflictColors; 017import org.openstreetmap.josm.gui.conflict.pair.relation.RelationMemberTable; 018import org.openstreetmap.josm.gui.history.VersionTable; 019import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField; 020 021/** 022 * This class defines the columns of a {@link RelationMemberTable} 023 */ 024public class RelationMemberConflictResolverColumnModel extends DefaultTableColumnModel { 025 026 static final class MemberRenderer extends PrimitiveRenderer { 027 @Override 028 public Component getTableCellRendererComponent(JTable table, 029 Object value, boolean isSelected, boolean hasFocus, int row, int column) { 030 return setColors(super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column), 031 table, isSelected, row); 032 } 033 } 034 035 private final DefaultTableCellRenderer defaultTableCellRenderer = new DefaultTableCellRenderer(); 036 037 private final transient PrimitiveRenderer primitiveRenderer = new MemberRenderer(); 038 039 private final transient TableCellRenderer tableRenderer = (table, value, isSelected, hasFocus, row, column) 040 -> setColors(defaultTableCellRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column), 041 table, isSelected, row); 042 043 /** 044 * Constructs a new {@code RelationMemberConflictResolverColumnModel}. 045 */ 046 public RelationMemberConflictResolverColumnModel() { 047 createColumns(); 048 } 049 050 private static Component setColors(Component comp, JTable table, boolean isSelected, int row) { 051 if (table.getModel() instanceof RelationMemberConflictResolverModel) { 052 RelationMemberConflictResolverModel model = (RelationMemberConflictResolverModel) table.getModel(); 053 054 if (!isSelected && comp != null) { 055 switch (model.getDecision(row).getDecision()) { 056 case UNDECIDED: 057 comp.setForeground(ConflictColors.FGCOLOR_UNDECIDED.get()); 058 comp.setBackground(ConflictColors.BGCOLOR_UNDECIDED.get()); 059 break; 060 case KEEP: 061 comp.setForeground(ConflictColors.FGCOLOR_MEMBER_KEEP.get()); 062 comp.setBackground(ConflictColors.BGCOLOR_MEMBER_KEEP.get()); 063 break; 064 case REMOVE: 065 comp.setForeground(ConflictColors.FGCOLOR_MEMBER_REMOVE.get()); 066 comp.setBackground(ConflictColors.BGCOLOR_MEMBER_REMOVE.get()); 067 break; 068 } 069 } 070 } 071 return comp; 072 } 073 074 protected final void createColumns() { 075 076 AutoCompletingTextField roleEditor = new AutoCompletingTextField(0, false); 077 078 // column 0 - Relation 079 TableColumn col = new TableColumn(0); 080 col.setHeaderValue("Relation"); 081 col.setResizable(true); 082 col.setWidth(100); 083 col.setPreferredWidth(100); 084 col.setCellRenderer(primitiveRenderer); 085 addColumn(col); 086 087 // column 1 - Position 088 col = new TableColumn(1); 089 col.setHeaderValue(tr("Pos.")); 090 col.setResizable(true); 091 col.setWidth(40); 092 col.setPreferredWidth(40); 093 col.setCellRenderer(tableRenderer); 094 col.setMaxWidth(50); 095 addColumn(col); 096 097 // column 2 - Role 098 col = new TableColumn(2); 099 col.setHeaderValue(tr("Role")); 100 col.setResizable(true); 101 col.setCellRenderer(tableRenderer); 102 col.setCellEditor(roleEditor); 103 col.setWidth(50); 104 col.setPreferredWidth(50); 105 addColumn(col); 106 107 // column 3 - Original Way 108 col = new TableColumn(3); 109 col.setHeaderValue(tr("Orig. Way")); 110 col.setResizable(true); 111 col.setCellRenderer(primitiveRenderer); 112 col.setWidth(100); 113 col.setPreferredWidth(100); 114 addColumn(col); 115 116 // column 4 - decision keep 117 // column 5 - decision remove 118 int index = 4; 119 for (RelationMemberConflictDecisionType type : EnumSet.of( 120 RelationMemberConflictDecisionType.KEEP, RelationMemberConflictDecisionType.REMOVE)) { 121 col = new TableColumn(index); 122 col.setHeaderValue(type.getLabelText()); 123 col.setResizable(true); 124 final VersionTable.RadioButtonRenderer renderer = new VersionTable.RadioButtonRenderer(); 125 renderer.setToolTipText(type.getLabelToolTipText()); 126 col.setCellRenderer(renderer); 127 col.setCellEditor(new VersionTable.RadioButtonEditor()); 128 col.setWidth(50); 129 col.setPreferredWidth(50); 130 col.setMaxWidth(50); 131 addColumn(col); 132 index++; 133 } 134 } 135}