BasicPopupMenuUI.java [plain text]
package javax.swing.plaf.basic;
import java.awt.AWTKeyStroke;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.Stroke;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.EventListener;
import javax.swing.AbstractButton;
import javax.swing.ButtonModel;
import javax.swing.Icon;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JComponent;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.KeyStroke;
import javax.swing.MenuElement;
import javax.swing.MenuSelectionManager;
import javax.swing.SwingUtilities;
import javax.swing.UIDefaults;
import javax.swing.UIManager;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.MenuDragMouseEvent;
import javax.swing.event.MenuDragMouseListener;
import javax.swing.event.MenuKeyEvent;
import javax.swing.event.MenuKeyListener;
import javax.swing.event.MouseInputListener;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.MenuItemUI;
import javax.swing.plaf.PopupMenuUI;
public class BasicPopupMenuUI extends PopupMenuUI
{
protected JPopupMenu popupMenu;
private static transient MouseInputListener mouseInputListener;
private transient PopupMenuListener popupMenuListener;
private TopWindowListener topWindowListener;
public BasicPopupMenuUI()
{
popupMenuListener = new PopupMenuHandler();
mouseInputListener = new MouseInputHandler();
topWindowListener = new TopWindowListener();
}
public static ComponentUI createUI(JComponent x)
{
return new BasicPopupMenuUI();
}
public void installUI(JComponent c)
{
super.installUI(c);
popupMenu = (JPopupMenu) c;
popupMenu.setLayout(new GridBagLayout());
popupMenu.setBorderPainted(true);
JPopupMenu.setDefaultLightWeightPopupEnabled(true);
installDefaults();
installListeners();
}
public void installDefaults()
{
UIDefaults defaults = UIManager.getLookAndFeelDefaults();
popupMenu.setBackground(defaults.getColor("PopupMenu.background"));
popupMenu.setBorder(defaults.getBorder("PopupMenu.border"));
popupMenu.setFont(defaults.getFont("PopupMenu.font"));
popupMenu.setForeground(defaults.getColor("PopupMenu.foreground"));
popupMenu.setOpaque(true);
}
protected void installListeners()
{
popupMenu.addMouseListener(mouseInputListener);
popupMenu.addMouseMotionListener(mouseInputListener);
popupMenu.addPopupMenuListener(popupMenuListener);
}
protected void installKeyboardActions()
{
}
public void uninstallUI(JComponent c)
{
uninstallListeners();
uninstallDefaults();
popupMenu = null;
}
protected void uninstallDefaults()
{
popupMenu.setBackground(null);
popupMenu.setBorder(null);
popupMenu.setFont(null);
popupMenu.setForeground(null);
}
protected void uninstallListeners()
{
popupMenu.removeMouseListener(mouseInputListener);
popupMenu.removeMouseMotionListener(mouseInputListener);
popupMenu.removePopupMenuListener(popupMenuListener);
}
protected void uninstallKeyboardActions()
{
}
public Dimension getMinimumSize(JComponent c)
{
return null;
}
public Dimension getPreferredSize(JComponent c)
{
return null;
}
public Dimension getMaximumSize(JComponent c)
{
return null;
}
public boolean isPopupTrigger(MouseEvent e)
{
return false;
}
private class PopupMenuHandler implements PopupMenuListener
{
public void popupMenuCanceled(PopupMenuEvent event)
{
MenuSelectionManager manager = MenuSelectionManager.defaultManager();
manager.clearSelectedPath();
}
public void popupMenuWillBecomeInvisible(PopupMenuEvent event)
{
Component invoker = popupMenu.getInvoker();
Container rootContainer = (Container) SwingUtilities.getRoot(invoker);
rootContainer.removeComponentListener(topWindowListener);
}
public void popupMenuWillBecomeVisible(PopupMenuEvent event)
{
Component invoker = popupMenu.getInvoker();
Container rootContainer = (Container) SwingUtilities.getRoot(invoker);
rootContainer.addComponentListener(topWindowListener);
MenuSelectionManager manager = MenuSelectionManager.defaultManager();
if (manager.getSelectedPath().length == 0)
{
MenuElement[] path = new MenuElement[2];
path[0] = popupMenu;
Component[] comps = popupMenu.getComponents();
if (comps.length != 0 && comps[0] instanceof MenuElement)
{
path[1] = (MenuElement) comps[0];
manager.setSelectedPath(path);
}
}
}
}
private class TopWindowListener implements ComponentListener
{
public void componentResized(ComponentEvent e)
{
MenuSelectionManager manager = MenuSelectionManager.defaultManager();
manager.clearSelectedPath();
}
public void componentMoved(ComponentEvent e)
{
MenuSelectionManager manager = MenuSelectionManager.defaultManager();
manager.clearSelectedPath();
}
public void componentShown(ComponentEvent e)
{
MenuSelectionManager manager = MenuSelectionManager.defaultManager();
manager.clearSelectedPath();
}
public void componentHidden(ComponentEvent e)
{
MenuSelectionManager manager = MenuSelectionManager.defaultManager();
manager.clearSelectedPath();
}
}
private class MouseInputHandler implements MouseInputListener
{
public void mouseClicked(MouseEvent e)
{
}
public void mouseDragged(MouseEvent e)
{
}
public void mouseEntered(MouseEvent e)
{
}
public void mouseExited(MouseEvent e)
{
}
public void mouseMoved(MouseEvent e)
{
}
public void mousePressed(MouseEvent e)
{
}
public void mouseReleased(MouseEvent e)
{
}
}
}