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