From d69fa8746728367646494fd8c2c18944f306c6a2 Mon Sep 17 00:00:00 2001 From: Eduardo Pedroni Date: Mon, 9 Mar 2015 17:03:48 -0300 Subject: Added existing source code --- src/jcgp/gui/dragresize/HorizontalDragResize.java | 131 +++++++++++++++++++++ src/jcgp/gui/dragresize/VerticalDragResize.java | 132 ++++++++++++++++++++++ 2 files changed, 263 insertions(+) create mode 100644 src/jcgp/gui/dragresize/HorizontalDragResize.java create mode 100644 src/jcgp/gui/dragresize/VerticalDragResize.java (limited to 'src/jcgp/gui/dragresize') diff --git a/src/jcgp/gui/dragresize/HorizontalDragResize.java b/src/jcgp/gui/dragresize/HorizontalDragResize.java new file mode 100644 index 0000000..e88eafd --- /dev/null +++ b/src/jcgp/gui/dragresize/HorizontalDragResize.java @@ -0,0 +1,131 @@ +package jcgp.gui.dragresize; + +import javafx.event.EventHandler; +import javafx.scene.Cursor; +import javafx.scene.input.MouseEvent; +import javafx.scene.layout.Region; +import jcgp.gui.constants.Constants; + +/** + * This class adds horizontal drag resize functionality to any + * arbitrary region provided. This is done by using the static + * method {@code makeDragResizable()}. + *

+ * This is based on a class by Andrew Till found on: + * http://andrewtill.blogspot.co.uk/2012/12/dragging-to-resize-javafx-region.html + * + */ +public class HorizontalDragResize { + + private boolean dragging = false; + private final Region region; + + /** + * For internal use only, creates an instance of the actual + * resizer used. + * + * @param region the region to make resizable. + */ + private HorizontalDragResize(Region region) { + this.region = region; + } + + /** + * Makes the specified region drag resizable. + * This particular implementation only creates a resize + * click-and-drag area on the left side of the region. + * The resize area is defined by {@code GUI.RESIZE_MARGIN}. + * + * @param region the region to make resizable. + */ + public static void makeDragResizable(final Region region) { + // make the instance, this actually performs the resizing + final HorizontalDragResize dr = new HorizontalDragResize(region); + + // set mouse listeners + region.setOnMousePressed(new EventHandler() { + @Override + public void handle(MouseEvent event) { + dr.mousePressed(event); + } + }); + region.setOnMouseDragged(new EventHandler() { + @Override + public void handle(MouseEvent event) { + dr.mouseDragged(event); + } + }); + region.setOnMouseMoved(new EventHandler() { + @Override + public void handle(MouseEvent event) { + dr.mouseMoved(event); + } + }); + region.setOnMouseReleased(new EventHandler() { + @Override + public void handle(MouseEvent event) { + dr.mouseReleased(); + } + }); + + } + + /** + * If the press happened in the resize area, raise the drag flag. + * + * @param event the associated mouse event. + */ + private void mousePressed(MouseEvent event) { + if(isInDraggableZone(event)) { + dragging = true; + } + } + + /** + * If drag flag is high, resize the region to match the mouse position. + * + * @param event the associated mouse event. + */ + private void mouseDragged(MouseEvent event) { + if(dragging) { + double newWidth = region.getWidth() - event.getX(); + if (newWidth >= region.getMinWidth()) { + region.setPrefWidth(newWidth); + } else { + region.setPrefWidth(region.getMinWidth()); + } + } + } + + /** + * Change the cursor if the mouse position overlaps with the resize area. + * + * @param event the associated mouse event. + */ + private void mouseMoved(MouseEvent event) { + if(isInDraggableZone(event) || dragging) { + region.setCursor(Cursor.H_RESIZE); + } else { + region.setCursor(Cursor.DEFAULT); + } + } + + /** + * Finish resizing. + */ + private void mouseReleased() { + dragging = false; + region.setCursor(Cursor.DEFAULT); + } + + /** + * Assert whether the mouse cursor is in the draggable area defined by {@code GUI.RESIZE_MARGIN}. + * + * @param event the associated mouse event. + * @return true if the mouse position is in the draggable area. + */ + private boolean isInDraggableZone(MouseEvent event) { + return event.getX() < (Constants.RESIZE_MARGIN); + } + +} diff --git a/src/jcgp/gui/dragresize/VerticalDragResize.java b/src/jcgp/gui/dragresize/VerticalDragResize.java new file mode 100644 index 0000000..4f784e5 --- /dev/null +++ b/src/jcgp/gui/dragresize/VerticalDragResize.java @@ -0,0 +1,132 @@ +package jcgp.gui.dragresize; + +import javafx.event.EventHandler; +import javafx.scene.Cursor; +import javafx.scene.input.MouseEvent; +import javafx.scene.layout.Region; +import jcgp.gui.constants.Constants; + +/** + * This class adds vertical drag resize functionality to any + * arbitrary region provided. This is done by using the static + * method {@code makeDragResizable()}. + *

+ * This is based on a class by Andrew Till found on: + * http://andrewtill.blogspot.co.uk/2012/12/dragging-to-resize-javafx-region.html + * + */ +public class VerticalDragResize { + + private boolean dragging = false; + private final Region region; + + /** + * For internal use only, creates an instance of the actual + * resizer used. + * + * @param region the region to make resizable. + */ + private VerticalDragResize(Region region) { + this.region = region; + } + + /** + * Makes the specified region drag resizable. + * This particular implementation only creates a resize + * click-and-drag area on the top side of the region. + * The resize area is defined by {@code GUI.RESIZE_MARGIN}. + * + * @param region the region to make resizable. + */ + public static void makeDragResizable(final Region region) { + // make the instance, this actually performs the resizing + final VerticalDragResize dr = new VerticalDragResize(region); + + // set mouse listeners + region.setOnMousePressed(new EventHandler() { + @Override + public void handle(MouseEvent event) { + dr.mousePressed(event); + } + }); + region.setOnMouseDragged(new EventHandler() { + @Override + public void handle(MouseEvent event) { + dr.mouseDragged(event); + } + }); + region.setOnMouseMoved(new EventHandler() { + @Override + public void handle(MouseEvent event) { + dr.mouseMoved(event); + } + }); + region.setOnMouseReleased(new EventHandler() { + @Override + public void handle(MouseEvent event) { + dr.mouseReleased(); + } + }); + + } + + /** + * If the press happened in the resize area, raise the drag flag. + * + * @param event the associated mouse event. + */ + private void mousePressed(MouseEvent event) { + if(isInDraggableZone(event)) { + dragging = true; + } + } + + /** + * If drag flag is high, resize the region to match the mouse position. + * + * @param event the associated mouse event. + */ + private void mouseDragged(MouseEvent event) { + if(dragging) { + double newHeight = region.getHeight() - event.getY(); + if (newHeight >= region.getMinHeight()) { + region.setPrefHeight(newHeight); + } else { + region.setPrefHeight(region.getMinHeight()); + } + } + } + + /** + * Change the cursor if the mouse position overlaps with the resize area. + * + * @param event the associated mouse event. + */ + private void mouseMoved(MouseEvent event) { + if(isInDraggableZone(event) || dragging) { + region.setCursor(Cursor.V_RESIZE); + } + else { + region.setCursor(Cursor.DEFAULT); + } + } + + /** + * Finish resizing. + */ + private void mouseReleased() { + dragging = false; + region.setCursor(Cursor.DEFAULT); + } + + /** + * Assert whether the mouse cursor is in the draggable area defined by {@code GUI.RESIZE_MARGIN}. + * + * @param event the associated mouse event. + * @return true if the mouse position is in the draggable area. + */ + private boolean isInDraggableZone(MouseEvent event) { + return event.getY() < (Constants.RESIZE_MARGIN); + } + +} -- cgit v1.2.3