From ec2a9a41e7d5f8075f2ac3c887cc4a4871487435 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:35:18 +0100 Subject: [PATCH] Fixed dropdown button on WSL, fixed some warnings related to deprecated classes (#304) * Fixed dropdown button, fixed some warnings related to deprecated classes * lint * E2E test fix * lint 2 * test fix 2 * Update changelog.d/297.fixed.md Co-authored-by: Gemma <58080601+gememma@users.noreply.github.com> --------- Co-authored-by: Gemma <58080601+gememma@users.noreply.github.com> --- changelog.d/297.fixed.md | 1 + .../metalbear/mirrord/MirrordBinaryManager.kt | 6 +- .../com/metalbear/mirrord/MirrordDropDown.kt | 80 +++++++++++++------ .../com/metalbear/mirrord/MirrordEnabler.kt | 13 +-- .../mirrord/MirrordProjectService.kt | 2 +- .../metalbear/mirrord/MirrordUsageBanner.kt | 6 +- src/main/resources/META-INF/plugin.xml | 4 +- .../com/metalbear/mirrord/utils/IdeaFrame.kt | 2 +- 8 files changed, 68 insertions(+), 46 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..475d5dda --- /dev/null +++ b/changelog.d/297.fixed.md @@ -0,0 +1 @@ +Fixed toolbar dropdown button in the context of remote development on WSL. \ 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..2dea5883 100644 --- a/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordBinaryManager.kt +++ b/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordBinaryManager.kt @@ -9,7 +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.StartupActivity +import com.intellij.openapi.startup.ProjectActivity import com.intellij.openapi.util.SystemInfo import com.intellij.util.system.CpuArch import java.net.URI @@ -41,8 +41,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..cea6470f 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,73 @@ 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 +84,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 +162,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 +182,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 +198,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..b1d0ef32 100644 --- a/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordUsageBanner.kt +++ b/modules/core/src/main/kotlin/com/metalbear/mirrord/MirrordUsageBanner.kt @@ -2,7 +2,7 @@ package com.metalbear.mirrord import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.project.Project -import com.intellij.openapi.startup.StartupActivity +import com.intellij.openapi.startup.ProjectActivity import com.intellij.openapi.ui.DialogWrapper import com.intellij.ui.components.JBScrollPane import com.intellij.util.ui.JBUI @@ -22,7 +22,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 +73,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 @@ diff --git a/src/test/kotlin/com/metalbear/mirrord/utils/IdeaFrame.kt b/src/test/kotlin/com/metalbear/mirrord/utils/IdeaFrame.kt index d03bfe3b..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='ComboBoxButton']"), + byXpath("//div[@visible_text='mirrord' and @class='ActionButtonWithText']"), Duration.ofSeconds(30) )