/*
* Copyright 2013 eWidgetFX.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.ewidgetfx.util;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.value.ObservableValue;
import javafx.event.EventHandler;
import javafx.geometry.Point2D;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
*
*
* @author Carl Dea <carl.dea@gmail.com>
* @since 1.0
*/
public final class DragStagePane extends Pane {
private Point2D anchorPt;
private Point2D previousLocation;
private Stage draggableStage;
private boolean dragging;
private final BooleanProperty filterEvents = new SimpleBooleanProperty(false);
protected EventHandler<MouseEvent> mouseEntered = e -> {
if (filterEvents.get()) {
e.consume();
}
};
protected EventHandler<MouseEvent> mouseExit = e -> {
if (filterEvents.get()) {
e.consume();
}
};
protected EventHandler<MouseEvent> mousePressed = e -> {
if (filterEvents.get()) {
e.consume();
}
anchorPt = new Point2D(e.getScreenX(), e.getScreenY());
};
protected EventHandler<MouseEvent> mouseClicked = e -> {
if (filterEvents.get()) {
e.consume();
}
};
protected EventHandler<MouseEvent> mouseDragged = e -> {
dragging = true;
if (filterEvents.get()) {
e.consume();
}
if (anchorPt != null && previousLocation != null) {
draggableStage.setX(previousLocation.getX() + e.getScreenX() - anchorPt.getX());
draggableStage.setY(previousLocation.getY() + e.getScreenY() - anchorPt.getY());
}
};
protected EventHandler<MouseEvent> mouseReleased = e -> {
dragging = false;
if (filterEvents.get()) {
e.consume();
}
previousLocation = new Point2D(draggableStage.getX(), draggableStage.getY());
};
protected static Map<Stage, Set<DragStagePane>> stageMapNodes = new HashMap<>();
public DragStagePane(Stage stage) {
draggableStage = stage;
this.filterEvents.setValue(false);
stage.xProperty().addListener((ObservableValue<? extends Number> observableValue, Number number, Number number2) -> {
if (!dragging) {
previousLocation = new Point2D(draggableStage.getX(), draggableStage.getY());
}
});
stage.yProperty().addListener((ObservableValue<? extends Number> observableValue, Number number, Number number2) -> {
if (!dragging) {
previousLocation = new Point2D(draggableStage.getX(), draggableStage.getY());
}
});
init();
}
public DragStagePane(Stage stage, boolean filterEvents) {
draggableStage = stage;
this.filterEvents.setValue(filterEvents);
init();
}
protected void init() {
// build filters to intercept mouse events.
if (filterEvents.get()) {
addAllFilterEvents();
} else {
addAllEvents();
}
// when the stage is shown initialize the previous location
// app developer will invoke the stage.show()
draggableStage.addEventHandler(WindowEvent.WINDOW_SHOWN, (e) -> {
previousLocation = new Point2D(draggableStage.getX(), draggableStage.getY());
});
//draggableStage.addEventFilter(WindowEvent.);
}
public void removeAllFilterEvents() {
removeEventFilter(MouseEvent.MOUSE_ENTERED, mouseEntered);
removeEventFilter(MouseEvent.MOUSE_PRESSED, mousePressed);
removeEventFilter(MouseEvent.MOUSE_CLICKED, mouseClicked);
removeEventFilter(MouseEvent.MOUSE_DRAGGED, mouseDragged);
removeEventFilter(MouseEvent.MOUSE_EXITED, mouseExit);
removeEventFilter(MouseEvent.MOUSE_RELEASED, mouseReleased);
}
public void removeAllEvents() {
removeEventHandler(MouseEvent.MOUSE_ENTERED, mouseEntered);
removeEventHandler(MouseEvent.MOUSE_PRESSED, mousePressed);
removeEventHandler(MouseEvent.MOUSE_CLICKED, mouseClicked);
removeEventHandler(MouseEvent.MOUSE_DRAGGED, mouseDragged);
removeEventHandler(MouseEvent.MOUSE_EXITED, mouseExit);
removeEventHandler(MouseEvent.MOUSE_RELEASED, mouseReleased);
}
public void addAllFilterEvents() {
// build filters to intercept mouse events
addEventFilter(MouseEvent.MOUSE_ENTERED, mouseEntered);
addEventFilter(MouseEvent.MOUSE_PRESSED, mousePressed);
addEventFilter(MouseEvent.MOUSE_CLICKED, mouseClicked);
addEventFilter(MouseEvent.MOUSE_DRAGGED, mouseDragged);
addEventFilter(MouseEvent.MOUSE_EXITED, mouseExit);
addEventFilter(MouseEvent.MOUSE_RELEASED, mouseReleased);
}
public void addAllEvents() {
// build filters to intercept mouse events
addEventHandler(MouseEvent.MOUSE_ENTERED, mouseEntered);
addEventHandler(MouseEvent.MOUSE_PRESSED, mousePressed);
addEventHandler(MouseEvent.MOUSE_CLICKED, mouseClicked);
addEventHandler(MouseEvent.MOUSE_DRAGGED, mouseDragged);
addEventHandler(MouseEvent.MOUSE_EXITED, mouseExit);
addEventHandler(MouseEvent.MOUSE_RELEASED, mouseReleased);
}
// public static void wrap(Node node, Stage stage) {
// new DragStagePane(node, stage);
// }
}