Разработка плагина Intellij IDEA: Не удается получить индикатор прогресса для IntentionAction - PullRequest
0 голосов
/ 30 апреля 2018

Я хотел бы отобразить индикатор выполнения при запуске пользовательского IntentionAction в моем пользовательском плагине IntellIJ IDEA.

Однако, это не отображается независимо от того, что я делаю. Чтобы проверить, заключается ли проблема в IntentionAction, я скопировал и вставил код в простую реализацию AnAction. Весь класс выглядит так:

    public class HelloAction extends AnAction {
    public HelloAction() {
        super("Hello");
    }

    public void actionPerformed(AnActionEvent event) {
        Project project = event.getData(CommonDataKeys.PROJECT);
        ProgressManager.getInstance().run(new Task.Modal(project, "daf", false) {
            public void run(ProgressIndicator indicator) {
                indicator.setText("This is how you update the indicator");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {}
                indicator.setFraction(0.5);  // halfway done
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {}
            }
        });
        Messages.showMessageDialog(project, "Hello world!", "Greeting", Messages.getInformationIcon());
    }
}

И это прекрасно работает. И когда я использую тот же код внутри IntentionAction, ничего не отображается.

public class GenerateIntentionAction extends PsiElementBaseIntentionAction implements IntentionAction {
...
public void invoke(@NotNull Project project, Editor editor, @NotNull PsiElement element) throws IncorrectOperationException {
        ProgressManager.getInstance().run(new Task.Modal(project, "daf", false) {
            public void run(ProgressIndicator indicator) {
                indicator.setText("This is how you update the indicator");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {}
                indicator.setFraction(0.5);  // halfway done
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {}
            }
        });

Я попытался запустить вызов runWithProgressSynchronously вместо run, попытался сделать Task Modal и Backgroundable - безрезультатно. Я не знаю, что не так, кроме того, что ProgressIndicator внутри IntentionAction всегда EmptyProgressIndicator

1 Ответ

0 голосов
/ 30 апреля 2018

Если ваше намеренное действие вызывается внутри WriteAction, оттуда вы не сможете отобразить модальный интерфейс. Может помочь переопределение startInWriteAction и возврат false.

...