package org.objectstyle.wolips.componenteditor.actions;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.search.SearchPattern;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.operation.IRunnableContext;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.dialogs.ElementListSelectionDialog;
import org.objectstyle.wolips.bindings.utils.BindingReflectionUtils;
import org.objectstyle.wolips.componenteditor.ComponenteditorPlugin;
import org.objectstyle.wolips.core.resources.types.TypeNameCollector;
public class WOElementSelectionDialog extends ElementListSelectionDialog {
private IJavaProject _javaProject;
private Point _location;
private Point _size;
private IRunnableContext _context;
public WOElementSelectionDialog(Shell parent, IJavaProject javaProject, IRunnableContext context) {
super(parent, new ComponentLabelProvider());
_javaProject = javaProject;
_context = context;
setIgnoreCase(true);
setMultipleSelection(false);
setAllowDuplicates(false);
}
public int open() {
try {
final TypeNameCollector typeNameCollector = new TypeNameCollector(_javaProject, false);
IRunnableWithProgress runnable = new IRunnableWithProgress() {
public void run(final IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
try {
BindingReflectionUtils.findMatchingElementClassNames("", SearchPattern.R_PREFIX_MATCH, typeNameCollector, monitor);
} catch (Exception e) {
e.printStackTrace();
throw new InvocationTargetException(e);
}
if (monitor.isCanceled()) {
throw new InterruptedException();
}
}
};
_context.run(true, true, runnable);
if (typeNameCollector.isEmpty()) {
String title = "None";
String message = "None";
MessageDialog.openInformation(getShell(), title, message);
return CANCEL;
}
setElements(typeNameCollector.getTypeNames().toArray());
} catch (Exception e) {
return CANCEL;
}
return super.open();
}
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
// PlatformUI.getWorkbench().getHelpSystem().setHelp(newShell,
// IJavaHelpContextIds.OPEN_PACKAGE_DIALOG);
}
public boolean close() {
return super.close();
}
protected Control createContents(Composite parent) {
Control control = super.createContents(parent);
return control;
}
protected Point getInitialSize() {
Point result = super.getInitialSize();
if (_size != null) {
result.x = Math.max(result.x, _size.x);
result.y = Math.max(result.y, _size.y);
Rectangle display = getShell().getDisplay().getClientArea();
result.x = Math.min(result.x, display.width);
result.y = Math.min(result.y, display.height);
}
return result;
}
protected Point getInitialLocation(Point initialSize) {
Point result = super.getInitialLocation(initialSize);
if (_location != null) {
result.x = _location.x;
result.y = _location.y;
Rectangle display = getShell().getDisplay().getClientArea();
int xe = result.x + initialSize.x;
if (xe > display.width) {
result.x -= xe - display.width;
}
int ye = result.y + initialSize.y;
if (ye > display.height) {
result.y -= ye - display.height;
}
}
return result;
}
public static class ComponentLabelProvider implements ILabelProvider {
private static Image _componentImage;
public ComponentLabelProvider() {
_componentImage = ComponenteditorPlugin.getImageDescriptor("icons/ComponentEditor.png").createImage();
}
public Image getImage(Object element) {
return _componentImage;
}
public String getText(Object element) {
String str = (String) element;
int dotIndex = str.lastIndexOf('.');
if (dotIndex != -1) {
str = str.substring(dotIndex + 1);
}
return str;
}
public void addListener(ILabelProviderListener listener) {
// DO NOTHING
}
public void dispose() {
_componentImage.dispose();
}
public boolean isLabelProperty(Object element, String property) {
return false;
}
public void removeListener(ILabelProviderListener listener) {
// DO NOTHING
}
}
}