package org.fipro.eclipse.migration.ui.editor; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import org.eclipse.core.databinding.DataBindingContext; import org.eclipse.core.databinding.beans.BeanProperties; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.core.runtime.IProgressMonitor; 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.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.PartInitException; import org.eclipse.ui.part.EditorPart; import org.fipro.eclipse.migration.model.Person; import org.fipro.eclipse.migration.model.Person.Gender; public class PersonEditor extends EditorPart { public static final String ID = "org.fipro.eclipse.migration.ui.editor.personeditor"; Person person; Person activePerson; boolean dirty = false; @Override public void init(IEditorSite site, IEditorInput input) throws PartInitException { if (!(input instanceof PersonEditorInput)) { throw new RuntimeException("Wrong input"); } this.person = ((PersonEditorInput) input).person; this.activePerson = new Person(this.person); setSite(site); setInput(input); setPartName(input.getName()); } @Override 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) { dirty = true; firePropertyChange(IEditorPart.PROP_DIRTY); } }); } @Override public void doSave(IProgressMonitor monitor) { this.person.setFirstName(this.activePerson.getFirstName()); this.person.setLastName(this.activePerson.getLastName()); this.person.setMarried(this.activePerson.isMarried()); this.person.setGender(this.activePerson.getGender()); // TODO update table this.dirty = false; firePropertyChange(IEditorPart.PROP_DIRTY); } @Override public void doSaveAs() { } @Override public boolean isDirty() { return this.dirty; } @Override public boolean isSaveAsAllowed() { return false; } @Override public void setFocus() { } }