package org.bndtools.core.resolve.ui; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.lang.reflect.InvocationTargetException; import org.bndtools.core.resolve.ResolutionResult; import org.bndtools.core.resolve.ResolveOperation; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StackLayout; import org.eclipse.swt.widgets.Composite; import aQute.bnd.build.model.BndEditModel; import bndtools.Plugin; public class ResolutionResultsWizardPage extends WizardPage implements ResolutionResultPresenter { public static final String PROP_RESULT = "result"; private final BndEditModel model; private final PropertyChangeSupport propertySupport = new PropertyChangeSupport(this); private final ResolutionSuccessPanel resolutionSuccessPanel; private final ResolutionFailurePanel resolutionFailurePanel = new ResolutionFailurePanel(); private StackLayout stack; private ResolutionResult result; /** * Create the wizard. */ public ResolutionResultsWizardPage(BndEditModel model) { super("resultsPage"); this.model = model; setTitle("Resolution Results"); setDescription("The required resources will be used to create the Run Bundles list. NOTE: The existing content of Run Bundles will be replaced!"); resolutionSuccessPanel = new ResolutionSuccessPanel(model, this); } /** * Create contents of the wizard. * * @param parent */ @Override public void createControl(Composite parent) { parent.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE)); Composite container = new Composite(parent, SWT.NULL); setControl(container); stack = new StackLayout(); container.setLayout(stack); resolutionSuccessPanel.createControl(container); resolutionFailurePanel.createControl(container); updateUi(); } public ResolutionResult getResult() { return result; } public void setResult(ResolutionResult result) { ResolutionResult oldValue = this.result; this.result = result; propertySupport.firePropertyChange(PROP_RESULT, oldValue, result); if (getControl() != null && !getControl().isDisposed()) updateUi(); } @Override public void recalculate() { try { ResolveOperation resolver = new ResolveOperation(model); getContainer().run(true, true, resolver); setResult(resolver.getResult()); } catch (InvocationTargetException e) { ErrorDialog.openError(getShell(), "Error", null, new Status(IStatus.ERROR, Plugin.PLUGIN_ID, 0, "Unexpected error", e)); setResult(null); } catch (InterruptedException e) { setResult(null); } finally { updateUi(); } } private void updateUi() { resolutionSuccessPanel.setInput(result); resolutionFailurePanel.setInput(result); // String log = (result != null) ? result.getLog() : null; // txtLog.setText(log != null ? log : "<<UNAVAILABLE>>"); boolean resolved = result != null && result.getOutcome().equals(ResolutionResult.Outcome.Resolved); // SWTUtil.recurseEnable(resolved, tbtmResults.getControl()); // SWTUtil.recurseEnable(!resolved, tbtmErrors.getControl()); stack.topControl = resolved ? resolutionSuccessPanel.getControl() : resolutionFailurePanel.getControl(); ((Composite) getControl()).layout(true, true); updateButtons(); String error = result != null && resolved ? null : "Resolution failed!"; setErrorMessage(error); } @Override public void updateButtons() { getContainer().updateButtons(); } @Override public boolean isPageComplete() { return result != null && result.getOutcome().equals(ResolutionResult.Outcome.Resolved) && resolutionSuccessPanel.isComplete(); } public void addPropertyChangeListener(PropertyChangeListener listener) { propertySupport.addPropertyChangeListener(listener); } public void removePropertyChangeListener(PropertyChangeListener listener) { propertySupport.removePropertyChangeListener(listener); } public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { propertySupport.addPropertyChangeListener(propertyName, listener); } public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) { propertySupport.removePropertyChangeListener(propertyName, listener); } @Override public void dispose() { super.dispose(); resolutionFailurePanel.dispose(); resolutionSuccessPanel.dispose(); } }