package com.aratana.ui.fields;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
import javax.swing.text.SimpleAttributeSet;
/**
* Campo para a insero de datas.
*
* @author Dyorgio da Silva Nascimento
*/
@SuppressWarnings("serial")
public class DateField extends BasicField<Date> {
private static AttributeSet NULL = new SimpleAttributeSet();
private final SimpleDateFormat format;
private final int formatLength;
public DateField() {
this(true, true, true, false, false);
}
public DateField(final boolean day, final boolean year, final boolean extendYear) {
this(day, year, extendYear, false, false);
}
public DateField(final boolean day, final boolean year, final boolean extendYear, final boolean hour, final boolean extendsHour) {
setHorizontalAlignment(RIGHT);
final StringBuilder lo_buffer = new StringBuilder("##"), formatBuffer = new StringBuilder("MM");
if (day) {
lo_buffer.insert(0, "##/");
formatBuffer.insert(0, "dd/");
}
if (year) {
if (extendYear) {
lo_buffer.append("/####");
formatBuffer.append("/yyyy");
} else {
lo_buffer.append("/##");
formatBuffer.append("/yy");
}
}
if (hour) {
lo_buffer.append(" ##:##");
formatBuffer.append(" HH:mm");
if (extendsHour) {
lo_buffer.append(":##.###");
formatBuffer.append(":ss.SSS");
}
}
format = new SimpleDateFormat(formatBuffer.toString());
formatLength = lo_buffer.length();
setDocument(new PlainDocument() {
@Override
public void insertString(final int offs, final String str, final AttributeSet a) throws BadLocationException {
if (DateField.this.getText().length() < formatLength) {
final StringBuilder original = new StringBuilder(DateField.this.getText().replaceAll("[^0-9]", ""));
original.append(str.replaceAll("[^0-9]", ""));
super.remove(0, getLength());
if (original.length() >= 3) {
original.insert(2, '/');
if (original.length() > 5) {
if (a != NULL || original.length() > 5) {
original.insert(5, '/');
}
if (original.length() > 10) {
original.insert(10, ' ');
if (original.length() == 11 && a == NULL) {
original.deleteCharAt(10);
}
if (original.length() > 13) {
original.insert(13, ':');
}
if (original.length() > 16) {
original.insert(16, ':');
if (original.length() > 19) {
original.insert(19, '.');
}
}
}
}
}
super.insertString(0, original.toString(), a);
}
}
@Override
public void remove(final int offs, final int len) throws BadLocationException {
super.remove(offs, len);
if (len != getLength()) {
insertString(0, "", NULL);
}
}
});
addCaretListener(new CaretListener() {
boolean update = false;
@Override
public void caretUpdate(final CaretEvent e) {
if (!update && e.getDot() == e.getMark() && !allSelected) {
update = true;
allSelected = getSelectionStart() != getSelectionEnd() && getSelectionEnd() == getText().length();
setCaretPosition(getText().length());
update = false;
}
}
});
}
@Override
public int getMax() {
return formatLength;
}
@Override
public Date getStringValue(String trim) throws Exception {
Date retorno = null;
if (trim.length() == formatLength) {
try {
retorno = format.parse(trim);
} catch (final ParseException e) {
e.printStackTrace();
}
}
return retorno;
}
@Override
public String getValueString(Date value) {
return value == null ? "" : format.format(value);
}
}
|