blob: 2e0a9a97db3692bc5a83c362489bec7fd60d901b [file] [log] [blame]
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.openapi.vcs.impl;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.progress.Task;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.ThrowableComputable;
import com.intellij.openapi.vcs.ProjectLevelVcsManager;
import com.intellij.openapi.vcs.VcsException;
import com.intellij.openapi.vcs.changes.BackgroundFromStartOption;
import com.intellij.util.Consumer;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class VcsBackgroundableComputable<T> extends Task.Backgroundable {
private final String myErrorTitle;
private boolean mySilent;
private final Project myProject;
private final BackgroundableActionEnabledHandler myHandler;
private final Object myActionParameter;
private final ThrowableComputable<T, VcsException> myBackgroundable;
private final Consumer<T> myAwtSuccessContinuation;
private final Runnable myAwtErrorContinuation;
private VcsException myException;
private T myResult;
private VcsBackgroundableComputable(final Project project, final String title,
final String errorTitle,
final ThrowableComputable<T, VcsException> backgroundable,
final Consumer<T> awtSuccessContinuation,
final Runnable awtErrorContinuation,
final BackgroundableActionEnabledHandler handler,
final Object actionParameter) {
super(project, title, true, BackgroundFromStartOption.getInstance());
myErrorTitle = errorTitle;
myBackgroundable = backgroundable;
myAwtSuccessContinuation = awtSuccessContinuation;
myAwtErrorContinuation = awtErrorContinuation;
myProject = project;
myHandler = handler;
myActionParameter = actionParameter;
}
public static <T> void createAndRunSilent(final Project project, @Nullable final VcsBackgroundableActions actionKey,
@Nullable final Object actionParameter, final String title,
final ThrowableComputable<T, VcsException> backgroundable,
@Nullable final Consumer<T> awtSuccessContinuation) {
createAndRun(project, actionKey, actionParameter, title, null, backgroundable, awtSuccessContinuation, null, true);
}
public static <T> void createAndRun(final Project project, @Nullable final VcsBackgroundableActions actionKey,
@Nullable final Object actionParameter,
final String title,
final String errorTitle,
final ThrowableComputable<T, VcsException> backgroundable) {
createAndRun(project, actionKey, actionParameter, title, errorTitle, backgroundable, null, null);
}
public static <T> void createAndRun(final Project project, @Nullable final VcsBackgroundableActions actionKey,
@Nullable final Object actionParameter,
final String title,
final String errorTitle,
final ThrowableComputable<T, VcsException> backgroundable,
@Nullable final Consumer<T> awtSuccessContinuation,
@Nullable final Runnable awtErrorContinuation) {
createAndRun(project, actionKey, actionParameter, title, errorTitle, backgroundable, awtSuccessContinuation, awtErrorContinuation, false);
}
private static <T> void createAndRun(final Project project, @Nullable final VcsBackgroundableActions actionKey,
@Nullable final Object actionParameter,
final String title,
final String errorTitle,
final ThrowableComputable<T, VcsException> backgroundable,
@Nullable final Consumer<T> awtSuccessContinuation,
@Nullable final Runnable awtErrorContinuation, final boolean silent) {
final ProjectLevelVcsManagerImpl vcsManager = (ProjectLevelVcsManagerImpl) ProjectLevelVcsManager.getInstance(project);
final BackgroundableActionEnabledHandler handler;
if (actionKey != null) {
handler = vcsManager.getBackgroundableActionHandler(actionKey);
// fo not start same action twice
if (handler.isInProgress(actionParameter)) return;
} else {
handler = null;
}
final VcsBackgroundableComputable<T> backgroundableComputable =
new VcsBackgroundableComputable<T>(project, title, errorTitle, backgroundable, awtSuccessContinuation, awtErrorContinuation,
handler, actionParameter);
backgroundableComputable.setSilent(silent);
if (handler != null) {
handler.register(actionParameter);
}
ProgressManager.getInstance().run(backgroundableComputable);
}
public void run(@NotNull ProgressIndicator indicator) {
try {
myResult = myBackgroundable.compute();
}
catch (VcsException e) {
myException = e;
}
}
@Override
public void onCancel() {
commonFinish();
}
@Override
public void onSuccess() {
commonFinish();
if (myException == null) {
if (myAwtSuccessContinuation != null) {
myAwtSuccessContinuation.consume(myResult);
}
} else {
if (myAwtErrorContinuation != null) {
myAwtErrorContinuation.run();
}
}
}
private void commonFinish() {
if (myHandler != null) {
myHandler.completed(myActionParameter);
}
if ((! mySilent) && (myException != null)) {
AbstractVcsHelperImpl.getInstance(myProject).showError(myException, myErrorTitle);
}
}
public void setSilent(boolean silent) {
mySilent = silent;
}
}