package gw.plugin.ij.util;
import com.intellij.openapi.application.Application;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ModalityState;
import com.intellij.openapi.util.Computable;
import org.jetbrains.annotations.NotNull;
public class ExecutionUtil {
public static final int WRITE = 1;
public static final int DISPATCH = 2;
public static final int BLOCKING = 4;
public static <R> R execute(@NotNull SafeCallable<R> operation) {
return execute(0, operation);
}
public static void execute(@NotNull SafeRunnable operation) {
execute(0, operation);
}
public static void execute(int options, @NotNull SafeRunnable operation) {
Runnable task = wrap(operation, options);
if (isDispatch(options)) {
Application app = ApplicationManager.getApplication();
if (isBlocking(options)) {
app.invokeAndWait(task, ModalityState.defaultModalityState());
} else {
app.invokeLater(task);
}
} else {
task.run();
}
}
public static <R> R execute(int options, @NotNull SafeCallable<R> operation) {
Runnable task = wrap(operation, options);
if (isDispatch(options)) {
Application app = ApplicationManager.getApplication();
if (app.isDispatchThread()) {
task.run();
} else if (isBlocking(options)) {
app.invokeAndWait(task, ModalityState.defaultModalityState());
} else {
app.invokeLater(task);
}
} else {
task.run();
}
return operation.getResult();
}
private static Runnable wrap(final SafeRunnable operation, int options) {
if (isWrite(options)) {
return new Runnable() {
public void run() {
ApplicationManager.getApplication().runWriteAction(operation);
}
};
} else {
return operation;
}
}
private static Runnable wrap(final SafeCallable operation, int options) {
if (isWrite(options)) {
return new Runnable() {
public void run() {
ApplicationManager.getApplication().runWriteAction((Computable)operation);
}
};
} else {
return operation;
}
}
private static boolean isWrite(int options) {
return (options & WRITE) > 0;
}
private static boolean isDispatch(int options) {
return (options & DISPATCH) > 0;
}
private static boolean isBlocking(int options) {
return (options & BLOCKING) > 0;
}
}