From 409ba2526e9b3e1634e62406fecf1a0cb1cd742d Mon Sep 17 00:00:00 2001 From: razz4780 Date: Mon, 2 Dec 2024 12:17:15 +0100 Subject: [PATCH 1/6] Fixed dropdown button, fixed some warnings related to deprecated classes --- changelog.d/297.fixed.md | 2 + .../metalbear/mirrord/MirrordBinaryManager.kt | 5 +- .../com/metalbear/mirrord/MirrordDropDown.kt | 69 ++++++++++++------- .../com/metalbear/mirrord/MirrordEnabler.kt | 13 +--- .../mirrord/MirrordProjectService.kt | 2 +- .../metalbear/mirrord/MirrordUsageBanner.kt | 5 +- src/main/resources/META-INF/plugin.xml | 4 +- 7 files changed, 57 insertions(+), 43 deletions(-) create mode 100644 changelog.d/297.fixed.md diff --git a/changelog.d/297.fixed.md b/changelog.d/297.fixed.md new file mode 100644 index 00000000..92989e42 --- /dev/null +++ b/changelog.d/297.fixed.md @@ -0,0 +1,2 @@ +Fixed toolbar dropdown button in the context of remote development on WSL. +g \ No newline at end of file diff --git a/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordBinaryManager.kt b/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordBinaryManager.kt index 86a9ad02..7aed3c04 100644 --- a/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordBinaryManager.kt +++ b/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordBinaryManager.kt @@ -9,6 +9,7 @@ import com.intellij.openapi.progress.ProgressIndicator import com.intellij.openapi.progress.Task import com.intellij.openapi.project.DumbAware import com.intellij.openapi.project.Project +import com.intellij.openapi.startup.ProjectActivity import com.intellij.openapi.startup.StartupActivity import com.intellij.openapi.util.SystemInfo import com.intellij.util.system.CpuArch @@ -41,8 +42,8 @@ class MirrordBinaryManager { /** * Schedules the update task at project startup. */ - class DownloadInitializer : StartupActivity.Background { - override fun runActivity(project: Project) { + class DownloadInitializer : ProjectActivity { + override suspend fun execute(project: Project) { UpdateTask(project, null, null, false).queue() } } diff --git a/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordDropDown.kt b/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordDropDown.kt index e3d2ec21..4930bf1f 100644 --- a/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordDropDown.kt +++ b/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordDropDown.kt @@ -1,30 +1,62 @@ package com.metalbear.mirrord import com.intellij.ide.BrowserUtil -import com.intellij.ide.DataManager import com.intellij.openapi.actionSystem.* -import com.intellij.openapi.actionSystem.ex.ComboBoxAction import com.intellij.openapi.application.WriteAction import com.intellij.openapi.components.service import com.intellij.openapi.fileEditor.FileEditorManager import com.intellij.openapi.project.* +import com.intellij.openapi.ui.popup.JBPopup +import com.intellij.openapi.ui.popup.JBPopupFactory import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFileManager import com.intellij.util.indexing.* import com.intellij.util.io.EnumeratorStringDescriptor import com.intellij.util.io.KeyDescriptor +import com.intellij.util.ui.JBDimension import java.util.* import javax.swing.JComponent const val DISCORD_URL = "https://discord.gg/metalbear" const val MIRRORD_FOR_TEAMS_URL = "https://app.metalbear.co/" +/** + * Copied from internal [com.intellij.execution.ui.TogglePopupAction]. + */ +abstract class TogglePopupAction : ToggleAction() { + override fun isSelected(e: AnActionEvent): Boolean { + return Toggleable.isSelected(e.presentation) + } + + override fun setSelected(e: AnActionEvent, state: Boolean) { + if (!state) return + val component = e.inputEvent?.component as? JComponent ?: return + val popup = createPopup(e) ?: return + popup.showUnderneathOf(component) + } + + private fun createPopup(e: AnActionEvent): JBPopup? { + val presentation = e.presentation + val actionGroup = getActionGroup(e) ?: return null + val disposeCallback = { Toggleable.setSelected(presentation, false) } + val popup = createPopup(actionGroup, e, disposeCallback) + popup.setMinimumSize(JBDimension(270, 0)) + return popup + } + + open fun createPopup(actionGroup: ActionGroup, + e: AnActionEvent, + disposeCallback: () -> Unit) = JBPopupFactory.getInstance().createActionGroupPopup( + null, actionGroup, e.dataContext, false, false, false, disposeCallback, 30, null) + + abstract fun getActionGroup(e: AnActionEvent): ActionGroup? +} + fun VirtualFile.relativePath(project: Project): String { return calcRelativeToProjectPath(this, project, includeFilePath = true, keepModuleAlwaysOnTheLeft = true) } -class MirrordDropDown : ComboBoxAction(), DumbAware { - +class MirrordDropDown : TogglePopupAction(), DumbAware { private class ShowActiveConfigAction(val config: VirtualFile, project: Project) : AnAction("Active Config: ${config.relativePath(project)}") { override fun actionPerformed(e: AnActionEvent) { @@ -41,7 +73,7 @@ class MirrordDropDown : ComboBoxAction(), DumbAware { val projectLocator = ProjectLocator.getInstance() val configs = FileBasedIndex .getInstance() - .getAllKeys(MirrordConfigIndex.key, service.project) + .getAllKeys(MIRRORD_CONFIG_INDEX_KEY, service.project) .mapNotNull { fileManager.findFileByUrl(it) } .filter { !it.isDirectory } .filter { projectLocator.getProjectsForFile(it).contains(service.project) } @@ -119,10 +151,8 @@ class MirrordDropDown : ComboBoxAction(), DumbAware { } } - override fun getActionUpdateThread() = ActionUpdateThread.BGT - - override fun createPopupActionGroup(button: JComponent, dataContext: DataContext): DefaultActionGroup { - val project = dataContext.getData(CommonDataKeys.PROJECT) ?: throw Error("mirrord requires an open project") + override fun getActionGroup(e: AnActionEvent): ActionGroup { + val project = e.project ?: throw Error("mirrord requires an open project") val service = project.service() return DefaultActionGroup().apply { @@ -141,16 +171,9 @@ class MirrordDropDown : ComboBoxAction(), DumbAware { } } - @Deprecated( - "Deprecated in Java", - ReplaceWith( - "createPopupActionGroup(button, DataManager.getInstance().getDataContext(button))", - "com.intellij.ide.DataManager" - ) - ) - override fun createPopupActionGroup(button: JComponent): DefaultActionGroup { - return createPopupActionGroup(button, DataManager.getInstance().getDataContext(button)) - } + override fun displayTextInToolbar(): Boolean = true + + override fun getActionUpdateThread() = ActionUpdateThread.BGT override fun update(e: AnActionEvent) { val projectOpen = e.project != null @@ -164,18 +187,16 @@ class MirrordDropDown : ComboBoxAction(), DumbAware { } } +private val MIRRORD_CONFIG_INDEX_KEY = ID.create("mirrordConfig") + /** * An index for mirrord config files. * Indexes files with names ending with `mirrord.json`. */ class MirrordConfigIndex : ScalarIndexExtension() { - companion object { - val key = ID.create("mirrordConfig") - } - override fun getName(): ID { - return key + return MIRRORD_CONFIG_INDEX_KEY } override fun getIndexer(): DataIndexer { diff --git a/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordEnabler.kt b/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordEnabler.kt index ff0b1e56..3052678b 100644 --- a/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordEnabler.kt +++ b/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordEnabler.kt @@ -1,17 +1,13 @@ package com.metalbear.mirrord -import com.intellij.ide.ActivityTracker import com.intellij.openapi.actionSystem.ActionUpdateThread import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.ToggleAction import com.intellij.openapi.components.service import com.intellij.openapi.project.DumbAware -import com.intellij.openapi.project.Project -import com.intellij.openapi.startup.StartupActivity -import com.metalbear.mirrord.MirrordSettingsState.Companion.instance import icons.MirrordIcons -class MirrordEnabler : ToggleAction(), DumbAware, StartupActivity, StartupActivity.DumbAware { +class MirrordEnabler : ToggleAction(), DumbAware { override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.BGT override fun isSelected(e: AnActionEvent): Boolean { @@ -32,11 +28,4 @@ class MirrordEnabler : ToggleAction(), DumbAware, StartupActivity, StartupActivi super.update(e) } - - override fun runActivity(project: Project) { - if (instance.mirrordState.enabledByDefault) { - project.service().enabled = true - ActivityTracker.getInstance().inc() - } - } } diff --git a/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordProjectService.kt b/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordProjectService.kt index 450ca065..6cf980d8 100644 --- a/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordProjectService.kt +++ b/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordProjectService.kt @@ -27,7 +27,7 @@ class MirrordProjectService(val project: Project) : Disposable { var activeConfig: VirtualFile? = null @Volatile - private var _enabled = false + private var _enabled = MirrordSettingsState.instance.mirrordState.enabledByDefault var enabled: Boolean get() = _enabled diff --git a/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordUsageBanner.kt b/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordUsageBanner.kt index 0a28c3bb..3e04728d 100644 --- a/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordUsageBanner.kt +++ b/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordUsageBanner.kt @@ -2,6 +2,7 @@ package com.metalbear.mirrord import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.project.Project +import com.intellij.openapi.startup.ProjectActivity import com.intellij.openapi.startup.StartupActivity import com.intellij.openapi.ui.DialogWrapper import com.intellij.ui.components.JBScrollPane @@ -22,7 +23,7 @@ The dropdown menu next to the icon provides shortcuts for working with mirrord c private const val SHOW_AGAIN_AFTER_MS: Long = 30 * 60 * 1000 -class MirrordUsageBanner : StartupActivity, StartupActivity.DumbAware { +class MirrordUsageBanner : ProjectActivity { /** * Timestamp in milliseconds. */ @@ -73,7 +74,7 @@ class MirrordUsageBanner : StartupActivity, StartupActivity.DumbAware { } } - override fun runActivity(project: Project) { + override suspend fun execute(project: Project) { val now = System.currentTimeMillis() lastShownAt?.let { if (now <= it + SHOW_AGAIN_AFTER_MS) { diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 82bec638..4bf1e8be 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -24,7 +24,6 @@ - @@ -42,7 +41,6 @@ - @@ -57,6 +55,8 @@ From fcd804149a12c90282dad3264d9723962c3caea5 Mon Sep 17 00:00:00 2001 From: razz4780 Date: Mon, 2 Dec 2024 12:41:30 +0100 Subject: [PATCH 2/6] lint --- .../com/metalbear/mirrord/MirrordBinaryManager.kt | 1 - .../kotlin/com/metalbear/mirrord/MirrordDropDown.kt | 11 ++++++++++- .../com/metalbear/mirrord/MirrordUsageBanner.kt | 1 - 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordBinaryManager.kt b/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordBinaryManager.kt index 7aed3c04..2dea5883 100644 --- a/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordBinaryManager.kt +++ b/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordBinaryManager.kt @@ -10,7 +10,6 @@ import com.intellij.openapi.progress.Task import com.intellij.openapi.project.DumbAware import com.intellij.openapi.project.Project import com.intellij.openapi.startup.ProjectActivity -import com.intellij.openapi.startup.StartupActivity import com.intellij.openapi.util.SystemInfo import com.intellij.util.system.CpuArch import java.net.URI diff --git a/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordDropDown.kt b/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordDropDown.kt index 4930bf1f..bd0bed40 100644 --- a/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordDropDown.kt +++ b/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordDropDown.kt @@ -47,7 +47,16 @@ abstract class TogglePopupAction : ToggleAction() { open fun createPopup(actionGroup: ActionGroup, e: AnActionEvent, disposeCallback: () -> Unit) = JBPopupFactory.getInstance().createActionGroupPopup( - null, actionGroup, e.dataContext, false, false, false, disposeCallback, 30, null) + null, + actionGroup, + e.dataContext, + false, + false, + false, + disposeCallback, + 30, + null + ) abstract fun getActionGroup(e: AnActionEvent): ActionGroup? } diff --git a/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordUsageBanner.kt b/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordUsageBanner.kt index 3e04728d..b1d0ef32 100644 --- a/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordUsageBanner.kt +++ b/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordUsageBanner.kt @@ -3,7 +3,6 @@ package com.metalbear.mirrord import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.project.Project import com.intellij.openapi.startup.ProjectActivity -import com.intellij.openapi.startup.StartupActivity import com.intellij.openapi.ui.DialogWrapper import com.intellij.ui.components.JBScrollPane import com.intellij.util.ui.JBUI From 229edfd599d6447d803dea28fd9e224f35304e8f Mon Sep 17 00:00:00 2001 From: razz4780 Date: Mon, 2 Dec 2024 12:46:19 +0100 Subject: [PATCH 3/6] E2E test fix --- src/test/kotlin/com/metalbear/mirrord/utils/IdeaFrame.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/kotlin/com/metalbear/mirrord/utils/IdeaFrame.kt b/src/test/kotlin/com/metalbear/mirrord/utils/IdeaFrame.kt index d03bfe3b..cf4999e4 100644 --- a/src/test/kotlin/com/metalbear/mirrord/utils/IdeaFrame.kt +++ b/src/test/kotlin/com/metalbear/mirrord/utils/IdeaFrame.kt @@ -25,7 +25,7 @@ class IdeaFrame(remoteRobot: RemoteRobot, remoteComponent: RemoteComponent) : val mirrordDropdownButton get() = find( - byXpath("//div[@text='mirrord' and @class='ComboBoxButton']"), + byXpath("//div[@text='mirrord' and @class='ActionButtonWithText']"), Duration.ofSeconds(30) ) From 283ef9ab7c5792bfade8f93a5420ec71855fa21b Mon Sep 17 00:00:00 2001 From: razz4780 Date: Mon, 2 Dec 2024 12:46:53 +0100 Subject: [PATCH 4/6] lint 2 --- .../main/kotlin/com/metalbear/mirrord/MirrordDropDown.kt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordDropDown.kt b/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordDropDown.kt index bd0bed40..cea6470f 100644 --- a/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordDropDown.kt +++ b/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordDropDown.kt @@ -44,9 +44,11 @@ abstract class TogglePopupAction : ToggleAction() { return popup } - open fun createPopup(actionGroup: ActionGroup, - e: AnActionEvent, - disposeCallback: () -> Unit) = JBPopupFactory.getInstance().createActionGroupPopup( + open fun createPopup( + actionGroup: ActionGroup, + e: AnActionEvent, + disposeCallback: () -> Unit + ) = JBPopupFactory.getInstance().createActionGroupPopup( null, actionGroup, e.dataContext, From 4780c066f2a356b0908c118c412c6bac322f33f6 Mon Sep 17 00:00:00 2001 From: razz4780 Date: Mon, 2 Dec 2024 13:32:25 +0100 Subject: [PATCH 5/6] test fix 2 --- src/test/kotlin/com/metalbear/mirrord/utils/IdeaFrame.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/kotlin/com/metalbear/mirrord/utils/IdeaFrame.kt b/src/test/kotlin/com/metalbear/mirrord/utils/IdeaFrame.kt index cf4999e4..921afcf3 100644 --- a/src/test/kotlin/com/metalbear/mirrord/utils/IdeaFrame.kt +++ b/src/test/kotlin/com/metalbear/mirrord/utils/IdeaFrame.kt @@ -25,7 +25,7 @@ class IdeaFrame(remoteRobot: RemoteRobot, remoteComponent: RemoteComponent) : val mirrordDropdownButton get() = find( - byXpath("//div[@text='mirrord' and @class='ActionButtonWithText']"), + byXpath("//div[@visible_text='mirrord' and @class='ActionButtonWithText']"), Duration.ofSeconds(30) ) From 52f4eb0376e08129edfea239a01429a142781852 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Smolarek?= <34063647+Razz4780@users.noreply.github.com> Date: Mon, 2 Dec 2024 15:27:16 +0100 Subject: [PATCH 6/6] Update changelog.d/297.fixed.md Co-authored-by: Gemma <58080601+gememma@users.noreply.github.com> --- changelog.d/297.fixed.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/changelog.d/297.fixed.md b/changelog.d/297.fixed.md index 92989e42..475d5dda 100644 --- a/changelog.d/297.fixed.md +++ b/changelog.d/297.fixed.md @@ -1,2 +1 @@ -Fixed toolbar dropdown button in the context of remote development on WSL. -g \ No newline at end of file +Fixed toolbar dropdown button in the context of remote development on WSL. \ No newline at end of file