Skip to content

Commit 741dda8

Browse files
committed
feat(gui): add support for auto-completion popup in chat input #51
The chat input now features an auto-completion popup, which is triggered when the user inputs a specific character (e.g., '$' or '¥'). This enhancement improves the user experience by providing suggestions to the user, making the chat input more intuitive and efficient. The popup is implemented using the `JBPopupFactory` and is created dynamically when needed.
1 parent 88b4633 commit 741dda8

File tree

3 files changed

+20
-2
lines changed

3 files changed

+20
-2
lines changed

src/main/kotlin/cc/unitmesh/devti/counit/CustomAgentChatProcessor.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import com.intellij.openapi.components.Service
1414
import com.intellij.openapi.diagnostic.logger
1515
import com.intellij.openapi.project.Project
1616
import kotlinx.coroutines.launch
17+
import kotlinx.coroutines.flow.*
1718
import kotlinx.coroutines.runBlocking
1819

1920
@Service(Service.Level.PROJECT)

src/main/kotlin/cc/unitmesh/devti/gui/chat/AutoDevInput.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package cc.unitmesh.devti.gui.chat
22

33
import cc.unitmesh.devti.AutoDevBundle
4-
import com.intellij.temporary.gui.block.findDocument
54
import cc.unitmesh.devti.util.parser.Code.Companion.findLanguage
65
import com.intellij.openapi.Disposable
76
import com.intellij.openapi.actionSystem.*
@@ -19,12 +18,14 @@ import com.intellij.openapi.fileTypes.FileTypes
1918
import com.intellij.openapi.project.DumbAwareAction
2019
import com.intellij.openapi.project.Project
2120
import com.intellij.openapi.vfs.VirtualFile
21+
import com.intellij.temporary.gui.block.findDocument
2222
import com.intellij.testFramework.LightVirtualFile
2323
import com.intellij.ui.EditorTextField
2424
import com.intellij.util.EventDispatcher
2525
import com.intellij.util.messages.MessageBusConnection
2626
import com.intellij.util.ui.JBUI
2727
import java.awt.Color
28+
import java.awt.event.KeyAdapter
2829
import java.awt.event.KeyEvent
2930
import java.util.*
3031
import javax.swing.KeyStroke
@@ -81,7 +82,6 @@ class AutoDevInput(
8182
), this
8283
)
8384

84-
8585
val connect: MessageBusConnection = project.messageBus.connect(disposable ?: this)
8686
val topic = AnActionListener.TOPIC
8787
connect.subscribe(topic, object : AnActionListener {

src/main/kotlin/cc/unitmesh/devti/gui/chat/AutoDevInputSection.kt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import com.intellij.openapi.project.Project
2121
import com.intellij.openapi.ui.ComboBox
2222
import com.intellij.openapi.ui.ComponentValidator
2323
import com.intellij.openapi.ui.ValidationInfo
24+
import com.intellij.openapi.ui.popup.JBPopup
25+
import com.intellij.openapi.ui.popup.JBPopupFactory
2426
import com.intellij.openapi.wm.IdeFocusManager
2527
import com.intellij.openapi.wm.impl.InternalDecorator
2628
import com.intellij.temporary.gui.block.AutoDevCoolBorder
@@ -44,6 +46,7 @@ import java.awt.event.MouseEvent
4446
import java.util.function.Supplier
4547
import javax.swing.Box
4648
import javax.swing.JComponent
49+
import javax.swing.JTextField
4750
import kotlin.math.max
4851
import kotlin.math.min
4952

@@ -61,6 +64,8 @@ class AutoDevInputSection(private val project: Project, val disposable: Disposab
6164

6265
private val logger = logger<AutoDevInputSection>()
6366

67+
private var popup: JBPopup? = null
68+
6469
val editorListeners = EventDispatcher.create(AutoDevInputListener::class.java)
6570
private var tokenizer: Tokenizer? = null
6671
var text: String
@@ -97,8 +102,20 @@ class AutoDevInputSection(private val project: Project, val disposable: Disposab
97102
if (i != input.height) {
98103
revalidate()
99104
}
105+
106+
// check new input == $
107+
if (event.newFragment.contentEquals("$") || event.newFragment.contentEquals("¥")) {
108+
popup?.show(this@AutoDevInputSection)
109+
}
100110
}
101111
}
112+
113+
popup = JBPopupFactory.getInstance().createComponentPopupBuilder(JTextField(""), null)
114+
.setRequestFocus(false)
115+
.setMinSize(
116+
Dimension(200, 200)
117+
).createPopup()
118+
102119
input.addDocumentListener(documentListener)
103120
input.recreateDocument()
104121

0 commit comments

Comments
 (0)