/*
Copyright 2012-2017 Jose Robson Mariano Alves
This file is part of bgfinancas.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This package is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package badernageral.bgfinancas.modulo.utilitario;
import badernageral.bgfinancas.biblioteca.contrato.Categoria;
import badernageral.bgfinancas.biblioteca.contrato.ControladorFormulario;
import badernageral.bgfinancas.biblioteca.utilitario.Animacao;
import badernageral.bgfinancas.biblioteca.sistema.Botao;
import badernageral.bgfinancas.biblioteca.contrato.Item;
import badernageral.bgfinancas.biblioteca.sistema.Janela;
import badernageral.bgfinancas.biblioteca.sistema.Kernel;
import badernageral.bgfinancas.biblioteca.tipo.Duracao;
import badernageral.bgfinancas.biblioteca.tipo.Status;
import badernageral.bgfinancas.biblioteca.utilitario.Lista;
import badernageral.bgfinancas.modelo.Despesa;
import badernageral.bgfinancas.modelo.DespesaItem;
import badernageral.bgfinancas.modelo.Receita;
import badernageral.bgfinancas.modelo.ReceitaItem;
import badernageral.bgfinancas.modulo.despesa.DespesaFormularioControlador;
import badernageral.bgfinancas.modulo.despesa.item.DespesaItemFormularioControlador;
import badernageral.bgfinancas.modulo.receita.ReceitaFormularioControlador;
import badernageral.bgfinancas.modulo.receita.item.ReceitaItemFormularioControlador;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.control.Button;
import javafx.scene.control.ListView;
import javafx.scene.control.RadioButton;
import javafx.scene.control.TextField;
import javafx.scene.control.TitledPane;
import javafx.scene.control.ToggleGroup;
import javafx.scene.control.Tooltip;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.RowConstraints;
public final class GuiaFormularioControlador implements Initializable, ControladorFormulario {
@FXML
private TitledPane formulario;
@FXML
private Label labelPergunta;
@FXML
private GridPane conteudo;
private int etapa = 0;
// Botões
private final HBox grupoBotao = new HBox();
private final Button finalizar = new Button();
private final Button cancelar = new Button();
// Etapa 1
private final ToggleGroup grupoTipo = new ToggleGroup();
private final RadioButton despesa = new RadioButton(idioma.getMensagem("despesa"));
private final RadioButton receita = new RadioButton(idioma.getMensagem("receita"));
private final HBox botoes = new HBox();
// Etapa 2
private Boolean tipoDespesa;
private final ListView<DespesaItem> listaDespesas = new ListView<>();
private final ListView<ReceitaItem> listaReceitas = new ListView<>();
private ObservableList<DespesaItem> despesas;
private ObservableList<DespesaItem> despesasResultado;
private ObservableList<ReceitaItem> receitas;
private ObservableList<ReceitaItem> receitasResultado;
private final TextField filtro = new TextField();
@Override
public void initialize(URL url, ResourceBundle rb) {
formulario.setText(idioma.getMensagem("guia"));
Botao.prepararBotaoModal(this, finalizar, cancelar, null);
finalizar.setText(idioma.getMensagem("proximo"));
cancelar.setText(idioma.getMensagem("cancelar"));
grupoBotao.getChildren().add(finalizar);
grupoBotao.getChildren().add(cancelar);
grupoBotao.setSpacing(5);
conteudo.add(grupoBotao, 1, 2);
etapa1();
}
private void etapa1() {
etapa = 1;
labelPergunta.setText(idioma.getMensagem("o_que_lancar"));
despesa.setTooltip(new Tooltip(idioma.getMensagem("retira_dinheiro")));
receita.setTooltip(new Tooltip(idioma.getMensagem("coloca_dinheiro")));
despesa.getStyleClass().add("BotaoInicio");
receita.getStyleClass().add("BotaoFim");
despesa.setSelected(true);
despesa.setToggleGroup(grupoTipo);
receita.setToggleGroup(grupoTipo);
botoes.getChildren().add(despesa);
botoes.getChildren().add(receita);
botoes.setSpacing(10);
conteudo.add(botoes, 1, 1);
}
private void etapa2() {
etapa = 2;
conteudo.getChildren().remove(botoes);
if (tipoDespesa) {
labelPergunta.setText(idioma.getMensagem("qual_despesa_lancar"));
despesas = new DespesaItem().listar();
listaDespesas.setItems(despesas);
conteudo.add(listaDespesas, 0, 1, 2, 1);
} else {
receitas = new ReceitaItem().listar();
listaReceitas.setItems(receitas);
labelPergunta.setText(idioma.getMensagem("qual_receita_lancar"));
conteudo.add(listaReceitas, 0, 1, 2, 1);
}
conteudo.getRowConstraints().get(1).setMinHeight(120);
conteudo.getRowConstraints().get(1).setPrefHeight(120);
conteudo.getRowConstraints().get(1).setMaxHeight(120);
Kernel.palcoModal.setHeight(300);
RowConstraints linha = new RowConstraints();
conteudo.getRowConstraints().add(2, linha);
filtro.getStyleClass().add("Filtro");
conteudo.add(filtro, 0, 2, 2, 1);
conteudo.getChildren().remove(grupoBotao);
conteudo.add(grupoBotao, 1, 3);
filtro.setOnKeyReleased(e -> {
if (tipoDespesa) {
filtrarDespesas(filtro.getText());
} else {
filtrarReceitas(filtro.getText());
}
});
filtro.setOnAction(e -> acaoFinalizar());
filtro.requestFocus();
}
private void etapa3(Item item) {
if (tipoDespesa) {
DespesaFormularioControlador controlador = Janela.abrir(Despesa.FXML_FORMULARIO, idioma.getMensagem("guia"));
controlador.cadastrar(null);
controlador.lancamentoGuiado(item);
} else {
ReceitaFormularioControlador controlador = Janela.abrir(Receita.FXML_FORMULARIO, idioma.getMensagem("guia"));
controlador.cadastrar(null);
controlador.lancamentoGuiado(item);
}
Animacao.fadeInOutClose(formulario);
}
private void filtrarDespesas(String filtro) {
despesasResultado = Lista.filtrar(filtro, despesas);
despesasResultado = Lista.ordenar(filtro, despesasResultado);
listaDespesas.setItems(despesasResultado);
listaDespesas.getItems().add(new DespesaItem(null, null, idioma.getMensagem("nao_esta_lista"), null));
}
private void filtrarReceitas(String filtro) {
receitasResultado = Lista.filtrar(filtro, receitas);
receitasResultado = Lista.ordenar(filtro, receitasResultado);
listaReceitas.setItems(receitasResultado);
listaReceitas.getItems().add(new ReceitaItem(null, null, idioma.getMensagem("nao_esta_lista"), null));
}
@Override
public void selecionarComboItem(int combo, Item item) {
if (item != null) {
etapa3(item);
} else {
Animacao.fadeInInvisivel(filtro, formulario);
}
}
@Override
public void acaoCancelar() {
Animacao.fadeInOutClose(formulario);
}
@Override
public void acaoFinalizar() {
if (validarFormulario()) {
if (etapa == 1) {
tipoDespesa = grupoTipo.getSelectedToggle().equals(despesa);
etapa2();
} else if (etapa == 2) {
if (tipoDespesa && listaDespesas.getSelectionModel().getSelectedItem().getIdItem() == null) {
Animacao.fadeOutInvisivel(listaDespesas, formulario);
DespesaItemFormularioControlador controladorItem = Janela.abrir(DespesaItem.FXML_FORMULARIO, idioma.getMensagem("despesa"));
controladorItem.cadastrar(this, null, filtro.getText());
} else if (!tipoDespesa && listaReceitas.getSelectionModel().getSelectedItem().getIdItem() == null) {
Animacao.fadeOutInvisivel(listaReceitas, formulario);
ReceitaItemFormularioControlador controladorItem = Janela.abrir(ReceitaItem.FXML_FORMULARIO, idioma.getMensagem("receita"));
controladorItem.cadastrar(this, filtro.getText());
} else if (tipoDespesa) {
etapa3(listaDespesas.getSelectionModel().getSelectedItem());
} else {
etapa3(listaReceitas.getSelectionModel().getSelectedItem());
}
}
}
}
private boolean validarFormulario() {
if (etapa == 1) {
if (!despesa.isSelected() && !receita.isSelected()) {
Janela.showTooltip(Status.ADVERTENCIA, idioma.getMensagem("campo_nao_informado"), despesa, Duracao.CURTA);
return false;
}
} else if (etapa == 2) {
if (tipoDespesa) {
if (listaDespesas.getSelectionModel().getSelectedItem() == null) {
Janela.showTooltip(Status.ADVERTENCIA, idioma.getMensagem("selecione_item_lista"), listaDespesas, Duracao.CURTA);
return false;
}
} else if (listaReceitas.getSelectionModel().getSelectedItem() == null) {
Janela.showTooltip(Status.ADVERTENCIA, idioma.getMensagem("selecione_item_lista"), listaReceitas, Duracao.CURTA);
return false;
}
}
return true;
}
@Override
public void acaoCadastrar(int botao) {
System.out.println(idioma.getMensagem("nao_implementado"));
}
@Override
public void selecionarComboCategoria(int combo, Categoria categoria) {
System.out.println(idioma.getMensagem("nao_implementado"));
}
}