Bug 58777 [Viewers] add API to not deactivate CellEditor on FocusLost
TableViewerImpl installs a FocusListener on CellEditors, which calls applyEditorValue() on focusLost events. This FocusListener must be removed since applying the editor value is not always the wanted behavior on focusLost. Subclasses of CellEditor already handle focus loss in an extensible way: they install their own FocusListener and call a hook method focusLost() (which can be extended or reimplemented by subclasses with special needs). To support content assist in table cells (such as in the Change Method Signature dialog), we need to stay in editing mode even while the proposal list has focus. This is currently not implementable, since TableViewerImpl deactivates the CellEditor even if the CellEditor's focusLost() is reimplemented. The fix is to simply remove the redundant FocusListener in TableViewerImpl.
bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/CellEditor.java
/**
 * Abstract base class for cell editors. Implements property change listener handling,
 * and SWT window management.
 * <p>
 * Subclasses implement particular kinds of cell editors. This package contains various
 * specialized cell editors:
 * <ul>
 *   <li><code>TextCellEditor</code> - for simple text strings</li>
 *   <li><code>ColorCellEditor</code> - for colors</li>
 *   <li><code>ComboBoxCellEditor</code> - value selected from drop-down combo box</li>
 *   <li><code>CheckboxCellEditor</code> - boolean valued checkbox</li>
 *   <li><code>DialogCellEditor</code> - value from arbitrary dialog</li>
 * </ul>
 * </p>
 */
public abstract class CellEditor {
    /**
     * List of cell editor listeners (element type: <code>ICellEditorListener</code>).
     */
    private ListenerList listeners = new ListenerList();
    /**
     * List of cell editor property change listeners 
     * (element type: <code>IPropertyChangeListener</code>).
     */
    private ListenerList propertyChangeListeners = new ListenerList();
    /**
     * Indicates whether this cell editor's current value is valid.
     */
    private boolean valid = false;
    /**