package com.example.e4.rcp.todo.parts; import javax.annotation.PostConstruct; import javax.inject.Inject; import org.eclipse.core.commands.ParameterizedCommand; import org.eclipse.core.databinding.Binding; import org.eclipse.core.databinding.DataBindingContext; import org.eclipse.core.databinding.beans.BeanProperties; import org.eclipse.core.databinding.observable.ChangeEvent; import org.eclipse.core.databinding.observable.IChangeListener; import org.eclipse.core.databinding.observable.list.IObservableList; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.e4.core.commands.ECommandService; import org.eclipse.e4.core.commands.EHandlerService; import org.eclipse.e4.core.di.annotations.Optional; import org.eclipse.e4.ui.di.Focus; import org.eclipse.e4.ui.di.Persist; import org.eclipse.e4.ui.di.UIEventTopic; 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.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.DateTime; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import com.example.e4.rcp.todo.events.MyEventConstants; import com.example.e4.rcp.todo.model.ITodoService; import com.example.e4.rcp.todo.model.Todo; public class EditorPart { @Inject MDirtyable dirty; @Inject ECommandService commandService; @Inject EHandlerService handlerService; @Inject MPart part; private Text txtSummary; private Text txtDescription; private Button btnDone; private DateTime dateTime; private DataBindingContext ctx = new DataBindingContext(); // define listener for the data binding IChangeListener listener = new IChangeListener() { @Override public void handleChange(ChangeEvent event) { if (dirty!=null){ dirty.setDirty(true); } } }; private Todo todo; @PostConstruct public void createControls(Composite parent, ITodoService todoService) { // extract the id of the todo item String string = part.getPersistedState().get(Todo.FIELD_ID); Long idOfTodo = Long.valueOf(string); // retrieve the todo based on the persistedState todo = todoService.getTodo(idOfTodo); GridLayout gl_parent = new GridLayout(2, false); gl_parent.marginRight = 10; gl_parent.marginLeft = 10; gl_parent.horizontalSpacing = 10; gl_parent.marginWidth = 0; parent.setLayout(gl_parent); Label lblSummary = new Label(parent, SWT.NONE); lblSummary.setText("Summary"); txtSummary = new Text(parent, SWT.BORDER); txtSummary.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); Label lblDescription = new Label(parent, SWT.NONE); lblDescription.setText("Description"); txtDescription = new Text(parent, SWT.BORDER | SWT.MULTI); GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, false); gd.heightHint = 122; txtDescription.setLayoutData(gd); Label lblNewLabel = new Label(parent, SWT.NONE); lblNewLabel.setText("Due Date"); dateTime = new DateTime(parent, SWT.BORDER); dateTime.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); new Label(parent, SWT.NONE); btnDone = new Button(parent, SWT.CHECK); btnDone.setText("Done"); Button button = new Button(parent, SWT.PUSH); button.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false)); button.setText("Save"); button.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { ParameterizedCommand command = commandService.createCommand("org.eclipse.ui.file.saveAll", null); handlerService.executeHandler(command); } }); updateUserInterface(todo); } @Persist public void save(ITodoService model) { model.saveTodo(todo); dirty.setDirty(false); } private void updateUserInterface(Todo todo) { // check if the user interface is available // assume you have a field called "summary" // for a widget if (txtSummary != null && !txtSummary.isDisposed()) { // Deregister change listener to the old binding IObservableList providers = ctx.getValidationStatusProviders(); for (Object o : providers) { Binding b = (Binding) o; b.getTarget().removeChangeListener(listener); } // Remove bindings ctx.dispose(); IObservableValue target = WidgetProperties.text(SWT.Modify) .observe(txtSummary); IObservableValue model = BeanProperties.value(Todo.FIELD_SUMMARY).observe( todo); ctx.bindValue(target, model); target = WidgetProperties.selection().observe(btnDone); model = BeanProperties.value(Todo.FIELD_DONE).observe(todo); ctx.bindValue(target, model); target = WidgetProperties.selection().observe(btnDone); model = BeanProperties.value(Todo.FIELD_DONE).observe(todo); ctx.bindValue(target, model); IObservableValue observeSelectionDateTimeObserveWidget = WidgetProperties .selection().observe(dateTime); IObservableValue dueDateTodoObserveValue = BeanProperties.value( Todo.FIELD_DUEDATE).observe(todo); ctx.bindValue(observeSelectionDateTimeObserveWidget, dueDateTodoObserveValue); // register listener for any changes providers = ctx.getValidationStatusProviders(); for (Object o : providers) { Binding b = (Binding) o; b.getTarget().addChangeListener(listener); } // Register for the changes providers = ctx.getValidationStatusProviders(); for (Object o : providers) { Binding b = (Binding) o; b.getTarget().addChangeListener(listener); } } } @Focus public void onFocus() { // the following assumes that you have a Text field // called summary txtSummary.setFocus(); } @Inject @Optional private void getNotified( @UIEventTopic(MyEventConstants.TOPIC_TODO_DELETE) Todo todo) { if (this.todo.equals(todo)){ part.setToBeRendered(false); } } }