package com.arthurassuncao.sistel.gui.candidato;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFormattedTextField;
import javax.swing.JTextField;
import com.arthurassuncao.sistel.classes.candidato.Candidato;
import com.arthurassuncao.sistel.classes.cargo.Cargo;
import com.arthurassuncao.sistel.classes.partido.PartidoPolitico;
import com.arthurassuncao.sistel.eventos.FixedLengthDocument;
import com.arthurassuncao.sistel.eventos.FixedLengthWithNumerosPositivosDocument;
import com.arthurassuncao.sistel.eventos.candidato.TratadorEventoItemCandidato;
import com.arthurassuncao.sistel.eventos.candidato.TratadorEventosMouseCadastrarCandidato;
import com.arthurassuncao.sistel.eventos.candidato.TratadorEventosTecladoCadastrarCandidato;
import com.arthurassuncao.sistel.gui.Fonte;
import com.arthurassuncao.sistel.gui.Janela;
import com.arthurassuncao.sistel.gui.LabelRotulo;
import com.arthurassuncao.sistel.gui.Painel;
import com.arthurassuncao.sistel.persistencia.BDEleicoes;
import com.arthurassuncao.sistel.recursos.Recursos;
/** A classe <code>JanelaCadastrarCandidato</code> cria uma GUI para cadastrar candidatos
* @author Arthur Assun��o
*
*
* @see Janela
*
*/
public class JanelaCadastrarCandidato extends Janela{
/** @serial
*
*/
private static final long serialVersionUID = -6494834015463393908L;
/** <code>int</code> com a largura da janela sem considerar a largura ap�s a chamada ao metodo {@link Janela#pack()} */
public static final int LARGURA = 500;
/** <code>int</code> com a altura da janela sem considerar a altura ap�s a chamada ao metodo {@link Janela#pack()} */
public static final int ALTURA = 300;
/** <code>String</code> com o texto do bot�o salvar */
public static final String TEXTO_BOTAO_SALVAR = "Salvar";
/** <code>String</code> com o texto do bot�o atualizar */
public static final String TEXTO_BOTAO_ATUALIZAR = "Atualizar";
private int numeroColunasCamposTexto = 15;
private String enderecoFotoCandidato = Candidato.FOTO_PADRAO; //imagem para candidato sem foto
private ArrayList<PartidoPoliticoSiglaNumero> partidos = new ArrayList<PartidoPoliticoSiglaNumero>();
private ArrayList<Cargo> cargos = new ArrayList<Cargo>();
//paineis
private Painel painelTotal;
private Painel painelNorte;
private Painel painelSul;
private Painel painelDados;
private Painel painelImagem;
private Painel painelCentro;
//Labels
private LabelRotulo labelId;
private LabelRotulo labelTitulo;
private LabelRotulo labelNome;
private LabelRotulo labelCargo;
private LabelRotulo labelPartido;
private LabelRotulo labelNumero;
private LabelRotulo labelFotoCandidato;
//Campos
private JTextField campoId;
private JTextField campoNome;
private JComboBox<String> campoSelecionarPartido;
private JComboBox<String> campoSelecionarCargo;
private JFormattedTextField campoNumero;
//text documents
private FixedLengthDocument documentCampoNome = new FixedLengthDocument(BDEleicoes.TAMANHO_CANDIDATO_NOME);
private FixedLengthWithNumerosPositivosDocument documentCampoNumero = new FixedLengthWithNumerosPositivosDocument(BDEleicoes.TAMANHO_CANDIDATO_NUMERO);
//mascara
//private Mascara mascaraNumero = new Mascara("#####", ' ');
//Botoes
private JButton botaoLimparCampos;
private JButton botaoSalvar;
//Imagens
private ImageIcon fotoCandidato;
//private JPanel painelTotal;
//Grid
private GridBagConstraints gridBagConstraint = new GridBagConstraints();
/** Cria uma instancia da janela de cadastro de candidato
*
*/
public JanelaCadastrarCandidato(){
super("Cadastrar Candidato", LARGURA, ALTURA);
this.iniciaElementos();
//Modifica alguns campos
labelTitulo.setEnabled(false);
labelTitulo.setVisible(false);
botaoSalvar.setText(TEXTO_BOTAO_SALVAR);
//Adiciona evento botaoSalvar
botaoSalvar.addMouseListener(new TratadorEventosMouseCadastrarCandidato(this));
this.addElementos();
this.pack();
this.setLocationRelativeTo(null);
this.setVisible(true);
}
//Alterar Candidato
/** Cria uma instancia da janela de altera��o de candidato
* @param candidato <code>Candidato</code> que poder� ser alterado
* @param janelaPesquisar <code>JanelaPesquisarCandidato</code> janela de pesquisa de onde o candidato foi selecionado
*/
public JanelaCadastrarCandidato(Candidato candidato, JanelaPesquisarCandidato janelaPesquisar){
super("Alterar Candidato", LARGURA, ALTURA);
this.iniciaElementos();
//Faz alguns campos aparecerem na GUI Alterar
labelTitulo.setVisible(true);
labelTitulo.setEnabled(true);
botaoSalvar.setText(TEXTO_BOTAO_ATUALIZAR);
this.addDadosCandidato(candidato);
//Adiciona evento botaoSalvar(Atualizar)
int idCandidato = Integer.parseInt(campoId.getText());
botaoSalvar.addMouseListener(new TratadorEventosMouseCadastrarCandidato(this, janelaPesquisar, idCandidato));
this.addElementos();
this.pack();
this.setVisible(true);
}
/** Instancia os elementos e adiciona dados aos <code>JComboBox</code>, alem de setar algumas propriedades de alguns componentes e adicionar eventos aos elementos
*
*/
private void iniciaElementos(){
painelTotal = new Painel(new GridBagLayout());
painelNorte = new Painel();
painelSul = new Painel(new GridBagLayout());
painelDados = new Painel(new GridBagLayout());
painelImagem = new Painel();
painelCentro = new Painel(new GridBagLayout());
//Grid
//gridBagConstraint.insets = new Insets(5, 15, 10, 10); //espacos pro GridBadLayout
gridBagConstraint.insets = new Insets(3, 0, 3, 0); //espacos pro GridBadLayout
gridBagConstraint.fill = GridBagConstraints.BOTH; //preenche toda coluna
//Inicializa os partidos
//partidos.add(Janela.COMBO_BOX_TEXTO_SELECIONE);
//pega os partidos que estao no banco de dados
List<PartidoPolitico> listaPartidos = PartidoPolitico.getAll();
//adiciona as siglas dos partidos ao comboBox
if (listaPartidos != null){
for(PartidoPolitico partido : listaPartidos){
partidos.add(new PartidoPoliticoSiglaNumero(partido.getSigla(), partido.getNumeroPartido()));
}
}
//Inicializa os cargos
//cargos.add(Janela.COMBO_BOX_TEXTO_SELECIONE);
//pega os cagos que estao no banco de dados
List<Cargo> listaCargos = Cargo.getAll();
//adiciona as siglas dos partidos ao comboBox
if (listaCargos != null){
for(Cargo cargo : listaCargos){
cargos.add(new Cargo(cargo.getNome(), cargo.getNumeroDigitos()));
}
}
//inicializa os labels
labelTitulo = new LabelRotulo();
labelTitulo.setFont(Fonte.FONTE_TITULO);
labelId = new LabelRotulo(String.format("%-20s%-15s", "","ID: "));
labelId.setVisible(false);
labelId.setEnabled(false);
labelNome = new LabelRotulo(String.format("%-20s%-15s", "","Nome: "));
//labelNome.setHorizontalAlignment(JLabel.RIGHT);
labelCargo = new LabelRotulo(String.format("%-20s%-15s", "","Cargo: "));
//labelCargo.setHorizontalAlignment(JLabel.RIGHT);
labelPartido = new LabelRotulo(String.format("%-20s%-15s", "", "Partido: "));
//labelPartido.setHorizontalAlignment(JLabel.RIGHT);
labelNumero = new LabelRotulo(String.format("%-20s%-15s", "", "Numero: "));
//labelNumero.setHorizontalAlignment(JLabel.RIGHT);
labelFotoCandidato = new LabelRotulo(fotoCandidato);
labelFotoCandidato.addMouseListener(new TratadorEventosMouseCadastrarCandidato(this));
labelFotoCandidato.setToolTipText("Click para mudar a foto");
//Inicializa imagens
this.setFotoCandidato(Candidato.FOTO_PADRAO);
//inicializa os campos
campoId = new JTextField(5);
campoId.setEnabled(false);
campoId.setEditable(false);
campoId.setVisible(false);
campoNome = new JTextField(numeroColunasCamposTexto);
campoNome.setToolTipText("Digite o nome do candidato");
campoNome.setDocument(documentCampoNome);
//campoSelecionarPartido = new JComboBox<String>();
campoSelecionarPartido = new JComboBox<String>();
campoSelecionarPartido.setMaximumRowCount(7);
campoSelecionarPartido.addItemListener(new TratadorEventoItemCandidato(this));
//Adiciona os valores do vetor(ArrayList) partidos ao JComboBox
campoSelecionarPartido.addItem(JanelaCadastrarCandidato.COMBO_BOX_TEXTO_SELECIONE);
for(PartidoPoliticoSiglaNumero itemPartido : this.partidos){
campoSelecionarPartido.addItem(itemPartido.getSigla());
}
campoSelecionarCargo = new JComboBox<String>();
campoSelecionarCargo.setMaximumRowCount(7);
campoSelecionarCargo.addItemListener(new TratadorEventoItemCandidato(this));
//Adiciona os valores do vetor(ArrayList) partidos ao JComboBox
campoSelecionarCargo.addItem(Janela.COMBO_BOX_TEXTO_SELECIONE);
for(Cargo itemCargo : this.cargos){
campoSelecionarCargo.addItem(itemCargo.getNome());
}
//campoNumero = new JFormattedTextField(mascaraNumero);
campoNumero = new JFormattedTextField();
campoNumero.setToolTipText("Digite o numero do candidato");
campoNumero.setDocument(documentCampoNumero);
campoNumero.addKeyListener(new TratadorEventosTecladoCadastrarCandidato(this));
//Inicializa os Botoes
botaoLimparCampos = new JButton("Limpar");
botaoSalvar = new JButton();
botaoLimparCampos.setFocusable(false);
botaoSalvar.setFocusable(false);
//Adiciona eventos aos botoes
botaoLimparCampos.addMouseListener(new TratadorEventosMouseCadastrarCandidato(this));
//botaoSalvar.addMouseListener(new TratadorEventosMouseCadastrarCandidato(this));
}
/** Adiciona os componentes aos paineis e � janela
*
*/
private void addElementos(){
//Adiciona ao painel Norte
painelNorte.add(labelTitulo);
//Aciciona ao painel Imagem
painelImagem.add(labelFotoCandidato);
//Adiciona ao painelDados
int linha = 0;
//Nome
gridBagConstraint.gridx = 1;
gridBagConstraint.gridy = linha++;
painelDados.add(labelNome, gridBagConstraint);
gridBagConstraint.gridx = 2;
painelDados.add(campoNome, gridBagConstraint);
//Cargo
gridBagConstraint.gridx = 1;
gridBagConstraint.gridy = linha++;
painelDados.add(labelCargo, gridBagConstraint);
gridBagConstraint.gridx = 2;
painelDados.add(campoSelecionarCargo, gridBagConstraint);
//Partido
gridBagConstraint.gridx = 1;
gridBagConstraint.gridy = linha++;
painelDados.add(labelPartido, gridBagConstraint);
gridBagConstraint.gridx = 2;
painelDados.add(campoSelecionarPartido, gridBagConstraint);
//Numero
gridBagConstraint.gridx = 1;
gridBagConstraint.gridy = linha++;
painelDados.add(labelNumero, gridBagConstraint);
gridBagConstraint.gridx = 2;
painelDados.add(campoNumero, gridBagConstraint);
//Adiciona ao painelCentro
gridBagConstraint.gridy = 0;
gridBagConstraint.gridx = 0;
painelCentro.add(painelImagem, gridBagConstraint);
gridBagConstraint.gridx = 1;
painelCentro.add(painelDados, gridBagConstraint);
//Adiciona ao painel Sul
gridBagConstraint.gridy = 0;
gridBagConstraint.gridx = 0;
gridBagConstraint.insets = new Insets(0, 20, 5, 20); //espacos pro GridBadLayout
painelSul.add(botaoLimparCampos, gridBagConstraint);
gridBagConstraint.gridx = 1;
painelSul.add(botaoSalvar, gridBagConstraint);
//Adiciona ao painelTotal
linha = 0;
gridBagConstraint.insets = new Insets(0, 5, 0, 5); //espacos pro GridBadLayout
gridBagConstraint.gridx = 0;
gridBagConstraint.gridy = linha++;
painelTotal.add(painelNorte, gridBagConstraint);
gridBagConstraint.gridy = linha++;
painelTotal.add(painelCentro, gridBagConstraint);
gridBagConstraint.gridy = linha++;
painelTotal.add(painelSul, gridBagConstraint);
this.add(painelTotal);
}
/** Coloca os dados do candidato nos campos da janela
* @param candidato <code>Candidato</code> que poder� ser modificado
*/
private void addDadosCandidato(Candidato candidato){
this.campoId.setText(String.valueOf(candidato.getId()));
this.campoNome.setText(candidato.getNome());
this.campoSelecionarCargo.setSelectedItem(candidato.getCargo());
this.campoSelecionarPartido.setSelectedItem(candidato.getPartidoPolitico().getSigla());
this.campoNumero.setText(String.valueOf(candidato.getNumeroCandidato()));
this.setFotoCandidato(candidato.getEnderecoFoto());
this.labelTitulo.setText(candidato.getNome());
}
/** Retorna um <code>String</code> com o endere�o da foto do candidato
* @return <code>String</code> com o endere�o da foto do candidato
*/
public String getEnderecoFotoCandidato() {
return enderecoFotoCandidato;
}
/** Seta o endereco da foto do candidato
* @param enderecoFotoCandidato <code>String</code> com o endereco da nova foto do candidato
*/
public void setEnderecoFotoCandidato(String enderecoFotoCandidato) {
this.enderecoFotoCandidato = enderecoFotoCandidato;
}
/** Retorna um <code>String</code> com o endereco da foto padr�o dos candidatos
* @return <code>String</code> com o endereco da foto padr�o dos candidatos
*/
public static String getFotoPadrao() {
return Candidato.FOTO_PADRAO;
}
/** Retorna um <code>int</code> com o numero do partido referente a sigla passada como parametro
* @param sigla <code>String</code> com a sigla do partido
* @return <code>int</code> com o numero do partido referente a sigla passada como parametro
*/
public int getNumeroPartidoBySigla(String sigla){
for (Iterator<PartidoPoliticoSiglaNumero> iterador = partidos.iterator(); iterador.hasNext(); ) {
PartidoPoliticoSiglaNumero partido = iterador.next(); //PartidoPoliticoSiglaNumero
if (partido.getSigla().equals(sigla)){
return partido.getNumero();
}
}
return 0;
}
/** Retorna um <code>String</code> com a sigla do partido referente ao numero passado como parametro
* @param numeroPartido <code>int</code> com o numero do partido
* @return <code>String</code> com a sigla do partido referente ao numero passado como parametro
*/
public String getSiglaPartidoByNumero(int numeroPartido){
for (Iterator<PartidoPoliticoSiglaNumero> iterador = partidos.iterator(); iterador.hasNext(); ) {
PartidoPoliticoSiglaNumero partido = iterador.next(); //PartidoPoliticoSiglaNumero
if (partido.getNumero() == numeroPartido){
return partido.getSigla();
}
}
return Janela.COMBO_BOX_TEXTO_SELECIONE;
}
/** Retorna um <code>int</code> com o numero de digitos que o numero do candidato deste cargo deve ter
* @param nomeCargo <code>String</code> com o cargo
* @return <code>int</code> com o numero de digitos que o numero do candidato deste cargo deve ter
*/
public int getNumeroDigitosByCargo(String nomeCargo){
for (Iterator<Cargo> iterador = cargos.iterator(); iterador.hasNext(); ){
Cargo cargo = iterador.next(); //Cargo
if (cargo.getNome().equals(nomeCargo)){
return cargo.getNumeroDigitos();
}
}
return BDEleicoes.TAMANHO_CANDIDATO_NUMERO; //se nao achar retorna o maximo possivel
}
/** Retorna um <code>JButton</code> com o botaoLimparCampos
* @return um <code>JButton</code> com o botaoLimparCampos
*/
public JButton getBotaoLimparCampos() {
return botaoLimparCampos;
}
/** Retorna um <code>JButton</code> com o botaoSalvar
* @return um <code>JButton</code> com o botaoSalvar
*/
public JButton getBotaoSalvar() {
return botaoSalvar;
}
/** Retorna um <code>JTextField</code> com o campoId
* @return um <code>JTextField</code> com o campoId
*/
public JTextField getCampoId() {
return campoId;
}
/** Retorna um <code>JTextField</code> com o campoNome
* @return um <code>JTextField</code> com o campoNome
*/
public JTextField getCampoNome() {
return campoNome;
}
/** Retorna um {@code JComboBox<String>} com o campoSelecionarPartido
* @return um {@code JComboBox<String>} com o campoSelecionarPartido
*/
public JComboBox<String> getCampoSelecionarPartido() {
return campoSelecionarPartido;
}
/** Retorna um {@code JComboBox<String>} com o campoSelecionarCargo
* @return um {@code JComboBox<String>} com o campoSelecionarCargo
*/
public JComboBox<String> getCampoSelecionarCargo() {
return campoSelecionarCargo;
}
/** Retorna um <code>JTextField</code> com o campoNumero
* @return um <code>JTextField</code> com o campoNumero
*/
public JTextField getCampoNumero() {
return campoNumero;
}
/** Retorna um <code>JTextField</code> com o labelFotoCandidato
* @return um <code>JTextField</code> com o labelFotoCandidato
*/
public LabelRotulo getLabelFotoCandidato() {
return labelFotoCandidato;
}
/** Sera o maximo de caracteres do documento do campo numero
* @param maxlength <code>int</code> com o maximo de caracteres para o campo Numero
*/
public void setMaxlengthCampoNumero(int maxlength){
this.documentCampoNumero.setMaxLength(maxlength);
}
/** Remove o excesso de caracteres do campo numero. Caso haja mais de <code>maxlength</code> caracteres no campo numero,
* esta fun��o remove os caracteres a mais.
*
*/
public void removeExcessoCaracteresCampoNumero(){
documentCampoNumero.removeOverage();
}
/** Limpa os campos da janela. Os campos de texto ficam vazios, os <code>JComboBox</code> fica com a primeira op��o selecionada e a imagem do candidato recebe a imagem padr�o dos candidatos.
*
*/
public void limpaCamposJanela(){
this.campoNome.setText("");
this.campoNumero.setText("");
this.campoSelecionarCargo.setSelectedIndex(0);
this.campoSelecionarPartido.setSelectedIndex(0);
this.setFotoCandidato(Candidato.FOTO_PADRAO);
}
/** Seta a foto do candidato
* @param foto <String> com o endere�o da foto do candidato
*/
public void setFotoCandidato(String foto){
if (foto != null){
ImageIcon fotoCandidato = null;
if(foto.equals(Candidato.FOTO_PADRAO)){ //� a imagem padrao, entao pega do jar
fotoCandidato = new ImageIcon(Recursos.getResource(foto));
}
else{
fotoCandidato = new ImageIcon(foto);
}
fotoCandidato.setImage(fotoCandidato.getImage().getScaledInstance(Candidato.LARGURA_FOTO, Candidato.ALTURA_FOTO, 100));
this.labelFotoCandidato.setIcon(fotoCandidato);
this.setEnderecoFotoCandidato(foto);
}
}
/** Seta a foto do candidato
* @param foto <code>URL</code> com a <code>URL</code> da foto do candidato
*/
public void setFotoCandidato(URL foto){
if (foto != null){
fotoCandidato = new ImageIcon(foto);
fotoCandidato.setImage(fotoCandidato.getImage().getScaledInstance(Candidato.LARGURA_FOTO, Candidato.ALTURA_FOTO, 100));
this.labelFotoCandidato.setIcon(fotoCandidato);
this.setEnderecoFotoCandidato(foto.getPath());
//System.out.println(foto.getFile());
}
}
/** Verifica se os campos s�o validos.<br>
* Os campos nome, numero n�o poder ficar vazios. O cargo e o partido devem ser selecionados.
* O numero de digitos do numero do campo numero deve ser igual ao numero de digitos do cargo selecionado.
* @see com.arthurassuncao.sistel.gui.InterfaceJanela#verificaCampos()
* @see Cargo
*/
@Override
public boolean verificaCampos() {
String nome = campoNome.getText().trim();
String numero = campoNumero.getText().trim();
int numeroDigitosCargo = this.documentCampoNumero.getMaxLength();
String cargo = (String)campoSelecionarCargo.getSelectedItem();
String partido = (String )campoSelecionarPartido.getSelectedItem();
if(nome.isEmpty()){
this.addError("Campo nome est� vazio");
}
if(numero.length() < numeroDigitosCargo && !cargo.equals(Janela.COMBO_BOX_TEXTO_SELECIONE)){
this.addError("N�mero do candidato � " + cargo +
" deve ter " + numeroDigitosCargo + " digitos");
}
if(cargo.equals(Janela.COMBO_BOX_TEXTO_SELECIONE)){
this.addError("Selecione um cargo");
}
if(partido.equals(Janela.COMBO_BOX_TEXTO_SELECIONE)){
this.addError("Selecione um partido");
}
if(!this.getErros().isEmpty()){
return false;
}
return true;
}
//criado apenas para armazenar as siglas e numeros dos partidos, evita o uso da classe PartidoPolitico
/** Classe interna para manipular partidos armazenando apenas sigla e numero
* @author Arthur Assun��o
*
*
*/
private class PartidoPoliticoSiglaNumero{
private String sigla;
private int numero;
/** Cria uma instancia da classe interna
* @param sigla <code>String</code> com a sigla do partido
* @param numero <code>int</code> com o numero do partido
*/
public PartidoPoliticoSiglaNumero(String sigla, int numero){
this.sigla = sigla;
this.numero = numero;
}
/** Retorna um <code>String</code> com a sigla do partido do candidato
* @return um <code>String</code> com a sigla do partido do candidato
*/
public String getSigla() {
return sigla;
}
/** Retorna um <code>int</code> com o numero do candidato
* @return um <code>int</code> com o numero do candidato
*/
public int getNumero() {
return numero;
}
}
/* (non-Javadoc)
* @see com.arthurassuncao.sistel.gui.Janela#addItensPopupMenu()
*/
@Override
protected void addItensPopupMenu() {
// TODO Auto-generated method stub
}
/* (non-Javadoc)
* @see com.arthurassuncao.sistel.gui.Janela#addEventoItens()
*/
@Override
protected void addEventoItens() {
// TODO Auto-generated method stub
}
}