Skip to content

Commit 7fd9c81

Browse files
authored
Merge pull request #130 from fioan89/fix-context-menu-on-2023.1.1
Fix context menu on 2023.1.1
2 parents 4fc3618 + 242fa06 commit 7fd9c81

4 files changed

Lines changed: 61 additions & 94 deletions

File tree

CHANGELOG.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,18 @@
44

55
## Unreleased
66

7-
## Changed
7+
### Fixed
8+
9+
- context menu takes a long time to open when using the New UI
10+
11+
### Changed
12+
813
- removed deprecated API usages
914

1015
## 2.0.3 - 2023-03-01
1116

1217
### Added
18+
1319
- support for experimental new UI
1420

1521
### Changed

gradle.properties

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
pluginGroup=org.wavescale.sourcesync
22
pluginName=sourcesync
33
# SemVer format -> https://semver.org
4-
pluginVersion=2.0.3
4+
pluginVersion=2.0.4
55
# See https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html
66
# for insight into build numbers and IntelliJ Platform versions.
7-
pluginSinceBuild=223
7+
pluginSinceBuild=231
88
pluginUntilBuild=
99
# IntelliJ Platform Properties -> https://github.com/JetBrains/gradle-intellij-plugin#intellij-platform-properties
1010
platformType=IC
11-
platformVersion=2023.1
11+
platformVersion=2023.1.1
1212
# Plugin Dependencies -> https://plugins.jetbrains.com/docs/intellij/plugin-dependencies.html
1313
# Example: platformPlugins = com.intellij.java, com.jetbrains.php:203.4449.22
1414
platformPlugins=
@@ -20,3 +20,4 @@ gradleVersion=7.4
2020
# See https://plugins.jetbrains.com/docs/intellij/kotlin.html#kotlin-standard-library for details.
2121
# suppress inspection "UnusedProperty"
2222
kotlin.stdlib.default.dependency=false
23+
org.gradle.jvmargs=-Xmx2048m

src/main/kotlin/org/wavescale/sourcesync/action/NewUIConnectionConfigurationSelector.kt

Lines changed: 41 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,46 @@
11
package 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.*
165
import 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
209
import com.intellij.ui.components.JBList
2110
import 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
2711
import org.wavescale.sourcesync.SourceSyncIcons
2812
import org.wavescale.sourcesync.SourcesyncBundle
2913
import org.wavescale.sourcesync.factory.ConfigConnectionFactory
3014
import org.wavescale.sourcesync.factory.ConnectionConfig
3115
import org.wavescale.sourcesync.services.SyncStatusService
32-
import java.awt.Graphics
33-
import java.awt.Insets
3416
import 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

13696
class 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)

src/main/resources/META-INF/plugin.xml

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,24 +21,28 @@
2121
<!-- Add your action here -->
2222
<action id="actionSourceSyncMenu" class="org.wavescale.sourcesync.action.ActionSourceSyncMenu"
2323
text="Edit Sourcesync Configurations">
24-
<keyboard-shortcut keymap="$default" first-keystroke="ctrl shift D"/>
24+
<keyboard-shortcut keymap="$default" first-keystroke="ctrl shift D" />
2525
</action>
2626

2727
<action id="OldUIConnectionConfigurationSelector"
2828
class="org.wavescale.sourcesync.action.OldUIConnectionConfigurationSelector"
2929
text="Sourcesync Configurations"
3030
description="Sourcesync Configurations"
3131
icon="/sourcesync.svg">
32-
<add-to-group group-id="NavBarToolBar"/>
32+
<add-to-group group-id="NavBarToolBar" />
3333
</action>
3434

35-
<action id="NewUIConnectionConfigurationSelector"
35+
<group id="SourcesyncShowPopupActionGroup" />
36+
<group id="SourcesyncToolbarGroupNewUI">
37+
<reference ref="SourcesyncShowPopupActionGroup" />
38+
<add-to-group group-id="MainToolbarRight" anchor="before" relative-to-action="SearchEverywhere" />
39+
</group>
40+
<action id="SourcesyncConnectionConfigurationSelectorNewUI"
3641
class="org.wavescale.sourcesync.action.NewUIConnectionConfigurationSelector"
3742
text="Sourcesync Configurations"
3843
description="Sourcesync Configurations"
3944
icon="/expui/sourcesync.svg">
40-
<add-to-group group-id="MainToolbarRight" anchor="after"
41-
relative-to-action="RunToolbarWidgetCustomizableActionGroup"/>
45+
<add-to-group group-id="SourcesyncShowPopupActionGroup" />
4246
</action>
4347

4448
<action id="actionLocalFileToRemote" class="org.wavescale.sourcesync.action.ActionLocalFileToRemote"

0 commit comments

Comments
 (0)