From 4faea80d0c6e99b02f985411ef4c51138a3a360c Mon Sep 17 00:00:00 2001 From: Konstantin Hudyakov Date: Mon, 17 Jun 2024 18:10:18 +0300 Subject: [PATCH] IJPL-149829 Fix classloading of Microba UI implementation classes Since this library is not a part of the IntelliJ platform core, its classes are loaded using separate classloader. But when UIDefaults tries to get the UI class by its FQN, it is using platform classloader and fails to find it. The solution is to specify specific classes right when patching the UIDefaults. But there is a downside: UI classes will be loaded eagerly instead of when a specific class is requested. GitOrigin-RevId: e596f2d594f10bbcf2aa54096eed6006868614f1 --- .../com/michaelbaranov/microba/Microba.java | 22 +++++++++++++++++-- .../microba/common/MicrobaComponent.java | 18 +++++---------- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/libraries/microba/src/com/michaelbaranov/microba/Microba.java b/libraries/microba/src/com/michaelbaranov/microba/Microba.java index aa33300c1794..cf52ae5c6231 100644 --- a/libraries/microba/src/com/michaelbaranov/microba/Microba.java +++ b/libraries/microba/src/com/michaelbaranov/microba/Microba.java @@ -1,6 +1,14 @@ package com.michaelbaranov.microba; +import com.michaelbaranov.microba.calendar.ui.basic.BasicCalendarPaneUI; +import com.michaelbaranov.microba.calendar.ui.basic.BasicDatePickerUI; import com.michaelbaranov.microba.common.MicrobaComponent; +import com.michaelbaranov.microba.gradient.ui.basic.BasicGradientUI; +import com.michaelbaranov.microba.gradienteditor.ui.basic.BasicGradientEditorUI; +import com.michaelbaranov.microba.marker.ui.basic.BasicMarkerBarUI; +import com.michaelbaranov.microba.marker.ui.metal.MetalMarkerBarUI; +import com.michaelbaranov.microba.marker.ui.motif.MotifMarkerBarUI; +import com.michaelbaranov.microba.marker.ui.windows.WindowsMarkerBarUI; import javax.swing.*; import java.applet.Applet; @@ -45,18 +53,28 @@ public class Microba { // all L&F UIManager.put("microba.CalendarPaneUI", packagePrefix + "calendar.ui.basic.BasicCalendarPaneUI"); + UIManager.put(packagePrefix + "calendar.ui.basic.BasicCalendarPaneUI", BasicCalendarPaneUI.class); UIManager.put("microba.DatePickerUI", packagePrefix + "calendar.ui.basic.BasicDatePickerUI"); + UIManager.put(packagePrefix + "calendar.ui.basic.BasicDatePickerUI", BasicDatePickerUI.class); UIManager.put("microba.GradientUI", packagePrefix + "gradient.ui.basic.BasicGradientUI"); + UIManager.put(packagePrefix + "gradient.ui.basic.BasicGradientUI", BasicGradientUI.class); UIManager.put("microba.GradientEditorUI", packagePrefix + "gradienteditor.ui.basic.BasicGradientEditorUI"); + UIManager.put(packagePrefix + "gradienteditor.ui.basic.BasicGradientEditorUI", BasicGradientEditorUI.class); UIManager.put("microba.MarkerBarUI", packagePrefix + "marker.ui.basic.BasicMarkerBarUI"); + UIManager.put(packagePrefix + "marker.ui.basic.BasicMarkerBarUI", BasicMarkerBarUI.class); // particular L&F if (lookAndFeel.getID().equals("Windows")) { UIManager.put("microba.MarkerBarUI", packagePrefix + "marker.ui.windows.WindowsMarkerBarUI"); - } else if (lookAndFeel.getID().equals("Metal")) { + UIManager.put(packagePrefix + "marker.ui.windows.WindowsMarkerBarUI", WindowsMarkerBarUI.class); + } + else if (lookAndFeel.getID().equals("Metal")) { UIManager.put("microba.MarkerBarUI", packagePrefix + "marker.ui.metal.MetalMarkerBarUI"); - } else if (lookAndFeel.getID().equals("Motif")) { + UIManager.put(packagePrefix + "marker.ui.metal.MetalMarkerBarUI", MetalMarkerBarUI.class); + } + else if (lookAndFeel.getID().equals("Motif")) { UIManager.put("microba.MarkerBarUI", packagePrefix + "marker.ui.motif.MotifMarkerBarUI"); + UIManager.put(packagePrefix + "marker.ui.motif.MotifMarkerBarUI", MotifMarkerBarUI.class); } } diff --git a/libraries/microba/src/com/michaelbaranov/microba/common/MicrobaComponent.java b/libraries/microba/src/com/michaelbaranov/microba/common/MicrobaComponent.java index 5ebbb2669d5a..ec280ec9021d 100644 --- a/libraries/microba/src/com/michaelbaranov/microba/common/MicrobaComponent.java +++ b/libraries/microba/src/com/michaelbaranov/microba/common/MicrobaComponent.java @@ -1,15 +1,13 @@ package com.michaelbaranov.microba.common; -import java.awt.Color; +import com.michaelbaranov.microba.Microba; + +import javax.swing.*; +import javax.swing.plaf.ComponentUI; +import java.awt.*; import java.util.Collections; import java.util.Map; -import javax.swing.JComponent; -import javax.swing.UIManager; -import javax.swing.plaf.ComponentUI; - -import com.michaelbaranov.microba.Microba; - /** * Superclass for all Microba GUI components. * @@ -33,16 +31,10 @@ public class MicrobaComponent extends JComponent { /** * Sets the UI delegate of this component to the corresponding UI delegate * taken from UIManager. - *

- * This implementation has a workarount to fix the problem with non-standard - * class-loaders. */ public void updateUI() { - UIManager.getDefaults().put(UIManager.get(this.getUIClassID()), null); ComponentUI delegate = UIManager.getUI(this); - setUI(delegate); - invalidate(); } /**