/* * Copyright © 2009-2011 Rebecca G. Bettencourt / Kreative Software * <p> * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * <a href="http://www.mozilla.org/MPL/">http://www.mozilla.org/MPL/</a> * <p> * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the * License for the specific language governing rights and limitations * under the License. * <p> * Alternatively, the contents of this file may be used under the terms * of the GNU Lesser General Public License (the "LGPL License"), in which * case the provisions of LGPL License are applicable instead of those * above. If you wish to allow use of your version of this file only * under the terms of the LGPL License and not to allow others to use * your version of this file under the MPL, indicate your decision by * deleting the provisions above and replace them with the notice and * other provisions required by the LGPL License. If you do not delete * the provisions above, a recipient may use your version of this file * under either the MPL or the LGPL License. * @since PowerPaint 1.0 * @author Rebecca G. Bettencourt, Kreative Software */ package com.kreative.paint.util; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Toolkit; import java.awt.image.BufferedImage; public class CursorUtils { private CursorUtils() {} private static final int K = 0xFF000000; private static final int W = 0xFFFFFFFF; public static final Cursor CURSOR_MOVE = makeCursor( 17, 17, new int[] { 0,0,0,0,0,0,0,0,W,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,W,K,W,0,0,0,0,0,0,0, 0,0,0,0,0,0,W,K,K,K,W,0,0,0,0,0,0, 0,0,0,0,0,W,K,K,K,K,K,W,0,0,0,0,0, 0,0,0,0,W,W,W,W,K,W,W,W,W,0,0,0,0, 0,0,0,W,W,0,0,W,K,W,0,0,W,W,0,0,0, 0,0,W,K,W,0,0,W,K,W,0,0,W,K,W,0,0, 0,W,K,K,W,W,W,W,K,W,W,W,W,K,K,W,0, W,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,W, 0,W,K,K,W,W,W,W,K,W,W,W,W,K,K,W,0, 0,0,W,K,W,0,0,W,K,W,0,0,W,K,W,0,0, 0,0,0,W,W,0,0,W,K,W,0,0,W,W,0,0,0, 0,0,0,0,W,W,W,W,K,W,W,W,W,0,0,0,0, 0,0,0,0,0,W,K,K,K,K,K,W,0,0,0,0,0, 0,0,0,0,0,0,W,K,K,K,W,0,0,0,0,0,0, 0,0,0,0,0,0,0,W,K,W,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,W,0,0,0,0,0,0,0,0, }, 8, 8, "Move" ); public static final Cursor CURSOR_ARROW = makeCursor( 16, 16, new int[] { W,W,0,0,0,0,0,0,0,0,0,0,0,0,0,0, W,K,W,0,0,0,0,0,0,0,0,0,0,0,0,0, W,K,K,W,0,0,0,0,0,0,0,0,0,0,0,0, W,K,K,K,W,0,0,0,0,0,0,0,0,0,0,0, W,K,K,K,K,W,0,0,0,0,0,0,0,0,0,0, W,K,K,K,K,K,W,0,0,0,0,0,0,0,0,0, W,K,K,K,K,K,K,W,0,0,0,0,0,0,0,0, W,K,K,K,K,K,K,K,W,0,0,0,0,0,0,0, W,K,K,K,K,K,K,K,K,W,0,0,0,0,0,0, W,K,K,K,K,K,W,W,W,W,W,0,0,0,0,0, W,K,K,W,K,K,W,0,0,0,0,0,0,0,0,0, W,K,W,0,W,K,K,W,0,0,0,0,0,0,0,0, W,W,0,0,W,K,K,W,0,0,0,0,0,0,0,0, W,0,0,0,0,W,K,K,W,0,0,0,0,0,0,0, 0,0,0,0,0,W,K,K,W,0,0,0,0,0,0,0, 0,0,0,0,0,0,W,W,W,0,0,0,0,0,0,0, }, 1, 1, "Arrow" ); public static final Cursor CURSOR_ARROW_HALLOW = makeCursor( 16, 16, new int[] { W,W,0,0,0,0,0,0,0,0,0,0,0,0,0,0, W,K,W,0,0,0,0,0,0,0,0,0,0,0,0,0, W,K,K,W,0,0,0,0,0,0,0,0,0,0,0,0, W,K,W,K,W,0,0,0,0,0,0,0,0,0,0,0, W,K,W,W,K,W,0,0,0,0,0,0,0,0,0,0, W,K,W,W,W,K,W,0,0,0,0,0,0,0,0,0, W,K,W,W,W,W,K,W,0,0,0,0,0,0,0,0, W,K,W,W,W,W,W,K,W,0,0,0,0,0,0,0, W,K,W,W,W,W,K,K,K,W,0,0,0,0,0,0, W,K,W,K,K,K,W,W,W,W,W,0,0,0,0,0, W,K,K,W,K,K,W,0,0,0,0,0,0,0,0,0, W,K,W,0,W,K,K,W,0,0,0,0,0,0,0,0, W,W,0,0,W,K,K,W,0,0,0,0,0,0,0,0, W,0,0,0,0,W,K,K,W,0,0,0,0,0,0,0, 0,0,0,0,0,W,K,K,W,0,0,0,0,0,0,0, 0,0,0,0,0,0,W,W,W,0,0,0,0,0,0,0, }, 1, 1, "HollowArrow" ); public static final Cursor CURSOR_ARROW_HALF = makeCursor( 16, 16, new int[] { W,W,0,0,0,0,0,0,0,0,0,0,0,0,0,0, W,K,W,0,0,0,0,0,0,0,0,0,0,0,0,0, W,K,K,W,0,0,0,0,0,0,0,0,0,0,0,0, W,K,K,K,W,0,0,0,0,0,0,0,0,0,0,0, W,K,K,K,K,W,0,0,0,0,0,0,0,0,0,0, W,K,K,K,K,K,W,0,0,0,0,0,0,0,0,0, W,K,K,K,K,K,K,W,0,0,0,0,0,0,0,0, W,K,K,K,K,K,K,K,W,0,0,0,0,0,0,0, W,K,K,K,K,K,K,K,K,W,0,0,0,0,0,0, W,K,K,K,W,W,W,W,W,W,W,0,0,0,0,0, W,K,K,W,0,0,0,0,0,0,0,0,0,0,0,0, W,K,W,0,0,0,0,0,0,0,0,0,0,0,0,0, W,W,0,0,0,0,0,0,0,0,0,0,0,0,0,0, W,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, }, 1, 1, "HalfArrow" ); public static final Cursor CURSOR_ARROW_HALF_HALLOW = makeCursor( 16, 16, new int[] { W,W,0,0,0,0,0,0,0,0,0,0,0,0,0,0, W,K,W,0,0,0,0,0,0,0,0,0,0,0,0,0, W,K,K,W,0,0,0,0,0,0,0,0,0,0,0,0, W,K,W,K,W,0,0,0,0,0,0,0,0,0,0,0, W,K,W,W,K,W,0,0,0,0,0,0,0,0,0,0, W,K,W,W,W,K,W,0,0,0,0,0,0,0,0,0, W,K,W,W,W,W,K,W,0,0,0,0,0,0,0,0, W,K,W,W,W,W,W,K,W,0,0,0,0,0,0,0, W,K,W,W,K,K,K,K,K,W,0,0,0,0,0,0, W,K,W,K,W,W,W,W,W,W,W,0,0,0,0,0, W,K,K,W,0,0,0,0,0,0,0,0,0,0,0,0, W,K,W,0,0,0,0,0,0,0,0,0,0,0,0,0, W,W,0,0,0,0,0,0,0,0,0,0,0,0,0,0, W,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, }, 1, 1, "HollowHalfArrow" ); public static final Cursor CURSOR_ARROW_HALF_DOUBLE = makeCursor( 16, 16, new int[] { W,W,0,0,0,0,0,0,0,0,0,0,0,0,0,0, W,K,W,0,0,0,0,0,0,0,0,0,0,0,0,0, W,K,K,W,0,W,W,0,0,0,0,0,0,0,0,0, W,K,K,K,W,W,K,W,0,0,0,0,0,0,0,0, W,K,K,K,K,W,K,K,W,0,0,0,0,0,0,0, W,K,K,K,K,K,W,K,K,W,0,0,0,0,0,0, W,K,K,K,K,K,K,W,K,K,W,0,0,0,0,0, W,K,K,K,K,K,K,K,W,K,K,W,0,0,0,0, W,K,K,K,K,K,K,K,K,W,K,K,W,0,0,0, W,K,K,K,W,W,W,W,W,W,W,K,K,W,0,0, W,K,K,W,0,W,K,K,K,K,K,K,K,K,W,0, W,K,W,0,0,W,K,K,K,W,W,W,W,W,W,W, W,W,0,0,0,W,K,K,W,0,0,0,0,0,0,0, W,0,0,0,0,W,K,W,0,0,0,0,0,0,0,0, 0,0,0,0,0,W,W,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,W,0,0,0,0,0,0,0,0,0,0, }, 1, 1, "DoubleHalfArrow" ); public static final Cursor CURSOR_ARROW_HALF_DOUBLE_HALLOW = makeCursor( 16, 16, new int[] { W,W,0,0,0,0,0,0,0,0,0,0,0,0,0,0, W,K,W,0,0,0,0,0,0,0,0,0,0,0,0,0, W,K,K,W,0,W,W,0,0,0,0,0,0,0,0,0, W,K,W,K,W,W,K,W,0,0,0,0,0,0,0,0, W,K,W,W,K,W,K,K,W,0,0,0,0,0,0,0, W,K,W,W,W,K,W,W,K,W,0,0,0,0,0,0, W,K,W,W,W,W,K,W,W,K,W,0,0,0,0,0, W,K,W,W,W,W,W,K,W,W,K,W,0,0,0,0, W,K,W,W,K,K,K,K,K,W,W,K,W,0,0,0, W,K,W,K,W,W,W,W,W,W,W,W,K,W,0,0, W,K,K,W,0,W,K,W,W,K,K,K,K,K,W,0, W,K,W,0,0,W,K,W,K,W,W,W,W,W,W,W, W,W,0,0,0,W,K,K,W,0,0,0,0,0,0,0, W,0,0,0,0,W,K,W,0,0,0,0,0,0,0,0, 0,0,0,0,0,W,W,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,W,0,0,0,0,0,0,0,0,0,0, }, 1, 1, "HollowDoubleHalfArrow" ); public static final Cursor CURSOR_SELECT = makeCursor( 17, 17, new int[] { 0,0,0,0,0,0,0,W,W,W,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,W,K,W,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,W,K,W,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,W,W,W,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,W,K,W,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,W,K,W,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,W,W,W,0,0,0,0,0,0,0, W,W,W,W,W,W,W,W,K,W,W,W,W,W,W,W,W, W,K,K,W,K,K,W,K,K,K,W,K,K,W,K,K,W, W,W,W,W,W,W,W,W,K,W,W,W,W,W,W,W,W, 0,0,0,0,0,0,0,W,W,W,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,W,K,W,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,W,K,W,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,W,W,W,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,W,K,W,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,W,K,W,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,W,W,W,0,0,0,0,0,0,0, }, 8, 8, "Select" ); public static final Cursor CURSOR_MOVE_SELECT = makeCursor( 17, 17, new int[] { 0,0,0,0,0,0,0,0,W,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,W,K,W,0,0,0,0,0,0,0, 0,0,0,0,0,0,W,K,W,K,W,0,0,0,0,0,0, 0,0,0,0,0,W,K,W,W,W,K,W,0,0,0,0,0, 0,0,0,0,W,W,W,W,K,W,W,W,W,0,0,0,0, 0,0,0,W,W,0,0,W,K,W,0,0,W,W,0,0,0, 0,0,W,K,W,0,0,W,W,W,0,0,W,K,W,0,0, 0,W,K,W,W,W,W,W,K,W,W,W,W,W,K,W,0, W,K,W,W,K,K,W,K,K,K,W,K,K,W,W,K,W, 0,W,K,W,W,W,W,W,K,W,W,W,W,W,K,W,0, 0,0,W,K,W,0,0,W,W,W,0,0,W,K,W,0,0, 0,0,0,W,W,0,0,W,K,W,0,0,W,W,0,0,0, 0,0,0,0,W,W,W,W,K,W,W,W,W,0,0,0,0, 0,0,0,0,0,W,K,W,W,W,K,W,0,0,0,0,0, 0,0,0,0,0,0,W,K,W,K,W,0,0,0,0,0,0, 0,0,0,0,0,0,0,W,K,W,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,W,0,0,0,0,0,0,0,0, }, 8, 8, "MoveSelect" ); public static final Cursor CURSOR_DROPPER = makeCursor( 16, 16, new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,K,K,K,0, 0,0,0,0,0,0,0,0,0,0,0,K,K,K,K,K, 0,0,0,0,0,0,0,0,0,0,0,K,K,K,K,K, 0,0,0,0,0,0,0,0,K,K,K,K,K,K,K,K, 0,0,0,0,0,0,0,0,0,K,K,K,K,K,K,0, 0,0,0,0,0,0,0,0,K,W,K,K,K,0,0,0, 0,0,0,0,0,0,0,K,W,W,W,K,K,0,0,0, 0,0,0,0,0,0,K,W,W,W,K,0,K,0,0,0, 0,0,0,0,0,K,W,W,W,K,0,0,0,0,0,0, 0,0,0,0,K,W,W,W,K,0,0,0,0,0,0,0, 0,0,0,K,W,W,W,K,0,0,0,0,0,0,0,0, 0,0,K,W,W,W,K,0,0,0,0,0,0,0,0,0, 0,K,W,W,W,K,0,0,0,0,0,0,0,0,0,0, 0,K,W,W,K,0,0,0,0,0,0,0,0,0,0,0, K,W,K,K,0,0,0,0,0,0,0,0,0,0,0,0, 0,K,0,0,0,0,0,0,0,0,0,0,0,0,0,0, }, 0, 15, "Eyedropper" ); public static final Cursor CURSOR_BUCKET = makeCursor( 16, 16, new int[] { 0,0,0,0,0,K,K,K,0,0,0,0,0,0,0,0, 0,0,0,0,K,0,0,0,K,0,0,0,0,0,0,0, 0,0,0,0,K,0,0,K,K,0,0,0,0,0,0,0, 0,0,0,0,K,0,K,W,K,K,0,0,0,0,0,0, 0,0,0,0,K,K,W,W,K,W,K,K,0,0,0,0, 0,0,0,0,K,W,W,W,K,W,W,K,K,K,0,0, 0,0,0,K,W,W,W,W,K,W,W,W,K,K,K,0, 0,0,K,W,W,W,W,K,W,K,W,W,W,K,K,K, 0,K,W,W,W,W,W,W,K,W,W,W,W,K,K,K, K,W,W,W,W,W,W,W,W,W,W,W,K,K,K,K, K,W,W,W,W,W,W,W,W,W,W,K,0,K,K,K, 0,K,W,W,W,W,W,W,W,W,K,0,0,K,K,K, 0,0,K,W,W,W,W,W,W,K,0,0,0,K,K,K, 0,0,0,K,W,W,W,W,K,0,0,0,0,K,K,K, 0,0,0,0,K,W,W,K,0,0,0,0,0,K,K,0, 0,0,0,0,0,K,K,0,0,0,0,0,0,K,0,0, }, 13, 15, "PaintBucket" ); public static final Cursor CURSOR_HAND_OPEN = CursorUtils.makeCursor( 16, 16, new int[] { 0,0,0,0,0,0,0,K,K,0,0,0,0,0,0,0, 0,0,0,K,K,0,K,W,W,K,K,K,0,0,0,0, 0,0,K,W,W,K,K,W,W,K,W,W,K,0,0,0, 0,0,K,W,W,K,K,W,W,K,W,W,K,0,K,0, 0,0,0,K,W,W,K,W,W,K,W,W,K,K,W,K, 0,0,0,K,W,W,K,W,W,K,W,W,K,W,W,K, 0,K,K,0,K,W,W,W,W,W,W,W,K,W,W,K, K,W,W,K,K,W,W,W,W,W,W,W,W,W,W,K, K,W,W,W,K,W,W,W,W,W,W,W,W,W,K,0, 0,K,W,W,W,W,W,W,W,W,W,W,W,W,K,0, 0,0,K,W,W,W,W,W,W,W,W,W,W,W,K,0, 0,0,K,W,W,W,W,W,W,W,W,W,W,K,0,0, 0,0,0,K,W,W,W,W,W,W,W,W,W,K,0,0, 0,0,0,0,K,W,W,W,W,W,W,W,K,0,0,0, 0,0,0,0,0,K,W,W,W,W,W,W,K,0,0,0, 0,0,0,0,0,K,W,W,W,W,W,W,K,0,0,0, }, 6, 6, "Hand" ); public static final Cursor CURSOR_HAND_CLOSED = CursorUtils.makeCursor( 16, 16, new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,K,K,0,K,K,0,K,K,0,0,0,0, 0,0,0,K,W,W,K,W,W,K,W,W,K,K,0,0, 0,0,0,K,W,W,W,W,W,W,W,W,K,W,K,0, 0,0,0,0,K,W,W,W,W,W,W,W,W,W,K,0, 0,0,0,K,K,W,W,W,W,W,W,W,W,W,K,0, 0,0,K,W,W,W,W,W,W,W,W,W,W,W,K,0, 0,0,K,W,W,W,W,W,W,W,W,W,W,W,K,0, 0,0,K,W,W,W,W,W,W,W,W,W,W,K,0,0, 0,0,0,K,W,W,W,W,W,W,W,W,W,K,0,0, 0,0,0,0,K,W,W,W,W,W,W,W,K,0,0,0, 0,0,0,0,0,K,W,W,W,W,W,W,K,0,0,0, 0,0,0,0,0,K,W,W,W,W,W,W,K,0,0,0, }, 6, 6, "HandClosed" ); public static Cursor makeCursor(int width, int height, int[] rgb, int hotx, int hoty, String name) { try { Toolkit tk = Toolkit.getDefaultToolkit(); Dimension d = tk.getBestCursorSize(width, height); if (d.width <= 0 || d.height <= 0) { System.err.println("Notice: System does not support custom cursors. Returning generic cursor."); return Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR); } if (d.width < width || d.height < height) { d = tk.getBestCursorSize(width*2, height*2); if (d.width < width || d.height < height) { System.err.println("Notice: Tool requested a cursor larger than possible on this system. Returning generic cursor."); return Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR); } } BufferedImage img2 = new BufferedImage(d.width, d.height, BufferedImage.TYPE_INT_ARGB); img2.setRGB(0, 0, width, height, rgb, 0, width); return tk.createCustomCursor(img2, new Point(hotx, hoty), name); } catch (Exception e) { e.printStackTrace(); return Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR); } } public static Cursor makeCursor(BufferedImage img, int hotx, int hoty, String name) { try { Toolkit tk = Toolkit.getDefaultToolkit(); Dimension d = tk.getBestCursorSize(img.getWidth(), img.getHeight()); if (d.width <= 0 || d.height <= 0) { System.err.println("Notice: System does not support custom cursors. Returning generic cursor."); return Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR); } if (d.width < img.getWidth() || d.height < img.getHeight()) { d = tk.getBestCursorSize(img.getWidth()*2, img.getHeight()*2); if (d.width < img.getWidth() || d.height < img.getHeight()) { System.err.println("Notice: Tool requested a cursor larger than possible on this system. Returning generic cursor."); return Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR); } } BufferedImage img2 = new BufferedImage(d.width, d.height, BufferedImage.TYPE_INT_ARGB); Graphics2D g2 = img2.createGraphics(); g2.drawImage(img, null, 0, 0); g2.dispose(); return tk.createCustomCursor(img2, new Point(hotx, hoty), name); } catch (Exception e) { e.printStackTrace(); return Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR); } } }