package cl.cromer.estructuras; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.Scene; import javafx.scene.control.ButtonBar; import javafx.scene.control.ButtonType; import javafx.scene.control.Dialog; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.scene.text.Text; import java.net.URL; import java.util.Random; import java.util.ResourceBundle; import java.util.Scanner; import java.util.logging.Level; /** * Esta clase es para controlar todos la interfaz de ListaEnlazada. * @author Chris Cromer */ public class ListaEnlazdaController implements Initializable { /** * La caja para ingresar la llave. */ @FXML private TextFieldLimited llaveLista; /** * La caja para ingresar el valor. */ @FXML private TextFieldLimited valorLista; /** * Donde poner el contenido de lista. */ @FXML private VBox contenidoLista; /** * Donde va el codigo a mostrar a la pantalla. */ @FXML private Text codigoLista; /** * La escena donde está cosas graficas. */ private Scene scene; /** * Donde está guardado los idiomas. */ private ResourceBundle resourceBundle; /** * La lista enlazada usado en la aplicación. */ private ListaEnlazada listaEnlazada; /** * Tipo de lista enlazada a trabajar. */ private ListaEnlazadaTipos listaEnlazadaTipos; /** * Grafico rectangulos y lineas. */ private Grafico grafico; /** * Colores por los dibjos. */ private Colores colores; /** * Inicializar todos los datos y dibujar las graficas. * @param location URL: El URL de fxml en uso. * @param resourceBundle ResourceBundle: Tiene datos de idioma. */ @Override public void initialize(URL location, ResourceBundle resourceBundle) { this.resourceBundle = resourceBundle; scene = null; } /** * Llenar la lista con numeros al azar. */ @FXML protected void botonLlenar() { if (scene == null) { initializeLista(); } Random random = new Random(); int maximo = 99; int minimo = 0; int rango = maximo - minimo + 1; for (int i = listaEnlazada.size(); listaEnlazada.size() < 5; i++) { int numero = random.nextInt(rango) + minimo; while (listaEnlazada.buscar(i) != null) { i++; } listaEnlazada.insertar(i, numero); } generarGrafico(); } /** * Vaciar la lista de todos los valores. */ @FXML protected void botonVaciar() { if (scene == null) { initializeLista(); } listaEnlazada = new ListaEnlazada(); generarGrafico(); } /** * Insertar un valor a la lista y mostrar el codigo en la pantalla. */ @FXML protected void botonInsertar() { if (scene == null) { initializeLista(); } String tipo; switch (listaEnlazadaTipos.getTipo()) { case ListaEnlazadaTipos.SIMPLE: tipo = "Simple"; break; case ListaEnlazadaTipos.CIRCULAR: tipo = "Circular"; break; case ListaEnlazadaTipos.DOBLEMENTE_ENLAZADA: tipo = "Doblemente"; break; default: tipo = "Simple"; } // Mostrar el codigo //String codigoTexto = new Scanner(getClass().getResourceAsStream("/cl/cromer/estructuras/code/listaEnlazada" + tipo + "/insertar")).useDelimiter("\\Z").next(); //codigoLista.setText(codigoTexto); if (llaveLista.getText() != null && !llaveLista.getText().trim().equals("") && valorLista.getText() != null && !valorLista.getText().trim().equals("")) { try { boolean exito = listaEnlazada.insertar(Integer.valueOf(llaveLista.getText()), Integer.valueOf(valorLista.getText())); if (exito) { llaveLista.setText(""); valorLista.setText(""); generarGrafico(); } else { ButtonType botonCerrar = new ButtonType(resourceBundle.getString("cerrar"), ButtonBar.ButtonData.OK_DONE); Dialog dialog = new Dialog<>(); dialog.setTitle(resourceBundle.getString("error")); dialog.setContentText(resourceBundle.getString("listaLlaveExiste")); dialog.getDialogPane().getButtonTypes().add(botonCerrar); dialog.show(); } } catch (NumberFormatException exception) { // El error no es fatal, sigue Logs.log(Level.WARNING, "No es tipo int."); errorNoValor(); } } else { errorNoValor(); } } /** * Eliminar un valor de la lista si existe y mostrar el codigo en la pantalla. */ @FXML protected void botonEliminar() { if (scene == null) { initializeLista(); } // Mostrar el codigo //String tipo = (array.isOrdered())?"Ordenado":"Simple"; //String codigoTexto = new Scanner(getClass().getResourceAsStream("/cl/cromer/estructuras/code/array" + tipo + "/eliminar")).useDelimiter("\\Z").next(); //codigoLista.setText(codigoTexto); try { if (llaveLista.getText() != null && !llaveLista.getText().trim().equals("")) { boolean exito = listaEnlazada.eliminar(Integer.valueOf(llaveLista.getText())); if (exito) { llaveLista.setText(""); valorLista.setText(""); generarGrafico(); } else { errorNoEsta(); } } else { errorNoValor(); } } catch (NumberFormatException exception) { // El error no es fatal, sigue Logs.log(Level.WARNING, "No es tipo int."); errorNoValor(); } } /** * Buscar si existe una llave en la lista y mostrar el codigo en la pantalla * Si existe la llave destacarla. */ @FXML protected void botonBuscar() { if (scene == null) { initializeLista(); } // Mostrar el codigo //String tipo = (array.isOrdered())?"Ordenado":"Simple"; //String codigoTexto = new Scanner(getClass().getResourceAsStream("/cl/cromer/estructuras/code/array" + tipo + "/buscar")).useDelimiter("\\Z").next(); //codigoLista.setText(codigoTexto); try { if (llaveLista.getText() != null && !llaveLista.getText().trim().equals("")) { ListaEnlazada.Enlace enlace = listaEnlazada.buscar(Integer.valueOf(llaveLista.getText())); if (enlace != null) { generarGrafico(); grafico = new Grafico(scene); grafico.destacer(enlace.getLlave(), Grafico.RECTANGULO); } else { errorNoEsta(); } } else { errorNoValor(); } } catch (NumberFormatException exception) { // El error no es fatal, sigue Logs.log(Level.WARNING, "No es tipo int."); errorNoValor(); } } /** * Se muestra un error si la persona no ingresa un valor y una llave en los TextField. */ private void errorNoValor() { ButtonType botonCerrar = new ButtonType(resourceBundle.getString("cerrar"), ButtonBar.ButtonData.OK_DONE); Dialog dialog = new Dialog<>(); dialog.setTitle(resourceBundle.getString("error")); dialog.setContentText(resourceBundle.getString("listaNoValor")); dialog.getDialogPane().getButtonTypes().add(botonCerrar); dialog.show(); } /** * Error cuando la llave no está en la lista. */ private void errorNoEsta() { ButtonType botonCerrar = new ButtonType(resourceBundle.getString("cerrar"), ButtonBar.ButtonData.OK_DONE); Dialog dialog = new Dialog<>(); dialog.setTitle(resourceBundle.getString("error")); dialog.setContentText(resourceBundle.getString("listaNoEsta")); dialog.getDialogPane().getButtonTypes().add(botonCerrar); dialog.show(); } /** * Crear una lista vacia. */ private void initializeLista() { scene = contenidoLista.getScene(); grafico = new Grafico(scene); this.listaEnlazada = new ListaEnlazada(); listaEnlazadaTipos = (ListaEnlazadaTipos) scene.getUserData(); } /** * Poner los valores en el grafico. */ private void generarGrafico() { grafico.removerDestacar(); colores = new Colores(); contenidoLista.getChildren().clear(); for (int i = 0; i < listaEnlazada.size(); i++) { ListaEnlazada.Enlace enlace = listaEnlazada.getIndice(i); contenidoLista.getChildren().addAll(Grafico.crearCaja(colores, String.valueOf(enlace.getLlave()), String.valueOf(enlace.getLlave()) + " | " + String.valueOf(enlace.getValor()), 50), Grafico.crearLineaVertical()); colores.siguinteColor(); } } }