diff --git a/src/main/kotlin/ee/carlrobert/codegpt/ui/textarea/header/tag/TagPanel.kt b/src/main/kotlin/ee/carlrobert/codegpt/ui/textarea/header/tag/TagPanel.kt index 92d5ceee..7aa3b854 100644 --- a/src/main/kotlin/ee/carlrobert/codegpt/ui/textarea/header/tag/TagPanel.kt +++ b/src/main/kotlin/ee/carlrobert/codegpt/ui/textarea/header/tag/TagPanel.kt @@ -9,7 +9,12 @@ import com.intellij.util.IconUtil import com.intellij.util.ui.JBUI import ee.carlrobert.codegpt.ui.textarea.PromptTextField import ee.carlrobert.codegpt.ui.textarea.header.PaintUtil -import java.awt.* +import java.awt.Cursor +import java.awt.Dimension +import java.awt.Graphics +import java.awt.GridBagConstraints +import java.awt.GridBagLayout +import javax.swing.BorderFactory import javax.swing.Icon import javax.swing.JButton import javax.swing.JToggleButton @@ -46,7 +51,7 @@ abstract class TagPanel( val closeButtonWidth = if (closeButton.isVisible) closeButton.preferredSize.width else 0 return Dimension( label.preferredSize.width + closeButtonWidth + insets.left + insets.right, - 20 + JBUI.scale(20) ) } @@ -134,8 +139,13 @@ abstract class TagPanel( onClose() } - preferredSize = Dimension(Close.iconWidth, Close.iconHeight) - border = JBUI.Borders.emptyLeft(4) + val iconSize = Dimension(Close.iconWidth, Close.iconHeight) + preferredSize = iconSize + minimumSize = iconSize + maximumSize = iconSize + + border = BorderFactory.createEmptyBorder(0, 4, 0, 4) + isContentAreaFilled = false toolTipText = "Remove" rolloverIcon = AllIcons.Actions.CloseHovered diff --git a/src/main/kotlin/ee/carlrobert/codegpt/ui/textarea/suggestion/SuggestionsPopupManager.kt b/src/main/kotlin/ee/carlrobert/codegpt/ui/textarea/suggestion/SuggestionsPopupManager.kt index 0fc0a318..b8384818 100644 --- a/src/main/kotlin/ee/carlrobert/codegpt/ui/textarea/suggestion/SuggestionsPopupManager.kt +++ b/src/main/kotlin/ee/carlrobert/codegpt/ui/textarea/suggestion/SuggestionsPopupManager.kt @@ -4,8 +4,20 @@ import com.intellij.openapi.project.Project import com.intellij.openapi.ui.popup.JBPopup import com.intellij.vcsUtil.showAbove import ee.carlrobert.codegpt.ui.textarea.UserInputPanel -import ee.carlrobert.codegpt.ui.textarea.suggestion.item.* -import kotlinx.coroutines.* +import ee.carlrobert.codegpt.ui.textarea.suggestion.item.DocumentationSuggestionGroupItem +import ee.carlrobert.codegpt.ui.textarea.suggestion.item.FileSuggestionGroupItem +import ee.carlrobert.codegpt.ui.textarea.suggestion.item.FolderSuggestionGroupItem +import ee.carlrobert.codegpt.ui.textarea.suggestion.item.GitSuggestionGroupItem +import ee.carlrobert.codegpt.ui.textarea.suggestion.item.PersonaSuggestionGroupItem +import ee.carlrobert.codegpt.ui.textarea.suggestion.item.SuggestionActionItem +import ee.carlrobert.codegpt.ui.textarea.suggestion.item.SuggestionGroupItem +import ee.carlrobert.codegpt.ui.textarea.suggestion.item.SuggestionItem +import ee.carlrobert.codegpt.ui.textarea.suggestion.item.WebSearchActionItem +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import java.awt.Dimension import java.awt.Point import javax.swing.DefaultListModel @@ -20,7 +32,7 @@ class SuggestionsPopupManager( private val scope = CoroutineScope(Dispatchers.Default + SupervisorJob()) private var selectedActionGroup: SuggestionGroupItem? = null private var popup: JBPopup? = null - private var originalLocation: Point? = null + private val listModel = DefaultListModel<SuggestionItem>().apply { addListDataListener(object : ListDataListener { override fun intervalAdded(e: ListDataEvent) = adjustPopupSize() @@ -44,12 +56,12 @@ class SuggestionsPopupManager( popup = SuggestionsPopupBuilder() .setPreferableFocusComponent(component) .setOnCancel { - originalLocation = null true } .build(list) + popup?.showAbove(userInputPanel) - originalLocation = userInputPanel.locationOnScreen + reset(true) selectNext() } @@ -117,9 +129,18 @@ class SuggestionsPopupManager( list.repaint() popup?.size = Dimension(list.preferredSize.width, list.preferredSize.height + 32) - originalLocation?.let { original -> - val newY = original.y - list.preferredSize.height - 32 - popup?.setLocation(Point(original.x, maxOf(newY, 0))) - } + + val bounds = userInputPanel.bounds + val locationOnScreen = userInputPanel.locationOnScreen + + val deviceConfiguration = userInputPanel.graphicsConfiguration + val screenBounds = deviceConfiguration.bounds + + val popupSize = popup?.size ?: Dimension(0, 0) + val newY = locationOnScreen.y - popupSize.height + + val adjustedY = if (newY < screenBounds.y) locationOnScreen.y + bounds.height else newY + + popup?.setLocation(Point(locationOnScreen.x, adjustedY)) } }