É possível esconder uma ou mais opções de um menu tendo em conta o estado de uma determinada entidade. Por exemplo, podemos querer que a opção de mostrar os números já inseridos (concretizado pelo comando ListNumbers) não seja apresentada se não houver nenhum número para apresentar.
Esta funcionalidade já é suportada pela framework de interacção da seguinte forma. É possível criar um comando com um parâmetro adicional do tipo ValidityPredicate<T> que tem a responsabilidade de indicar se o comando deve ser visível ou não. Cada vez que um menu tem que apresentar as suas opções (ou seja os comandos presentes no menu), antes de apresentar cada opção, o menu verifica se o comando associado à opção é visível ou não. Se não for visível, então a opção não é apresentada.
Este parâmetro adicional deverá substituir o método bolean isValid().
A visibilidade do comando deve estar definida no método boolean isValid() de ValidityPredicate. O constructor da super-classe isValid(). recebe um parâmetro que deverá referenciar a entidade cujo estado afecta a visibilidade do comando. Esta entidade depois pode ser acedida no método isValid através do atributo _receiver (o qual foi inicializado no construtor).
Para concretizar este novo requisito, precisamos de criar um ValidityPredicate cuja concretização do método isValid() devolva true quando a entidade IntegerManager tenha pelo manos um número e devolva false quando está vazia:
new ValidityPredicate<IntegerManager>(manager) {
@Override
public boolean isValid() {
return _receiver.getNumbers().size() > 0;
}
}
em que manager é uma referência para a entidade do domínio que gere a lista de números a a apresentar.
Assim, devemos alterar a construção do comando ListNumbers para passar um parâmetro adicional do tipo ValidityPredicate na invocação do construtor da superclasse. Esta classe deverá passar a ter a seguinte concretização:package ex.app.main;
import java.util.List;
import ex.core.IntegerManager;
import pt.tecnico.po.ui.Input;
import pt.tecnico.po.ui.Command;
import pt.tecnico.po.ui.DialogException;
import pt.tecnico.po.ui.ValidityPredicate;
public class ListNumbers extends Command<IntegerManager> {
//Constructor
public ListNumbers(IntegerManager ent) {
super("Listar Números", ent,
new ValidityPredicate<IntegerManager>(ent) {
@Override
public boolean isValid() {
return _receiver.getNumbers().size() > 0;
}
});
}
protected void execute() { // executed when this option is selected
List<Integer> list = _receiver.getNumbers();
for (Integer number : list)
_display.addLine(number.toString());
_display.display();
}
}