copyright: provide write action progress (IDEA-122290)

This commit is contained in:
Anna Kozlova
2014-03-17 17:50:35 +01:00
parent 2aec8332cc
commit 22d2a16bdc
@@ -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<Runnable> preparations = new ArrayList<Runnable>();
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<Runnable> myRunnables;
private final SequentialModalProgressTask myProgressTask;
private int myIdx = 0;
private UpdateCopyrightSequentialTask(List<Runnable> 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;
}
}
}