[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Newsgroup Home]
|
[news.eclipse.platform.swt] Re: Table cell editing like Excel
|
Hi,
can you please also post the bug report number? I would like to follow this
bug.
Best regards, Lars
"H. Steenblock" <4ringe-fan@xxxxxxxx> wrote in message
news:g2op7s$7d9$1@xxxxxxxxxxxxxxxxxxxx
> Dear Community,
>
> we have to implement a table cell editing mode like Excel does:
> 1. activating the cell editor with any numeric key
> 2. set the used key in the current cell
> 3. changing to the next cell below current cell when a CR is pressed.
>
> I prepared a code snippet. Topic 1 and 2 are mostly working, but it isn't
> clear how to solve 3. (using a olumnViewerEditorActivationListener ??).
>
> Any comments are welcome. Maybe we can use this snippet as a starter for
> an additional JFaceSnippet.
>
> Regards,
> H. Steenblock
>
>
> import java.util.regex.Matcher;
> import java.util.regex.Pattern;
>
> 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.ColumnViewerEditorActivationListener;
> import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
> import org.eclipse.jface.viewers.ColumnViewerEditorDeactivationEvent;
> import org.eclipse.jface.viewers.ICellModifier;
> import org.eclipse.jface.viewers.TextCellEditor;
> import org.eclipse.nebula.jface.gridviewer.GridTableViewer;
> import org.eclipse.nebula.jface.gridviewer.GridViewerColumn;
> import org.eclipse.nebula.jface.gridviewer.GridViewerEditor;
> import org.eclipse.nebula.widgets.grid.Grid;
> import org.eclipse.nebula.widgets.grid.GridItem;
> import org.eclipse.swt.SWT;
> import org.eclipse.swt.layout.FillLayout;
> import org.eclipse.swt.widgets.Display;
> import org.eclipse.swt.widgets.Shell;
>
>
> public class Snippet052DouleClickCellEditorModified
> {
> private Pattern m_IsValidPattern = null;
>
> public class MyModel
> {
> private String sCounter = "";
>
> public MyModel(){
> }
>
> public void setCounter(String sCounter)
> {
> this.sCounter = sCounter;
> }
>
> public String toString()
> {
> return sCounter;
> }
> }
>
> public class MyTextCellEditor extends TextCellEditor
> {
> /**
> * search pattern is Numeric character
> */
> private Pattern m_IsValidPattern = null;
>
> public MyTextCellEditor(Grid parent) {
> super(parent);
> m_IsValidPattern = Pattern.compile("[\\w+-\\.]");
> }
>
> @Override
> public void activate(ColumnViewerEditorActivationEvent
> activationEvent) {
>
> // set the activation character
> String s1 = String.valueOf( activationEvent.character );
> Matcher matcher = m_IsValidPattern.matcher( s1 );
> if (matcher.matches()) {
> doSetValue(s1);
> }
> super.activate(activationEvent);
> }
> }
>
>
> public Snippet052DouleClickCellEditorModified(Shell shell)
> {
> /* allow numbers and characters */
> m_IsValidPattern = Pattern.compile("[\\w+-\\.]");
>
> final GridTableViewer v = new GridTableViewer(shell, SWT.BORDER
> | SWT.H_SCROLL | SWT.V_SCROLL);
>
>
> v.setCellEditors(new CellEditor[] {
> new MyTextCellEditor(v.getGrid()),
> new MyTextCellEditor(v.getGrid())
> });
>
> v.setCellModifier(new ICellModifier() {
>
> public boolean canModify(Object element, String property) {
> return true;
> }
>
> public Object getValue(Object element, String property) {
> return element.toString();
> }
>
> public void modify(Object element, String property, Object
> value) {
> if (element instanceof GridItem) {
> GridItem item = (GridItem)element;
> MyModel model = (MyModel)(item.getData());
> model.setCounter(value.toString());
> v.update(model, null);
> }
> }
> });
>
>
> ColumnViewerEditorActivationListener listener = new
> ColumnViewerEditorActivationListener() {
>
> public void afterEditorActivated(
> ColumnViewerEditorActivationEvent event)
> {
> }
>
> public void afterEditorDeactivated(
> ColumnViewerEditorDeactivationEvent event)
> {
> // how to switch to the next cell?
> }
>
> public void beforeEditorActivated(
> ColumnViewerEditorActivationEvent event)
> {
> }
>
> public void beforeEditorDeactivated(
> ColumnViewerEditorDeactivationEvent event)
> {
> }
> };
>
> v.setContentProvider(new ArrayContentProvider());
> v.setColumnProperties(new String[] { "1", "2" });
> v.getGrid().setCellSelectionEnabled(true);
> v.getGrid().setLinesVisible(true);
> v.getGrid().setHeaderVisible(true);
>
> ColumnViewerEditorActivationStrategy actSupport = new
> ColumnViewerEditorActivationStrategy(
> v) {
> protected boolean isEditorActivationEvent(
> ColumnViewerEditorActivationEvent event)
> {
> boolean result;
>
> String s1 = String.valueOf( event.character );
> Matcher matcher = m_IsValidPattern.matcher( s1 );
> boolean bIsCharKey = matcher.matches();
>
> boolean bEnableKey =
> (event.keyCode == SWT.CR) ||
> (event.keyCode == SWT.KEYPAD_CR) ||
> (event.keyCode == SWT.F2) ||
> bIsCharKey;
>
> result = event.eventType ==
> ColumnViewerEditorActivationEvent.TRAVERSAL
> || event.eventType ==
> ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION
> || (event.eventType ==
> ColumnViewerEditorActivationEvent.KEY_PRESSED && bEnableKey)
> || event.eventType ==
> ColumnViewerEditorActivationEvent.PROGRAMMATIC;
>
> return result;
> }
> };
>
> GridViewerEditor.create(v, actSupport,
> ColumnViewerEditor.TABBING_HORIZONTAL
> | ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR
> | ColumnViewerEditor.TABBING_VERTICAL
> | ColumnViewerEditor.KEYBOARD_ACTIVATION);
>
> v.getColumnViewerEditor().addEditorActivationListener(listener);
>
> GridViewerColumn column = new GridViewerColumn(v, SWT.NONE);
> column.getColumn().setWidth(200);
> column.getColumn().setMoveable(true);
> column.getColumn().setText("Column 1");
> column.setLabelProvider(new ColumnLabelProvider());
>
> column = new GridViewerColumn(v, SWT.NONE);
> column.getColumn().setWidth(200);
> column.getColumn().setMoveable(true);
> column.getColumn().setText("Column 2");
> column.setLabelProvider(new ColumnLabelProvider());
>
> MyModel[] model = createModel();
>
> v.setInput(model);
>
> }
>
> private MyModel[] createModel() {
>
> MyModel[] elements = new MyModel[10];
>
> for (int i = 0; i < 10; i++)
> {
> elements[i] = new MyModel();
> if (i<3){
> Double h = Double.valueOf(i);
> elements[i].setCounter( h.toString() );
> }
> }
> return elements;
> }
>
> public static void main(String[] args)
> {
> Display display = new Display();
>
> Shell shell = new Shell(display);
> shell.setLayout(new FillLayout());
> new Snippet052DouleClickCellEditorModified(shell);
> shell.open();
>
> while (!shell.isDisposed())
> {
> if (!display.readAndDispatch())
> display.sleep();
> }
>
> display.dispose();
>
> }
> }