@@ -28,6 +28,7 @@ import com.intellij.openapi.ui.popup.JBPopupFactory
28
28
import com.intellij.openapi.ui.popup.util.MinimizeButton
29
29
import com.intellij.openapi.wm.ToolWindowManager
30
30
import com.intellij.terminal.JBTerminalWidget
31
+ import com.intellij.ui.JBColor
31
32
import com.intellij.ui.components.panels.VerticalLayout
32
33
import com.intellij.ui.components.panels.Wrapper
33
34
import com.intellij.util.ui.JBUI
@@ -37,22 +38,25 @@ import kotlinx.coroutines.launch
37
38
import org.jetbrains.ide.PooledThreadExecutor
38
39
import org.jetbrains.plugins.terminal.LocalTerminalDirectRunner
39
40
import java.awt.BorderLayout
41
+ import java.awt.Color
42
+ import java.awt.Cursor
40
43
import java.awt.Dimension
41
44
import java.awt.Toolkit
42
45
import java.awt.datatransfer.StringSelection
43
46
import java.awt.event.MouseAdapter
44
47
import java.awt.event.MouseEvent
48
+ import java.awt.event.MouseMotionAdapter
45
49
import javax.swing.JComponent
46
50
import javax.swing.JLabel
47
51
import javax.swing.JPanel
52
+ import javax.swing.SwingConstants
48
53
49
54
class TerminalSketchProvider : LanguageSketchProvider {
50
55
override fun isSupported (lang : String ): Boolean = lang == " bash" || lang == " shell"
51
56
52
57
override fun create (project : Project , content : String ): ExtensionLangSketch = TerminalLangSketch (project, content)
53
58
}
54
59
55
-
56
60
class TerminalLangSketch (val project : Project , var content : String ) : ExtensionLangSketch {
57
61
val enableAutoRunTerminal = project.coderSetting.state.enableAutoRunTerminal
58
62
@@ -77,8 +81,7 @@ class TerminalLangSketch(val project: Project, var content: String) : ExtensionL
77
81
add(resultSketch.getComponent(), BorderLayout .CENTER )
78
82
}
79
83
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 )
82
85
83
86
val collapsibleResultPanel = CollapsiblePanel (" Execution Results" , resultPanel, initiallyCollapsed = true )
84
87
@@ -92,6 +95,7 @@ class TerminalLangSketch(val project: Project, var content: String) : ExtensionL
92
95
}
93
96
94
97
private lateinit var executeAction: TerminalExecuteAction
98
+ private lateinit var resizableTerminalPanel: ResizableTerminalPanel
95
99
96
100
init {
97
101
val projectDir = project.guessProjectDir()?.path
@@ -101,6 +105,8 @@ class TerminalLangSketch(val project: Project, var content: String) : ExtensionL
101
105
it.preferredSize = Dimension (it.preferredSize.width, 80 )
102
106
}
103
107
108
+ resizableTerminalPanel = ResizableTerminalPanel (terminalWidget!! )
109
+
104
110
codeSketch.getComponent().border = JBUI .Borders .empty()
105
111
resultSketch.getComponent().border = JBUI .Borders .empty()
106
112
@@ -109,7 +115,7 @@ class TerminalLangSketch(val project: Project, var content: String) : ExtensionL
109
115
add(toolbarWrapper)
110
116
add(collapsibleCodePanel)
111
117
add(collapsibleResultPanel)
112
- add(terminalWidget !! .component )
118
+ add(resizableTerminalPanel )
113
119
}
114
120
}
115
121
@@ -171,10 +177,10 @@ class TerminalLangSketch(val project: Project, var content: String) : ExtensionL
171
177
.setCancelButton(MinimizeButton (" Hide" ))
172
178
.setCancelCallback {
173
179
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()
178
184
true
179
185
}
180
186
.setFocusable(true )
@@ -303,3 +309,47 @@ class TerminalLangSketch(val project: Project, var content: String) : ExtensionL
303
309
}
304
310
}
305
311
}
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