Skip to content

Commit 6d4e800

Browse files
committed
feat(ext-terminal): refactor suggestCommand method to support 241 new UI context and add TerminalUtil class for message sending #135.
1 parent 3c91acb commit 6d4e800

File tree

1 file changed

+25
-13
lines changed

1 file changed

+25
-13
lines changed

exts/ext-terminal/src/241/main/kotlin/cc/unitmesh/terminal/TerminalUtil.kt

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,42 +2,54 @@ package cc.unitmesh.terminal
22

33
import cc.unitmesh.terminal.ShellCommandSuggestAction.Companion.suggestCommand
44
import com.intellij.openapi.actionSystem.AnActionEvent
5+
import com.intellij.openapi.actionSystem.DataProvider
6+
import com.intellij.openapi.application.runInEdt
7+
import com.intellij.openapi.editor.ex.EditorEx
58
import com.intellij.openapi.project.Project
69
import com.intellij.openapi.wm.ToolWindowManager
7-
import com.intellij.terminal.JBTerminalWidget
10+
import com.intellij.terminal.ui.TerminalWidget
11+
import com.intellij.ui.components.panels.Wrapper
812
import com.intellij.ui.content.Content
913
import org.jetbrains.plugins.terminal.TerminalToolWindowFactory
1014
import org.jetbrains.plugins.terminal.TerminalToolWindowManager
11-
import org.jetbrains.plugins.terminal.exp.TerminalDataContextUtils.editor
15+
import org.jetbrains.plugins.terminal.exp.TerminalOutputController
1216

1317
object TerminalUtil {
1418
fun sendMsg(project: Project, data: String, e: AnActionEvent) {
15-
val editor = e.editor
19+
val content = getContent(project) ?: return
20+
val findWidgetByContent = TerminalToolWindowManager.findWidgetByContent(content) ?: return
21+
val editor = tryGetBlockTerminalEditor(findWidgetByContent)
1622
if (editor == null) {
17-
trySendMsgInOld(project, data)
23+
trySendMsgInOld(project, data, content)
1824
return
1925
}
2026

2127
suggestCommand(data, project) { string ->
22-
editor.document.insertString(editor.caretModel.offset, string)
28+
runInEdt {
29+
editor.document.insertString(editor.caretModel.offset, string)
30+
}
2331
}
2432
}
2533

26-
private fun trySendMsgInOld(project: Project, data: String): Boolean {
27-
val widget = getCurrentTerminalWidget(project) ?: return true
34+
private fun tryGetBlockTerminalEditor(findWidgetByContent: TerminalWidget): EditorEx? {
35+
val terminalView = (findWidgetByContent.component as Wrapper).targetComponent
36+
if (terminalView is DataProvider) {
37+
val controller = terminalView.getData(TerminalOutputController.KEY.name)
38+
return (controller as? TerminalOutputController)?.outputModel?.editor
39+
}
40+
41+
return null
42+
}
43+
44+
private fun trySendMsgInOld(project: Project, data: String, content: Content): Boolean {
45+
val widget = TerminalToolWindowManager.getWidgetByContent(content) ?: return true
2846
suggestCommand(data, project) { string ->
2947
widget.terminalStarter?.sendString(string, true)
3048
}
3149

3250
return false
3351
}
3452

35-
fun getCurrentTerminalWidget(project: Project): JBTerminalWidget? {
36-
val content = getContent(project) ?: return null
37-
val widget = TerminalToolWindowManager.getWidgetByContent(content) ?: return null
38-
return widget
39-
}
40-
4153
private fun getContent(project: Project): Content? {
4254
val toolWindow = ToolWindowManager.getInstance(project)
4355
.getToolWindow(TerminalToolWindowFactory.TOOL_WINDOW_ID)

0 commit comments

Comments
 (0)