Index: trunk/src/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberTableCellEditor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberTableCellEditor.java	(revision 6911)
+++ trunk/src/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberTableCellEditor.java	(revision 6912)
@@ -13,10 +13,9 @@
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
 
-
 /**
  * {@link TableCellEditor} for the role column in a table for {@link RelationMember}s.
- *
+ * @since 1631
  */
-public class RelationMemberTableCellEditor extends AbstractCellEditor implements TableCellEditor{
+public class RelationMemberTableCellEditor extends AbstractCellEditor implements TableCellEditor {
 
     private final JosmTextField editor;
@@ -54,4 +53,3 @@
         return editor.getText();
     }
-
 }
Index: trunk/src/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictDecisionEditor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictDecisionEditor.java	(revision 6911)
+++ trunk/src/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictDecisionEditor.java	(revision 6912)
@@ -9,15 +9,19 @@
 import javax.swing.table.TableCellEditor;
 
-import org.openstreetmap.josm.gui.util.TableCellEditorSupport;
+import org.openstreetmap.josm.gui.util.CellEditorSupport;
 import org.openstreetmap.josm.gui.widgets.JosmComboBox;
 
 public class RelationMemberConflictDecisionEditor extends JosmComboBox implements TableCellEditor {
 
+    /**
+     * Constructs a new {@code RelationMemberConflictDecisionEditor}.
+     */
     public RelationMemberConflictDecisionEditor() {
         super(RelationMemberConflictDecisionType.values());
         setOpaque(true);
         setRenderer(new RelationMemberConflictDecisionRenderer());
-        tableCellEditorSupport = new TableCellEditorSupport(this);
+        tableCellEditorSupport = new CellEditorSupport(this);
     }
+
     /* --------------------------------------------------------------------------------- */
     /* TableCellEditor                                                                   */
@@ -30,5 +34,5 @@
     }
 
-    private TableCellEditorSupport tableCellEditorSupport;
+    private final CellEditorSupport tableCellEditorSupport;
     private RelationMemberConflictDecisionType originalValue;
 
Index: trunk/src/org/openstreetmap/josm/gui/io/ActionFlagsTableCell.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/ActionFlagsTableCell.java	(revision 6911)
+++ trunk/src/org/openstreetmap/josm/gui/io/ActionFlagsTableCell.java	(revision 6912)
@@ -10,5 +10,4 @@
 import java.awt.event.ActionListener;
 import java.util.EventObject;
-import java.util.concurrent.CopyOnWriteArrayList;
 
 import javax.swing.AbstractAction;
@@ -18,8 +17,8 @@
 import javax.swing.JTable;
 import javax.swing.event.CellEditorListener;
-import javax.swing.event.ChangeEvent;
 import javax.swing.table.TableCellEditor;
 import javax.swing.table.TableCellRenderer;
 
+import org.openstreetmap.josm.gui.util.CellEditorSupport;
 import org.openstreetmap.josm.tools.GBC;
 
@@ -30,24 +29,23 @@
  *
  * Intended usage is like this:
- * ActionFlagsTableCell aftc = new ActionFlagsTableCell();
- * col = new TableColumn(0);
- * col.setCellRenderer(aftc);
- * col.setCellEditor(aftc);
+ * <code>
+ * <br>ActionFlagsTableCell aftc = new ActionFlagsTableCell();
+ * <br>col = new TableColumn(0);
+ * <br>col.setCellRenderer(aftc);
+ * <br>col.setCellEditor(aftc);
+ * </code>
  */
 class ActionFlagsTableCell extends JPanel implements TableCellRenderer, TableCellEditor {
-    protected final JCheckBox[] checkBoxes = new JCheckBox[2];
-    private CopyOnWriteArrayList<CellEditorListener> listeners;
+    private final JCheckBox[] checkBoxes = new JCheckBox[2];
+    private final CellEditorSupport cellEditorSupport = new CellEditorSupport(this);
 
     private ActionListener al = new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
-            fireEditingStopped();
+            cellEditorSupport.fireEditingStopped();
         }
     };
 
     public ActionFlagsTableCell() {
-        super();
-        listeners = new CopyOnWriteArrayList<CellEditorListener>();
-
         checkBoxes[0] = new JCheckBox(tr("Upload"));
         checkBoxes[1] = new JCheckBox(tr("Save"));
@@ -63,5 +61,5 @@
                 public void actionPerformed(ActionEvent e) {
                     b.setSelected(!b.isSelected());
-                    fireEditingStopped();
+                    cellEditorSupport.fireEditingStopped();
                 }
             });
@@ -94,24 +92,10 @@
     @Override
     public void addCellEditorListener(CellEditorListener l) {
-        if (l != null) {
-            listeners.addIfAbsent(l);
-        }
-    }
-
-    protected void fireEditingCanceled() {
-        for (CellEditorListener l: listeners) {
-            l.editingCanceled(new ChangeEvent(this));
-        }
-    }
-
-    protected void fireEditingStopped() {
-        for (CellEditorListener l: listeners) {
-            l.editingStopped(new ChangeEvent(this));
-        }
+        cellEditorSupport.addCellEditorListener(l);
     }
 
     @Override
     public void cancelCellEditing() {
-        fireEditingCanceled();
+        cellEditorSupport.fireEditingCanceled();
     }
 
@@ -131,5 +115,5 @@
     @Override
     public void removeCellEditorListener(CellEditorListener l) {
-        listeners.remove(l);
+        cellEditorSupport.removeCellEditorListener(l);
     }
 
@@ -141,5 +125,5 @@
     @Override
     public boolean stopCellEditing() {
-        fireEditingStopped();
+        cellEditorSupport.fireEditingStopped();
         return true;
     }
Index: trunk/src/org/openstreetmap/josm/gui/io/LayerNameAndFilePathTableCell.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/LayerNameAndFilePathTableCell.java	(revision 6911)
+++ trunk/src/org/openstreetmap/josm/gui/io/LayerNameAndFilePathTableCell.java	(revision 6912)
@@ -14,5 +14,4 @@
 import java.io.File;
 import java.util.EventObject;
-import java.util.concurrent.CopyOnWriteArrayList;
 
 import javax.swing.AbstractAction;
@@ -23,11 +22,11 @@
 import javax.swing.JTable;
 import javax.swing.event.CellEditorListener;
-import javax.swing.event.ChangeEvent;
 import javax.swing.table.TableCellEditor;
 import javax.swing.table.TableCellRenderer;
 
 import org.openstreetmap.josm.actions.SaveActionBase;
+import org.openstreetmap.josm.gui.util.CellEditorSupport;
+import org.openstreetmap.josm.gui.widgets.JosmTextField;
 import org.openstreetmap.josm.tools.GBC;
-import org.openstreetmap.josm.gui.widgets.JosmTextField;
 
 class LayerNameAndFilePathTableCell extends JPanel implements TableCellRenderer, TableCellEditor {
@@ -43,5 +42,5 @@
     private static final GBC defaultCellStyle = GBC.eol().fill(GBC.HORIZONTAL).insets(2, 0, 2, 0);
 
-    private CopyOnWriteArrayList<CellEditorListener> listeners;
+    private final CellEditorSupport cellEditorSupport = new CellEditorSupport(this);
     private File value;
 
@@ -71,6 +70,4 @@
         btnFileChooser.setPreferredSize(new Dimension(20, 19));
         btnFileChooser.setOpaque(true);
-
-        listeners = new CopyOnWriteArrayList<CellEditorListener>();
     }
 
@@ -93,8 +90,6 @@
     }
 
-    /** renderer used while the file path is being edited **/
-    @Override
-    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected,
-            int row, int column) {
+    @Override
+    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
         removeAll();
         SaveLayerInfo info = (SaveLayerInfo)value;
@@ -182,24 +177,10 @@
     @Override
     public void addCellEditorListener(CellEditorListener l) {
-        if (l != null) {
-            listeners.addIfAbsent(l);
-        }
-    }
-
-    protected void fireEditingCanceled() {
-        for (CellEditorListener l: listeners) {
-            l.editingCanceled(new ChangeEvent(this));
-        }
-    }
-
-    protected void fireEditingStopped() {
-        for (CellEditorListener l: listeners) {
-            l.editingStopped(new ChangeEvent(this));
-        }
+        cellEditorSupport.addCellEditorListener(l);
     }
 
     @Override
     public void cancelCellEditing() {
-        fireEditingCanceled();
+        cellEditorSupport.fireEditingCanceled();
     }
 
@@ -216,5 +197,5 @@
     @Override
     public void removeCellEditorListener(CellEditorListener l) {
-        listeners.remove(l);
+        cellEditorSupport.removeCellEditorListener(l);
     }
 
@@ -231,5 +212,5 @@
             value = new File(tfFilename.getText());
         }
-        fireEditingStopped();
+        cellEditorSupport.fireEditingStopped();
         return true;
     }
Index: trunk/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletingTextField.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletingTextField.java	(revision 6911)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletingTextField.java	(revision 6912)
@@ -20,10 +20,9 @@
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.gui.util.TableCellEditorSupport;
+import org.openstreetmap.josm.gui.util.CellEditorSupport;
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
 
-
 /**
- * AutoCompletingTextField is an text field with autocompletion behaviour. It
+ * AutoCompletingTextField is a text field with autocompletion behaviour. It
  * can be used as table cell editor in {@link JTable}s.
  *
@@ -31,5 +30,5 @@
  * managed in a {@link AutoCompletionList}.
  *
- *
+ * @since 1762
  */
 public class AutoCompletingTextField extends JosmTextField implements ComboBoxEditor, TableCellEditor {
@@ -42,8 +41,4 @@
     class AutoCompletionDocument extends PlainDocument {
 
-        /**
-         * inserts a string at a specific position
-         *
-         */
         @Override
         public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
@@ -126,8 +121,4 @@
     protected AutoCompletionList autoCompletionList = null;
 
-    /**
-     * creates the default document model for this editor
-     *
-     */
     @Override
     protected Document createDefaultModel() {
@@ -156,9 +147,9 @@
                 }
         );
-        tableCellEditorSupport = new TableCellEditorSupport(this);
-    }
-
-    /**
-     * constructor
+        tableCellEditorSupport = new CellEditorSupport(this);
+    }
+
+    /**
+     * Constructs a new {@code AutoCompletingTextField}.
      */
     public AutoCompletingTextField() {
@@ -166,4 +157,9 @@
     }
 
+    /**
+     * Constructs a new {@code AutoCompletingTextField}.
+     * @param columns the number of columns to use to calculate the preferred width; 
+     * if columns is set to zero, the preferred width will be whatever naturally results from the component implementation
+     */
     public AutoCompletingTextField(int columns) {
         super(columns);
@@ -178,5 +174,5 @@
 
     /**
-     *
+     * Returns the auto completion list.
      * @return the auto completion list; may be null, if no auto completion list is set
      */
@@ -186,5 +182,5 @@
 
     /**
-     * sets the auto completion list
+     * Sets the auto completion list.
      * @param autoCompletionList the auto completion list; if null, auto completion is
      *   disabled
@@ -226,5 +222,5 @@
     /* ------------------------------------------------------------------------------------ */
 
-    private TableCellEditorSupport tableCellEditorSupport;
+    private CellEditorSupport tableCellEditorSupport;
     private String originalValue;
 
@@ -246,9 +242,9 @@
         tableCellEditorSupport.removeCellEditorListener(l);
     }
+
     @Override
     public void cancelCellEditing() {
         restoreOriginalValue();
         tableCellEditorSupport.fireEditingCanceled();
-
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/util/CellEditorSupport.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/util/CellEditorSupport.java	(revision 6912)
+++ trunk/src/org/openstreetmap/josm/gui/util/CellEditorSupport.java	(revision 6912)
@@ -0,0 +1,77 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.util;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+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 List<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 LinkedList<CellEditorListener>();
+    }
+
+    protected List<CellEditorListener> getListeners() {
+        synchronized (this) {
+            return new ArrayList<CellEditorListener>(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));
+        }
+    }
+}
Index: trunk/src/org/openstreetmap/josm/gui/util/TableCellEditorSupport.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/util/TableCellEditorSupport.java	(revision 6911)
+++ 	(revision )
@@ -1,52 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.util;
-
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-
-import javax.swing.event.CellEditorListener;
-import javax.swing.event.ChangeEvent;
-
-public class TableCellEditorSupport {
-    private Object editor;
-    private List<CellEditorListener> listeners;
-
-    public TableCellEditorSupport(Object editor) {
-        this.editor = editor;
-        listeners = new LinkedList<CellEditorListener>();
-    }
-
-    protected List<CellEditorListener> getListeners() {
-        synchronized (this) {
-            return new ArrayList<CellEditorListener>(listeners);
-        }
-    }
-
-    public void addCellEditorListener(CellEditorListener l) {
-        synchronized (this) {
-            if (l != null && ! listeners.contains(l)) {
-                listeners.add(l);
-            }
-        }
-    }
-    public void removeCellEditorListener(CellEditorListener l) {
-        synchronized (this) {
-            if (l != null &&listeners.contains(l)) {
-                listeners.remove(l);
-            }
-        }
-    }
-
-    public void fireEditingCanceled() {
-        for (CellEditorListener listener: getListeners()) {
-            listener.editingCanceled(new ChangeEvent(editor));
-        }
-    }
-
-    public void fireEditingStopped() {
-        for (CellEditorListener listener: getListeners()) {
-            listener.editingStopped(new ChangeEvent(editor));
-        }
-    }
-}
