From ab526c512357ed2e58b3dd559149a5a350b7bc63 Mon Sep 17 00:00:00 2001 From: AB Date: Mon, 4 Mar 2024 09:28:20 +0100 Subject: [PATCH] Fix build warnings --- .../toolwindow/ORSimpleToolWindowPanel.java | 124 ++++++++++-------- src/main/resources/META-INF/plugin.xml | 1 + .../TestORSimpleToolWindowPanel.java | 16 +++ 3 files changed, 87 insertions(+), 54 deletions(-) create mode 100644 src/test/java/software/xdev/openrewriter/ui/toolwindow/TestORSimpleToolWindowPanel.java diff --git a/src/main/java/software/xdev/openrewriter/ui/toolwindow/ORSimpleToolWindowPanel.java b/src/main/java/software/xdev/openrewriter/ui/toolwindow/ORSimpleToolWindowPanel.java index a92f434..3435c72 100644 --- a/src/main/java/software/xdev/openrewriter/ui/toolwindow/ORSimpleToolWindowPanel.java +++ b/src/main/java/software/xdev/openrewriter/ui/toolwindow/ORSimpleToolWindowPanel.java @@ -1,7 +1,12 @@ package software.xdev.openrewriter.ui.toolwindow; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Optional; +import java.util.function.BiConsumer; +import java.util.function.Consumer; + import javax.swing.Box; -import javax.swing.JComponent; import org.jetbrains.annotations.NotNull; @@ -12,7 +17,6 @@ import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.SimpleToolWindowPanel; -import com.intellij.ui.JBSplitter; public class ORSimpleToolWindowPanel extends SimpleToolWindowPanel implements Disposable, DumbAware @@ -21,11 +25,6 @@ public class ORSimpleToolWindowPanel extends SimpleToolWindowPanel implements Di private ActionToolbar toolbar; - public ORSimpleToolWindowPanel(final boolean vertical) - { - super(vertical); - } - public ORSimpleToolWindowPanel(final boolean vertical, final boolean borderless) { super(vertical, borderless); @@ -41,52 +40,6 @@ public void setProject(final Project project) this.project = project; } - @SuppressWarnings("checkstyle:MagicNumber") - protected JBSplitter createSplitter( - final JComponent c1, - final JComponent c2, - final String proportionProperty) - { - return this.createSplitter( - c1, - c2, - proportionProperty, - 0.5f); - } - - protected JBSplitter createSplitter( - final JComponent c1, - final JComponent c2, - final String proportionProperty, - final float defaultSplit) - { - return this.createSplitter( - this, - this, - c1, - c2, - proportionProperty, - defaultSplit); - } - - protected JBSplitter createSplitter( - final JComponent parentComponent, - final Disposable parentDisposable, - final JComponent c1, - final JComponent c2, - final String proportionProperty, - final float defaultSplit) - { - return ORToolWindowUIUtil.createSplitter( - this::getProject, - parentComponent, - parentDisposable, - c1, - c2, - proportionProperty, - defaultSplit); - } - protected T getService(@NotNull final Class serviceClass) { return this.getProject().getService(serviceClass); @@ -111,9 +64,72 @@ protected void setToolbar(final String id, final ActionGroup group) this.toolbar.getComponent().setVisible(true); } + private static final Consumer REFRESH_TOOLBAR_RUNNABLE = buildRefreshToolbarRunnable(); + + static Consumer buildRefreshToolbarRunnable() + { + Optional> fallback; + try + { + // Deprecated since 241 + final Method mUpdateActionsImmediately = + ActionToolbar.class.getDeclaredMethod("updateActionsImmediately"); + + fallback = Optional.of((tb, cause) -> { + try + { + mUpdateActionsImmediately.invoke(tb); + } + catch(final IllegalAccessException | InvocationTargetException e) + { + final RuntimeException ex = new RuntimeException("Failed to invoke updateActionsImmediately", e); + if(cause != null) + { + ex.addSuppressed(cause); + } + throw ex; + } + }); + } + catch(final NoSuchMethodException e) + { + fallback = Optional.empty(); + } + + final Optional> finalFallback = fallback; + + try + { + // Only available since 241 + final Method mUpdateActionsAsync = ActionToolbar.class.getDeclaredMethod("updateActionsAsync"); + + return tb -> { + try + { + mUpdateActionsAsync.invoke(tb); + } + catch(final IllegalAccessException | InvocationTargetException e) + { + final RuntimeException ex = new RuntimeException("Failed to invoke updateActionsAsync", e); + finalFallback.ifPresentOrElse( + f -> f.accept(tb, ex), + () -> { + throw ex; + }); + } + }; + } + catch(final NoSuchMethodException e) + { + return finalFallback + .map(f -> (Consumer)tb -> f.accept(tb, null)) + .orElseThrow(); + } + } + protected void refreshToolbar() { - this.toolbar.updateActionsImmediately(); + REFRESH_TOOLBAR_RUNNABLE.accept(this.toolbar); } @Override diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 5ea440f..414cd4b 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -21,6 +21,7 @@ + com.intellij.modules.platform org.jetbrains.idea.maven org.jetbrains.plugins.gradle diff --git a/src/test/java/software/xdev/openrewriter/ui/toolwindow/TestORSimpleToolWindowPanel.java b/src/test/java/software/xdev/openrewriter/ui/toolwindow/TestORSimpleToolWindowPanel.java new file mode 100644 index 0000000..b50b343 --- /dev/null +++ b/src/test/java/software/xdev/openrewriter/ui/toolwindow/TestORSimpleToolWindowPanel.java @@ -0,0 +1,16 @@ +package software.xdev.openrewriter.ui.toolwindow; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + + +class TestORSimpleToolWindowPanel +{ + @Test + @DisplayName("buildRefreshToolbarRunnable/Reflection works") + void buildRefreshToolbarRunnableWorks() + { + Assertions.assertDoesNotThrow(ORSimpleToolWindowPanel::buildRefreshToolbarRunnable); + } +}