| Method from javax.swing.plaf.basic.BasicOptionPaneUI Detail: |
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 ButtonFactory) {
aButton = ((ButtonFactory)button).createButton();
}
else if (button instanceof Icon)
aButton = new JButton((Icon)button);
else
aButton = new JButton(button.toString());
aButton.setName("OptionPane.button");
aButton.setMultiClickThreshhold(DefaultLookup.getInt(
optionPane, this, "OptionPane.buttonClickThreshhold",
0));
configureButton(aButton);
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.addHierarchyListener(new HierarchyListener() {
public void hierarchyChanged(HierarchyEvent e) {
if ((e.getChangeFlags() &
HierarchyEvent.PARENT_CHANGED) != 0) {
JButton defaultButton = (JButton) e.getComponent();
JRootPane root =
SwingUtilities.getRootPane(defaultButton);
if (root != null) {
root.setDefaultButton(defaultButton);
}
}
}
});
}
}
}
((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 (DefaultLookup.getBoolean(optionPane, this,
"OptionPane.setButtonMargin", true) && 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));
}
}
}
}
Creates the appropriate object to represent each of the objects in
buttons and adds it to container. This
differs from addMessageComponents in that it will recurse on
buttons and that if button is not a Component
it will create an instance of JButton. |
protected void addIcon(Container top) {
/* Create the icon. */
Icon sideIcon = getIcon();
if (sideIcon != null) {
JLabel iconLabel = new JLabel(sideIcon);
iconLabel.setName("OptionPane.iconLabel");
iconLabel.setVerticalAlignment(SwingConstants.TOP);
top.add(iconLabel, BorderLayout.BEFORE_LINE_BEGINS);
}
}
Creates and adds a JLabel representing the icon returned from
getIcon to top. This is messaged from
createMessageArea |
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 );
configureMessageLabel(label);
addMessageComponents(container, cons, label, maxll, true);
} else {
String s = msg.toString();
int len = s.length();
if (len < = 0) {
return;
}
int nl = -1;
int nll = 0;
if ((nl = s.indexOf(newline)) >= 0) {
nll = newline.length();
} else if ((nl = s.indexOf("\r\n")) >= 0) {
nll = 2;
} else if ((nl = s.indexOf('\n")) >= 0) {
nll = 1;
}
if (nl >= 0) {
// break up newlines
if (nl == 0) {
JPanel breakPanel = new JPanel() {
public Dimension getPreferredSize() {
Font f = getFont();
if (f != null) {
return new Dimension(1, f.getSize() + 2);
}
return new Dimension(0, 0);
}
};
breakPanel.setName("OptionPane.break");
addMessageComponents(container, cons, breakPanel, maxll,
true);
} else {
addMessageComponents(container, cons, s.substring(0, nl),
maxll, false);
}
addMessageComponents(container, cons, s.substring(nl + nll), maxll,
false);
} else if (len > maxll) {
Container c = Box.createVerticalBox();
c.setName("OptionPane.verticalBox");
burstStringInto(c, s, maxll);
addMessageComponents(container, cons, c, maxll, true );
} else {
JLabel label;
label = new JLabel( s, JLabel.LEADING );
label.setName("OptionPane.label");
configureMessageLabel(label);
addMessageComponents(container, cons, label, maxll, true);
}
}
}
Creates the appropriate object to represent msg and
places it into container. If msg 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 d is an Object[], this
method will be recursively invoked for the children.
internallyCreated 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 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.setName("OptionPane.label");
configureMessageLabel(label);
c.add(label);
}
Recursively creates new JLabel instances to represent d.
Each JLabel instance is added to c. |
public boolean containsCustomComponents(JOptionPane op) {
return hasCustomComponents;
}
Returns true if in the last call to validateComponent the message
or buttons contained a subclass of Component. |
protected ActionListener createButtonActionListener(int buttonIndex) {
return new ButtonActionListener(buttonIndex);
}
|
protected Container createButtonArea() {
JPanel bottom = new JPanel();
Border border = (Border)DefaultLookup.get(optionPane, this,
"OptionPane.buttonAreaBorder");
bottom.setName("OptionPane.buttonArea");
if (border != null) {
bottom.setBorder(border);
}
bottom.setLayout(new ButtonAreaLayout(
DefaultLookup.getBoolean(optionPane, this,
"OptionPane.sameSizeButtons", true),
DefaultLookup.getInt(optionPane, this, "OptionPane.buttonPadding",
6),
DefaultLookup.getInt(optionPane, this,
"OptionPane.buttonOrientation", SwingConstants.CENTER),
DefaultLookup.getBoolean(optionPane, this, "OptionPane.isYesLast",
false)));
addButtonComponents(bottom, getButtons(), getInitialValueIndex());
return bottom;
}
Creates and returns a Container containing the buttons. The buttons
are created by calling getButtons. |
protected LayoutManager createLayoutManager() {
return new BoxLayout(optionPane, BoxLayout.Y_AXIS);
}
|
protected Container createMessageArea() {
JPanel top = new JPanel();
Border topBorder = (Border)DefaultLookup.get(optionPane, this,
"OptionPane.messageAreaBorder");
if (topBorder != null) {
top.setBorder(topBorder);
}
top.setLayout(new BorderLayout());
/* Fill the body. */
Container body = new JPanel(new GridBagLayout());
Container realBody = new JPanel(new BorderLayout());
body.setName("OptionPane.body");
realBody.setName("OptionPane.realBody");
if (getIcon() != null) {
JPanel sep = new JPanel();
sep.setName("OptionPane.separator");
sep.setPreferredSize(new Dimension(15, 1));
realBody.add(sep, BorderLayout.BEFORE_LINE_BEGINS);
}
realBody.add(body, BorderLayout.CENTER);
GridBagConstraints cons = new GridBagConstraints();
cons.gridx = cons.gridy = 0;
cons.gridwidth = GridBagConstraints.REMAINDER;
cons.gridheight = 1;
cons.anchor = DefaultLookup.getInt(optionPane, this,
"OptionPane.messageAnchor", GridBagConstraints.CENTER);
cons.insets = new Insets(0,0,3,0);
addMessageComponents(body, cons, getMessage(),
getMaxCharactersPerLineCount(), false);
top.add(realBody, BorderLayout.CENTER);
addIcon(top);
return top;
}
Messaged from installComponents to create a Container containing the
body of the message. The icon is the created by calling
addIcon. |
protected PropertyChangeListener createPropertyChangeListener() {
return getHandler();
}
|
protected Container createSeparator() {
return null;
}
|
public static ComponentUI createUI(JComponent x) {
return new BasicOptionPaneUI();
}
Creates a new BasicOptionPaneUI instance. |
protected Object[] getButtons() {
if (optionPane != null) {
Object[] suppliedOptions = optionPane.getOptions();
if (suppliedOptions == null) {
Object[] defaultOptions;
int type = optionPane.getOptionType();
Locale l = optionPane.getLocale();
int minimumWidth =
DefaultLookup.getInt(optionPane, this,
"OptionPane.buttonMinimumWidth",-1);
if (type == JOptionPane.YES_NO_OPTION) {
defaultOptions = new ButtonFactory[2];
defaultOptions[0] = new ButtonFactory(
UIManager.getString("OptionPane.yesButtonText", l),
getMnemonic("OptionPane.yesButtonMnemonic", l),
(Icon)DefaultLookup.get(optionPane, this,
"OptionPane.yesIcon"), minimumWidth);
defaultOptions[1] = new ButtonFactory(
UIManager.getString("OptionPane.noButtonText", l),
getMnemonic("OptionPane.noButtonMnemonic", l),
(Icon)DefaultLookup.get(optionPane, this,
"OptionPane.noIcon"), minimumWidth);
} else if (type == JOptionPane.YES_NO_CANCEL_OPTION) {
defaultOptions = new ButtonFactory[3];
defaultOptions[0] = new ButtonFactory(
UIManager.getString("OptionPane.yesButtonText", l),
getMnemonic("OptionPane.yesButtonMnemonic", l),
(Icon)DefaultLookup.get(optionPane, this,
"OptionPane.yesIcon"), minimumWidth);
defaultOptions[1] = new ButtonFactory(
UIManager.getString("OptionPane.noButtonText",l),
getMnemonic("OptionPane.noButtonMnemonic", l),
(Icon)DefaultLookup.get(optionPane, this,
"OptionPane.noIcon"), minimumWidth);
defaultOptions[2] = new ButtonFactory(
UIManager.getString("OptionPane.cancelButtonText",l),
getMnemonic("OptionPane.cancelButtonMnemonic", l),
(Icon)DefaultLookup.get(optionPane, this,
"OptionPane.cancelIcon"), minimumWidth);
} else if (type == JOptionPane.OK_CANCEL_OPTION) {
defaultOptions = new ButtonFactory[2];
defaultOptions[0] = new ButtonFactory(
UIManager.getString("OptionPane.okButtonText",l),
getMnemonic("OptionPane.okButtonMnemonic", l),
(Icon)DefaultLookup.get(optionPane, this,
"OptionPane.okIcon"), minimumWidth);
defaultOptions[1] = new ButtonFactory(
UIManager.getString("OptionPane.cancelButtonText",l),
getMnemonic("OptionPane.cancelButtonMnemonic", l),
(Icon)DefaultLookup.get(optionPane, this,
"OptionPane.cancelIcon"), minimumWidth);
} else {
defaultOptions = new ButtonFactory[1];
defaultOptions[0] = new ButtonFactory(
UIManager.getString("OptionPane.okButtonText",l),
getMnemonic("OptionPane.okButtonMnemonic", l),
(Icon)DefaultLookup.get(optionPane, this,
"OptionPane.okIcon"), minimumWidth);
}
return defaultOptions;
}
return suppliedOptions;
}
return null;
}
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 Icon getIcon() {
Icon mIcon = (optionPane == null ? null : optionPane.getIcon());
if(mIcon == null && optionPane != null)
mIcon = getIconForType(optionPane.getMessageType());
return mIcon;
}
Returns the icon from the JOptionPane the receiver is providing
the look and feel for, or the default icon as returned from
getDefaultIcon. |
protected Icon getIconForType(int messageType) {
if(messageType < 0 || messageType > 3)
return null;
String propertyName = null;
switch(messageType) {
case 0:
propertyName = "OptionPane.errorIcon";
break;
case 1:
propertyName = "OptionPane.informationIcon";
break;
case 2:
propertyName = "OptionPane.warningIcon";
break;
case 3:
propertyName = "OptionPane.questionIcon";
break;
}
if (propertyName != null) {
return (Icon)DefaultLookup.get(optionPane, this, propertyName);
}
return null;
}
Returns the icon to use for the passed in type. |
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;
}
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. |
InputMap getInputMap(int condition) {
if (condition == JComponent.WHEN_IN_FOCUSED_WINDOW) {
Object[] bindings = (Object[])DefaultLookup.get(
optionPane, this, "OptionPane.windowBindings");
if (bindings != null) {
return LookAndFeel.makeComponentInputMap(optionPane, bindings);
}
}
return null;
}
|
protected int getMaxCharactersPerLineCount() {
return optionPane.getMaxCharactersPerLineCount();
}
Returns the maximum number of characters to place on a line. |
protected Object getMessage() {
inputComponent = null;
if (optionPane != null) {
if (optionPane.getWantsInput()) {
/* Create a user component 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();
cBox.setName("OptionPane.comboBox");
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);
sp.setName("OptionPane.scrollPane");
list.setName("OptionPane.list");
list.setVisibleRowCount(10);
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
if(inputValue != null)
list.setSelectedValue(inputValue, true);
list.addMouseListener(getHandler());
toAdd = sp;
inputComponent = list;
}
} else {
MultiplexingTextField tf = new MultiplexingTextField(20);
tf.setName("OptionPane.textField");
tf.setKeyStrokes(new KeyStroke[] {
KeyStroke.getKeyStroke("ENTER") } );
if (inputValue != null) {
String inputString = inputValue.toString();
tf.setText(inputString);
tf.setSelectionStart(0);
tf.setSelectionEnd(inputString.length());
}
tf.addActionListener(getHandler());
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;
}
Returns the message to display from the JOptionPane the receiver is
providing the look and feel for. |
public Dimension getMinimumOptionPaneSize() {
if (minimumSize == null) {
return new Dimension(MinimumWidth, MinimumHeight);
}
return new Dimension(minimumSize.width,
minimumSize.height);
}
Returns the minimum size the option pane should be. Primarily
provided for subclassers wishing to offer a different minimum size. |
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;
}
If c is the JOptionPane the receiver
is contained in, the preferred
size that is returned is the maximum of the preferred size of
the LayoutManager for the JOptionPane, and
getMinimumOptionPaneSize. |
protected boolean getSizeButtonsToSameWidth() {
return true;
}
Returns true, basic L&F wants all the buttons to have the same
width. |
protected void installComponents() {
optionPane.add(createMessageArea());
Container separator = createSeparator();
if (separator != null) {
optionPane.add(separator);
}
optionPane.add(createButtonArea());
optionPane.applyComponentOrientation(optionPane.getComponentOrientation());
}
|
protected void installDefaults() {
LookAndFeel.installColorsAndFont(optionPane, "OptionPane.background",
"OptionPane.foreground", "OptionPane.font");
LookAndFeel.installBorder(optionPane, "OptionPane.border");
minimumSize = UIManager.getDimension("OptionPane.minimumSize");
LookAndFeel.installProperty(optionPane, "opaque", Boolean.TRUE);
}
|
protected void installKeyboardActions() {
InputMap map = getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
SwingUtilities.replaceUIInputMap(optionPane, JComponent.
WHEN_IN_FOCUSED_WINDOW, map);
LazyActionMap.installLazyActionMap(optionPane, BasicOptionPaneUI.class,
"OptionPane.actionMap");
}
|
protected void installListeners() {
if ((propertyChangeListener = createPropertyChangeListener()) != null) {
optionPane.addPropertyChangeListener(propertyChangeListener);
}
}
|
public void installUI(JComponent c) {
optionPane = (JOptionPane)c;
installDefaults();
optionPane.setLayout(createLayoutManager());
installComponents();
installListeners();
installKeyboardActions();
}
Installs the receiver as the L&F for the passed in
JOptionPane. |
static void loadActionMap(LazyActionMap map) {
newline = (String)java.security.AccessController.doPrivileged(
new GetPropertyAction("line.separator"));
if (newline == null) {
newline = "\n";
}
map.put(new Actions(Actions.CLOSE));
BasicLookAndFeel.installAudioActionMap(map);
}
|
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());
}
}
Sets the input value in the option pane the receiver is providing
the look and feel for based on the value in the inputComponent. |
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);
}
}
}
}
If inputComponent is non-null, the focus is requested on that,
otherwise request focus on the default value |
protected void uninstallComponents() {
hasCustomComponents = false;
inputComponent = null;
initialFocusComponent = null;
optionPane.removeAll();
}
|
protected void uninstallDefaults() {
LookAndFeel.uninstallBorder(optionPane);
}
|
protected void uninstallKeyboardActions() {
SwingUtilities.replaceUIInputMap(optionPane, JComponent.
WHEN_IN_FOCUSED_WINDOW, null);
SwingUtilities.replaceUIActionMap(optionPane, null);
}
|
protected void uninstallListeners() {
if (propertyChangeListener != null) {
optionPane.removePropertyChangeListener(propertyChangeListener);
propertyChangeListener = null;
}
handler = null;
}
|
public void uninstallUI(JComponent c) {
uninstallComponents();
optionPane.setLayout(null);
uninstallKeyboardActions();
uninstallListeners();
uninstallDefaults();
optionPane = null;
}
Removes the receiver from the L&F controller of the passed in split
pane. |