1
+ // filepath: /Volumes/source/ai/autocrud/core/src/main/kotlin/cc/unitmesh/devti/gui/AutoDevPlannerToolWindowFactory.kt
1
2
package cc.unitmesh.devti.gui
2
3
3
4
import cc.unitmesh.devti.inline.fullWidth
@@ -12,6 +13,7 @@ import com.intellij.openapi.project.DumbAware
12
13
import com.intellij.openapi.project.Project
13
14
import com.intellij.openapi.ui.SimpleToolWindowPanel
14
15
import com.intellij.openapi.ui.Splittable
16
+ import com.intellij.openapi.ui.DialogWrapper
15
17
import com.intellij.openapi.util.NlsActions
16
18
import com.intellij.openapi.wm.ToolWindow
17
19
import com.intellij.openapi.wm.ToolWindowFactory
@@ -20,7 +22,21 @@ import com.intellij.openapi.wm.ex.ToolWindowManagerListener
20
22
import com.intellij.ui.dsl.builder.panel
21
23
import com.intellij.util.ui.JBUI
22
24
import com.intellij.util.ui.UIUtil
25
+ import com.intellij.lang.Language
26
+ import com.intellij.openapi.editor.Document
27
+ import com.intellij.openapi.editor.colors.EditorColorsUtil
28
+ import com.intellij.openapi.editor.ex.EditorEx
29
+ import com.intellij.openapi.fileTypes.PlainTextLanguage
30
+ import com.intellij.psi.PsiFile
31
+ import com.intellij.ui.LanguageTextField
32
+ import com.intellij.ui.components.JBScrollPane
33
+ import com.intellij.lang.LanguageUtil
34
+ import com.intellij.openapi.application.runWriteAction
35
+ import com.intellij.openapi.fileTypes.FileTypeManager
23
36
import java.awt.BorderLayout
37
+ import java.awt.Dimension
38
+ import java.awt.FontMetrics
39
+ import javax.swing.JComponent
24
40
import java.util.concurrent.atomic.AtomicBoolean
25
41
26
42
class AutoDevPlannerToolWindowFactory : ToolWindowFactory , ToolWindowManagerListener , DumbAware {
@@ -112,4 +128,75 @@ class AutoDevPlanerTooWindow(val project: Project) : SimpleToolWindowPanel(true,
112
128
override fun dispose () {
113
129
114
130
}
115
- }
131
+
132
+ companion object {
133
+ fun showPlanEditor (project : Project , planText : String , callback : (String ) -> Unit ) {
134
+ val dialog = object : DialogWrapper (project) {
135
+ private val markdownEditor =
136
+ MarkdownLanguageField (project, planText, " Edit your plan here..." , " plan.md" )
137
+
138
+ init {
139
+ title = " Edit Plan"
140
+ // Ensure the text is properly set
141
+ if (markdownEditor.text.isEmpty() && planText.isNotEmpty()) {
142
+ markdownEditor.text = planText
143
+ }
144
+ init ()
145
+ }
146
+
147
+ override fun createCenterPanel (): JComponent {
148
+ val panel = JBScrollPane (markdownEditor)
149
+ panel.preferredSize = Dimension (800 , 600 )
150
+ return panel
151
+ }
152
+
153
+ override fun doOKAction () {
154
+ super .doOKAction()
155
+ callback(markdownEditor.text)
156
+ }
157
+ }
158
+
159
+ dialog.show()
160
+ }
161
+ }
162
+ }
163
+
164
+ private class MarkdownLanguageField (
165
+ private val myProject : Project ? ,
166
+ val value : String ,
167
+ private val placeholder : String ,
168
+ private val fileName : String
169
+ ) : LanguageTextField(
170
+ LanguageUtil .getFileTypeLanguage(FileTypeManager .getInstance().getFileTypeByExtension("md")), myProject, value,
171
+ object : SimpleDocumentCreator () {
172
+ override fun createDocument(value: String? , language: Language ? , project: Project ? ): Document {
173
+ return createDocument(value, language, project, this)
174
+ }
175
+
176
+ override fun customizePsiFile(file: PsiFile ? ) {
177
+ file?.name = fileName
178
+ }
179
+ }
180
+ ) {
181
+ override fun createEditor (): EditorEx {
182
+ return super .createEditor().apply {
183
+ setShowPlaceholderWhenFocused(true )
184
+ setHorizontalScrollbarVisible(true )
185
+ setVerticalScrollbarVisible(true )
186
+ setPlaceholder(placeholder)
187
+
188
+ val scheme = EditorColorsUtil .getColorSchemeForBackground(this .colorsScheme.defaultBackground)
189
+ this .colorsScheme = this .createBoundColorSchemeDelegate(scheme)
190
+
191
+ val metrics: FontMetrics = getFontMetrics(font)
192
+ val columnWidth = metrics.charWidth(' m' )
193
+ isOneLineMode = false
194
+ preferredSize = Dimension (50 * columnWidth, 30 * metrics.height)
195
+
196
+ settings.isLineNumbersShown = true
197
+ settings.isLineMarkerAreaShown = true
198
+ settings.isFoldingOutlineShown = true
199
+ }
200
+ }
201
+ }
202
+
0 commit comments