2016-06-23 21:31:27 -04:00
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 ;
2016-06-25 14:14:17 -04:00
import javafx.scene.layout.HBox ;
2016-06-23 21:31:27 -04:00
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 {
2016-06-25 14:14:17 -04:00
/ * *
* La caja para ingresar la llave .
* /
@FXML private TextFieldLimited llaveLista ;
2016-06-23 21:31:27 -04:00
/ * *
2016-06-25 14:14:17 -04:00
* La caja para ingresar el valor .
2016-06-23 21:31:27 -04:00
* /
@FXML private TextFieldLimited valorLista ;
/ * *
2016-06-25 14:14:17 -04:00
* Donde poner el contenido de lista .
2016-06-23 21:31:27 -04:00
* /
@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 ;
/ * *
2016-06-25 14:14:17 -04:00
* La lista enlazada usado en la aplicación .
* /
private ListaEnlazada listaEnlazada ;
/ * *
* Tipo de lista enlazada a trabajar .
2016-06-23 21:31:27 -04:00
* /
2016-06-25 14:14:17 -04:00
private ListaEnlazadaTipos listaEnlazadaTipos ;
2016-06-23 21:31:27 -04:00
/ * *
2016-06-25 14:14:17 -04:00
* Grafico rectangulos y lineas .
2016-06-23 21:31:27 -04:00
* /
private Grafico grafico ;
2016-06-25 14:14:17 -04:00
/ * *
* Colores por los dibjos .
* /
private Colores colores ;
2016-06-23 21:31:27 -04:00
/ * *
* 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 ;
}
/ * *
2016-06-25 14:14:17 -04:00
* Llenar la lista con numeros al azar .
2016-06-23 21:31:27 -04:00
* /
@FXML
protected void botonLlenar ( ) {
if ( scene = = null ) {
2016-06-25 14:14:17 -04:00
initializeLista ( ) ;
2016-06-23 21:31:27 -04:00
}
Random random = new Random ( ) ;
int maximo = 99 ;
int minimo = 0 ;
int rango = maximo - minimo + 1 ;
2016-06-25 14:14:17 -04:00
for ( int i = listaEnlazada . size ( ) ; listaEnlazada . size ( ) < 5 ; i + + ) {
2016-06-23 21:31:27 -04:00
int numero = random . nextInt ( rango ) + minimo ;
2016-06-25 14:14:17 -04:00
while ( listaEnlazada . buscar ( i ) ! = null ) {
i + + ;
2016-06-23 21:31:27 -04:00
}
2016-06-25 14:14:17 -04:00
listaEnlazada . insertar ( i , numero ) ;
2016-06-23 21:31:27 -04:00
}
generarGrafico ( ) ;
}
/ * *
2016-06-25 14:14:17 -04:00
* Vaciar la lista de todos los valores .
2016-06-23 21:31:27 -04:00
* /
@FXML
protected void botonVaciar ( ) {
if ( scene = = null ) {
2016-06-25 14:14:17 -04:00
initializeLista ( ) ;
2016-06-23 21:31:27 -04:00
}
2016-06-25 14:14:17 -04:00
listaEnlazada = new ListaEnlazada ( ) ;
2016-06-23 21:31:27 -04:00
generarGrafico ( ) ;
}
/ * *
2016-06-25 14:14:17 -04:00
* Insertar un valor a la lista y mostrar el codigo en la pantalla .
2016-06-23 21:31:27 -04:00
* /
@FXML
protected void botonInsertar ( ) {
if ( scene = = null ) {
2016-06-25 14:14:17 -04:00
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 " ;
2016-06-23 21:31:27 -04:00
}
// Mostrar el codigo
2016-06-25 14:14:17 -04:00
//String codigoTexto = new Scanner(getClass().getResourceAsStream("/cl/cromer/estructuras/code/listaEnlazada" + tipo + "/insertar")).useDelimiter("\\Z").next();
//codigoLista.setText(codigoTexto);
2016-06-23 21:31:27 -04:00
2016-06-25 14:14:17 -04:00
if ( llaveLista . getText ( ) ! = null & & ! llaveLista . getText ( ) . trim ( ) . equals ( " " ) & & valorLista . getText ( ) ! = null & & ! valorLista . getText ( ) . trim ( ) . equals ( " " ) ) {
2016-06-23 21:31:27 -04:00
try {
2016-06-25 14:14:17 -04:00
boolean exito = listaEnlazada . insertar ( Integer . valueOf ( llaveLista . getText ( ) ) , Integer . valueOf ( valorLista . getText ( ) ) ) ;
2016-06-23 21:31:27 -04:00
if ( exito ) {
2016-06-25 14:14:17 -04:00
llaveLista . setText ( " " ) ;
valorLista . setText ( " " ) ;
2016-06-23 21:31:27 -04:00
generarGrafico ( ) ;
}
else {
ButtonType botonCerrar = new ButtonType ( resourceBundle . getString ( " cerrar " ) , ButtonBar . ButtonData . OK_DONE ) ;
Dialog < String > dialog = new Dialog < > ( ) ;
dialog . setTitle ( resourceBundle . getString ( " error " ) ) ;
2016-06-25 14:14:17 -04:00
dialog . setContentText ( resourceBundle . getString ( " listaLlaveExiste " ) ) ;
2016-06-23 21:31:27 -04:00
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 ( ) ;
}
}
/ * *
2016-06-25 14:14:17 -04:00
* Eliminar un valor de la lista si existe y mostrar el codigo en la pantalla .
2016-06-23 21:31:27 -04:00
* /
@FXML
protected void botonEliminar ( ) {
if ( scene = = null ) {
2016-06-25 14:14:17 -04:00
initializeLista ( ) ;
2016-06-23 21:31:27 -04:00
}
// Mostrar el codigo
2016-06-25 14:14:17 -04:00
//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);
2016-06-23 21:31:27 -04:00
try {
2016-06-25 14:14:17 -04:00
if ( llaveLista . getText ( ) ! = null & & ! llaveLista . getText ( ) . trim ( ) . equals ( " " ) ) {
boolean exito = listaEnlazada . eliminar ( Integer . valueOf ( llaveLista . getText ( ) ) ) ;
2016-06-23 21:31:27 -04:00
if ( exito ) {
2016-06-25 14:14:17 -04:00
llaveLista . setText ( " " ) ;
valorLista . setText ( " " ) ;
2016-06-23 21:31:27 -04:00
generarGrafico ( ) ;
}
else {
errorNoEsta ( ) ;
}
}
else {
errorNoValor ( ) ;
}
}
catch ( NumberFormatException exception ) {
// El error no es fatal, sigue
Logs . log ( Level . WARNING , " No es tipo int. " ) ;
errorNoValor ( ) ;
}
}
/ * *
2016-06-25 14:14:17 -04:00
* Buscar si existe una llave en la lista y mostrar el codigo en la pantalla
* Si existe la llave destacarla .
2016-06-23 21:31:27 -04:00
* /
@FXML
protected void botonBuscar ( ) {
if ( scene = = null ) {
2016-06-25 14:14:17 -04:00
initializeLista ( ) ;
2016-06-23 21:31:27 -04:00
}
// Mostrar el codigo
2016-06-25 14:14:17 -04:00
//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);
2016-06-23 21:31:27 -04:00
try {
2016-06-25 14:14:17 -04:00
if ( llaveLista . getText ( ) ! = null & & ! llaveLista . getText ( ) . trim ( ) . equals ( " " ) ) {
ListaEnlazada . Enlace enlace = listaEnlazada . buscar ( Integer . valueOf ( llaveLista . getText ( ) ) ) ;
if ( enlace ! = null ) {
2016-06-23 21:31:27 -04:00
generarGrafico ( ) ;
grafico = new Grafico ( scene ) ;
2016-06-25 14:14:17 -04:00
grafico . destacer ( enlace . getLlave ( ) , Grafico . RECTANGULO ) ;
2016-06-23 21:31:27 -04:00
}
else {
errorNoEsta ( ) ;
}
}
else {
errorNoValor ( ) ;
}
}
catch ( NumberFormatException exception ) {
// El error no es fatal, sigue
Logs . log ( Level . WARNING , " No es tipo int. " ) ;
errorNoValor ( ) ;
}
}
/ * *
2016-06-25 14:14:17 -04:00
* Se muestra un error si la persona no ingresa un valor y una llave en los TextField .
2016-06-23 21:31:27 -04:00
* /
private void errorNoValor ( ) {
ButtonType botonCerrar = new ButtonType ( resourceBundle . getString ( " cerrar " ) , ButtonBar . ButtonData . OK_DONE ) ;
Dialog < String > dialog = new Dialog < > ( ) ;
dialog . setTitle ( resourceBundle . getString ( " error " ) ) ;
2016-06-25 14:14:17 -04:00
dialog . setContentText ( resourceBundle . getString ( " listaNoValor " ) ) ;
2016-06-23 21:31:27 -04:00
dialog . getDialogPane ( ) . getButtonTypes ( ) . add ( botonCerrar ) ;
dialog . show ( ) ;
}
/ * *
2016-06-25 14:14:17 -04:00
* Error cuando la llave no está en la lista .
2016-06-23 21:31:27 -04:00
* /
private void errorNoEsta ( ) {
ButtonType botonCerrar = new ButtonType ( resourceBundle . getString ( " cerrar " ) , ButtonBar . ButtonData . OK_DONE ) ;
Dialog < String > dialog = new Dialog < > ( ) ;
dialog . setTitle ( resourceBundle . getString ( " error " ) ) ;
2016-06-25 14:14:17 -04:00
dialog . setContentText ( resourceBundle . getString ( " listaNoEsta " ) ) ;
2016-06-23 21:31:27 -04:00
dialog . getDialogPane ( ) . getButtonTypes ( ) . add ( botonCerrar ) ;
dialog . show ( ) ;
}
/ * *
2016-06-25 14:14:17 -04:00
* Crear una lista vacia .
2016-06-23 21:31:27 -04:00
* /
2016-06-25 14:14:17 -04:00
private void initializeLista ( ) {
2016-06-23 21:31:27 -04:00
scene = contenidoLista . getScene ( ) ;
grafico = new Grafico ( scene ) ;
2016-06-25 14:14:17 -04:00
this . listaEnlazada = new ListaEnlazada ( ) ;
listaEnlazadaTipos = ( ListaEnlazadaTipos ) scene . getUserData ( ) ;
2016-06-23 21:31:27 -04:00
}
/ * *
* Poner los valores en el grafico .
* /
private void generarGrafico ( ) {
grafico . removerDestacar ( ) ;
2016-06-25 14:14:17 -04:00
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 ( ) ;
2016-06-23 21:31:27 -04:00
}
}
}