Free tutorials for Java, Eclipse and Web programming



Follow me on twitter

5. Editing the table content

5.1. Editing Support for TableColumnViewer

To make the column editable you define an object of type "EditingSupport" on your TableColumnViewer. The EditingSupport implementation defines how the content can be maintained, e.g. via a text input field or via a drop-down list and how to get and set the values in the data model. You can assign the editors to your columns via the method setEditingSupport() of your TableViewerColumn.

How the content is maintained is defined via an object of type "CellEditor". Eclipse provides default implementations for typical cases, e.g. "TextCellEditor", "ColorCellEditor", "CHeckboxCellEditor", "DialogCellEditor" and "ComboBoxViewerCellEditor".

The CellEditor for EditingSupport is defined in method "getCellEditor()". In this method you return the CellEditor object you want to use (e.g. Texteditor). The method "setValue()"rseceives the new value from the user. You use this method to set the new value to the object. The method "getValue()" receives the object which was changed and returns the value for the table. You have to return the new value of the object.

5.2. Implementation

Create the following new classes in the new package "de.vogella.jface.tableviewer.edit".

				
package de.vogella.jface.tableviewer.edit;

import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TextCellEditor;

import de.vogella.jface.tableviewer.model.Person;

public class FirstNameEditingSupport extends EditingSupport {

	private final TableViewer viewer;

	public FirstNameEditingSupport(TableViewer viewer) {
		super(viewer);
		this.viewer = viewer;
	}

	@Override
	protected CellEditor getCellEditor(Object element) {
		return new TextCellEditor(viewer.getTable());
	}

	@Override
	protected boolean canEdit(Object element) {
		return true;
	}

	@Override
	protected Object getValue(Object element) {
		return ((Person) element).getFirstName();
	}

	@Override
	protected void setValue(Object element, Object value) {
		((Person) element).setFirstName(String.valueOf(value));
		viewer.refresh();
	}
}

			

				
package de.vogella.jface.tableviewer.edit;

import org.eclipse.jface.viewers.TableViewer;

import de.vogella.jface.tableviewer.model.Person;

public class LastNameEditingSupport extends FirstNameEditingSupport {

	private final TableViewer viewer;

	public LastNameEditingSupport(TableViewer viewer) {
		super(viewer);
		this.viewer = viewer;
	}

	@Override
	protected Object getValue(Object element) {
		return ((Person) element).getLastName();
	}

	@Override
	protected void setValue(Object element, Object value) {
		((Person) element).setLastName(String.valueOf(value));
		viewer.refresh();
	}
}

			

				
package de.vogella.jface.tableviewer.edit;

import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ComboBoxCellEditor;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.TableViewer;

import de.vogella.jface.tableviewer.model.Person;

public class GenderEditingSupport extends EditingSupport {

	private final TableViewer viewer;

	public GenderEditingSupport(TableViewer viewer) {
		super(viewer);
		this.viewer = viewer;
	}

	@Override
	protected CellEditor getCellEditor(Object element) {
		String[] gender = new String[2];
		gender[0] = "male";
		gender[1] = "female";

		return new ComboBoxCellEditor(viewer.getTable(), gender);
	}

	@Override
	protected boolean canEdit(Object element) {
		return true;
	}

	@Override
	protected Object getValue(Object element) {
		Person person = (Person) element;
		if (person.getGender().equals("male")) {
			return 0;
		}
		return 1;

	}

	@Override
	protected void setValue(Object element, Object value) {
		Person pers = (Person) element;
		if (((Integer) value) == 0) {
			pers.setGender("male");
		} else {
			pers.setGender("female");
		}
		viewer.refresh();
	}
}

			

				
package de.vogella.jface.tableviewer.edit;

import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.CheckboxCellEditor;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;

import de.vogella.jface.tableviewer.model.Person;

public class MarriedEditingSupport extends EditingSupport {

	private final TableViewer viewer;

	public MarriedEditingSupport(TableViewer viewer) {
		super(viewer);
		this.viewer = viewer;
	}

	@Override
	protected CellEditor getCellEditor(Object element) {
		return new CheckboxCellEditor(null, SWT.CHECK | SWT.READ_ONLY);

	}

	@Override
	protected boolean canEdit(Object element) {
		return true;
	}

	@Override
	protected Object getValue(Object element) {
		Person person = (Person) element;
		return person.isMarried();

	}

	@Override
	protected void setValue(Object element, Object value) {
		Person pers = (Person) element;
		pers.setMarried((Boolean) value);
		viewer.refresh();
	}
}

			

Now assign EditorSupport objects to your TableColumnViewers in your View class.

				
	// This will create the columns for the table
	private void createColumns(final Composite parent, final TableViewer viewer) {
		String[] titles = { "First name", "Last name", "Gender", "Married" };
		int[] bounds = { 100, 100, 100, 100 };

		// First column is for the first name
		TableViewerColumn col = createTableViewerColumn(titles[0], bounds[0], 0);
		col.setLabelProvider(new CellLabelProvider() {
			@Override
			public void update(ViewerCell cell) {
				cell.setText(((Person) cell.getElement()).getFirstName());
			}
		});
		col.setEditingSupport(new FirstNameEditingSupport(viewer));

		// Second column is for the last name
		col = createTableViewerColumn(titles[1], bounds[1], 1);
		col.setLabelProvider(new CellLabelProvider() {
			@Override
			public void update(ViewerCell cell) {
				cell.setText(((Person) cell.getElement()).getLastName());
			}
		});
		col.setEditingSupport(new LastNameEditingSupport(viewer));

		// Now the gender
		col = createTableViewerColumn(titles[2], bounds[2], 2);
		col.setLabelProvider(new ColumnLabelProvider() {
			@Override
			public String getText(Object element) {
				Person p = (Person) element;
				return p.getGender();
			}
		});
		col.setEditingSupport(new GenderEditingSupport(viewer));

		// // Now the status married
		col = createTableViewerColumn(titles[3], bounds[3], 3);
		col.setLabelProvider(new ColumnLabelProvider() {
			@Override
			public String getText(Object element) {
				return null;
			}

			@Override
			public Image getImage(Object element) {
				if (((Person) element).isMarried()) {
					return CHECKED;
				} else {
					return UNCHECKED;
				}
			}
		});
		col.setEditingSupport(new MarriedEditingSupport(viewer));

	}
			

Run your application. You should now be able to modify the content of the JFace table.