/**
   * @param states - List of geometric nodes (GElementFAState) for all nodes in the FA
   * @param scale - Vector2D of X scale and Y scale factors
   * @return The string that contains all of the node declarations and positioning information
   */
  private String nodesToLatex(List<GElementFAState> states, Vector2D scale) {

    List<String> latexNodes = new LinkedList<String>();

    int i = 0;
    for (GElementFAState a : states) {
      String latexOneNode = "";

      String name = a.getState().name;
      String id = "q" + i;
      i += 1;

      FAState state = a.getState();

      latexOneNode += "\\node";

      if (state.isAccepted() && state.isStart()) {
        latexOneNode += " [state, initial, accepting]";
      } else if (state.isStart()) {
        latexOneNode += " [state, initial]";
      } else if (state.isAccepted()) {
        latexOneNode += " [state, accepting]";
      } else {
        latexOneNode += " [state]";
      }

      int x_pos = (int) ((a.getPositionX() - this.left) / scale.getX());
      int y_pos = (int) ((a.getPositionY() - this.top) / scale.getY());
      y_pos *= -1;
      latexOneNode += " (" + id + ")";
      latexOneNode += " at (" + x_pos + "," + y_pos + ")";
      latexOneNode += " {" + name + "};";

      latexNodes.add(latexOneNode);
    }

    String s = "";
    for (String a : latexNodes) s += a + "\n";
    return s;
  }
 public GLink(
     GElement source,
     String sourceAnchorKey,
     GElement target,
     String targetAnchorKey,
     int shape,
     String pattern,
     Point mouse,
     double flateness) {
   this.source = source;
   this.target = target;
   this.sourceAnchorKey = sourceAnchorKey;
   this.targetAnchorKey = targetAnchorKey;
   this.shape = shape;
   this.pattern = pattern;
   initializeLink(flateness);
   setSourceTangentOffset(source.getDefaultAnchorOffset(sourceAnchorKey));
   setTargetTangentOffset(target.getDefaultAnchorOffset(targetAnchorKey));
   link.setDirection(Vector2D.vector(mouse).sub(target.getPosition()));
 }
 public void setMousePosition(Point mouse) {
   link.setDirection(Vector2D.vector(mouse).sub(target.getPosition()));
   link.setMousePosition(Vector2D.vector(mouse));
 }