|
|
Re: [Databinding] Calculting the sum of a column in a tableviewer [message #760109 is a reply to message #759685] |
Thu, 01 December 2011 10:57 |
Christian Hager Messages: 53 Registered: July 2009 Location: Germany |
Member |
|
|
Hi,
yes I found a solution. Basically I ended up binding the list of objects backing my tableviewer to the tableviewer. Then I added this list to a computed value which in turn is bound to the text field. So everytime I change the contents of the list my sum field will update displaying the new sum. I hope the following snippet will display the idea.
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.Iterator;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.beans.BeanProperties;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.core.databinding.observable.list.WritableList;
import org.eclipse.core.databinding.observable.value.ComputedValue;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.jface.databinding.viewers.ViewerSupport;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
/**
* Binds a TableViewer to a Collection and displays the sum of the shown column
* in a text field.
*/
public class SnippetTableViewerSum {
public static void main(String[] args) {
final Display display = Display.getDefault();
Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() {
public void run() {
ViewModel viewModel = new ViewModel();
Shell shell = new View(viewModel).createShell();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}
});
}
public static abstract class AbstractModelObject {
private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(
this);
public void addPropertyChangeListener(PropertyChangeListener listener) {
propertyChangeSupport.addPropertyChangeListener(listener);
}
public void addPropertyChangeListener(String propertyName,
PropertyChangeListener listener) {
propertyChangeSupport.addPropertyChangeListener(propertyName,
listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
propertyChangeSupport.removePropertyChangeListener(listener);
}
public void removePropertyChangeListener(String propertyName,
PropertyChangeListener listener) {
propertyChangeSupport.removePropertyChangeListener(propertyName,
listener);
}
protected void firePropertyChange(String propertyName, Object oldValue,
Object newValue) {
propertyChangeSupport.firePropertyChange(propertyName, oldValue,
newValue);
}
}
static class Task extends AbstractModelObject {
Double timeTaken = null;
public Task(Double timeTaken) {
this.timeTaken = timeTaken;
}
public Double getTimeTaken() {
return timeTaken;
}
public void setTimeTaken(Double timeTaken) {
Double oldValue = this.timeTaken;
this.timeTaken = timeTaken;
firePropertyChange("timeTaken", oldValue, timeTaken);
}
}
static class ViewModel {
private WritableList tasks = new WritableList();
{
tasks.add(new Task(Math.random()));
tasks.add(new Task(Math.random()));
tasks.add(new Task(Math.random()));
tasks.add(new Task(Math.random()));
tasks.add(new Task(Math.random()));
tasks.add(new Task(Math.random()));
tasks.add(new Task(Math.random()));
}
public WritableList getTasks() {
return tasks;
}
}
static class View {
private ViewModel viewModel;
private Table tasks;
private Button addTask;
private TableColumn column;
private SumValue sumValue;
public View(ViewModel viewModel) {
this.viewModel = viewModel;
}
public Shell createShell() {
Display display = Display.getDefault();
DataBindingContext dbc = new DataBindingContext();
Shell shell = new Shell(display);
shell.setLayout(new GridLayout(2, false));
GridDataFactory gdf = GridDataFactory.swtDefaults()
.align(SWT.FILL, SWT.FILL).grab(true, true);
tasks = new Table(shell, SWT.BORDER | SWT.FULL_SELECTION);
gdf.applyTo(tasks);
tasks.setLinesVisible(true);
column = new TableColumn(tasks, SWT.NONE);
TableViewer tasksViewer = new TableViewer(tasks);
ViewerSupport.bind(tasksViewer, viewModel.getTasks(),
BeanProperties.value(Task.class, "timeTaken"));
column.pack();
GridDataFactory gdf2 = GridDataFactory.swtDefaults().align(
SWT.FILL, SWT.BEGINNING);
addTask = new Button(shell, SWT.PUSH);
gdf2.applyTo(addTask);
addTask.setText("Add Task");
addTask.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
viewModel.getTasks().add(new Task(Math.random()));
column.pack();
}
});
GridDataFactory gdf3 = GridDataFactory.swtDefaults()
.align(SWT.FILL, SWT.BEGINNING).grab(true, false);
Text sum = new Text(shell, SWT.BORDER);
gdf3.applyTo(sum);
sumValue = new SumValue(viewModel.getTasks());
dbc.bindValue(SWTObservables.observeText(sum, SWT.None), sumValue,
new UpdateValueStrategy(false,
UpdateValueStrategy.POLICY_NEVER), null);
shell.setSize(300, 300);
shell.open();
return shell;
}
}
// The computed value which calculates the sum
static class SumValue extends ComputedValue {
private WritableList tasks;
SumValue(WritableList tasks) {
this.tasks = tasks;
}
protected Object calculate() {
double sum = 0;
Iterator<Task> iterator = tasks.iterator();
while (iterator.hasNext()) {
Task task = (Task) iterator.next();
sum += task.getTimeTaken();
}
return String.valueOf(sum);
}
}
}
|
|
|
Powered by
FUDForum. Page generated in 0.01663 seconds