package org.limewire.ui.swing.components; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Panel; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import javax.swing.JLayeredPane; public abstract class OverlayPopupPanel extends Panel implements Resizable, ComponentListener, Disposable { // heavy weight so it can be on top of other heavy weight components protected final JLayeredPane layeredPane; private final Component childPanel; public OverlayPopupPanel(JLayeredPane layeredPane) { this(layeredPane, null); } public OverlayPopupPanel(JLayeredPane layeredPane, Component childPanel) { this.layeredPane = layeredPane; this.childPanel = childPanel; if (childPanel != null) { setLayout(new BorderLayout()); add(childPanel, BorderLayout.CENTER); // Match visiblity of the child childPanel.addComponentListener(new ComponentListener() { @Override public void componentHidden(ComponentEvent e) { setVisible(false); } @Override public void componentMoved(ComponentEvent e) { } @Override public void componentResized(ComponentEvent e) { } @Override public void componentShown(ComponentEvent e) { setVisible(true); } }); // Should hide if the child is hidden if (!childPanel.isVisible()) { setVisible(false); } } layeredPane.add(this, JLayeredPane.MODAL_LAYER); layeredPane.addComponentListener(this); resize(); } @Override public void setVisible(boolean b) { super.setVisible(b); if (childPanel != null) { childPanel.setVisible(b); } } @Override public void dispose() { layeredPane.removeComponentListener(this); layeredPane.remove(this); if (childPanel instanceof Disposable) { ((Disposable) childPanel).dispose(); } } public abstract void resize(); @Override public void componentHidden(ComponentEvent e) { } @Override public void componentMoved(ComponentEvent e) { } @Override public void componentResized(ComponentEvent e) { resize(); } @Override public void componentShown(ComponentEvent e) { } }