@@ -4,8 +4,20 @@ import com.intellij.openapi.project.Project
4
4
import com.intellij.openapi.ui.popup.JBPopup
5
5
import com.intellij.vcsUtil.showAbove
6
6
import ee.carlrobert.codegpt.ui.textarea.UserInputPanel
7
- import ee.carlrobert.codegpt.ui.textarea.suggestion.item.*
8
- import kotlinx.coroutines.*
7
+ import ee.carlrobert.codegpt.ui.textarea.suggestion.item.DocumentationSuggestionGroupItem
8
+ import ee.carlrobert.codegpt.ui.textarea.suggestion.item.FileSuggestionGroupItem
9
+ import ee.carlrobert.codegpt.ui.textarea.suggestion.item.FolderSuggestionGroupItem
10
+ import ee.carlrobert.codegpt.ui.textarea.suggestion.item.GitSuggestionGroupItem
11
+ import ee.carlrobert.codegpt.ui.textarea.suggestion.item.PersonaSuggestionGroupItem
12
+ import ee.carlrobert.codegpt.ui.textarea.suggestion.item.SuggestionActionItem
13
+ import ee.carlrobert.codegpt.ui.textarea.suggestion.item.SuggestionGroupItem
14
+ import ee.carlrobert.codegpt.ui.textarea.suggestion.item.SuggestionItem
15
+ import ee.carlrobert.codegpt.ui.textarea.suggestion.item.WebSearchActionItem
16
+ import kotlinx.coroutines.CoroutineScope
17
+ import kotlinx.coroutines.Dispatchers
18
+ import kotlinx.coroutines.SupervisorJob
19
+ import kotlinx.coroutines.launch
20
+ import kotlinx.coroutines.withContext
9
21
import java.awt.Dimension
10
22
import java.awt.Point
11
23
import javax.swing.DefaultListModel
@@ -20,7 +32,7 @@ class SuggestionsPopupManager(
20
32
private val scope = CoroutineScope (Dispatchers .Default + SupervisorJob ())
21
33
private var selectedActionGroup: SuggestionGroupItem ? = null
22
34
private var popup: JBPopup ? = null
23
- private var originalLocation : Point ? = null
35
+
24
36
private val listModel = DefaultListModel <SuggestionItem >().apply {
25
37
addListDataListener(object : ListDataListener {
26
38
override fun intervalAdded (e : ListDataEvent ) = adjustPopupSize()
@@ -44,12 +56,12 @@ class SuggestionsPopupManager(
44
56
popup = SuggestionsPopupBuilder ()
45
57
.setPreferableFocusComponent(component)
46
58
.setOnCancel {
47
- originalLocation = null
48
59
true
49
60
}
50
61
.build(list)
62
+
51
63
popup?.showAbove(userInputPanel)
52
- originalLocation = userInputPanel.locationOnScreen
64
+
53
65
reset(true )
54
66
selectNext()
55
67
}
@@ -117,9 +129,18 @@ class SuggestionsPopupManager(
117
129
list.repaint()
118
130
119
131
popup?.size = Dimension (list.preferredSize.width, list.preferredSize.height + 32 )
120
- originalLocation?.let { original ->
121
- val newY = original.y - list.preferredSize.height - 32
122
- popup?.setLocation(Point (original.x, maxOf(newY, 0 )))
123
- }
132
+
133
+ val bounds = userInputPanel.bounds
134
+ val locationOnScreen = userInputPanel.locationOnScreen
135
+
136
+ val deviceConfiguration = userInputPanel.graphicsConfiguration
137
+ val screenBounds = deviceConfiguration.bounds
138
+
139
+ val popupSize = popup?.size ? : Dimension (0 , 0 )
140
+ val newY = locationOnScreen.y - popupSize.height
141
+
142
+ val adjustedY = if (newY < screenBounds.y) locationOnScreen.y + bounds.height else newY
143
+
144
+ popup?.setLocation(Point (locationOnScreen.x, adjustedY))
124
145
}
125
146
}
0 commit comments