public static void createTableEditor(final Table paTable) {
final TableEditor editor = new TableEditor(paTable);
editor.horizontalAlignment = SWT.LEFT;
editor.grabHorizontal = true;
paTable.addListener(SWT.MouseDown, new Listener() {
public void handleEvent(Event event) {
Rectangle clientArea = paTable.getClientArea();
Point pt = new Point(event.x, event.y);
int index = paTable.getTopIndex();
while (index < paTable.getItemCount()) {
boolean visible = false;
final TableItem item = paTable.getItem(index);
for (int i = 0; i < paTable.getColumnCount(); i++) {
Rectangle rect = item.getBounds(i);
if (rect.contains(pt)) {
final int column = i;
final Text text = new Text(paTable, SWT.NONE);
Listener textListener = new Listener() {
public void handleEvent(final Event e) {
switch (e.type) {
case SWT.FocusOut:
item.setText(column, text.getText());
text.dispose();
break;
case SWT.Traverse:
switch (e.detail) {
case SWT.TRAVERSE_RETURN: item.setText(column, text.getText());
//FALL THROUGH
case SWT.TRAVERSE_ESCAPE: text.dispose();
e.doit = false;
case SWT.TRAVERSE_TAB_NEXT : item.setText(column, text.getText());
int aktuelleSpalte = editor.getColumn();
int aktuelleZeile = paTable.getSelectionIndex();
if(aktuelleSpalte < (paTable.getColumnCount()-1)) {
// aktiviert naechste Spalte
int nextColIdx = aktuelleSpalte + 1;
editor.setColumn(nextColIdx);
} else {
if(paTable.getSelectionIndex() < (paTable.getItemCount()-1)) {
editor.setColumn(0);
paTable.setSelection(aktuelleZeile+1);
} else {
editor.setColumn(0);
paTable.setSelection(0);
}
}
e.doit = false;
break;
case SWT.TRAVERSE_PAGE_PREVIOUS: item.setText(column, text.getText());
aktuelleSpalte = editor.getColumn();
aktuelleZeile = paTable.getSelectionIndex();
if(aktuelleSpalte > 0) {
int nextColIdx = aktuelleSpalte - 1;
paTable.select(aktuelleZeile);
editor.setColumn(nextColIdx);
} else {
if(aktuelleZeile > 0) {
editor.setColumn(paTable.getColumnCount()-1);
paTable.setSelection(aktuelleZeile-1);
} else {
editor.setColumn(paTable.getColumnCount()-1);
paTable.setSelection(paTable.getItemCount()-1);
}
}
e.doit = false;
break;
}
break;
}
}
};
text.addListener(SWT.FocusOut, textListener);
text.addListener(SWT.Traverse, textListener);
editor.setEditor(text, item, i);
text.setText(item.getText(i));
text.selectAll();
text.setFocus();
return;
}
if (!visible && rect.intersects(clientArea)) {
visible = true;
}
}
if (!visible)
return;
index++;
}
}
});
}