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 {