/* Author: Maple * Feb. 2 2026 * */ package org.openautonomousconnection.oacswing.component; import org.openautonomousconnection.oacswing.component.design.DesignManager; 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; public class OACMenu extends JMenu implements OACComponent { private JPopupMenu observedPopup; 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())); } } } @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) { 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); } }