001: /*
002: * Copyright (C) 2005 - 2008 JasperSoft Corporation. All rights reserved.
003: * http://www.jaspersoft.com.
004: *
005: * Unless you have purchased a commercial license agreement from JasperSoft,
006: * the following license terms apply:
007: *
008: * This program is free software; you can redistribute it and/or modify
009: * it under the terms of the GNU General Public License version 2 as published by
010: * the Free Software Foundation.
011: *
012: * This program is distributed WITHOUT ANY WARRANTY; and without the
013: * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
014: * See the GNU General Public License for more details.
015: *
016: * You should have received a copy of the GNU General Public License
017: * along with this program; if not, see http://www.gnu.org/licenses/gpl.txt
018: * or write to:
019: *
020: * Free Software Foundation, Inc.,
021: * 59 Temple Place - Suite 330,
022: * Boston, MA USA 02111-1307
023: *
024: *
025: *
026: *
027: * NumberDocument.java
028: *
029: * Created on 10 febbraio 2003, 0.17
030: *
031: */
032:
033: package it.businesslogic.ireport.gui;
034:
035: import it.businesslogic.ireport.gui.event.ValueChangedEvent;
036: import it.businesslogic.ireport.util.Misc;
037: import javax.swing.text.*;
038: import java.text.*;
039:
040: /**
041: *
042: * @author Administrator
043: */
044: public class NumberDocument extends javax.swing.text.PlainDocument {
045: private char groupingSeparator = ',';
046: private char decimalSeparator = '.';
047:
048: private double value = 0;
049:
050: /** Creates a new instance of NumberDocument */
051: public NumberDocument() {
052:
053: DecimalFormatSymbols dfs = new DecimalFormatSymbols();
054: groupingSeparator = dfs.getGroupingSeparator();
055: decimalSeparator = dfs.getDecimalSeparator();
056: }
057:
058: public boolean checkNumber(String proposedResult) {
059: // We allow the use of comma like . if no decimalSeparator is present...
060: if (groupingSeparator == '.'
061: && proposedResult.indexOf(decimalSeparator) < 0) {
062: //proposedResult = proposedResult.replace(groupingSeparator, '.');
063: } else {
064: proposedResult = Misc.string_replace("", ""
065: + groupingSeparator, proposedResult);
066: }
067: proposedResult = proposedResult.replace(decimalSeparator, '.');
068:
069: try {
070: //Number n = format.parse(proposedResult);
071: if (proposedResult.trim().length() == 0)
072: return true;
073:
074: double oldValue = getValue();
075:
076: double newValue = 0;
077: if (proposedResult.length() > 0)
078: newValue = Double.parseDouble(proposedResult);
079:
080: fireValueChangedListenerValueChanged(new ValueChangedEvent(
081: null, oldValue, newValue));
082:
083: return true;
084: } catch (NumberFormatException e) {
085: //System.err.println("insertString: could not parse: "
086: // + proposedResult);
087: }
088: return false;
089: }
090:
091: /** Inserts some content into the document.
092: * Inserting content causes a write lock to be held while the
093: * actual changes are taking place, followed by notification
094: * to the observers on the thread that grabbed the write lock.
095: * <p>
096: * This method is thread safe, although most Swing methods
097: * are not. Please see
098: * <A HREF="http://java.sun.com/products/jfc/swingdoc-archive/threads.html">Threads
099: * and Swing</A> for more information.
100: *
101: * @param offs the starting offset >= 0
102: * @param str the string to insert; does nothing with null/empty strings
103: * @param a the attributes for the inserted content
104: * @exception BadLocationException the given insert position is not a valid
105: * position within the document
106: * @see Document#insertString
107: *
108: */
109: public void insertString(int offs, String str, AttributeSet a)
110: throws BadLocationException {
111:
112: if (str == null || str.length() == 0) {
113: super .insertString(offs, str, a);
114: return;
115: }
116: String currentText = getText(0, getLength());
117: String beforeOffset = currentText.substring(0, offs);
118: String afterOffset = currentText.substring(offs, currentText
119: .length());
120: String proposedResult = beforeOffset + str + afterOffset;
121: if (checkNumber(proposedResult)) {
122: super .insertString(offs, str, a);
123: }
124: }
125:
126: public void remove(int offs, int len) throws BadLocationException {
127:
128: String currentText = getText(0, getLength());
129: String beforeOffset = currentText.substring(0, offs);
130: String afterOffset = currentText.substring(len + offs,
131: currentText.length());
132: String proposedResult = beforeOffset + afterOffset;
133: if (checkNumber(proposedResult)) {
134: super .remove(offs, len);
135: }
136: }
137:
138: public void replace(int offset, int length, String str,
139: AttributeSet attrs) throws BadLocationException {
140:
141: if (str == null || str.length() == 0) {
142: super .replace(offset, length, str, attrs);
143: return;
144: }
145:
146: String currentText = getText(0, getLength());
147: String beforeOffset = currentText.substring(0, offset);
148: String afterOffset = currentText.substring(length + offset,
149: currentText.length());
150: String proposedResult = beforeOffset + str + afterOffset;
151:
152: if (checkNumber(proposedResult)) {
153: super .replace(offset, length, str, attrs);
154: }
155: }
156:
157: public double getValue() {
158: return value;
159: }
160:
161: public void setValue(double value) {
162: this .value = value;
163: }
164:
165: /**
166: * Utility field used by event firing mechanism.
167: */
168: private javax.swing.event.EventListenerList listenerList = null;
169:
170: /**
171: * Registers ValueChangedListener to receive events.
172: * @param listener The listener to register.
173: */
174: public synchronized void addValueChangedListener(
175: it.businesslogic.ireport.gui.event.ValueChangedListener listener) {
176:
177: if (listenerList == null) {
178: listenerList = new javax.swing.event.EventListenerList();
179: }
180: listenerList
181: .add(
182: it.businesslogic.ireport.gui.event.ValueChangedListener.class,
183: listener);
184: }
185:
186: /**
187: * Removes ValueChangedListener from the list of listeners.
188: * @param listener The listener to remove.
189: */
190: public synchronized void removeValueChangedListener(
191: it.businesslogic.ireport.gui.event.ValueChangedListener listener) {
192:
193: listenerList
194: .remove(
195: it.businesslogic.ireport.gui.event.ValueChangedListener.class,
196: listener);
197: }
198:
199: /**
200: * Notifies all registered listeners about the event.
201: *
202: * @param event The event to be fired
203: */
204: private void fireValueChangedListenerValueChanged(
205: it.businesslogic.ireport.gui.event.ValueChangedEvent event) {
206:
207: if (listenerList == null)
208: return;
209: Object[] listeners = listenerList.getListenerList();
210: for (int i = listeners.length - 2; i >= 0; i -= 2) {
211: if (listeners[i] == it.businesslogic.ireport.gui.event.ValueChangedListener.class) {
212: ((it.businesslogic.ireport.gui.event.ValueChangedListener) listeners[i + 1])
213: .valueChanged(event);
214: }
215: }
216: }
217:
218: }
|