1 /* 2 * Copyright (c) 2011, 2018, 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 */ 25 26 package com.sun.javafx.embed.swing; 27 28 import java.awt.Cursor; 29 import java.awt.Dimension; 30 import java.awt.Point; 31 import java.awt.Toolkit; 32 import java.awt.image.BufferedImage; 33 34 import com.sun.javafx.cursor.CursorFrame; 35 import com.sun.javafx.cursor.ImageCursorFrame; 36 37 import javafx.embed.swing.SwingFXUtils; 38 39 /** 40 * An utility class to translate cursor types between embedded 41 * application and Swing. 42 * 43 */ 44 public class SwingCursors { 45 46 private static Cursor createCustomCursor(ImageCursorFrame cursorFrame) { 47 Toolkit awtToolkit = Toolkit.getDefaultToolkit(); 48 49 double imageWidth = cursorFrame.getWidth(); 50 double imageHeight = cursorFrame.getHeight(); 51 Dimension nativeSize = awtToolkit.getBestCursorSize((int)imageWidth, (int)imageHeight); 52 53 double scaledHotspotX = cursorFrame.getHotspotX() * nativeSize.getWidth() / imageWidth; 54 double scaledHotspotY = cursorFrame.getHotspotY() * nativeSize.getHeight() / imageHeight; 55 Point hotspot = new Point((int)scaledHotspotX, (int)scaledHotspotY); 56 57 BufferedImage awtImage = SwingFXUtils.fromFXImage( 58 com.sun.javafx.tk.Toolkit.getImageAccessor().fromPlatformImage(cursorFrame.getPlatformImage()), null); 59 return awtToolkit.createCustomCursor(awtImage, hotspot, null); 60 } 61 62 public static Cursor embedCursorToCursor(CursorFrame cursorFrame) { 63 switch (cursorFrame.getCursorType()) { 64 case DEFAULT: 65 return Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR); 66 case CROSSHAIR: 67 return Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR); 68 case TEXT: 69 return Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR); 70 case WAIT: 71 return Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR); 72 case SW_RESIZE: 73 return Cursor.getPredefinedCursor(Cursor.SW_RESIZE_CURSOR); 74 case SE_RESIZE: 75 return Cursor.getPredefinedCursor(Cursor.SE_RESIZE_CURSOR); 76 case NW_RESIZE: 77 return Cursor.getPredefinedCursor(Cursor.NW_RESIZE_CURSOR); 78 case NE_RESIZE: 79 return Cursor.getPredefinedCursor(Cursor.NE_RESIZE_CURSOR); 80 case N_RESIZE: 81 case V_RESIZE: 82 return Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR); 83 case S_RESIZE: 84 return Cursor.getPredefinedCursor(Cursor.S_RESIZE_CURSOR); 85 case W_RESIZE: 86 case H_RESIZE: 87 return Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR); 88 case E_RESIZE: 89 return Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR); 90 case OPEN_HAND: 91 case CLOSED_HAND: 92 case HAND: 93 return Cursor.getPredefinedCursor(Cursor.HAND_CURSOR); 94 case MOVE: 95 return Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR); 96 // Not implemented, use default cursor instead 97 case DISAPPEAR: 98 return Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR); 99 case NONE: 100 return null; 101 case IMAGE: 102 return createCustomCursor((ImageCursorFrame) cursorFrame); 103 } 104 105 return Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR); 106 } 107 108 public static javafx.scene.Cursor embedCursorToCursor(Cursor cursor) { 109 if (cursor == null) { 110 return javafx.scene.Cursor.DEFAULT; 111 } 112 113 switch (cursor.getType()) { 114 case Cursor.DEFAULT_CURSOR: 115 return javafx.scene.Cursor.DEFAULT; 116 case Cursor.CROSSHAIR_CURSOR: 117 return javafx.scene.Cursor.CROSSHAIR; 118 case Cursor.E_RESIZE_CURSOR: 119 return javafx.scene.Cursor.E_RESIZE; 120 case Cursor.HAND_CURSOR: 121 return javafx.scene.Cursor.HAND; 122 case Cursor.MOVE_CURSOR: 123 return javafx.scene.Cursor.MOVE; 124 case Cursor.N_RESIZE_CURSOR: 125 return javafx.scene.Cursor.N_RESIZE; 126 case Cursor.NE_RESIZE_CURSOR: 127 return javafx.scene.Cursor.NE_RESIZE; 128 case Cursor.NW_RESIZE_CURSOR: 129 return javafx.scene.Cursor.NW_RESIZE; 130 case Cursor.S_RESIZE_CURSOR: 131 return javafx.scene.Cursor.S_RESIZE; 132 case Cursor.SE_RESIZE_CURSOR: 133 return javafx.scene.Cursor.SE_RESIZE; 134 case Cursor.SW_RESIZE_CURSOR: 135 return javafx.scene.Cursor.SW_RESIZE; 136 case Cursor.TEXT_CURSOR: 137 return javafx.scene.Cursor.TEXT; 138 case Cursor.W_RESIZE_CURSOR: 139 return javafx.scene.Cursor.W_RESIZE; 140 case Cursor.WAIT_CURSOR: 141 return javafx.scene.Cursor.WAIT; 142 default: 143 return javafx.scene.Cursor.DEFAULT; 144 } 145 } 146 }