/* * @(#)SynthPopupMenuUI.java 1.21 03/12/19 * * Copyright 2004 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package javax.swing.plaf.synth; import javax.swing.*; import javax.swing.event.*; import javax.swing.plaf.*; import javax.swing.plaf.basic.*; import javax.swing.border.*; import java.applet.Applet; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.Graphics; import java.awt.KeyboardFocusManager; import java.awt.Window; import java.awt.event.*; import java.awt.AWTEvent; import java.awt.Toolkit; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeEvent; import java.util.*; import sun.swing.plaf.synth.SynthUI; /** * Synth's PopupMenuUI. * * @version 1.21, 12/19/03 * @author Georges Saab * @author David Karlton * @author Arnaud Weber */ class SynthPopupMenuUI extends BasicPopupMenuUI implements PropertyChangeListener, SynthUI { /** * Maximum size of the text portion of the children menu items. */ private int maxTextWidth; /** * Maximum size of the text for the acclerator portion of the children * menu items. */ private int maxAcceleratorWidth; private SynthStyle style; public static ComponentUI createUI(JComponent x) { return new SynthPopupMenuUI(); } public void installDefaults() { if (popupMenu.getLayout() == null || popupMenu.getLayout() instanceof UIResource) { popupMenu.setLayout(new DefaultMenuLayout( popupMenu, BoxLayout.Y_AXIS)); } updateStyle(popupMenu); } private void updateStyle(JComponent c) { SynthContext context = getContext(c, ENABLED); SynthStyle oldStyle = style; style = SynthLookAndFeel.updateStyle(context, this); if (style != oldStyle) { if (oldStyle != null) { uninstallKeyboardActions(); installKeyboardActions(); } } context.dispose(); } protected void installListeners() { super.installListeners(); popupMenu.addPropertyChangeListener(this); } protected void uninstallDefaults() { SynthContext context = getContext(popupMenu, ENABLED); style.uninstallDefaults(context); context.dispose(); style = null; if (popupMenu.getLayout() instanceof UIResource) { popupMenu.setLayout(null); } } protected void uninstallListeners() { super.uninstallListeners(); popupMenu.removePropertyChangeListener(this); } public SynthContext getContext(JComponent c) { return getContext(c, getComponentState(c)); } private SynthContext getContext(JComponent c, int state) { return SynthContext.getContext(SynthContext.class, c, SynthLookAndFeel.getRegion(c), style, state); } private Region getRegion(JComponent c) { return SynthLookAndFeel.getRegion(c); } private int getComponentState(JComponent c) { return SynthLookAndFeel.getComponentState(c); } /** * Resets the max text and accerator widths. */ void resetAcceleratorWidths() { maxTextWidth = maxAcceleratorWidth = 0; } /** * Adjusts the width needed to display the maximum menu item string. * * @param width Text width. * @return max width */ int adjustTextWidth(int width) { maxTextWidth = Math.max(maxTextWidth, width); return maxTextWidth; } /** * Adjusts the width needed to display the maximum accelerator. * * @param width Text width. * @return max width */ int adjustAcceleratorWidth(int width) { maxAcceleratorWidth = Math.max(maxAcceleratorWidth, width); return maxAcceleratorWidth; } /** * Maximum size to display text of children menu items. */ int getMaxTextWidth() { return maxTextWidth; } /** * Maximum size needed to display accelerators of children menu items. */ int getMaxAcceleratorWidth() { return maxAcceleratorWidth; } public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); SynthLookAndFeel.update(context, g); context.getPainter().paintPopupMenuBackground(context, g, 0, 0, c.getWidth(), c.getHeight()); paint(context, g); context.dispose(); } public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); paint(context, g); context.dispose(); } protected void paint(SynthContext context, Graphics g) { } public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { context.getPainter().paintPopupMenuBorder(context, g, x, y, w, h); } public void propertyChange(PropertyChangeEvent e) { if (SynthLookAndFeel.shouldUpdateStyle(e)) { updateStyle(popupMenu); } } }