package presenter;
import business.CenarioVolume;
import business.Projeto;
import dao.ProjetoDAO;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JOptionPane;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import main.Main;
import org.jdesktop.swingx.JXErrorPane;
import org.jdesktop.swingx.error.ErrorInfo;
import org.netbeans.validation.api.Problem;
import org.netbeans.validation.api.Severity;
import org.netbeans.validation.api.Validator;
import org.netbeans.validation.api.builtin.Validators;
import org.netbeans.validation.api.ui.ValidationPanel;
import util.FixedLengthDocument;
import view.DuplicarCenarioView;
public class DuplicarCenarioPresenter {
private DuplicarCenarioView view;
private Main main;
private ProjetoDAO projetoDAO;
public DuplicarCenarioPresenter(Main main) {
this.projetoDAO = new ProjetoDAO();
view = new DuplicarCenarioView();
this.main = main;
view.setLocationRelativeTo(main);
view.getCmbCenarioOrigem().addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
exibeDetalhes();
}
});
view.getBtnDuplicar().addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
duplicaColecao();
} catch (Exception ex) {
ErrorInfo info = new ErrorInfo("Erro", ex.getMessage(), null, "category", ex, Level.SEVERE, null);
JXErrorPane.showDialog(null, info);
}
}
});
view.getBtnCancelar().addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
view.setVisible(false);
view.dispose();
}
});
view.getTxtCenarioDestino().setDocument(new FixedLengthDocument(20));
view.getTxtCenarioDestino().setName("Novo cenário");
final ValidationPanel pnl = new ValidationPanel();
view.setContentPane(pnl);
pnl.setInnerComponent(view.getPnlCampos());
// O campo Nome não pode ser vazio
Validator<javax.swing.text.Document> vldVazio = Validators.forDocument(true, Validators.REQUIRE_NON_EMPTY_STRING);
pnl.getValidationGroup().add(view.getTxtCenarioDestino(), vldVazio);
pnl.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
Problem p = pnl.getProblem();
boolean enable = p == null ? true : p.severity() != Severity.FATAL;
view.getBtnDuplicar().setEnabled(enable);
}
});
loadCenarios();
exibeDetalhes();
view.getTxtCenarioDestino().requestFocus();
view.getBtnDuplicar().setEnabled(false);
view.getTxtCenarioDestino().addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) {
view.getBtnDuplicar().setEnabled(true);
view.getBtnCancelar().setText("Cancelar");
}
});
view.setVisible(true);
}
private void loadCenarios() {
try {
view.getCmbCenarioOrigem().setModel(new DefaultComboBoxModel());
DefaultComboBoxModel cbCenarios = new DefaultComboBoxModel();
projetoDAO.connect();
ArrayList<CenarioVolume> arvoreCollection = new ArrayList<>(main.getProjeto().getCenarios());
for (CenarioVolume cenario : arvoreCollection) {
cbCenarios.addElement(cenario.getNome());
}
view.getCmbCenarioOrigem().setModel(cbCenarios);
projetoDAO.close();
} catch (Exception ex) {
Logger.getLogger(DuplicarCenarioPresenter.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void duplicaColecao() throws Exception {
if (view.getCmbCenarioOrigem().getSelectedIndex() >= 0) {
projetoDAO.connect();
CenarioVolume from = main.getProjeto().getCenarioByName((view.getCmbCenarioOrigem().getSelectedItem().toString()));
if (from.getTotalArvores() == 0) {
projetoDAO.close();
throw new Exception("Não existem árvores no cenário de origem.");
} else {
if (main.getProjeto().contains(view.getTxtCenarioDestino().getText())) {
view.getTxtCenarioDestino().setText(null);
projetoDAO.close();
throw new Exception("Existe um cenário com este nome. Selecione outro.");
} else {
CenarioVolume novoCenario = new CenarioVolume(main.getProjeto().getNewCenarioVolumeId());
novoCenario.addArvores(new ArrayList<>(from.getArvores()));
novoCenario.setNome(view.getTxtCenarioDestino().getText());
Projeto projeto = projetoDAO.find(main.getProjeto().getId());
projeto.addCenario(novoCenario);
projetoDAO.update(projeto, false, projeto.getId());
projetoDAO.close();
main.setProjeto(projeto);
main.getViewState().updateTreeModel();
loadCenarios();
JOptionPane.showMessageDialog(view, "Cenário duplicado para " + view.getTxtCenarioDestino().getText() + ".");
view.getTxtCenarioDestino().setText(null);
view.getTxtCenarioDestino().requestFocus();
view.getBtnCancelar().setText("Fechar");
}
}
} else {
throw new UnsupportedOperationException("Selecione um cenário de origem.");
}
}
private void exibeDetalhes() {
projetoDAO.connect();
view.getLblTotalArvores().setText(Integer.toString(main.getProjeto().getCenarioById(main.getProjeto().getCenarioByName((view.getCmbCenarioOrigem().getSelectedItem().toString())).getId()).getTotalArvores()));
projetoDAO.close();
}
}