/*
SWT/JFace in Action
GUI Design with Eclipse 3.0
Matthew Scarpino, Stephen Holder, Stanford Ng, and Laurent Mihalkovic
ISBN: 1932394273
Publisher: Manning
*/
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ComboBoxCellEditor;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
public class Ch9TableEditorComposite extends Composite {
private static final Object[] CONTENT = new Object[] {
new EditableTableItem("item 1", new Integer(0)),
new EditableTableItem("item 2", new Integer(1)) };
private static final String[] VALUE_SET = new String[] { "xxx", "yyy",
"zzz" };
private static final String NAME_PROPERTY = "name";
private static final String VALUE_PROPERTY = "value";
private TableViewer viewer;
public Ch9TableEditorComposite(Composite parent) {
super(parent, SWT.NULL);
buildControls();
}
private class NewRowAction extends Action {
public NewRowAction() {
super("Insert New Row");
}
public void run() {
EditableTableItem newItem = new EditableTableItem("new row",
new Integer(2));
viewer.add(newItem);
}
}
protected void buildControls() {
FillLayout compositeLayout = new FillLayout();
setLayout(compositeLayout);
final Table table = new Table(this, SWT.FULL_SELECTION);
viewer = buildAndLayoutTable(table);
attachContentProvider(viewer);
attachLabelProvider(viewer);
attachCellEditors(viewer, table);
MenuManager popupMenu = new MenuManager();
IAction newRowAction = new NewRowAction();
popupMenu.add(newRowAction);
Menu menu = popupMenu.createContextMenu(table);
table.setMenu(menu);
viewer.setInput(CONTENT);
}
private void attachLabelProvider(TableViewer viewer) {
viewer.setLabelProvider(new ITableLabelProvider() {
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
public String getColumnText(Object element, int columnIndex) {
switch (columnIndex) {
case 0:
return ((EditableTableItem) element).name;
case 1:
Number index = ((EditableTableItem) element).value;
return VALUE_SET[index.intValue()];
default:
return "Invalid column: " + columnIndex;
}
}
public void addListener(ILabelProviderListener listener) {
}
public void dispose() {
}
public boolean isLabelProperty(Object element, String property) {
return false;
}
public void removeListener(ILabelProviderListener lpl) {
}
});
}
private void attachContentProvider(TableViewer viewer) {
viewer.setContentProvider(new IStructuredContentProvider() {
public Object[] getElements(Object inputElement) {
return (Object[]) inputElement;
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput,
Object newInput) {
}
});
}
private TableViewer buildAndLayoutTable(final Table table) {
TableViewer tableViewer = new TableViewer(table);
TableLayout layout = new TableLayout();
layout.addColumnData(new ColumnWeightData(50, 75, true));
layout.addColumnData(new ColumnWeightData(50, 75, true));
table.setLayout(layout);
TableColumn nameColumn = new TableColumn(table, SWT.CENTER);
nameColumn.setText("Name");
TableColumn valColumn = new TableColumn(table, SWT.CENTER);
valColumn.setText("Value");
table.setHeaderVisible(true);
return tableViewer;
}
private void attachCellEditors(final TableViewer viewer, Composite parent) {
viewer.setCellModifier(new ICellModifier() {
public boolean canModify(Object element, String property) {
return true;
}
public Object getValue(Object element, String property) {
if (NAME_PROPERTY.equals(property))
return ((EditableTableItem) element).name;
else
return ((EditableTableItem) element).value;
}
public void modify(Object element, String property, Object value) {
TableItem tableItem = (TableItem) element;
EditableTableItem data = (EditableTableItem) tableItem
.getData();
if (NAME_PROPERTY.equals(property))
data.name = value.toString();
else
data.value = (Integer) value;
viewer.refresh(data);
}
});
viewer.setCellEditors(new CellEditor[] { new TextCellEditor(parent),
new ComboBoxCellEditor(parent, VALUE_SET) });
viewer
.setColumnProperties(new String[] { NAME_PROPERTY,
VALUE_PROPERTY });
}
}
class EditableTableItem {
public String name;
public Integer value;
public EditableTableItem(String n, Integer v) {
name = n;
value = v;
}
}