11package org.wavescale.sourcesync.action
22
3- import com.intellij.openapi.actionSystem.ActionGroup
4- import com.intellij.openapi.actionSystem.ActionManager
5- import com.intellij.openapi.actionSystem.AnAction
6- import com.intellij.openapi.actionSystem.AnActionEvent
7- import com.intellij.openapi.actionSystem.DataContext
8- import com.intellij.openapi.actionSystem.DefaultActionGroup
9- import com.intellij.openapi.actionSystem.PlatformDataKeys
10- import com.intellij.openapi.actionSystem.Presentation
11- import com.intellij.openapi.actionSystem.Separator
12- import com.intellij.openapi.actionSystem.ToggleAction
13- import com.intellij.openapi.actionSystem.Toggleable
14- import com.intellij.openapi.actionSystem.ex.CustomComponentAction
15- import com.intellij.openapi.actionSystem.impl.ActionButtonWithText
3+ import com.intellij.ide.ui.laf.darcula.ui.ToolbarComboWidgetUI
4+ import com.intellij.openapi.actionSystem.*
165import com.intellij.openapi.components.service
17- import com.intellij.openapi.project.DumbAware
18- import com.intellij.openapi.ui.popup.ListPopup
19- import com.intellij.openapi.ui.popup.PopupStep
6+ import com.intellij.openapi.ui.popup.JBPopup
7+ import com.intellij.openapi.wm.impl.ExpandableComboAction
8+ import com.intellij.openapi.wm.impl.ToolbarComboWidget
209import com.intellij.ui.components.JBList
2110import com.intellij.ui.popup.PopupFactoryImpl
22- import com.intellij.ui.popup.WizardPopup
23- import com.intellij.ui.popup.util.PopupImplUtil
24- import com.intellij.util.ui.JBDimension
25- import com.intellij.util.ui.JBInsets
26- import com.intellij.util.ui.JBUI
2711import org.wavescale.sourcesync.SourceSyncIcons
2812import org.wavescale.sourcesync.SourcesyncBundle
2913import org.wavescale.sourcesync.factory.ConfigConnectionFactory
3014import org.wavescale.sourcesync.factory.ConnectionConfig
3115import org.wavescale.sourcesync.services.SyncStatusService
32- import java.awt.Graphics
33- import java.awt.Insets
3416import javax.swing.JComponent
35- import javax.swing.SwingConstants
3617
37- internal const val MINIMAL_POPUP_WIDTH = 270
38-
39- class NewUIConnectionConfigurationSelector : ConnectionTogglePopupAction (), CustomComponentAction, DumbAware {
18+ class NewUIConnectionConfigurationSelector : ExpandableComboAction () {
4019 private val syncStatusService = service<SyncStatusService >()
20+ override fun getActionUpdateThread () = ActionUpdateThread .BGT
4121 override fun displayTextInToolbar () = true
22+
23+ override fun createPopup (event : AnActionEvent ): JBPopup {
24+ return SourceSyncConfigurationActionGroupPopup (createActionGroup(), event.dataContext) { Toggleable .setSelected(event.presentation, false ) }
25+ }
26+
4227 override fun createCustomComponent (presentation : Presentation , place : String ): JComponent {
43- return object : ActionButtonWithText (this , presentation, place, JBUI .size(90 , 30 )) {
44- override fun getMargins (): Insets = JBInsets .create(0 , 10 )
45- override fun iconTextSpace (): Int = JBUI .scale(10 )
46- override fun shallPaintDownArrow () = true
47-
48- override fun paint (g : Graphics ) {
49- super .paint(g)
50- presentation.icon = if (syncStatusService.isAnySyncJobRunning()) {
51- SourceSyncIcons .ExpUI .SOURCESYNC_RUNNING
52- } else {
53- SourceSyncIcons .ExpUI .SOURCESYNC
54- }
55- }
56- }.also {
57- it.setHorizontalTextAlignment(SwingConstants .LEFT )
28+ val comp = super .createCustomComponent(presentation, place)
29+ (comp.ui as ? ToolbarComboWidgetUI )?.setMaxWidth(Int .MAX_VALUE )
30+ return comp
31+ }
32+
33+ override fun updateCustomComponent (component : JComponent , presentation : Presentation ) {
34+ val widget = component as ? ToolbarComboWidget ? : return
35+ (widget.ui as ? ToolbarComboWidgetUI )?.setMaxWidth(500 )
36+ if (syncStatusService.isAnySyncJobRunning()) {
37+ widget.leftIcons = listOfNotNull(SourceSyncIcons .ExpUI .SOURCESYNC_RUNNING )
38+ } else {
39+ widget.leftIcons = listOfNotNull(SourceSyncIcons .ExpUI .SOURCESYNC )
5840 }
41+
42+ widget.text = presentation.text
43+ widget.toolTipText = presentation.description
5944 }
6045
6146 override fun update (e : AnActionEvent ) {
@@ -90,47 +75,22 @@ class NewUIConnectionConfigurationSelector : ConnectionTogglePopupAction(), Cust
9075 }
9176}
9277
93- abstract class ConnectionTogglePopupAction : ToggleAction {
94- constructor ()
9578
96- override fun isSelected (e : AnActionEvent ): Boolean {
97- return Toggleable .isSelected(e.presentation)
98- }
99-
100- override fun setSelected (e : AnActionEvent , state : Boolean ) {
101- if (! state) return
102- val presentation = e.presentation
103- val component = e.inputEvent?.component as ? JComponent ? : return
104- val actionGroup = getActionGroup(e)
105- val disposeCallback = { Toggleable .setSelected(presentation, false ) }
106- val popup = createPopup(actionGroup, e, disposeCallback)
107- PopupImplUtil .setPopupToggleButton(popup, e.inputEvent.component)
108- popup.setMinimumSize(JBDimension (MINIMAL_POPUP_WIDTH , 0 ))
109- popup.showUnderneathOf(component)
110- }
111-
112- private fun createPopup (
113- actionGroup : ActionGroup ,
114- e : AnActionEvent ,
115- disposeCallback : () -> Unit
116- ): ListPopup = SourceSyncConfigurationActionGroupPopup (actionGroup, e.dataContext, disposeCallback)
117-
118- private fun getActionGroup (e : AnActionEvent ): ActionGroup {
119- val allActionsGroup = DefaultActionGroup ()
120- allActionsGroup.add(Separator .create(SourcesyncBundle .message(" sourcesyncConfigurations" )))
121- ConfigConnectionFactory .getInstance().connectionNames.forEach {
122- allActionsGroup.add(
123- SourceSyncConfigAction (
124- it
125- )
79+ private fun createActionGroup (): ActionGroup {
80+ val allActionsGroup = DefaultActionGroup ()
81+ allActionsGroup.add(Separator .create(SourcesyncBundle .message(" sourcesyncConfigurations" )))
82+ ConfigConnectionFactory .getInstance().connectionNames.forEach {
83+ allActionsGroup.add(
84+ SourceSyncConfigAction (
85+ it
12686 )
127- }
87+ )
88+ }
12889
129- allActionsGroup.add(Separator .create())
130- allActionsGroup.add(ActionManager .getInstance().getAction(" actionSourceSyncMenu" ))
90+ allActionsGroup.add(Separator .create())
91+ allActionsGroup.add(ActionManager .getInstance().getAction(" actionSourceSyncMenu" ))
13192
132- return allActionsGroup
133- }
93+ return allActionsGroup
13494}
13595
13696class SourceSyncConfigurationActionGroupPopup (
@@ -155,12 +115,6 @@ class SourceSyncConfigurationActionGroupPopup(
155115 (list as ? JBList <* >)?.setExpandableItemsEnabled(false )
156116 }
157117
158- override fun createPopup (parent : WizardPopup ? , step : PopupStep <* >? , parentValue : Any? ): WizardPopup {
159- val popup = super .createPopup(parent, step, parentValue)
160- popup.setMinimumSize(JBDimension (MINIMAL_POPUP_WIDTH , 0 ))
161- return popup
162- }
163-
164118 override fun shouldBeShowing (value : Any? ) = true
165119}
166120
@@ -171,6 +125,8 @@ class SourceSyncConfigAction(private val configuration: String) : AnAction() {
171125 presentation.icon = SourceSyncIcons .ExpUI .SOURCESYNC
172126 }
173127
128+ override fun getActionUpdateThread () = ActionUpdateThread .BGT
129+
174130 override fun actionPerformed (e : AnActionEvent ) {
175131 val projectName = PlatformDataKeys .PROJECT .getData(e.dataContext)!! .name
176132 associateProjectWithConnection(projectName)
0 commit comments