| /* | |
|  * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. | |
|  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
|  * | |
|  * This code is free software; you can redistribute it and/or modify it | |
|  * under the terms of the GNU General Public License version 2 only, as | |
|  * published by the Free Software Foundation.  Oracle designates this | |
|  * particular file as subject to the "Classpath" exception as provided | |
|  * by Oracle in the LICENSE file that accompanied this code. | |
|  * | |
|  * This code is distributed in the hope that it will be useful, but WITHOUT | |
|  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
|  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License | |
|  * version 2 for more details (a copy is included in the LICENSE file that | |
|  * accompanied this code). | |
|  * | |
|  * You should have received a copy of the GNU General Public License version | |
|  * 2 along with this work; if not, write to the Free Software Foundation, | |
|  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
|  * | |
|  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
|  * or visit www.oracle.com if you need additional information or have any | |
|  * questions. | |
| */ | |
| package javax.swing; | |
| import java.awt.Component; | |
| import java.awt.Font; | |
| import java.awt.Image; | |
| import java.awt.*; | |
| import java.text.*; | |
| import java.awt.geom.*; | |
| import java.beans.Transient; | |
| import java.io.ObjectOutputStream; | |
| import java.io.ObjectInputStream; | |
| import java.io.IOException; | |
| import javax.swing.plaf.LabelUI; | |
| import javax.accessibility.*; | |
| import javax.swing.text.*; | |
| import javax.swing.text.html.*; | |
| import javax.swing.plaf.basic.*; | |
| import java.util.*; | |
| /** | |
|  * A display area for a short text string or an image, | |
|  * or both. | |
|  * A label does not react to input events. | |
|  * As a result, it cannot get the keyboard focus. | |
|  * A label can, however, display a keyboard alternative | |
|  * as a convenience for a nearby component | |
|  * that has a keyboard alternative but can't display it. | |
|  * <p> | |
|  * A <code>JLabel</code> object can display | |
|  * either text, an image, or both. | |
|  * You can specify where in the label's display area | |
|  * the label's contents are aligned | |
|  * by setting the vertical and horizontal alignment. | |
|  * By default, labels are vertically centered | |
|  * in their display area. | |
|  * Text-only labels are leading edge aligned, by default; | |
|  * image-only labels are horizontally centered, by default. | |
|  * <p> | |
|  * You can also specify the position of the text | |
|  * relative to the image. | |
|  * By default, text is on the trailing edge of the image, | |
|  * with the text and image vertically aligned. | |
|  * <p> | |
|  * A label's leading and trailing edge are determined from the value of its | |
|  * {@link java.awt.ComponentOrientation} property.  At present, the default | |
|  * ComponentOrientation setting maps the leading edge to left and the trailing | |
|  * edge to right. | |
|  * | |
|  * <p> | |
|  * Finally, you can use the <code>setIconTextGap</code> method | |
|  * to specify how many pixels | |
|  * should appear between the text and the image. | |
|  * The default is 4 pixels. | |
|  * <p> | |
|  * See <a href="https://docs.oracle.com/javase/tutorial/uiswing/components/label.html">How to Use Labels</a> | |
|  * in <em>The Java Tutorial</em> | |
|  * for further documentation. | |
|  * <p> | |
|  * <strong>Warning:</strong> Swing is not thread safe. For more | |
|  * information see <a | |
|  * href="package-summary.html#threading">Swing's Threading | |
|  * Policy</a>. | |
|  * <p> | |
|  * <strong>Warning:</strong> | |
|  * 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.  As of 1.4, support for long term storage | |
|  * of all JavaBeans™ | |
|  * has been added to the <code>java.beans</code> package. | |
|  * Please see {@link java.beans.XMLEncoder}. | |
|  * | |
|  * @beaninfo | |
|  *   attribute: isContainer false | |
|  * description: A component that displays a short string and an icon. | |
|  * | |
|  * @author Hans Muller | |
| */ | |
| @SuppressWarnings("serial") | |
| public class JLabel extends JComponent implements SwingConstants, Accessible | |
| { | |
|     /** | |
|      * @see #getUIClassID | |
|      * @see #readObject | |
| */ | |
| private static final String uiClassID = "LabelUI"; | |
| private int mnemonic = '\0'; | |
| private int mnemonicIndex = -1; | |
| private String text = ""; // "" rather than null, for BeanBox | |
| private Icon defaultIcon = null; | |
| private Icon disabledIcon = null; | |
| private boolean disabledIconSet = false; | |
| private int verticalAlignment = CENTER; | |
| private int horizontalAlignment = LEADING; | |
| private int verticalTextPosition = CENTER; | |
| private int horizontalTextPosition = TRAILING; | |
| private int iconTextGap = 4; | |
| protected Component labelFor = null; | |
|     /** | |
|      * Client property key used to determine what label is labeling the | |
|      * component.  This is generally not used by labels, but is instead | |
|      * used by components such as text areas that are being labeled by | |
|      * labels.  When the labelFor property of a label is set, it will | |
|      * automatically set the LABELED_BY_PROPERTY of the component being | |
|      * labelled. | |
|      * | |
|      * @see #setLabelFor | |
| */ | |
| static final String LABELED_BY_PROPERTY = "labeledBy"; | |
|     /** | |
|      * Creates a <code>JLabel</code> instance with the specified | |
|      * text, image, and horizontal alignment. | |
|      * The label is centered vertically in its display area. | |
|      * The text is on the trailing edge of the image. | |
|      * | |
|      * @param text  The text to be displayed by the label. | |
|      * @param icon  The image to be displayed by the label. | |
|      * @param horizontalAlignment  One of the following constants | |
|      *           defined in <code>SwingConstants</code>: | |
|      *           <code>LEFT</code>, | |
|      *           <code>CENTER</code>, | |
|      *           <code>RIGHT</code>, | |
|      *           <code>LEADING</code> or | |
|      *           <code>TRAILING</code>. | |
| */ | |
| public JLabel(String text, Icon icon, int horizontalAlignment) { | |
| setText(text); | |
| setIcon(icon); | |
| setHorizontalAlignment(horizontalAlignment); | |
| updateUI(); | |
| setAlignmentX(LEFT_ALIGNMENT); | |
| } | |
|     /** | |
|      * Creates a <code>JLabel</code> instance with the specified | |
|      * text and horizontal alignment. | |
|      * The label is centered vertically in its display area. | |
|      * | |
|      * @param text  The text to be displayed by the label. | |
|      * @param horizontalAlignment  One of the following constants | |
|      *           defined in <code>SwingConstants</code>: | |
|      *           <code>LEFT</code>, | |
|      *           <code>CENTER</code>, | |
|      *           <code>RIGHT</code>, | |
|      *           <code>LEADING</code> or | |
|      *           <code>TRAILING</code>. | |
| */ | |
| public JLabel(String text, int horizontalAlignment) { | |
| this(text, null, horizontalAlignment); | |
| } | |
|     /** | |
|      * Creates a <code>JLabel</code> instance with the specified text. | |
|      * The label is aligned against the leading edge of its display area, | |
|      * and centered vertically. | |
|      * | |
|      * @param text  The text to be displayed by the label. | |
| */ | |
| public JLabel(String text) { | |
| this(text, null, LEADING); | |
| } | |
|     /** | |
|      * Creates a <code>JLabel</code> instance with the specified | |
|      * image and horizontal alignment. | |
|      * The label is centered vertically in its display area. | |
|      * | |
|      * @param image  The image to be displayed by the label. | |
|      * @param horizontalAlignment  One of the following constants | |
|      *           defined in <code>SwingConstants</code>: | |
|      *           <code>LEFT</code>, | |
|      *           <code>CENTER</code>, | |
|      *           <code>RIGHT</code>, | |
|      *           <code>LEADING</code> or | |
|      *           <code>TRAILING</code>. | |
| */ | |
| public JLabel(Icon image, int horizontalAlignment) { | |
| this(null, image, horizontalAlignment); | |
| } | |
|     /** | |
|      * Creates a <code>JLabel</code> instance with the specified image. | |
|      * The label is centered vertically and horizontally | |
|      * in its display area. | |
|      * | |
|      * @param image  The image to be displayed by the label. | |
| */ | |
| public JLabel(Icon image) { | |
| this(null, image, CENTER); | |
| } | |
|     /** | |
|      * Creates a <code>JLabel</code> instance with | |
|      * no image and with an empty string for the title. | |
|      * The label is centered vertically | |
|      * in its display area. | |
|      * The label's contents, once set, will be displayed on the leading edge | |
|      * of the label's display area. | |
| */ | |
|     public JLabel() { | |
|         this("", null, LEADING); | |
| } | |
|     /** | |
|      * Returns the L&F object that renders this component. | |
|      * | |
|      * @return LabelUI object | |
| */ | |
| public LabelUI getUI() { | |
| return (LabelUI)ui; | |
| } | |
|     /** | |
|      * Sets the L&F object that renders this component. | |
|      * | |
|      * @param ui  the LabelUI L&F object | |
|      * @see UIDefaults#getUI | |
|      * @beaninfo | |
|      *        bound: true | |
|      *       hidden: true | |
|      *    attribute: visualUpdate true | |
|      *  description: The UI object that implements the Component's LookAndFeel. | |
| */ | |
| public void setUI(LabelUI ui) { | |
| super.setUI(ui); | |
|         // disabled icon is generated by LF so it should be unset here | |
| if (!disabledIconSet && disabledIcon != null) { | |
| setDisabledIcon(null); | |
| } | |
| } | |
|     /** | |
|      * Resets the UI property to a value from the current look and feel. | |
|      * | |
|      * @see JComponent#updateUI | |
| */ | |
|     public void updateUI() { | |
| setUI((LabelUI)UIManager.getUI(this)); | |
| } | |
|     /** | |
|      * Returns a string that specifies the name of the l&f class | |
|      * that renders this component. | |
|      * | |
|      * @return String "LabelUI" | |
|      * | |
|      * @see JComponent#getUIClassID | |
|      * @see UIDefaults#getUI | |
| */ | |
| public String getUIClassID() { | |
| return uiClassID; | |
| } | |
|     /** | |
|      * Returns the text string that the label displays. | |
|      * | |
|      * @return a String | |
|      * @see #setText | |
| */ | |
| public String getText() { | |
| return text; | |
| } | |
|     /** | |
|      * Defines the single line of text this component will display.  If | |
|      * the value of text is null or empty string, nothing is displayed. | |
|      * <p> | |
|      * The default value of this property is null. | |
|      * <p> | |
|      * This is a JavaBeans bound property. | |
|      * | |
|      * @see #setVerticalTextPosition | |
|      * @see #setHorizontalTextPosition | |
|      * @see #setIcon | |
|      * @beaninfo | |
|      *    preferred: true | |
|      *        bound: true | |
|      *    attribute: visualUpdate true | |
|      *  description: Defines the single line of text this component will display. | |
| */ | |
| public void setText(String text) { | |
| String oldAccessibleName = null; | |
|         if (accessibleContext != null) { | |
| oldAccessibleName = accessibleContext.getAccessibleName(); | |
| } | |
| String oldValue = this.text; | |
| this.text = text; | |
| firePropertyChange("text", oldValue, text); | |
| setDisplayedMnemonicIndex( | |
| SwingUtilities.findDisplayedMnemonicIndex( | |
| text, getDisplayedMnemonic())); | |
| if ((accessibleContext != null) | |
| && (accessibleContext.getAccessibleName() != oldAccessibleName)) { | |
| accessibleContext.firePropertyChange( | |
| AccessibleContext.ACCESSIBLE_VISIBLE_DATA_PROPERTY, | |
| oldAccessibleName, | |
| accessibleContext.getAccessibleName()); | |
| } | |
| if (text == null || oldValue == null || !text.equals(oldValue)) { | |
| revalidate(); | |
| repaint(); | |
| } | |
| } | |
|     /** | |
|      * Returns the graphic image (glyph, icon) that the label displays. | |
|      * | |
|      * @return an Icon | |
|      * @see #setIcon | |
| */ | |
| public Icon getIcon() { | |
| return defaultIcon; | |
| } | |
|     /** | |
|      * Defines the icon this component will display.  If | |
|      * the value of icon is null, nothing is displayed. | |
|      * <p> | |
|      * The default value of this property is null. | |
|      * <p> | |
|      * This is a JavaBeans bound property. | |
|      * | |
|      * @see #setVerticalTextPosition | |
|      * @see #setHorizontalTextPosition | |
|      * @see #getIcon | |
|      * @beaninfo | |
|      *    preferred: true | |
|      *        bound: true | |
|      *    attribute: visualUpdate true | |
|      *  description: The icon this component will display. | |
| */ | |
| public void setIcon(Icon icon) { | |
| Icon oldValue = defaultIcon; | |
| defaultIcon = icon; | |
|         /* If the default icon has really changed and we had | |
|          * generated the disabled icon for this component | |
|          * (in other words, setDisabledIcon() was never called), then | |
|          * clear the disabledIcon field. | |
| */ | |
| if ((defaultIcon != oldValue) && !disabledIconSet) { | |
| disabledIcon = null; | |
| } | |
| firePropertyChange("icon", oldValue, defaultIcon); | |
| if ((accessibleContext != null) && (oldValue != defaultIcon)) { | |
| accessibleContext.firePropertyChange( | |
| AccessibleContext.ACCESSIBLE_VISIBLE_DATA_PROPERTY, | |
| oldValue, defaultIcon); | |
| } | |
|         /* If the default icon has changed and the new one is | |
|          * a different size, then revalidate.   Repaint if the | |
|          * default icon has changed. | |
| */ | |
| if (defaultIcon != oldValue) { | |
| if ((defaultIcon == null) || | |
| (oldValue == null) || | |
| (defaultIcon.getIconWidth() != oldValue.getIconWidth()) || | |
| (defaultIcon.getIconHeight() != oldValue.getIconHeight())) { | |
| revalidate(); | |
| } | |
| repaint(); | |
| } | |
| } | |
|     /** | |
|      * Returns the icon used by the label when it's disabled. | |
|      * If no disabled icon has been set this will forward the call to | |
|      * the look and feel to construct an appropriate disabled Icon. | |
|      * <p> | |
|      * Some look and feels might not render the disabled Icon, in which | |
|      * case they will ignore this. | |
|      * | |
|      * @return the <code>disabledIcon</code> property | |
|      * @see #setDisabledIcon | |
|      * @see javax.swing.LookAndFeel#getDisabledIcon | |
|      * @see ImageIcon | |
| */ | |
| @Transient | |
| public Icon getDisabledIcon() { | |
| if (!disabledIconSet && disabledIcon == null && defaultIcon != null) { | |
| disabledIcon = UIManager.getLookAndFeel().getDisabledIcon(this, defaultIcon); | |
| if (disabledIcon != null) { | |
| firePropertyChange("disabledIcon", null, disabledIcon); | |
| } | |
| } | |
| return disabledIcon; | |
| } | |
|     /** | |
|      * Set the icon to be displayed if this JLabel is "disabled" | |
|      * (JLabel.setEnabled(false)). | |
|      * <p> | |
|      * The default value of this property is null. | |
|      * | |
|      * @param disabledIcon the Icon to display when the component is disabled | |
|      * @see #getDisabledIcon | |
|      * @see #setEnabled | |
|      * @beaninfo | |
|      *        bound: true | |
|      *    attribute: visualUpdate true | |
|      *  description: The icon to display if the label is disabled. | |
| */ | |
| public void setDisabledIcon(Icon disabledIcon) { | |
| Icon oldValue = this.disabledIcon; | |
| this.disabledIcon = disabledIcon; | |
| disabledIconSet = (disabledIcon != null); | |
| firePropertyChange("disabledIcon", oldValue, disabledIcon); | |
| if (disabledIcon != oldValue) { | |
| if (disabledIcon == null || oldValue == null || | |
| disabledIcon.getIconWidth() != oldValue.getIconWidth() || | |
| disabledIcon.getIconHeight() != oldValue.getIconHeight()) { | |
| revalidate(); | |
| } | |
| if (!isEnabled()) { | |
| repaint(); | |
| } | |
| } | |
| } | |
|     /** | |
|      * Specify a keycode that indicates a mnemonic key. | |
|      * This property is used when the label is part of a larger component. | |
|      * If the labelFor property of the label is not null, the label will | |
|      * call the requestFocus method of the component specified by the | |
|      * labelFor property when the mnemonic is activated. | |
|      * | |
|      * @see #getLabelFor | |
|      * @see #setLabelFor | |
|      * @beaninfo | |
|      *        bound: true | |
|      *    attribute: visualUpdate true | |
|      *  description: The mnemonic keycode. | |
| */ | |
|     public void setDisplayedMnemonic(int key) { | |
| int oldKey = mnemonic; | |
| mnemonic = key; | |
| firePropertyChange("displayedMnemonic", oldKey, mnemonic); | |
| setDisplayedMnemonicIndex( | |
| SwingUtilities.findDisplayedMnemonicIndex(getText(), mnemonic)); | |
| if (key != oldKey) { | |
| revalidate(); | |
| repaint(); | |
| } | |
| } | |
|     /** | |
|      * Specifies the displayedMnemonic as a char value. | |
|      * | |
|      * @param aChar  a char specifying the mnemonic to display | |
|      * @see #setDisplayedMnemonic(int) | |
| */ | |
|     public void setDisplayedMnemonic(char aChar) { | |
| int vk = java.awt.event.KeyEvent.getExtendedKeyCodeForChar(aChar); | |
| if (vk != java.awt.event.KeyEvent.VK_UNDEFINED) { | |
| setDisplayedMnemonic(vk); | |
| } | |
| } | |
|     /** | |
|      * Return the keycode that indicates a mnemonic key. | |
|      * This property is used when the label is part of a larger component. | |
|      * If the labelFor property of the label is not null, the label will | |
|      * call the requestFocus method of the component specified by the | |
|      * labelFor property when the mnemonic is activated. | |
|      * | |
|      * @return int value for the mnemonic key | |
|      * | |
|      * @see #getLabelFor | |
|      * @see #setLabelFor | |
| */ | |
|     public int getDisplayedMnemonic() { | |
| return mnemonic; | |
| } | |
|     /** | |
|      * Provides a hint to the look and feel as to which character in the | |
|      * text should be decorated to represent the mnemonic. Not all look and | |
|      * feels may support this. A value of -1 indicates either there is no | |
|      * mnemonic, the mnemonic character is not contained in the string, or | |
|      * the developer does not wish the mnemonic to be displayed. | |
|      * <p> | |
|      * The value of this is updated as the properties relating to the | |
|      * mnemonic change (such as the mnemonic itself, the text...). | |
|      * You should only ever have to call this if | |
|      * you do not wish the default character to be underlined. For example, if | |
|      * the text was 'Save As', with a mnemonic of 'a', and you wanted the 'A' | |
|      * to be decorated, as 'Save <u>A</u>s', you would have to invoke | |
|      * <code>setDisplayedMnemonicIndex(5)</code> after invoking | |
|      * <code>setDisplayedMnemonic(KeyEvent.VK_A)</code>. | |
|      * | |
|      * @since 1.4 | |
|      * @param index Index into the String to underline | |
|      * @exception IllegalArgumentException will be thrown if <code>index</code> | |
|      *            is >= length of the text, or < -1 | |
|      * | |
|      * @beaninfo | |
|      *        bound: true | |
|      *    attribute: visualUpdate true | |
|      *  description: the index into the String to draw the keyboard character | |
|      *               mnemonic at | |
| */ | |
| public void setDisplayedMnemonicIndex(int index) | |
| throws IllegalArgumentException { | |
| int oldValue = mnemonicIndex; | |
| if (index == -1) { | |
| mnemonicIndex = -1; | |
|         } else { | |
| String text = getText(); | |
| int textLength = (text == null) ? 0 : text.length(); | |
| if (index < -1 || index >= textLength) { // index out of range | |
| throw new IllegalArgumentException("index == " + index); | |
| } | |
| } | |
| mnemonicIndex = index; | |
| firePropertyChange("displayedMnemonicIndex", oldValue, index); | |
| if (index != oldValue) { | |
| revalidate(); | |
| repaint(); | |
| } | |
| } | |
|     /** | |
|      * Returns the character, as an index, that the look and feel should | |
|      * provide decoration for as representing the mnemonic character. | |
|      * | |
|      * @since 1.4 | |
|      * @return index representing mnemonic character | |
|      * @see #setDisplayedMnemonicIndex | |
| */ | |
|     public int getDisplayedMnemonicIndex() { | |
| return mnemonicIndex; | |
| } | |
|     /** | |
|      * Verify that key is a legal value for the horizontalAlignment properties. | |
|      * | |
|      * @param key the property value to check | |
|      * @param message the IllegalArgumentException detail message | |
|      * @exception IllegalArgumentException if key isn't LEFT, CENTER, RIGHT, | |
|      * LEADING or TRAILING. | |
|      * @see #setHorizontalTextPosition | |
|      * @see #setHorizontalAlignment | |
| */ | |
| protected int checkHorizontalKey(int key, String message) { | |
| if ((key == LEFT) || | |
| (key == CENTER) || | |
| (key == RIGHT) || | |
| (key == LEADING) || | |
| (key == TRAILING)) { | |
| return key; | |
| } | |
|         else { | |
| throw new IllegalArgumentException(message); | |
| } | |
| } | |
|     /** | |
|      * Verify that key is a legal value for the | |
|      * verticalAlignment or verticalTextPosition properties. | |
|      * | |
|      * @param key the property value to check | |
|      * @param message the IllegalArgumentException detail message | |
|      * @exception IllegalArgumentException if key isn't TOP, CENTER, or BOTTOM. | |
|      * @see #setVerticalAlignment | |
|      * @see #setVerticalTextPosition | |
| */ | |
| protected int checkVerticalKey(int key, String message) { | |
| if ((key == TOP) || (key == CENTER) || (key == BOTTOM)) { | |
| return key; | |
| } | |
|         else { | |
| throw new IllegalArgumentException(message); | |
| } | |
| } | |
|     /** | |
|      * Returns the amount of space between the text and the icon | |
|      * displayed in this label. | |
|      * | |
|      * @return an int equal to the number of pixels between the text | |
|      *         and the icon. | |
|      * @see #setIconTextGap | |
| */ | |
|     public int getIconTextGap() { | |
| return iconTextGap; | |
| } | |
|     /** | |
|      * If both the icon and text properties are set, this property | |
|      * defines the space between them. | |
|      * <p> | |
|      * The default value of this property is 4 pixels. | |
|      * <p> | |
|      * This is a JavaBeans bound property. | |
|      * | |
|      * @see #getIconTextGap | |
|      * @beaninfo | |
|      *        bound: true | |
|      *    attribute: visualUpdate true | |
|      *  description: If both the icon and text properties are set, this | |
|      *               property defines the space between them. | |
| */ | |
|     public void setIconTextGap(int iconTextGap) { | |
| int oldValue = this.iconTextGap; | |
| this.iconTextGap = iconTextGap; | |
| firePropertyChange("iconTextGap", oldValue, iconTextGap); | |
| if (iconTextGap != oldValue) { | |
| revalidate(); | |
| repaint(); | |
| } | |
| } | |
|     /** | |
|      * Returns the alignment of the label's contents along the Y axis. | |
|      * | |
|      * @return   The value of the verticalAlignment property, one of the | |
|      *           following constants defined in <code>SwingConstants</code>: | |
|      *           <code>TOP</code>, | |
|      *           <code>CENTER</code>, or | |
|      *           <code>BOTTOM</code>. | |
|      * | |
|      * @see SwingConstants | |
|      * @see #setVerticalAlignment | |
| */ | |
|     public int getVerticalAlignment() { | |
| return verticalAlignment; | |
| } | |
|     /** | |
|      * Sets the alignment of the label's contents along the Y axis. | |
|      * <p> | |
|      * The default value of this property is CENTER. | |
|      * | |
|      * @param alignment One of the following constants | |
|      *           defined in <code>SwingConstants</code>: | |
|      *           <code>TOP</code>, | |
|      *           <code>CENTER</code> (the default), or | |
|      *           <code>BOTTOM</code>. | |
|      * | |
|      * @see SwingConstants | |
|      * @see #getVerticalAlignment | |
|      * @beaninfo | |
|      *        bound: true | |
|      *         enum: TOP    SwingConstants.TOP | |
|      *               CENTER SwingConstants.CENTER | |
|      *               BOTTOM SwingConstants.BOTTOM | |
|      *    attribute: visualUpdate true | |
|      *  description: The alignment of the label's contents along the Y axis. | |
| */ | |
|     public void setVerticalAlignment(int alignment) { | |
| if (alignment == verticalAlignment) return; | |
| int oldValue = verticalAlignment; | |
| verticalAlignment = checkVerticalKey(alignment, "verticalAlignment"); | |
| firePropertyChange("verticalAlignment", oldValue, verticalAlignment); | |
| repaint(); | |
| } | |
|     /** | |
|      * Returns the alignment of the label's contents along the X axis. | |
|      * | |
|      * @return   The value of the horizontalAlignment property, one of the | |
|      *           following constants defined in <code>SwingConstants</code>: | |
|      *           <code>LEFT</code>, | |
|      *           <code>CENTER</code>, | |
|      *           <code>RIGHT</code>, | |
|      *           <code>LEADING</code> or | |
|      *           <code>TRAILING</code>. | |
|      * | |
|      * @see #setHorizontalAlignment | |
|      * @see SwingConstants | |
| */ | |
|     public int getHorizontalAlignment() { | |
| return horizontalAlignment; | |
| } | |
|     /** | |
|      * Sets the alignment of the label's contents along the X axis. | |
|      * <p> | |
|      * This is a JavaBeans bound property. | |
|      * | |
|      * @param alignment  One of the following constants | |
|      *           defined in <code>SwingConstants</code>: | |
|      *           <code>LEFT</code>, | |
|      *           <code>CENTER</code> (the default for image-only labels), | |
|      *           <code>RIGHT</code>, | |
|      *           <code>LEADING</code> (the default for text-only labels) or | |
|      *           <code>TRAILING</code>. | |
|      * | |
|      * @see SwingConstants | |
|      * @see #getHorizontalAlignment | |
|      * @beaninfo | |
|      *        bound: true | |
|      *         enum: LEFT     SwingConstants.LEFT | |
|      *               CENTER   SwingConstants.CENTER | |
|      *               RIGHT    SwingConstants.RIGHT | |
|      *               LEADING  SwingConstants.LEADING | |
|      *               TRAILING SwingConstants.TRAILING | |
|      *    attribute: visualUpdate true | |
|      *  description: The alignment of the label's content along the X axis. | |
| */ | |
|     public void setHorizontalAlignment(int alignment) { | |
| if (alignment == horizontalAlignment) return; | |
| int oldValue = horizontalAlignment; | |
| horizontalAlignment = checkHorizontalKey(alignment, | |
|                                                  "horizontalAlignment"); | |
| firePropertyChange("horizontalAlignment", | |
| oldValue, horizontalAlignment); | |
| repaint(); | |
| } | |
|     /** | |
|      * Returns the vertical position of the label's text, | |
|      * relative to its image. | |
|      * | |
|      * @return   One of the following constants | |
|      *           defined in <code>SwingConstants</code>: | |
|      *           <code>TOP</code>, | |
|      *           <code>CENTER</code>, or | |
|      *           <code>BOTTOM</code>. | |
|      * | |
|      * @see #setVerticalTextPosition | |
|      * @see SwingConstants | |
| */ | |
|     public int getVerticalTextPosition() { | |
| return verticalTextPosition; | |
| } | |
|     /** | |
|      * Sets the vertical position of the label's text, | |
|      * relative to its image. | |
|      * <p> | |
|      * The default value of this property is CENTER. | |
|      * <p> | |
|      * This is a JavaBeans bound property. | |
|      * | |
|      * @param textPosition  One of the following constants | |
|      *           defined in <code>SwingConstants</code>: | |
|      *           <code>TOP</code>, | |
|      *           <code>CENTER</code> (the default), or | |
|      *           <code>BOTTOM</code>. | |
|      * | |
|      * @see SwingConstants | |
|      * @see #getVerticalTextPosition | |
|      * @beaninfo | |
|      *        bound: true | |
|      *         enum: TOP    SwingConstants.TOP | |
|      *               CENTER SwingConstants.CENTER | |
|      *               BOTTOM SwingConstants.BOTTOM | |
|      *       expert: true | |
|      *    attribute: visualUpdate true | |
|      *  description: The vertical position of the text relative to it's image. | |
| */ | |
|     public void setVerticalTextPosition(int textPosition) { | |
| if (textPosition == verticalTextPosition) return; | |
| int old = verticalTextPosition; | |
| verticalTextPosition = checkVerticalKey(textPosition, | |
|                                                 "verticalTextPosition"); | |
| firePropertyChange("verticalTextPosition", old, verticalTextPosition); | |
| revalidate(); | |
| repaint(); | |
| } | |
|     /** | |
|      * Returns the horizontal position of the label's text, | |
|      * relative to its image. | |
|      * | |
|      * @return   One of the following constants | |
|      *           defined in <code>SwingConstants</code>: | |
|      *           <code>LEFT</code>, | |
|      *           <code>CENTER</code>, | |
|      *           <code>RIGHT</code>, | |
|      *           <code>LEADING</code> or | |
|      *           <code>TRAILING</code>. | |
|      * | |
|      * @see SwingConstants | |
| */ | |
|     public int getHorizontalTextPosition() { | |
| return horizontalTextPosition; | |
| } | |
|     /** | |
|      * Sets the horizontal position of the label's text, | |
|      * relative to its image. | |
|      * | |
|      * @param textPosition  One of the following constants | |
|      *           defined in <code>SwingConstants</code>: | |
|      *           <code>LEFT</code>, | |
|      *           <code>CENTER</code>, | |
|      *           <code>RIGHT</code>, | |
|      *           <code>LEADING</code>, or | |
|      *           <code>TRAILING</code> (the default). | |
|      * @exception IllegalArgumentException | |
|      * | |
|      * @see SwingConstants | |
|      * @beaninfo | |
|      *       expert: true | |
|      *        bound: true | |
|      *         enum: LEFT     SwingConstants.LEFT | |
|      *               CENTER   SwingConstants.CENTER | |
|      *               RIGHT    SwingConstants.RIGHT | |
|      *               LEADING  SwingConstants.LEADING | |
|      *               TRAILING SwingConstants.TRAILING | |
|      *    attribute: visualUpdate true | |
|      *  description: The horizontal position of the label's text, | |
|      *               relative to its image. | |
| */ | |
|     public void setHorizontalTextPosition(int textPosition) { | |
| int old = horizontalTextPosition; | |
| this.horizontalTextPosition = checkHorizontalKey(textPosition, | |
|                                                 "horizontalTextPosition"); | |
| firePropertyChange("horizontalTextPosition", | |
| old, horizontalTextPosition); | |
| revalidate(); | |
| repaint(); | |
| } | |
|     /** | |
|      * This is overridden to return false if the current Icon's Image is | |
|      * not equal to the passed in Image <code>img</code>. | |
|      * | |
|      * @see     java.awt.image.ImageObserver | |
|      * @see     java.awt.Component#imageUpdate(java.awt.Image, int, int, int, int, int) | |
| */ | |
| public boolean imageUpdate(Image img, int infoflags, | |
|                                int x, int y, int w, int h) { | |
| // Don't use getDisabledIcon, will trigger creation of icon if icon | |
|         // not set. | |
| if (!isShowing() || | |
| !SwingUtilities.doesIconReferenceImage(getIcon(), img) && | |
| !SwingUtilities.doesIconReferenceImage(disabledIcon, img)) { | |
| return false; | |
| } | |
| return super.imageUpdate(img, infoflags, x, y, w, h); | |
| } | |
|     /** | |
|      * See readObject() and writeObject() in JComponent for more | |
|      * information about serialization in Swing. | |
| */ | |
| private void writeObject(ObjectOutputStream s) throws IOException { | |
| s.defaultWriteObject(); | |
| if (getUIClassID().equals(uiClassID)) { | |
| byte count = JComponent.getWriteObjCounter(this); | |
| JComponent.setWriteObjCounter(this, --count); | |
| if (count == 0 && ui != null) { | |
| ui.installUI(this); | |
| } | |
| } | |
| } | |
|     /** | |
|      * Returns a string representation of this JLabel. This method | |
|      * is intended to be used only for debugging purposes, and the | |
|      * content and format of the returned string may vary between | |
|      * implementations. The returned string may be empty but may not | |
|      * be <code>null</code>. | |
|      * | |
|      * @return  a string representation of this JLabel. | |
| */ | |
| protected String paramString() { | |
| String textString = (text != null ? | |
| text : ""); | |
| String defaultIconString = ((defaultIcon != null) | |
| && (defaultIcon != this) ? | |
| defaultIcon.toString() : ""); | |
| String disabledIconString = ((disabledIcon != null) | |
| && (disabledIcon != this) ? | |
| disabledIcon.toString() : ""); | |
| String labelForString = (labelFor != null ? | |
| labelFor.toString() : ""); | |
| String verticalAlignmentString; | |
| if (verticalAlignment == TOP) { | |
| verticalAlignmentString = "TOP"; | |
| } else if (verticalAlignment == CENTER) { | |
| verticalAlignmentString = "CENTER"; | |
| } else if (verticalAlignment == BOTTOM) { | |
| verticalAlignmentString = "BOTTOM"; | |
| } else verticalAlignmentString = ""; | |
| String horizontalAlignmentString; | |
| if (horizontalAlignment == LEFT) { | |
| horizontalAlignmentString = "LEFT"; | |
| } else if (horizontalAlignment == CENTER) { | |
| horizontalAlignmentString = "CENTER"; | |
| } else if (horizontalAlignment == RIGHT) { | |
| horizontalAlignmentString = "RIGHT"; | |
| } else if (horizontalAlignment == LEADING) { | |
| horizontalAlignmentString = "LEADING"; | |
| } else if (horizontalAlignment == TRAILING) { | |
| horizontalAlignmentString = "TRAILING"; | |
| } else horizontalAlignmentString = ""; | |
| String verticalTextPositionString; | |
| if (verticalTextPosition == TOP) { | |
| verticalTextPositionString = "TOP"; | |
| } else if (verticalTextPosition == CENTER) { | |
| verticalTextPositionString = "CENTER"; | |
| } else if (verticalTextPosition == BOTTOM) { | |
| verticalTextPositionString = "BOTTOM"; | |
| } else verticalTextPositionString = ""; | |
| String horizontalTextPositionString; | |
| if (horizontalTextPosition == LEFT) { | |
| horizontalTextPositionString = "LEFT"; | |
| } else if (horizontalTextPosition == CENTER) { | |
| horizontalTextPositionString = "CENTER"; | |
| } else if (horizontalTextPosition == RIGHT) { | |
| horizontalTextPositionString = "RIGHT"; | |
| } else if (horizontalTextPosition == LEADING) { | |
| horizontalTextPositionString = "LEADING"; | |
| } else if (horizontalTextPosition == TRAILING) { | |
| horizontalTextPositionString = "TRAILING"; | |
| } else horizontalTextPositionString = ""; | |
| return super.paramString() + | |
| ",defaultIcon=" + defaultIconString + | |
| ",disabledIcon=" + disabledIconString + | |
| ",horizontalAlignment=" + horizontalAlignmentString + | |
| ",horizontalTextPosition=" + horizontalTextPositionString + | |
| ",iconTextGap=" + iconTextGap + | |
| ",labelFor=" + labelForString + | |
| ",text=" + textString + | |
| ",verticalAlignment=" + verticalAlignmentString + | |
| ",verticalTextPosition=" + verticalTextPositionString; | |
| } | |
| /** | |
| * --- Accessibility Support --- | |
| */ | |
|     /** | |
|      * Get the component this is labelling. | |
|      * | |
|      * @return the Component this is labelling.  Can be null if this | |
|      * does not label a Component.  If the displayedMnemonic | |
|      * property is set and the labelFor property is also set, the label | |
|      * will call the requestFocus method of the component specified by the | |
|      * labelFor property when the mnemonic is activated. | |
|      * | |
|      * @see #getDisplayedMnemonic | |
|      * @see #setDisplayedMnemonic | |
| */ | |
| public Component getLabelFor() { | |
| return labelFor; | |
| } | |
|     /** | |
|      * Set the component this is labelling.  Can be null if this does not | |
|      * label a Component.  If the displayedMnemonic property is set | |
|      * and the labelFor property is also set, the label will | |
|      * call the requestFocus method of the component specified by the | |
|      * labelFor property when the mnemonic is activated. | |
|      * | |
|      * @param c  the Component this label is for, or null if the label is | |
|      *           not the label for a component | |
|      * | |
|      * @see #getDisplayedMnemonic | |
|      * @see #setDisplayedMnemonic | |
|      * | |
|      * @beaninfo | |
|      *        bound: true | |
|      *  description: The component this is labelling. | |
| */ | |
| public void setLabelFor(Component c) { | |
| Component oldC = labelFor; | |
| labelFor = c; | |
| firePropertyChange("labelFor", oldC, c); | |
| if (oldC instanceof JComponent) { | |
| ((JComponent)oldC).putClientProperty(LABELED_BY_PROPERTY, null); | |
| } | |
| if (c instanceof JComponent) { | |
| ((JComponent)c).putClientProperty(LABELED_BY_PROPERTY, this); | |
| } | |
| } | |
|     /** | |
|      * Get the AccessibleContext of this object | |
|      * | |
|      * @return the AccessibleContext of this object | |
|      * @beaninfo | |
|      *       expert: true | |
|      *  description: The AccessibleContext associated with this Label. | |
| */ | |
| public AccessibleContext getAccessibleContext() { | |
|         if (accessibleContext == null) { | |
| accessibleContext = new AccessibleJLabel(); | |
| } | |
| return accessibleContext; | |
| } | |
|     /** | |
|      * The class used to obtain the accessible role for this object. | |
|      * <p> | |
|      * <strong>Warning:</strong> | |
|      * 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.  As of 1.4, support for long term storage | |
|      * of all JavaBeans™ | |
|      * has been added to the <code>java.beans</code> package. | |
|      * Please see {@link java.beans.XMLEncoder}. | |
| */ | |
|     @SuppressWarnings("serial") | |
| protected class AccessibleJLabel extends AccessibleJComponent | |
| implements AccessibleText, AccessibleExtendedComponent { | |
|         /** | |
|          * Get the accessible name of this object. | |
|          * | |
|          * @return the localized name of the object -- can be null if this | |
|          * object does not have a name | |
|          * @see AccessibleContext#setAccessibleName | |
| */ | |
| public String getAccessibleName() { | |
| String name = accessibleName; | |
| if (name == null) { | |
| name = (String)getClientProperty(AccessibleContext.ACCESSIBLE_NAME_PROPERTY); | |
| } | |
| if (name == null) { | |
| name = JLabel.this.getText(); | |
| } | |
| if (name == null) { | |
| name = super.getAccessibleName(); | |
| } | |
| return name; | |
| } | |
|         /** | |
|          * Get the role of this object. | |
|          * | |
|          * @return an instance of AccessibleRole describing the role of the | |
|          * object | |
|          * @see AccessibleRole | |
| */ | |
| public AccessibleRole getAccessibleRole() { | |
| return AccessibleRole.LABEL; | |
| } | |
|         /** | |
|          * Get the AccessibleIcons associated with this object if one | |
|          * or more exist.  Otherwise return null. | |
|          * @since 1.3 | |
| */ | |
| public AccessibleIcon [] getAccessibleIcon() { | |
| Icon icon = getIcon(); | |
| if (icon instanceof Accessible) { | |
| AccessibleContext ac = | |
| ((Accessible)icon).getAccessibleContext(); | |
| if (ac != null && ac instanceof AccessibleIcon) { | |
| return new AccessibleIcon[] { (AccessibleIcon)ac }; | |
| } | |
| } | |
| return null; | |
| } | |
|         /** | |
|          * Get the AccessibleRelationSet associated with this object if one | |
|          * exists.  Otherwise return null. | |
|          * @see AccessibleRelation | |
|          * @since 1.3 | |
| */ | |
| public AccessibleRelationSet getAccessibleRelationSet() { | |
| // Check where the AccessibleContext's relation | |
|             // set already contains a LABEL_FOR relation. | |
| AccessibleRelationSet relationSet | |
| = super.getAccessibleRelationSet(); | |
| if (!relationSet.contains(AccessibleRelation.LABEL_FOR)) { | |
| Component c = JLabel.this.getLabelFor(); | |
| if (c != null) { | |
| AccessibleRelation relation | |
| = new AccessibleRelation(AccessibleRelation.LABEL_FOR); | |
| relation.setTarget(c); | |
| relationSet.add(relation); | |
| } | |
| } | |
| return relationSet; | |
| } | |
| /* AccessibleText ---------- */ | |
| public AccessibleText getAccessibleText() { | |
| View view = (View)JLabel.this.getClientProperty("html"); | |
| if (view != null) { | |
| return this; | |
|             } else { | |
| return null; | |
| } | |
| } | |
|         /** | |
|          * Given a point in local coordinates, return the zero-based index | |
|          * of the character under that Point.  If the point is invalid, | |
|          * this method returns -1. | |
|          * | |
|          * @param p the Point in local coordinates | |
|          * @return the zero-based index of the character under Point p; if | |
|          * Point is invalid returns -1. | |
|          * @since 1.3 | |
| */ | |
| public int getIndexAtPoint(Point p) { | |
| View view = (View) JLabel.this.getClientProperty("html"); | |
| if (view != null) { | |
| Rectangle r = getTextRectangle(); | |
| if (r == null) { | |
| return -1; | |
| } | |
| Rectangle2D.Float shape = | |
| new Rectangle2D.Float(r.x, r.y, r.width, r.height); | |
| Position.Bias bias[] = new Position.Bias[1]; | |
| return view.viewToModel(p.x, p.y, shape, bias); | |
|             } else { | |
| return -1; | |
| } | |
| } | |
|         /** | |
|          * Returns the bounding box of the character at the given | |
|          * index in the string.  The bounds are returned in local | |
|          * coordinates. If the index is invalid, <code>null</code> is returned. | |
|          * | |
|          * @param i the index into the String | |
|          * @return the screen coordinates of the character's bounding box. | |
|          * If the index is invalid, <code>null</code> is returned. | |
|          * @since 1.3 | |
| */ | |
| public Rectangle getCharacterBounds(int i) { | |
| View view = (View) JLabel.this.getClientProperty("html"); | |
| if (view != null) { | |
| Rectangle r = getTextRectangle(); | |
| if (r == null) { | |
| return null; | |
| } | |
| Rectangle2D.Float shape = | |
| new Rectangle2D.Float(r.x, r.y, r.width, r.height); | |
|                 try { | |
| Shape charShape = | |
| view.modelToView(i, shape, Position.Bias.Forward); | |
| return charShape.getBounds(); | |
| } catch (BadLocationException e) { | |
| return null; | |
| } | |
|             } else { | |
| return null; | |
| } | |
| } | |
|         /** | |
|          * Return the number of characters (valid indicies) | |
|          * | |
|          * @return the number of characters | |
|          * @since 1.3 | |
| */ | |
|         public int getCharCount() { | |
| View view = (View) JLabel.this.getClientProperty("html"); | |
| if (view != null) { | |
| Document d = view.getDocument(); | |
| if (d instanceof StyledDocument) { | |
| StyledDocument doc = (StyledDocument)d; | |
| return doc.getLength(); | |
| } | |
| } | |
| return accessibleContext.getAccessibleName().length(); | |
| } | |
|         /** | |
|          * Return the zero-based offset of the caret. | |
|          * | |
|          * Note: That to the right of the caret will have the same index | |
|          * value as the offset (the caret is between two characters). | |
|          * @return the zero-based offset of the caret. | |
|          * @since 1.3 | |
| */ | |
|         public int getCaretPosition() { | |
|             // There is no caret. | |
| return -1; | |
| } | |
|         /** | |
|          * Returns the String at a given index. | |
|          * | |
|          * @param part the AccessibleText.CHARACTER, AccessibleText.WORD, | |
|          * or AccessibleText.SENTENCE to retrieve | |
|          * @param index an index within the text >= 0 | |
|          * @return the letter, word, or sentence, | |
|          *   null for an invalid index or part | |
|          * @since 1.3 | |
| */ | |
| public String getAtIndex(int part, int index) { | |
| if (index < 0 || index >= getCharCount()) { | |
| return null; | |
| } | |
| switch (part) { | |
| case AccessibleText.CHARACTER: | |
|                 try { | |
| return getText(index, 1); | |
| } catch (BadLocationException e) { | |
| return null; | |
| } | |
| case AccessibleText.WORD: | |
|                 try { | |
| String s = getText(0, getCharCount()); | |
| BreakIterator words = BreakIterator.getWordInstance(getLocale()); | |
| words.setText(s); | |
| int end = words.following(index); | |
| return s.substring(words.previous(), end); | |
| } catch (BadLocationException e) { | |
| return null; | |
| } | |
| case AccessibleText.SENTENCE: | |
|                 try { | |
| String s = getText(0, getCharCount()); | |
| BreakIterator sentence = | |
| BreakIterator.getSentenceInstance(getLocale()); | |
| sentence.setText(s); | |
| int end = sentence.following(index); | |
| return s.substring(sentence.previous(), end); | |
| } catch (BadLocationException e) { | |
| return null; | |
| } | |
| default: | |
| return null; | |
| } | |
| } | |
|         /** | |
|          * Returns the String after a given index. | |
|          * | |
|          * @param part the AccessibleText.CHARACTER, AccessibleText.WORD, | |
|          * or AccessibleText.SENTENCE to retrieve | |
|          * @param index an index within the text >= 0 | |
|          * @return the letter, word, or sentence, null for an invalid | |
|          *  index or part | |
|          * @since 1.3 | |
| */ | |
| public String getAfterIndex(int part, int index) { | |
| if (index < 0 || index >= getCharCount()) { | |
| return null; | |
| } | |
| switch (part) { | |
| case AccessibleText.CHARACTER: | |
| if (index+1 >= getCharCount()) { | |
| return null; | |
| } | |
|                 try { | |
| return getText(index+1, 1); | |
| } catch (BadLocationException e) { | |
| return null; | |
| } | |
| case AccessibleText.WORD: | |
|                 try { | |
| String s = getText(0, getCharCount()); | |
| BreakIterator words = BreakIterator.getWordInstance(getLocale()); | |
| words.setText(s); | |
| int start = words.following(index); | |
| if (start == BreakIterator.DONE || start >= s.length()) { | |
| return null; | |
| } | |
| int end = words.following(start); | |
| if (end == BreakIterator.DONE || end >= s.length()) { | |
| return null; | |
| } | |
| return s.substring(start, end); | |
| } catch (BadLocationException e) { | |
| return null; | |
| } | |
| case AccessibleText.SENTENCE: | |
|                 try { | |
| String s = getText(0, getCharCount()); | |
| BreakIterator sentence = | |
| BreakIterator.getSentenceInstance(getLocale()); | |
| sentence.setText(s); | |
| int start = sentence.following(index); | |
| if (start == BreakIterator.DONE || start > s.length()) { | |
| return null; | |
| } | |
| int end = sentence.following(start); | |
| if (end == BreakIterator.DONE || end > s.length()) { | |
| return null; | |
| } | |
| return s.substring(start, end); | |
| } catch (BadLocationException e) { | |
| return null; | |
| } | |
| default: | |
| return null; | |
| } | |
| } | |
|         /** | |
|          * Returns the String before a given index. | |
|          * | |
|          * @param part the AccessibleText.CHARACTER, AccessibleText.WORD, | |
|          *   or AccessibleText.SENTENCE to retrieve | |
|          * @param index an index within the text >= 0 | |
|          * @return the letter, word, or sentence, null for an invalid index | |
|          *  or part | |
|          * @since 1.3 | |
| */ | |
| public String getBeforeIndex(int part, int index) { | |
| if (index < 0 || index > getCharCount()-1) { | |
| return null; | |
| } | |
| switch (part) { | |
| case AccessibleText.CHARACTER: | |
| if (index == 0) { | |
| return null; | |
| } | |
|                 try { | |
| return getText(index-1, 1); | |
| } catch (BadLocationException e) { | |
| return null; | |
| } | |
| case AccessibleText.WORD: | |
|                 try { | |
| String s = getText(0, getCharCount()); | |
| BreakIterator words = BreakIterator.getWordInstance(getLocale()); | |
| words.setText(s); | |
| int end = words.following(index); | |
| end = words.previous(); | |
| int start = words.previous(); | |
| if (start == BreakIterator.DONE) { | |
| return null; | |
| } | |
| return s.substring(start, end); | |
| } catch (BadLocationException e) { | |
| return null; | |
| } | |
| case AccessibleText.SENTENCE: | |
|                 try { | |
| String s = getText(0, getCharCount()); | |
| BreakIterator sentence = | |
| BreakIterator.getSentenceInstance(getLocale()); | |
| sentence.setText(s); | |
| int end = sentence.following(index); | |
| end = sentence.previous(); | |
| int start = sentence.previous(); | |
| if (start == BreakIterator.DONE) { | |
| return null; | |
| } | |
| return s.substring(start, end); | |
| } catch (BadLocationException e) { | |
| return null; | |
| } | |
| default: | |
| return null; | |
| } | |
| } | |
|         /** | |
|          * Return the AttributeSet for a given character at a given index | |
|          * | |
|          * @param i the zero-based index into the text | |
|          * @return the AttributeSet of the character | |
|          * @since 1.3 | |
| */ | |
| public AttributeSet getCharacterAttribute(int i) { | |
| View view = (View) JLabel.this.getClientProperty("html"); | |
| if (view != null) { | |
| Document d = view.getDocument(); | |
| if (d instanceof StyledDocument) { | |
| StyledDocument doc = (StyledDocument)d; | |
| Element elem = doc.getCharacterElement(i); | |
| if (elem != null) { | |
| return elem.getAttributes(); | |
| } | |
| } | |
| } | |
| return null; | |
| } | |
|         /** | |
|          * Returns the start offset within the selected text. | |
|          * If there is no selection, but there is | |
|          * a caret, the start and end offsets will be the same. | |
|          * | |
|          * @return the index into the text of the start of the selection | |
|          * @since 1.3 | |
| */ | |
|         public int getSelectionStart() { | |
|             // Text cannot be selected. | |
| return -1; | |
| } | |
|         /** | |
|          * Returns the end offset within the selected text. | |
|          * If there is no selection, but there is | |
|          * a caret, the start and end offsets will be the same. | |
|          * | |
|          * @return the index into the text of the end of the selection | |
|          * @since 1.3 | |
| */ | |
|         public int getSelectionEnd() { | |
|             // Text cannot be selected. | |
| return -1; | |
| } | |
|         /** | |
|          * Returns the portion of the text that is selected. | |
|          * | |
|          * @return the String portion of the text that is selected | |
|          * @since 1.3 | |
| */ | |
| public String getSelectedText() { | |
|             // Text cannot be selected. | |
| return null; | |
| } | |
|         /* | |
|          * Returns the text substring starting at the specified | |
|          * offset with the specified length. | |
| */ | |
| private String getText(int offset, int length) | |
| throws BadLocationException { | |
| View view = (View) JLabel.this.getClientProperty("html"); | |
| if (view != null) { | |
| Document d = view.getDocument(); | |
| if (d instanceof StyledDocument) { | |
| StyledDocument doc = (StyledDocument)d; | |
| return doc.getText(offset, length); | |
| } | |
| } | |
| return null; | |
| } | |
|         /* | |
|          * Returns the bounding rectangle for the component text. | |
| */ | |
| private Rectangle getTextRectangle() { | |
| String text = JLabel.this.getText(); | |
| Icon icon = (JLabel.this.isEnabled()) ? JLabel.this.getIcon() : JLabel.this.getDisabledIcon(); | |
| if ((icon == null) && (text == null)) { | |
| return null; | |
| } | |
| Rectangle paintIconR = new Rectangle(); | |
| Rectangle paintTextR = new Rectangle(); | |
| Rectangle paintViewR = new Rectangle(); | |
| Insets paintViewInsets = new Insets(0, 0, 0, 0); | |
| paintViewInsets = JLabel.this.getInsets(paintViewInsets); | |
| paintViewR.x = paintViewInsets.left; | |
| paintViewR.y = paintViewInsets.top; | |
| paintViewR.width = JLabel.this.getWidth() - (paintViewInsets.left + paintViewInsets.right); | |
| paintViewR.height = JLabel.this.getHeight() - (paintViewInsets.top + paintViewInsets.bottom); | |
| String clippedText = SwingUtilities.layoutCompoundLabel( | |
| (JComponent)JLabel.this, | |
| getFontMetrics(getFont()), | |
| text, | |
| icon, | |
| JLabel.this.getVerticalAlignment(), | |
| JLabel.this.getHorizontalAlignment(), | |
| JLabel.this.getVerticalTextPosition(), | |
| JLabel.this.getHorizontalTextPosition(), | |
| paintViewR, | |
| paintIconR, | |
| paintTextR, | |
| JLabel.this.getIconTextGap()); | |
| return paintTextR; | |
| } | |
| // ----- AccessibleExtendedComponent | |
|         /** | |
|          * Returns the AccessibleExtendedComponent | |
|          * | |
|          * @return the AccessibleExtendedComponent | |
| */ | |
| AccessibleExtendedComponent getAccessibleExtendedComponent() { | |
| return this; | |
| } | |
|         /** | |
|          * Returns the tool tip text | |
|          * | |
|          * @return the tool tip text, if supported, of the object; | |
|          * otherwise, null | |
|          * @since 1.4 | |
| */ | |
| public String getToolTipText() { | |
| return JLabel.this.getToolTipText(); | |
| } | |
|         /** | |
|          * Returns the titled border text | |
|          * | |
|          * @return the titled border text, if supported, of the object; | |
|          * otherwise, null | |
|          * @since 1.4 | |
| */ | |
| public String getTitledBorderText() { | |
| return super.getTitledBorderText(); | |
| } | |
|         /** | |
|          * Returns key bindings associated with this object | |
|          * | |
|          * @return the key bindings, if supported, of the object; | |
|          * otherwise, null | |
|          * @see AccessibleKeyBinding | |
|          * @since 1.4 | |
| */ | |
| public AccessibleKeyBinding getAccessibleKeyBinding() { | |
| int mnemonic = JLabel.this.getDisplayedMnemonic(); | |
| if (mnemonic == 0) { | |
| return null; | |
| } | |
| return new LabelKeyBinding(mnemonic); | |
| } | |
| class LabelKeyBinding implements AccessibleKeyBinding { | |
| int mnemonic; | |
|             LabelKeyBinding(int mnemonic) { | |
| this.mnemonic = mnemonic; | |
| } | |
|             /** | |
|              * Returns the number of key bindings for this object | |
|              * | |
|              * @return the zero-based number of key bindings for this object | |
| */ | |
|             public int getAccessibleKeyBindingCount() { | |
| return 1; | |
| } | |
|             /** | |
|              * Returns a key binding for this object.  The value returned is an | |
|              * java.lang.Object which must be cast to appropriate type depending | |
|              * on the underlying implementation of the key.  For example, if the | |
|              * Object returned is a javax.swing.KeyStroke, the user of this | |
|              * method should do the following: | |
|              * <nf><code> | |
|              * Component c = <get the component that has the key bindings> | |
|              * AccessibleContext ac = c.getAccessibleContext(); | |
|              * AccessibleKeyBinding akb = ac.getAccessibleKeyBinding(); | |
|              * for (int i = 0; i < akb.getAccessibleKeyBindingCount(); i++) { | |
|              *     Object o = akb.getAccessibleKeyBinding(i); | |
|              *     if (o instanceof javax.swing.KeyStroke) { | |
|              *         javax.swing.KeyStroke keyStroke = (javax.swing.KeyStroke)o; | |
|              *         <do something with the key binding> | |
|              *     } | |
|              * } | |
|              * </code></nf> | |
|              * | |
|              * @param i zero-based index of the key bindings | |
|              * @return a javax.lang.Object which specifies the key binding | |
|              * @exception IllegalArgumentException if the index is | |
|              * out of bounds | |
|              * @see #getAccessibleKeyBindingCount | |
| */ | |
| public java.lang.Object getAccessibleKeyBinding(int i) { | |
| if (i != 0) { | |
| throw new IllegalArgumentException(); | |
| } | |
| return KeyStroke.getKeyStroke(mnemonic, 0); | |
| } | |
| } | |
| } // AccessibleJComponent | |
| } |