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.OsmPrimitivRenderer;
015import org.openstreetmap.josm.gui.conflict.ConflictColors;
016import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField;
017
018public class RelationMemberConflictResolverColumnModel extends DefaultTableColumnModel {
019
020    static final class MemberRenderer extends OsmPrimitivRenderer {
021        @Override
022        public Component getTableCellRendererComponent(JTable table,
023                Object value, boolean isSelected, boolean hasFocus, int row, int column) {
024            return setColors(super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column),
025                    table, isSelected, row);
026        }
027    }
028
029    private final DefaultTableCellRenderer defaultTableCellRenderer = new DefaultTableCellRenderer();
030
031    private final transient OsmPrimitivRenderer primitiveRenderer = new MemberRenderer();
032
033    private final transient TableCellRenderer tableRenderer = (table, value, isSelected, hasFocus, row, column)
034            -> setColors(defaultTableCellRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column),
035            table, isSelected, row);
036
037    /**
038     * Constructs a new {@code RelationMemberConflictResolverColumnModel}.
039     */
040    public RelationMemberConflictResolverColumnModel() {
041        createColumns();
042    }
043
044    private static Component setColors(Component comp, JTable table, boolean isSelected, int row) {
045        if (table.getModel() instanceof RelationMemberConflictResolverModel) {
046            RelationMemberConflictResolverModel model = (RelationMemberConflictResolverModel) table.getModel();
047
048            if (!isSelected && comp != null) {
049                switch (model.getDecision(row).getDecision()) {
050                case UNDECIDED:
051                    comp.setForeground(ConflictColors.FGCOLOR_UNDECIDED.get());
052                    comp.setBackground(ConflictColors.BGCOLOR_UNDECIDED.get());
053                    break;
054                case KEEP:
055                    comp.setForeground(ConflictColors.FGCOLOR_MEMBER_KEEP.get());
056                    comp.setBackground(ConflictColors.BGCOLOR_MEMBER_KEEP.get());
057                    break;
058                case REMOVE:
059                    comp.setForeground(ConflictColors.FGCOLOR_MEMBER_REMOVE.get());
060                    comp.setBackground(ConflictColors.BGCOLOR_MEMBER_REMOVE.get());
061                    break;
062                }
063            }
064        }
065        return comp;
066    }
067
068    protected final void createColumns() {
069
070        AutoCompletingTextField roleEditor = new AutoCompletingTextField(0, false);
071        RelationMemberConflictDecisionRenderer decisionRenderer = new RelationMemberConflictDecisionRenderer();
072        RelationMemberConflictDecisionEditor decisionEditor = new RelationMemberConflictDecisionEditor();
073
074        // column 0 - Relation
075        TableColumn col = new TableColumn(0);
076        col.setHeaderValue("Relation");
077        col.setResizable(true);
078        col.setWidth(100);
079        col.setPreferredWidth(100);
080        col.setCellRenderer(primitiveRenderer);
081        addColumn(col);
082
083        // column 1 - Position
084        col = new TableColumn(1);
085        col.setHeaderValue(tr("Pos."));
086        col.setResizable(true);
087        col.setWidth(40);
088        col.setPreferredWidth(40);
089        col.setCellRenderer(tableRenderer);
090        col.setMaxWidth(50);
091        addColumn(col);
092
093        // column 2 - Role
094        col = new TableColumn(2);
095        col.setHeaderValue(tr("Role"));
096        col.setResizable(true);
097        col.setCellRenderer(tableRenderer);
098        col.setCellEditor(roleEditor);
099        col.setWidth(50);
100        col.setPreferredWidth(50);
101        addColumn(col);
102
103        // column 3 - Original Way
104        col = new TableColumn(3);
105        col.setHeaderValue(tr("Orig. Way"));
106        col.setResizable(true);
107        col.setCellRenderer(primitiveRenderer);
108        col.setWidth(100);
109        col.setPreferredWidth(100);
110        addColumn(col);
111
112        // column 4 - New Way
113        col = new TableColumn(4);
114        col.setHeaderValue(tr("Decision"));
115        col.setResizable(true);
116        col.setCellRenderer(decisionRenderer);
117        col.setCellEditor(decisionEditor);
118        col.setWidth(100);
119        col.setPreferredWidth(100);
120        col.setMaxWidth(100);
121        addColumn(col);
122    }
123}