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}