package snippet;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.CheckboxCellEditor;
import org.eclipse.jface.viewers.ColorCellEditor;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ComboBoxCellEditor;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
/**
* This class demonstrates CellEditors. It allows you to create and edit Person
* objects
*/
public class TestEditor {
public TestEditor(Shell parentShell) {
createContents(parentShell);
}
/**
* Creates the main window's contents
*
* @param parent
* the main window
* @return Control
*/
protected Control createContents(Shell parent) {
parent.setLayout(new FillLayout());
String[] titles = { "Name", "Verheiratet", "Farbe", "Grußwort" };
String[] prop = { "name", "verheiratet", "farbe", "grußwort" };
Class<?>[] clazz = { String.class, Boolean.class, RGB.class,
String.class };
// Prozent angaben für die breite
Integer[] percent = { 10, 25, 25, 20, 20 };
Composite tableComposite = new Composite(parent, SWT.NONE);
TableColumnLayout tableColumnLayout = new TableColumnLayout();
TableViewer viewer = new TableViewer(tableComposite, SWT.SINGLE
| SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);
Table table = viewer.getTable();
CellEditor[] editors = new CellEditor[5];
editors[0] = new TextCellEditor(table);
editors[1] = new CheckboxCellEditor(table);
editors[2] = new ColorCellEditor(table);
editors[3] = new ComboBoxCellEditor(table, new String[] { "Hi",
"Hallo", "Tag" }, SWT.READ_ONLY);
table.setLinesVisible(true);
table.setHeaderVisible(true);
tableComposite.setLayout(tableColumnLayout);
for (int i = 0; i < titles.length; i++) {
final TableViewerColumn viewerNameColumn = new TableViewerColumn(
viewer, SWT.NONE);
viewerNameColumn.getColumn().setText(titles[i]);
tableColumnLayout.setColumnData(viewerNameColumn.getColumn(),
new ColumnWeightData(percent[i], 10, true));
viewerNameColumn.setLabelProvider(new MyCellLabelProvider<Kunde>(
prop[i], clazz[i]));
viewerNameColumn.setEditingSupport(new MyCellEditingSupport(viewer,
prop[i], editors[i]));
}
viewer.setContentProvider(new ArrayContentProvider());
List<Kunde> list = new ArrayList<Kunde>();
for (int i = 0; i < 5; i++) {
Kunde k = new Kunde();
k.setName("");
k.setGrußwort("");
k.setVerheiratet(true);
k.setFarbe(new RGB(0, 0, 0));
list.add(k);
}
viewer.setInput(list);
return parent;
}
public static class MyCellLabelProvider<E> extends CellLabelProvider {
private String property;
private Class<?> clazz;
public MyCellLabelProvider(String property, Class<?> clazz) {
super();
this.property = property;
this.clazz = clazz;
}
@Override
public void update(ViewerCell cell) {
E element = (E) cell.getElement();
try {
Object o = getObject(property, element);
if (o != null)
cell.setText(clazz.cast(o).toString());
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private static Object getObject(String property, Object element)
throws SecurityException, NoSuchMethodException,
IllegalArgumentException, IllegalAccessException,
InvocationTargetException {
char[] propName = property.toCharArray();
propName[0] = Character.toUpperCase(propName[0]);
String readGetterMethodName = "get" + new String(propName);
Method method = element.getClass().getMethod(readGetterMethodName,
new Class[] {});
Object o = method.invoke(element, new Object[0]);
return o;
}
private static void setObject(String property, Object element, Object set)
throws IllegalArgumentException, IllegalAccessException,
InvocationTargetException, SecurityException, NoSuchMethodException {
char[] propName = property.toCharArray();
propName[0] = Character.toUpperCase(propName[0]);
String readGetterMethodName = "set" + new String(propName);
Method method = element.getClass().getMethod(readGetterMethodName,
new Class[] { set.getClass() });
method.invoke(element, new Object[] { set });
}
class MyCellEditingSupport extends EditingSupport {
private Viewer viewer;
private String property;
private CellEditor cellEditor;
public MyCellEditingSupport(ColumnViewer viewer, String property,
CellEditor cellEditor) {
super(viewer);
this.viewer = viewer;
this.property = property;
this.cellEditor = cellEditor;
}
@Override
protected boolean canEdit(Object element) {
return true;
}
@Override
protected CellEditor getCellEditor(Object element) {
// TODO Auto-generated method stub
return cellEditor;
}
@Override
protected Object getValue(Object element) {
Object o = null;
try {
o = getObject(property, element);
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(cellEditor instanceof ComboBoxCellEditor){
String[] items = ((ComboBoxCellEditor) cellEditor).getItems();
for (int i = 0; i < items.length; i++) {
if(items[i].equals(o)){
cellEditor.setValue(i);
return i;
}
}
cellEditor.setValue(0);
return 0;
}
return o;
}
@Override
protected void setValue(Object element, Object value) {
if(cellEditor instanceof ComboBoxCellEditor){
String[] items = ((ComboBoxCellEditor) cellEditor).getItems();
value = items[(Integer) cellEditor.getValue()];
}
try {
setObject(property, element, value);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// Force the viewer to refresh
viewer.refresh();
}
}
public static class Kunde {
private String name;
private Boolean verheiratet;
public Boolean getVerheiratet() {
return verheiratet;
}
public void setVerheiratet(Boolean verheiratet) {
this.verheiratet = verheiratet;
}
public String getGrußwort() {
return grußwort;
}
public void setGrußwort(String grußwort) {
this.grußwort = grußwort;
}
public RGB getFarbe() {
return rgb;
}
public void setFarbe(RGB rgb) {
this.rgb = rgb;
}
private String grußwort;
private RGB rgb;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
/**
* @param args
*/
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
new TestEditor(shell);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}