/**
* Copyright (c) 2009 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
*/
package org.eclipse.emf.common.ui.celleditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TableEditor;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.TraverseEvent;
import org.eclipse.swt.events.TraverseListener;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
/**
* The base class for implementing single-column and multi-column table editing.
* <p><b>Provisional API.</b> Please do not use it for anything more than experimentation.
* @since 2.5
*/
public abstract class BasicTableEditor extends TableEditor
{
private static final long serialVersionUID = 1L;
protected Table table;
public BasicTableEditor(Table table)
{
super(table);
this.table = table;
horizontalAlignment = SWT.LEAD;
grabHorizontal = true;
minimumWidth = 50;
}
protected TableItem getSelection()
{
TableItem[] selection = table.getSelection();
return selection.length == 1 ? selection[0] : null;
}
protected void edit(TableItem item, int column)
{
if (canEdit(item, column))
{
setEditor(createEditor(item, column), item, column);
}
}
protected boolean canEdit(TableItem item, int column)
{
return true;
}
protected abstract Control createEditor(TableItem item, int column);
protected Text createTextEditor(final TableItem item, final int column)
{
final Text text = new Text(table, SWT.NONE);
text.setText(item.getText(column));
text.addFocusListener(new FocusAdapter()
{
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public void focusLost(FocusEvent e)
{
endEditing(item, column, text, true);
}
});
text.addTraverseListener(new TraverseListener()
{
/**
*
*/
private static final long serialVersionUID = 1L;
public void keyTraversed(TraverseEvent e)
{
if (e.detail == SWT.TRAVERSE_ESCAPE)
{
e.doit = false;
endEditing(item, column, text, false);
}
else if (e.detail == SWT.TRAVERSE_RETURN)
{
e.doit = false;
endEditing(item, column, text, true);
}
}
});
text.selectAll();
text.setFocus();
return text;
}
protected void endEditing(TableItem item, int column, Control editor, boolean accept)
{
if (getEditor() != null)
{
if (accept)
{
update(item, column, editor);
}
setEditor(null);
editor.dispose();
}
}
protected abstract void update(TableItem item, int column, Control editor);
}