Skip to content

Commit efab7b5

Browse files
committed
feat(terminal): implement terminal runner service with enhanced functionality
- Create TerminalRunnerService class to manage terminal runner and widget creation - Add functionality to initialize terminal runner and create terminal widget - Implement support for shell startup options, including JAVA_HOME environment variable - Provide fallback mechanism for terminal widget creation
1 parent 8a61ea4 commit efab7b5

File tree

3 files changed

+98
-0
lines changed

3 files changed

+98
-0
lines changed
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package cc.unitmesh.terminal.service
2+
3+
import com.intellij.openapi.Disposable
4+
import com.intellij.openapi.components.Service
5+
import com.intellij.openapi.components.service
6+
import com.intellij.openapi.project.Project
7+
import com.intellij.terminal.JBTerminalWidget
8+
import com.pty4j.PtyProcess
9+
import org.jetbrains.plugins.terminal.AbstractTerminalRunner
10+
import org.jetbrains.plugins.terminal.LocalTerminalDirectRunner
11+
12+
@Service(Service.Level.PROJECT)
13+
class TerminalRunnerService(private val project: Project) {
14+
private var terminalRunner: AbstractTerminalRunner<PtyProcess>? = null
15+
16+
fun createTerminalRunner(): AbstractTerminalRunner<PtyProcess> {
17+
if (terminalRunner == null) {
18+
terminalRunner = LocalTerminalDirectRunner.createTerminalRunner(project)
19+
}
20+
21+
return terminalRunner!!
22+
}
23+
24+
fun createTerminalWidget(
25+
parent: Disposable,
26+
startingDirectory: String?,
27+
deferSessionStartUntilUiShown: Boolean = true
28+
): JBTerminalWidget {
29+
val terminalRunner = createTerminalRunner()
30+
return terminalRunner.createTerminalWidget(parent, startingDirectory, deferSessionStartUntilUiShown)
31+
}
32+
33+
companion object {
34+
@JvmStatic
35+
fun getInstance(project: Project): TerminalRunnerService = project.service()
36+
}
37+
}
File renamed without changes.
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package cc.unitmesh.terminal.service
2+
3+
import cc.unitmesh.devti.sketch.run.ProcessExecutor
4+
import com.intellij.openapi.Disposable
5+
import com.intellij.openapi.components.Service
6+
import com.intellij.openapi.components.service
7+
import com.intellij.openapi.project.Project
8+
import com.intellij.terminal.JBTerminalWidget
9+
import com.pty4j.PtyProcess
10+
import org.jetbrains.plugins.terminal.AbstractTerminalRunner
11+
import org.jetbrains.plugins.terminal.LocalTerminalDirectRunner
12+
import org.jetbrains.plugins.terminal.ShellStartupOptions
13+
14+
@Service(Service.Level.PROJECT)
15+
class TerminalRunnerService(private val project: Project) {
16+
private var terminalRunner: AbstractTerminalRunner<PtyProcess>? = null
17+
18+
fun createTerminalRunner(): AbstractTerminalRunner<PtyProcess> {
19+
return terminalRunner ?: initializeTerminalRunner().also { terminalRunner = it }
20+
}
21+
22+
fun initializeTerminalRunner(): AbstractTerminalRunner<PtyProcess> {
23+
val runner = LocalTerminalDirectRunner.createTerminalRunner(project)
24+
25+
return runner
26+
}
27+
28+
private fun createStartupOptions(): ShellStartupOptions? {
29+
return ProcessExecutor.getJdkVersion(project)?.let { javaHomePath ->
30+
val environmentVariables = mapOf("JAVA_HOME" to javaHomePath)
31+
val startupOptions = ShellStartupOptions.Builder()
32+
.envVariables(environmentVariables)
33+
.build()
34+
35+
return@let startupOptions
36+
}
37+
}
38+
39+
fun createTerminalWidget(
40+
parent: Disposable,
41+
startingDirectory: String?,
42+
deferSessionStartUntilUiShown: Boolean = true
43+
): JBTerminalWidget {
44+
val terminalRunner = createTerminalRunner()
45+
46+
createStartupOptions()?.also {
47+
val terminalWidget = terminalRunner.startShellTerminalWidget(parent, it, deferSessionStartUntilUiShown)
48+
val jediTermWidget = JBTerminalWidget.asJediTermWidget(terminalWidget)
49+
if (jediTermWidget != null) {
50+
return jediTermWidget
51+
}
52+
}
53+
54+
return terminalRunner.createTerminalWidget(parent, startingDirectory, deferSessionStartUntilUiShown)
55+
}
56+
57+
companion object {
58+
@JvmStatic
59+
fun getInstance(project: Project): TerminalRunnerService = project.service()
60+
}
61+
}

0 commit comments

Comments
 (0)