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 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 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        TableColumn col = null;
069
070        // column 0 - Relation
071        col = new TableColumn(0);
072        col.setHeaderValue("Relation");
073        col.setResizable(true);
074        col.setWidth(100);
075        col.setPreferredWidth(100);
076        col.setCellRenderer(primitiveRenderer);
077        addColumn(col);
078
079        // column 1 - Position
080        col = new TableColumn(1);
081        col.setHeaderValue(tr("Pos."));
082        col.setResizable(true);
083        col.setWidth(40);
084        col.setPreferredWidth(40);
085        col.setCellRenderer(tableRenderer);
086        col.setMaxWidth(50);
087        addColumn(col);
088
089        // column 2 - Role
090        col = new TableColumn(2);
091        col.setHeaderValue(tr("Role"));
092        col.setResizable(true);
093        col.setCellRenderer(tableRenderer);
094        col.setCellEditor(roleEditor);
095        col.setWidth(50);
096        col.setPreferredWidth(50);
097        addColumn(col);
098
099        // column 3 - Original Way
100        col = new TableColumn(3);
101        col.setHeaderValue(tr("Orig. Way"));
102        col.setResizable(true);
103        col.setCellRenderer(primitiveRenderer);
104        col.setWidth(100);
105        col.setPreferredWidth(100);
106        addColumn(col);
107
108        // column 4 - New Way
109        col = new TableColumn(4);
110        col.setHeaderValue(tr("Decision"));
111        col.setResizable(true);
112        col.setCellRenderer(decisionRenderer);
113        col.setCellEditor(decisionEditor);
114        col.setWidth(100);
115        col.setPreferredWidth(100);
116        col.setMaxWidth(100);
117        addColumn(col);
118    }
119
120    /**
121     * Constructs a new {@code RelationMemberConflictResolverColumnModel}.
122     */
123    public RelationMemberConflictResolverColumnModel() {
124        createColumns();
125    }
126}