diff --git a/plugins/copyright/src/com/maddyhome/idea/copyright/actions/UpdateCopyrightAction.java b/plugins/copyright/src/com/maddyhome/idea/copyright/actions/UpdateCopyrightAction.java index a372331e0c2b..f9645e1043c9 100644 --- a/plugins/copyright/src/com/maddyhome/idea/copyright/actions/UpdateCopyrightAction.java +++ b/plugins/copyright/src/com/maddyhome/idea/copyright/actions/UpdateCopyrightAction.java @@ -19,16 +19,26 @@ package com.maddyhome.idea.copyright.actions; import com.intellij.analysis.AnalysisScope; import com.intellij.analysis.BaseAnalysisAction; import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.module.ModuleUtilCore; +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.vfs.VirtualFile; import com.intellij.psi.*; +import com.intellij.util.SequentialModalProgressTask; +import com.intellij.util.SequentialTask; import com.maddyhome.idea.copyright.CopyrightManager; import com.maddyhome.idea.copyright.pattern.FileUtil; import com.maddyhome.idea.copyright.util.FileTypeUtil; import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; +import java.util.List; + public class UpdateCopyrightAction extends BaseAnalysisAction { protected UpdateCopyrightAction() { super(UpdateCopyrightProcessor.TITLE, UpdateCopyrightProcessor.TITLE); @@ -98,13 +108,81 @@ public class UpdateCopyrightAction extends BaseAnalysisAction { } @Override - protected void analyze(@NotNull final Project project, @NotNull AnalysisScope scope) { + protected void analyze(@NotNull final Project project, @NotNull final AnalysisScope scope) { if (scope.checkScopeWritable(project)) return; - scope.accept(new PsiElementVisitor() { + final List preparations = new ArrayList(); + Task.Backgroundable task = new Task.Backgroundable(project, "Prepare Copyright...", true) { @Override - public void visitFile(PsiFile file) { - new UpdateCopyrightProcessor(project, ModuleUtilCore.findModuleForPsiElement(file), file).run(); + public void run(@NotNull final ProgressIndicator indicator) { + scope.accept(new PsiElementVisitor() { + @Override + public void visitFile(final PsiFile file) { + if (indicator.isCanceled()) { + return; + } + preparations.add(new UpdateCopyrightProcessor(project, ModuleUtilCore.findModuleForPsiElement(file), file).preprocessFile(file)); + } + }); } - }); + + @Override + public void onSuccess() { + if (!preparations.isEmpty()) { + final SequentialModalProgressTask progressTask = new SequentialModalProgressTask(project, UpdateCopyrightProcessor.TITLE, true); + progressTask.setMinIterationTime(200); + progressTask.setTask(new UpdateCopyrightSequentialTask(preparations, progressTask)); + CommandProcessor.getInstance().executeCommand(project, new Runnable() { + @Override + public void run() { + CommandProcessor.getInstance().markCurrentCommandAsGlobal(project); + ApplicationManager.getApplication().runWriteAction(new Runnable() { + @Override + public void run() { + ProgressManager.getInstance().run(progressTask); + } + }); + } + }, getTemplatePresentation().getText(), null); + } + } + }; + + ProgressManager.getInstance().run(task); + } + + private static class UpdateCopyrightSequentialTask implements SequentialTask { + private final int mySize; + private final List myRunnables; + private final SequentialModalProgressTask myProgressTask; + private int myIdx = 0; + + private UpdateCopyrightSequentialTask(List runnables, SequentialModalProgressTask progressTask) { + myRunnables = runnables; + myProgressTask = progressTask; + mySize = myRunnables.size(); + } + + @Override + public void prepare() {} + + @Override + public boolean isDone() { + return myIdx > mySize - 1; + } + + @Override + public boolean iteration() { + final ProgressIndicator indicator = myProgressTask.getIndicator(); + if (indicator != null) { + indicator.setFraction((double) myIdx/mySize); + } + myRunnables.get(myIdx++).run(); + return true; + } + + @Override + public void stop() { + myIdx = mySize; + } } } \ No newline at end of file