package org.objectstyle.wolips.eomodeler.utils; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.ICellEditorListener; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.events.TraverseEvent; import org.eclipse.swt.events.TraverseListener; import org.eclipse.swt.widgets.Display; import org.objectstyle.wolips.baseforuiplugins.utils.KeyComboBoxCellEditor; import org.objectstyle.wolips.baseforuiplugins.utils.WOTextCellEditor; public class StayEditingCellEditorListener implements ICellEditorListener, SelectionListener, TraverseListener { private TableViewer _tableViewer; private int _column; public StayEditingCellEditorListener(TableViewer tableViewer, String tableName, String propertyName) { this(tableViewer, TableUtils.getColumnNumberForTablePropertyNamed(tableName, propertyName)); } public StayEditingCellEditorListener(TableViewer tableViewer, int column) { _tableViewer = tableViewer; _column = column; if (_column != -1) { CellEditor cellEditor = _tableViewer.getCellEditors()[_column]; if (cellEditor instanceof WOTextCellEditor) { ((WOTextCellEditor) cellEditor).getText().addSelectionListener(this); ((WOTextCellEditor) cellEditor).getText().addTraverseListener(this); } else if (cellEditor instanceof KeyComboBoxCellEditor) { ((KeyComboBoxCellEditor) cellEditor).getComboBox().addSelectionListener(this); ((KeyComboBoxCellEditor) cellEditor).getComboBox().addTraverseListener(this); } } } public TableViewer getTableViewer() { return _tableViewer; } public int getColumn() { return _column; } public void keyTraversed(TraverseEvent e) { if (e.detail == SWT.TRAVERSE_TAB_NEXT) { int selectionIndex = _tableViewer.getTable().getSelectionIndex(); if (selectionIndex != -1) { final Object thisObject = _tableViewer.getElementAt(selectionIndex); if (thisObject != null) { Display.getCurrent().asyncExec(new Runnable() { public void run() { getTableViewer().editElement(thisObject, getColumn() + 1); } }); } } } else if (e.detail == SWT.TRAVERSE_TAB_PREVIOUS) { int selectionIndex = _tableViewer.getTable().getSelectionIndex(); if (selectionIndex != -1) { final Object thisObject = _tableViewer.getElementAt(selectionIndex); if (thisObject != null) { Display.getCurrent().asyncExec(new Runnable() { public void run() { getTableViewer().editElement(thisObject, getColumn() - 1); } }); } } } } public void widgetDefaultSelected(SelectionEvent e) { int selectionIndex = _tableViewer.getTable().getSelectionIndex(); if (selectionIndex != -1) { final Object nextObject = _tableViewer.getElementAt(selectionIndex + 1); if (nextObject != null) { Display.getCurrent().asyncExec(new Runnable() { public void run() { getTableViewer().editElement(nextObject, getColumn()); } }); } } } public void widgetSelected(SelectionEvent e) { // DO NOTHING } public void applyEditorValue() { // DO NOTHING } public void cancelEditor() { // DO NOTHING } public void editorValueChanged(boolean oldValidState, boolean newValidState) { // DO NOTHING } }