2026-02-07 18:54:19 +01:00
|
|
|
/* Author: Maple
|
|
|
|
|
* Feb. 2 2026
|
|
|
|
|
* */
|
|
|
|
|
|
|
|
|
|
package org.openautonomousconnection.oacswing.component;
|
|
|
|
|
|
2026-02-14 22:09:04 +01:00
|
|
|
import org.openautonomousconnection.oacswing.component.design.DesignManager;
|
|
|
|
|
|
2026-02-07 18:54:19 +01:00
|
|
|
import javax.swing.*;
|
|
|
|
|
import java.awt.*;
|
2026-02-14 22:09:04 +01:00
|
|
|
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 {
|
2026-02-14 22:09:04 +01:00
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-14 22:09:04 +01:00
|
|
|
@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
|
2026-02-07 21:56:05 +01:00
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
}
|