From 77c53274e5d271b52889b8b0ae3a0c7e84d84019 Mon Sep 17 00:00:00 2001 From: Alexej Sailer Date: Sun, 4 Jun 2017 13:47:34 +0200 Subject: [PATCH] [Feature #11] Dynamic Border Anchors --- src/main/java/com/dualexec/fxgraphs/Main.java | 214 ++++++++++++++---- .../com/dualexec/fxgraphs/SimpleGraph.java | 1 - .../com/dualexec/fxgraphs/TestJGraphT.java | 3 +- .../fxgraphs/editing/AbstractEditView.java | 4 - .../fxgraphs/editing/PlaceEditView.java | 1 - .../fxgraphs/math/ArrowTransform.java | 10 +- .../dualexec/fxgraphs/view/AnchorView.java | 23 ++ .../{ArrowView.java => CircleArrowView.java} | 14 +- .../fxgraphs/view/ConnectionView.java | 24 ++ .../fxgraphs/view/DynamicArrowView.java | 101 +++++++++ .../com/dualexec/fxgraphs/view/EdgeView.java | 15 +- .../com/dualexec/fxgraphs/view/Place.java | 18 +- .../com/dualexec/fxgraphs/view/PlaceView.java | 54 +++++ .../dualexec/fxgraphs/view/Transition.java | 32 +++ .../dualexec/fxgraphs/view/VertexView.java | 12 +- 15 files changed, 454 insertions(+), 72 deletions(-) create mode 100644 src/main/java/com/dualexec/fxgraphs/view/AnchorView.java rename src/main/java/com/dualexec/fxgraphs/view/{ArrowView.java => CircleArrowView.java} (84%) create mode 100644 src/main/java/com/dualexec/fxgraphs/view/ConnectionView.java create mode 100644 src/main/java/com/dualexec/fxgraphs/view/DynamicArrowView.java create mode 100644 src/main/java/com/dualexec/fxgraphs/view/PlaceView.java create mode 100644 src/main/java/com/dualexec/fxgraphs/view/Transition.java diff --git a/src/main/java/com/dualexec/fxgraphs/Main.java b/src/main/java/com/dualexec/fxgraphs/Main.java index a5d1844..60969b2 100644 --- a/src/main/java/com/dualexec/fxgraphs/Main.java +++ b/src/main/java/com/dualexec/fxgraphs/Main.java @@ -1,104 +1,236 @@ package com.dualexec.fxgraphs; - import com.dualexec.fxgraphs.editing.DiagramEditView; -import com.dualexec.fxgraphs.view.ArrowView; +import com.dualexec.fxgraphs.view.CircleArrowView; import com.dualexec.fxgraphs.view.EdgeView; import com.dualexec.fxgraphs.view.Place; import javafx.application.Application; +import javafx.beans.property.DoubleProperty; +import javafx.beans.property.SimpleDoubleProperty; +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; import javafx.event.EventHandler; +import javafx.geometry.Orientation; import javafx.scene.Group; import javafx.scene.Node; import javafx.scene.Scene; +import javafx.scene.control.ScrollBar; import javafx.scene.input.MouseEvent; +import javafx.scene.input.ScrollEvent; import javafx.scene.layout.Pane; import javafx.stage.Stage; public class Main extends Application { - static double x; - static double y; + private static final double MAX_SCALE = 10.0d; + private static final double MIN_SCALE = .1d; + + double mouseAnchorX; + double mouseAnchorY; + + double translateAnchorX; + double translateAnchorY; + + double paperHight = 20000; + double paperWidth = 20000; + + DoubleProperty myScale = new SimpleDoubleProperty(1.0); + + final ScrollBar sc = new ScrollBar(); + final ScrollBar sc1 = new ScrollBar(); + + private DiagramEditView diagramView; @Override public void start(Stage primaryStage) { - DiagramEditView editPart = new DiagramEditView(); + + Group root = new Group(); + + paper = new Pane(); + paper.setPrefSize(paperWidth, paperHight); + paper.setStyle("-fx-background-color: green;"); + + Scene scene = new Scene(root, 1024, 768); + diagramView = new DiagramEditView(); Place place0 = new Place(100, 100, 60); + place0.addEventFilter(MouseEvent.MOUSE_PRESSED, getOnMousePressedEventHandler()); + place0.addEventFilter(MouseEvent.MOUSE_DRAGGED, getOnMouseDraggedEventHandler()); Place place1 = new Place(250, 150, 60); + place1.addEventFilter(MouseEvent.MOUSE_PRESSED, getOnMousePressedEventHandler()); + place1.addEventFilter(MouseEvent.MOUSE_DRAGGED, getOnMouseDraggedEventHandler()); + EdgeView connectionView = new EdgeView(place0, place1); + diagramView.getDiagramView().getChildren().add(connectionView); - editPart.getDiagramView().getChildren().add(connectionView); + diagramView.getDiagramView().getChildren().add(place0); + diagramView.getDiagramView().getChildren().add(place1); - editPart.getDiagramView().getChildren().add(place0); - makeDraggable(place0); + CircleArrowView arrowView = new CircleArrowView(place0, place1); + diagramView.getDiagramView().getChildren().add(arrowView); - editPart.getDiagramView().getChildren().add(place1); - makeDraggable(place1); + sc.setLayoutX(scene.getWidth() - sc.getWidth()); + sc.setMin(0); + sc.setMax(10000); + sc.setOrientation(Orientation.VERTICAL); - ArrowView arrowView = new ArrowView(place0, place1); - editPart.getDiagramView().getChildren().add(arrowView); + sc1.setLayoutY(scene.getHeight() - sc1.getWidth() + 3); + sc1.setMin(0); + sc1.setMax(10000); + sc1.setOrientation(Orientation.HORIZONTAL); + + paper.getChildren().addAll(diagramView.getDiagramView()); + root.getChildren().addAll(paper, sc, sc1); + + scene.addEventFilter(ScrollEvent.ANY, getOnMouseScrollEventHandler()); - Pane root = new Pane(editPart.getDiagramView()); - Scene scene = new Scene(root, 400, 400); - scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); primaryStage.setScene(scene); + + sc.valueProperty().addListener(new ChangeListener() { + public void changed(ObservableValue ov, Number old_val, Number new_val) { + paper.setLayoutY(-new_val.doubleValue()); + } + }); + + sc1.valueProperty().addListener(new ChangeListener() { + public void changed(ObservableValue ov, Number old_val, Number new_val) { + paper.setLayoutX(-new_val.doubleValue()); + } + }); + primaryStage.show(); + } public static void main(String[] args) { launch(args); } - public static void makeDraggable(final Group group) { + private EventHandler onScrollEventHandler = new EventHandler() { - group.setOnMousePressed(onMousePressedEventHandler); - group.setOnMouseDragged(onMouseDraggedEventHandler); - group.setOnMouseReleased(onMouseReleasedEventHandler); + @Override + public void handle(ScrollEvent event) { - } + System.out.println("Scroll DelatY " + event.getDeltaY()); + double delta = 1.2; + double scale = getMyScale().doubleValue(); + double oldScale = scale; + if (event.getDeltaY() < 0) { + scale /= delta; + } else { + scale *= delta; + } - public static void makeDraggable(final Node node) { + scale = clamp(scale, MIN_SCALE, MAX_SCALE); - node.setOnMousePressed(onMousePressedEventHandler); - node.setOnMouseDragged(onMouseDraggedEventHandler); - node.setOnMouseReleased(onMouseReleasedEventHandler); + double f = (scale / oldScale) - 1; - } + getMyScale().set(scale); - static EventHandler onMousePressedEventHandler = new EventHandler() { + System.out.println("DV-B in Parent Width " + diagramView.getDiagramView().getBoundsInParent().getWidth()); + System.out.println("DV-B in Parent Height " + diagramView.getDiagramView().getBoundsInParent().getHeight()); + System.out.println("DV-B in Parent MinX " + diagramView.getDiagramView().getBoundsInParent().getMinX()); + System.out.println("DV-B in Parent MinY " + diagramView.getDiagramView().getBoundsInParent().getMinY()); - public void handle(MouseEvent event) { - Node node = (Node) event.getSource(); - x = node.getBoundsInParent().getMinX() - event.getScreenX(); - y = node.getBoundsInParent().getMinY() - event.getScreenY(); + System.out.println("DV-B in Local Width " + diagramView.getDiagramView().getBoundsInLocal().getWidth()); + System.out.println("DV-B in Local Height " + diagramView.getDiagramView().getBoundsInLocal().getHeight()); + System.out.println("DV-B in Local MinX " + diagramView.getDiagramView().getBoundsInLocal().getMinX()); + System.out.println("DV-B in Local MinY " + diagramView.getDiagramView().getBoundsInLocal().getMinY()); + + System.out.println("SceneX " + event.getSceneX()); + System.out.println("SceneY " + event.getSceneY()); + + double dx = (event.getSceneX() + - (paper.getBoundsInParent().getWidth() / 2 + paper.getBoundsInParent().getMinX())); + + System.out.println(diagramView.getDiagramView() + .localToScene(diagramView.getDiagramView().getBoundsInLocal()).getMinY()); + + double dy = (event.getSceneY() + - (paper.getBoundsInParent().getHeight() / 2 + paper.getBoundsInParent().getMinY())); + + paper.setScaleX(scale); + paper.setScaleY(scale); + + paper.setTranslateX(paper.getTranslateX() - f * dx); + paper.setTranslateY(paper.getTranslateY() - f * (dy)); + + event.consume(); } + }; - static EventHandler onMouseDraggedEventHandler = new EventHandler() { + public static double clamp(double value, double min, double max) { + + if (Double.compare(value, min) < 0) + return min; + + if (Double.compare(value, max) > 0) + return max; + + return value; + } + + public EventHandler getOnMouseScrollEventHandler() { + return onScrollEventHandler; + } + + public EventHandler getOnMousePressedEventHandler() { + return onMousePressedEventHandler; + } + + public EventHandler getOnMouseDraggedEventHandler() { + return onMouseDraggedEventHandler; + } + + private EventHandler onMousePressedEventHandler = new EventHandler() { public void handle(MouseEvent event) { - Node node = (Node) event.getSource(); + if (!event.isPrimaryButtonDown()) + return; - double offsetX = event.getScreenX() + x; - double offsetY = event.getScreenY() + y; + mouseAnchorX = event.getSceneX(); + mouseAnchorY = event.getSceneY(); - double scale = 1f; + Node node = (Node) event.getSource(); + + translateAnchorX = node.getTranslateX(); + translateAnchorY = node.getTranslateY(); - offsetX /= scale; - offsetY /= scale; + System.out.println("Node translateX " + node.getTranslateX()); + System.out.println("Node translateY " + node.getTranslateY()); - node.relocate(offsetX, offsetY); } - }; - static EventHandler onMouseReleasedEventHandler = new EventHandler() { + }; + private EventHandler onMouseDraggedEventHandler = new EventHandler() { public void handle(MouseEvent event) { + if (!event.isPrimaryButtonDown()) + return; + + double scale = getMyScale().doubleValue(); + + Node node = (Node) event.getSource(); + + node.setTranslateX(translateAnchorX + ((event.getSceneX() - mouseAnchorX) / scale)); + node.setTranslateY(translateAnchorY + ((event.getSceneY() - mouseAnchorY) / scale)); + + event.consume(); } }; + private Pane paper; + + public DoubleProperty getMyScale() { + return myScale; + } + + public void setMyScale(DoubleProperty myScale) { + this.myScale = myScale; + } -} \ No newline at end of file +} diff --git a/src/main/java/com/dualexec/fxgraphs/SimpleGraph.java b/src/main/java/com/dualexec/fxgraphs/SimpleGraph.java index 31399bd..3fa1de0 100644 --- a/src/main/java/com/dualexec/fxgraphs/SimpleGraph.java +++ b/src/main/java/com/dualexec/fxgraphs/SimpleGraph.java @@ -16,5 +16,4 @@ protected SimpleGraph(EdgeFactory ef, boolean allowMultipleEdges */ private static final long serialVersionUID = 1L; - } diff --git a/src/main/java/com/dualexec/fxgraphs/TestJGraphT.java b/src/main/java/com/dualexec/fxgraphs/TestJGraphT.java index 5c2fcb5..98849b7 100644 --- a/src/main/java/com/dualexec/fxgraphs/TestJGraphT.java +++ b/src/main/java/com/dualexec/fxgraphs/TestJGraphT.java @@ -4,7 +4,6 @@ public class TestJGraphT { - public static void main(String[] args) { Graph test = new SimpleGraph(new StringEdgeFactory(), false, false); @@ -12,7 +11,7 @@ public static void main(String[] args) { test.addVertex("V2"); String edge = test.addEdge("V1", "V2"); System.out.println(edge); - + } } diff --git a/src/main/java/com/dualexec/fxgraphs/editing/AbstractEditView.java b/src/main/java/com/dualexec/fxgraphs/editing/AbstractEditView.java index 2cc2814..9573d51 100644 --- a/src/main/java/com/dualexec/fxgraphs/editing/AbstractEditView.java +++ b/src/main/java/com/dualexec/fxgraphs/editing/AbstractEditView.java @@ -9,8 +9,4 @@ */ public abstract class AbstractEditView { - - - - } diff --git a/src/main/java/com/dualexec/fxgraphs/editing/PlaceEditView.java b/src/main/java/com/dualexec/fxgraphs/editing/PlaceEditView.java index a56268f..9fa04ef 100644 --- a/src/main/java/com/dualexec/fxgraphs/editing/PlaceEditView.java +++ b/src/main/java/com/dualexec/fxgraphs/editing/PlaceEditView.java @@ -14,5 +14,4 @@ public void setPlaceView(Place placeView) { this.placeView = placeView; } - } diff --git a/src/main/java/com/dualexec/fxgraphs/math/ArrowTransform.java b/src/main/java/com/dualexec/fxgraphs/math/ArrowTransform.java index 9b474d7..36985f5 100644 --- a/src/main/java/com/dualexec/fxgraphs/math/ArrowTransform.java +++ b/src/main/java/com/dualexec/fxgraphs/math/ArrowTransform.java @@ -19,12 +19,12 @@ public class ArrowTransform { private LineFunction lineFunction2; public ArrowTransform(DoubleProperty sourceX, DoubleProperty sourceY, DoubleProperty targetX, - DoubleProperty targetY) { - updateArrow(sourceX, sourceY, targetX, targetY); + DoubleProperty targetY, double distance) { + updateArrow(sourceX, sourceY, targetX, targetY, distance); } public void updateArrow(DoubleProperty sourceX, DoubleProperty sourceY, DoubleProperty targetX, - DoubleProperty targetY) { + DoubleProperty targetY, double distance) { Point2D p0 = new Point2D(sourceX.get(), sourceY.get()); Point2D p1 = new Point2D(targetX.get(), targetY.get()); @@ -43,8 +43,8 @@ public void updateArrow(DoubleProperty sourceX, DoubleProperty sourceY, DoublePr lineFunction1 = new LineFunction(p01, p11); lineFunction2 = new LineFunction(p02, p12); - double a = Math.cos(degree) * 60; - double a1 = Math.cos(degree) * 80; + double a = Math.cos(degree) * distance; + double a1 = Math.cos(degree) * (distance + 20); if (lineFunction.getM() >= 0 && (targetX.get() - sourceX.get()) > 0 || (lineFunction.getM() < 0 && (targetX.get() - sourceX.get()) > 0)) { diff --git a/src/main/java/com/dualexec/fxgraphs/view/AnchorView.java b/src/main/java/com/dualexec/fxgraphs/view/AnchorView.java new file mode 100644 index 0000000..607370e --- /dev/null +++ b/src/main/java/com/dualexec/fxgraphs/view/AnchorView.java @@ -0,0 +1,23 @@ +package com.dualexec.fxgraphs.view; + +import javafx.scene.Node; + +public class AnchorView { + + private Node anchor; + + public AnchorView(Node anchor) { + + this.anchor = anchor; + + } + + public Node getAnchor() { + return anchor; + } + + public void setAnchor(Node anchor) { + this.anchor = anchor; + } + +} diff --git a/src/main/java/com/dualexec/fxgraphs/view/ArrowView.java b/src/main/java/com/dualexec/fxgraphs/view/CircleArrowView.java similarity index 84% rename from src/main/java/com/dualexec/fxgraphs/view/ArrowView.java rename to src/main/java/com/dualexec/fxgraphs/view/CircleArrowView.java index e4ae74b..17ac250 100644 --- a/src/main/java/com/dualexec/fxgraphs/view/ArrowView.java +++ b/src/main/java/com/dualexec/fxgraphs/view/CircleArrowView.java @@ -10,7 +10,7 @@ import javafx.scene.Node; import javafx.scene.shape.Polygon; -public class ArrowView extends Group { +public class CircleArrowView extends Group { private DoubleProperty sourceX = new SimpleDoubleProperty(); private DoubleProperty sourceY = new SimpleDoubleProperty(); @@ -18,15 +18,15 @@ public class ArrowView extends Group { private DoubleProperty targetY = new SimpleDoubleProperty(); private ArrowTransform transform; - public ArrowView(VertexView source, VertexView target) { + public CircleArrowView(VertexView source, VertexView target) { Polygon polygon = new Polygon(); transformArrow(source, target, polygon); - source.layoutXProperty().addListener(getChangeListener(source, target, polygon)); - target.layoutXProperty().addListener(getChangeListener(source, target, polygon)); - source.layoutYProperty().addListener(getChangeListener(source, target, polygon)); - target.layoutYProperty().addListener(getChangeListener(source, target, polygon)); + source.translateXProperty().addListener(getChangeListener(source, target, polygon)); + target.translateXProperty().addListener(getChangeListener(source, target, polygon)); + source.translateYProperty().addListener(getChangeListener(source, target, polygon)); + target.translateYProperty().addListener(getChangeListener(source, target, polygon)); getChildren().add(polygon); } @@ -42,7 +42,7 @@ public void changed(ObservableValue observable, Number oldValu private void transformArrow(Node source, Node target, Polygon polygon) { updateNodePosition(source, target); - transform = new ArrowTransform(sourceX, sourceY, targetX, targetY); + transform = new ArrowTransform(sourceX, sourceY, targetX, targetY, 60d); if (polygon.getPoints().size() == 0) { polygon.getPoints() .addAll(new Double[] { transform.getArrow0X().get(), transform.getArrow0Y().get(), diff --git a/src/main/java/com/dualexec/fxgraphs/view/ConnectionView.java b/src/main/java/com/dualexec/fxgraphs/view/ConnectionView.java new file mode 100644 index 0000000..abd7bc9 --- /dev/null +++ b/src/main/java/com/dualexec/fxgraphs/view/ConnectionView.java @@ -0,0 +1,24 @@ +package com.dualexec.fxgraphs.view; + +import javafx.beans.property.SimpleDoubleProperty; +import javafx.scene.Node; +import javafx.scene.shape.Line; + +public class ConnectionView extends Line { + + public ConnectionView(Node source, Node target) { + setStartX(100); + setStartY(100); + setEndX(250); + setEndY(150); + SimpleDoubleProperty prop = new SimpleDoubleProperty(100); + SimpleDoubleProperty prop1 = new SimpleDoubleProperty(250); + SimpleDoubleProperty prop2 = new SimpleDoubleProperty(150); + startXProperty().bind(source.layoutXProperty().add(prop)); + startYProperty().bind(source.layoutYProperty().add(prop)); + endXProperty().bind(target.layoutXProperty().add(prop1)); + endYProperty().bind(target.layoutYProperty().add(prop2)); + setStrokeWidth(2); + } + +} diff --git a/src/main/java/com/dualexec/fxgraphs/view/DynamicArrowView.java b/src/main/java/com/dualexec/fxgraphs/view/DynamicArrowView.java new file mode 100644 index 0000000..7a00a81 --- /dev/null +++ b/src/main/java/com/dualexec/fxgraphs/view/DynamicArrowView.java @@ -0,0 +1,101 @@ +package com.dualexec.fxgraphs.view; + +import javafx.beans.property.DoubleProperty; +import javafx.beans.property.SimpleDoubleProperty; +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; +import javafx.geometry.Point2D; +import javafx.scene.Group; +import javafx.scene.Node; +import javafx.scene.paint.Color; +import javafx.scene.shape.Polygon; +import javafx.scene.shape.Shape; +import javafx.scene.transform.Rotate; +import javafx.scene.transform.Translate; + +public class DynamicArrowView extends Group { + + private DoubleProperty sourceX = new SimpleDoubleProperty(); + private DoubleProperty sourceY = new SimpleDoubleProperty(); + private DoubleProperty targetX = new SimpleDoubleProperty(); + private DoubleProperty targetY = new SimpleDoubleProperty(); + + private Translate trans1 = new Translate(); + private Translate trans2 = new Translate(); + private Rotate rot = new Rotate(); + + public DynamicArrowView(Shape source, Shape target) { + Polygon polygon = new Polygon(0, 0, 30, 0, 15, 15); + transformArrow(source, target, polygon); + + source.translateXProperty().addListener(getChangeListener(source, target, polygon)); + target.translateXProperty().addListener(getChangeListener(source, target, polygon)); + source.translateYProperty().addListener(getChangeListener(source, target, polygon)); + target.translateYProperty().addListener(getChangeListener(source, target, polygon)); + + polygon.getTransforms().addAll(trans1, rot, trans2); + trans2.setX(-15); + trans2.setY(-15); + polygon.setFill(Color.GRAY); + + getChildren().add(polygon); + } + + private ChangeListener getChangeListener(final Shape source, final Shape target, final Polygon polygon) { + return new ChangeListener() { + + public void changed(ObservableValue observable, Number oldValue, Number newValue) { + transformArrow(source, target, polygon); + } + }; + } + + private void transformArrow(Shape source, Shape target, Polygon polygon) { + updateNodePosition(source, target); + double disty = targetY.doubleValue() - sourceY.doubleValue(); + double distx = targetX.doubleValue() - sourceX.doubleValue(); + double teta = Math.atan2(disty, distx); + rot.setAngle(Math.toDegrees(teta) - 90); + Point2D a = new Point2D(sourceX.doubleValue(), sourceY.doubleValue()); + Point2D b = new Point2D(targetX.doubleValue(), targetY.doubleValue()); + Point2D i = findIntersectionPoint(a, b, target); + i = i.add(3 * Math.cos(teta), 3 * Math.sin(teta)); + trans1.setX(i.getX()); + trans1.setY(i.getY()); + } + + private void updateNodePosition(Shape source, Shape target) { + sourceX.set(source.getBoundsInParent().getMinX() + + ((source.getBoundsInParent().getMaxX() - source.getBoundsInParent().getMinX()) / 2)); + sourceY.set(source.getBoundsInParent().getMinY() + + ((source.getBoundsInParent().getMaxY() - source.getBoundsInParent().getMinY()) / 2)); + targetX.set(target.getBoundsInParent().getMinX() + + ((target.getBoundsInParent().getMaxX() - target.getBoundsInParent().getMinX()) / 2)); + targetY.set(target.getBoundsInParent().getMinY() + + ((target.getBoundsInParent().getMaxY() - target.getBoundsInParent().getMinY()) / 2)); + System.out.println(sourceX.doubleValue()); + System.out.println(sourceY.doubleValue()); + System.out.println(targetX.doubleValue()); + System.out.println(targetY.doubleValue()); + } + + private Point2D findIntersectionPoint(Point2D a, Point2D b, Shape target) { + Point2D middle = new Point2D((a.getX() + b.getX()) / 2, (a.getY() + b.getY()) / 2); + System.out.println(middle.getX() + " " + middle.getY()); + if (a.distance(b) < 1) { + System.out.println("A: " + a.getX() + " " + a.getY()); + System.out.println("B: " + b.getX() + " " + b.getY()); + System.out.println("Middle: " + middle.getX() + " " + middle.getY()); + return middle; + } + Point2D local = target.parentToLocal(middle); + System.out.println("contains2222 " + local.getX() + " " + local.getY()); + if (target.contains(local)) { + System.out.println("contains " + local.getX() + " " + local.getY()); + return findIntersectionPoint(a, middle, target); + } else { + return findIntersectionPoint(middle, b, target); + } + } + +} diff --git a/src/main/java/com/dualexec/fxgraphs/view/EdgeView.java b/src/main/java/com/dualexec/fxgraphs/view/EdgeView.java index af1328d..d35ad97 100644 --- a/src/main/java/com/dualexec/fxgraphs/view/EdgeView.java +++ b/src/main/java/com/dualexec/fxgraphs/view/EdgeView.java @@ -5,6 +5,7 @@ import javafx.beans.property.DoubleProperty; import javafx.beans.property.SimpleDoubleProperty; +import javafx.scene.paint.Color; import javafx.scene.shape.Line; public class EdgeView extends Line implements Edge { @@ -21,15 +22,12 @@ public EdgeView(VertexView source, VertexView target) { this.source = source; this.target = target; updateNodePosition(source, target); -// setStartX(sourceX.get()); -// setStartY(sourceY.get()); -// setEndX(targetX.get()); -// setEndY(targetY.get()); - startXProperty().bind(source.layoutXProperty().add(sourceX)); - startYProperty().bind(source.layoutYProperty().add(sourceY)); - endXProperty().bind(target.layoutXProperty().add(targetX)); - endYProperty().bind(target.layoutYProperty().add(targetY)); + startXProperty().bind(source.translateXProperty().add(sourceX)); + startYProperty().bind(source.translateYProperty().add(sourceY)); + endXProperty().bind(target.translateXProperty().add(targetX)); + endYProperty().bind(target.translateYProperty().add(targetY)); setStrokeWidth(2); + setStroke(Color.GRAY); } private void updateNodePosition(VertexView source, VertexView target) { @@ -53,5 +51,4 @@ public Vertex getTarget() { return target; } - } diff --git a/src/main/java/com/dualexec/fxgraphs/view/Place.java b/src/main/java/com/dualexec/fxgraphs/view/Place.java index 5450731..ada851f 100644 --- a/src/main/java/com/dualexec/fxgraphs/view/Place.java +++ b/src/main/java/com/dualexec/fxgraphs/view/Place.java @@ -9,11 +9,18 @@ public class Place extends VertexView { private Node anchor; + private Circle createOuterCircle; public Place(double centerX, double centerY, double radius) { -// getAnchors().add(createAnchor(centerX, centerY, radius)); + // getAnchors().add(createAnchor(centerX, centerY, radius)); getChildren().add(createBaseBackroundCircle(centerX, centerY, radius)); + + createOuterCircle = createOuterCircle(centerX, centerY, radius); + + getChildren().add(createOuterCircle); + getChildren().add(createOuterCircle(centerX, centerY, radius)); + getChildren().add(getInnerFillCircle(centerX, centerY, radius)); getChildren().add(createCenterDot(centerX, centerY, radius)); } @@ -57,7 +64,16 @@ private Circle createOuterCircle(double centerX, double centerY, double radius) outerCircle.setOpacity(0.4); outerCircle.setLayoutX(centerX); outerCircle.setLayoutY(centerY); + setConnectionBounderyNode(outerCircle); return outerCircle; } + public Circle getCreateOuterCircle() { + return createOuterCircle; + } + + public void setCreateOuterCircle(Circle createOuterCircle) { + this.createOuterCircle = createOuterCircle; + } + } diff --git a/src/main/java/com/dualexec/fxgraphs/view/PlaceView.java b/src/main/java/com/dualexec/fxgraphs/view/PlaceView.java new file mode 100644 index 0000000..6543890 --- /dev/null +++ b/src/main/java/com/dualexec/fxgraphs/view/PlaceView.java @@ -0,0 +1,54 @@ +package com.dualexec.fxgraphs.view; + +import javafx.scene.Group; +import javafx.scene.Node; +import javafx.scene.effect.Lighting; +import javafx.scene.paint.Color; +import javafx.scene.shape.Circle; +import javafx.scene.shape.StrokeType; + +public class PlaceView extends Group { + + private Node anchor; + + public PlaceView(double centerX, double centerY, double radius) { + + Circle circle = new Circle(radius + 30, Color.GRAY); + circle.setEffect(new Lighting()); + circle.setStroke(Color.BLACK); + circle.setStrokeWidth(2); + circle.setStrokeType(StrokeType.OUTSIDE); + circle.setOpacity(0.4); + circle.setLayoutX(centerX); + circle.setLayoutY(centerY); + + Circle circle1 = new Circle(radius + 25, Color.WHITE); + circle1.setLayoutX(centerX); + circle1.setLayoutY(centerY); + + Circle circle2 = new Circle(radius - 20, Color.BLACK); + circle2.setEffect(new Lighting()); + circle2.setOpacity(0.8); + circle2.setLayoutX(centerX); + circle2.setLayoutY(centerY); + + Circle anchor = new Circle(10, Color.BLACK); + anchor.setLayoutX(centerX); + anchor.setLayoutY(centerY); + + setAnchor(anchor); + getChildren().add(circle); + getChildren().add(circle1); + getChildren().add(circle2); + + } + + public Node getAnchor() { + return anchor; + } + + public void setAnchor(Node anchor) { + this.anchor = anchor; + } + +} diff --git a/src/main/java/com/dualexec/fxgraphs/view/Transition.java b/src/main/java/com/dualexec/fxgraphs/view/Transition.java new file mode 100644 index 0000000..8e2314d --- /dev/null +++ b/src/main/java/com/dualexec/fxgraphs/view/Transition.java @@ -0,0 +1,32 @@ +package com.dualexec.fxgraphs.view; + +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; +import javafx.scene.shape.Rectangle; + +public class Transition extends VertexView { + + public Transition(double x, double y, double height, double width) { + Rectangle r = new Rectangle(); + r.setX(x); + r.setY(y); + r.setWidth(width); + r.setHeight(height); + // r.setArcWidth(20); + // r.setArcHeight(20); + + // this.rotateProperty().set(90); + + this.layoutXProperty().addListener(new ChangeListener() { + + @Override + public void changed(ObservableValue observable, Number oldValue, Number newValue) { + System.out.println(Transition.this.layoutXProperty().doubleValue()); + } + + }); + + getChildren().add(r); + } + +} diff --git a/src/main/java/com/dualexec/fxgraphs/view/VertexView.java b/src/main/java/com/dualexec/fxgraphs/view/VertexView.java index fb40ad8..e74d8ca 100644 --- a/src/main/java/com/dualexec/fxgraphs/view/VertexView.java +++ b/src/main/java/com/dualexec/fxgraphs/view/VertexView.java @@ -8,15 +8,26 @@ import javafx.geometry.Point2D; import javafx.scene.Group; +import javafx.scene.Node; public abstract class VertexView extends Group implements Vertex { private List anchors = new LinkedList<>(); + private Node connectionBounderyNode; + public List getAnchors() { return anchors; } + public Node getConnectionBounderyNode() { + return connectionBounderyNode; + } + + public void setConnectionBounderyNode(Node connectionBounderyNode) { + this.connectionBounderyNode = connectionBounderyNode; + } + public void setAnchors(List anchors) { this.anchors = anchors; } @@ -27,5 +38,4 @@ public Point2D getPosition() { return null; } - }