From 0e191bdfadf8f9adcff59cd9aadf4de0e603ef50 Mon Sep 17 00:00:00 2001 From: Konstantin Hudyakov Date: Thu, 12 Oct 2023 11:32:18 +0300 Subject: [PATCH] [terminal] IDEA-334674 Add custom show documentation action for the case when auto showing is disabled Also, cancel the popup scope when documentation popup is closed for any reason (not only when it is closed manually by our code). GitOrigin-RevId: 623cc68d101c3a7d12f88a3c785a41ca7d296886 --- .../terminal/resources/META-INF/plugin.xml | 2 ++ .../messages/TerminalBundle.properties | 1 + .../terminal/action/TerminalShowDocAction.kt | 35 +++++++++++++++++++ .../TerminalDocumentationManager.kt | 7 ++-- 4 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 plugins/terminal/src/org/jetbrains/plugins/terminal/action/TerminalShowDocAction.kt diff --git a/plugins/terminal/resources/META-INF/plugin.xml b/plugins/terminal/resources/META-INF/plugin.xml index d218174f5a01..7df82eb3fa6a 100644 --- a/plugins/terminal/resources/META-INF/plugin.xml +++ b/plugins/terminal/resources/META-INF/plugin.xml @@ -121,6 +121,8 @@ + diff --git a/plugins/terminal/resources/messages/TerminalBundle.properties b/plugins/terminal/resources/messages/TerminalBundle.properties index edfa367dcb88..82d100c7cd55 100644 --- a/plugins/terminal/resources/messages/TerminalBundle.properties +++ b/plugins/terminal/resources/messages/TerminalBundle.properties @@ -25,6 +25,7 @@ action.Terminal.Find.text=Find action.Terminal.ClearBuffer.text=Clear Terminal action.Terminal.CommandCompletion.text=Command Completion action.Terminal.InsertInlineCompletionItem.text=Insert Inline Completion Item +action.Terminal.ShowDocumentation.text=Show Documentation action.Terminal.Copy.text=Copy action.Terminal.SelectLastBlock.text=Select Last Block action.Terminal.SelectPrompt.text=Select Prompt diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/action/TerminalShowDocAction.kt b/plugins/terminal/src/org/jetbrains/plugins/terminal/action/TerminalShowDocAction.kt new file mode 100644 index 000000000000..dedc5deb95cc --- /dev/null +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/action/TerminalShowDocAction.kt @@ -0,0 +1,35 @@ +// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package org.jetbrains.plugins.terminal.action + +import com.intellij.codeInsight.hint.HintManagerImpl +import com.intellij.codeInsight.lookup.LookupManager +import com.intellij.codeInsight.lookup.impl.LookupImpl +import com.intellij.openapi.actionSystem.ActionUpdateThread +import com.intellij.openapi.actionSystem.AnActionEvent +import com.intellij.openapi.project.DumbAwareAction +import org.jetbrains.plugins.terminal.exp.CommandHistoryPresenter.Companion.IS_COMMAND_HISTORY_LOOKUP_KEY +import org.jetbrains.plugins.terminal.exp.TerminalDataContextUtils.editor +import org.jetbrains.plugins.terminal.exp.TerminalDataContextUtils.isPromptEditor +import org.jetbrains.plugins.terminal.exp.documentation.TerminalDocumentationManager + +class TerminalShowDocAction : DumbAwareAction(), HintManagerImpl.ActionToIgnore { + override fun actionPerformed(e: AnActionEvent) { + val project = e.project ?: return + val lookup = LookupManager.getActiveLookup(e.editor) as? LookupImpl ?: return + val currentItem = lookup.currentItem ?: return + TerminalDocumentationManager.getInstance(project).showDocumentationForItem(lookup, currentItem, parentDisposable = lookup) + } + + override fun update(e: AnActionEvent) { + val editor = e.editor + val lookup = LookupManager.getActiveLookup(editor) as? LookupImpl + // enable this action only in the terminal command completion popup + e.presentation.isEnabledAndVisible = e.project != null + && editor?.isPromptEditor == true + && lookup != null + && lookup.getUserData(IS_COMMAND_HISTORY_LOOKUP_KEY) != true + && lookup.currentItem != null + } + + override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.EDT +} \ No newline at end of file diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/exp/documentation/TerminalDocumentationManager.kt b/plugins/terminal/src/org/jetbrains/plugins/terminal/exp/documentation/TerminalDocumentationManager.kt index d85f86fd0de4..c58706e79296 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/exp/documentation/TerminalDocumentationManager.kt +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/exp/documentation/TerminalDocumentationManager.kt @@ -75,6 +75,7 @@ internal class TerminalDocumentationManager(private val project: Project, privat Disposer.register(popup) { EDT.assertIsEdt() currentPopup = null + popupScope.coroutineContext.job.cancelChildren() } } @@ -86,7 +87,7 @@ internal class TerminalDocumentationManager(private val project: Project, privat val lookupElementFlow = lookup.elementFlow() val showDocJob = scope.launch(Dispatchers.EDT + ModalityState.current().asContextElement()) { lookupElementFlow.collectLatest { - handleLookupElementChange(lookup, it, parentDisposable) + showDocumentationForItem(lookup, it, parentDisposable) } } Disposer.register(parentDisposable) { @@ -94,7 +95,8 @@ internal class TerminalDocumentationManager(private val project: Project, privat } } - private fun handleLookupElementChange(lookup: LookupEx, element: LookupElement, parentDisposable: Disposable) { + @RequiresEdt + fun showDocumentationForItem(lookup: LookupEx, element: LookupElement, parentDisposable: Disposable) { if (getCurrentPopup() != null) { return } @@ -141,7 +143,6 @@ internal class TerminalDocumentationManager(private val project: Project, privat private fun cancelPopup() { EDT.assertIsEdt() getCurrentPopup()?.cancel() - popupScope.coroutineContext.job.cancelChildren() } private fun createDocPopupComponent(docComponent: DocumentationComponent, parentDisposable: Disposable): JComponent {