Files
OAC-Swing/src/main/java/org/openautonomousconnection/oacswing/component/OACMenu.java

120 lines
3.2 KiB
Java
Raw Normal View History

2026-02-07 18:54:19 +01:00
/* Author: Maple
* Feb. 2 2026
* */
package org.openautonomousconnection.oacswing.component;
import org.openautonomousconnection.oacswing.component.design.DesignManager;
2026-02-07 18:54:19 +01:00
import javax.swing.*;
import java.awt.*;
import java.awt.event.ContainerAdapter;
import java.awt.event.ContainerEvent;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
2026-02-07 18:54:19 +01:00
public class OACMenu extends JMenu implements OACComponent {
private JPopupMenu observedPopup;
2026-02-07 18:54:19 +01:00
public OACMenu() {
super();
}
public OACMenu(String s) {
super(s);
}
public OACMenu(Action a) {
super(a);
}
public OACMenu(String s, boolean b) {
super(s, b);
}
@Override
public void init() {
applyDesignColors();
setOpaque(true);
installPopupAutoApply();
}
@Override
public void updateUI() {
super.updateUI();
applyDesignColors();
installPopupAutoApply();
}
private void applyDesignColors() {
setBackground(DesignManager.resolveBackground(OACMenu.class, getBackground()));
setForeground(DesignManager.resolveForeground(OACMenu.class, getForeground()));
applyPopupDesign();
}
private void installPopupAutoApply() {
JPopupMenu popup = getPopupMenu();
if (observedPopup == popup) {
return;
}
popup.addContainerListener(new ContainerAdapter() {
@Override
public void componentAdded(ContainerEvent e) {
applyPopupDesign();
}
});
popup.addComponentListener(new ComponentAdapter() {
@Override
public void componentShown(ComponentEvent e) {
applyPopupDesign();
}
});
observedPopup = popup;
}
private void applyPopupDesign() {
JPopupMenu popup = getPopupMenu();
popup.setBackground(DesignManager.resolveBackground(OACPopupMenu.class, popup.getBackground()));
popup.setForeground(DesignManager.resolveForeground(OACPopupMenu.class, popup.getForeground()));
for (Component child : popup.getComponents()) {
if (child instanceof OACComponent oac) {
oac.initDesign();
} else if (child instanceof JComponent jc) {
jc.setOpaque(true);
jc.setBackground(DesignManager.resolveBackground(OACMenuItem.class, jc.getBackground()));
jc.setForeground(DesignManager.resolveForeground(OACMenuItem.class, jc.getForeground()));
}
}
}
2026-02-07 18:54:19 +01:00
@Override
public Component add(Component comp) {
this.initOther(comp);
return super.add(comp);
}
@Override
public Component add(Component comp, int index) {
this.initOther(comp);
return super.add(comp, index);
}
@Override
public void add(Component comp, Object constraints) {
2026-02-07 18:54:19 +01:00
this.initOther(comp);
super.add(comp, constraints);
}
@Override
public Component add(String name, Component comp) {
this.initOther(comp);
return super.add(name, comp);
}
@Override
public void add(Component comp, Object constraints, int index) {
this.initOther(comp);
super.add(comp, constraints, index);
}
}