2017-07-07 00:39:13 -04:00
|
|
|
/* Copyright (c) 2017 Christopher Cromer
|
|
|
|
* Copyright (c) 2017 Carlos Faúndez
|
|
|
|
*
|
|
|
|
* This file is part of mt. It is subject to the license terms in the LICENSE file found in the top-level directory of this distribution.
|
|
|
|
* This file may not be copied, modified, propagated, or distributed except according to the terms contained in the LICENSE file.
|
|
|
|
*/
|
|
|
|
|
|
|
|
package cl.cromer.mt;
|
|
|
|
|
|
|
|
import javafx.fxml.FXML;
|
|
|
|
import javafx.scene.Scene;
|
|
|
|
import javafx.scene.control.Button;
|
|
|
|
import javafx.scene.control.TextField;
|
|
|
|
import javafx.scene.layout.HBox;
|
|
|
|
import javafx.scene.layout.StackPane;
|
|
|
|
import javafx.scene.layout.VBox;
|
|
|
|
import javafx.scene.paint.Color;
|
|
|
|
import javafx.scene.shape.Rectangle;
|
|
|
|
import javafx.scene.text.Text;
|
|
|
|
import javafx.stage.Stage;
|
|
|
|
|
2017-07-07 03:05:01 -04:00
|
|
|
/**
|
|
|
|
* Controlar las acciones de reconocimiento individual
|
|
|
|
*/
|
2017-07-07 00:39:13 -04:00
|
|
|
public class IndividualController extends VBox {
|
2017-07-07 02:49:18 -04:00
|
|
|
/**
|
|
|
|
* El contenido de la venta
|
|
|
|
*/
|
2017-07-07 00:39:13 -04:00
|
|
|
@FXML
|
|
|
|
private VBox contenido;
|
|
|
|
|
2017-07-07 02:49:18 -04:00
|
|
|
/**
|
|
|
|
* La cadena que ingresa el usuario
|
|
|
|
*/
|
2017-07-07 00:39:13 -04:00
|
|
|
@FXML
|
|
|
|
private TextField cadena;
|
|
|
|
|
2017-07-07 02:49:18 -04:00
|
|
|
/**
|
|
|
|
* La cinta en la pantalla
|
|
|
|
*/
|
2017-07-07 00:39:13 -04:00
|
|
|
@FXML
|
|
|
|
private HBox cinta;
|
|
|
|
|
2017-07-07 02:49:18 -04:00
|
|
|
/**
|
|
|
|
* El boton de acapter cadena
|
|
|
|
*/
|
2017-07-07 00:39:13 -04:00
|
|
|
@FXML
|
|
|
|
private Button aceptar;
|
|
|
|
|
2017-07-07 02:49:18 -04:00
|
|
|
/**
|
|
|
|
* El boton que corre paso a paso
|
|
|
|
*/
|
2017-07-07 00:39:13 -04:00
|
|
|
@FXML
|
|
|
|
private Button paso;
|
|
|
|
|
2017-07-07 02:49:18 -04:00
|
|
|
/**
|
2017-07-07 11:25:44 -04:00
|
|
|
* La descripcion de que hace la maquina
|
2017-07-07 02:49:18 -04:00
|
|
|
*/
|
2017-07-07 00:39:13 -04:00
|
|
|
@FXML
|
2017-07-07 11:25:44 -04:00
|
|
|
private Text descripcion;
|
2017-07-07 00:39:13 -04:00
|
|
|
|
2017-07-07 02:49:18 -04:00
|
|
|
/**
|
|
|
|
* La cadena acapatada por el usario
|
|
|
|
*/
|
2017-07-07 00:39:13 -04:00
|
|
|
private String cadenaAceptada;
|
|
|
|
|
2017-07-07 02:49:18 -04:00
|
|
|
/**
|
|
|
|
* Los estados finales que viene de la ventana anterior
|
|
|
|
*/
|
2017-07-07 00:39:13 -04:00
|
|
|
private EstadosFinales estadosFinales;
|
|
|
|
|
2017-07-07 02:49:18 -04:00
|
|
|
/**
|
|
|
|
* La maquina turning pasado para correr
|
|
|
|
*/
|
2017-07-07 00:39:13 -04:00
|
|
|
private Maquina maquina;
|
|
|
|
|
2017-07-07 02:49:18 -04:00
|
|
|
/**
|
|
|
|
* Donde estaba el cabezal anteriormente
|
|
|
|
*/
|
2017-07-07 00:39:13 -04:00
|
|
|
private int cabezalAnterior;
|
|
|
|
|
2017-07-07 02:49:18 -04:00
|
|
|
/**
|
|
|
|
* La cantidad de cajas que está en la pantalla
|
|
|
|
*/
|
2017-07-07 00:39:13 -04:00
|
|
|
private int cajas;
|
|
|
|
|
2017-07-07 02:49:18 -04:00
|
|
|
/**
|
|
|
|
* El numero qx del estado anterior
|
|
|
|
*/
|
2017-07-07 11:25:44 -04:00
|
|
|
private int estadoPrevio;
|
2017-07-07 00:39:13 -04:00
|
|
|
|
2017-07-07 02:49:18 -04:00
|
|
|
/**
|
|
|
|
* El simbolo que lee antes que la maquina escribe
|
|
|
|
*/
|
2017-07-07 00:39:13 -04:00
|
|
|
private char simboloAnterior;
|
|
|
|
|
2017-07-07 11:25:44 -04:00
|
|
|
/**
|
|
|
|
* Si debe mover o si debe mostrar lo que lee y escribe
|
|
|
|
*/
|
|
|
|
private boolean mover;
|
|
|
|
|
2017-07-07 00:39:13 -04:00
|
|
|
/**
|
|
|
|
* Este metodo se crea una caja para poner un simbolo de la cinta
|
|
|
|
*
|
|
|
|
* @param label El label para encontrar la caja despues
|
|
|
|
* @param texto El simbolo de la cinta
|
|
|
|
*
|
|
|
|
* @return Retorna un StackPane que contiene la caja
|
|
|
|
*/
|
|
|
|
private static StackPane crearCaja(String label, String texto) {
|
|
|
|
Rectangle rectangle = new Rectangle();
|
|
|
|
rectangle.setHeight(20);
|
|
|
|
rectangle.setWidth(20);
|
|
|
|
rectangle.setFill(Color.WHITE);
|
|
|
|
rectangle.setStroke(Color.BLACK);
|
|
|
|
rectangle.setId("caja_" + label);
|
|
|
|
Text text = new Text();
|
|
|
|
text.setId("simbolo_" + label);
|
|
|
|
text.setStroke(Color.BLACK);
|
|
|
|
text.setText(texto);
|
|
|
|
|
|
|
|
StackPane stackPane = new StackPane();
|
|
|
|
stackPane.getChildren().addAll(rectangle, text);
|
|
|
|
return stackPane;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Boton de aceptar cadena
|
|
|
|
*/
|
|
|
|
@FXML
|
|
|
|
protected void aceptarCadena() {
|
|
|
|
Scene scene = contenido.getScene();
|
|
|
|
estadosFinales = (EstadosFinales) scene.getUserData();
|
|
|
|
maquina = estadosFinales.getMaquina();
|
2017-07-07 11:25:44 -04:00
|
|
|
maquina.reset();
|
2017-07-07 00:39:13 -04:00
|
|
|
cadenaAceptada = cadena.getText();
|
|
|
|
StringBuilder temp = new StringBuilder(cadenaAceptada);
|
|
|
|
temp.insert(0, "#");
|
|
|
|
temp.insert(cadenaAceptada.length() + 1, "#");
|
|
|
|
cadenaAceptada = temp.toString();
|
2017-07-07 02:58:24 -04:00
|
|
|
cinta.getChildren().clear();
|
2017-07-07 00:39:13 -04:00
|
|
|
for (int i = 0; i < cadenaAceptada.length(); i++) {
|
|
|
|
cinta.getChildren().add(crearCaja(String.valueOf(i), String.valueOf(cadenaAceptada.charAt(i))));
|
|
|
|
cajas = i + 1;
|
|
|
|
}
|
|
|
|
Rectangle rectangle = (Rectangle) scene.lookup("#caja_1");
|
|
|
|
rectangle.setFill(Color.BLUE);
|
|
|
|
Text simbolo = (Text) scene.lookup("#simbolo_1");
|
|
|
|
simbolo.setStroke(Color.WHITE);
|
2017-07-07 02:58:24 -04:00
|
|
|
|
2017-07-07 00:39:13 -04:00
|
|
|
cadena.setText("");
|
|
|
|
cadena.setDisable(true);
|
|
|
|
aceptar.setDisable(true);
|
|
|
|
paso.setDisable(false);
|
|
|
|
cabezalAnterior = 1;
|
2017-07-07 11:25:44 -04:00
|
|
|
estadoPrevio = 0;
|
|
|
|
mover = false;
|
|
|
|
simboloAnterior = '\0';
|
2017-07-07 00:39:13 -04:00
|
|
|
|
2017-07-07 11:25:44 -04:00
|
|
|
descripcion.setText("Inicio en estado: q" + maquina.getEstadoActual().getQ());
|
2017-07-07 00:39:13 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Boton de cerrar
|
|
|
|
*/
|
|
|
|
@FXML
|
|
|
|
protected void paso() {
|
|
|
|
Scene scene = contenido.getScene();
|
|
|
|
|
2017-07-07 11:25:44 -04:00
|
|
|
int resultado = 0;
|
|
|
|
if (!mover) {
|
|
|
|
resultado = maquina.comprobarCadenaS2S(new StringBuilder(cadenaAceptada), estadosFinales.getEstadosElegidos().stream().mapToInt(i -> i).toArray());
|
|
|
|
}
|
2017-07-07 00:39:13 -04:00
|
|
|
|
|
|
|
if (resultado == 1) {
|
|
|
|
MT.mostrarMensaje("Resultado", "La cadena fue aceptada!");
|
|
|
|
cadena.setDisable(false);
|
|
|
|
aceptar.setDisable(false);
|
|
|
|
paso.setDisable(true);
|
|
|
|
maquina.reset();
|
|
|
|
}
|
|
|
|
else if (resultado == -1) {
|
|
|
|
MT.mostrarMensaje("Resultado", "La cadena fue rechazada!");
|
|
|
|
cadena.setDisable(false);
|
|
|
|
aceptar.setDisable(false);
|
|
|
|
paso.setDisable(true);
|
|
|
|
maquina.reset();
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
if (maquina.getCintaAnterior().length() > cajas) {
|
|
|
|
for (int i = cajas; i < maquina.getCintaAnterior().length(); i++) {
|
|
|
|
cinta.getChildren().add(crearCaja(String.valueOf(i), String.valueOf(maquina.getCintaAnterior().charAt(i))));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (int i = 0; i < maquina.getCintaAnterior().length(); i++) {
|
|
|
|
Text simbolo = (Text) scene.lookup("#simbolo_" + i);
|
2017-07-07 11:25:44 -04:00
|
|
|
if (i == maquina.getCabezal() && (mover || simboloAnterior == '\0')) {
|
2017-07-07 00:39:13 -04:00
|
|
|
simboloAnterior = simbolo.getText().charAt(0);
|
|
|
|
}
|
|
|
|
simbolo.setText(String.valueOf(maquina.getCintaAnterior().charAt(i)));
|
|
|
|
}
|
|
|
|
|
2017-07-07 11:25:44 -04:00
|
|
|
if (mover) {
|
|
|
|
descripcion.setText("Mover al estado q" + maquina.getEstadoActual().getQ() + " desde estado q" + estadoPrevio);
|
|
|
|
|
|
|
|
// Undo cabezel anterior
|
|
|
|
Rectangle rectangle = (Rectangle) scene.lookup("#caja_" + cabezalAnterior);
|
|
|
|
rectangle.setFill(Color.WHITE);
|
|
|
|
Text simbolo = (Text) scene.lookup("#simbolo_" + cabezalAnterior);
|
|
|
|
simbolo.setStroke(Color.BLACK);
|
|
|
|
|
|
|
|
// Cabezel
|
|
|
|
rectangle = (Rectangle) scene.lookup("#caja_" + maquina.getCabezal());
|
|
|
|
rectangle.setFill(Color.BLUE);
|
|
|
|
simbolo = (Text) scene.lookup("#simbolo_" + maquina.getCabezal());
|
|
|
|
simbolo.setStroke(Color.WHITE);
|
|
|
|
|
|
|
|
cabezalAnterior = maquina.getCabezal();
|
|
|
|
estadoPrevio = maquina.getEstadoActual().getQ();
|
|
|
|
mover = false;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
Text simbolo = (Text) scene.lookup("#simbolo_" + cabezalAnterior);
|
|
|
|
descripcion.setText("Simbolo leido \"" + simboloAnterior + "\" y simbolo escrito \"" + simbolo.getText() + "\"");
|
|
|
|
mover = true;
|
|
|
|
}
|
2017-07-07 00:39:13 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Boton de cerrar
|
|
|
|
*/
|
|
|
|
@FXML
|
|
|
|
protected void cerrar() {
|
|
|
|
Scene scene = contenido.getScene();
|
|
|
|
Stage stage = (Stage) scene.getWindow();
|
|
|
|
stage.close();
|
|
|
|
}
|
|
|
|
}
|