mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			216 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			216 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			Java
		
	
	
	
/* 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
 |