2016-06-23 21:31:27 -04:00
package cl.cromer.estructuras ;
import javafx.fxml.FXML ;
import javafx.fxml.Initializable ;
import javafx.scene.Scene ;
2016-06-26 23:34:33 -04:00
import javafx.scene.canvas.Canvas ;
2016-06-23 21:31:27 -04:00
import javafx.scene.control.ButtonBar ;
import javafx.scene.control.ButtonType ;
import javafx.scene.control.Dialog ;
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.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 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 ;
2016-06-26 23:34:33 -04:00
/ * *
* Donde poner el contenido de lista circular .
* /
@FXML private VBox contenidoListaCircular ;
2016-06-23 21:31:27 -04:00
/ * *
* 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 ;
2016-06-26 13:03:04 -04:00
/ * *
* La lista enlazada circular usado en la aplicaciĆ³n .
* /
private ListaEnlazadaCircular listaEnlazadaCircular ;
2016-06-25 14:14:17 -04:00
/ * *
* 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-26 13:03:04 -04:00
if ( listaEnlazadaTipos . getTipo ( ) ! = ListaEnlazadaTipos . CIRCULAR ) {
for ( listaEnlazada . size ( ) ; listaEnlazada . size ( ) < 5 ; ) {
int numero = random . nextInt ( rango ) + minimo ;
while ( listaEnlazada . buscar ( numero ) ! = null ) {
numero = random . nextInt ( rango ) + minimo ;
}
listaEnlazada . insertar ( numero ) ;
}
}
else {
for ( listaEnlazadaCircular . size ( ) ; listaEnlazadaCircular . size ( ) < 5 ; ) {
int numero = random . nextInt ( rango ) + minimo ;
while ( listaEnlazadaCircular . buscar ( numero ) ! = null ) {
numero = random . nextInt ( rango ) + minimo ;
}
listaEnlazadaCircular . insertar ( 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-26 13:03:04 -04:00
if ( listaEnlazadaTipos . getTipo ( ) ! = ListaEnlazadaTipos . CIRCULAR ) {
listaEnlazada = new ListaEnlazada ( ) ;
listaEnlazada . setTipo ( listaEnlazadaTipos . getTipo ( ) ) ;
}
else {
listaEnlazadaCircular = new ListaEnlazadaCircular ( ) ;
listaEnlazadaCircular . setTipo ( ListaEnlazadaTipos . SIMPLE ) ;
}
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 ( ) ;
}
2016-06-26 13:03:04 -04:00
/ * String tipo ;
2016-06-25 14:14:17 -04:00
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-26 13:03:04 -04:00
} * /
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-26 13:03:04 -04:00
if ( valorLista . getText ( ) ! = null & & ! valorLista . getText ( ) . trim ( ) . equals ( " " ) ) {
2016-06-23 21:31:27 -04:00
try {
2016-06-26 13:03:04 -04:00
boolean exito ;
if ( listaEnlazadaTipos . getTipo ( ) ! = ListaEnlazadaTipos . CIRCULAR ) {
exito = listaEnlazada . insertar ( Integer . valueOf ( valorLista . getText ( ) ) ) ;
}
else {
exito = listaEnlazadaCircular . insertar ( Integer . valueOf ( valorLista . getText ( ) ) ) ;
}
2016-06-23 21:31:27 -04:00
if ( exito ) {
2016-06-25 14:14:17 -04:00
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-26 13:03:04 -04:00
if ( valorLista . getText ( ) ! = null & & ! valorLista . getText ( ) . trim ( ) . equals ( " " ) ) {
boolean exito ;
if ( listaEnlazadaTipos . getTipo ( ) ! = ListaEnlazadaTipos . CIRCULAR ) {
exito = listaEnlazada . eliminar ( Integer . valueOf ( valorLista . getText ( ) ) ) ;
}
else {
exito = listaEnlazadaCircular . eliminar ( Integer . valueOf ( valorLista . getText ( ) ) ) ;
}
2016-06-23 21:31:27 -04:00
if ( exito ) {
2016-06-25 14:14:17 -04:00
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-26 13:03:04 -04:00
if ( valorLista . getText ( ) ! = null & & ! valorLista . getText ( ) . trim ( ) . equals ( " " ) ) {
Enlace enlace ;
if ( listaEnlazadaTipos . getTipo ( ) ! = ListaEnlazadaTipos . CIRCULAR ) {
enlace = listaEnlazada . buscar ( Integer . valueOf ( valorLista . getText ( ) ) ) ;
}
else {
enlace = listaEnlazadaCircular . buscar ( Integer . valueOf ( valorLista . getText ( ) ) ) ;
}
2016-06-25 14:14:17 -04:00
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
listaEnlazadaTipos = ( ListaEnlazadaTipos ) scene . getUserData ( ) ;
2016-06-26 13:03:04 -04:00
if ( listaEnlazadaTipos . getTipo ( ) ! = ListaEnlazadaTipos . CIRCULAR ) {
listaEnlazada = new ListaEnlazada ( ) ;
listaEnlazada . setTipo ( listaEnlazadaTipos . getTipo ( ) ) ;
}
else {
listaEnlazadaCircular = new ListaEnlazadaCircular ( ) ;
listaEnlazadaCircular . setTipo ( ListaEnlazadaTipos . SIMPLE ) ;
}
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 ( ) ;
2016-06-26 23:34:33 -04:00
contenidoListaCircular . getChildren ( ) . clear ( ) ;
2016-06-26 13:03:04 -04:00
if ( listaEnlazadaTipos . getTipo ( ) ! = ListaEnlazadaTipos . CIRCULAR ) {
for ( int i = 0 ; i < listaEnlazada . size ( ) ; i + + ) {
Enlace enlace = listaEnlazada . getIndice ( i ) ;
if ( listaEnlazada . getTipo ( ) = = ListaEnlazadaTipos . SIMPLE ) {
2016-06-26 23:34:33 -04:00
dibujarSimple ( enlace , false ) ;
2016-06-26 13:03:04 -04:00
}
else if ( listaEnlazada . getTipo ( ) = = ListaEnlazadaTipos . DOBLEMENTE_ENLAZADA ) {
if ( i ! = listaEnlazada . size ( ) - 1 ) {
2016-06-26 23:34:33 -04:00
dibujarDoble ( enlace , ( i = = 0 ) ) ;
2016-06-26 13:03:04 -04:00
}
else {
2016-06-26 23:34:33 -04:00
dibujarSimple ( enlace , false ) ;
2016-06-26 13:03:04 -04:00
}
}
colores . siguinteColor ( ) ;
}
2016-06-23 21:31:27 -04:00
}
2016-06-26 13:03:04 -04:00
else {
for ( int i = 0 ; i < listaEnlazadaCircular . size ( ) ; i + + ) {
Enlace enlace = listaEnlazadaCircular . getIndice ( i ) ;
2016-06-26 23:34:33 -04:00
dibujarSimple ( enlace , ( i = = listaEnlazadaCircular . size ( ) - 1 ) ) ;
2016-06-26 13:03:04 -04:00
colores . siguinteColor ( ) ;
}
2016-06-26 23:34:33 -04:00
if ( listaEnlazadaCircular . size ( ) > 0 ) {
contenidoListaCircular . getChildren ( ) . addAll ( Grafico . crearLineaCircular ( listaEnlazadaCircular . size ( ) ) ) ;
}
2016-06-26 13:03:04 -04:00
}
}
/ * *
* Dibujarlo con una flecha .
* @param enlace Object : El enlace que tiene la llave y valor .
* /
2016-06-26 23:34:33 -04:00
private void dibujarSimple ( Enlace enlace , boolean sinFlecha ) {
2016-06-26 13:03:04 -04:00
contenidoLista . getChildren ( ) . addAll (
2016-06-26 23:34:33 -04:00
Grafico . crearCaja ( colores , String . valueOf ( enlace . getLlave ( ) ) , String . valueOf ( enlace . getLlave ( ) ) )
2016-06-26 13:03:04 -04:00
) ;
2016-06-26 23:34:33 -04:00
if ( ! sinFlecha ) {
contenidoLista . getChildren ( ) . addAll (
Grafico . crearLineaVertical ( ) ,
Grafico . crearFlechaAbajo ( )
) ;
}
2016-06-26 13:03:04 -04:00
}
/ * *
* Dibujarlo con dos flechas .
* @param enlace El enlace que tiene la llave y valor .
* /
2016-06-26 23:34:33 -04:00
private void dibujarDoble ( Enlace enlace , boolean primer ) {
if ( primer ) {
contenidoLista . getChildren ( ) . addAll (
Grafico . crearFlechaArriba ( ) ,
Grafico . crearLineaVertical ( )
) ;
}
2016-06-26 13:03:04 -04:00
contenidoLista . getChildren ( ) . addAll (
Grafico . crearCaja ( colores , String . valueOf ( enlace . getLlave ( ) ) , String . valueOf ( enlace . getLlave ( ) ) ) ,
Grafico . crearFlechaArriba ( ) ,
Grafico . crearLineaVertical ( ) ,
Grafico . crearFlechaAbajo ( )
) ;
2016-06-23 21:31:27 -04:00
}
}