home *** CD-ROM | disk | FTP | other *** search
Java Source | 1998-03-20 | 9.9 KB | 353 lines |
- /*
- * @(#)Cursor.java 1.13 98/03/18
- *
- * Copyright 1996, 1997 by Sun Microsystems, Inc.,
- * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
- * All rights reserved.
- *
- * This software is the confidential and proprietary information
- * of Sun Microsystems, Inc. ("Confidential Information"). You
- * shall not disclose such Confidential Information and shall use
- * it only in accordance with the terms of the license agreement
- * you entered into with Sun.
- */
- package java.awt;
-
- import java.awt.AWTException;
- import java.awt.Point;
- import java.awt.Toolkit;
-
- import java.io.File;
- import java.io.FileInputStream;
-
- import java.util.Enumeration;
- import java.util.Hashtable;
- import java.util.Properties;
- import java.util.StringTokenizer;
-
- import java.security.AccessController;
-
- /**
- * A class to encapsulate the bitmap representation of the mouse cursor.
- *
- * @see Component#setCursor
- * @version 1.13, 03/18/98
- * @author Amy Fowler
- */
- public class Cursor implements java.io.Serializable {
-
- /**
- * The default cursor type (gets set if no cursor is defined).
- */
- public static final int DEFAULT_CURSOR = 0;
-
- /**
- * The crosshair cursor type.
- */
- public static final int CROSSHAIR_CURSOR = 1;
-
- /**
- * The text cursor type.
- */
- public static final int TEXT_CURSOR = 2;
-
- /**
- * The wait cursor type.
- */
- public static final int WAIT_CURSOR = 3;
-
- /**
- * The south-west-resize cursor type.
- */
- public static final int SW_RESIZE_CURSOR = 4;
-
- /**
- * The south-east-resize cursor type.
- */
- public static final int SE_RESIZE_CURSOR = 5;
-
- /**
- * The north-west-resize cursor type.
- */
- public static final int NW_RESIZE_CURSOR = 6;
-
- /**
- * The north-east-resize cursor type.
- */
- public static final int NE_RESIZE_CURSOR = 7;
-
- /**
- * The north-resize cursor type.
- */
- public static final int N_RESIZE_CURSOR = 8;
-
- /**
- * The south-resize cursor type.
- */
- public static final int S_RESIZE_CURSOR = 9;
-
- /**
- * The west-resize cursor type.
- */
- public static final int W_RESIZE_CURSOR = 10;
-
- /**
- * The east-resize cursor type.
- */
- public static final int E_RESIZE_CURSOR = 11;
-
- /**
- * The hand cursor type.
- */
- public static final int HAND_CURSOR = 12;
-
- /**
- * The move cursor type.
- */
- public static final int MOVE_CURSOR = 13;
-
- /**
- * The platform default drag cursor type.
- */
- public static final int DEFAULT_DRAG_CURSOR = 14;
-
- /**
- * The platform default no drop cursor type.
- */
- public static final int DEFAULT_NODROP_CURSOR = 15;
-
- /**
- * The platform default drop cursor type.
- */
- public static final int DEFAULT_DROP_CURSOR = 16;
-
- protected static Cursor predefined[] = new Cursor[17];
-
- /* Localization names and default values */
- static final String[][] cursorProperties = {
- { "AWT.DefaultCursor", "Default Cursor" },
- { "AWT.CrosshairCursor", "Crosshair Cursor" },
- { "AWT.TextCursor", "Text Cursor" },
- { "AWT.WaitCursor", "Wait Cursor" },
- { "AWT.SWResizeCursor", "Southwest Resize Cursor" },
- { "AWT.SEResizeCursor", "Southeast Resize Cursor" },
- { "AWT.NWResizeCursor", "Northwest Resize Cursor" },
- { "AWT.NEResizeCursor", "Northeast Resize Cursor" },
- { "AWT.NResizeCursor", "North Resize Cursor" },
- { "AWT.SResizeCursor", "South Resize Cursor" },
- { "AWT.WResizeCursor", "West Resize Cursor" },
- { "AWT.EResizeCursor", "East Resize Cursor" },
- { "AWT.HandCursor", "Hand Cursor" },
- { "AWT.MoveCursor", "Move Cursor" },
- { "AWT.DefaultDragCursor", "Default Drag Cursor" },
- { "AWT.DefaultNoDropCursor", "Default No Drop Cursor" },
- { "AWT.DefautlDropCursor", "Default Drop Cursor" }
- };
-
- int type = DEFAULT_CURSOR;
-
- /**
- * The type associated with all custom cursors.
- */
- public static final int CUSTOM_CURSOR = -1;
-
- /*
- * hashtable, filesystem dir prefix, filename, and properties for custom cursors support
- */
-
- private static final Hashtable systemCustomCursors = new Hashtable(1);
- private static final String systemCustomCursorDirPrefix = initCursorDir();
-
- private static String initCursorDir() {
- try {
- java.security.AccessController.beginPrivileged();
- return System.getProperty("java.home") +
- File.separator + "lib" + File.separator + "images" +
- File.separator + "cursors" + File.separator;
- } finally{
- java.security.AccessController.endPrivileged();
- }
- }
-
- private static final String systemCustomCursorPropertiesFile = systemCustomCursorDirPrefix + "cursors.properties";
-
- private static Properties systemCustomCursorProperties = null;
-
- private static final String CursorDotPrefix = "Cursor.";
- private static final String DotFileSuffix = ".File";
- private static final String DotHotspotSuffix = ".HotSpot";
- private static final String DotNameSuffix = ".Name";
-
- /*
- * JDK 1.1 serialVersionUID
- */
- private static final long serialVersionUID = 8028237497568985504L;
-
- protected String name;
-
- /**
- * Returns a cursor object with the specified predefined type.
- * @param type the type of predefined cursor
- */
- static public Cursor getPredefinedCursor(int type) {
- if (type < Cursor.DEFAULT_CURSOR || type > Cursor.DEFAULT_DROP_CURSOR) {
- throw new IllegalArgumentException("illegal cursor type");
- }
- if (predefined[type] == null) {
- predefined[type] = new Cursor(type);
- }
- return predefined[type];
- }
-
- /**
- * @return the system specific custom Cursor named
- *
- * Cursor names are, for example: "Invalid.16x16"
- */
-
- static public Cursor getSystemCustomCursor(String name) throws AWTException {
- Cursor cursor = (Cursor)systemCustomCursors.get(name);
-
- if (cursor == null) {
- synchronized(systemCustomCursors) {
- if (systemCustomCursorProperties == null)
- loadSystemCustomCursorProperties();
- }
-
- String prefix = CursorDotPrefix + name;
- String key = prefix + DotFileSuffix;
-
- if (!systemCustomCursorProperties.containsKey(key)) return null;
-
- String fileName = systemCustomCursorProperties.getProperty(key);
-
- String localized = (String)systemCustomCursorProperties.getProperty(prefix + DotNameSuffix);
-
- if (localized == null) localized = name;
-
- String hotspot = (String)systemCustomCursorProperties.getProperty(prefix + DotHotspotSuffix);
-
- if (hotspot == null)
- throw new AWTException("no hotspot property defined for cursor: " + name);
-
- StringTokenizer st = new StringTokenizer(hotspot, ",");
-
- if (st.countTokens() != 2)
- throw new AWTException("failed to parse hotspot property for cursor: " + name);
-
- int x = 0;
- int y = 0;
-
- try {
- x = Integer.parseInt(st.nextToken());
- y = Integer.parseInt(st.nextToken());
- } catch (NumberFormatException nfe) {
- throw new AWTException("failed to parse hotspot property for cursor: " + name);
- }
-
- try {
- Toolkit toolkit = Toolkit.getDefaultToolkit();
-
- Image image = toolkit.getImage(systemCustomCursorDirPrefix + fileName);
-
- cursor = toolkit.createCustomCursor(image, new Point(x,y), localized);
- } catch (Exception e) {
- throw new AWTException("Exception: " + e.getClass() + " " + e.getMessage() + " occurred while creating cursor " + name);
- }
-
- systemCustomCursors.put(name, cursor);
- }
-
- return cursor;
- }
-
- /**
- * Return the system default cursor.
- */
- static public Cursor getDefaultCursor() {
- return getPredefinedCursor(Cursor.DEFAULT_CURSOR);
- }
-
- /**
- * Creates a new cursor object with the specified type.
- * @param type the type of cursor
- */
- public Cursor(int type) {
- if (type < Cursor.DEFAULT_CURSOR || type > Cursor.DEFAULT_DROP_CURSOR) {
- throw new IllegalArgumentException("illegal cursor type");
- }
- this.type = type;
-
- // Lookup localized name.
- name = Toolkit.getDefaultToolkit().getProperty(cursorProperties[type][0],
- cursorProperties[type][1]);
- }
-
- /**
- * Creates a new custom cursor object with the specified name.<p>
- * Note: this constructor should only be used by AWT implementations
- * as part of their support for custom cursors. Applications should
- * use Toolkit.createCustomCursor().
- * @param name the user-visible name of the cursor.
- * @see java.awt.Toolkit#createCustomCursor
- */
- protected Cursor(String name) {
- this.type = Cursor.CUSTOM_CURSOR;
- this.name = name;
- }
-
- /**
- * Returns the type for this cursor.
- */
- public int getType() {
- return type;
- }
-
- /**
- * Returns the name of this cursor.
- * @return a localized description of this cursor.
- * @since JDK1.2
- */
- public String getName() {
- return name;
- }
-
- /**
- * Returns a string representation of this cursor.
- * @return a string representation of this cursor.
- * @since JDK1.2
- */
- public String toString() {
- return getClass().getName() + "[" + getName() + "]";
- }
-
- /*
- * load the cursor.properties file
- */
-
- private static void loadSystemCustomCursorProperties() throws AWTException {
- synchronized(systemCustomCursors) {
- systemCustomCursorProperties = new Properties();
-
- try {
- java.security.AccessController.beginPrivileged();
-
- try {
- FileInputStream fis = new FileInputStream(systemCustomCursorPropertiesFile);
-
- systemCustomCursorProperties.load(fis);
-
- fis.close();
- } catch (Exception e) {
- systemCustomCursorProperties = null;
-
- throw new AWTException("Exception: " + e.getClass() + " " + e.getMessage() + " occurred while loading: " + systemCustomCursorPropertiesFile);
-
- }
- } finally {
- java.security.AccessController.endPrivileged();
- }
- }
- }
- }
-