|  | /* ComponentOrientation.java -- describes a component's orientation | 
|  | Copyright (C) 2000, 2001, 2002 Free Software Foundation | 
|  |  | 
|  | This file is part of GNU Classpath. | 
|  |  | 
|  | GNU Classpath is free software; you can redistribute it and/or modify | 
|  | it under the terms of the GNU General Public License as published by | 
|  | the Free Software Foundation; either version 2, or (at your option) | 
|  | any later version. | 
|  |  | 
|  | GNU Classpath 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 for more details. | 
|  |  | 
|  | You should have received a copy of the GNU General Public License | 
|  | along with GNU Classpath; see the file COPYING.  If not, write to the | 
|  | Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA | 
|  | 02110-1301 USA. | 
|  |  | 
|  | Linking this library statically or dynamically with other modules is | 
|  | making a combined work based on this library.  Thus, the terms and | 
|  | conditions of the GNU General Public License cover the whole | 
|  | combination. | 
|  |  | 
|  | As a special exception, the copyright holders of this library give you | 
|  | permission to link this library with independent modules to produce an | 
|  | executable, regardless of the license terms of these independent | 
|  | modules, and to copy and distribute the resulting executable under | 
|  | terms of your choice, provided that you also meet, for each linked | 
|  | independent module, the terms and conditions of the license of that | 
|  | module.  An independent module is a module which is not derived from | 
|  | or based on this library.  If you modify this library, you may extend | 
|  | this exception to your version of the library, but you are not | 
|  | obligated to do so.  If you do not wish to do so, delete this | 
|  | exception statement from your version. */ | 
|  |  | 
|  |  | 
|  | package java.awt; | 
|  |  | 
|  | import java.io.Serializable; | 
|  | import java.util.Locale; | 
|  | import java.util.MissingResourceException; | 
|  | import java.util.ResourceBundle; | 
|  |  | 
|  | /** | 
|  | * This class is used to differentiate different orientations for text layout. | 
|  | * It controls whether text flows left-to-right or right-to-left, and whether | 
|  | * lines are horizontal or vertical, as in this table:<br> | 
|  | * <pre> | 
|  | * LT      RT      TL      TR | 
|  | * A B C   C B A   A D G   G D A | 
|  | * D E F   F E D   B E H   H E B | 
|  | * G H I   I H G   C F I   I F C | 
|  | * </pre> | 
|  | * <b>LT</b> languages are most common (left-to-right lines, top-to-bottom). | 
|  | * This includes Western European languages, and optionally includes Japanese, | 
|  | * Chinese, and Korean. <b>RT</b> languages (right-to-left lines, | 
|  | * top-to-bottom) are mainly middle eastern, such as Hebrew and Arabic. | 
|  | * <b>TR</b> languages flow top-to-bottom in a line, right-to-left, and are | 
|  | * the basis of Japanese, Chinese, and Korean. Finally, <b>TL</b> languages | 
|  | * flow top-to-bottom in a line, left-to-right, as in Mongolian. | 
|  | * | 
|  | * <p>This is a pretty poor excuse for a type-safe enum, since it is not | 
|  | * guaranteed that orientation objects are unique (thanks to serialization), | 
|  | * yet there is no equals() method. You would be wise to compare the output | 
|  | * of isHorizontal() and isLeftToRight() rather than comparing objects with | 
|  | * ==, especially since more constants may be added in the future. | 
|  | * | 
|  | * @author Bryce McKinlay (bryce@albatross.co.nz) | 
|  | * @since 1.0 | 
|  | * @status updated to 1.4 | 
|  | */ | 
|  | public final class ComponentOrientation implements Serializable | 
|  | { | 
|  | /** | 
|  | * Compatible with JDK 1.0+. | 
|  | */ | 
|  | private static final long serialVersionUID = -4113291392143563828L; | 
|  |  | 
|  | /** Constant for unknown orientation. */ | 
|  | private static final int UNKNOWN_ID = 1; | 
|  |  | 
|  | /** Constant for horizontal line orientation. */ | 
|  | private static final int HORIZONTAL_ID = 2; | 
|  |  | 
|  | /** Constant for left-to-right orientation. */ | 
|  | private static final int LEFT_TO_RIGHT_ID = 4; | 
|  |  | 
|  | /** | 
|  | * Items run left to right, and lines flow top to bottom. Examples: English, | 
|  | * French. | 
|  | */ | 
|  | public static final ComponentOrientation LEFT_TO_RIGHT | 
|  | = new ComponentOrientation(HORIZONTAL_ID | LEFT_TO_RIGHT_ID); | 
|  |  | 
|  | /** | 
|  | * Items run right to left, and lines flow top to bottom. Examples: Arabic, | 
|  | * Hebrew. | 
|  | */ | 
|  | public static final ComponentOrientation RIGHT_TO_LEFT | 
|  | = new ComponentOrientation(HORIZONTAL_ID); | 
|  |  | 
|  | /** | 
|  | * The orientation is unknown for the locale. For backwards compatibility, | 
|  | * this behaves like LEFT_TO_RIGHT in the instance methods. | 
|  | */ | 
|  | public static final ComponentOrientation UNKNOWN | 
|  | = new ComponentOrientation(UNKNOWN_ID | HORIZONTAL_ID | LEFT_TO_RIGHT_ID); | 
|  |  | 
|  | /** | 
|  | * The orientation of this object; bitwise-or of unknown (1), horizontal (2), | 
|  | * and left-to-right (4). | 
|  | * | 
|  | * @serial the orientation | 
|  | */ | 
|  | private final int orientation; | 
|  |  | 
|  | /** | 
|  | * Construct a given orientation. | 
|  | * | 
|  | * @param orientation the orientation | 
|  | */ | 
|  | private ComponentOrientation(int orientation) | 
|  | { | 
|  | this.orientation = orientation; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Returns true if the lines are horizontal, in which case lines flow | 
|  | * top-to-bottom. For example, English, Hebrew. Counterexamples: Japanese, | 
|  | * Chinese, Korean, Mongolian. | 
|  | * | 
|  | * @return true if this orientation has horizontal lines | 
|  | */ | 
|  | public boolean isHorizontal() | 
|  | { | 
|  | return (orientation & HORIZONTAL_ID) != 0; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * If isHorizontal() returns true, then this determines whether items in | 
|  | * the line flow left-to-right. If isHorizontal() returns false, items in | 
|  | * a line flow top-to-bottom, and this determines if lines flow | 
|  | * left-to-right. | 
|  | * | 
|  | * @return true if this orientation flows left-to-right | 
|  | */ | 
|  | public boolean isLeftToRight() | 
|  | { | 
|  | return (orientation & LEFT_TO_RIGHT_ID) != 0; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Gets an orientation appropriate for the locale. | 
|  | * | 
|  | * @param locale the locale | 
|  | * @return the orientation for that locale | 
|  | * @throws NullPointerException if locale is null | 
|  | */ | 
|  | public static ComponentOrientation getOrientation(Locale locale) | 
|  | { | 
|  | // Based on iterating over all languages defined in JDK 1.4, this behavior | 
|  | // matches Sun's. However, it makes me wonder if any non-horizontal | 
|  | // orientations even exist, as it sure contradicts their documentation. | 
|  | String language = locale.getLanguage(); | 
|  | if ("ar".equals(language) || "fa".equals(language) || "iw".equals(language) | 
|  | || "ur".equals(language)) | 
|  | return RIGHT_TO_LEFT; | 
|  | return LEFT_TO_RIGHT; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Gets an orientation from a resource bundle. This tries the following: | 
|  | * | 
|  | * <ul> | 
|  | * <li>Use the key "Orientation" to find an instance of ComponentOrientation | 
|  | * in the bundle.</li> | 
|  | * <li>Get the locale of the resource bundle, and get the orientation of | 
|  | * that locale.</li> | 
|  | * <li>Give up and get the orientation of the default locale.</li> | 
|  | * </ul> | 
|  | * | 
|  | * @param bdl the bundle to use | 
|  | * @return the orientation | 
|  | * @throws NullPointerException if bdl is null | 
|  | * @deprecated use {@link #getOrientation(Locale)} instead | 
|  | */ | 
|  | public static ComponentOrientation getOrientation(ResourceBundle bdl) | 
|  | { | 
|  | ComponentOrientation r; | 
|  | try | 
|  | { | 
|  | r = (ComponentOrientation) bdl.getObject("Orientation"); | 
|  | if (r != null) | 
|  | return r; | 
|  | } | 
|  | catch (MissingResourceException ignored) | 
|  | { | 
|  | } | 
|  | catch (ClassCastException ignored) | 
|  | { | 
|  | } | 
|  | try | 
|  | { | 
|  | r = getOrientation(bdl.getLocale()); | 
|  | if (r != null) | 
|  | return r; | 
|  | } | 
|  | catch (Exception ignored) | 
|  | { | 
|  | } | 
|  | return getOrientation(Locale.getDefault()); | 
|  | } | 
|  | } // class ComponentOrientation |