package bndtools.editor.common; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.LinkedList; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.SectionPart; import org.eclipse.ui.forms.editor.IFormPage; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.osgi.util.promise.Promise; import org.osgi.util.promise.Promises; import org.osgi.util.promise.Success; import aQute.bnd.build.Workspace; import aQute.bnd.build.model.BndEditModel; import bndtools.central.Central; import bndtools.editor.BndEditor; public abstract class BndEditorPart extends SectionPart implements PropertyChangeListener { protected BndEditModel model; private final AtomicBoolean committing = new AtomicBoolean(false); private final List<String> subscribedProps = new LinkedList<String>(); public BndEditorPart(Composite parent, FormToolkit toolkit, int style) { super(parent, toolkit, style); } protected abstract String[] getProperties(); protected abstract void refreshFromModel(); protected abstract void commitToModel(boolean onSave); @Override public void initialize(IManagedForm form) { super.initialize(form); model = (BndEditModel) form.getInput(); for (String prop : getProperties()) { subscribedProps.add(prop); model.addPropertyChangeListener(prop, this); } } @Override public void dispose() { super.dispose(); if (model != null) for (String prop : subscribedProps) { model.removePropertyChangeListener(prop, this); } } @Override public final void refresh() { if (!Central.hasWorkspaceDirectory()) { refreshFromModel(); } else { Central.onWorkspaceInit(new Success<Workspace,Void>() { @Override public Promise<Void> call(Promise<Workspace> resolved) throws Exception { try { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { refreshFromModel(); ScrolledForm form = getManagedForm().getForm(); if (BndEditor.SYNC_MESSAGE.equals(form.getMessage())) { form.setMessage(null, IMessageProvider.NONE); } } }); } catch (Exception e) {} return Promises.resolved(null); } }); } super.refresh(); } @Override public final void commit(boolean onSave) { committing.compareAndSet(false, true); super.commit(onSave); commitToModel(onSave); committing.compareAndSet(true, false); } @Override public void propertyChange(PropertyChangeEvent evt) { if (committing.get()) return; IFormPage page = (IFormPage) getManagedForm().getContainer(); if (page.isActive()) { refresh(); } else { markStale(); } } }