/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package Sirius.navigator.ui.widget;
/*******************************************************************************
*
* Copyright (c) : EIG (Environmental Informatics Group)
* http://www.htw-saarland.de/eig
* Prof. Dr. Reiner Guettler
* Prof. Dr. Ralf Denzer
*
* HTWdS
* Hochschule fuer Technik und Wirtschaft des Saarlandes
* Goebenstr. 40
* 66117 Saarbruecken
* Germany
*
* Programmers : Thorsten Hell
* Pascal
* Project : WuNDA 2
* Version : 2.0
* Purpose :
* Created : 27.05.1999
* History :
*
*******************************************************************************/
import Sirius.navigator.*;
import java.awt.Toolkit;
import java.awt.event.*;
import java.text.*;
import java.text.NumberFormat;
import java.text.ParseException;
import javax.swing.*;
import javax.swing.text.*;
/**
* Dies ist ein Intfeld das nur Zahleneingabe zulaesst.<BR>
* Der Code wurde teilweise aus dem Onlinetutorial von SUN uebernommen.<BR>
*
* @author Thorsten Hell
* @version 1.0 erstellt am 27.05.1999
* @since letzte Aenderung am 01.03.2000
*/
public class DateField extends JTextField implements FocusListener {
//~ Instance fields --------------------------------------------------------
private final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(this.getClass());
private Toolkit toolkit;
// private NumberFormat integerFormatter;
private boolean checked = false;
private DecimalFormat integerFormatter;
private int maxLength;
private boolean bringFocus2Next = false;
private DateField nextField;
//~ Constructors -----------------------------------------------------------
/**
* Dem Konstruktor wird ein Formatstring uebergeben. Aus diesem Formatstring liesst das Textfeld heraus wieviele
* Ziffern maximal eingegeben werden koennen, und wie gross die Anzeige sein soll.
*
* @param formatString DOCUMENT ME!
*/
public DateField(final String formatString) {
super(formatString.length());
bringFocus2Next = false;
maxLength = formatString.length();
integerFormatter = new DecimalFormat(formatString);
toolkit = Toolkit.getDefaultToolkit();
// integerFormatter = NumberFormat.getNumberInstance();//Locale.US);
integerFormatter.setParseIntegerOnly(true);
addFocusListener(this);
}
/**
* Creates a new DateField object.
*
* @param value DOCUMENT ME!
* @param formatString DOCUMENT ME!
*/
public DateField(final int value, final String formatString) {
super(formatString.length());
bringFocus2Next = false;
maxLength = formatString.length();
integerFormatter = new DecimalFormat(formatString);
toolkit = Toolkit.getDefaultToolkit();
// integerFormatter = NumberFormat.getNumberInstance();//Locale.US);
integerFormatter.setParseIntegerOnly(true);
setValue(value);
addFocusListener(this);
}
//~ Methods ----------------------------------------------------------------
/**
* Mit dieser methode kann man ein IntFeld angeben, zu dem der Focus gehen soll, wenn die entsprechende Anzahl von
* Ziffern erreicht worden ist.
*
* @param nf DOCUMENT ME!
*/
public void setNextField(final DateField nf) {
bringFocus2Next = true;
nextField = nf;
}
/**
* Mit dieser Methode kann der int-Wert des Feldes bestimmt werden.
*
* @return DOCUMENT ME!
*/
public int getValue() {
int retVal = 0;
try {
retVal = integerFormatter.parse(getText()).intValue();
} catch (ParseException e) {
// This should never happen because insertString allows
// only properly formatted data to get in the field.
toolkit.beep();
}
return retVal;
}
/**
* Mit dieser Methode wird der Wert des Feldes mittels eines Integers gesetzt.
*
* @param value DOCUMENT ME!
*/
public void setValue(final int value) {
setText(integerFormatter.format(value));
}
/**
* Diese Methode liefert zurueck ob sich das Feld seiner pruefung unterzogen hat.
*
* @return DOCUMENT ME!
*/
public boolean checked() {
return checked;
}
/**
* Diese Methode prueft das Feld.
*/
public void check() {
final boolean tmp = bringFocus2Next;
bringFocus2Next = false;
setValue(getValue());
checked = true;
bringFocus2Next = tmp;
}
/*
* diese Methode wird aufgerufen wenn das Feld den Focus erhaelt
*/
@Override
public void focusGained(final FocusEvent e) {
return;
}
/*
* diese Methode wird aufgerufen wenn das Feld den Focus verliert
*/
@Override
public void focusLost(final FocusEvent e) {
if (e.isTemporary()) {
return;
} else {
if (!checked()) {
check();
}
}
}
/*
* diese methode liefert ein neues WholeNumberDocument.
*/
@Override
protected Document createDefaultModel() {
return new WholeNumberDocument();
}
//~ Inner Classes ----------------------------------------------------------
/**
* diese lokale Klasse braucht man, um die Eingaben in das Feld zu ueberpruefen.
*
* @version $Revision$, $Date$
*/
protected class WholeNumberDocument extends PlainDocument {
//~ Methods ------------------------------------------------------------
@Override
public void remove(final int offs, final int len) throws BadLocationException {
checked = false;
super.remove(offs, len);
}
@Override
public void insertString(final int offs, final String str, final AttributeSet a) throws BadLocationException {
// NavigatorLogger.printMessage("Offset:"+offs+" STr:"+str+"L:"+getLength()+"attr:"+a);
if ((getLength() + str.length()) <= maxLength) {
final char[] source = str.toCharArray();
final char[] result = new char[source.length];
int j = 0;
for (int i = 0; i < result.length; i++) {
if (Character.isDigit(source[i])) {
result[j++] = source[i];
} else {
toolkit.beep();
if (log.isDebugEnabled()) {
log.debug("insertString: " + source[i]); // NOI18N
}
}
}
super.insertString(offs, new String(result, 0, j), a);
checked = false;
} else {
toolkit.beep();
}
if ((getLength()) == maxLength) { // getLength() ist schon aktualisiert
if (bringFocus2Next == true) {
checked = true;
nextField.requestFocus();
}
// NavigatorLogger.printMessage("Sprung");
// NavigatorLogger.printMessage(nextField);
}
}
}
}