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