package org.fipro.eclipse.migration.e4.ui.editor;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.beans.BeanProperties;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.e4.ui.di.Persist;
import org.eclipse.e4.ui.model.application.ui.MDirtyable;
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.jface.databinding.viewers.ViewersObservables;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.LabelProvider;
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.Label;
import org.eclipse.swt.widgets.Text;
import org.fipro.eclipse.migration.e4.model.Person;
import org.fipro.eclipse.migration.e4.model.Person.Gender;
public class PersonEditor {
public static final String ID = "org.fipro.eclipse.migration.ui.editor.personeditor";
public static final String CONTRIBUTION_URI = "bundleclass://org.fipro.eclipse.migration.e4.ui/org.fipro.eclipse.migration.e4.ui.editor.PersonEditor";
public static final String PERSON_INPUT_DATA = "personInputData";
@Inject
private MDirtyable dirtyable;
private Person person;
private Person activePerson;
@Inject
public void init(MPart part) {
Map<String, Object> transientData = part.getTransientData();
// note that we are using transient data here, because the editor is not
// persisted anyway.
// In order to persist the editor between sessions using
// part.getPersistedState(); is necessary
if (!(transientData.get(PERSON_INPUT_DATA) instanceof Person)) {
throw new RuntimeException("You forgot to pass the actual person as transient data input");
}
this.person = (Person) part.getTransientData().get(PERSON_INPUT_DATA);
this.activePerson = new Person(this.person);
}
@PostConstruct
public void createPartControl(Composite parent) {
parent.setLayout(new GridLayout(2, false));
Label firstNameLabel = new Label(parent, SWT.NONE);
firstNameLabel.setText("Firstname:");
GridDataFactory.defaultsFor(firstNameLabel).applyTo(firstNameLabel);
Text firstNameField = new Text(parent, SWT.BORDER);
GridDataFactory.fillDefaults().grab(true, false).applyTo(firstNameField);
Label lastNameLabel = new Label(parent, SWT.NONE);
lastNameLabel.setText("Lastname:");
GridDataFactory.defaultsFor(lastNameLabel).applyTo(lastNameLabel);
Text lastNameField = new Text(parent, SWT.BORDER);
GridDataFactory.fillDefaults().grab(true, false).applyTo(lastNameField);
Label marriedLabel = new Label(parent, SWT.NONE);
marriedLabel.setText("Married:");
GridDataFactory.defaultsFor(marriedLabel).applyTo(marriedLabel);
Button marriedButton = new Button(parent, SWT.CHECK);
Label genderLabel = new Label(parent, SWT.NONE);
genderLabel.setText("Gender:");
GridDataFactory.defaultsFor(marriedLabel).applyTo(genderLabel);
ComboViewer genderCombo = new ComboViewer(parent);
genderCombo.setContentProvider(ArrayContentProvider.getInstance());
genderCombo.setLabelProvider(new LabelProvider() {
@Override
public String getText(Object element) {
return super.getText(element);
}
});
genderCombo.setInput(Gender.values());
GridDataFactory.fillDefaults().grab(true, false).applyTo(genderCombo.getControl());
// add bindings
DataBindingContext ctx = new DataBindingContext();
IObservableValue fnTarget = WidgetProperties.text(SWT.Modify).observe(firstNameField);
IObservableValue lnTarget = WidgetProperties.text(SWT.Modify).observe(lastNameField);
IObservableValue mTarget = WidgetProperties.selection().observe(marriedButton);
IObservableValue gTarget = ViewersObservables.observeSingleSelection(genderCombo);
IObservableValue fnModel = BeanProperties.value(Person.class, "firstName").observe(activePerson);
IObservableValue lnModel = BeanProperties.value(Person.class, "lastName").observe(activePerson);
IObservableValue mModel = BeanProperties.value(Person.class, "married").observe(activePerson);
IObservableValue gModel = BeanProperties.value(Person.class, "gender").observe(activePerson);
ctx.bindValue(fnTarget, fnModel);
ctx.bindValue(lnTarget, lnModel);
ctx.bindValue(mTarget, mModel);
ctx.bindValue(gTarget, gModel);
this.activePerson.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
dirtyable.setDirty(true);
}
});
}
@Persist
public void save() {
this.person.setFirstName(this.activePerson.getFirstName());
this.person.setLastName(this.activePerson.getLastName());
this.person.setMarried(this.activePerson.isMarried());
this.person.setGender(this.activePerson.getGender());
dirtyable.setDirty(false);
}
}