@@ -113,36 +113,76 @@ class TerminalSketchProvider : LanguageSketchProvider {
113
113
val executeAction = object :
114
114
AnAction (" Execute" , AutoDevBundle .message(" sketch.terminal.execute" ), AllIcons .Actions .Execute ) {
115
115
override fun actionPerformed (e : AnActionEvent ) {
116
+ // Using our standalone writer to update UI in real-time
117
+ val stdWriter = UIUpdatingWriter (
118
+ onTextUpdate = { text, complete ->
119
+ resultSketch.updateViewText(text, complete)
120
+ },
121
+ onPanelUpdate = { title, _ ->
122
+ collapsibleResultPanel.setTitle(title)
123
+ },
124
+ checkCollapsed = {
125
+ collapsibleResultPanel.isCollapsed()
126
+ },
127
+ expandPanel = {
128
+ collapsibleResultPanel.expand()
129
+ }
130
+ )
131
+
132
+ val errWriter = UIUpdatingWriter (
133
+ onTextUpdate = { text, complete ->
134
+ resultSketch.updateViewText(text, complete)
135
+ },
136
+ onPanelUpdate = { title, _ ->
137
+ collapsibleResultPanel.setTitle(title)
138
+ },
139
+ checkCollapsed = {
140
+ collapsibleResultPanel.isCollapsed()
141
+ },
142
+ expandPanel = {
143
+ collapsibleResultPanel.expand()
144
+ }
145
+ )
146
+
147
+ // Reset result and prepare UI for execution
148
+ resultSketch.updateViewText(" " , true )
149
+ stdWriter.setExecuting(true )
150
+
116
151
AutoDevCoroutineScope .scope(project).launch {
117
152
val executor = ProcessExecutor (project)
118
- val runResult = executor.executeCode(
119
- getViewText(),
120
- PooledThreadExecutor .INSTANCE .asCoroutineDispatcher()
121
- )
122
-
123
- ApplicationManager .getApplication().invokeLater {
124
- val resultText = if (runResult.exitCode != 0 ) {
125
- " ${runResult.stdOutput} \n ${runResult.errOutput} " .trim()
126
- } else {
127
- runResult.stdOutput
153
+ try {
154
+ // Direct call to exec instead of executeCode
155
+ val exitCode = executor.exec(
156
+ getViewText(),
157
+ stdWriter,
158
+ errWriter,
159
+ PooledThreadExecutor .INSTANCE .asCoroutineDispatcher()
160
+ )
161
+
162
+ // Execution finished
163
+ ApplicationManager .getApplication().invokeLater {
164
+ stdWriter.setExecuting(false )
165
+
166
+ // Ensure result panel is expanded
167
+ if (collapsibleResultPanel.isCollapsed()) {
168
+ collapsibleResultPanel.expand()
169
+ }
128
170
}
129
-
130
- resultSketch.updateViewText(resultText, true )
131
-
132
- if (collapsibleResultPanel.isCollapsed()) {
133
- collapsibleResultPanel.expand()
134
- }
135
-
136
- if (runResult.exitCode != 0 ) {
137
- collapsibleResultPanel.setTitle(" Execution Results (Error: ${runResult.exitCode} )" )
138
- } else {
139
- collapsibleResultPanel.setTitle(" Execution Results" )
171
+ } catch (ex: Exception ) {
172
+ ApplicationManager .getApplication().invokeLater {
173
+ stdWriter.setExecuting(false )
174
+ resultSketch.updateViewText(
175
+ " ${stdWriter.getContent()} \n Error: ${ex.message} " ,
176
+ true
177
+ )
178
+ collapsibleResultPanel.setTitle(" Execution Results (Error)" )
140
179
}
141
180
}
142
181
}
143
182
}
144
183
}
145
184
185
+ // ... existing code for other actions ...
146
186
val copyAction = object :
147
187
AnAction (" Copy" , AutoDevBundle .message(" sketch.terminal.copy.text" ), AllIcons .Actions .Copy ) {
148
188
override fun actionPerformed (e : AnActionEvent ) {
@@ -181,6 +221,7 @@ class TerminalSketchProvider : LanguageSketchProvider {
181
221
return listOf (executeAction, copyAction, sendAction, popupAction)
182
222
}
183
223
224
+ // ... existing code ...
184
225
private fun executePopup (terminalWidget : JBTerminalWidget ? , project : Project ): MouseAdapter =
185
226
object : MouseAdapter () {
186
227
override fun mouseClicked (e : MouseEvent ? ) {
@@ -240,7 +281,7 @@ class TerminalSketchProvider : LanguageSketchProvider {
240
281
override fun updateLanguage (language : Language ? , originLanguage : String? ) {}
241
282
override fun dispose () {
242
283
codeSketch.dispose()
243
- resultSketch.dispose() // Make sure to dispose resultSketch
284
+ resultSketch.dispose()
244
285
}
245
286
}
246
287
}
0 commit comments