/** Insertar un nodo en el grafoNoDirigido. */
  @FXML
  protected void botonInsertar() {
    if (scene == null) {
      initializeGrafo();
    }

    // Mostrar el codigo
    String tipo = getTipoString();
    String codigoTexto =
        new Scanner(
                getClass()
                    .getResourceAsStream(
                        "/cl/cromer/estructuras/code/grafo" + tipo + "/insertarNodo"))
            .useDelimiter("\\Z")
            .next();
    codigoGrafo.setText(codigoTexto);

    if (valorGrafo.getText() != null && !valorGrafo.getText().trim().equals("")) {
      try {
        int i;
        for (i = 0; i < 5; i++) {
          if (grafoNodos[i] == null) {
            grafoNodos[i] = new GrafoNodo(Integer.valueOf(valorGrafo.getText()));
            break;
          } else if (grafoNodos[i].getValue() == Integer.valueOf(valorGrafo.getText())) {
            Main.mostrarError(resourceBundle.getString("grafoNodoExiste"), resourceBundle);
            i = -1;
            break;
          }
        }

        if (i == 5) {
          // Maximo 5 nodos
          Main.mostrarError(resourceBundle.getString("grafoLleno"), resourceBundle);
        } else if (i != -1) {
          boolean exito;
          if (grafoTipos.getTipo() == Grafo.Tipos.NO_DIRIGIDO) {
            exito = noDirigido.addNode(grafoNodos[i]);
          } else {
            Grafo.Vertex<GrafoNodo> vertex =
                new Grafo.Vertex<>(String.valueOf(grafoNodos[i].getValue()));
            vertex.setData(grafoNodos[i]);
            exito = dirigido.addVertex(vertex);
          }
          if (exito) {
            valorGrafo.setText("");
            generarGrafico();
          } else {
            Main.mostrarError(resourceBundle.getString("grafoNodoExiste"), resourceBundle);
          }
        }
      } catch (NumberFormatException exception) {
        // El error no es fatal, sigue
        Main.mostrarError(resourceBundle.getString("grafoNoNumero"), resourceBundle);
      }
    } else {
      Main.mostrarError(resourceBundle.getString("grafoNoNumero"), resourceBundle);
    }
  }
  /** Eliminar un edge del grafoNoDirigido y mostrar el codigo en la pantalla. */
  @FXML
  protected void botonEliminarEdge() {
    if (scene == null) {
      initializeGrafo();
    }

    String tipo = getTipoString();
    String codigoTexto =
        new Scanner(
                getClass()
                    .getResourceAsStream(
                        "/cl/cromer/estructuras/code/grafo" + tipo + "/eliminarEdge"))
            .useDelimiter("\\Z")
            .next();
    codigoGrafo.setText(codigoTexto);

    if (valorNodo1.getText() != null
        && !valorNodo1.getText().trim().equals("")
        && valorNodo2.getText() != null
        && !valorNodo2.getText().trim().equals("")) {
      GrafoNodo[] nodos = getNodosEdge();

      if (grafoTipos.getTipo() == Grafo.Tipos.NO_DIRIGIDO) {
        if (nodos[0] == null
            || nodos[1] == null
            || !noDirigido.nodeExists(nodos[0])
            || !noDirigido.nodeExists(nodos[1])) {
          Main.mostrarError(resourceBundle.getString("grafoNoNodo"), resourceBundle);
        } else if (!noDirigido.edgeExists(nodos[0], nodos[1])) {
          Main.mostrarError(resourceBundle.getString("grafoNoEdge"), resourceBundle);
        } else {
          noDirigido.removeEdge(nodos[0], nodos[1]);
        }
      } else {
        if (nodos[0] == null
            || nodos[1] == null
            || dirigido.findVertexByName(String.valueOf(nodos[0].getValue())) == null
            || dirigido.findVertexByName(String.valueOf(nodos[1].getValue())) == null) {
          Main.mostrarError(resourceBundle.getString("grafoNoNodo"), resourceBundle);
        } else if (!edgeExists(nodos[0], nodos[1])) {
          Main.mostrarError(resourceBundle.getString("grafoNoEdge"), resourceBundle);
        } else {
          dirigido.removeEdge(
              dirigido.findVertexByName(String.valueOf(nodos[0].getValue())),
              dirigido.findVertexByName(String.valueOf(nodos[1].getValue())));
        }
      }
      valorNodo1.setText("");
      valorNodo2.setText("");
      if (grafoTipos.getTipo() == Grafo.Tipos.PESO) {
        valorPeso.setText("");
      }
    } else {
      Main.mostrarError(resourceBundle.getString("grafoNoEdge"), resourceBundle);
    }

    generarGrafico();
  }
  /** Eliminar un nodo del grafoNoDirigido. */
  @FXML
  protected void botonEliminar() {
    if (scene == null) {
      initializeGrafo();
    }

    // Mostrar el codigo
    String tipo = getTipoString();
    String codigoTexto =
        new Scanner(
                getClass()
                    .getResourceAsStream(
                        "/cl/cromer/estructuras/code/grafo" + tipo + "/eliminarNodo"))
            .useDelimiter("\\Z")
            .next();
    codigoGrafo.setText(codigoTexto);

    if (valorGrafo.getText() != null && !valorGrafo.getText().trim().equals("")) {
      try {
        int i;
        for (i = 0; i < 5; i++) {
          if (grafoNodos[i] != null
              && grafoNodos[i].getValue() == Integer.valueOf(valorGrafo.getText())) {
            break;
          }
        }

        if (i != 5) {
          boolean exito = false;
          if (grafoTipos.getTipo() == Grafo.Tipos.NO_DIRIGIDO) {
            exito = noDirigido.removeNode(grafoNodos[i]);
          } else {
            for (int j = 0; j < dirigido.size(); j++) {
              Grafo.Vertex<GrafoNodo> vertex = dirigido.getVertex(j);
              if (vertex.getData().getValue() == Integer.valueOf(valorGrafo.getText())) {
                exito = dirigido.removeVertex(vertex);
                break;
              }
            }
          }
          if (exito) {
            grafoNodos[i] = null;
            valorGrafo.setText("");
            generarGrafico();
          } else {
            Main.mostrarError(resourceBundle.getString("grafoNoNodo"), resourceBundle);
          }
        } else {
          Main.mostrarError(resourceBundle.getString("grafoNoNodo"), resourceBundle);
        }
      } catch (NumberFormatException exception) {
        // El error no es fatal, sigue
        Main.mostrarError(resourceBundle.getString("grafoNoNumero"), resourceBundle);
      }
    } else {
      Main.mostrarError(resourceBundle.getString("grafoNoNumero"), resourceBundle);
    }
  }
  /** Insertar un edge al grafoNoDirigido y mostrar el codigo en la pantalla. */
  @FXML
  protected void botonInsertarEdge() {
    if (scene == null) {
      initializeGrafo();
    }

    String tipo = getTipoString();
    String codigoTexto =
        new Scanner(
                getClass()
                    .getResourceAsStream(
                        "/cl/cromer/estructuras/code/grafo" + tipo + "/insertarEdge"))
            .useDelimiter("\\Z")
            .next();
    codigoGrafo.setText(codigoTexto);

    if (valorNodo1.getText() != null
        && !valorNodo1.getText().trim().equals("")
        && valorNodo2.getText() != null
        && !valorNodo2.getText().trim().equals("")) {
      GrafoNodo[] nodos = getNodosEdge();

      if (grafoTipos.getTipo() == Grafo.Tipos.NO_DIRIGIDO) {
        if (nodos[0] == null
            || nodos[1] == null
            || !noDirigido.nodeExists(nodos[0])
            || !noDirigido.nodeExists(nodos[1])) {
          Main.mostrarError(resourceBundle.getString("grafoNoNodo"), resourceBundle);
        } else if (noDirigido.edgeExists(nodos[0], nodos[1])) {
          Main.mostrarError(resourceBundle.getString("grafoEdgeExiste"), resourceBundle);
        } else {
          noDirigido.addEdge(nodos[0], nodos[1]);
        }
      } else {
        if (nodos[0] == null
            || nodos[1] == null
            || dirigido.findVertexByName(String.valueOf(nodos[0].getValue())) == null
            || dirigido.findVertexByName(String.valueOf(nodos[1].getValue())) == null) {
          Main.mostrarError(resourceBundle.getString("grafoNoNodo"), resourceBundle);
        } else if (edgeExists(nodos[0], nodos[1])) {
          Main.mostrarError(resourceBundle.getString("grafoEdgeExiste"), resourceBundle);
        } else {
          int peso = PESO_PREDETERMINADO;
          if (grafoTipos.getTipo() == Grafo.Tipos.PESO
              && valorPeso.getText() != null
              && !valorPeso.getText().trim().equals("")) {
            try {
              peso = Integer.valueOf(valorPeso.getText());
            } catch (NumberFormatException exception) {
              peso = PESO_PREDETERMINADO;
            }
          }
          dirigido.addEdge(
              dirigido.findVertexByName(String.valueOf(nodos[0].getValue())),
              dirigido.findVertexByName(String.valueOf(nodos[1].getValue())),
              peso);
        }
      }
      valorNodo1.setText("");
      valorNodo2.setText("");
      if (grafoTipos.getTipo() == Grafo.Tipos.PESO) {
        valorPeso.setText("");
      }
    } else {
      Main.mostrarError(resourceBundle.getString("grafoNoNumero"), resourceBundle);
    }

    generarGrafico();
  }