IDEA-299042 Run widget popup: inline actions have incorrect width
[idea/community.git] / platform / platform-impl / src / com / intellij / ui / popup / list / PopupInlineActionsSupportImpl.kt
index 00e839b23e984ddf0d355043a391eba02f330fe5..abced35be1bb2778866d8a7402fc4f5530e09ac4 100644 (file)
@@ -4,17 +4,20 @@ package com.intellij.ui.popup.list
 import com.intellij.icons.AllIcons
 import com.intellij.openapi.actionSystem.AnAction
 import com.intellij.ui.ExperimentalUI
+import com.intellij.ui.components.panels.Wrapper
 import com.intellij.ui.popup.ActionPopupStep
 import com.intellij.ui.popup.PopupFactoryImpl.ActionItem
 import com.intellij.ui.popup.PopupFactoryImpl.InlineActionItem
 import com.intellij.ui.popup.list.ListPopupImpl.ListWithInlineButtons
+import com.intellij.ui.scale.JBUIScale
 import com.intellij.util.ui.JBInsets
 import com.intellij.util.ui.JBUI
-import java.awt.BorderLayout
 import java.awt.Point
 import java.awt.event.InputEvent
 import javax.swing.*
 
+private const val INLINE_BUTTON_WIDTH = 16
+
 class PopupInlineActionsSupportImpl(private val myListPopup: ListPopupImpl) : PopupInlineActionsSupport {
 
   private val myStep = myListPopup.listStep as ActionPopupStep
@@ -41,11 +44,10 @@ class PopupInlineActionsSupportImpl(private val myListPopup: ListPopupImpl) : Po
     if (buttonsCount <= 0) return null
 
     val distanceToRight = bounds.x + bounds.width - point.x
-    val buttonsToRight = distanceToRight / (PopupListElementRenderer.INLINE_BUTTON_WIDTH + PopupListElementRenderer.INLINE_BUTTONS_GAP)
+    val buttonsToRight = distanceToRight / buttonWidth()
     if (buttonsToRight >= buttonsCount) return null
 
-    val distanceToNearest = distanceToRight - buttonsToRight * (PopupListElementRenderer.INLINE_BUTTON_WIDTH + PopupListElementRenderer.INLINE_BUTTONS_GAP)
-    return if (distanceToNearest > PopupListElementRenderer.INLINE_BUTTON_WIDTH) null else buttonsCount - buttonsToRight - 1
+    return buttonsCount - buttonsToRight - 1
   }
 
   override fun runInlineAction(element: Any, index: Int, event: InputEvent?) = getExtraButtonsActions(element, event)[index].run()
@@ -89,10 +91,11 @@ class PopupInlineActionsSupportImpl(private val myListPopup: ListPopupImpl) : Po
 
   private fun createExtraButton(icon: Icon, active: Boolean): JComponent {
     val label = JLabel(icon)
-    val panel = JPanel(BorderLayout())
-    panel.add(label)
+    val leftRightInsets = JBUI.CurrentTheme.List.buttonLeftRightInsets()
+    label.border = JBUI.Borders.empty(0, leftRightInsets)
+    val panel = Wrapper(label)
     val size = panel.preferredSize
-    size.width = PopupListElementRenderer.INLINE_BUTTON_WIDTH
+    size.width = buttonWidth(leftRightInsets)
     panel.preferredSize = size
     panel.minimumSize = size
     panel.isOpaque = active
@@ -100,10 +103,9 @@ class PopupInlineActionsSupportImpl(private val myListPopup: ListPopupImpl) : Po
     return panel
   }
 
-  private fun createNextStepRunnable(element: ActionItem) =
-    Runnable { myListPopup.showNextStepPopup(myStep.onChosen(element, false), element) }
+  private fun buttonWidth(leftRightInsets: Int = JBUI.CurrentTheme.List.buttonLeftRightInsets()) : Int = JBUIScale.scale(INLINE_BUTTON_WIDTH + leftRightInsets * 2)
 
-  private fun createInlineActionRunnable(action: AnAction, inputEvent: InputEvent?) = Runnable {
-    myStep.performAction(action, inputEvent)
-  }
+  private fun createNextStepRunnable(element: ActionItem) = Runnable { myListPopup.showNextStepPopup(myStep.onChosen(element, false), element) }
+
+  private fun createInlineActionRunnable(action: AnAction, inputEvent: InputEvent?) = Runnable { myStep.performAction(action, inputEvent) }
 }
\ No newline at end of file