History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/java/awt/Cursor.java (1 of 18352 files). Show all

Unified · Split

java/pkg/java/awt/Cursor.java+463−0
@@ -0,0 +1,463 @@
1/*
2 * Copyright (c) 1996, 2007, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25package java.awt;
26
27import java.awt.AWTException;
28import java.awt.Point;
29import java.awt.Toolkit;
30
31import java.io.File;
32import java.io.FileInputStream;
33
34import java.beans.ConstructorProperties;
35import java.util.Hashtable;
36import java.util.Properties;
37import java.util.StringTokenizer;
38
39import java.security.AccessController;
40
41import sun.util.logging.PlatformLogger;
42
43/**
44 * A class to encapsulate the bitmap representation of the mouse cursor.
45 *
46 * @see Component#setCursor
47 * @author Amy Fowler
48 */
49public class Cursor implements java.io.Serializable {
50
51 /**
52 * The default cursor type (gets set if no cursor is defined).
53 */
54 public static final int DEFAULT_CURSOR = 0;
55
56 /**
57 * The crosshair cursor type.
58 */
59 public static final int CROSSHAIR_CURSOR = 1;
60
61 /**
62 * The text cursor type.
63 */
64 public static final int TEXT_CURSOR = 2;
65
66 /**
67 * The wait cursor type.
68 */
69 public static final int WAIT_CURSOR = 3;
70
71 /**
72 * The south-west-resize cursor type.
73 */
74 public static final int SW_RESIZE_CURSOR = 4;
75
76 /**
77 * The south-east-resize cursor type.
78 */
79 public static final int SE_RESIZE_CURSOR = 5;
80
81 /**
82 * The north-west-resize cursor type.
83 */
84 public static final int NW_RESIZE_CURSOR = 6;
85
86 /**
87 * The north-east-resize cursor type.
88 */
89 public static final int NE_RESIZE_CURSOR = 7;
90
91 /**
92 * The north-resize cursor type.
93 */
94 public static final int N_RESIZE_CURSOR = 8;
95
96 /**
97 * The south-resize cursor type.
98 */
99 public static final int S_RESIZE_CURSOR = 9;
100
101 /**
102 * The west-resize cursor type.
103 */
104 public static final int W_RESIZE_CURSOR = 10;
105
106 /**
107 * The east-resize cursor type.
108 */
109 public static final int E_RESIZE_CURSOR = 11;
110
111 /**
112 * The hand cursor type.
113 */
114 public static final int HAND_CURSOR = 12;
115
116 /**
117 * The move cursor type.
118 */
119 public static final int MOVE_CURSOR = 13;
120
121 /**
122 * @deprecated As of JDK version 1.7, the {@link #getPredefinedCursor(int)}
123 * method should be used instead.
124 */
125 @Deprecated
126 protected static Cursor predefined[] = new Cursor[14];
127
128 /**
129 * This field is a private replacement for 'predefined' array.
130 */
131 private final static Cursor[] predefinedPrivate = new Cursor[14];
132
133 /* Localization names and default values */
134 static final String[][] cursorProperties = {
135 { "AWT.DefaultCursor", "Default Cursor" },
136 { "AWT.CrosshairCursor", "Crosshair Cursor" },
137 { "AWT.TextCursor", "Text Cursor" },
138 { "AWT.WaitCursor", "Wait Cursor" },
139 { "AWT.SWResizeCursor", "Southwest Resize Cursor" },
140 { "AWT.SEResizeCursor", "Southeast Resize Cursor" },
141 { "AWT.NWResizeCursor", "Northwest Resize Cursor" },
142 { "AWT.NEResizeCursor", "Northeast Resize Cursor" },
143 { "AWT.NResizeCursor", "North Resize Cursor" },
144 { "AWT.SResizeCursor", "South Resize Cursor" },
145 { "AWT.WResizeCursor", "West Resize Cursor" },
146 { "AWT.EResizeCursor", "East Resize Cursor" },
147 { "AWT.HandCursor", "Hand Cursor" },
148 { "AWT.MoveCursor", "Move Cursor" },
149 };
150
151 /**
152 * The chosen cursor type initially set to
153 * the <code>DEFAULT_CURSOR</code>.
154 *
155 * @serial
156 * @see #getType()
157 */
158 int type = DEFAULT_CURSOR;
159
160 /**
161 * The type associated with all custom cursors.
162 */
163 public static final int CUSTOM_CURSOR = -1;
164
165 /*
166 * hashtable, filesystem dir prefix, filename, and properties for custom cursors support
167 */
168
169 private static final Hashtable systemCustomCursors = new Hashtable(1);
170 private static final String systemCustomCursorDirPrefix = initCursorDir();
171
172 private static String initCursorDir() {
173 String jhome = (String) java.security.AccessController.doPrivileged(
174 new sun.security.action.GetPropertyAction("java.home"));
175 return jhome +
176 File.separator + "lib" + File.separator + "images" +
177 File.separator + "cursors" + File.separator;
178 }
179
180 private static final String systemCustomCursorPropertiesFile = systemCustomCursorDirPrefix + "cursors.properties";
181
182 private static Properties systemCustomCursorProperties = null;
183
184 private static final String CursorDotPrefix = "Cursor.";
185 private static final String DotFileSuffix = ".File";
186 private static final String DotHotspotSuffix = ".HotSpot";
187 private static final String DotNameSuffix = ".Name";
188
189 /*
190 * JDK 1.1 serialVersionUID
191 */
192 private static final long serialVersionUID = 8028237497568985504L;
193
194 private static final PlatformLogger log = PlatformLogger.getLogger("java.awt.Cursor");
195
196 static {
197 /* ensure that the necessary native libraries are loaded */
198 Toolkit.loadLibraries();
199 if (!GraphicsEnvironment.isHeadless()) {
200 initIDs();
201 }
202 }
203
204 /**
205 * Initialize JNI field and method IDs for fields that may be
206 * accessed from C.
207 */
208 private static native void initIDs();
209
210 /**
211 * Hook into native data.
212 */
213 private transient long pData;
214
215 private transient Object anchor = new Object();
216
217 static class CursorDisposer implements sun.java2d.DisposerRecord {
218 volatile long pData;
219 public CursorDisposer(long pData) {
220 this.pData = pData;
221 }
222 public void dispose() {
223 if (pData != 0) {
224 finalizeImpl(pData);
225 }
226 }
227 }
228 transient CursorDisposer disposer;
229 private void setPData(long pData) {
230 this.pData = pData;
231 if (GraphicsEnvironment.isHeadless()) {
232 return;
233 }
234 if (disposer == null) {
235 disposer = new CursorDisposer(pData);
236 // anchor is null after deserialization
237 if (anchor == null) {
238 anchor = new Object();
239 }
240 sun.java2d.Disposer.addRecord(anchor, disposer);
241 } else {
242 disposer.pData = pData;
243 }
244 }
245
246 /**
247 * The user-visible name of the cursor.
248 *
249 * @serial
250 * @see #getName()
251 */
252 protected String name;
253
254 /**
255 * Returns a cursor object with the specified predefined type.
256 *
257 * @param type the type of predefined cursor
258 * @return the specified predefined cursor
259 * @throws IllegalArgumentException if the specified cursor type is
260 * invalid
261 */
262 static public Cursor getPredefinedCursor(int type) {
263 if (type < Cursor.DEFAULT_CURSOR || type > Cursor.MOVE_CURSOR) {
264 throw new IllegalArgumentException("illegal cursor type");
265 }
266 Cursor c = predefinedPrivate[type];
267 if (c == null) {
268 predefinedPrivate[type] = c = new Cursor(type);
269 }
270 // fill 'predefined' array for backwards compatibility.
271 if (predefined[type] == null) {
272 predefined[type] = c;
273 }
274 return c;
275 }
276
277 /**
278 * Returns a system-specific custom cursor object matching the
279 * specified name. Cursor names are, for example: "Invalid.16x16"
280 *
281 * @param name a string describing the desired system-specific custom cursor
282 * @return the system specific custom cursor named
283 * @exception HeadlessException if
284 * <code>GraphicsEnvironment.isHeadless</code> returns true
285 */
286 static public Cursor getSystemCustomCursor(final String name)
287 throws AWTException, HeadlessException {
288 GraphicsEnvironment.checkHeadless();
289 Cursor cursor = (Cursor)systemCustomCursors.get(name);
290
291 if (cursor == null) {
292 synchronized(systemCustomCursors) {
293 if (systemCustomCursorProperties == null)
294 loadSystemCustomCursorProperties();
295 }
296
297 String prefix = CursorDotPrefix + name;
298 String key = prefix + DotFileSuffix;
299
300 if (!systemCustomCursorProperties.containsKey(key)) {
301 if (log.isLoggable(PlatformLogger.FINER)) {
302 log.finer("Cursor.getSystemCustomCursor(" + name + ") returned null");
303 }
304 return null;
305 }
306
307 final String fileName =
308 systemCustomCursorProperties.getProperty(key);
309
310 String localized = (String)systemCustomCursorProperties.getProperty(prefix + DotNameSuffix);
311
312 if (localized == null) localized = name;
313
314 String hotspot = (String)systemCustomCursorProperties.getProperty(prefix + DotHotspotSuffix);
315
316 if (hotspot == null)
317 throw new AWTException("no hotspot property defined for cursor: " + name);
318
319 StringTokenizer st = new StringTokenizer(hotspot, ",");
320
321 if (st.countTokens() != 2)
322 throw new AWTException("failed to parse hotspot property for cursor: " + name);
323
324 int x = 0;
325 int y = 0;
326
327 try {
328 x = Integer.parseInt(st.nextToken());
329 y = Integer.parseInt(st.nextToken());
330 } catch (NumberFormatException nfe) {
331 throw new AWTException("failed to parse hotspot property for cursor: " + name);
332 }
333
334 try {
335 final int fx = x;
336 final int fy = y;
337 final String flocalized = localized;
338
339 cursor = (Cursor) java.security.AccessController.doPrivileged(
340 new java.security.PrivilegedExceptionAction() {
341 public Object run() throws Exception {
342 Toolkit toolkit = Toolkit.getDefaultToolkit();
343 Image image = toolkit.getImage(
344 systemCustomCursorDirPrefix + fileName);
345 return toolkit.createCustomCursor(
346 image, new Point(fx,fy), flocalized);
347 }
348 });
349 } catch (Exception e) {
350 throw new AWTException(
351 "Exception: " + e.getClass() + " " + e.getMessage() +
352 " occurred while creating cursor " + name);
353 }
354
355 if (cursor == null) {
356 if (log.isLoggable(PlatformLogger.FINER)) {
357 log.finer("Cursor.getSystemCustomCursor(" + name + ") returned null");
358 }
359 } else {
360 systemCustomCursors.put(name, cursor);
361 }
362 }
363
364 return cursor;
365 }
366
367 /**
368 * Return the system default cursor.
369 */
370 static public Cursor getDefaultCursor() {
371 return getPredefinedCursor(Cursor.DEFAULT_CURSOR);
372 }
373
374 /**
375 * Creates a new cursor object with the specified type.
376 * @param type the type of cursor
377 * @throws IllegalArgumentException if the specified cursor type
378 * is invalid
379 */
380 @ConstructorProperties({"type"})
381 public Cursor(int type) {
382 if (type < Cursor.DEFAULT_CURSOR || type > Cursor.MOVE_CURSOR) {
383 throw new IllegalArgumentException("illegal cursor type");
384 }
385 this.type = type;
386
387 // Lookup localized name.
388 name = Toolkit.getProperty(cursorProperties[type][0],
389 cursorProperties[type][1]);
390 }
391
392 /**
393 * Creates a new custom cursor object with the specified name.<p>
394 * Note: this constructor should only be used by AWT implementations
395 * as part of their support for custom cursors. Applications should
396 * use Toolkit.createCustomCursor().
397 * @param name the user-visible name of the cursor.
398 * @see java.awt.Toolkit#createCustomCursor
399 */
400 protected Cursor(String name) {
401 this.type = Cursor.CUSTOM_CURSOR;
402 this.name = name;
403 }
404
405 /**
406 * Returns the type for this cursor.
407 */
408 public int getType() {
409 return type;
410 }
411
412 /**
413 * Returns the name of this cursor.
414 * @return a localized description of this cursor.
415 * @since 1.2
416 */
417 public String getName() {
418 return name;
419 }
420
421 /**
422 * Returns a string representation of this cursor.
423 * @return a string representation of this cursor.
424 * @since 1.2
425 */
426 public String toString() {
427 return getClass().getName() + "[" + getName() + "]";
428 }
429
430 /*
431 * load the cursor.properties file
432 */
433 private static void loadSystemCustomCursorProperties() throws AWTException {
434 synchronized(systemCustomCursors) {
435 systemCustomCursorProperties = new Properties();
436
437 try {
438 AccessController.doPrivileged(
439 new java.security.PrivilegedExceptionAction() {
440 public Object run() throws Exception {
441 FileInputStream fis = null;
442 try {
443 fis = new FileInputStream(
444 systemCustomCursorPropertiesFile);
445 systemCustomCursorProperties.load(fis);
446 } finally {
447 if (fis != null)
448 fis.close();
449 }
450 return null;
451 }
452 });
453 } catch (Exception e) {
454 systemCustomCursorProperties = null;
455 throw new AWTException("Exception: " + e.getClass() + " " +
456 e.getMessage() + " occurred while loading: " +
457 systemCustomCursorPropertiesFile);
458 }
459 }
460 }
461
462 private native static void finalizeImpl(long pData);
463}