Skip to content

Commit 9c0edc8

Browse files
committed
feat(plan): add edit plan functionality #331
- Introduce EditPlanAction to allow editing of plans in the UI - Add showPlanEditor method in AutoDevPlannerToolWindowFactory for plan editing - Implement MarkdownLanguageField for markdown-based plan editing
1 parent 92c0368 commit 9c0edc8

File tree

4 files changed

+113
-3
lines changed

4 files changed

+113
-3
lines changed

core/src/233/main/resources/META-INF/autodev-core.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,8 @@
421421
<group id="AutoDevPlanner.ToolWindow.TitleActions">
422422
<action id="ReviewPlan" icon="AllIcons.General.InspectionsEye"
423423
class="cc.unitmesh.devti.observer.plan.PlanReviewAction"/>
424+
<action id="EditPlan" icon="AllIcons.Actions.EditScheme"
425+
class="cc.unitmesh.devti.observer.plan.EditPlanAction"/>
424426
<separator/>
425427
</group>
426428
</actions>

core/src/main/kotlin/cc/unitmesh/devti/gui/AutoDevPlannerToolWindowFactory.kt

Lines changed: 88 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
// filepath: /Volumes/source/ai/autocrud/core/src/main/kotlin/cc/unitmesh/devti/gui/AutoDevPlannerToolWindowFactory.kt
12
package cc.unitmesh.devti.gui
23

34
import cc.unitmesh.devti.inline.fullWidth
@@ -12,6 +13,7 @@ import com.intellij.openapi.project.DumbAware
1213
import com.intellij.openapi.project.Project
1314
import com.intellij.openapi.ui.SimpleToolWindowPanel
1415
import com.intellij.openapi.ui.Splittable
16+
import com.intellij.openapi.ui.DialogWrapper
1517
import com.intellij.openapi.util.NlsActions
1618
import com.intellij.openapi.wm.ToolWindow
1719
import com.intellij.openapi.wm.ToolWindowFactory
@@ -20,7 +22,21 @@ import com.intellij.openapi.wm.ex.ToolWindowManagerListener
2022
import com.intellij.ui.dsl.builder.panel
2123
import com.intellij.util.ui.JBUI
2224
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
2336
import java.awt.BorderLayout
37+
import java.awt.Dimension
38+
import java.awt.FontMetrics
39+
import javax.swing.JComponent
2440
import java.util.concurrent.atomic.AtomicBoolean
2541

2642
class AutoDevPlannerToolWindowFactory : ToolWindowFactory, ToolWindowManagerListener, DumbAware {
@@ -112,4 +128,75 @@ class AutoDevPlanerTooWindow(val project: Project) : SimpleToolWindowPanel(true,
112128
override fun dispose() {
113129

114130
}
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+
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package cc.unitmesh.devti.observer.plan
2+
3+
import cc.unitmesh.devti.gui.AutoDevPlanerTooWindow
4+
import com.intellij.openapi.actionSystem.AnAction
5+
import com.intellij.openapi.actionSystem.AnActionEvent
6+
import cc.unitmesh.devti.observer.agent.AgentStateService
7+
8+
class EditPlanAction : AnAction() {
9+
override fun actionPerformed(event: AnActionEvent) {
10+
val project = event.project ?: return
11+
12+
val agentStateService = project.getService(AgentStateService::class.java)
13+
val currentPlan = agentStateService.getPlan()
14+
val planString = MarkdownPlanParser.formatPlanToMarkdown(currentPlan)
15+
16+
AutoDevPlanerTooWindow.showPlanEditor(project, planString) { newPlan ->
17+
val newPlanItems = MarkdownPlanParser.parse(newPlan)
18+
if (newPlanItems.isNotEmpty()) {
19+
agentStateService.updatePlan(newPlanItems.toMutableList())
20+
}
21+
}
22+
}
23+
}

core/src/main/kotlin/cc/unitmesh/devti/observer/plan/PlanReviewAction.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
// filepath: /Volumes/source/ai/autocrud/core/src/main/kotlin/cc/unitmesh/devti/observer/plan/PlanReviewAction.kt
21
package cc.unitmesh.devti.observer.plan
32

43
import cc.unitmesh.devti.AutoDevNotifications
@@ -10,7 +9,6 @@ import cc.unitmesh.devti.template.GENIUS_CODE
109
import cc.unitmesh.devti.template.TemplateRender
1110
import cc.unitmesh.devti.util.AutoDevCoroutineScope
1211
import cc.unitmesh.devti.util.parser.CodeFence
13-
import com.intellij.execution.ui.ConsoleViewContentType
1412
import com.intellij.openapi.actionSystem.ActionUpdateThread
1513
import com.intellij.openapi.actionSystem.AnAction
1614
import com.intellij.openapi.actionSystem.AnActionEvent

0 commit comments

Comments
 (0)