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: * ShowElementByNameFunction.java
027: * ------------
028: * (C) Copyright 2001-2007, by Object Refinery Ltd, Pentaho Corporation and Contributors.
029: */package org.jfree.report.function;
030:
031: import java.util.ArrayList;
032: import java.util.Arrays;
033:
034: import org.jfree.report.Band;
035: import org.jfree.report.Element;
036: import org.jfree.util.ObjectUtilities;
037:
038: /**
039: * This function hiddes the elements with the name specified in the 'element'
040: * parameter, if the given field has one of the values specified in the
041: * values array.
042: *
043: * @author Thomas Morgner
044: */
045: public class ShowElementByNameFunction extends
046: AbstractElementFormatFunction {
047: /** The field from where to read the compare value. */
048: private String field;
049: /** The list of values. */
050: private ArrayList values;
051:
052: /**
053: * Default Constructor.
054: */
055: public ShowElementByNameFunction() {
056: values = new ArrayList();
057: }
058:
059: /**
060: * Returns the name of the field from where the compare value is read.
061: *
062: * @return the name of the field.
063: */
064: public String getField() {
065: return field;
066: }
067:
068: /**
069: * Defines the name of the field from where the compare value is read.
070: *
071: * @param field the name of the field.
072: */
073: public void setField(final String field) {
074: this .field = field;
075: }
076:
077: /**
078: * Defines one of the values that hide the element. This defines the value at the given index in the
079: * list.
080: *
081: * @param value the compare value.
082: * @param index the position in the list of all values.
083: */
084: public void setValues(final int index, final Object value) {
085: if (values.size() == index) {
086: values.add(value);
087: } else {
088: values.set(index, value);
089: }
090: }
091:
092: /**
093: * Returns one of the values that hide the element. This returns the defined value at the given index in the
094: * list.
095: *
096: * @param index the position in the list of all values.
097: * @return the value at the given position.
098: */
099: public Object getValues(final int index) {
100: return values.get(index);
101: }
102:
103: /**
104: * Returns all known compare values as array.
105: *
106: * @return the values as array.
107: */
108: public Object[] getValues() {
109: return values.toArray();
110: }
111:
112: /**
113: * Defines all values using the object from the value-array.
114: *
115: * @param values the new list of compare values.
116: */
117: public void setValues(final Object[] values) {
118: this .values.clear();
119: this .values.addAll(Arrays.asList(values));
120: }
121:
122: /**
123: * Returns the number of values in the compare list.
124: * @return the number of values.
125: */
126: public int getValuesCount() {
127: return this .values.size();
128: }
129:
130: /**
131: * Processes the root-band. This updates the visibility of all elements with the name specified in the
132: * 'element' property if the value read from the field matches one of the specified compare values.
133: *
134: * @param b the root band.
135: */
136: protected void processRootBand(final Band b) {
137: // show, if the value in the field is not equal to the element's name.
138: // this is the opposite of the HideElementByName function.
139: final boolean visible = isVisible();
140: final Element[] elements = FunctionUtilities.findAllElements(b,
141: getElement());
142: for (int i = 0; i < elements.length; i++) {
143: final Element element = elements[i];
144: element.setVisible(visible);
145: }
146: }
147:
148: /**
149: * Computes the visiblity.
150: *
151: * @return true, if the field value matches, false otherwise.
152: */
153: private boolean isVisible() {
154: final Object fieldValue = getDataRow().get(getField());
155: for (int i = 0; i < values.size(); i++) {
156: final Object o = values.get(i);
157: if (ObjectUtilities.equal(fieldValue, o)) {
158: return false;
159: }
160: }
161: return true;
162: }
163:
164: /**
165: * Return a completly separated copy of this function. The copy does no longer share any changeable objects with the
166: * original function.
167: *
168: * @return a copy of this function.
169: */
170: public Expression getInstance() {
171: final ShowElementByNameFunction ex = (ShowElementByNameFunction) super
172: .getInstance();
173: ex.values = (ArrayList) values.clone();
174: return ex;
175: }
176:
177: }
|