package com.arthurassuncao.sistel.gui; import java.awt.Color; import java.awt.FlowLayout; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import javax.swing.JComponent; import javax.swing.JTextField; import javax.swing.event.CaretEvent; import javax.swing.event.CaretListener; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import net.sourceforge.jdatepicker.impl.JDatePanelImpl; import net.sourceforge.jdatepicker.impl.JDatePickerImpl; import net.sourceforge.jdatepicker.impl.UtilCalendarModel; import org.jdesktop.swingx.JXDatePicker; import com.alee.extended.date.WebDateField; import com.arthurassuncao.sistel.classes.Data; import com.arthurassuncao.sistel.classes.Localidade; /** Classe com Calendarios (Data pickers) para melhor exibicao e interacao do usuario com campos de data, alem de fornecer metodos que facilitam * a manipulacao de datas * @author Arthur Assun��o * * * @see JComponent */ public class Calendario extends JComponent{ /** @serial * */ private static final long serialVersionUID = -4432396322152886159L; /** <code>int</code> representa o data picker do swingx, veja em {@link "http://swingx.java.net"} */ public static final int CALENDARIO_JXDATEPICKER = 0; /** <code>int</code> representa o data picker de Juanheyns, veja em {@link "http://sourceforge.net/projects/jdatepicker/"} */ public static final int CALENDARIO_JDATEPICKER = 1; /** <code>int</code> representa o data picker deo WebLookAndFeel, veja em {@link "http://weblookandfeel.com"} */ public static final int CALENDARIO_WEBDATEFIELD = 2; private int tipoCalendario; private Data data = new Data(); private JComponent datePicker; private final int NUMERO_COLUNAS = 10; /** Cria um componente calendario do tipo especificado pelo parametro * @param tipoCalendario <code>int</code> representando o tipo do calendario (data picker) * @see Calendario#CALENDARIO_JXDATEPICKER * @see Calendario#CALENDARIO_JDATEPICKER */ public Calendario(int tipoCalendario){ super(); this.setLayout(new FlowLayout()); this.setBackground(Color.WHITE); this.tipoCalendario = tipoCalendario; if (this.tipoCalendario == Calendario.CALENDARIO_JDATEPICKER){ UtilCalendarModel modelo = new UtilCalendarModel(Calendar.getInstance(Localidade.LOCAL_PT_BR)); JDatePanelImpl painel = new JDatePanelImpl(modelo); painel.setBackground(Color.WHITE); painel.setShowYearButtons(true); this.datePicker = new JDatePickerImpl(painel); ((JDatePickerImpl)this.datePicker).setBackground(Color.WHITE); //((JDatePickerImpl)this.datePicker).getJFormattedTextField().setPreferredSize(TAMANHO); ((JDatePickerImpl)this.datePicker).getJFormattedTextField().setColumns(NUMERO_COLUNAS); modelo.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent evento) { data.setData(((JDatePickerImpl)datePicker).getJFormattedTextField().getText()); } }); } else if(this.tipoCalendario == Calendario.CALENDARIO_JXDATEPICKER){ this.datePicker = new JXDatePicker(Localidade.LOCAL_PT_BR); ((JXDatePicker)this.datePicker).setFormats(new String [] { "dd/MM/yyyy" }); ((JXDatePicker)this.datePicker).getEditor().setEditable(false); ((JXDatePicker)this.datePicker).getEditor().setColumns(NUMERO_COLUNAS); ((JXDatePicker)this.datePicker).getEditor().addCaretListener(new CaretListener() { @Override public void caretUpdate(CaretEvent evento) { data.setData((((JXDatePicker)datePicker).getEditor().getText())); } }); } else if(this.tipoCalendario == Calendario.CALENDARIO_WEBDATEFIELD){ this.datePicker = new WebDateField(); ((WebDateField)this.datePicker).setDateFormat(new SimpleDateFormat("dd/MM/yyyy")); ((WebDateField)this.datePicker).setLocale(Localidade.LOCAL_PT_BR); JTextField campoTexto = (JTextField)((WebDateField)this.datePicker).getComponent(0); //pega o campo de texto campoTexto.setEditable(false); campoTexto.setColumns(NUMERO_COLUNAS); campoTexto.addCaretListener(new CaretListener() { @Override public void caretUpdate(CaretEvent evento) { WebDateField dataPicker = ((WebDateField)datePicker); JTextField campoTexto = (JTextField)dataPicker.getComponent(0); data.setData(campoTexto.getText()); } }); } if (this.datePicker != null){ this.add(datePicker); } } /** Retorna um <code>String</code> com a data selecionada, a data no formato dd/mm/aaaa * @return <code>String</code> com a data no formato dd/mm/aaaa */ public String getData(){ if (this.datePicker instanceof JDatePickerImpl){ this.data.setDia(((JDatePickerImpl)this.datePicker).getModel().getDay()); this.data.setMes(((JDatePickerImpl)this.datePicker).getModel().getMonth()+1); this.data.setAno(((JDatePickerImpl)this.datePicker).getModel().getYear()); } else if(this.datePicker instanceof JXDatePicker){ if (((JXDatePicker)this.datePicker).getEditor().getText() != null){ data.setData(((JXDatePicker)this.datePicker).getEditor().getText()); } } else if(this.datePicker instanceof WebDateField){ if (((WebDateField)this.datePicker).getDate() != null){ Date novaData = ((WebDateField)this.datePicker).getDate(); if(novaData != null){ data.setData(new Data(novaData).getDataDDMMAAAA() ); } else{ data.setData(new Data(new Date()).getDataDDMMAAAA() ); //data atual } } } return data.getDataDDMMAAAA(); } /** Retorna um objeto Date com a data selecionada * @return <code>Date</code> com a data que foi selecionada * @see Date */ public Date getDate(){ Date date = null; if (this.datePicker instanceof JDatePickerImpl){ date = this.data.getDate(); } else if(this.datePicker instanceof JXDatePicker){ date = ((JXDatePicker)this.datePicker).getDate(); } else if(this.datePicker instanceof WebDateField){ date = ((WebDateField)this.datePicker).getDate(); } return date; } /** Seta a data do calendario * @param data <code>String</code> com a nova data, se a data for nula limpa o campo ou seta a data atual, dependendo do JDataPicker */ public void setData(String data){ if (this.datePicker instanceof JDatePickerImpl){ ((JDatePickerImpl)this.datePicker).getJFormattedTextField().setText(data); } else if(this.datePicker instanceof JXDatePicker){ ((JXDatePicker)this.datePicker).getEditor().setText(data); } else if(this.datePicker instanceof WebDateField){ if(data != null){ //nao aceita data nula ((WebDateField)this.datePicker).setDate(new Data(data).getDate()); } else{ ((WebDateField)this.datePicker).setDate(new Data(new Date()).getDate()); //data atual } } } /** Seta a data do calendario, caso o objeto <code>Date</code> seja <code>null</code> � setada a data atual * @param date <code>Date</code> com a nova data */ public void setDate(Date date){ this.data.setDate(date); if (date != null){ this.setData(this.data.getDataDDMMAAAA()); } else{ this.setData(""); } } /** Retorna o texto do componente de texto do calendario, o texto � retornado no formato dd/mm/aaaa * @return <code>String</code> com o texto do campo de texto */ public String getText(){ String texto = ""; if (this.datePicker instanceof JDatePickerImpl){ texto = ((JDatePickerImpl)this.datePicker).getJFormattedTextField().getText(); } else if(this.datePicker instanceof JXDatePicker){ texto = ((JXDatePicker)this.datePicker).getEditor().getText(); } else if(this.datePicker instanceof WebDateField){ texto = new Data(((WebDateField)this.datePicker).getDate()).getDataDDMMAAAA(); } return texto; } /** Seta o toolTipText do calendario * @see javax.swing.JComponent#setToolTipText(java.lang.String) * @param mensagem <code>String</code> com a mensagem do toolTipText */ @Override public void setToolTipText(String mensagem){ this.datePicker.setToolTipText(mensagem); } }