private void removeListeners(VNode flowNode) { flowNode.titleProperty().removeListener(modelTitleListener); flowNode.xProperty().removeListener(modelXListener); flowNode.yProperty().removeListener(modelYListener); flowNode.widthProperty().removeListener(modelWidthListener); flowNode.heightProperty().removeListener(modelHeightListener); node.layoutXProperty().removeListener(nodeXListener); node.layoutYProperty().removeListener(nodeXListener); node.prefWidthProperty().removeListener(nodeWidthListener); node.prefHeightProperty().removeListener(nodeHeightListener); }
@Override public void remove() { removeSkinOnly = true; List<Connector> delList = new ArrayList<>(connectorList); for (Connector c : delList) { removeConnector(c); } if (node != null && node.getParent() != null) { NodeUtil.removeFromParent(node); } }
private double computeConnectorSize(double inset, int numConnectors) { double maxSize = 10; double connectorHeight = maxSize * 2; double originalConnectorHeight = connectorHeight; double gap = 5; double totalHeight = numConnectors * connectorHeight + (numConnectors - 1) * gap; connectorHeight = Math.min(totalHeight, node.getPrefHeight() - inset) / (numConnectors); connectorHeight = Math.min(connectorHeight, maxSize * 2); if (numConnectors == 1) { connectorHeight = originalConnectorHeight; } return connectorHeight; }
private void initListeners() { modelTitleListener = new ChangeListener<String>() { @Override public void changed(ObservableValue<? extends String> ov, String oldVal, String newVal) { node.setTitle(newVal); } }; modelXListener = new ChangeListener<Number>() { @Override public void changed(ObservableValue<? extends Number> ov, Number oldVal, Number newVal) { node.setLayoutX((double) newVal); } }; modelYListener = new ChangeListener<Number>() { @Override public void changed(ObservableValue<? extends Number> ov, Number oldVal, Number newVal) { node.setLayoutY((double) newVal); } }; modelWidthListener = new ChangeListener<Number>() { @Override public void changed(ObservableValue<? extends Number> ov, Number oldVal, Number newVal) { node.setPrefWidth((double) newVal); } }; modelHeightListener = new ChangeListener<Number>() { @Override public void changed(ObservableValue<? extends Number> ov, Number oldVal, Number newVal) { node.setPrefHeight((double) newVal); } }; nodeXListener = new ChangeListener<Number>() { @Override public void changed(ObservableValue<? extends Number> ov, Number oldVal, Number newVal) { getModel().setX((double) newVal); } }; nodeYListener = new ChangeListener<Number>() { @Override public void changed(ObservableValue<? extends Number> ov, Number oldVal, Number newVal) { getModel().setY((double) newVal); } }; nodeWidthListener = new ChangeListener<Number>() { @Override public void changed(ObservableValue<? extends Number> ov, Number oldVal, Number newVal) { getModel().setWidth((double) newVal); } }; nodeHeightListener = new ChangeListener<Number>() { @Override public void changed(ObservableValue<? extends Number> ov, Number oldVal, Number newVal) { getModel().setHeight((double) newVal); } }; node.onCloseActionProperty() .set( new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent t) { if (!removeSkinOnly) { modelProperty().get().getFlow().remove(modelProperty().get()); } } }); }
@Override public Parent getContentNode() { return node.getWorkflowContentPane(); }
private void addConnector(final Connector connector) { connectorList.add(connector); ConnectorCircle circle = new ConnectorCircle(controller, getSkinFactory(), connector, 20); // Color fillColor = skinFactory.getConnectionFillColor(connector.getType()); // Color strokeColor = skinFactory.getConnectionStrokeColor(connector.getType()); // // if (fillColor == null) { // fillColor = new Color(0.1, 0.1, 0.1, 0.5); // } // // if (strokeColor == null) { // strokeColor = new Color(120 / 255.0, 140 / 255.0, 1, 0.42); // } // // // circle.setFill(fillColor); // circle.setStroke(strokeColor); // // circle.setStrokeWidth(3); final Circle connectorNode = circle; connectors.put(connector.getId(), connectorNode); if (connector.isInput()) { inputList.add(connectorNode); } if (connector.isOutput()) { outputList.add(connectorNode); } DoubleBinding startXBinding = new DoubleBinding() { { super.bind(node.layoutXProperty(), node.widthProperty()); } @Override protected double computeValue() { double posX = node.getLayoutX(); if (connector.isOutput()) { posX += node.getWidth(); } return posX; } }; DoubleBinding startYBinding = new DoubleBinding() { { super.bind(node.layoutYProperty(), node.heightProperty()); } @Override protected double computeValue() { double connectorHeight = connectorNode.getRadius() * 2; double gap = 5; double numConnectors = inputList.size(); int connectorIndex = inputList.indexOf(connectorNode); if (connector.isOutput()) { numConnectors = outputList.size(); connectorIndex = outputList.indexOf(connectorNode); } double totalHeight = numConnectors * connectorHeight + (numConnectors - 1) * gap; double midPointOfNode = node.getLayoutY() + node.getHeight() / 2; double startY = midPointOfNode - totalHeight / 2; double y = startY + (connectorHeight + gap) * connectorIndex + (connectorHeight + gap) / 2; return y; } }; connectorNode.layoutXProperty().bind(startXBinding); connectorNode.layoutYProperty().bind(startYBinding); node.boundsInLocalProperty() .addListener( new ChangeListener<Bounds>() { @Override public void changed( ObservableValue<? extends Bounds> observable, Bounds oldValue, Bounds newValue) { computeInputConnectorSize(); computeOutputConnectorSize(); adjustConnectorSize(); } }); NodeUtil.addToParent(getParent(), connectorNode); connectorNode .onMouseEnteredProperty() .set( new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent t) { connectorNode.toFront(); } }); connectorNode .onMousePressedProperty() .set( new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent t) { // we are already connected and manipulate the existing connection // rather than creating a new one if (controller .getConnections(connector.getType()) .isInputConnected(connector.getId())) { return; } newConnectionSkin = new FXNewConnectionSkin( getSkinFactory(), getParent(), connector, getController(), connector.getType()); newConnectionSkin.add(); t.consume(); MouseEvent.fireEvent(newConnectionSkin.getReceiverConnector(), t); } }); connectorNode .onMouseDraggedProperty() .set( new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent t) { // we are already connected and manipulate the existing connection // rather than creating a new one if (controller .getConnections(connector.getType()) .isInputConnected(connector.getId())) { return; } t.consume(); MouseEvent.fireEvent(newConnectionSkin.getReceiverConnector(), t); } }); connectorNode .onMouseReleasedProperty() .set( new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent t) { // we are already connected and manipulate the existing connection // rather than creating a new one if (controller .getConnections(connector.getType()) .isInputConnected(connector.getId())) { return; } t.consume(); try { MouseEvent.fireEvent(newConnectionSkin.getReceiverConnector(), t); } catch (Exception ex) { // TODO exception is not critical here (node already removed) } } }); }
private void init() { node = new FlowNodeWindow(this); node.setTitle(getModel().getTitle()); node.setLayoutX(getModel().getX()); node.setLayoutY(getModel().getY()); node.setPrefWidth(getModel().getWidth()); node.setPrefHeight(getModel().getHeight()); registerListeners(getModel()); modelProperty.addListener( new ChangeListener<VNode>() { @Override public void changed(ObservableValue<? extends VNode> ov, VNode oldVal, VNode newVal) { removeListeners(oldVal); registerListeners(newVal); } }); for (Connector connector : getModel().getConnectors()) { addConnector(connector); } getModel() .getConnectors() .addListener( new ListChangeListener<Connector>() { @Override public void onChanged(ListChangeListener.Change<? extends Connector> change) { while (change.next()) { if (change.wasPermutated()) { for (int i = change.getFrom(); i < change.getTo(); ++i) { // permutate } } else if (change.wasUpdated()) { // update item } else if (change.wasRemoved()) { // removed for (Connector connector : change.getRemoved()) { removeConnector(connector); } } else if (change.wasAdded()) { // added for (Connector connector : change.getAddedSubList()) { addConnector(connector); } } } // end while change.next() } }); // skinFactory.connectionFillColorTypes().addListener(new MapChangeListener<String, // Color>() { // @Override // public void onChanged(MapChangeListener.Change<? extends String, ? extends Color> // change) { // if (change.wasAdded()) { // for (Connector connector : getModel().getConnectors()) { // // if (connector.getType().equals(change.getKey())) { // Shape cN = connectors.get(connector.getId()); // cN.setFill(change.getValueAdded()); // } // } // } // } // }); // // skinFactory.connectionStrokeColorTypes().addListener(new MapChangeListener<String, // Color>() { // @Override // public void onChanged(MapChangeListener.Change<? extends String, ? extends Color> // change) { // if (change.wasAdded()) { // for (Connector connector : getModel().getConnectors()) { // // if (connector.getType().equals(change.getKey())) { // Shape cN = connectors.get(connector.getId()); // cN.setStroke(change.getValueAdded()); // } // } // } // } // }); }