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