diff --git a/platform/remote-driver/test-sdk/intellij.driver.sdk.iml b/platform/remote-driver/test-sdk/intellij.driver.sdk.iml index f36d063beaf0..ff59374849d9 100644 --- a/platform/remote-driver/test-sdk/intellij.driver.sdk.iml +++ b/platform/remote-driver/test-sdk/intellij.driver.sdk.iml @@ -38,5 +38,6 @@ + \ No newline at end of file diff --git a/platform/remote-driver/test-sdk/src/com/intellij/driver/sdk/ui/components/common/JEditorUi.kt b/platform/remote-driver/test-sdk/src/com/intellij/driver/sdk/ui/components/common/JEditorUi.kt index 282176ed3034..476d7a9e0760 100644 --- a/platform/remote-driver/test-sdk/src/com/intellij/driver/sdk/ui/components/common/JEditorUi.kt +++ b/platform/remote-driver/test-sdk/src/com/intellij/driver/sdk/ui/components/common/JEditorUi.kt @@ -66,6 +66,8 @@ open class JEditorUiComponent(data: ComponentData) : UiComponent(data) { fun getLineNumber(text: String): Int = document.getLineNumber(this.text.indexOf(text)) + 1 + fun getLastLineNumber(text: String): Int = document.getLineNumber(this.text.lastIndexOf(text)) + 1 + fun expandAllFoldings() { driver.invokeAction("ExpandAllRegions", component = component) } diff --git a/platform/remote-driver/test-sdk/src/com/intellij/driver/sdk/ui/components/common/dialogs/TerminalDialogUI.kt b/platform/remote-driver/test-sdk/src/com/intellij/driver/sdk/ui/components/common/dialogs/TerminalDialogUI.kt index 9a2a58aec45a..98a4c4be80c6 100644 --- a/platform/remote-driver/test-sdk/src/com/intellij/driver/sdk/ui/components/common/dialogs/TerminalDialogUI.kt +++ b/platform/remote-driver/test-sdk/src/com/intellij/driver/sdk/ui/components/common/dialogs/TerminalDialogUI.kt @@ -1,6 +1,7 @@ package com.intellij.driver.sdk.ui.components.common.dialogs import com.intellij.driver.client.Driver +import com.intellij.driver.client.Remote import com.intellij.driver.sdk.ui.Finder import com.intellij.driver.sdk.ui.components.ComponentData import com.intellij.driver.sdk.ui.components.UiComponent @@ -9,11 +10,12 @@ import com.intellij.driver.sdk.ui.ui import com.intellij.driver.sdk.waitFor import org.intellij.lang.annotations.Language -fun Finder.terminal(@Language("xpath") xpath: String = "//div[contains(@class, 'TerminalToolWindow') or contains(@class, 'ConsoleTerminalWidget')]") = + +fun Finder.terminal(@Language("xpath") xpath: String = "//div[contains(@class, 'TerminalPanel') or contains(@class, 'ConsoleTerminalWidget')]") = x(xpath, TerminalDialogUI::class.java) fun Finder.terminal(action: TerminalDialogUI.() -> Unit) { - x("//div[contains(@class, 'TerminalToolWindow') or contains(@class, 'ConsoleTerminalWidget')]", TerminalDialogUI::class.java).action() + x("//div[contains(@class, 'TerminalPanel') or contains(@class, 'ConsoleTerminalWidget')]", TerminalDialogUI::class.java).action() } fun Driver.terminal(action: TerminalDialogUI.() -> Unit) { @@ -28,6 +30,14 @@ class TerminalDialogUI(data: ComponentData) : UiComponent(data) { waitFound() } + val terminalView: TerminalView + get() = driver.cast(component, TerminalView::class) + val terminalOutputModel: TerminalOutputModel get() = terminalView.outputModels.active.value + val cursorOffset: Long get() = terminalOutputModel.cursorOffset.toAbsolute() + + + + val rdPortForwardingPanelWidget: RdPortForwardingPanelWidget get() = x(RdPortForwardingPanelWidget::class.java) { byJavaClass("com.jetbrains.thinclient.portForwarding.ThinClientPortForwardingPanelWidget") } @@ -47,3 +57,29 @@ class RdPortForwardingPanelWidget(data: ComponentData) : UiComponent(data) { val forwardedPortDropDown: UiComponent get() = x { byJavaClass("com.jetbrains.thinclient.portForwarding.ui.ForwardedPortDropDownLink") } } + +@Remote("com.intellij.terminal.frontend.view.TerminalView", plugin = "org.jetbrains.plugins.terminal/intellij.terminal.frontend") +interface TerminalView { + fun getActiveOutputModel(): TerminalOutputModel + val outputModels: TerminalOutputModelsSet +} + +@Remote("org.jetbrains.plugins.terminal.view.TerminalOutputModelsSet", plugin = "org.jetbrains.plugins.terminal") +interface TerminalOutputModelsSet { + val active: StateFlow +} + +@Remote("kotlinx.coroutines.flow.StateFlow") +interface StateFlow { + val value: T +} + +@Remote("org.jetbrains.plugins.terminal.block.reworked.TerminalOutputModel") +interface TerminalOutputModel { + val cursorOffset: TerminalOffset +} + +@Remote("org.jetbrains.plugins.terminal.block.reworked.TerminalOffset", plugin = "org.jetbrains.plugins.terminal") +interface TerminalOffset { + fun toAbsolute(): Long +} \ No newline at end of file diff --git a/plugins/terminal/frontend/src/com/intellij/terminal/frontend/view/TerminalView.kt b/plugins/terminal/frontend/src/com/intellij/terminal/frontend/view/TerminalView.kt index 778d400f6011..48714e3f8b84 100644 --- a/plugins/terminal/frontend/src/com/intellij/terminal/frontend/view/TerminalView.kt +++ b/plugins/terminal/frontend/src/com/intellij/terminal/frontend/view/TerminalView.kt @@ -6,6 +6,7 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Deferred import kotlinx.coroutines.flow.StateFlow import org.jetbrains.annotations.ApiStatus +import org.jetbrains.plugins.terminal.block.reworked.TerminalOutputModel import org.jetbrains.plugins.terminal.session.TerminalGridSize import org.jetbrains.plugins.terminal.session.TerminalStartupOptions import org.jetbrains.plugins.terminal.view.TerminalOutputModel @@ -124,6 +125,10 @@ interface TerminalView { */ fun createSendTextBuilder(): TerminalSendTextBuilder + // todo + + fun getActiveOutputModel(): TerminalOutputModel + companion object { /** * The data context key for accessing the Terminal View from actions. diff --git a/plugins/terminal/frontend/src/com/intellij/terminal/frontend/view/impl/TerminalViewImpl.kt b/plugins/terminal/frontend/src/com/intellij/terminal/frontend/view/impl/TerminalViewImpl.kt index 2dfc7f6ddefe..d92c3f119cd9 100644 --- a/plugins/terminal/frontend/src/com/intellij/terminal/frontend/view/impl/TerminalViewImpl.kt +++ b/plugins/terminal/frontend/src/com/intellij/terminal/frontend/view/impl/TerminalViewImpl.kt @@ -123,6 +123,10 @@ class TerminalViewImpl( get() = getCurEditor().calculateTerminalSize() override val title: TerminalTitle = TerminalTitle() + //@VisibleForTesting + override fun getActiveOutputModel(): TerminalOutputModel{ + return outputModels.active.value + } private val mutableOutputModels: TerminalOutputModelsSetImpl override val outputModels: TerminalOutputModelsSet