@@ -25,7 +25,9 @@ import com.intellij.ui.awt.RelativePoint
25
25
import com.intellij.ui.components.JBList
26
26
import com.intellij.ui.components.JBPanel
27
27
import com.intellij.ui.components.JBScrollPane
28
+ import com.intellij.ui.scale.JBUIScale
28
29
import com.intellij.util.ui.JBUI
30
+ import com.intellij.util.ui.UIUtil
29
31
import ee.carlrobert.codegpt.CodeGPTBundle
30
32
import ee.carlrobert.codegpt.CodeGPTKeys.IS_PROMPT_TEXT_FIELD_DOCUMENT
31
33
import ee.carlrobert.codegpt.ui.textarea.header.tag.TagManager
@@ -39,10 +41,7 @@ import ee.carlrobert.codegpt.ui.textarea.popup.LookupListCellRenderer
39
41
import ee.carlrobert.codegpt.ui.textarea.popup.LookupListModel
40
42
import ee.carlrobert.codegpt.util.coroutines.runCatchingCancellable
41
43
import kotlinx.coroutines.*
42
- import java.awt.BorderLayout
43
- import java.awt.Dimension
44
- import java.awt.GraphicsEnvironment
45
- import java.awt.Point
44
+ import java.awt.*
46
45
import java.awt.event.KeyAdapter
47
46
import java.awt.event.KeyEvent
48
47
import java.awt.event.MouseAdapter
@@ -128,6 +127,9 @@ class PromptTextField(
128
127
.setResizable(true )
129
128
.setCancelOnClickOutside(true )
130
129
.setCancelOnWindowDeactivation(true )
130
+ .setShowBorder(true )
131
+ .setShowShadow(true )
132
+ .setBorderColor(JBColor .border())
131
133
.createPopup()
132
134
133
135
val relativePoint = calculateOptimalPopupPosition(editor, popupPanel)
@@ -170,6 +172,17 @@ class PromptTextField(
170
172
selectionMode = ListSelectionModel .SINGLE_SELECTION
171
173
if (model.size > 0 ) selectedIndex = 0
172
174
175
+ background = UIUtil .getListBackground()
176
+ foreground = UIUtil .getListForeground()
177
+ selectionBackground = UIUtil .getListSelectionBackground(true )
178
+ selectionForeground = UIUtil .getListSelectionForeground(true )
179
+
180
+ fixedCellHeight = JBUIScale .scale(20 )
181
+ border = JBUI .Borders .empty()
182
+
183
+ isFocusTraversalPolicyProvider = false
184
+ setFocusTraversalKeysEnabled(false )
185
+
173
186
addKeyListener(object : KeyAdapter () {
174
187
override fun keyPressed (e : KeyEvent ) {
175
188
when (e.keyCode) {
@@ -227,8 +240,22 @@ class PromptTextField(
227
240
}
228
241
229
242
private fun setupLayout () {
230
- border = JBUI .Borders .empty(5 )
231
- add(JBScrollPane (itemsList), BorderLayout .CENTER )
243
+ background = UIUtil .getListBackground()
244
+ border = JBUI .Borders .empty(4 )
245
+
246
+ isFocusTraversalPolicyProvider = false
247
+ setFocusTraversalKeysEnabled(false )
248
+
249
+ val scrollPane = JBScrollPane (itemsList).apply {
250
+ border = JBUI .Borders .empty()
251
+ viewport.background = UIUtil .getListBackground()
252
+ verticalScrollBarPolicy = JBScrollPane .VERTICAL_SCROLLBAR_AS_NEEDED
253
+ horizontalScrollBarPolicy = JBScrollPane .HORIZONTAL_SCROLLBAR_NEVER
254
+ isFocusTraversalPolicyProvider = false
255
+ setFocusTraversalKeysEnabled(false )
256
+ }
257
+
258
+ add(scrollPane, BorderLayout .CENTER )
232
259
233
260
addKeyListener(object : KeyAdapter () {
234
261
override fun keyPressed (e : KeyEvent ) {
@@ -257,6 +284,18 @@ class PromptTextField(
257
284
})
258
285
}
259
286
287
+ override fun paintComponent (g : Graphics ) {
288
+ val g2 = g.create() as Graphics2D
289
+ try {
290
+ g2.setRenderingHint(RenderingHints .KEY_ANTIALIASING , RenderingHints .VALUE_ANTIALIAS_ON )
291
+
292
+ g2.color = UIUtil .getListBackground()
293
+ g2.fillRoundRect(0 , 0 , width, height, JBUIScale .scale(8 ), JBUIScale .scale(8 ))
294
+ } finally {
295
+ g2.dispose()
296
+ }
297
+ }
298
+
260
299
private fun redirectKeyToEditor (e : KeyEvent ) {
261
300
editor?.let { editor ->
262
301
runInEdt {
@@ -284,21 +323,37 @@ class PromptTextField(
284
323
}
285
324
286
325
override fun getPreferredSize (): Dimension {
287
- val maxWidth = 450
288
- val minWidth = 300
289
- val minHeight = 150
290
- val maxHeight = 400
326
+ val maxWidth = JBUIScale .scale( 450 )
327
+ val minWidth = JBUIScale .scale( 300 )
328
+ val minHeight = JBUIScale .scale( 120 )
329
+ val maxHeight = JBUIScale .scale( 300 )
291
330
292
- val listSize = itemsList.preferredSize
293
- val contentWidth = listSize.width + 10
294
- val contentHeight = listSize.height + 10
331
+ val itemCount = itemsList.model.size
332
+ val itemHeight = JBUIScale .scale(20 )
333
+ val contentHeight = (itemCount * itemHeight) + 8
334
+ val contentWidth = calculateOptimalWidth()
295
335
296
336
val width = minOf(maxOf(contentWidth, minWidth), maxWidth)
297
337
val height = minOf(maxOf(contentHeight, minHeight), maxHeight)
298
338
299
339
return Dimension (width, height)
300
340
}
301
341
342
+ private fun calculateOptimalWidth (): Int {
343
+ var maxWidth = JBUIScale .scale(200 )
344
+ val fontMetrics = itemsList.getFontMetrics(itemsList.font)
345
+
346
+ for (i in 0 until itemsList.model.size) {
347
+ val item = itemsList.model.getElementAt(i)
348
+ val textWidth = fontMetrics.stringWidth(item.displayName)
349
+ val iconWidth = item.icon?.iconWidth ? : 0
350
+ val totalWidth = textWidth + iconWidth + JBUIScale .scale(32 )
351
+ maxWidth = maxOf(maxWidth, totalWidth)
352
+ }
353
+
354
+ return maxWidth
355
+ }
356
+
302
357
fun updateSearchFromEditor () {
303
358
editor?.let { editor ->
304
359
when (val result = getSearchTextAfterAt(editor)) {
0 commit comments