comparison org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet018CheckboxTableViewerCheckedSelection.d @ 99:5d5bd660917f

build some databind snippets
author Frank Benoit <benoit@tionex.de>
date Wed, 22 Apr 2009 18:59:26 +0200
parents 6086085e153d
children e884642ad36e
comparison
equal deleted inserted replaced
98:48d4ee626868 99:5d5bd660917f
8 * Contributors: 8 * Contributors:
9 * Matthew Hall - initial API and implementation (bug 124684) 9 * Matthew Hall - initial API and implementation (bug 124684)
10 * Matthew Hall - bugs 260329, 260337 10 * Matthew Hall - bugs 260329, 260337
11 ******************************************************************************/ 11 ******************************************************************************/
12 12
13 package org.eclipse.jface.examples.databinding.snippets; 13 module org.eclipse.jface.examples.databinding.snippets.Snippet018CheckboxTableViewerCheckedSelection;
14
15 import java.lang.all;
14 16
15 import java.beans.PropertyChangeListener; 17 import java.beans.PropertyChangeListener;
16 import java.beans.PropertyChangeSupport; 18 import java.beans.PropertyChangeSupport;
17 import java.util.ArrayList; 19 import java.util.ArrayList;
18 import java.util.Arrays; 20 import java.util.Arrays;
57 59
58 /** 60 /**
59 * Snippet 018: Binding to the checked elements in a CheckboxTableViewer. 61 * Snippet 018: Binding to the checked elements in a CheckboxTableViewer.
60 */ 62 */
61 public class Snippet018CheckboxTableViewerCheckedSelection { 63 public class Snippet018CheckboxTableViewerCheckedSelection {
62 public static void main(String[] args) { 64 public static void main(String[] args) {
63 // The SWT event loop 65 // The SWT event loop
64 final Display display = Display.getDefault(); 66 final Display display = Display.getDefault();
65 Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() { 67 Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() {
66 public void run() { 68 public void run() {
67 ViewModel viewModel = createSampleModel(); 69 ViewModel viewModel = createSampleModel();
68 70
69 Shell shell = new View(viewModel).createShell(); 71 Shell shell = new View(viewModel).createShell();
70 shell.open(); 72 shell.open();
71 while (!shell.isDisposed()) 73 while (!shell.isDisposed())
72 if (!display.readAndDispatch()) 74 if (!display.readAndDispatch())
73 display.sleep(); 75 display.sleep();
74 } 76 }
75 }); 77 });
76 display.dispose(); 78 display.dispose();
77 } 79 }
78 80
79 private static ViewModel createSampleModel() { 81 private static ViewModel createSampleModel() {
80 ViewModel viewModel = new ViewModel(); 82 ViewModel viewModel = new ViewModel();
81 83
82 Person stan = createPerson("Stan"); 84 Person stan = createPerson("Stan");
83 Person kyle = createPerson("Kyle"); 85 Person kyle = createPerson("Kyle");
84 Person eric = createPerson("Eric"); 86 Person eric = createPerson("Eric");
85 Person kenny = createPerson("Kenny"); 87 Person kenny = createPerson("Kenny");
86 Person wendy = createPerson("Wendy"); 88 Person wendy = createPerson("Wendy");
87 Person butters = createPerson("Butters"); 89 Person butters = createPerson("Butters");
88 90
89 setFriends(stan, new Person[] { kyle, eric, kenny, wendy }); 91 setFriends(stan, new Person[] { kyle, eric, kenny, wendy });
90 setFriends(kyle, new Person[] { stan, eric, kenny }); 92 setFriends(kyle, new Person[] { stan, eric, kenny });
91 setFriends(eric, new Person[] { eric }); 93 setFriends(eric, new Person[] { eric });
92 setFriends(kenny, new Person[] { stan, kyle, eric }); 94 setFriends(kenny, new Person[] { stan, kyle, eric });
93 setFriends(wendy, new Person[] { stan }); 95 setFriends(wendy, new Person[] { stan });
94 setFriends(butters, new Person[0]); 96 setFriends(butters, new Person[0]);
95 97
96 Person[] people = new Person[] { stan, kyle, eric, kenny, wendy, 98 Person[] people = new Person[] { stan, kyle, eric, kenny, wendy,
97 butters }; 99 butters };
98 viewModel.setPeople(Arrays.asList(people)); 100 viewModel.setPeople(Arrays.asList(people));
99 return viewModel; 101 return viewModel;
100 } 102 }
101 103
102 private static Person createPerson(String name) { 104 private static Person createPerson(String name) {
103 Person person = new Person(); 105 Person person = new Person();
104 person.setName(name); 106 person.setName(name);
105 return person; 107 return person;
106 } 108 }
107 109
108 private static void setFriends(Person person, Person[] friends) { 110 private static void setFriends(Person person, Person[] friends) {
109 person.setFriends(new HashSet(Arrays.asList(friends))); 111 person.setFriends(new HashSet(Arrays.asList(friends)));
110 } 112 }
111 113
112 // Minimal JavaBeans support 114 // Minimal JavaBeans support
113 public static abstract class AbstractModelObject { 115 public static abstract class AbstractModelObject {
114 private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport( 116 private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(
115 this); 117 this);
116 118
117 public void addPropertyChangeListener(PropertyChangeListener listener) { 119 public void addPropertyChangeListener(PropertyChangeListener listener) {
118 propertyChangeSupport.addPropertyChangeListener(listener); 120 propertyChangeSupport.addPropertyChangeListener(listener);
119 } 121 }
120 122
121 public void addPropertyChangeListener(String propertyName, 123 public void addPropertyChangeListener(String propertyName,
122 PropertyChangeListener listener) { 124 PropertyChangeListener listener) {
123 propertyChangeSupport.addPropertyChangeListener(propertyName, 125 propertyChangeSupport.addPropertyChangeListener(propertyName,
124 listener); 126 listener);
125 } 127 }
126 128
127 public void removePropertyChangeListener(PropertyChangeListener listener) { 129 public void removePropertyChangeListener(PropertyChangeListener listener) {
128 propertyChangeSupport.removePropertyChangeListener(listener); 130 propertyChangeSupport.removePropertyChangeListener(listener);
129 } 131 }
130 132
131 public void removePropertyChangeListener(String propertyName, 133 public void removePropertyChangeListener(String propertyName,
132 PropertyChangeListener listener) { 134 PropertyChangeListener listener) {
133 propertyChangeSupport.removePropertyChangeListener(propertyName, 135 propertyChangeSupport.removePropertyChangeListener(propertyName,
134 listener); 136 listener);
135 } 137 }
136 138
137 protected void firePropertyChange(String propertyName, Object oldValue, 139 protected void firePropertyChange(String propertyName, Object oldValue,
138 Object newValue) { 140 Object newValue) {
139 propertyChangeSupport.firePropertyChange(propertyName, oldValue, 141 propertyChangeSupport.firePropertyChange(propertyName, oldValue,
140 newValue); 142 newValue);
141 } 143 }
142 } 144 }
143 145
144 // The data model class. 146 // The data model class.
145 static class Person extends AbstractModelObject { 147 static class Person extends AbstractModelObject {
146 private String name; 148 private String name;
147 private Set friends = new HashSet(); 149 private Set friends = new HashSet();
148 150
149 public String getName() { 151 public String getName() {
150 return name; 152 return name;
151 } 153 }
152 154
153 public void setName(String name) { 155 public void setName(String name) {
154 firePropertyChange("name", this.name, this.name = name); 156 firePropertyChange("name", this.name, this.name = name);
155 } 157 }
156 158
157 public Set getFriends() { 159 public Set getFriends() {
158 return new HashSet(friends); 160 return new HashSet(friends);
159 } 161 }
160 162
161 public void setFriends(Set friends) { 163 public void setFriends(Set friends) {
162 firePropertyChange("friends", this.friends, 164 firePropertyChange("friends", this.friends,
163 this.friends = new HashSet(friends)); 165 this.friends = new HashSet(friends));
164 } 166 }
165 167
166 public String toString() { 168 public String toString() {
167 return name; 169 return name;
168 } 170 }
169 } 171 }
170 172
171 // The View's model--the root of our Model graph for this particular GUI. 173 // The View's model--the root of our Model graph for this particular GUI.
172 // 174 //
173 // Typically each View class has a corresponding ViewModel class. 175 // Typically each View class has a corresponding ViewModel class.
174 // 176 //
175 // The ViewModel is responsible for getting the objects to edit from the 177 // The ViewModel is responsible for getting the objects to edit from the
176 // data access tier. Since this snippet doesn't have any persistent objects 178 // data access tier. Since this snippet doesn't have any persistent objects
177 // to retrieve, this ViewModel just instantiates a model object to edit. 179 // to retrieve, this ViewModel just instantiates a model object to edit.
178 static class ViewModel extends AbstractModelObject { 180 static class ViewModel extends AbstractModelObject {
179 private List people = new ArrayList(); 181 private List people = new ArrayList();
180 182
181 public List getPeople() { 183 public List getPeople() {
182 return new ArrayList(people); 184 return new ArrayList(people);
183 } 185 }
184 186
185 public void setPeople(List people) { 187 public void setPeople(List people) {
186 firePropertyChange("people", this.people, 188 firePropertyChange("people", this.people,
187 this.people = new ArrayList(people)); 189 this.people = new ArrayList(people));
188 } 190 }
189 } 191 }
190 192
191 // The GUI view 193 // The GUI view
192 static class View { 194 static class View {
193 private ViewModel viewModel; 195 private ViewModel viewModel;
194 196
195 private Shell shell; 197 private Shell shell;
196 198
197 private Button addPersonButton; 199 private Button addPersonButton;
198 private Button removePersonButton; 200 private Button removePersonButton;
199 private TableViewer peopleViewer; 201 private TableViewer peopleViewer;
200 private Text personName; 202 private Text personName;
201 private CheckboxTableViewer friendsViewer; 203 private CheckboxTableViewer friendsViewer;
202 204
203 public View(ViewModel viewModel) { 205 public View(ViewModel viewModel) {
204 this.viewModel = viewModel; 206 this.viewModel = viewModel;
205 } 207 }
206 208
207 public Shell createShell() { 209 public Shell createShell() {
208 // Build a UI 210 // Build a UI
209 final Display display = Display.getCurrent(); 211 final Display display = Display.getCurrent();
210 shell = new Shell(display); 212 shell = new Shell(display);
211 213
212 createUI(shell); 214 createUI(shell);
213 215
214 // Bind UI 216 // Bind UI
215 bindUI(); 217 bindUI();
216 218
217 // Open and return the Shell 219 // Open and return the Shell
218 shell.setSize(shell.computeSize(400, SWT.DEFAULT)); 220 shell.setSize(shell.computeSize(400, SWT.DEFAULT));
219 shell.open(); 221 shell.open();
220 return shell; 222 return shell;
221 } 223 }
222 224
223 private void createUI(Shell shell) { 225 private void createUI(Shell shell) {
224 shell.setText("Binding checked elements in CheckboxTableViewer"); 226 shell.setText("Binding checked elements in CheckboxTableViewer");
225 shell.setLayout(new GridLayout(2, false)); 227 shell.setLayout(new GridLayout(2, false));
226 228
227 new Label(shell, SWT.NONE).setText("People"); 229 new Label(shell, SWT.NONE).setText("People");
228 230
229 Composite buttons = new Composite(shell, SWT.NONE); 231 Composite buttons = new Composite(shell, SWT.NONE);
230 GridDataFactory.swtDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo( 232 GridDataFactory.swtDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo(
231 buttons); 233 buttons);
232 GridLayoutFactory.fillDefaults().numColumns(2).equalWidth(true) 234 GridLayoutFactory.fillDefaults().numColumns(2).equalWidth(true)
233 .applyTo(buttons); 235 .applyTo(buttons);
234 addPersonButton = new Button(buttons, SWT.PUSH); 236 addPersonButton = new Button(buttons, SWT.PUSH);
235 addPersonButton.setText("Add"); 237 addPersonButton.setText("Add");
236 GridDataFactory.fillDefaults().applyTo(addPersonButton); 238 GridDataFactory.fillDefaults().applyTo(addPersonButton);
237 removePersonButton = new Button(buttons, SWT.PUSH); 239 removePersonButton = new Button(buttons, SWT.PUSH);
238 removePersonButton.setText("Remove"); 240 removePersonButton.setText("Remove");
239 GridDataFactory.fillDefaults().applyTo(removePersonButton); 241 GridDataFactory.fillDefaults().applyTo(removePersonButton);
240 242
241 Composite peopleComposite = new Composite(shell, SWT.NONE); 243 Composite peopleComposite = new Composite(shell, SWT.NONE);
242 GridDataFactory.fillDefaults().grab(true, true).span(2, 1).applyTo( 244 GridDataFactory.fillDefaults().grab(true, true).span(2, 1).applyTo(
243 peopleComposite); 245 peopleComposite);
244 TableColumnLayout peopleColumnLayout = new TableColumnLayout(); 246 TableColumnLayout peopleColumnLayout = new TableColumnLayout();
245 peopleComposite.setLayout(peopleColumnLayout); 247 peopleComposite.setLayout(peopleColumnLayout);
246 248
247 peopleViewer = new TableViewer(peopleComposite, SWT.SINGLE 249 peopleViewer = new TableViewer(peopleComposite, SWT.SINGLE
248 | SWT.BORDER | SWT.FULL_SELECTION); 250 | SWT.BORDER | SWT.FULL_SELECTION);
249 251
250 Table peopleTable = peopleViewer.getTable(); 252 Table peopleTable = peopleViewer.getTable();
251 peopleTable.setHeaderVisible(true); 253 peopleTable.setHeaderVisible(true);
252 peopleTable.setLinesVisible(true); 254 peopleTable.setLinesVisible(true);
253 255
254 TableColumn nameColumn = new TableColumn(peopleTable, SWT.NONE); 256 TableColumn nameColumn = new TableColumn(peopleTable, SWT.NONE);
255 nameColumn.setText("Name"); 257 nameColumn.setText("Name");
256 peopleColumnLayout.setColumnData(nameColumn, 258 peopleColumnLayout.setColumnData(nameColumn,
257 new ColumnWeightData(1)); 259 new ColumnWeightData(1));
258 260
259 TableColumn friendsColumn = new TableColumn(peopleTable, SWT.NONE); 261 TableColumn friendsColumn = new TableColumn(peopleTable, SWT.NONE);
260 friendsColumn.setText("Friends"); 262 friendsColumn.setText("Friends");
261 peopleColumnLayout.setColumnData(friendsColumn, 263 peopleColumnLayout.setColumnData(friendsColumn,
262 new ColumnWeightData(3)); 264 new ColumnWeightData(3));
263 265
264 new Label(shell, SWT.NONE).setText("Name"); 266 new Label(shell, SWT.NONE).setText("Name");
265 267
266 personName = new Text(shell, SWT.BORDER); 268 personName = new Text(shell, SWT.BORDER);
267 GridDataFactory.fillDefaults().grab(true, false) 269 GridDataFactory.fillDefaults().grab(true, false)
268 .applyTo(personName); 270 .applyTo(personName);
269 271
270 new Label(shell, SWT.NONE).setText("Friends"); 272 new Label(shell, SWT.NONE).setText("Friends");
271 273
272 Composite friendsComposite = new Composite(shell, SWT.NONE); 274 Composite friendsComposite = new Composite(shell, SWT.NONE);
273 GridDataFactory.fillDefaults().grab(true, true).applyTo( 275 GridDataFactory.fillDefaults().grab(true, true).applyTo(
274 friendsComposite); 276 friendsComposite);
275 TableColumnLayout friendsColumnLayout = new TableColumnLayout(); 277 TableColumnLayout friendsColumnLayout = new TableColumnLayout();
276 friendsComposite.setLayout(friendsColumnLayout); 278 friendsComposite.setLayout(friendsColumnLayout);
277 279
278 friendsViewer = CheckboxTableViewer.newCheckList(friendsComposite, 280 friendsViewer = CheckboxTableViewer.newCheckList(friendsComposite,
279 SWT.SINGLE | SWT.BORDER | SWT.FULL_SELECTION); 281 SWT.SINGLE | SWT.BORDER | SWT.FULL_SELECTION);
280 282
281 Table friendsTable = friendsViewer.getTable(); 283 Table friendsTable = friendsViewer.getTable();
282 friendsTable.setHeaderVisible(true); 284 friendsTable.setHeaderVisible(true);
283 friendsTable.setLinesVisible(true); 285 friendsTable.setLinesVisible(true);
284 TableColumn friendNameColumn = new TableColumn(friendsTable, 286 TableColumn friendNameColumn = new TableColumn(friendsTable,
285 SWT.NONE); 287 SWT.NONE);
286 friendNameColumn.setText("Name"); 288 friendNameColumn.setText("Name");
287 friendsColumnLayout.setColumnData(friendNameColumn, 289 friendsColumnLayout.setColumnData(friendNameColumn,
288 new ColumnWeightData(1)); 290 new ColumnWeightData(1));
289 291
290 GridDataFactory.fillDefaults().grab(true, true).applyTo( 292 GridDataFactory.fillDefaults().grab(true, true).applyTo(
291 friendsViewer.getTable()); 293 friendsViewer.getTable());
292 } 294 }
293 295
294 private void bindUI() { 296 private void bindUI() {
295 DataBindingContext dbc = new DataBindingContext(); 297 DataBindingContext dbc = new DataBindingContext();
296 298
297 final IObservableList people = BeansObservables.observeList(Realm 299 final IObservableList people = BeansObservables.observeList(Realm
298 .getDefault(), viewModel, "people"); 300 .getDefault(), viewModel, "people");
299 301
300 addPersonButton.addListener(SWT.Selection, new Listener() { 302 addPersonButton.addListener(SWT.Selection, new Listener() {
301 public void handleEvent(Event event) { 303 public void handleEvent(Event event) {
302 InputDialog dlg = new InputDialog(shell, "Add Person", 304 InputDialog dlg = new InputDialog(shell, "Add Person",
303 "Enter name:", "<Name>", new IInputValidator() { 305 "Enter name:", "<Name>", new IInputValidator() {
304 public String isValid(String newText) { 306 public String isValid(String newText) {
305 if (newText == null 307 if (newText == null
306 || newText.length() == 0) 308 || newText.length() == 0)
307 return "Name cannot be empty"; 309 return "Name cannot be empty";
308 return null; 310 return null;
309 } 311 }
310 }); 312 });
311 if (dlg.open() == Window.OK) { 313 if (dlg.open() == Window.OK) {
312 Person person = new Person(); 314 Person person = new Person();
313 person.setName(dlg.getValue()); 315 person.setName(dlg.getValue());
314 people.add(person); 316 people.add(person);
315 peopleViewer.setSelection(new StructuredSelection( 317 peopleViewer.setSelection(new StructuredSelection(
316 person)); 318 person));
317 } 319 }
318 } 320 }
319 }); 321 });
320 322
321 removePersonButton.addListener(SWT.Selection, new Listener() { 323 removePersonButton.addListener(SWT.Selection, new Listener() {
322 public void handleEvent(Event event) { 324 public void handleEvent(Event event) {
323 IStructuredSelection selected = (IStructuredSelection) peopleViewer 325 IStructuredSelection selected = (IStructuredSelection) peopleViewer
324 .getSelection(); 326 .getSelection();
325 if (selected.isEmpty()) 327 if (selected.isEmpty())
326 return; 328 return;
327 Person person = (Person) selected.getFirstElement(); 329 Person person = (Person) selected.getFirstElement();
328 if (MessageDialog.openConfirm(shell, "Remove person", 330 if (MessageDialog.openConfirm(shell, "Remove person",
329 "Remove " + person.getName() + "?")) 331 "Remove " + person.getName() + "?"))
330 people.remove(person); 332 people.remove(person);
331 } 333 }
332 }); 334 });
333 335
334 ViewerSupport.bind(peopleViewer, people, BeanProperties.values( 336 ViewerSupport.bind(peopleViewer, people, BeanProperties.values(
335 Person.class, new String[] { "name", "friends" })); 337 Person.class, new String[] { "name", "friends" }));
336 338
337 final IObservableValue selectedPerson = ViewersObservables 339 final IObservableValue selectedPerson = ViewersObservables
338 .observeSingleSelection(peopleViewer); 340 .observeSingleSelection(peopleViewer);
339 341
340 IObservableValue personSelected = new ComputedValue(Boolean.TYPE) { 342 IObservableValue personSelected = new ComputedValue(bool.TYPE) {
341 protected Object calculate() { 343 protected Object calculate() {
342 return Boolean.valueOf(selectedPerson.getValue() != null); 344 return bool.valueOf(selectedPerson.getValue() != null);
343 } 345 }
344 }; 346 };
345 dbc.bindValue(SWTObservables.observeEnabled(removePersonButton), 347 dbc.bindValue(SWTObservables.observeEnabled(removePersonButton),
346 personSelected); 348 personSelected);
347 dbc.bindValue(SWTObservables.observeEnabled(friendsViewer 349 dbc.bindValue(SWTObservables.observeEnabled(friendsViewer
348 .getTable()), personSelected); 350 .getTable()), personSelected);
349 351
350 dbc.bindValue(SWTObservables.observeText(personName, SWT.Modify), 352 dbc.bindValue(SWTObservables.observeText(personName, SWT.Modify),
351 BeansObservables.observeDetailValue(selectedPerson, "name", 353 BeansObservables.observeDetailValue(selectedPerson, "name",
352 String.class)); 354 String.class));
353 355
354 ViewerSupport.bind(friendsViewer, people, BeanProperties.value( 356 ViewerSupport.bind(friendsViewer, people, BeanProperties.value(
355 Person.class, "name")); 357 Person.class, "name"));
356 358
357 dbc.bindSet(ViewersObservables.observeCheckedElements( 359 dbc.bindSet(ViewersObservables.observeCheckedElements(
358 friendsViewer, Person.class), BeansObservables 360 friendsViewer, Person.class), BeansObservables
359 .observeDetailSet(selectedPerson, "friends", Person.class)); 361 .observeDetailSet(selectedPerson, "friends", Person.class));
360 } 362 }
361 } 363 }
362 } 364 }
365 void main( String[] args ){
366 Snippet018CheckboxTableViewerCheckedSelection.main(args);
367 }