| /******************************************************************************* |
| * Copyright (c) 2008 Matthew Hall 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: |
| * Matthew Hall - initial API and implementation (bug 124684) |
| ******************************************************************************/ |
| |
| package org.eclipse.jface.examples.databinding.snippets; |
| |
| import java.beans.PropertyChangeListener; |
| import java.beans.PropertyChangeSupport; |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.HashSet; |
| import java.util.List; |
| import java.util.Set; |
| |
| import org.eclipse.core.databinding.DataBindingContext; |
| import org.eclipse.core.databinding.beans.BeansObservables; |
| import org.eclipse.core.databinding.observable.Realm; |
| import org.eclipse.core.databinding.observable.list.IObservableList; |
| import org.eclipse.core.databinding.observable.value.ComputedValue; |
| import org.eclipse.core.databinding.observable.value.IObservableValue; |
| import org.eclipse.jface.databinding.swt.SWTObservables; |
| import org.eclipse.jface.databinding.viewers.ObservableListContentProvider; |
| import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider; |
| import org.eclipse.jface.databinding.viewers.ViewersObservables; |
| import org.eclipse.jface.dialogs.IInputValidator; |
| import org.eclipse.jface.dialogs.InputDialog; |
| import org.eclipse.jface.dialogs.MessageDialog; |
| import org.eclipse.jface.layout.GridDataFactory; |
| import org.eclipse.jface.layout.GridLayoutFactory; |
| import org.eclipse.jface.layout.TableColumnLayout; |
| import org.eclipse.jface.viewers.CheckboxTableViewer; |
| import org.eclipse.jface.viewers.ColumnWeightData; |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| import org.eclipse.jface.viewers.StructuredSelection; |
| import org.eclipse.jface.viewers.TableViewer; |
| import org.eclipse.jface.window.Window; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.layout.GridLayout; |
| import org.eclipse.swt.widgets.Button; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Display; |
| import org.eclipse.swt.widgets.Event; |
| import org.eclipse.swt.widgets.Label; |
| import org.eclipse.swt.widgets.Listener; |
| import org.eclipse.swt.widgets.Shell; |
| import org.eclipse.swt.widgets.Table; |
| import org.eclipse.swt.widgets.TableColumn; |
| import org.eclipse.swt.widgets.Text; |
| |
| /** |
| * Snippet 018: Binding to the checked elements in a CheckboxTableViewer. |
| */ |
| public class Snippet018CheckboxTableViewerCheckedSelection { |
| public static void main(String[] args) { |
| // The SWT event loop |
| final Display display = Display.getDefault(); |
| Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() { |
| public void run() { |
| ViewModel viewModel = createSampleModel(); |
| |
| Shell shell = new View(viewModel).createShell(); |
| shell.open(); |
| while (!shell.isDisposed()) |
| if (!display.readAndDispatch()) |
| display.sleep(); |
| } |
| }); |
| display.dispose(); |
| } |
| |
| private static ViewModel createSampleModel() { |
| ViewModel viewModel = new ViewModel(); |
| |
| Person stan = createPerson("Stan"); |
| Person kyle = createPerson("Kyle"); |
| Person eric = createPerson("Eric"); |
| Person kenny = createPerson("Kenny"); |
| Person wendy = createPerson("Wendy"); |
| Person butters = createPerson("Butters"); |
| |
| setFriends(stan, new Person[] { kyle, eric, kenny, wendy }); |
| setFriends(kyle, new Person[] { stan, eric, kenny }); |
| setFriends(eric, new Person[] { eric }); |
| setFriends(kenny, new Person[] { stan, kyle, eric }); |
| setFriends(wendy, new Person[] { stan }); |
| setFriends(butters, new Person[0]); |
| |
| Person[] people = new Person[] { stan, kyle, eric, kenny, wendy, |
| butters }; |
| viewModel.setPeople(Arrays.asList(people)); |
| return viewModel; |
| } |
| |
| private static Person createPerson(String name) { |
| Person person = new Person(); |
| person.setName(name); |
| return person; |
| } |
| |
| private static void setFriends(Person person, Person[] friends) { |
| person.setFriends(new HashSet(Arrays.asList(friends))); |
| } |
| |
| // 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); |
| } |
| } |
| |
| // The data model class. |
| static class Person extends AbstractModelObject { |
| private String name; |
| private Set friends = new HashSet(); |
| |
| public String getName() { |
| return name; |
| } |
| |
| public void setName(String name) { |
| firePropertyChange("name", this.name, this.name = name); |
| } |
| |
| public Set getFriends() { |
| return new HashSet(friends); |
| } |
| |
| public void setFriends(Set friends) { |
| firePropertyChange("friends", this.friends, |
| this.friends = new HashSet(friends)); |
| } |
| |
| public String toString() { |
| return name; |
| } |
| } |
| |
| // The View's model--the root of our Model graph for this particular GUI. |
| // |
| // Typically each View class has a corresponding ViewModel class. |
| // |
| // The ViewModel is responsible for getting the objects to edit from the |
| // data access tier. Since this snippet doesn't have any persistent objects |
| // to retrieve, this ViewModel just instantiates a model object to edit. |
| static class ViewModel extends AbstractModelObject { |
| private List people = new ArrayList(); |
| |
| public List getPeople() { |
| return new ArrayList(people); |
| } |
| |
| public void setPeople(List people) { |
| firePropertyChange("people", this.people, |
| this.people = new ArrayList(people)); |
| } |
| } |
| |
| // The GUI view |
| static class View { |
| private ViewModel viewModel; |
| |
| private Shell shell; |
| |
| private Button addPersonButton; |
| private Button removePersonButton; |
| private TableViewer peopleViewer; |
| private Text personName; |
| private CheckboxTableViewer friendsViewer; |
| |
| public View(ViewModel viewModel) { |
| this.viewModel = viewModel; |
| } |
| |
| public Shell createShell() { |
| // Build a UI |
| final Display display = Display.getCurrent(); |
| shell = new Shell(display); |
| |
| createUI(shell); |
| |
| // Bind UI |
| bindUI(); |
| |
| // Open and return the Shell |
| shell.setSize(shell.computeSize(400, SWT.DEFAULT)); |
| shell.open(); |
| return shell; |
| } |
| |
| private void createUI(Shell shell) { |
| shell.setText("Binding checked elements in CheckboxTableViewer"); |
| shell.setLayout(new GridLayout(2, false)); |
| |
| new Label(shell, SWT.NONE).setText("People"); |
| |
| Composite buttons = new Composite(shell, SWT.NONE); |
| GridDataFactory.swtDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo( |
| buttons); |
| GridLayoutFactory.fillDefaults().numColumns(2).equalWidth(true) |
| .applyTo(buttons); |
| addPersonButton = new Button(buttons, SWT.PUSH); |
| addPersonButton.setText("Add"); |
| GridDataFactory.fillDefaults().applyTo(addPersonButton); |
| removePersonButton = new Button(buttons, SWT.PUSH); |
| removePersonButton.setText("Remove"); |
| GridDataFactory.fillDefaults().applyTo(removePersonButton); |
| |
| Composite peopleComposite = new Composite(shell, SWT.NONE); |
| GridDataFactory.fillDefaults().grab(true, true).span(2, 1).applyTo( |
| peopleComposite); |
| TableColumnLayout peopleColumnLayout = new TableColumnLayout(); |
| peopleComposite.setLayout(peopleColumnLayout); |
| |
| peopleViewer = new TableViewer(peopleComposite, SWT.SINGLE |
| | SWT.BORDER | SWT.FULL_SELECTION); |
| |
| Table peopleTable = peopleViewer.getTable(); |
| peopleTable.setHeaderVisible(true); |
| peopleTable.setLinesVisible(true); |
| |
| TableColumn nameColumn = new TableColumn(peopleTable, SWT.NONE); |
| nameColumn.setText("Name"); |
| peopleColumnLayout.setColumnData(nameColumn, |
| new ColumnWeightData(1)); |
| |
| TableColumn friendsColumn = new TableColumn(peopleTable, SWT.NONE); |
| friendsColumn.setText("Friends"); |
| peopleColumnLayout.setColumnData(friendsColumn, |
| new ColumnWeightData(3)); |
| |
| new Label(shell, SWT.NONE).setText("Name"); |
| |
| personName = new Text(shell, SWT.BORDER); |
| GridDataFactory.fillDefaults().grab(true, false) |
| .applyTo(personName); |
| |
| new Label(shell, SWT.NONE).setText("Friends"); |
| |
| Composite friendsComposite = new Composite(shell, SWT.NONE); |
| GridDataFactory.fillDefaults().grab(true, true).applyTo( |
| friendsComposite); |
| TableColumnLayout friendsColumnLayout = new TableColumnLayout(); |
| friendsComposite.setLayout(friendsColumnLayout); |
| |
| friendsViewer = CheckboxTableViewer.newCheckList(friendsComposite, |
| SWT.SINGLE | SWT.BORDER | SWT.FULL_SELECTION); |
| |
| Table friendsTable = friendsViewer.getTable(); |
| friendsTable.setHeaderVisible(true); |
| friendsTable.setLinesVisible(true); |
| TableColumn friendNameColumn = new TableColumn(friendsTable, |
| SWT.NONE); |
| friendNameColumn.setText("Name"); |
| friendsColumnLayout.setColumnData(friendNameColumn, |
| new ColumnWeightData(1)); |
| |
| GridDataFactory.fillDefaults().grab(true, true).applyTo( |
| friendsViewer.getTable()); |
| } |
| |
| private void bindUI() { |
| DataBindingContext dbc = new DataBindingContext(); |
| |
| final IObservableList people = BeansObservables.observeList(Realm |
| .getDefault(), viewModel, "people"); |
| |
| addPersonButton.addListener(SWT.Selection, new Listener() { |
| public void handleEvent(Event event) { |
| InputDialog dlg = new InputDialog(shell, "Add Person", |
| "Enter name:", "<Name>", new IInputValidator() { |
| public String isValid(String newText) { |
| if (newText == null |
| || newText.length() == 0) |
| return "Name cannot be empty"; |
| return null; |
| } |
| }); |
| if (dlg.open() == Window.OK) { |
| Person person = new Person(); |
| person.setName(dlg.getValue()); |
| people.add(person); |
| peopleViewer.setSelection(new StructuredSelection( |
| person)); |
| } |
| } |
| }); |
| |
| removePersonButton.addListener(SWT.Selection, new Listener() { |
| public void handleEvent(Event event) { |
| IStructuredSelection selected = (IStructuredSelection) peopleViewer |
| .getSelection(); |
| if (selected.isEmpty()) |
| return; |
| Person person = (Person) selected.getFirstElement(); |
| if (MessageDialog.openConfirm(shell, "Remove person", |
| "Remove " + person.getName() + "?")) |
| people.remove(person); |
| } |
| }); |
| |
| ObservableListContentProvider peopleContentProvider = new ObservableListContentProvider(); |
| peopleViewer.setContentProvider(peopleContentProvider); |
| peopleViewer.setLabelProvider(new ObservableMapLabelProvider( |
| BeansObservables.observeMaps(peopleContentProvider |
| .getKnownElements(), Person.class, new String[] { |
| "name", "friends" }))); |
| peopleViewer.setInput(people); |
| |
| final IObservableValue selectedPerson = ViewersObservables |
| .observeSingleSelection(peopleViewer); |
| |
| IObservableValue personSelected = new ComputedValue(Boolean.TYPE) { |
| protected Object calculate() { |
| return Boolean.valueOf(selectedPerson.getValue() != null); |
| } |
| }; |
| dbc.bindValue(SWTObservables.observeEnabled(removePersonButton), |
| personSelected, null, null); |
| dbc.bindValue(SWTObservables.observeEnabled(friendsViewer |
| .getTable()), personSelected, null, null); |
| |
| dbc.bindValue(SWTObservables.observeText(personName, SWT.Modify), |
| BeansObservables.observeDetailValue(Realm.getDefault(), |
| selectedPerson, "name", String.class), null, null); |
| |
| ObservableListContentProvider friendsContentProvider = new ObservableListContentProvider(); |
| friendsViewer.setContentProvider(friendsContentProvider); |
| friendsViewer.setLabelProvider(new ObservableMapLabelProvider( |
| BeansObservables.observeMap(friendsContentProvider |
| .getKnownElements(), Person.class, "name"))); |
| friendsViewer.setInput(people); |
| |
| dbc.bindSet(ViewersObservables.observeCheckedElements( |
| friendsViewer, Person.class), BeansObservables |
| .observeDetailSet(Realm.getDefault(), selectedPerson, |
| "friends", Person.class), null, null); |
| } |
| } |
| } |