mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
copyright: provide write action progress (IDEA-122290)
This commit is contained in:
+83
-5
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user