package bndtools.launch.ui; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.debug.ui.AbstractLaunchConfigurationTab; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import bndtools.Plugin; public abstract class GenericStackedLaunchTab extends AbstractLaunchConfigurationTab { private ILaunchTabPiece[] stack = null; protected abstract ILaunchTabPiece[] createStack(); private synchronized ILaunchTabPiece[] getStack() { if (stack == null) { stack = createStack(); } return stack; } private final PropertyChangeListener updateListener = new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { checkValid(); updateLaunchConfigurationDialog(); } }; @Override protected boolean isDirty() { for (ILaunchTabPiece piece : getStack()) { if (piece.isDirty()) return true; } return false; } public void createControl(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); setControl(composite); composite.setLayout(new GridLayout(1, false)); for (ILaunchTabPiece piece : getStack()) { Control control = piece.createControl(composite); control.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); piece.addPropertyChangeListener(updateListener); } } void checkValid() { for (ILaunchTabPiece piece : getStack()) { String error = piece.checkForError(); if (error != null) { setErrorMessage(error); return; } } setErrorMessage(null); } public void setDefaults(ILaunchConfigurationWorkingCopy configuration) { for (ILaunchTabPiece piece : getStack()) { piece.setDefaults(configuration); } } public void initializeFrom(ILaunchConfiguration configuration) { try { for (ILaunchTabPiece piece : getStack()) { piece.initializeFrom(configuration); } } catch (CoreException e) { ErrorDialog.openError(getShell(), "Error", null, new Status(IStatus.ERROR, Plugin.PLUGIN_ID, 0, "Error reading launch configuration.", e)); } checkValid(); } public void performApply(ILaunchConfigurationWorkingCopy configuration) { for (ILaunchTabPiece piece : getStack()) { piece.performApply(configuration); } } }