- /*
 - * @(#)BasicOptionPaneUI.java 1.36 00/02/02
 - *
 - * Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved.
 - *
 - * This software is the proprietary information of Sun Microsystems, Inc.
 - * Use is subject to license terms.
 - *
 - */
 - package javax.swing.plaf.basic;
 - import javax.swing.border.Border;
 - import javax.swing.border.EmptyBorder;
 - import javax.swing.*;
 - import javax.swing.event.*;
 - import javax.swing.plaf.ActionMapUIResource;
 - import javax.swing.plaf.ComponentUI;
 - import javax.swing.plaf.OptionPaneUI;
 - import java.awt.*;
 - import java.awt.event.*;
 - import java.beans.PropertyChangeEvent;
 - import java.beans.PropertyChangeListener;
 - /**
 - * Provides the basic look and feel for a JOptionPane.
 - * BasicMessagePaneUI provides a means to place an icon, message and
 - * buttons into a Container. The layout will look like:<p>
 - * <pre>
 - * ------------------
 - * | i | message |
 - * | c | message |
 - * | o | message |
 - * | n | message |
 - * ------------------
 - * | buttons |
 - * |________________|
 - * </pre>
 - * icon is an instance of Icon that is wraped inside a JLabel.
 - * The message is an opaque object and is tested for the following:
 - * if the message is a Component it is added to the Container, if
 - * it is an Icon it is wrapped inside a JLabel and added to the
 - * Container otherwise it is wrapped inside a JLabel.
 - * <p>
 - * The Container, message, icon, and buttons are all determined from
 - * abstract methods.
 - *
 - * @version 1.36 02/02/00
 - * @author James Gosling
 - * @author Scott Violet
 - * @author Amy Fowler
 - */
 - public class BasicOptionPaneUI extends OptionPaneUI {
 - public static final int MinimumWidth = 262;
 - public static final int MinimumHeight = 90;
 - /** JOptionPane that the reciever is providing the look and feel for. */
 - protected JOptionPane optionPane;
 - protected Dimension minimumSize;
 - /** JComponent provide for input if optionPane.getWantsInput() returns
 - * true. */
 - protected JComponent inputComponent;
 - /** Component to receive focus when messaged with selectInitialValue. */
 - protected Component initialFocusComponent;
 - /** This is set to true in validateComponent if a Component is contained
 - * in either the message or the buttons. */
 - protected boolean hasCustomComponents;
 - protected PropertyChangeListener propertyChangeListener;
 - /**
 - * Creates a new BasicOptionPaneUI instance.
 - */
 - public static ComponentUI createUI(JComponent x) {
 - return new BasicOptionPaneUI();
 - }
 - /**
 - * Installs the reciever as the L&F for the passed in JOptionPane
 - */
 - public void installUI(JComponent c) {
 - optionPane = (JOptionPane)c;
 - installDefaults();
 - optionPane.setLayout(createLayoutManager());
 - installComponents();
 - installListeners();
 - installKeyboardActions();
 - }
 - /**
 - * Removes the receiver from the L&F controller of the passed in split
 - * pane.
 - */
 - public void uninstallUI(JComponent c) {
 - uninstallComponents();
 - optionPane.setLayout(null);
 - uninstallKeyboardActions();
 - uninstallListeners();
 - uninstallDefaults();
 - optionPane = null;
 - }
 - protected void installDefaults() {
 - LookAndFeel.installColorsAndFont(optionPane, "OptionPane.background",
 - "OptionPane.foreground", "OptionPane.font");
 - LookAndFeel.installBorder(optionPane, "OptionPane.border");
 - minimumSize = UIManager.getDimension("OptionPane.minimumSize");
 - optionPane.setOpaque(true);
 - }
 - protected void uninstallDefaults() {
 - LookAndFeel.uninstallBorder(optionPane);
 - }
 - protected void installComponents() {
 - optionPane.add(createMessageArea());
 - Container separator = createSeparator();
 - if (separator != null) {
 - optionPane.add(separator);
 - }
 - optionPane.add(createButtonArea());
 - }
 - protected void uninstallComponents() {
 - hasCustomComponents = false;
 - inputComponent = null;
 - initialFocusComponent = null;
 - optionPane.removeAll();
 - }
 - protected LayoutManager createLayoutManager() {
 - return new BoxLayout(optionPane, BoxLayout.Y_AXIS);
 - }
 - protected void installListeners() {
 - if ((propertyChangeListener = createPropertyChangeListener()) != null) {
 - optionPane.addPropertyChangeListener(propertyChangeListener);
 - }
 - }
 - protected void uninstallListeners() {
 - if (propertyChangeListener != null) {
 - optionPane.removePropertyChangeListener(propertyChangeListener);
 - propertyChangeListener = null;
 - }
 - }
 - protected PropertyChangeListener createPropertyChangeListener() {
 - return new PropertyChangeHandler();
 - }
 - protected void installKeyboardActions() {
 - InputMap map = getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
 - SwingUtilities.replaceUIInputMap(optionPane, JComponent.
 - WHEN_IN_FOCUSED_WINDOW, map);
 - ActionMap actionMap = getActionMap();
 - SwingUtilities.replaceUIActionMap(optionPane, actionMap);
 - }
 - protected void uninstallKeyboardActions() {
 - SwingUtilities.replaceUIInputMap(optionPane, JComponent.
 - WHEN_IN_FOCUSED_WINDOW, null);
 - SwingUtilities.replaceUIActionMap(optionPane, null);
 - }
 - InputMap getInputMap(int condition) {
 - if (condition == JComponent.WHEN_IN_FOCUSED_WINDOW) {
 - Object[] bindings = (Object[])UIManager.get
 - ("OptionPane.windowBindings");
 - if (bindings != null) {
 - return LookAndFeel.makeComponentInputMap(optionPane, bindings);
 - }
 - }
 - return null;
 - }
 - ActionMap getActionMap() {
 - ActionMap map = (ActionMap)UIManager.get("OptionPane.actionMap");
 - if (map == null) {
 - map = createActionMap();
 - if (map != null) {
 - UIManager.put("OptionPane.actionMap", map);
 - }
 - }
 - return map;
 - }
 - ActionMap createActionMap() {
 - ActionMap map = new ActionMapUIResource();
 - map.put("close", new CloseAction());
 - return map;
 - }
 - /**
 - * Returns the minimum size the option pane should be. Primarily
 - * provided for subclassers wishin to offer a different minimum size.
 - */
 - public Dimension getMinimumOptionPaneSize() {
 - if (minimumSize == null) {
 - //minimumSize = UIManager.getDimension("OptionPane.minimumSize");
 - // this is called before defaults initialized?!!!
 - return new Dimension(MinimumWidth, MinimumHeight);
 - }
 - return new Dimension(minimumSize.width,
 - minimumSize.height);
 - }
 - /**
 - * If c is the JOptionPane the reciever is contained in, the preferred
 - * size that is returned is the maximum of the preferred size of
 - * the LayoutManager for the JOptionPane, and
 - * <code>getMinimumOptionPaneSize</code>.
 - */
 - public Dimension getPreferredSize(JComponent c) {
 - if ((JOptionPane)c == optionPane) {
 - Dimension ourMin = getMinimumOptionPaneSize();
 - LayoutManager lm = c.getLayout();
 - if (lm != null) {
 - Dimension lmSize = lm.preferredLayoutSize(c);
 - if (ourMin != null)
 - return new Dimension
 - (Math.max(lmSize.width, ourMin.width),
 - Math.max(lmSize.height, ourMin.height));
 - return lmSize;
 - }
 - return ourMin;
 - }
 - return null;
 - }
 - /**
 - * Messages getPreferredSize.
 - */
 - public Dimension getMinimumSize(JComponent c) {
 - return getPreferredSize(c);
 - }
 - /**
 - * Messages getPreferredSize.
 - */
 - public Dimension getMaximumSize(JComponent c) {
 - return getPreferredSize(c);
 - }
 - /**
 - * Messaged from installComponents to create a Container containing the
 - * body of the message. The icon is the created by calling
 - * <code>addIcon</code>.
 - */
 - protected Container createMessageArea() {
 - JPanel top = new JPanel();
 - top.setBorder(UIManager.getBorder("OptionPane.messageAreaBorder"));
 - top.setLayout(new BorderLayout());
 - /* Fill the body. */
 - Container body = new JPanel() {};
 - Container realBody = new JPanel() {};
 - Container sep = new JPanel() {
 - public Dimension getPreferredSize() {
 - return new Dimension(15, 1);
 - }
 - };
 - realBody.setLayout(new BorderLayout());
 - realBody.add(sep, BorderLayout.WEST);
 - realBody.add(body, BorderLayout.CENTER);
 - body.setLayout(new GridBagLayout());
 - GridBagConstraints cons = new GridBagConstraints();
 - cons.gridx = cons.gridy = 0;
 - cons.gridwidth = GridBagConstraints.REMAINDER;
 - cons.gridheight = 1;
 - cons.anchor = GridBagConstraints.WEST;
 - cons.insets = new Insets(0,0,3,0);
 - addMessageComponents(body, cons, getMessage(),
 - getMaxCharactersPerLineCount(), false);
 - top.add(realBody, BorderLayout.CENTER);
 - addIcon(top);
 - return top;
 - }
 - /**
 - * Creates the appropriate object to represent <code>msg</code> and
 - * places it into <code>container</code>. If <code>msg</code> is an
 - * instance of Component, it is added directly, if it is an Icon,
 - * a JLabel is created to represent it, otherwise a JLabel is
 - * created for the string, if <code>d</code> is an Object[], this
 - * method will be recursively invoked for the children.
 - * <code>internallyCreated</code> is true if Objc is an instance
 - * of Component and was created internally by this method (this is
 - * used to correctly set hasCustomComponents only if !internallyCreated).
 - */
 - protected void addMessageComponents(Container container,
 - GridBagConstraints cons,
 - Object msg, int maxll,
 - boolean internallyCreated) {
 - if (msg == null) {
 - return;
 - }
 - if (msg instanceof Component) {
 - // To workaround problem where Gridbad will set child
 - // to its minimum size if its preferred size will not fit
 - // within allocated cells
 - if (msg instanceof JScrollPane || msg instanceof JPanel) {
 - cons.fill = GridBagConstraints.BOTH;
 - cons.weighty = 1;
 - } else {
 - cons.fill = GridBagConstraints.HORIZONTAL;
 - }
 - cons.weightx = 1;
 - container.add((Component) msg, cons);
 - cons.weightx = 0;
 - cons.weighty = 0;
 - cons.fill = GridBagConstraints.NONE;
 - cons.gridy++;
 - if (!internallyCreated) {
 - hasCustomComponents = true;
 - }
 - } else if (msg instanceof Object[]) {
 - Object [] msgs = (Object[]) msg;
 - for (int i = 0; i < msgs.length; i++) {
 - addMessageComponents(container, cons, msgs[i], maxll, false);
 - }
 - } else if (msg instanceof Icon) {
 - JLabel label = new JLabel( (Icon)msg, SwingConstants.CENTER );
 - label.setForeground(UIManager.getColor("OptionPane.messageForeground"));
 - addMessageComponents(container, cons, label, maxll, true);
 - } else {
 - String s = msg.toString();
 - int len = s.length();
 - if (len <= 0) {
 - return;
 - }
 - int nl = s.indexOf('\n');
 - if (nl >= 0) {
 - // break up newlines
 - if (nl == 0) {
 - addMessageComponents(container, cons, new Component() {
 - public Dimension getPreferredSize() {
 - Font f = getFont();
 - if (f != null) {
 - return new Dimension(1, f.getSize() + 2);
 - }
 - return new Dimension(0, 0);
 - }
 - }, maxll, true);
 - } else {
 - addMessageComponents(container, cons, s.substring(0, nl),
 - maxll, false);
 - }
 - addMessageComponents(container, cons, s.substring(nl + 1), maxll,
 - false);
 - } else if (len > maxll) {
 - Container c = Box.createVerticalBox();
 - burstStringInto(c, s, maxll);
 - addMessageComponents(container, cons, c, maxll, true );
 - } else {
 - JLabel label = new JLabel( s, JLabel.LEFT );
 - label.setForeground(UIManager.getColor("OptionPane.messageForeground"));
 - addMessageComponents(container, cons, label, maxll, true);
 - }
 - }
 - }
 - /**
 - * Returns the message to display from the JOptionPane the receiver is
 - * providing the look and feel for.
 - */
 - protected Object getMessage() {
 - inputComponent = null;
 - if (optionPane != null) {
 - if (optionPane.getWantsInput()) {
 - /* Create a user comopnent to capture the input. If the
 - selectionValues are non null the component and there
 - are < 20 values it'll be a combobox, if non null and
 - >= 20, it'll be a list, otherwise it'll be a textfield. */
 - Object message = optionPane.getMessage();
 - Object[] sValues = optionPane.getSelectionValues();
 - Object inputValue = optionPane
 - .getInitialSelectionValue();
 - JComponent toAdd;
 - if (sValues != null) {
 - if (sValues.length < 20) {
 - JComboBox cBox = new JComboBox();
 - for(int counter = 0, maxCounter = sValues.length;
 - counter < maxCounter; counter++) {
 - cBox.addItem(sValues[counter]);
 - }
 - if (inputValue != null) {
 - cBox.setSelectedItem(inputValue);
 - }
 - inputComponent = cBox;
 - toAdd = cBox;
 - } else {
 - JList list = new JList(sValues);
 - JScrollPane sp = new JScrollPane(list);
 - list.setVisibleRowCount(10);
 - if(inputValue != null)
 - list.setSelectedValue(inputValue, true);
 - list.addMouseListener(new ListSelectionListener());
 - toAdd = sp;
 - inputComponent = list;
 - }
 - } else {
 - JTextField tf = new JTextField(20);
 - if (inputValue != null) {
 - String inputString = inputValue.toString();
 - tf.setText(inputString);
 - tf.setSelectionStart(0);
 - tf.setSelectionEnd(inputString.length());
 - }
 - tf.addActionListener(new TextFieldActionListener());
 - toAdd = inputComponent = tf;
 - }
 - Object[] newMessage;
 - if (message == null) {
 - newMessage = new Object[1];
 - newMessage[0] = toAdd;
 - } else {
 - newMessage = new Object[2];
 - newMessage[0] = message;
 - newMessage[1] = toAdd;
 - }
 - return newMessage;
 - }
 - return optionPane.getMessage();
 - }
 - return null;
 - }
 - /**
 - * Creates and adds a JLabel representing the icon returned from
 - * <code>getIcon</code> to <code>top</code>. This is messaged from
 - * <code>createMessageArea</code>
 - */
 - protected void addIcon(Container top) {
 - /* Create the icon. */
 - Icon sideIcon = getIcon();
 - if (sideIcon != null) {
 - JLabel iconLabel = new JLabel(sideIcon);
 - iconLabel.setVerticalAlignment(SwingConstants.TOP);
 - top.add(iconLabel, BorderLayout.WEST);
 - }
 - }
 - /**
 - * Returns the icon from the JOptionPane the reciever is providing
 - * the look and feel for, or the default icon as returned from
 - * getDefaultIcon.
 - */
 - protected Icon getIcon() {
 - Icon mIcon = (optionPane == null ? null : optionPane.getIcon());
 - if(mIcon == null && optionPane != null)
 - mIcon = getIconForType(optionPane.getMessageType());
 - return mIcon;
 - }
 - /**
 - * Returns the icon to use for the passed in type.
 - */
 - protected Icon getIconForType(int messageType) {
 - if(messageType < 0 || messageType > 3)
 - return null;
 - switch(messageType) {
 - case 0:
 - return UIManager.getIcon("OptionPane.errorIcon");
 - case 1:
 - return UIManager.getIcon("OptionPane.informationIcon");
 - case 2:
 - return UIManager.getIcon("OptionPane.warningIcon");
 - case 3:
 - return UIManager.getIcon("OptionPane.questionIcon");
 - }
 - return null;
 - }
 - /**
 - * Returns the maximum number of characters to place on a line.
 - */
 - protected int getMaxCharactersPerLineCount() {
 - return optionPane.getMaxCharactersPerLineCount();
 - }
 - /**
 - * Recursively creates new JLabel instances to represent <code>d</code>.
 - * Each JLabel instance is added to <code>c</code>.
 - */
 - protected void burstStringInto(Container c, String d, int maxll) {
 - // Primitive line wrapping
 - int len = d.length();
 - if (len <= 0)
 - return;
 - if (len > maxll) {
 - int p = d.lastIndexOf(' ', maxll);
 - if (p <= 0)
 - p = d.indexOf(' ', maxll);
 - if (p > 0 && p < len) {
 - burstStringInto(c, d.substring(0, p), maxll);
 - burstStringInto(c, d.substring(p + 1), maxll);
 - return;
 - }
 - }
 - JLabel label = new JLabel(d, JLabel.LEFT);
 - label.setForeground(UIManager.getColor("OptionPane.messageForeground"));
 - c.add(label);
 - }
 - protected Container createSeparator() {
 - return null;
 - }
 - /**
 - * Creates and returns a Container containin the buttons. The buttons
 - * are created by calling <code>getButtons</code>.
 - */
 - protected Container createButtonArea() {
 - JPanel bottom = new JPanel();
 - bottom.setBorder(UIManager.getBorder("OptionPane.buttonAreaBorder"));
 - bottom.setLayout(new ButtonAreaLayout(true, 6));
 - addButtonComponents(bottom, getButtons(), getInitialValueIndex());
 - return bottom;
 - }
 - /**
 - * Creates the appropriate object to represent each of the objects in
 - * <code>buttons</code> and adds it to <code>container</code>. This
 - * differs from addMessageComponents in that it will recurse on
 - * <code>buttons</code> and that if button is not a Component
 - * it will create an instance of JButton.
 - */
 - protected void addButtonComponents(Container container, Object[] buttons,
 - int initialIndex) {
 - if (buttons != null && buttons.length > 0) {
 - boolean sizeButtonsToSame = getSizeButtonsToSameWidth();
 - boolean createdAll = true;
 - int numButtons = buttons.length;
 - JButton[] createdButtons = null;
 - int maxWidth = 0;
 - if (sizeButtonsToSame) {
 - createdButtons = new JButton[numButtons];
 - }
 - for(int counter = 0; counter < numButtons; counter++) {
 - Object button = buttons[counter];
 - Component newComponent;
 - if (button instanceof Component) {
 - createdAll = false;
 - newComponent = (Component)button;
 - container.add(newComponent);
 - hasCustomComponents = true;
 - } else {
 - JButton aButton;
 - if (button instanceof Icon)
 - aButton = new JButton((Icon)button);
 - else
 - aButton = new JButton(button.toString());
 - container.add(aButton);
 - ActionListener buttonListener = createButtonActionListener(counter);
 - if (buttonListener != null) {
 - aButton.addActionListener(buttonListener);
 - }
 - newComponent = aButton;
 - }
 - if (sizeButtonsToSame && createdAll &&
 - (newComponent instanceof JButton)) {
 - createdButtons[counter] = (JButton)newComponent;
 - maxWidth = Math.max(maxWidth,
 - newComponent.getMinimumSize().width);
 - }
 - if (counter == initialIndex) {
 - initialFocusComponent = newComponent;
 - if (initialFocusComponent instanceof JButton) {
 - JButton defaultB = (JButton)initialFocusComponent;
 - defaultB.addAncestorListener(new AncestorListener() {
 - public void ancestorAdded(AncestorEvent e) {
 - JButton defaultButton = (JButton)e.getComponent();
 - JRootPane root = SwingUtilities.getRootPane(defaultButton);
 - if (root != null) {
 - root.setDefaultButton(defaultButton);
 - }
 - }
 - public void ancestorRemoved(AncestorEvent event) {}
 - public void ancestorMoved(AncestorEvent event) {}
 - });
 - }
 - }
 - }
 - ((ButtonAreaLayout)container.getLayout()).
 - setSyncAllWidths((sizeButtonsToSame && createdAll));
 - /* Set the padding, windows seems to use 8 if <= 2 components,
 - otherwise 4 is used. It may actually just be the size of the
 - buttons is always the same, not sure. */
 - if (sizeButtonsToSame && createdAll) {
 - JButton aButton;
 - int padSize;
 - padSize = (numButtons <= 2? 8 : 4);
 - for(int counter = 0; counter < numButtons; counter++) {
 - aButton = createdButtons[counter];
 - aButton.setMargin(new Insets(2, padSize, 2, padSize));
 - }
 - }
 - }
 - }
 - protected ActionListener createButtonActionListener(int buttonIndex) {
 - return new ButtonActionListener(buttonIndex);
 - }
 - /**
 - * Returns the buttons to display from the JOptionPane the receiver is
 - * providing the look and feel for. If the JOptionPane has options
 - * set, they will be provided, otherwise if the optionType is
 - * YES_NO_OPTION, yesNoOptions is returned, if the type is
 - * YES_NO_CANCEL_OPTION yesNoCancelOptions is returned, otherwise
 - * defaultButtons are returned.
 - */
 - protected Object[] getButtons() {
 - if (optionPane != null) {
 - Object[] suppliedOptions = optionPane.getOptions();
 - if (suppliedOptions == null) {
 - Object[] defaultOptions;
 - int type = optionPane.getOptionType();
 - if (type == JOptionPane.YES_NO_OPTION) {
 - defaultOptions = new String[2];
 - defaultOptions[0] = UIManager.get("OptionPane.yesButtonText");
 - defaultOptions[1] = UIManager.get("OptionPane.noButtonText");
 - } else if (type == JOptionPane.YES_NO_CANCEL_OPTION) {
 - defaultOptions = new String[3];
 - defaultOptions[0] = UIManager.get("OptionPane.yesButtonText");
 - defaultOptions[1] = UIManager.get("OptionPane.noButtonText");
 - defaultOptions[2] = UIManager.get("OptionPane.cancelButtonText");
 - } else if (type == JOptionPane.OK_CANCEL_OPTION) {
 - defaultOptions = new String[2];
 - defaultOptions[0] = UIManager.get("OptionPane.okButtonText");
 - defaultOptions[1] = UIManager.get("OptionPane.cancelButtonText");
 - } else {
 - defaultOptions = new String[1];
 - defaultOptions[0] = UIManager.get("OptionPane.okButtonText");
 - }
 - return defaultOptions;
 - }
 - return suppliedOptions;
 - }
 - return null;
 - }
 - /**
 - * Returns true, basic L&F wants all the buttons to have the same
 - * width.
 - */
 - protected boolean getSizeButtonsToSameWidth() {
 - return true;
 - }
 - /**
 - * Returns the initial index into the buttons to select. The index
 - * is calculated from the initial value from the JOptionPane and
 - * options of the JOptionPane or 0.
 - */
 - protected int getInitialValueIndex() {
 - if (optionPane != null) {
 - Object iv = optionPane.getInitialValue();
 - Object[] options = optionPane.getOptions();
 - if(options == null) {
 - return 0;
 - }
 - else if(iv != null) {
 - for(int counter = options.length - 1; counter >= 0; counter--){
 - if(options[counter].equals(iv))
 - return counter;
 - }
 - }
 - }
 - return -1;
 - }
 - /**
 - * Sets the input value in the option pane the receiver is providing
 - * the look and feel for based on the value in the inputComponent.
 - */
 - protected void resetInputValue() {
 - if(inputComponent != null && (inputComponent instanceof JTextField)) {
 - optionPane.setInputValue(((JTextField)inputComponent).getText());
 - } else if(inputComponent != null &&
 - (inputComponent instanceof JComboBox)) {
 - optionPane.setInputValue(((JComboBox)inputComponent)
 - .getSelectedItem());
 - } else if(inputComponent != null) {
 - optionPane.setInputValue(((JList)inputComponent)
 - .getSelectedValue());
 - }
 - }
 - /**
 - * If inputComponent is non-null, the focus is requested on that,
 - * otherwise request focus on the default value
 - */
 - public void selectInitialValue(JOptionPane op) {
 - if (inputComponent != null)
 - inputComponent.requestFocus();
 - else {
 - if (initialFocusComponent != null)
 - initialFocusComponent.requestFocus();
 - if (initialFocusComponent instanceof JButton) {
 - JRootPane root = SwingUtilities.getRootPane(initialFocusComponent);
 - if (root != null) {
 - root.setDefaultButton((JButton)initialFocusComponent);
 - }
 - }
 - }
 - }
 - /**
 - * Returns true if in the last call to validateComponent the message
 - * or buttons contained a subclass of Component.
 - */
 - public boolean containsCustomComponents(JOptionPane op) {
 - return hasCustomComponents;
 - }
 - /**
 - * ButtonAreaLayout acts similiar to FlowLayout. It lays out all
 - * components from left to right. If syncAllWidths is true, the widths
 - * of each component will be set to the largest preferred size width.
 - *
 - * This inner class is marked "public" due to a compiler bug.
 - * This class should be treated as a "protected" inner class.
 - * Instantiate it only within subclasses of BasicOptionPaneUI.
 - */
 - public static class ButtonAreaLayout implements LayoutManager {
 - protected boolean syncAllWidths;
 - protected int padding;
 - /** If true, children are lumped together in parent. */
 - protected boolean centersChildren;
 - public ButtonAreaLayout(boolean syncAllWidths, int padding) {
 - this.syncAllWidths = syncAllWidths;
 - this.padding = padding;
 - centersChildren = true;
 - }
 - public void setSyncAllWidths(boolean newValue) {
 - syncAllWidths = newValue;
 - }
 - public boolean getSyncAllWidths() {
 - return syncAllWidths;
 - }
 - public void setPadding(int newPadding) {
 - this.padding = newPadding;
 - }
 - public int getPadding() {
 - return padding;
 - }
 - public void setCentersChildren(boolean newValue) {
 - centersChildren = newValue;
 - }
 - public boolean getCentersChildren() {
 - return centersChildren;
 - }
 - public void addLayoutComponent(String string, Component comp) {
 - }
 - public void layoutContainer(Container container) {
 - Component[] children = container.getComponents();
 - if(children != null && children.length > 0) {
 - int numChildren = children.length;
 - Dimension[] sizes = new Dimension[numChildren];
 - int counter;
 - int yLocation = container.getInsets().top;
 - if(syncAllWidths) {
 - int maxWidth = 0;
 - for(counter = 0; counter < numChildren; counter++) {
 - sizes[counter] = children[counter].getPreferredSize();
 - maxWidth = Math.max(maxWidth, sizes[counter].width);
 - }
 - int xLocation;
 - int xOffset;
 - if(getCentersChildren()) {
 - xLocation = (container.getSize().width -
 - (maxWidth * numChildren +
 - (numChildren - 1) * padding)) / 2;
 - xOffset = padding + maxWidth;
 - }
 - else {
 - if(numChildren > 1) {
 - xLocation = 0;
 - xOffset = (container.getSize().width -
 - (maxWidth * numChildren)) /
 - (numChildren - 1) + maxWidth;
 - }
 - else {
 - xLocation = (container.getSize().width -
 - maxWidth) / 2;
 - xOffset = 0;
 - }
 - }
 - for(counter = 0; counter < numChildren; counter++) {
 - children[counter].setBounds(xLocation, yLocation,
 - maxWidth,
 - sizes[counter].height);
 - xLocation += xOffset;
 - }
 - }
 - else {
 - int totalWidth = 0;
 - for(counter = 0; counter < numChildren; counter++) {
 - sizes[counter] = children[counter].getPreferredSize();
 - totalWidth += sizes[counter].width;
 - }
 - totalWidth += ((numChildren - 1) * padding);
 - boolean cc = getCentersChildren();
 - int xOffset;
 - int xLocation;
 - if(cc) {
 - xLocation = (container.getSize().width -
 - totalWidth) / 2;
 - xOffset = padding;
 - }
 - else {
 - if(numChildren > 1) {
 - xOffset = (container.getSize().width -
 - totalWidth) / (numChildren - 1);
 - xLocation = 0;
 - }
 - else {
 - xLocation = (container.getSize().width -
 - totalWidth) / 2;
 - xOffset = 0;
 - }
 - }
 - for(counter = 0; counter < numChildren; counter++) {
 - children[counter].setBounds(xLocation, yLocation,
 - sizes[counter].width, sizes[counter].height);
 - xLocation += xOffset + sizes[counter].width;
 - }
 - }
 - }
 - }
 - public Dimension minimumLayoutSize(Container c) {
 - if(c != null) {
 - Component[] children = c.getComponents();
 - if(children != null && children.length > 0) {
 - Dimension aSize;
 - int numChildren = children.length;
 - int height = 0;
 - Insets cInsets = c.getInsets();
 - int extraHeight = cInsets.top + cInsets.bottom;
 - if (syncAllWidths) {
 - int maxWidth = 0;
 - for(int counter = 0; counter < numChildren; counter++){
 - aSize = children[counter].getPreferredSize();
 - height = Math.max(height, aSize.height);
 - maxWidth = Math.max(maxWidth, aSize.width);
 - }
 - return new Dimension(maxWidth * numChildren +
 - (numChildren - 1) * padding,
 - extraHeight + height);
 - }
 - else {
 - int totalWidth = 0;
 - for(int counter = 0; counter < numChildren; counter++){
 - aSize = children[counter].getPreferredSize();
 - height = Math.max(height, aSize.height);
 - totalWidth += aSize.width;
 - }
 - totalWidth += ((numChildren - 1) * padding);
 - return new Dimension(totalWidth, extraHeight + height);
 - }
 - }
 - }
 - return new Dimension(0, 0);
 - }
 - public Dimension preferredLayoutSize(Container c) {
 - return minimumLayoutSize(c);
 - }
 - public void removeLayoutComponent(Component c) { }
 - }
 - /**
 - * This inner class is marked "public" due to a compiler bug.
 - * This class should be treated as a "protected" inner class.
 - * Instantiate it only within subclasses of BasicOptionPaneUI.
 - */
 - public class PropertyChangeHandler implements PropertyChangeListener {
 - /**
 - * If the source of the PropertyChangeEvent <code>e</code> equals the
 - * optionPane and is one of the ICON_PROPERTY, MESSAGE_PROPERTY,
 - * OPTIONS_PROPERTY or INITIAL_VALUE_PROPERTY,
 - * validateComponent is invoked.
 - */
 - public void propertyChange(PropertyChangeEvent e) {
 - if(e.getSource() == optionPane) {
 - String changeName = e.getPropertyName();
 - if(changeName.equals(JOptionPane.OPTIONS_PROPERTY) ||
 - changeName.equals(JOptionPane.INITIAL_VALUE_PROPERTY) ||
 - changeName.equals(JOptionPane.ICON_PROPERTY) ||
 - changeName.equals(JOptionPane.MESSAGE_TYPE_PROPERTY) ||
 - changeName.equals(JOptionPane.OPTION_TYPE_PROPERTY) ||
 - changeName.equals(JOptionPane.MESSAGE_PROPERTY) ||
 - changeName.equals(JOptionPane.SELECTION_VALUES_PROPERTY) ||
 - changeName.equals(JOptionPane.INITIAL_SELECTION_VALUE_PROPERTY) ||
 - changeName.equals(JOptionPane.WANTS_INPUT_PROPERTY)) {
 - uninstallComponents();
 - installComponents();
 - optionPane.validate();
 - }
 - }
 - }
 - }
 - /**
 - * This inner class is marked "public" due to a compiler bug.
 - * This class should be treated as a "protected" inner class.
 - * Instantiate it only within subclasses of BasicOptionPaneUI.
 - */
 - public class ButtonActionListener implements ActionListener {
 - protected int buttonIndex;
 - public ButtonActionListener(int buttonIndex) {
 - this.buttonIndex = buttonIndex;
 - }
 - public void actionPerformed(ActionEvent e) {
 - if (optionPane != null) {
 - int messageType = optionPane.getOptionType();
 - if (inputComponent != null &&
 - (messageType == JOptionPane.YES_NO_OPTION ||
 - messageType == JOptionPane.YES_NO_CANCEL_OPTION ||
 - messageType == JOptionPane.OK_CANCEL_OPTION) &&
 - buttonIndex == 0) {
 - resetInputValue();
 - }
 - Object[] options = optionPane.getOptions();
 - if (options == null) {
 - if (messageType == JOptionPane.OK_CANCEL_OPTION &&
 - buttonIndex == 1) {
 - optionPane.setValue(new Integer(2));
 - } else {
 - optionPane.setValue(new Integer(buttonIndex));
 - }
 - } else {
 - optionPane.setValue(options[buttonIndex]);
 - }
 - }
 - }
 - }
 - //
 - // Classed used when optionPane.getWantsInput returns true.
 - //
 - /**
 - * Listener when a JList is created to handle input from the user.
 - */
 - private class ListSelectionListener extends MouseAdapter
 - {
 - public void mousePressed(MouseEvent e) {
 - if (e.getClickCount() == 2) {
 - JList list = (JList)e.getSource();
 - int index = list.locationToIndex(e.getPoint());
 - optionPane.setInputValue(list.getModel().getElementAt(index));
 - }
 - }
 - }
 - /**
 - * Listener when a JTextField is created to handle input from the user.
 - */
 - private class TextFieldActionListener implements ActionListener
 - {
 - public void actionPerformed(ActionEvent e) {
 - optionPane.setInputValue(((JTextField)e.getSource()).getText());
 - }
 - }
 - // REMIND(aim,7/29/98): These actions should be broken
 - // out into protected inner classes in the next release where
 - // API changes are allowed
 - /**
 - * Registered in the ActionMap. Sets the value of the option pane
 - * to <code>JOptionPane.CLOSED_OPTION</code>.
 - */
 - private static class CloseAction extends AbstractAction {
 - public void actionPerformed(ActionEvent e) {
 - JOptionPane optionPane = (JOptionPane)e.getSource();
 - optionPane.setValue(new Integer(JOptionPane.CLOSED_OPTION));
 - }
 - }
 - }