/*
Copyright 2003-2012 Dmitry Barashev, GanttProject Team
This file is part of GanttProject, an opensource project management tool.
GanttProject is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
GanttProject is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GanttProject. If not, see <http://www.gnu.org/licenses/>.
*/
package net.sourceforge.ganttproject.gui;
import java.awt.Toolkit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JFormattedTextField;
import javax.swing.SwingConstants;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.PlainDocument;
/**
* <p>
* Title: GTextField
* </p>
* <p>
* Description: This class is a text field enabling accurate character
* authorization. You can specify the valid characters you want authorize in
* edition or a regular expression pattern.
* </p>
*
* @author Benoit Baranne
*/
public class GTextField extends JFormattedTextField {
public static final String PATTERN_DOUBLE = "[0-9]*\\.?[0-9]*";
public static final String PATTERN_INTEGER = "[0-9]*";
/**
* Creates an instance of GTextField with a default format.
*
* @param format
* Textfields format.
*/
public GTextField(AbstractFormatter format) {
super(format);
// this.setDocument(new CPlainDocument(null));
this.setHorizontalAlignment(SwingConstants.RIGHT);
}
/**
* Creates an instance of GTextField with a default text.
*
* @param text
* Text to be put into the text field.
*/
public GTextField(String text) {
super();
this.setDocument(new GPlainDocument(null));
this.setText(text);
this.setHorizontalAlignment(SwingConstants.RIGHT);
}
/**
* Creates an instance of GTextField.
*/
public GTextField() {
super();
super.setColumns(15);
this.setDocument(new GPlainDocument(null));
this.setHorizontalAlignment(SwingConstants.RIGHT);
}
/**
* Give the focus to the text field.
*/
public void setFocus() {
super.requestFocusInWindow();
}
/**
* Indicates the valid characters to accept in edition.
*
* @param valid_chars
* String containing all the valid characters.
*/
public void setValidCharacters(String valid_chars) {
Document d = this.getDocument();
if (d instanceof GPlainDocument) {
((GPlainDocument) d).setValidCharacters(valid_chars);
}
}
/**
* Indicates the valid characters by giving an regular expression pattern.
*
* @param pattern
* The regular expression with which the matching is done.
*/
public void setPattern(String pattern) {
Document d = this.getDocument();
if (d instanceof GPlainDocument) {
((GPlainDocument) d).setPattern(pattern);
}
}
}
/**
* <p>
* Title: CPlainDocument
* </p>
* <p>
* Description: This class enables you to specify the valid characters for the
* document. If the pattern is set (i.e. not null) the valid characters refer to
* it, otherwise it refers to the valid characters string.
* </p>
*
* @author Benoit Baranne
*/
class GPlainDocument extends PlainDocument {
/**
* String containing all the valid characters.
*/
private String valid_characters = null;
/**
* Regular expression pattern to use.
*/
private Pattern pattern = null;
/**
* Creates an instance of GPlainDocument with a valid character string.
*
* @param validchars
*/
public GPlainDocument(String validchars) {
super();
this.valid_characters = validchars;
}
/**
* Inserts the string <code>str</code> into the document if it matches with
* the valid characters.
*
* @param offs
* Offset for the insertion.
* @param str
* String to insert.
* @param a
* AttibutSet.
* @throws BadLocationException
*/
@Override
public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
if (this.pattern != null) {
String s = this.getText(0, this.getLength());
Matcher m = this.pattern.matcher(s + str);
if (m.matches())
super.insertString(offs, str, a);
} else {
// //
StringBuffer sb = new StringBuffer();
for (int i = 0; i < str.length(); i++)
if (this.valid_characters == null || this.valid_characters.indexOf(str.charAt(i)) != -1)
sb.append(str.charAt(i));
else
Toolkit.getDefaultToolkit().beep();
super.insertString(offs, sb.toString(), a);
}
}
/**
* Sets the valid characters.
*
* @param valid_chars
* The valid characters to set.
*/
protected void setValidCharacters(String valid_chars) {
this.valid_characters = valid_chars;
}
/**
* Sets the regular expression pattern.
*
* @param pattern
* The regular expression pattern to set.
*/
protected void setPattern(String pattern) {
this.pattern = Pattern.compile(pattern);
}
}