package net.refractions.linecleaner.ui;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import net.refractions.linecleaner.cleansing.PauseMonitor;
import net.refractions.udig.project.ILayer;
import net.refractions.udig.ui.operations.IOp;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.wizard.IWizard;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class LineCleaningOp implements IOp {
public void op(final Display display, Object target, IProgressMonitor monitor) throws Exception {
List<ILayer> layers = new ArrayList<ILayer>();
if (target instanceof ILayer) {
layers.add((ILayer) target);
} else if (target instanceof ILayer[]) {
ILayer[] array = (ILayer[]) target;
layers = Arrays.asList(array);
}
final LineCleaningWizard wizard = new LineCleaningWizard(layers);
display.asyncExec(new Runnable() {
public void run() {
WizardDialog dialog = new PauseableWizardDialog(display.getActiveShell(), wizard);
dialog.open();
}
});
}
class PauseableWizardDialog extends WizardDialog {
protected Button pauseButton;
protected IWizard wizard;
public final PauseMonitor pauseMonitor = new PauseMonitor();
public PauseableWizardDialog(Shell parentShell, IWizard newWizard) {
super(parentShell, newWizard);
this.wizard = newWizard;
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
pauseButton = createButton(parent, -1, "Pause", false);
pauseButton.setEnabled(false);
super.createButtonsForButtonBar(parent);
pauseMonitor.attachToPauseButton(pauseButton);
pauseMonitor.attachToCancelComponent(getButton(IDialogConstants.CANCEL_ID));
}
@Override
public void run(boolean fork, boolean cancelable, IRunnableWithProgress runnable) throws InvocationTargetException, InterruptedException {
try {
super.run(fork, cancelable, runnable);
} finally {
pauseMonitor.removeFromCancelComponent(getButton(IDialogConstants.CANCEL_ID));
pauseMonitor.removeFromPauseButton(pauseButton);
}
}
@Override
protected void finishPressed() {
pauseButton.setEnabled(true);
Cursor arrowCursor = new Cursor(getShell().getDisplay(), SWT.CURSOR_ARROW);
pauseButton.setCursor(arrowCursor);
super.finishPressed();
}
}
}