扩展ComboBoxViewerCellEditor,允许输入不在下拉列表中的字符串

By | 2019年1月9日

问题描述

ComboBoxViewerCellEditor可以应用在TableViewer,TreeViewer等中,让用户从下拉列表中选值。但是输入的值必须存在下拉列表中,如果不存在,结束编辑后Cell中的值是空字符串(感觉是编辑的值丢了)。原因是因为ComboBoxViewerCellEditor中的value是由StructuredSelection决定的,当用户输入不存在的值时,没有匹配的,StructuredSelection返回empty。

有些情况下,用户需要输入不同的值。例如:下拉列表中值是常用的选项,高级用户可以输入其它的选项。

Solution

继承ComboBoxViewerCellEditor,对其进行扩展,让getValue和setValue与内部CCombo的text进行关联。扩展后的AllowNewValueChbViewerCellEditor的使用方法和ComboBoxViewerCellEditor完全一样。

点击查看源代码

import org.eclipse.jface.viewers.ComboBoxViewerCellEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.widgets.Composite;

/**
 * Extend ComboBoxViewerCellEditor to allow user input value which is not in input list.
 * Just use it same like a ComboBoxViewerCellEditor.
 *
 * @author alzhang
 */
public class AllowNewValueChbViewerCellEditor extends ComboBoxViewerCellEditor {

  /**
   * Creates a new cell editor with a combo viewer and a default style
   *
   * @param parent
   *            the parent control
   */
  public AllowNewValueChbViewerCellEditor(Composite parent) {
    this(parent, SWT.NONE);
  }

  /**
   * Creates a new cell editor with a combo viewer and the given style
   *
   * @param parent
   *            the parent control
   * @param style
   *            the style bits
   */
  public AllowNewValueChbViewerCellEditor(Composite parent, int style) {
    super(parent, style);
  }

  @Override
  protected void doSetValue(Object value) {
    if (!(value instanceof String)) {
      throw new IllegalArgumentException("The parameter value should be String.");
    }
    getComboBox().setText((String) value);
  }

  @Override
  protected Object doGetValue() {
    return getComboBox().getText();
  }

  private CCombo getComboBox() {
    return (CCombo) this.getControl();
  }

}