blob: b1076b49df27d3cd561622f05075b1e4ce8c74db [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2018 Matthew Hall and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Matthew Hall - initial API and implementation (bug 175735)
* Matthew Hall - bugs 262407, 260337
******************************************************************************/
package org.eclipse.jface.examples.databinding.snippets;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.beans.BeanProperties;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.databinding.observable.list.WritableList;
import org.eclipse.core.databinding.observable.value.DuplexingObservableValue;
import org.eclipse.jface.databinding.swt.DisplayRealm;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.jface.databinding.viewers.ViewerProperties;
import org.eclipse.jface.databinding.viewers.ViewerSupport;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
/**
* @since 3.2
*
*/
public class Snippet028DuplexingObservableValue {
protected Shell shell;
private TableViewer viewer;
private Table table;
private Text releaseDate;
private Text title;
private Text director;
private Text writer;
/**
* Launch the application
*
* @param args
*/
public static void main(String[] args) {
try {
Snippet028DuplexingObservableValue window = new Snippet028DuplexingObservableValue();
window.open();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Open the window
*/
public void open() {
final Display display = Display.getDefault();
Realm.runWithDefault(DisplayRealm.getRealm(display), () -> {
createContents();
shell.open();
shell.layout();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
});
}
protected void createContents() {
shell = new Shell();
shell.setSize(509, 375);
shell.setText("Snippet028DuplexingObservableValue.java");
final GridLayout gridLayout = new GridLayout();
gridLayout.makeColumnsEqualWidth = true;
gridLayout.numColumns = 4;
shell.setLayout(gridLayout);
viewer = new TableViewer(shell, SWT.FULL_SELECTION | SWT.MULTI
| SWT.BORDER);
table = viewer.getTable();
table.setLinesVisible(true);
table.setHeaderVisible(true);
table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 4, 1));
final TableColumn newColumnTableColumn_1 = new TableColumn(table,
SWT.NONE);
newColumnTableColumn_1.setWidth(120);
newColumnTableColumn_1.setText("Movie");
final TableColumn newColumnTableColumn = new TableColumn(table,
SWT.NONE);
newColumnTableColumn.setWidth(120);
newColumnTableColumn.setText("Release Date");
final TableColumn newColumnTableColumn_2 = new TableColumn(table,
SWT.NONE);
newColumnTableColumn_2.setWidth(120);
newColumnTableColumn_2.setText("Director");
final TableColumn newColumnTableColumn_3 = new TableColumn(table,
SWT.NONE);
newColumnTableColumn_3.setWidth(120);
newColumnTableColumn_3.setText("Writer");
final Label movieLabel = new Label(shell, SWT.NONE);
movieLabel.setText("Movie");
final Label directorLabel = new Label(shell, SWT.NONE);
directorLabel.setLayoutData(new GridData());
directorLabel.setText("Release Date");
final Label producerLabel = new Label(shell, SWT.NONE);
producerLabel.setText("Director");
final Label scoreLabel = new Label(shell, SWT.NONE);
scoreLabel.setText("Writer");
title = new Text(shell, SWT.BORDER);
final GridData gd_title = new GridData(SWT.FILL, SWT.CENTER, true,
false);
title.setLayoutData(gd_title);
releaseDate = new Text(shell, SWT.BORDER);
final GridData gd_releaseDate = new GridData(SWT.FILL, SWT.CENTER,
true, false);
releaseDate.setLayoutData(gd_releaseDate);
director = new Text(shell, SWT.BORDER);
final GridData gd_director = new GridData(SWT.FILL, SWT.CENTER, true,
false);
director.setLayoutData(gd_director);
writer = new Text(shell, SWT.BORDER);
final GridData gd_writer = new GridData(SWT.FILL, SWT.CENTER, true,
false);
writer.setLayoutData(gd_writer);
bindUI();
}
// Minimal JavaBeans support
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);
}
}
public static class MovieInfo extends AbstractModelObject {
private String title;
private String releaseDate;
private String director;
private String writer;
public MovieInfo(String title, String releaseDate, String director,
String writer) {
this.title = title;
this.releaseDate = releaseDate;
this.director = director;
this.writer = writer;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
firePropertyChange("title", this.title, this.title = title);
}
public String getReleaseDate() {
return releaseDate;
}
public void setReleaseDate(String releaseDate) {
firePropertyChange("releaseDate", this.releaseDate,
this.releaseDate = releaseDate);
}
public String getDirector() {
return director;
}
public void setDirector(String director) {
firePropertyChange("director", this.director,
this.director = director);
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
firePropertyChange("writer", this.writer, this.writer = writer);
}
}
private void bindUI() {
IObservableList movies = new WritableList();
movies.add(new MovieInfo("007: Quantum of Solace", "October 31, 2008",
"Marc Forster", "Robert Wade"));
movies.add(new MovieInfo("Batman Begins", "June 15, 2005",
"Christopher Nolan", "David S. Goyer"));
movies.add(new MovieInfo("Cloverfield", "January 18, 2008",
"Matt Reeves", "Drew Goddard"));
movies.add(new MovieInfo("The Dark Knight", "July 18, 2008",
"Christopher Nolan", "David S. Goyer"));
movies.add(new MovieInfo("Finding Nemo", "May 30, 2003",
"Andrew Stanton", "Andrew Stanton"));
movies.add(new MovieInfo("Get Smart", "June 20, 2008", "Peter Segal",
"Tom J. Astle"));
movies.add(new MovieInfo(
"Indiana Jones and the Kingdom of the Crystal Skull",
"May 22, 2008", "Steven Spielberg", "Drunken Lemurs"));
movies.add(new MovieInfo("Iron Man", "May 2, 2008", "Jon Favreau",
"Mark Fergus"));
movies.add(new MovieInfo("Raiders of the Lost Ark", "June 12, 1981",
"Steven Spielberg", "George Lucas"));
movies.add(new MovieInfo("Valkyrie", "December 25, 2008",
"Bryan Singer", "Christopher McQuarrie"));
movies.add(new MovieInfo("Wall-E", "June 27, 2008", "Andrew Stanton",
"Andrew Stanton"));
movies.add(new MovieInfo("Wanted", "June 27, 2008",
"Timur Bekmambetov", "Michael Brandt"));
ViewerSupport.bind(viewer, movies, BeanProperties.values(
MovieInfo.class, new String[] { "title", "releaseDate",
"director", "writer" }));
// Select Batman Begins and The Dark Knight, which have the same
// director and writer
viewer.setSelection(new StructuredSelection(new Object[] {
movies.get(1), movies.get(3) }));
DataBindingContext dbc = new DataBindingContext();
IObservableList selections = ViewerProperties.multipleSelection()
.observe(viewer);
dbc.bindValue(WidgetProperties.text(SWT.Modify).observe(title),
DuplexingObservableValue.withDefaults(BeanProperties.value(
"title").observeDetail(selections), "",
"<Multiple titles>"));
dbc.bindValue(WidgetProperties.text(SWT.Modify).observe(releaseDate),
DuplexingObservableValue.withDefaults(BeanProperties.value(
"releaseDate").observeDetail(selections), "",
"<Multiple dates>"));
dbc.bindValue(WidgetProperties.text(SWT.Modify).observe(director),
DuplexingObservableValue.withDefaults(BeanProperties.value(
"director").observeDetail(selections), "",
"<Multiple directors>"));
dbc.bindValue(WidgetProperties.text(SWT.Modify).observe(writer),
DuplexingObservableValue.withDefaults(BeanProperties.value(
"writer").observeDetail(selections), "",
"<Multiple writers>"));
}
}