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;
007
008import javax.swing.JTable;
009import javax.swing.table.DefaultTableCellRenderer;
010import javax.swing.table.DefaultTableColumnModel;
011import javax.swing.table.TableCellRenderer;
012import javax.swing.table.TableColumn;
013
014import org.openstreetmap.josm.gui.PrimitiveRenderer;
015import org.openstreetmap.josm.gui.conflict.ConflictColors;
016import org.openstreetmap.josm.gui.conflict.pair.relation.RelationMemberTable;
017import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField;
018
019/**
020 * This class defines the columns of a {@link RelationMemberTable}
021 */
022public class RelationMemberConflictResolverColumnModel extends DefaultTableColumnModel {
023
024    static final class MemberRenderer extends PrimitiveRenderer {
025        @Override
026        public Component getTableCellRendererComponent(JTable table,
027                Object value, boolean isSelected, boolean hasFocus, int row, int column) {
028            return setColors(super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column),
029                    table, isSelected, row);
030        }
031    }
032
033    private final DefaultTableCellRenderer defaultTableCellRenderer = new DefaultTableCellRenderer();
034
035    private final transient PrimitiveRenderer primitiveRenderer = new MemberRenderer();
036
037    private final transient TableCellRenderer tableRenderer = (table, value, isSelected, hasFocus, row, column)
038            -> setColors(defaultTableCellRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column),
039            table, isSelected, row);
040
041    /**
042     * Constructs a new {@code RelationMemberConflictResolverColumnModel}.
043     */
044    public RelationMemberConflictResolverColumnModel() {
045        createColumns();
046    }
047
048    private static Component setColors(Component comp, JTable table, boolean isSelected, int row) {
049        if (table.getModel() instanceof RelationMemberConflictResolverModel) {
050            RelationMemberConflictResolverModel model = (RelationMemberConflictResolverModel) table.getModel();
051
052            if (!isSelected && comp != null) {
053                switch (model.getDecision(row).getDecision()) {
054                case UNDECIDED:
055                    comp.setForeground(ConflictColors.FGCOLOR_UNDECIDED.get());
056                    comp.setBackground(ConflictColors.BGCOLOR_UNDECIDED.get());
057                    break;
058                case KEEP:
059                    comp.setForeground(ConflictColors.FGCOLOR_MEMBER_KEEP.get());
060                    comp.setBackground(ConflictColors.BGCOLOR_MEMBER_KEEP.get());
061                    break;
062                case REMOVE:
063                    comp.setForeground(ConflictColors.FGCOLOR_MEMBER_REMOVE.get());
064                    comp.setBackground(ConflictColors.BGCOLOR_MEMBER_REMOVE.get());
065                    break;
066                }
067            }
068        }
069        return comp;
070    }
071
072    protected final void createColumns() {
073
074        AutoCompletingTextField roleEditor = new AutoCompletingTextField(0, false);
075        RelationMemberConflictDecisionRenderer decisionRenderer = new RelationMemberConflictDecisionRenderer();
076        RelationMemberConflictDecisionEditor decisionEditor = new RelationMemberConflictDecisionEditor();
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 - New Way
117        col = new TableColumn(4);
118        col.setHeaderValue(tr("Decision"));
119        col.setResizable(true);
120        col.setCellRenderer(decisionRenderer);
121        col.setCellEditor(decisionEditor);
122        col.setWidth(100);
123        col.setPreferredWidth(100);
124        col.setMaxWidth(100);
125        addColumn(col);
126    }
127}