Sync intention menu contributor
已回答
Hi!
Why it was decided not to introduce a new extension point for EditorNotificationActions?
I use the extension of IntentionMenuContributor and in my logic use com.intellij.openapi.fileEditor.impl.FileEditorManagerImpl#getTopComponents method, and as a result, I get the exception 'Access is allowed from event dispatch thread only.' because the code is not called from the ApplicationManager.getApplication().invokeLater .
What should I do? Given that my code is being called from a ReadAction
public class CubaEditorNotificationActions implements IntentionMenuContributor {
@Override
public void collectActions(@NotNull Editor hostEditor, @NotNull PsiFile hostFile,
@NotNull ShowIntentionsPass.IntentionsInfo intentions, int passIdToShowIntentionsFor, int offset) {
if (hostEditor.getSelectionModel().hasSelection() || isCursorOutOfClass(hostFile, offset)) {
return;
}
Project project = hostEditor.getProject();
if (project == null) return;
FileEditorManager fileEditorManager = FileEditorManager.getInstance(project);
if (!(fileEditorManager instanceof FileEditorManagerImpl)) return;
TextEditor fileEditor = TextEditorProvider.getInstance().getTextEditor(hostEditor);
List<JComponent> components = ((FileEditorManagerImpl) fileEditorManager).getTopComponents(fileEditor);
for (JComponent component : components) {
if (component instanceof CubaEditorNotificationPanel) {
for (IntentionAction intentionAction : ((CubaEditorNotificationPanel) component).getIntentionActions()) {
intentions.notificationActionsToShow.add(
new HighlightInfo.IntentionActionDescriptor(intentionAction, null));
}
}
}
}
}
请先登录再写评论。
Is CubaEditorNotificationPanel a com.intellij.ui.EditorNotificationPanel ? Then using com.intellij.ui.EditorNotificationPanel#createActionLabel(java.lang.String, java.lang.String) would expose intentions automatically?
Yes CubaEditorNotificationPanel extends EditorNotificationPanel. But, I use custom components for EditorNotificationPanel. HyperlinkLabel doesn't suit me, for example, I use ActionButtonWithText.
Collection com.intellij.ui.EditorNotificationPanel.MyIntentionAction#myOptions is formed relative to HyperlinkLabel class. com.intellij.ui.EditorNotificationPanel#getIntentionAction method returns one action. I would like to add a list of actions.
In version 2019.1 this code worked correctly.
Please note that IntentionMenuContributor is marked as Internal API and shouldn't be used by 3rd party plugins in the first place. You could provide corresponding IntentionAction that replicate your custom component's quickfixes.
Thanks, I will not use IntentionMenuContributor.