/* * @(#)WindowsComboBoxUI.java 1.46 05/03/25 * * Copyright 2005 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package com.sun.java.swing.plaf.windows; import javax.swing.plaf.basic.*; import javax.swing.plaf.*; import javax.swing.border.*; import javax.swing.*; import java.awt.event.*; import java.awt.*; /** * Windows combo box. *

* Warning: * Serialized objects of this class will not be compatible with * future Swing releases. The current serialization support is appropriate * for short term storage or RMI between applications running the same * version of Swing. A future release of Swing will provide support for * long term persistence. * * @version 1.46, 03/25/05 * @author Tom Santos */ public class WindowsComboBoxUI extends BasicComboBoxUI { MouseListener rolloverListener; public static ComponentUI createUI(JComponent c) { return new WindowsComboBoxUI(); } public void installUI( JComponent c ) { super.installUI( c ); comboBox.setRequestFocusEnabled( true ); if (XPStyle.getXP() != null && arrowButton != null) { rolloverListener = new RolloverListener(); comboBox.addMouseListener(rolloverListener); } } public void uninstallUI(JComponent c) { if (XPStyle.getXP() != null) { comboBox.removeMouseListener(rolloverListener); } super.uninstallUI( c ); } /** * If necessary paints the currently selected item. * * @param g Graphics to paint to * @param bounds Region to paint current value to * @param hasFocus whether or not the JComboBox has focus * @throws NullPointerException if any of the arguments are null. * @since 1.5 */ public void paintCurrentValue(Graphics g, Rectangle bounds, boolean hasFocus) { if (XPStyle.getXP() != null) { bounds.x += 2; bounds.y += 2; bounds.width -= 3; bounds.height -= 4; } else { bounds.x += 1; bounds.y += 1; bounds.width -= 2; bounds.height -= 2; } super.paintCurrentValue(g, bounds, hasFocus); } public Dimension getPreferredSize( JComponent c ) { Dimension d = super.getPreferredSize(c); d.width += 4; d.height += 2; if (XPStyle.getXP() != null) { d.height += 2; } return d; } /** * Creates a layout manager for managing the components which make up the * combo box. * * @return an instance of a layout manager */ protected LayoutManager createLayoutManager() { return new BasicComboBoxUI.ComboBoxLayoutManager() { public void layoutContainer(Container parent) { super.layoutContainer(parent); if (XPStyle.getXP() != null && arrowButton != null) { Dimension d = parent.getSize(); Insets insets = getInsets(); int buttonWidth = arrowButton.getPreferredSize().width; arrowButton.setBounds(WindowsUtils.isLeftToRight((JComboBox)parent) ? (d.width - insets.right - buttonWidth) : insets.left, insets.top, buttonWidth, d.height - insets.top - insets.bottom); } } }; } protected void installKeyboardActions() { super.installKeyboardActions(); } protected ComboPopup createPopup() { return super.createPopup(); } /** * Creates the default editor that will be used in editable combo boxes. * A default editor will be used only if an editor has not been * explicitly set with setEditor. * * @return a ComboBoxEditor used for the combo box * @see javax.swing.JComboBox#setEditor */ protected ComboBoxEditor createEditor() { return new WindowsComboBoxEditor(); } /** * Creates an button which will be used as the control to show or hide * the popup portion of the combo box. * * @return a button which represents the popup control */ protected JButton createArrowButton() { if (XPStyle.getXP() != null) { return new XPComboBoxButton(); } else { return super.createArrowButton(); } } private static class XPComboBoxButton extends XPStyle.GlyphButton { public XPComboBoxButton() { super("combobox.dropdownbutton"); setRequestFocusEnabled(false); } public Dimension getPreferredSize() { return new Dimension(17, 20); } } class RolloverListener extends MouseAdapter { public void mouseEntered(MouseEvent e) { ButtonModel m = null; if (arrowButton != null) { m = arrowButton.getModel(); } if (m != null) { m.setRollover(true); } } public void mouseExited(MouseEvent e) { ButtonModel m = null; if (arrowButton != null) { m = arrowButton.getModel(); } if (m != null) { m.setRollover(false); } } } /** * Subclassed to add Windows specific Key Bindings. * This class is now obsolete and doesn't do anything. * Only included for backwards API compatibility. * Do not call or override. * * @deprecated As of Java 2 platform v1.4. */ @Deprecated protected class WindowsComboPopup extends BasicComboPopup { public WindowsComboPopup( JComboBox cBox ) { super( cBox ); } protected KeyListener createKeyListener() { return new InvocationKeyHandler(); } protected class InvocationKeyHandler extends BasicComboPopup.InvocationKeyHandler { protected InvocationKeyHandler() { WindowsComboPopup.this.super(); } } } /** * Subclassed to highlight selected item in an editable combo box. */ public static class WindowsComboBoxEditor extends BasicComboBoxEditor.UIResource { public void setItem(Object item) { super.setItem(item); if (editor.hasFocus()) { editor.selectAll(); } } } }