Added
Link Here
|
1 |
/******************************************************************************* |
2 |
* Copyright (c) 2009 Matthew Hall and others. |
3 |
* All rights reserved. This program and the accompanying materials |
4 |
* are made available under the terms of the Eclipse Public License v1.0 |
5 |
* which accompanies this distribution, and is available at |
6 |
* http://www.eclipse.org/legal/epl-v10.html |
7 |
* |
8 |
* Contributors: |
9 |
* Matthew Hall - initial API and implementation (bug 175735) |
10 |
******************************************************************************/ |
11 |
|
12 |
package org.eclipse.jface.examples.databinding.snippets; |
13 |
|
14 |
import java.beans.PropertyChangeListener; |
15 |
import java.beans.PropertyChangeSupport; |
16 |
import java.util.Collection; |
17 |
import java.util.Iterator; |
18 |
|
19 |
import org.eclipse.core.databinding.DataBindingContext; |
20 |
import org.eclipse.core.databinding.beans.BeanProperties; |
21 |
import org.eclipse.core.databinding.observable.Realm; |
22 |
import org.eclipse.core.databinding.observable.list.IObservableList; |
23 |
import org.eclipse.core.databinding.observable.list.WritableList; |
24 |
import org.eclipse.core.databinding.observable.value.DuplexingObservableValue; |
25 |
import org.eclipse.core.databinding.property.Properties; |
26 |
import org.eclipse.jface.databinding.swt.SWTObservables; |
27 |
import org.eclipse.jface.databinding.swt.WidgetProperties; |
28 |
import org.eclipse.jface.databinding.viewers.ObservableListContentProvider; |
29 |
import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider; |
30 |
import org.eclipse.jface.databinding.viewers.ViewerProperties; |
31 |
import org.eclipse.jface.util.Util; |
32 |
import org.eclipse.jface.viewers.TableViewer; |
33 |
import org.eclipse.swt.SWT; |
34 |
import org.eclipse.swt.layout.GridData; |
35 |
import org.eclipse.swt.layout.GridLayout; |
36 |
import org.eclipse.swt.widgets.Display; |
37 |
import org.eclipse.swt.widgets.Label; |
38 |
import org.eclipse.swt.widgets.Shell; |
39 |
import org.eclipse.swt.widgets.Table; |
40 |
import org.eclipse.swt.widgets.TableColumn; |
41 |
import org.eclipse.swt.widgets.Text; |
42 |
|
43 |
/** |
44 |
* @since 3.2 |
45 |
* |
46 |
*/ |
47 |
public class Snippet028DuplexingObservableValue { |
48 |
protected Shell shell; |
49 |
private TableViewer viewer; |
50 |
private Table table; |
51 |
private Text releaseDate; |
52 |
private Text title; |
53 |
private Text director; |
54 |
private Text writer; |
55 |
|
56 |
/** |
57 |
* Launch the application |
58 |
* |
59 |
* @param args |
60 |
*/ |
61 |
public static void main(String[] args) { |
62 |
try { |
63 |
Snippet028DuplexingObservableValue window = new Snippet028DuplexingObservableValue(); |
64 |
window.open(); |
65 |
} catch (Exception e) { |
66 |
e.printStackTrace(); |
67 |
} |
68 |
} |
69 |
|
70 |
/** |
71 |
* Open the window |
72 |
*/ |
73 |
public void open() { |
74 |
final Display display = Display.getDefault(); |
75 |
Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() { |
76 |
public void run() { |
77 |
createContents(); |
78 |
shell.open(); |
79 |
shell.layout(); |
80 |
while (!shell.isDisposed()) { |
81 |
if (!display.readAndDispatch()) |
82 |
display.sleep(); |
83 |
} |
84 |
} |
85 |
}); |
86 |
} |
87 |
|
88 |
protected void createContents() { |
89 |
shell = new Shell(); |
90 |
shell.setSize(509, 375); |
91 |
shell.setText("Snippet028DuplexingObservableValue.java"); |
92 |
final GridLayout gridLayout = new GridLayout(); |
93 |
gridLayout.makeColumnsEqualWidth = true; |
94 |
gridLayout.numColumns = 4; |
95 |
shell.setLayout(gridLayout); |
96 |
|
97 |
viewer = new TableViewer(shell, SWT.FULL_SELECTION | SWT.MULTI |
98 |
| SWT.BORDER); |
99 |
table = viewer.getTable(); |
100 |
table.setLinesVisible(true); |
101 |
table.setHeaderVisible(true); |
102 |
table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 4, 1)); |
103 |
|
104 |
final TableColumn newColumnTableColumn_1 = new TableColumn(table, |
105 |
SWT.NONE); |
106 |
newColumnTableColumn_1.setWidth(120); |
107 |
newColumnTableColumn_1.setText("Movie"); |
108 |
|
109 |
final TableColumn newColumnTableColumn = new TableColumn(table, |
110 |
SWT.NONE); |
111 |
|
112 |
newColumnTableColumn.setWidth(120); |
113 |
newColumnTableColumn.setText("Release Date"); |
114 |
|
115 |
final TableColumn newColumnTableColumn_2 = new TableColumn(table, |
116 |
SWT.NONE); |
117 |
newColumnTableColumn_2.setWidth(120); |
118 |
newColumnTableColumn_2.setText("Director"); |
119 |
|
120 |
final TableColumn newColumnTableColumn_3 = new TableColumn(table, |
121 |
SWT.NONE); |
122 |
newColumnTableColumn_3.setWidth(120); |
123 |
newColumnTableColumn_3.setText("Writer"); |
124 |
|
125 |
final Label movieLabel = new Label(shell, SWT.NONE); |
126 |
movieLabel.setText("Movie"); |
127 |
|
128 |
final Label directorLabel = new Label(shell, SWT.NONE); |
129 |
directorLabel.setLayoutData(new GridData()); |
130 |
directorLabel.setText("Release Date"); |
131 |
|
132 |
final Label producerLabel = new Label(shell, SWT.NONE); |
133 |
producerLabel.setText("Director"); |
134 |
|
135 |
final Label scoreLabel = new Label(shell, SWT.NONE); |
136 |
scoreLabel.setText("Writer"); |
137 |
|
138 |
title = new Text(shell, SWT.BORDER); |
139 |
final GridData gd_title = new GridData(SWT.FILL, SWT.CENTER, true, |
140 |
false); |
141 |
title.setLayoutData(gd_title); |
142 |
|
143 |
releaseDate = new Text(shell, SWT.BORDER); |
144 |
final GridData gd_releaseDate = new GridData(SWT.FILL, SWT.CENTER, |
145 |
true, false); |
146 |
releaseDate.setLayoutData(gd_releaseDate); |
147 |
|
148 |
director = new Text(shell, SWT.BORDER); |
149 |
final GridData gd_director = new GridData(SWT.FILL, SWT.CENTER, true, |
150 |
false); |
151 |
director.setLayoutData(gd_director); |
152 |
|
153 |
writer = new Text(shell, SWT.BORDER); |
154 |
final GridData gd_writer = new GridData(SWT.FILL, SWT.CENTER, true, |
155 |
false); |
156 |
writer.setLayoutData(gd_writer); |
157 |
|
158 |
bindUI(); |
159 |
} |
160 |
|
161 |
// Minimal JavaBeans support |
162 |
public static abstract class AbstractModelObject { |
163 |
private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport( |
164 |
this); |
165 |
|
166 |
public void addPropertyChangeListener(PropertyChangeListener listener) { |
167 |
propertyChangeSupport.addPropertyChangeListener(listener); |
168 |
} |
169 |
|
170 |
public void addPropertyChangeListener(String propertyName, |
171 |
PropertyChangeListener listener) { |
172 |
propertyChangeSupport.addPropertyChangeListener(propertyName, |
173 |
listener); |
174 |
} |
175 |
|
176 |
public void removePropertyChangeListener(PropertyChangeListener listener) { |
177 |
propertyChangeSupport.removePropertyChangeListener(listener); |
178 |
} |
179 |
|
180 |
public void removePropertyChangeListener(String propertyName, |
181 |
PropertyChangeListener listener) { |
182 |
propertyChangeSupport.removePropertyChangeListener(propertyName, |
183 |
listener); |
184 |
} |
185 |
|
186 |
protected void firePropertyChange(String propertyName, Object oldValue, |
187 |
Object newValue) { |
188 |
propertyChangeSupport.firePropertyChange(propertyName, oldValue, |
189 |
newValue); |
190 |
} |
191 |
} |
192 |
|
193 |
public static class MovieInfo extends AbstractModelObject { |
194 |
private String title; |
195 |
private String releaseDate; |
196 |
private String director; |
197 |
private String writer; |
198 |
|
199 |
public MovieInfo(String title, String releaseDate, String director, |
200 |
String writer) { |
201 |
this.title = title; |
202 |
this.releaseDate = releaseDate; |
203 |
this.director = director; |
204 |
this.writer = writer; |
205 |
} |
206 |
|
207 |
public String getTitle() { |
208 |
return title; |
209 |
} |
210 |
|
211 |
public void setTitle(String title) { |
212 |
firePropertyChange("title", this.title, this.title = title); |
213 |
} |
214 |
|
215 |
public String getReleaseDate() { |
216 |
return releaseDate; |
217 |
} |
218 |
|
219 |
public void setReleaseDate(String releaseDate) { |
220 |
firePropertyChange("releaseDate", this.releaseDate, |
221 |
this.releaseDate = releaseDate); |
222 |
} |
223 |
|
224 |
public String getDirector() { |
225 |
return director; |
226 |
} |
227 |
|
228 |
public void setDirector(String director) { |
229 |
firePropertyChange("director", this.director, |
230 |
this.director = director); |
231 |
} |
232 |
|
233 |
public String getWriter() { |
234 |
return writer; |
235 |
} |
236 |
|
237 |
public void setWriter(String writer) { |
238 |
firePropertyChange("writer", this.writer, this.writer = writer); |
239 |
} |
240 |
} |
241 |
|
242 |
private void bindUI() { |
243 |
IObservableList movies = new WritableList(); |
244 |
movies.add(new MovieInfo("Cloverfield", "January 18, 2008", |
245 |
"Matt Reeves", "Drew Goddard")); |
246 |
movies.add(new MovieInfo("Iron Man", "May 2, 2008", "Jon Favreau", |
247 |
"Mark Fergus")); |
248 |
movies.add(new MovieInfo( |
249 |
"Indiana Jones and the Kingdom of the Crystal Skull", |
250 |
"May 22, 2008", "Steven Spielberg", "Drunken Lemurs")); |
251 |
movies.add(new MovieInfo("Get Smart", "June 20, 2008", "Peter Segal", |
252 |
"Tom J. Astle")); |
253 |
movies.add(new MovieInfo("Wanted", "June 27, 2008", |
254 |
"Timur Bekmambetov", "Michael Brandt")); |
255 |
movies.add(new MovieInfo("Wall-E", "June 27, 2008", "Andrew Stanton", |
256 |
"Andrew Stanton")); |
257 |
movies.add(new MovieInfo("The Dark Knight", "July 18, 2008", |
258 |
"Christopher Nolan", "David S. Goyer")); |
259 |
movies.add(new MovieInfo("007: Quantum of Solace", "October 31, 2008", |
260 |
"Marc Forster", "Robert Wade")); |
261 |
movies.add(new MovieInfo("Valkyrie", "December 25, 2008", |
262 |
"Bryan Singer", "Christopher McQuarrie")); |
263 |
|
264 |
ObservableListContentProvider cp = new ObservableListContentProvider(); |
265 |
viewer.setContentProvider(cp); |
266 |
viewer.setLabelProvider(new ObservableMapLabelProvider(Properties |
267 |
.observeEach(cp.getKnownElements(), BeanProperties |
268 |
.values(new String[] { "title", "releaseDate", |
269 |
"director", "writer" })))); |
270 |
viewer.setInput(movies); |
271 |
|
272 |
DataBindingContext dbc = new DataBindingContext(); |
273 |
|
274 |
IObservableList selections = ViewerProperties.multipleSelection() |
275 |
.observe(viewer); |
276 |
dbc.bindValue(WidgetProperties.text(SWT.Modify).observe(title), |
277 |
new StringDuplexingObservableValue(BeanProperties |
278 |
.value("title").observeDetail(selections))); |
279 |
dbc.bindValue(WidgetProperties.text(SWT.Modify).observe(releaseDate), |
280 |
new StringDuplexingObservableValue(BeanProperties.value( |
281 |
"releaseDate").observeDetail(selections))); |
282 |
dbc.bindValue(WidgetProperties.text(SWT.Modify).observe(director), |
283 |
new StringDuplexingObservableValue(BeanProperties.value( |
284 |
"director").observeDetail(selections))); |
285 |
dbc.bindValue(WidgetProperties.text(SWT.Modify).observe(writer), |
286 |
new StringDuplexingObservableValue(BeanProperties.value( |
287 |
"writer").observeDetail(selections))); |
288 |
} |
289 |
|
290 |
private static class StringDuplexingObservableValue extends |
291 |
DuplexingObservableValue { |
292 |
|
293 |
public StringDuplexingObservableValue(IObservableList target) { |
294 |
super(target); |
295 |
} |
296 |
|
297 |
protected Object coalesceElements(Collection elements) { |
298 |
Iterator it = elements.iterator(); |
299 |
if (!it.hasNext()) |
300 |
return ""; |
301 |
Object first = it.next(); |
302 |
while (it.hasNext()) { |
303 |
if (!Util.equals(first, it.next())) |
304 |
return "<Multiple values>"; |
305 |
} |
306 |
return first; |
307 |
} |
308 |
} |
309 |
} |