[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Newsgroup Home]
[news.eclipse.platform.swt] Re: Default button and enter key cell activation

Andi Thomas wrote:
I have a table with a column viewer activation strategy with a CR key pressed configuration, but in the same shell I have a default button.

Navigating to a cell and pressing the enter key gets picked up by the default button not the cell activation strategy.

You might think that this is the correct behavior, but its not unprecedented for a control to intercept the enter key press before the default button kicks in. A Text control with the SWT.MULTI style but for example.

We have shells with and without default buttons and I would like the table behavior to be consistent in all windows.

Thanks (Tom!)

- Andi

Added an attachment that shows the problem. You can comment and uncomment line 37 to hide/show the problem.
package org.eclipse.jface.snippets.viewers;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnViewerEditor;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.FocusCellOwnerDrawHighlighter;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.TableViewerEditor;
import org.eclipse.jface.viewers.TableViewerFocusCellManager;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

/**
 * A simple TreeViewer to demonstrate usage
 * 
 * @author Tom Schindl <tom.schindl@xxxxxxxxxxxxxxx>
 * 
 */
public class Snippet026TableViewerTabEditing {
  public Snippet026TableViewerTabEditing(final Shell shell) {
    final Button b = new Button(shell, SWT.PUSH);
    // Corrupts cell editor activation!!!
    shell.setDefaultButton(b);

    b.setText("Remove column");
    final TableViewer v = new TableViewer(shell, SWT.BORDER | SWT.FULL_SELECTION);
    v.getTable().setLinesVisible(true);
    v.getTable().setHeaderVisible(true);
    b.addSelectionListener(new SelectionListener() {

      public void widgetDefaultSelected(final SelectionEvent e) {

      }

      public void widgetSelected(final SelectionEvent e) {
        v.getTable().getColumn(1).dispose();
      }

    });

    final TableViewerFocusCellManager focusCellManager = new TableViewerFocusCellManager(v,
        new FocusCellOwnerDrawHighlighter(v));
    final ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(v) {
      @Override
      protected boolean isEditorActivationEvent(final ColumnViewerEditorActivationEvent event) {
        return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL
            || event.eventType == ColumnViewerEditorActivationEvent.MOUSE_CLICK_SELECTION
            || event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == SWT.CR
            || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;
      }
    };

    TableViewerEditor.create(v, focusCellManager, actSupport, ColumnViewerEditor.TABBING_HORIZONTAL
        | ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR | ColumnViewerEditor.TABBING_VERTICAL
        | ColumnViewerEditor.KEYBOARD_ACTIVATION);

    final TextCellEditor textCellEditor = new TextCellEditor(v.getTable());

    TableViewerColumn column = new TableViewerColumn(v, SWT.NONE);
    column.getColumn().setWidth(200);
    column.getColumn().setMoveable(true);
    column.getColumn().setText("Column 1");
    column.setLabelProvider(new ColumnLabelProvider() {

      @Override
      public String getText(final Object element) {
        return "Column 1 => " + element.toString();
      }

    });
    column.setEditingSupport(new EditingSupport(v) {
      @Override
      protected boolean canEdit(final Object element) {
        return false;
      }

      @Override
      protected CellEditor getCellEditor(final Object element) {
        return textCellEditor;
      }

      @Override
      protected Object getValue(final Object element) {
        return ((MyModel) element).counter + "";
      }

      @Override
      protected void setValue(final Object element, final Object value) {
        ((MyModel) element).counter = Integer.parseInt(value.toString());
        v.update(element, null);
      }
    });

    column = new TableViewerColumn(v, SWT.NONE);
    column.getColumn().setWidth(200);
    column.getColumn().setMoveable(true);
    column.getColumn().setText("Column 2");
    column.setLabelProvider(new ColumnLabelProvider() {

      @Override
      public String getText(final Object element) {
        return "Column 2 => " + element.toString();
      }

    });
    column.setEditingSupport(new EditingSupport(v) {
      @Override
      protected boolean canEdit(final Object element) {
        return true;
      }

      @Override
      protected CellEditor getCellEditor(final Object element) {
        return textCellEditor;
      }

      @Override
      protected Object getValue(final Object element) {
        return ((MyModel) element).counter + "";
      }

      @Override
      protected void setValue(final Object element, final Object value) {
        ((MyModel) element).counter = Integer.parseInt(value.toString());
        v.update(element, null);
      }
    });

    column = new TableViewerColumn(v, SWT.NONE);
    column.getColumn().setWidth(200);
    column.getColumn().setMoveable(true);
    column.getColumn().setText("Column 3");
    column.setLabelProvider(new ColumnLabelProvider() {

      @Override
      public String getText(final Object element) {
        return "Column 3 => " + element.toString();
      }

    });
    column.setEditingSupport(new EditingSupport(v) {
      @Override
      protected boolean canEdit(final Object element) {
        return true;
      }

      @Override
      protected CellEditor getCellEditor(final Object element) {
        return textCellEditor;
      }

      @Override
      protected Object getValue(final Object element) {
        return ((MyModel) element).counter + "";
      }

      @Override
      protected void setValue(final Object element, final Object value) {
        ((MyModel) element).counter = Integer.parseInt(value.toString());
        v.update(element, null);
      }
    });

    v.setContentProvider(new ArrayContentProvider());

    v.setInput(createModel());
  }

  private List<MyModel> createModel() {

    final List<MyModel> items = new ArrayList<MyModel>();
    final MyModel root = new MyModel(0);
    root.counter = 0;

    for (int i = 1; i < 10; i++) {
      items.add(new MyModel(i));
    }

    return items;
  }

  public static void main(final String[] args) {
    final Display display = new Display();
    final Shell shell = new Shell(display);
    shell.setLayout(new RowLayout(SWT.VERTICAL));
    new Snippet026TableViewerTabEditing(shell);
    shell.pack();
    shell.open();

    while (!shell.isDisposed()) {
      if (!display.readAndDispatch())
        display.sleep();
    }

    display.dispose();
  }

  public class MyModel {
    public int counter;

    public MyModel(final int counter) {
      this.counter = counter;
    }

    @Override
    public String toString() {
      String rv = "Item ";
      rv += counter;

      return rv;
    }
  }

}