blob: a004f220f735adc818340955873af0fd55095791 [file] [log] [blame]
package org.eclipse.dltk.debug.ui.actions;
import java.util.Arrays;
import java.util.LinkedList;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.dltk.core.IType;
import org.eclipse.dltk.core.ITypeHierarchy;
import org.eclipse.dltk.core.ModelException;
import org.eclipse.dltk.debug.ui.DLTKDebugUIPlugin;
import org.eclipse.dltk.ui.dialogs.TypeSelectionExtension;
import org.eclipse.dltk.ui.util.SWTFactory;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.dialogs.ISelectionStatusValidator;
/**
* Provides a type dialog extension for the JDT type selection dialog
*
* @since 3.4
*/
public class AddExceptionTypeDialogExtension extends TypeSelectionExtension {
/**
* widgets
*/
private Button fCaughtButton;
private Button fUncaughtButton;
private boolean fCaught = false;
private boolean fUncaught = false;
protected Object fExceptionBaseClassName;
/**
* Constructor
*
* @param caught
* @param uncaught
*/
public AddExceptionTypeDialogExtension(String fExceptionBaseClassName,
boolean caught, boolean uncaught) {
fCaught = caught;
fUncaught = uncaught;
}
@Override
public Control createContentArea(Composite parent) {
Composite comp = SWTFactory.createComposite(parent, parent.getFont(), 1,
1, GridData.FILL_HORIZONTAL);
fCaughtButton = SWTFactory.createCheckButton(comp,
Messages.AddExceptionTypeDialogExtension_suspendOnCaught, null,
fCaught, 1);
fCaughtButton.addSelectionListener(new SelectionListener() {
@Override
public void widgetDefaultSelected(SelectionEvent e) {
}
@Override
public void widgetSelected(SelectionEvent e) {
fCaught = fCaughtButton.getSelection();
}
});
fUncaughtButton = SWTFactory.createCheckButton(comp,
Messages.AddExceptionTypeDialogExtension_SuspendOnUncaught,
null, fUncaught, 1);
fUncaughtButton.addSelectionListener(new SelectionListener() {
@Override
public void widgetDefaultSelected(SelectionEvent e) {
}
@Override
public void widgetSelected(SelectionEvent e) {
fUncaught = fUncaughtButton.getSelection();
}
});
return comp;
}
@Override
public ISelectionStatusValidator getSelectionValidator() {
return selection -> {
if (selection.length == 1) {
// if any class can be thrown return OK
if (fExceptionBaseClassName == null) {
return Status.OK_STATUS;
}
// else check that selected class was enherited from exception
// base class
try {
LinkedList<IType> queue = new LinkedList<>();
IType type = (IType) selection[0];
ITypeHierarchy hierarchy = type
.newSupertypeHierarchy(new NullProgressMonitor());
IType curr = type;
while (curr != null) {
if (fExceptionBaseClassName
.equals(curr.getFullyQualifiedName("."))) { //$NON-NLS-1$
return Status.OK_STATUS;
}
IType[] superclasses = hierarchy.getSuperclass(curr);
if (superclasses != null)
queue.addAll(Arrays.asList(superclasses));
if (queue.size() > 0)
curr = queue.removeFirst();
else
curr = null;
}
} catch (ModelException e) {
DLTKDebugUIPlugin.log(e);
return Status.CANCEL_STATUS;
}
}
return new Status(IStatus.ERROR,
DLTKDebugUIPlugin.getUniqueIdentifier(),
Messages.AddExceptionTypeDialogExtension_selectedItemIsNotAnException);
};
}
/**
* Returns if the breakpoint should be set to suspend when the associated
* exception is thrown, but caught
*
* @return if the breakpoint should be set to suspend when the associated
* exception is thrown, but caught
*/
public boolean shouldHandleCaughtExceptions() {
return fCaught;
}
/**
* Returns if the breakpoint should be set to suspend when the associated
* exception is thrown, but not caught
*
* @return if the breakpoint should be set to suspend when the associated
* exception is thrown, but not caught
*/
public boolean shouldHandleUncaughtExceptions() {
return fUncaught;
}
}