Skip to content

Commit b18e1a2

Browse files
committed
[Databinding-Example] Added IConverter Example
Change-Id: I347a791729c868927095857051c2c6a55cbb90c2 Signed-off-by: Simon Scholz <[email protected]>
1 parent e957c64 commit b18e1a2

4 files changed

Lines changed: 101 additions & 32 deletions

File tree

de.vogella.databinding.example/src/de/vogella/databinding/example/View.java

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package de.vogella.databinding.example;
22

3+
import java.util.Arrays;
4+
35
import org.eclipse.core.databinding.AggregateValidationStatus;
46
import org.eclipse.core.databinding.Binding;
57
import org.eclipse.core.databinding.DataBindingContext;
@@ -10,6 +12,7 @@
1012
import org.eclipse.core.databinding.validation.ValidationStatus;
1113
import org.eclipse.core.runtime.IStatus;
1214
import org.eclipse.jface.databinding.fieldassist.ControlDecorationSupport;
15+
import org.eclipse.jface.databinding.swt.ISWTObservableValue;
1316
import org.eclipse.jface.databinding.swt.WidgetProperties;
1417
import org.eclipse.swt.SWT;
1518
import org.eclipse.swt.events.SelectionAdapter;
@@ -23,6 +26,8 @@
2326
import org.eclipse.swt.widgets.Text;
2427
import org.eclipse.ui.part.ViewPart;
2528

29+
import de.vogella.databinding.example.converter.CommaSeparatedStringToStringArrayConverter;
30+
import de.vogella.databinding.example.converter.StringArrayToCommaSeparatedStringConverter;
2631
import de.vogella.databinding.example.model.Address;
2732
import de.vogella.databinding.example.model.Person;
2833
import de.vogella.databinding.example.validators.StringLongerThenTwo;
@@ -37,6 +42,7 @@ public class View extends ViewPart {
3742
private Combo genderCombo;
3843
private Text countryText;
3944
private Label errorLabel;
45+
private Text programmingSkillsText;
4046

4147
@Override
4248
public void createPartControl(Composite parent) {
@@ -78,6 +84,14 @@ public void createPartControl(Composite parent) {
7884
Label countryLabel = new Label(parent, SWT.NONE);
7985
countryLabel.setText("Country");
8086
countryText = new Text(parent, SWT.BORDER);
87+
88+
Label programmingSkillsLabel = new Label(parent, SWT.NONE);
89+
programmingSkillsLabel.setText("Programming Skills");
90+
programmingSkillsText = new Text(parent, SWT.BORDER);
91+
gridData = new GridData();
92+
gridData.horizontalAlignment = SWT.FILL;
93+
gridData.grabExcessHorizontalSpace = true;
94+
programmingSkillsText.setLayoutData(gridData);
8195

8296
Button button1 = new Button(parent, SWT.PUSH);
8397
button1.setText("Write model");
@@ -89,8 +103,8 @@ public void widgetSelected(SelectionEvent e) {
89103
System.out.println("Age " + person.getAge());
90104
System.out.println("Married: " + person.isMarried());
91105
System.out.println("Gender: " + person.getGender());
92-
System.out.println("Country: "
93-
+ person.getAddress().getCountry());
106+
System.out.println("Country: " + person.getAddress().getCountry());
107+
System.out.println("Programming Skills: " + Arrays.toString(person.getProgrammingSkills()));
94108
}
95109
});
96110

@@ -139,6 +153,7 @@ private Person createPerson() {
139153
person.setGender("Male");
140154
person.setAge(12);
141155
person.setMarried(true);
156+
person.setProgrammingSkills(new String[] { "Java", "JavaScript", "Groovy" });
142157
return person;
143158
}
144159

@@ -150,10 +165,8 @@ private void bindValues() {
150165
// The DataBindingContext object will manage the databindings
151166
// Lets bind it
152167
DataBindingContext ctx = new DataBindingContext();
153-
IObservableValue widgetValue = WidgetProperties.text(SWT.Modify)
154-
.observe(firstName);
155-
IObservableValue modelValue = BeanProperties.value(Person.class,
156-
"firstName").observe(person);
168+
IObservableValue widgetValue = WidgetProperties.text(SWT.Modify).observe(firstName);
169+
IObservableValue modelValue = BeanProperties.value(Person.class, "firstName").observe(person);
157170
// Here we define the UpdateValueStrategy
158171
UpdateValueStrategy update = new UpdateValueStrategy();
159172
update.setAfterConvertValidator(new StringLongerThenTwo());
@@ -179,14 +192,12 @@ public IStatus validate(Object value) {
179192
UpdateValueStrategy strategy = new UpdateValueStrategy();
180193
strategy.setBeforeSetValidator(validator);
181194

182-
Binding bindValue = ctx.bindValue(widgetValue, modelValue, strategy,
183-
null);
195+
Binding bindValue = ctx.bindValue(widgetValue, modelValue, strategy, null);
184196
// Add some decorations
185197
ControlDecorationSupport.create(bindValue, SWT.TOP | SWT.LEFT);
186198

187199
widgetValue = WidgetProperties.selection().observe(marriedButton);
188-
modelValue = BeanProperties.value(Person.class, "married").observe(
189-
person);
200+
modelValue = BeanProperties.value(Person.class, "married").observe(person);
190201
ctx.bindValue(widgetValue, modelValue);
191202

192203
widgetValue = WidgetProperties.selection().observe(genderCombo);
@@ -197,19 +208,27 @@ public IStatus validate(Object value) {
197208
// Address field is bound to the Ui
198209
widgetValue = WidgetProperties.text(SWT.Modify).observe(countryText);
199210

200-
modelValue = BeanProperties.value(Person.class, "address.country")
201-
.observe(person);
211+
modelValue = BeanProperties.value(Person.class, "address.country").observe(person);
202212
ctx.bindValue(widgetValue, modelValue);
203213

214+
UpdateValueStrategy programmingSkillsTargetStrategy = new UpdateValueStrategy();
215+
programmingSkillsTargetStrategy.setConverter(new CommaSeparatedStringToStringArrayConverter());
216+
UpdateValueStrategy programmingSkillsModelStrategy = new UpdateValueStrategy();
217+
programmingSkillsModelStrategy.setConverter(new StringArrayToCommaSeparatedStringConverter());
218+
219+
ISWTObservableValue programmingSkillsTarget = WidgetProperties.text(SWT.Modify).observe(programmingSkillsText);
220+
IObservableValue programmingSkillsModel = BeanProperties.value("programmingSkills").observe(person);
221+
222+
ctx.bindValue(programmingSkillsTarget, programmingSkillsModel, programmingSkillsTargetStrategy,
223+
programmingSkillsModelStrategy);
224+
204225
// We listen to all errors via this binding
205226
// We don't need to listen to any SWT event on this label as it never
206227
// changes independently
207-
final IObservableValue errorObservable = WidgetProperties.text()
208-
.observe(errorLabel);
228+
final IObservableValue errorObservable = WidgetProperties.text().observe(errorLabel);
209229
// This one listenes to all changes
210230
ctx.bindValue(errorObservable,
211-
new AggregateValidationStatus(ctx.getBindings(),
212-
AggregateValidationStatus.MAX_SEVERITY), null, null);
231+
new AggregateValidationStatus(ctx.getBindings(), AggregateValidationStatus.MAX_SEVERITY), null, null);
213232

214233
}
215234
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package de.vogella.databinding.example.converter;
2+
3+
import org.eclipse.core.databinding.conversion.Converter;
4+
5+
public class CommaSeparatedStringToStringArrayConverter extends Converter {
6+
7+
public CommaSeparatedStringToStringArrayConverter() {
8+
super(String.class, String[].class);
9+
}
10+
11+
@Override
12+
public Object convert(Object fromObject) {
13+
if(fromObject instanceof String){
14+
return ((String) fromObject).split(";");
15+
}
16+
return null;
17+
}
18+
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package de.vogella.databinding.example.converter;
2+
3+
import org.eclipse.core.databinding.conversion.Converter;
4+
5+
public class StringArrayToCommaSeparatedStringConverter extends Converter {
6+
7+
public StringArrayToCommaSeparatedStringConverter() {
8+
super(String[].class, String.class);
9+
}
10+
11+
@Override
12+
public Object convert(Object fromObject) {
13+
if(fromObject instanceof String[]) {
14+
String[] stringArray = (String[]) fromObject;
15+
StringBuilder sb = new StringBuilder();
16+
int length = stringArray.length;
17+
for (int i = 0; i < length; i++) {
18+
String string = stringArray[i];
19+
sb.append(string);
20+
if(i + 1 < length) {
21+
sb.append(",");
22+
}
23+
}
24+
return sb.toString();
25+
}
26+
return null;
27+
}
28+
}

de.vogella.databinding.example/src/de/vogella/databinding/example/model/Person.java

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@ public class Person implements PropertyChangeListener {
1111
private String gender;
1212
private Integer age;
1313
private Address address;
14-
private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(
15-
this);
14+
private String[] programmingSkills;
15+
16+
private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
1617

1718
public Person() {
1819
}
1920

20-
public void addPropertyChangeListener(String propertyName,
21-
PropertyChangeListener listener) {
21+
public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
2222
propertyChangeSupport.addPropertyChangeListener(propertyName, listener);
2323
}
2424

@@ -43,32 +43,27 @@ public boolean isMarried() {
4343
}
4444

4545
public void setFirstName(String firstName) {
46-
propertyChangeSupport.firePropertyChange("firstName", this.firstName,
47-
this.firstName = firstName);
46+
propertyChangeSupport.firePropertyChange("firstName", this.firstName, this.firstName = firstName);
4847
}
4948

5049
public void setGender(String gender) {
51-
propertyChangeSupport.firePropertyChange("gender", this.gender,
52-
this.gender = gender);
50+
propertyChangeSupport.firePropertyChange("gender", this.gender, this.gender = gender);
5351
}
5452

5553
public void setLastName(String lastName) {
56-
propertyChangeSupport.firePropertyChange("lastName", this.lastName,
57-
this.lastName = lastName);
54+
propertyChangeSupport.firePropertyChange("lastName", this.lastName, this.lastName = lastName);
5855
}
5956

6057
public void setMarried(boolean isMarried) {
61-
propertyChangeSupport.firePropertyChange("married", this.married,
62-
this.married = isMarried);
58+
propertyChangeSupport.firePropertyChange("married", this.married, this.married = isMarried);
6359
}
6460

6561
public Integer getAge() {
6662
return age;
6763
}
6864

6965
public void setAge(Integer age) {
70-
propertyChangeSupport.firePropertyChange("age", this.age,
71-
this.age = age);
66+
propertyChangeSupport.firePropertyChange("age", this.age, this.age = age);
7267
}
7368

7469
public Address getAddress() {
@@ -77,8 +72,16 @@ public Address getAddress() {
7772

7873
public void setAddress(Address address) {
7974
address.addPropertyChangeListener("country", this);
80-
propertyChangeSupport.firePropertyChange("address", this.address,
81-
this.address = address);
75+
propertyChangeSupport.firePropertyChange("address", this.address, this.address = address);
76+
}
77+
78+
public String[] getProgrammingSkills() {
79+
return programmingSkills;
80+
}
81+
82+
public void setProgrammingSkills(String[] programmingSkills) {
83+
propertyChangeSupport.firePropertyChange("programmingSkills", this.programmingSkills,
84+
this.programmingSkills = programmingSkills);
8285
}
8386

8487
@Override

0 commit comments

Comments
 (0)