001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.conflict.tags;
003
004import java.awt.Component;
005import java.util.EventObject;
006
007import javax.swing.JTable;
008import javax.swing.event.CellEditorListener;
009import javax.swing.table.TableCellEditor;
010
011import org.openstreetmap.josm.gui.util.CellEditorSupport;
012import org.openstreetmap.josm.gui.widgets.JosmComboBox;
013
014/**
015 * Table cell editor for relation member conflict resolver table.
016 * @since 2070
017 */
018public class RelationMemberConflictDecisionEditor extends JosmComboBox<RelationMemberConflictDecisionType> implements TableCellEditor {
019
020    private final transient CellEditorSupport tableCellEditorSupport;
021    private RelationMemberConflictDecisionType originalValue;
022
023    /**
024     * Constructs a new {@code RelationMemberConflictDecisionEditor}.
025     */
026    public RelationMemberConflictDecisionEditor() {
027        super(RelationMemberConflictDecisionType.values());
028        setOpaque(true);
029        setRenderer(new RelationMemberConflictDecisionRenderer());
030        tableCellEditorSupport = new CellEditorSupport(this);
031    }
032
033    /* --------------------------------------------------------------------------------- */
034    /* TableCellEditor                                                                   */
035    /* --------------------------------------------------------------------------------- */
036    @Override
037    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
038        addActionListener(e -> stopCellEditing());
039        setSelectedItem(value);
040        this.originalValue = (RelationMemberConflictDecisionType) value;
041        return this;
042    }
043
044    @Override
045    public void addCellEditorListener(CellEditorListener l) {
046        tableCellEditorSupport.addCellEditorListener(l);
047    }
048
049    @Override
050    public void cancelCellEditing() {
051        setSelectedItem(originalValue);
052        tableCellEditorSupport.fireEditingCanceled();
053    }
054
055    @Override
056    public Object getCellEditorValue() {
057        return getSelectedItem();
058    }
059
060    @Override
061    public boolean isCellEditable(EventObject anEvent) {
062        return true;
063    }
064
065    @Override
066    public void removeCellEditorListener(CellEditorListener l) {
067        tableCellEditorSupport.removeCellEditorListener(l);
068    }
069
070    @Override
071    public boolean shouldSelectCell(EventObject anEvent) {
072        return true;
073    }
074
075    @Override
076    public boolean stopCellEditing() {
077        tableCellEditorSupport.fireEditingStopped();
078        return true;
079    }
080}