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