Skip to content

Commit

Permalink
[Feature #11] Dynamic Border Anchors
Browse files Browse the repository at this point in the history
  • Loading branch information
alexejsailer committed Jun 4, 2017
1 parent 6d00a7b commit 77c5327
Show file tree
Hide file tree
Showing 15 changed files with 454 additions and 72 deletions.
214 changes: 173 additions & 41 deletions 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<Number>() {
public void changed(ObservableValue<? extends Number> ov, Number old_val, Number new_val) {
paper.setLayoutY(-new_val.doubleValue());
}
});

sc1.valueProperty().addListener(new ChangeListener<Number>() {
public void changed(ObservableValue<? extends Number> 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<ScrollEvent> onScrollEventHandler = new EventHandler<ScrollEvent>() {

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<MouseEvent> onMousePressedEventHandler = new EventHandler<MouseEvent>() {
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<MouseEvent> onMouseDraggedEventHandler = new EventHandler<MouseEvent>() {
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<ScrollEvent> getOnMouseScrollEventHandler() {
return onScrollEventHandler;
}

public EventHandler<MouseEvent> getOnMousePressedEventHandler() {
return onMousePressedEventHandler;
}

public EventHandler<MouseEvent> getOnMouseDraggedEventHandler() {
return onMouseDraggedEventHandler;
}

private EventHandler<MouseEvent> onMousePressedEventHandler = new EventHandler<MouseEvent>() {

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<MouseEvent> onMouseReleasedEventHandler = new EventHandler<MouseEvent>() {
};

private EventHandler<MouseEvent> onMouseDraggedEventHandler = new EventHandler<MouseEvent>() {
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;
}

}
}
1 change: 0 additions & 1 deletion src/main/java/com/dualexec/fxgraphs/SimpleGraph.java
Expand Up @@ -16,5 +16,4 @@ protected SimpleGraph(EdgeFactory<String, String> ef, boolean allowMultipleEdges
*/
private static final long serialVersionUID = 1L;


}
3 changes: 1 addition & 2 deletions src/main/java/com/dualexec/fxgraphs/TestJGraphT.java
Expand Up @@ -4,15 +4,14 @@

public class TestJGraphT {


public static void main(String[] args) {

Graph<String, String> test = new SimpleGraph(new StringEdgeFactory(), false, false);
test.addVertex("V1");
test.addVertex("V2");
String edge = test.addEdge("V1", "V2");
System.out.println(edge);

}

}
Expand Up @@ -9,8 +9,4 @@
*/
public abstract class AbstractEditView {





}
Expand Up @@ -14,5 +14,4 @@ public void setPlaceView(Place placeView) {
this.placeView = placeView;
}


}
10 changes: 5 additions & 5 deletions src/main/java/com/dualexec/fxgraphs/math/ArrowTransform.java
Expand Up @@ -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());
Expand All @@ -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)) {
Expand Down
23 changes: 23 additions & 0 deletions 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;
}

}

0 comments on commit 77c5327

Please sign in to comment.