/******************************************************************************* * Copyright (c) 2012 Original authors 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: * Original authors and others - initial API and implementation ******************************************************************************/ package org.eclipse.nebula.widgets.nattable.examples.examples._101_Data; import java.util.ArrayList; import java.util.List; import org.eclipse.nebula.widgets.nattable.NatTable; import org.eclipse.nebula.widgets.nattable.data.IColumnPropertyAccessor; import org.eclipse.nebula.widgets.nattable.data.IDataProvider; import org.eclipse.nebula.widgets.nattable.data.ListDataProvider; import org.eclipse.nebula.widgets.nattable.data.ReflectiveColumnPropertyAccessor; import org.eclipse.nebula.widgets.nattable.examples.AbstractNatExample; import org.eclipse.nebula.widgets.nattable.examples.runner.StandaloneNatExampleRunner; import org.eclipse.nebula.widgets.nattable.grid.layer.DefaultGridLayer; import org.eclipse.nebula.widgets.nattable.layer.ILayer; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; public class Derived_or_computed_column_data extends AbstractNatExample { public static void main(String[] args) throws Exception { StandaloneNatExampleRunner.run(new Derived_or_computed_column_data()); } @Override public String getDescription() { return "This example shows how to add a derived fullName column which is computed by concatenating the firstName and lastName column values"; } @Override public Control createExampleControl(Composite parent) { List<Person> myList = new ArrayList<>(); myList.add(new Person("Homer", "Simpson", "Sargeant", 1234567890L)); myList.add(new Person("Waylon", "Smithers", "Admiral", 6666666666L)); myList.add(new Person("Bart", "Smithers", "General", 9125798342L)); myList.add(new Person("Nelson", "Muntz", "Private", 0000000001L)); myList.add(new Person("John", "Frink", "Lieutenant", 3141592654L)); String[] propertyNames = { "firstName", "lastName", "rank", "serialNumber" }; final IColumnPropertyAccessor<Person> columnPropertyAccessor = new ReflectiveColumnPropertyAccessor<>( propertyNames); // Add derived 'fullName' column final IColumnPropertyAccessor<Person> derivedColumnPropertyAccessor = new IColumnPropertyAccessor<Person>() { @Override public Object getDataValue(Person rowObject, int columnIndex) { if (columnIndex < columnPropertyAccessor.getColumnCount()) { return columnPropertyAccessor.getDataValue(rowObject, columnIndex); } else if (columnIndex == columnPropertyAccessor .getColumnCount()) { return columnPropertyAccessor.getDataValue(rowObject, 0) + " " + columnPropertyAccessor.getDataValue(rowObject, 1); } else { return null; } } @Override public void setDataValue(Person rowObject, int columnIndex, Object newValue) { columnPropertyAccessor.setDataValue(rowObject, columnIndex, newValue); } @Override public int getColumnCount() { return columnPropertyAccessor.getColumnCount() + 1; } @Override public String getColumnProperty(int columnIndex) { if (columnIndex < columnPropertyAccessor.getColumnCount()) { return columnPropertyAccessor .getColumnProperty(columnIndex); } else if (columnIndex == columnPropertyAccessor .getColumnCount()) { return "fullName"; } else { return null; } } @Override public int getColumnIndex(String propertyName) { if ("fullName".equals(propertyName)) { return columnPropertyAccessor.getColumnCount() + 1; } else { return columnPropertyAccessor.getColumnIndex(propertyName); } } }; final IDataProvider listDataProvider = new ListDataProvider<>( myList, derivedColumnPropertyAccessor); // Column header data provider includes derived properties IDataProvider columnHeaderDataProvider = new IDataProvider() { @Override public Object getDataValue(int columnIndex, int rowIndex) { return derivedColumnPropertyAccessor .getColumnProperty(columnIndex); } @Override public void setDataValue(int columnIndex, int rowIndex, Object newValue) { // noop } @Override public int getColumnCount() { return derivedColumnPropertyAccessor.getColumnCount(); } @Override public int getRowCount() { return 1; } }; ILayer layer = new DefaultGridLayer(listDataProvider, columnHeaderDataProvider); return new NatTable(parent, layer); } public class Person { private String firstName; private String lastName; private String rank; private long serialNumber; public Person(String firstName, String lastName, String rank, long serialNumber) { this.firstName = firstName; this.lastName = lastName; this.rank = rank; this.serialNumber = serialNumber; } public String getFirstName() { return this.firstName; } public String getLastName() { return this.lastName; } public String getRank() { return this.rank; } public long getSerialNumber() { return this.serialNumber; } } }