package org.erlide.ui.navigator.dnd;
import java.util.List;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.ISafeRunnable;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.SafeRunner;
import org.eclipse.core.runtime.Status;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.TransferData;
import org.eclipse.ui.navigator.CommonDropAdapter;
import org.eclipse.ui.navigator.CommonDropAdapterAssistant;
import org.erlide.util.ErlLogger;
import org.erlide.util.services.ExtensionUtils;
public class ErlCommonDropAdapterAssistant extends CommonDropAdapterAssistant {
final static String EXTENSION_POINT_ID = "org.erlide.ui.erlDndAdapter";
protected IStatus status;
void setStatus(final IStatus status) {
this.status = status;
}
public ErlCommonDropAdapterAssistant() {
}
@Override
public IStatus handleDrop(final CommonDropAdapter dropAdapter,
final DropTargetEvent dropTargetEvent, final Object target) {
status = Status.CANCEL_STATUS;
try {
final List<INavigatorDropHandler> handlers = ExtensionUtils
.getExtensions(EXTENSION_POINT_ID, INavigatorDropHandler.class);
for (final INavigatorDropHandler handler : handlers) {
final ISafeRunnable runnable = new ISafeRunnable() {
@Override
public void handleException(final Throwable exception) {
ErlLogger.error(exception);
}
@Override
public void run() throws Exception {
final IStatus theStatus = handler.handleDrop(dropAdapter,
dropTargetEvent, target);
setStatus(theStatus);
}
};
SafeRunner.run(runnable);
}
} catch (final Exception ex) {
ErlLogger.warn(ex);
}
return status;
}
@Override
public IStatus validateDrop(final Object target, final int operation,
final TransferData transferType) {
status = Status.CANCEL_STATUS;
try {
final IConfigurationElement[] config = Platform.getExtensionRegistry()
.getConfigurationElementsFor(EXTENSION_POINT_ID);
for (final IConfigurationElement e : config) {
final Object o = e.createExecutableExtension("class");
if (o instanceof INavigatorDropHandler) {
final ISafeRunnable runnable = new ISafeRunnable() {
@Override
public void handleException(final Throwable exception) {
ErlLogger.error("Exception in client");
}
@Override
public void run() throws Exception {
final IStatus theStatus = ((INavigatorDropHandler) o)
.validateDrop(target, operation, transferType);
setStatus(theStatus);
}
};
SafeRunner.run(runnable);
}
}
} catch (final Exception ex) {
ErlLogger.error(ex);
}
return status;
}
}