/* * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. */ package test.javaclient.shared; import javafx.beans.property.Property; import javafx.event.EventHandler; import javafx.geometry.Orientation; import javafx.scene.Scene; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; import javafx.scene.input.MouseButton; import javafx.scene.input.MouseEvent; /** * * @author Alexander Kouznetsov */ public class DragSupport { private Number anchor; private double dragAnchor; private MouseEvent lastMouseEvent; public DragSupport(Scene target, final KeyCode modifier, final Orientation orientation, final Property property) { this(target, modifier, orientation, property, 1); } public DragSupport(Scene target, final KeyCode modifier, final Orientation orientation, final Property property, final double factor) { target.addEventHandler(MouseEvent.ANY, new EventHandler() { @Override public void handle(MouseEvent t) { lastMouseEvent = t; if (t.getEventType() == MouseEvent.MOUSE_PRESSED) { if (t.getButton() == MouseButton.PRIMARY && isModifierCorrect(t, modifier)) { anchor = property.getValue(); dragAnchor = getCoordinate(t, orientation); } } else if (t.getEventType() == MouseEvent.MOUSE_DRAGGED) { if (t.getButton() == MouseButton.PRIMARY && isModifierCorrect(t, modifier)) { property.setValue(anchor.doubleValue() + (getCoordinate(t, orientation) - dragAnchor) * factor); } } } }); target.addEventHandler(KeyEvent.ANY, new EventHandler() { @Override public void handle(KeyEvent t) { if (t.getEventType() == KeyEvent.KEY_PRESSED) { if (t.getCode() == modifier) { anchor = property.getValue(); dragAnchor = getCoordinate(lastMouseEvent, orientation); } } else if (t.getEventType() == KeyEvent.KEY_RELEASED) { if (t.getCode() != modifier && isModifierCorrect(t, modifier)) { anchor = property.getValue(); dragAnchor = getCoordinate(lastMouseEvent, orientation); } } } }); } private boolean isModifierCorrect(KeyEvent t, KeyCode keyCode) { return (keyCode != KeyCode.ALT ^ t.isAltDown()) && (keyCode != KeyCode.CONTROL ^ t.isControlDown()) && (keyCode != KeyCode.SHIFT ^ t.isShiftDown()) && (keyCode != KeyCode.META ^ t.isMetaDown()); } private boolean isModifierCorrect(MouseEvent t, KeyCode keyCode) { return (keyCode != KeyCode.ALT ^ t.isAltDown()) && (keyCode != KeyCode.CONTROL ^ t.isControlDown()) && (keyCode != KeyCode.SHIFT ^ t.isShiftDown()) && (keyCode != KeyCode.META ^ t.isMetaDown()); // if (keyCode == null) { // return !(t.isAltDown() || t.isControlDown() // || t.isShiftDown() || t.isMetaDown()); // } // switch (keyCode) { // case ALT: // return t.isAltDown(); // case CONTROL: // return t.isControlDown(); // case SHIFT: // return t.isShiftDown(); // case META: // return t.isMetaDown(); // default: // throw new IllegalArgumentException("This modifier is not supported: " + keyCode); // } } private double getCoordinate(MouseEvent t, Orientation orientation) { switch (orientation) { case HORIZONTAL: return t.getX(); case VERTICAL: return t.getY(); default: throw new IllegalArgumentException("This orientation is not supported: " + orientation); } } }