package tirateima.controlador;
import java.util.Stack;
import javax.swing.JOptionPane;
/**
* Modela um comando de entrada do usuário.
*
* @author Vinícius
*
*/
public class CommandReadInput extends Command{
private Stack<Object> var_stack;
private Object value;
public CommandReadInput(Stack<Object> var_stack) {
this.var_stack = var_stack;
}
/**
* Executa o comando de leitura do usuário, setando um valor recebido na
* variável.
* @throws ExecutionException
*/
@Override
public void execute(Controlador c) throws TiraTeimaLanguageException, ExecutionException {
//Copia pilha para possível restauração.
Stack<Object> pilhaAux = new Stack<Object>();
pilhaAux = copia(var_stack);
//Recebe entrada do usuário.
value = JOptionPane.showInputDialog(null,
"Entre com o valor de " + var_stack.get(0) + ":",
"Entrada de Dados",
JOptionPane.DEFAULT_OPTION,
null,
null,
null);
//Informa condição de prosseguimento
if(value == null){
JOptionPane.showMessageDialog(null,
"Para prosseguir, o valor deverá ser informado.",
"Aviso",
JOptionPane.WARNING_MESSAGE);
throw new ExecutionException("Valor não informado.", this.getClass().toString());
}
//Tenta setar o valor de entrada para o usuário.
try{
setValue(c.mostrador, var_stack, value);
}
catch(Exception e){
var_stack = pilhaAux;
setValue(c.mostrador, var_stack, null);
JOptionPane.showMessageDialog(null,
"Valor Incorreto!",
"Erro",
JOptionPane.ERROR_MESSAGE);
//TODO: lançar mensagens diferentes para os diferentes tipos de exceção (mais didático).
throw new ExecutionException("Valor incorreto.", this.getClass().toString());
}
}
@Override
public void revert(Controlador c) throws TiraTeimaLanguageException,
ExecutionException {
// TODO Auto-generated method stub
}
/**
* Copia pilha para possível restauração.
*
* @param var_stack
* @return
*/
private Stack<Object> copia(Stack<Object> pilha) {
Stack<Object> pilhaCopia = new Stack<Object>();
Stack<Object> pilhaAux = new Stack<Object>();
Object elemento;
//Passa elementos para uma pilha intermediária
while(!pilha.empty()){
elemento = pilha.pop();
pilhaAux.push(elemento);
}
//Copia pilha e restaura pilha original
while(!pilhaAux.empty()){
elemento = pilhaAux.pop();
pilhaCopia.push(elemento);
pilha.push(elemento);
}
return pilhaCopia;
}
}