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
This commit is contained in:
Konstantin Hudyakov
2024-06-17 18:10:18 +03:00
committed by intellij-monorepo-bot
parent 3ca194ef2a
commit 4faea80d0c
2 changed files with 25 additions and 15 deletions

View File

@@ -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);
}
}

View File

@@ -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.
* <p>
* 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();
}
/**