001: /**
002: * ===========================================
003: * JFreeReport : a free Java reporting library
004: * ===========================================
005: *
006: * Project Info: http://reporting.pentaho.org/
007: *
008: * (C) Copyright 2001-2007, by Object Refinery Ltd, Pentaho Corporation and Contributors.
009: *
010: * This library is free software; you can redistribute it and/or modify it under the terms
011: * of the GNU Lesser General Public License as published by the Free Software Foundation;
012: * either version 2.1 of the License, or (at your option) any later version.
013: *
014: * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
015: * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
016: * See the GNU Lesser General Public License for more details.
017: *
018: * You should have received a copy of the GNU Lesser General Public License along with this
019: * library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
020: * Boston, MA 02111-1307, USA.
021: *
022: * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
023: * in the United States and other countries.]
024: *
025: * ------------
026: * DecimalFormatFilter.java
027: * ------------
028: * (C) Copyright 2001-2007, by Object Refinery Ltd, Pentaho Corporation and Contributors.
029: */package org.jfree.report.filter;
030:
031: import java.text.DecimalFormat;
032: import java.text.DecimalFormatSymbols;
033: import java.text.Format;
034: import java.util.Locale;
035:
036: import org.jfree.report.function.ExpressionRuntime;
037:
038: /**
039: * A filter that formats the numeric value from a data source to a string representation
040: * using the decimal number system as base.
041: * <p/>
042: * This filter will format java.lang.Number objects using a java.text.DecimalFormat to
043: * create the string representation for the date obtained from the datasource.
044: * <p/>
045: * If the object read from the datasource is no date, the NullValue defined by
046: * setNullValue(Object) is returned.
047: *
048: * @author Thomas Morgner
049: * @see java.text.NumberFormat
050: * @see java.lang.Number
051: */
052: public class DecimalFormatFilter extends NumberFormatFilter {
053: /** The last locale used to convert numbers. */
054: private Locale lastLocale;
055: /** A flag indicating whether this filter should try to detect locales changes. */
056: private boolean keepState;
057:
058: /**
059: * DefaultConstructor, this object is initialized using a DecimalFormat with the default
060: * pattern for this locale.
061: */
062: public DecimalFormatFilter() {
063: setFormatter(new DecimalFormat());
064: }
065:
066: /**
067: * Returns the format for the filter. The DecimalFormatParser has only DecimalFormat
068: * objects assigned.
069: *
070: * @return the formatter.
071: *
072: * @throws NullPointerException if the given format is null
073: */
074: public DecimalFormat getDecimalFormat() {
075: return (DecimalFormat) getFormatter();
076: }
077:
078: /**
079: * Sets the format for the filter.
080: *
081: * @param format the format.
082: * @throws NullPointerException if the given format is null
083: */
084: public void setDecimalFormat(final DecimalFormat format) {
085: setFormatter(format);
086: }
087:
088: /**
089: * Sets the format for the filter. If the given format is no Decimal format, a
090: * ClassCastException is thrown
091: *
092: * @param format the format.
093: * @throws NullPointerException if the given format is null
094: * @throws ClassCastException if the format is no decimal format
095: */
096: public void setFormatter(final Format format) {
097: final DecimalFormat dfmt = (DecimalFormat) format;
098: super .setFormatter(dfmt);
099: }
100:
101: /**
102: * Synthesizes a pattern string that represents the current state of this Format
103: * object.
104: *
105: * @return the pattern string of the format object contained in this filter.
106: */
107: public String getFormatString() {
108: return getDecimalFormat().toPattern();
109: }
110:
111: /**
112: * Applies a format string to the internal <code>DecimalFormat</code> instance.
113: *
114: * @param format the format string.
115: */
116: public void setFormatString(final String format) {
117: getDecimalFormat().applyPattern(format);
118: invalidateCache();
119: }
120:
121: /**
122: * Synthesizes a localized pattern string that represents the current state of this
123: * Format object.
124: *
125: * @return the localized pattern string of the format-object.
126: */
127: public String getLocalizedFormatString() {
128: return getDecimalFormat().toLocalizedPattern();
129: }
130:
131: /**
132: * Applies a localised format string to the internal <code>DecimalFormat</code>
133: * instance.
134: *
135: * @param format the format string.
136: */
137: public void setLocalizedFormatString(final String format) {
138: getDecimalFormat().applyLocalizedPattern(format);
139: invalidateCache();
140: }
141:
142: /**
143: * Defines, whether the filter should keep its state, if a locale
144: * change is detected. This will effectivly disable the locale update.
145: *
146: * @return true, if the locale should not update the DateSymbols, false otherwise.
147: */
148: public boolean isKeepState() {
149: return keepState;
150: }
151:
152: /**
153: * Defines, whether the filter should keep its state, if a locale
154: * change is detected. This will effectivly disable the locale update.
155: *
156: * @param keepState set to true, if the locale should not update the DateSymbols, false otherwise.
157: */
158: public void setKeepState(final boolean keepState) {
159: this .keepState = keepState;
160: }
161:
162: /**
163: * Returns the formatted string. The value is read using the data source given and
164: * formated using the formatter of this object. The formating is guaranteed to completly
165: * form the object to an string or to return the defined NullValue.
166: * <p/>
167: * If format, datasource or object are null, the NullValue is returned.
168: *
169: * @param runtime the expression runtime that is used to evaluate formulas and expressions when computing the value of
170: * this filter.
171: * @return The formatted value.
172: */
173: public Object getValue(final ExpressionRuntime runtime) {
174: if (keepState == false && runtime != null) {
175: final Locale locale = runtime.getResourceBundleFactory()
176: .getLocale();
177: if (locale != lastLocale) {
178: lastLocale = locale;
179: getDecimalFormat().setDecimalFormatSymbols(
180: new DecimalFormatSymbols(locale));
181: invalidateCache();
182: }
183: }
184: return super .getValue(runtime);
185: }
186:
187: public FormatSpecification getFormatString(
188: final ExpressionRuntime runtime,
189: FormatSpecification formatSpecification) {
190: if (formatSpecification == null) {
191: formatSpecification = new FormatSpecification();
192: }
193: formatSpecification.redefine(
194: FormatSpecification.TYPE_DECIMAL_FORMAT,
195: getFormatString());
196: return formatSpecification;
197: }
198:
199: }
|