/**
   * Enable activation of cell editors by keyboard
   *
   * @param enable <code>true</code> to enable
   */
  public void setEnableEditorActivationWithKeyboard(boolean enable) {
    if (enable) {
      if (keyboardActivationListener == null) {
        keyboardActivationListener =
            new KeyListener() {

              @Override
              public void keyPressed(KeyEvent e) {
                ViewerCell cell = getFocusCell();

                if (cell != null) {
                  viewer.triggerEditorActivationEvent(
                      new ColumnViewerEditorActivationEvent(cell, e));
                }
              }

              @Override
              public void keyReleased(KeyEvent e) {}
            };
        viewer.getControl().addKeyListener(keyboardActivationListener);
      }
    } else {
      if (keyboardActivationListener != null) {
        viewer.getControl().removeKeyListener(keyboardActivationListener);
        keyboardActivationListener = null;
      }
    }
  }
  @Override
  public void setFocusCell(Object element, int column) {
    final ViewerCell oldCell = getFocusCell();
    if (oldCell != null
        && (column == oldCell.getColumnIndex())
        && (element == oldCell.getElement())) return;
    final ColumnViewer viewer = getViewer();
    final TableItem item = (TableItem) viewer.findItem(element);
    if (item == null) return;
    final ViewerRow row = viewer.getViewerRowFromItem(item);

    final ViewerCell cell = row.getCell(column);
    if (cell == null) return;
    setFocusCell(cell);
  }
  /**
   * @param event the event triggering the action
   * @return <code>true</code> if this event should open the editor
   */
  protected boolean isEditorActivationEvent(ColumnViewerEditorActivationEvent event) {
    boolean singleSelect = ((IStructuredSelection) viewer.getSelection()).size() == 1;
    boolean isLeftMouseSelect =
        event.eventType == ColumnViewerEditorActivationEvent.MOUSE_CLICK_SELECTION
            && ((MouseEvent) event.sourceEvent).button == 1;

    return singleSelect
        && (isLeftMouseSelect
            || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC
            || event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL);
  }
  /**
   * Create a ViewerLabelProvider for the column at index
   *
   * @param labelProvider The labelProvider to convert
   * @return ViewerLabelProvider
   */
  /* package */ static CellLabelProvider createViewerLabelProvider(
      ColumnViewer viewer, IBaseLabelProvider labelProvider) {

    boolean noColumnTreeViewer =
        viewer instanceof AbstractTreeViewer && viewer.doGetColumnCount() == 0;

    if (!noColumnTreeViewer
        && (labelProvider instanceof ITableLabelProvider
            || labelProvider instanceof ITableColorProvider
            || labelProvider instanceof ITableFontProvider))
      return new TableColumnViewerLabelProvider(labelProvider);
    if (labelProvider instanceof CellLabelProvider) return (CellLabelProvider) labelProvider;
    return new WrappedViewerLabelProvider(labelProvider);
  }
 /** @return the cell holding the current focus */
 private ViewerCell getFocusCell() {
   return viewer.getColumnViewerEditor().getFocusCell();
 }
 /**
  * Sets the content provider used by this <code>AbstractTableViewer</code>.
  *
  * <p>Content providers for abstract table viewers must implement either {@link
  * IStructuredContentProvider} or {@link ILazyContentProvider}.
  */
 @Override
 public void setContentProvider(IContentProvider provider) {
   // the actual check is in assertContentProviderType
   super.setContentProvider(provider);
 }
 @Override
 protected void handleDispose(DisposeEvent event) {
   super.handleDispose(event);
   virtualManager = null;
 }
 @Override
 protected void hookControl(Control control) {
   super.hookControl(control);
   initializeVirtualManager(getControl().getStyle());
 }