Skip to content

Commit b24010a

Browse files
committed
feat(terminal): add resizable terminal panel and improve terminal sketch #335
- Add ResizableTerminalPanel class to allow resizing of the terminal - Implement mouse listeners for dragging the resize handle - Update TerminalLangSketch to use the new resizable terminal panel - Adjust the layout and appearance of the terminal sketch - Improve the hide/show functionality of the terminal panel
1 parent 144bd77 commit b24010a

File tree

1 file changed

+58
-8
lines changed

1 file changed

+58
-8
lines changed

exts/ext-terminal/src/main/kotlin/cc/unitmesh/terminal/sketch/TerminalSketchProvider.kt

Lines changed: 58 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import com.intellij.openapi.ui.popup.JBPopupFactory
2828
import com.intellij.openapi.ui.popup.util.MinimizeButton
2929
import com.intellij.openapi.wm.ToolWindowManager
3030
import com.intellij.terminal.JBTerminalWidget
31+
import com.intellij.ui.JBColor
3132
import com.intellij.ui.components.panels.VerticalLayout
3233
import com.intellij.ui.components.panels.Wrapper
3334
import com.intellij.util.ui.JBUI
@@ -37,22 +38,25 @@ import kotlinx.coroutines.launch
3738
import org.jetbrains.ide.PooledThreadExecutor
3839
import org.jetbrains.plugins.terminal.LocalTerminalDirectRunner
3940
import java.awt.BorderLayout
41+
import java.awt.Color
42+
import java.awt.Cursor
4043
import java.awt.Dimension
4144
import java.awt.Toolkit
4245
import java.awt.datatransfer.StringSelection
4346
import java.awt.event.MouseAdapter
4447
import java.awt.event.MouseEvent
48+
import java.awt.event.MouseMotionAdapter
4549
import javax.swing.JComponent
4650
import javax.swing.JLabel
4751
import javax.swing.JPanel
52+
import javax.swing.SwingConstants
4853

4954
class TerminalSketchProvider : LanguageSketchProvider {
5055
override fun isSupported(lang: String): Boolean = lang == "bash" || lang == "shell"
5156

5257
override fun create(project: Project, content: String): ExtensionLangSketch = TerminalLangSketch(project, content)
5358
}
5459

55-
5660
class TerminalLangSketch(val project: Project, var content: String) : ExtensionLangSketch {
5761
val enableAutoRunTerminal = project.coderSetting.state.enableAutoRunTerminal
5862

@@ -77,8 +81,7 @@ class TerminalLangSketch(val project: Project, var content: String) : ExtensionL
7781
add(resultSketch.getComponent(), BorderLayout.CENTER)
7882
}
7983

80-
val isSingleLine = content.lines().filter { it.trim().isNotEmpty() }.size <= 1
81-
val collapsibleCodePanel = CollapsiblePanel("Shell Code", codePanel, initiallyCollapsed = isSingleLine)
84+
val collapsibleCodePanel = CollapsiblePanel("Shell Code", codePanel, initiallyCollapsed = true)
8285

8386
val collapsibleResultPanel = CollapsiblePanel("Execution Results", resultPanel, initiallyCollapsed = true)
8487

@@ -92,6 +95,7 @@ class TerminalLangSketch(val project: Project, var content: String) : ExtensionL
9295
}
9396

9497
private lateinit var executeAction: TerminalExecuteAction
98+
private lateinit var resizableTerminalPanel: ResizableTerminalPanel
9599

96100
init {
97101
val projectDir = project.guessProjectDir()?.path
@@ -101,6 +105,8 @@ class TerminalLangSketch(val project: Project, var content: String) : ExtensionL
101105
it.preferredSize = Dimension(it.preferredSize.width, 80)
102106
}
103107

108+
resizableTerminalPanel = ResizableTerminalPanel(terminalWidget!!)
109+
104110
codeSketch.getComponent().border = JBUI.Borders.empty()
105111
resultSketch.getComponent().border = JBUI.Borders.empty()
106112

@@ -109,7 +115,7 @@ class TerminalLangSketch(val project: Project, var content: String) : ExtensionL
109115
add(toolbarWrapper)
110116
add(collapsibleCodePanel)
111117
add(collapsibleResultPanel)
112-
add(terminalWidget!!.component)
118+
add(resizableTerminalPanel)
113119
}
114120
}
115121

@@ -171,10 +177,10 @@ class TerminalLangSketch(val project: Project, var content: String) : ExtensionL
171177
.setCancelButton(MinimizeButton("Hide"))
172178
.setCancelCallback {
173179
popup?.cancel()
174-
mainPanel!!.remove(terminalWidget.component)
175-
mainPanel!!.add(terminalWidget.component)
176-
mainPanel!!.revalidate()
177-
mainPanel!!.repaint()
180+
resizableTerminalPanel.removeAll()
181+
resizableTerminalPanel.add(terminalWidget.component, BorderLayout.CENTER)
182+
resizableTerminalPanel.revalidate()
183+
resizableTerminalPanel.repaint()
178184
true
179185
}
180186
.setFocusable(true)
@@ -303,3 +309,47 @@ class TerminalLangSketch(val project: Project, var content: String) : ExtensionL
303309
}
304310
}
305311
}
312+
313+
class ResizableTerminalPanel(terminalWidget: JBTerminalWidget) : JPanel(BorderLayout()) {
314+
private val minHeight = 48
315+
private val maxHeight = 600
316+
private var startY = 0
317+
private var startHeight = 0
318+
319+
init {
320+
add(terminalWidget.component, BorderLayout.CENTER)
321+
322+
val dragHandle = JPanel().apply {
323+
preferredSize = Dimension(Int.MAX_VALUE, 5)
324+
background = UIUtil.getPanelBackground()
325+
cursor = Cursor.getPredefinedCursor(Cursor.S_RESIZE_CURSOR) // Change to south resize cursor
326+
}
327+
328+
val dragIndicator = JLabel("", SwingConstants.CENTER).apply {
329+
foreground = JBColor.GRAY
330+
}
331+
dragHandle.add(dragIndicator)
332+
333+
add(dragHandle, BorderLayout.SOUTH) // Move handle to bottom of panel
334+
335+
dragHandle.addMouseListener(object : MouseAdapter() {
336+
override fun mousePressed(e: MouseEvent) {
337+
startY = e.y
338+
startHeight = preferredSize.height
339+
}
340+
})
341+
342+
dragHandle.addMouseMotionListener(object : MouseMotionAdapter() {
343+
override fun mouseDragged(e: MouseEvent) {
344+
val newHeight = startHeight + e.y - startY // Adjust calculation for bottom handle
345+
346+
if (newHeight in minHeight..maxHeight) {
347+
preferredSize = Dimension(preferredSize.width, newHeight)
348+
revalidate()
349+
repaint()
350+
}
351+
}
352+
})
353+
}
354+
}
355+

0 commit comments

Comments
 (0)