/* * 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; import consulo.annotations.RequiredDispatchThread; 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; } } @RequiredDispatchThread @Override public void onCancel() { commonFinish(); } @RequiredDispatchThread @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; } }