/* * 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.geometry.Rectangle2D; import javafx.scene.input.MouseEvent; import javafx.scene.layout.Pane; import javafx.stage.Screen; 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; Screen screen = Screen.getPrimary(); Rectangle2D bounds = screen.getVisualBounds(); double originalHeight = 300; 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()); } /*System.out.println("draggableStage.getX() : " + draggableStage.getX()); System.out.println("previousLocation.getX() : " + previousLocation.getX()); System.out.println("e.getScreenX() : " + e.getScreenX()); System.out.println("e.getX() : " + e.getX()); System.out.println("anchorPt.getX() : " + anchorPt.getX()); System.out.println("bounds.getMinX() : " + bounds.getMinX()); System.out.println("bounds.getWidth() : " + bounds.getWidth()); System.out.println("bounds.getHeight() : " + bounds.getHeight());*/ if(draggableStage.getX() >= (bounds.getWidth() - 83)){ //setLayoutY(bounds.getHeight()); draggableStage.setHeight(bounds.getHeight()); //setLayoutY(bounds.getHeight()); //draggableStage.getScene().getRoot().getUserData(); System.out.println("draggableStage.getHeight() : " + draggableStage.getHeight()); System.out.println("originalHeight : " + draggableStage.getHeight()); } else{ draggableStage.setHeight(originalHeight); //setLayoutY(originalHeight); System.out.println("draggableStage.getScene().getHeight() NE : " + draggableStage.getScene().getHeight()); System.out.println("originalHeight NE : " + draggableStage.getHeight()); } }; 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); // } }