jdk/src/share/classes/java/awt/Label.java
changeset 2 90ce3da70b43
child 1183 80d6aafba03a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/java/awt/Label.java	Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,360 @@
+/*
+ * Copyright 1995-2006 Sun Microsystems, Inc.  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.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package java.awt;
+
+import java.awt.peer.LabelPeer;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import javax.accessibility.*;
+
+/**
+ * A <code>Label</code> object is a component for placing text in a
+ * container. A label displays a single line of read-only text.
+ * The text can be changed by the application, but a user cannot edit it
+ * directly.
+ * <p>
+ * For example, the code&nbsp;.&nbsp;.&nbsp;.
+ * <p>
+ * <hr><blockquote><pre>
+ * setLayout(new FlowLayout(FlowLayout.CENTER, 10, 10));
+ * add(new Label("Hi There!"));
+ * add(new Label("Another Label"));
+ * </pre></blockquote><hr>
+ * <p>
+ * produces the following labels:
+ * <p>
+ * <img src="doc-files/Label-1.gif" alt="Two labels: 'Hi There!' and 'Another label'"
+ * ALIGN=center HSPACE=10 VSPACE=7>
+ *
+ * @author      Sami Shaio
+ * @since       JDK1.0
+ */
+public class Label extends Component implements Accessible {
+
+    static {
+        /* ensure that the necessary native libraries are loaded */
+        Toolkit.loadLibraries();
+        if (!GraphicsEnvironment.isHeadless()) {
+            initIDs();
+        }
+    }
+
+    /**
+     * Indicates that the label should be left justified.
+     */
+    public static final int LEFT        = 0;
+
+    /**
+     * Indicates that the label should be centered.
+     */
+    public static final int CENTER      = 1;
+
+    /**
+     * Indicates that the label should be right justified.
+     * @since   JDK1.0t.
+     */
+    public static final int RIGHT       = 2;
+
+    /**
+     * The text of this label.
+     * This text can be modified by the program
+     * but never by the user.
+     *
+     * @serial
+     * @see #getText()
+     * @see #setText(String)
+     */
+    String text;
+
+    /**
+     * The label's alignment.  The default alignment is set
+     * to be left justified.
+     *
+     * @serial
+     * @see #getAlignment()
+     * @see #setAlignment(int)
+     */
+    int    alignment = LEFT;
+
+    private static final String base = "label";
+    private static int nameCounter = 0;
+
+    /*
+     * JDK 1.1 serialVersionUID
+     */
+     private static final long serialVersionUID = 3094126758329070636L;
+
+    /**
+     * Constructs an empty label.
+     * The text of the label is the empty string <code>""</code>.
+     * @exception HeadlessException if GraphicsEnvironment.isHeadless()
+     * returns true.
+     * @see java.awt.GraphicsEnvironment#isHeadless
+     */
+    public Label() throws HeadlessException {
+        this("", LEFT);
+    }
+
+    /**
+     * Constructs a new label with the specified string of text,
+     * left justified.
+     * @param text the string that the label presents.
+     *        A <code>null</code> value
+     *        will be accepted without causing a NullPointerException
+     *        to be thrown.
+     * @exception HeadlessException if GraphicsEnvironment.isHeadless()
+     * returns true.
+     * @see java.awt.GraphicsEnvironment#isHeadless
+     */
+    public Label(String text) throws HeadlessException {
+        this(text, LEFT);
+    }
+
+    /**
+     * Constructs a new label that presents the specified string of
+     * text with the specified alignment.
+     * Possible values for <code>alignment</code> are <code>Label.LEFT</code>,
+     * <code>Label.RIGHT</code>, and <code>Label.CENTER</code>.
+     * @param text the string that the label presents.
+     *        A <code>null</code> value
+     *        will be accepted without causing a NullPointerException
+     *        to be thrown.
+     * @param     alignment   the alignment value.
+     * @exception HeadlessException if GraphicsEnvironment.isHeadless()
+     * returns true.
+     * @see java.awt.GraphicsEnvironment#isHeadless
+     */
+    public Label(String text, int alignment) throws HeadlessException {
+        GraphicsEnvironment.checkHeadless();
+        this.text = text;
+        setAlignment(alignment);
+    }
+
+    /**
+     * Read a label from an object input stream.
+     * @exception HeadlessException if
+     * <code>GraphicsEnvironment.isHeadless()</code> returns
+     * <code>true</code>
+     * @serial
+     * @since 1.4
+     * @see java.awt.GraphicsEnvironment#isHeadless
+     */
+    private void readObject(ObjectInputStream s)
+        throws ClassNotFoundException, IOException, HeadlessException {
+        GraphicsEnvironment.checkHeadless();
+        s.defaultReadObject();
+    }
+
+    /**
+     * Construct a name for this component.  Called by getName() when the
+     * name is <code>null</code>.
+     */
+    String constructComponentName() {
+        synchronized (Label.class) {
+            return base + nameCounter++;
+        }
+    }
+
+    /**
+     * Creates the peer for this label.  The peer allows us to
+     * modify the appearance of the label without changing its
+     * functionality.
+     */
+    public void addNotify() {
+        synchronized (getTreeLock()) {
+            if (peer == null)
+                peer = getToolkit().createLabel(this);
+            super.addNotify();
+        }
+    }
+
+    /**
+     * Gets the current alignment of this label. Possible values are
+     * <code>Label.LEFT</code>, <code>Label.RIGHT</code>, and
+     * <code>Label.CENTER</code>.
+     * @see        java.awt.Label#setAlignment
+     */
+    public int getAlignment() {
+        return alignment;
+    }
+
+    /**
+     * Sets the alignment for this label to the specified alignment.
+     * Possible values are <code>Label.LEFT</code>,
+     * <code>Label.RIGHT</code>, and <code>Label.CENTER</code>.
+     * @param      alignment    the alignment to be set.
+     * @exception  IllegalArgumentException if an improper value for
+     *                          <code>alignment</code> is given.
+     * @see        java.awt.Label#getAlignment
+     */
+    public synchronized void setAlignment(int alignment) {
+        switch (alignment) {
+          case LEFT:
+          case CENTER:
+          case RIGHT:
+            this.alignment = alignment;
+            LabelPeer peer = (LabelPeer)this.peer;
+            if (peer != null) {
+                peer.setAlignment(alignment);
+            }
+            return;
+        }
+        throw new IllegalArgumentException("improper alignment: " + alignment);
+    }
+
+    /**
+     * Gets the text of this label.
+     * @return     the text of this label, or <code>null</code> if
+     *             the text has been set to <code>null</code>.
+     * @see        java.awt.Label#setText
+     */
+    public String getText() {
+        return text;
+    }
+
+    /**
+     * Sets the text for this label to the specified text.
+     * @param      text the text that this label displays. If
+     *             <code>text</code> is <code>null</code>, it is
+     *             treated for display purposes like an empty
+     *             string <code>""</code>.
+     * @see        java.awt.Label#getText
+     */
+    public void setText(String text) {
+        boolean testvalid = false;
+        synchronized (this) {
+            if (text != this.text && (this.text == null ||
+                                      !this.text.equals(text))) {
+                this.text = text;
+                LabelPeer peer = (LabelPeer)this.peer;
+                if (peer != null) {
+                    peer.setText(text);
+                }
+                testvalid = true;
+            }
+        }
+
+        // This could change the preferred size of the Component.
+        if (testvalid && valid) {
+            invalidate();
+        }
+    }
+
+    /**
+     * Returns a string representing the state of this <code>Label</code>.
+     * 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     the parameter string of this label
+     */
+    protected String paramString() {
+        String str = ",align=";
+        switch (alignment) {
+          case LEFT:   str += "left"; break;
+          case CENTER: str += "center"; break;
+          case RIGHT:  str += "right"; break;
+        }
+        return super.paramString() + str + ",text=" + text;
+    }
+
+    /**
+     * Initialize JNI field and method IDs
+     */
+    private static native void initIDs();
+
+
+/////////////////
+// Accessibility support
+////////////////
+
+
+    /**
+     * Gets the AccessibleContext associated with this Label.
+     * For labels, the AccessibleContext takes the form of an
+     * AccessibleAWTLabel.
+     * A new AccessibleAWTLabel instance is created if necessary.
+     *
+     * @return an AccessibleAWTLabel that serves as the
+     *         AccessibleContext of this Label
+     * @since 1.3
+     */
+    public AccessibleContext getAccessibleContext() {
+        if (accessibleContext == null) {
+            accessibleContext = new AccessibleAWTLabel();
+        }
+        return accessibleContext;
+    }
+
+    /**
+     * This class implements accessibility support for the
+     * <code>Label</code> class.  It provides an implementation of the
+     * Java Accessibility API appropriate to label user-interface elements.
+     * @since 1.3
+     */
+    protected class AccessibleAWTLabel extends AccessibleAWTComponent
+    {
+        /*
+         * JDK 1.3 serialVersionUID
+         */
+        private static final long serialVersionUID = -3568967560160480438L;
+
+        public AccessibleAWTLabel() {
+            super();
+        }
+
+        /**
+         * 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() {
+            if (accessibleName != null) {
+                return accessibleName;
+            } else {
+                if (getText() == null) {
+                    return super.getAccessibleName();
+                } else {
+                    return getText();
+                }
+            }
+        }
+
+        /**
+         * 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;
+        }
+
+    } // inner class AccessibleAWTLabel
+
+}