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