/**
* @file DockEvent.java
* @brief Class implementing a generic base for docking events.
*
* @section License
*
* This file is a part of the DockFX Library. Copyright (C) 2015 Robert B. Colton
*
* This program is free software: you can redistribute it and/or modify it under the terms
* of the GNU Lesser General Public License as published by the Free Software Foundation,
* either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program. If not, see <http://www.gnu.org/licenses/>.
**/
package org.dockfx;
import com.sun.javafx.scene.input.InputEventUtils;
import javafx.event.Event;
import javafx.event.EventTarget;
import javafx.event.EventType;
import javafx.geometry.Point3D;
import javafx.scene.Node;
import javafx.scene.input.PickResult;
/**
* Base class for DockFX events. Each DockFX event has associated an event source, event target and
* an event type. The event source specifies for an event handler the object on which that handler
* has been registered and which sent the event to it. The event target defines the path through
* which the event will travel when posted. The event type provides additional classification to
* events of the same {@code DockEvent} class. Like a {@link MouseEvent} the event will be
* associated with an x and y coordinate local to the node as well as to the screen.
*
* @since DockFX 0.1
*/
public class DockEvent extends Event {
/**
* Generated Serial Version UID
*/
private static final long serialVersionUID = 4413700316447127355L;
/**
* Common supertype for all dock event types.
*/
public static final EventType<DockEvent> ANY = new EventType<DockEvent>(Event.ANY, "DOCK");
/**
* This event occurs when a dock window is being dragged by its title bar and the mouse enters a
* node's bounds. Unlike a {@code DragEvent} the dock over event is handed to all stages that may
* be interested in receiving the dock pane.
*/
public static final EventType<DockEvent> DOCK_ENTER =
new EventType<DockEvent>(DockEvent.ANY, "DOCK_ENTER");
/**
* This event occurs when a dock window is being dragged by its title bar and the mouse is
* contained in a node's bounds. Unlike a {@code DragEvent} the dock over event is handed to all
* stages that may be interested in receiving the dock pane.
*/
public static final EventType<DockEvent> DOCK_OVER =
new EventType<DockEvent>(DockEvent.ANY, "DOCK_OVER");
/**
* This event occurs when a dock window is being dragged by its title bar and the mouse exits a
* node's bounds. Unlike a {@code DragEvent} the dock over event is handed to all stages that may
* be interested in receiving the dock pane.
*/
public static final EventType<DockEvent> DOCK_EXIT =
new EventType<DockEvent>(DockEvent.ANY, "DOCK_EXIT");
/**
* This event occurs when a dock window is being dragged by its title bar and the mouse is
* released over a node's bounds. Unlike a {@code DragEvent} the dock over event is handed to all
* stages that may be interested in receiving the dock pane.
*/
public static final EventType<DockEvent> DOCK_RELEASED =
new EventType<DockEvent>(DockEvent.ANY, "DOCK_RELEASED");
/**
* Horizontal x position of the event relative to the origin of the DockEvent's node.
*/
private transient double x;
/**
* Horizontal position of the event relative to the origin of the DockEvent's source.
*
* @return horizontal position of the event relative to the origin of the DockEvent's source.
*/
public final double getX() {
return x;
}
/**
* Vertical y position of the event relative to the origin of the DockEvent's node.
*/
private transient double y;
/**
* Vertical position of the event relative to the origin of the DockEvent's source.
*
* @return vertical position of the event relative to the origin of the DockEvent's source.
*/
public final double getY() {
return y;
}
/**
* Depth z position of the event relative to the origin of the DockEvent's node.
*/
private transient double z;
/**
* Depth position of the event relative to the origin of the DockEvent's source.
*
* @return depth position of the event relative to the origin of the DockEvent's source.
*/
public final double getZ() {
return z;
}
/**
* Absolute horizontal x position of the event.
*/
private final double screenX;
/**
* Returns absolute horizontal position of the event.
*
* @return absolute horizontal position of the event
*/
public final double getScreenX() {
return screenX;
}
/**
* Absolute vertical y position of the event.
*/
private final double screenY;
/**
* Returns absolute vertical position of the event.
*
* @return absolute vertical position of the event
*/
public final double getScreenY() {
return screenY;
}
/**
* Horizontal x position of the event relative to the origin of the {@code Scene} that contains
* the DockEvent's node. If the node is not in a {@code Scene}, then the value is relative to the
* boundsInParent of the root-most parent of the DockEvent's node.
*/
private final double sceneX;
/**
* Returns horizontal position of the event relative to the origin of the {@code Scene} that
* contains the DockEvent's source. If the node is not in a {@code Scene}, then the value is
* relative to the boundsInParent of the root-most parent of the DockEvent's node. Note that in 3D
* scene, this represents the flat coordinates after applying the projection transformations.
*
* @return horizontal position of the event relative to the origin of the {@code Scene} that
* contains the DockEvent's source
*/
public final double getSceneX() {
return sceneX;
}
/**
* Vertical y position of the event relative to the origin of the {@code Scene} that contains the
* DockEvent's node. If the node is not in a {@code Scene}, then the value is relative to the
* boundsInParent of the root-most parent of the DockEvent's node.
*/
private final double sceneY;
/**
* Returns vertical position of the event relative to the origin of the {@code Scene} that
* contains the DockEvent's source. If the node is not in a {@code Scene}, then the value is
* relative to the boundsInParent of the root-most parent of the DockEvent's node. Note that in 3D
* scene, this represents the flat coordinates after applying the projection transformations.
*
* @return vertical position of the event relative to the origin of the {@code Scene} that
* contains the DockEvent's source
*/
public final double getSceneY() {
return sceneY;
}
/**
* Information about the pick if the picked {@code Node} is a {@code Shape3D} node and its
* pickOnBounds is false.
*/
private PickResult pickResult;
/**
* Returns information about the pick.
*
* @return new PickResult object that contains information about the pick
*/
public final PickResult getPickResult() {
return pickResult;
}
/**
* Information about the pick if the picked {@code Node} is a {@code Shape3D} node and its
* pickOnBounds is false.
*/
private Node contents;
/**
* Returns the contents of the dock event, similar to the dragboard.
*
* @return Node that is currently being dragged during this event
*/
public final Node getContents() {
return contents;
}
/**
* Constructs new DockEvent event..
*
* @param eventType The type of the event.
* @param x The x with respect to the source. Should be in scene coordinates if source == null or
* source is not a Node.
* @param y The y with respect to the source. Should be in scene coordinates if source == null or
* source is not a Node.
* @param screenX The x coordinate relative to screen.
* @param screenY The y coordinate relative to screen.
* @param pickResult pick result. Can be null, in this case a 2D pick result without any further
* values is constructed based on the scene coordinates
*/
public DockEvent(EventType<? extends DockEvent> eventType, double x, double y, double screenX,
double screenY, PickResult pickResult) {
this(null, null, eventType, x, y, screenX, screenY, pickResult);
}
/**
* Constructs new DockEvent event..
*
* @param source the source of the event. Can be null.
* @param target the target of the event. Can be null.
* @param eventType The type of the event.
* @param x The x with respect to the source. Should be in scene coordinates if source == null or
* source is not a Node.
* @param y The y with respect to the source. Should be in scene coordinates if source == null or
* source is not a Node.
* @param screenX The x coordinate relative to screen.
* @param screenY The y coordinate relative to screen.
* @param pickResult pick result. Can be null, in this case a 2D pick result without any further
* values is constructed based on the scene coordinates
*/
public DockEvent(Object source, EventTarget target, EventType<? extends DockEvent> eventType,
double x, double y, double screenX, double screenY, PickResult pickResult) {
this(source, target, eventType, x, y, screenX, screenY, pickResult, null);
}
/**
* Constructs new DockEvent event..
*
* @param source the source of the event. Can be null.
* @param target the target of the event. Can be null.
* @param eventType The type of the event.
* @param x The x with respect to the source. Should be in scene coordinates if source == null or
* source is not a Node.
* @param y The y with respect to the source. Should be in scene coordinates if source == null or
* source is not a Node.
* @param screenX The x coordinate relative to screen.
* @param screenY The y coordinate relative to screen.
* @param pickResult pick result. Can be null, in this case a 2D pick result without any further
* values is constructed based on the scene coordinates
* @param contents The contents being dragged during this event.
*/
public DockEvent(Object source, EventTarget target, EventType<? extends DockEvent> eventType,
double x, double y, double screenX, double screenY, PickResult pickResult, Node contents) {
super(source, target, eventType);
this.x = x;
this.y = y;
this.screenX = screenX;
this.screenY = screenY;
this.sceneX = x;
this.sceneY = y;
this.pickResult = pickResult != null ? pickResult : new PickResult(target, x, y);
final Point3D p = InputEventUtils.recomputeCoordinates(this.pickResult, null);
this.x = p.getX();
this.y = p.getY();
this.z = p.getZ();
this.contents = contents;
}
}