// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.gui.util; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import javax.swing.CellEditor; import javax.swing.event.CellEditorListener; import javax.swing.event.ChangeEvent; /** * Utility class used to ease implementation of {@link CellEditor} interface, * or one of its sub-interfaces, for classes that cannot extend {@link javax.swing.AbstractCellEditor}. * @since 6912 */ public class CellEditorSupport { private final CellEditor editor; private final Set<CellEditorListener> listeners; /** * Constructs a new {@code CellEditorSupport}. * @param editor The cell editor backed by this */ public CellEditorSupport(CellEditor editor) { this.editor = editor; this.listeners = new LinkedHashSet<>(); } protected List<CellEditorListener> getListeners() { synchronized (this) { return new ArrayList<>(listeners); } } /** * Worker for {@link CellEditor#addCellEditorListener(CellEditorListener)} method. * @param l the CellEditorListener */ public final void addCellEditorListener(CellEditorListener l) { synchronized (this) { if (l != null && !listeners.contains(l)) { listeners.add(l); } } } /** * Worker for {@link CellEditor#removeCellEditorListener(CellEditorListener)} method. * @param l the CellEditorListener */ public final void removeCellEditorListener(CellEditorListener l) { synchronized (this) { if (l != null && listeners.contains(l)) { listeners.remove(l); } } } /** * Fires "editing canceled" event to listeners. */ public final void fireEditingCanceled() { for (CellEditorListener listener: getListeners()) { listener.editingCanceled(new ChangeEvent(editor)); } } /** * Fires "editing stopped" event to listeners. */ public final void fireEditingStopped() { for (CellEditorListener listener: getListeners()) { listener.editingStopped(new ChangeEvent(editor)); } } }