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: * StyleKeyReferenceTableModel.java
027: * ------------
028: * (C) Copyright 2001-2007, by Object Refinery Ltd, Pentaho Corporation and Contributors.
029: */package org.jfree.report.modules.misc.referencedoc;
030:
031: import java.util.ArrayList;
032: import java.util.Collections;
033: import java.util.Iterator;
034: import javax.swing.table.AbstractTableModel;
035:
036: import org.jfree.report.modules.parser.ext.factory.stylekey.StyleKeyFactory;
037: import org.jfree.report.modules.parser.ext.factory.stylekey.StyleKeyFactoryCollector;
038: import org.jfree.report.style.StyleKey;
039:
040: /**
041: * A table model for the style key reference generator.
042: *
043: * @author Thomas Morgner
044: */
045: public class StyleKeyReferenceTableModel extends AbstractTableModel {
046: /**
047: * Represents a row in the table model.
048: */
049: private static class StylekeyDescriptionRow {
050: /**
051: * The factory.
052: */
053: private final StyleKeyFactory keyFactory;
054:
055: /**
056: * The key.
057: */
058: private final StyleKey key;
059:
060: /**
061: * Creates a new row.
062: *
063: * @param keyFactory the factory.
064: * @param key the key.
065: */
066: public StylekeyDescriptionRow(final StyleKeyFactory keyFactory,
067: final StyleKey key) {
068: this .keyFactory = keyFactory;
069: this .key = key;
070: }
071:
072: /**
073: * Returns the factory.
074: *
075: * @return The factory.
076: */
077: public StyleKeyFactory getKeyFactory() {
078: return keyFactory;
079: }
080:
081: /**
082: * Returns the key.
083: *
084: * @return The key.
085: */
086: public StyleKey getKey() {
087: return key;
088: }
089: }
090:
091: /**
092: * The column names.
093: */
094: private static final String[] COLUMN_NAMES = { "stylekey-factory", //$NON-NLS-1$
095: "key-name", //$NON-NLS-1$
096: "key-class", //$NON-NLS-1$
097: "inherit", //$NON-NLS-1$
098: "transient" //$NON-NLS-1$
099: };
100:
101: /**
102: * Storage for the rows.
103: */
104: private final ArrayList rows;
105:
106: /**
107: * Creates a new table model.
108: *
109: * @param cf the factory collection.
110: */
111: public StyleKeyReferenceTableModel(final StyleKeyFactoryCollector cf) {
112: rows = new ArrayList();
113: addStyleKeyFactoryCollector(cf);
114: }
115:
116: /**
117: * Adds a factory.
118: *
119: * @param cf the factory.
120: */
121: private void addStyleKeyFactoryCollector(
122: final StyleKeyFactoryCollector cf) {
123: final Iterator it = cf.getFactories();
124: while (it.hasNext()) {
125: final StyleKeyFactory cfact = (StyleKeyFactory) it.next();
126: if (cfact instanceof StyleKeyFactoryCollector) {
127: addStyleKeyFactoryCollector((StyleKeyFactoryCollector) cfact);
128: } else {
129: addStyleKeyFactory(cfact);
130: }
131: }
132: }
133:
134: /**
135: * Adds a factory.
136: *
137: * @param cf the factory.
138: */
139: private void addStyleKeyFactory(final StyleKeyFactory cf) {
140: Iterator it = cf.getRegisteredKeys();
141: final ArrayList factories = new ArrayList();
142:
143: while (it.hasNext()) {
144: final String c = (String) it.next();
145: factories.add(c);
146: }
147:
148: Collections.sort(factories);
149: it = factories.iterator();
150:
151: while (it.hasNext()) {
152: final String keyName = (String) it.next();
153: final StyleKey key = cf.getStyleKey(keyName);
154: rows.add(new StylekeyDescriptionRow(cf, key));
155: }
156: }
157:
158: /**
159: * Returns the number of rows in the model. A <code>JTable</code> uses this method to
160: * determine how many rows it should display. This method should be quick, as it is
161: * called frequently during rendering.
162: *
163: * @return the number of rows in the model
164: *
165: * @see #getColumnCount
166: */
167: public int getRowCount() {
168: return rows.size();
169: }
170:
171: /**
172: * Returns the number of columns in the model. A <code>JTable</code> uses this method to
173: * determine how many columns it should create and display by default.
174: *
175: * @return the number of columns in the model
176: *
177: * @see #getRowCount
178: */
179: public int getColumnCount() {
180: return COLUMN_NAMES.length;
181: }
182:
183: /**
184: * Returns the column name.
185: *
186: * @param column the column being queried
187: * @return a string containing the default name of <code>column</code>
188: */
189: public String getColumnName(final int column) {
190: return COLUMN_NAMES[column];
191: }
192:
193: /**
194: * Returns <code>String.class</code> regardless of <code>columnIndex</code>.
195: *
196: * @param columnIndex the column being queried
197: * @return the Object.class
198: */
199: public Class getColumnClass(final int columnIndex) {
200: if (columnIndex < 3) {
201: return String.class;
202: }
203:
204: return Boolean.class;
205: }
206:
207: /**
208: * Returns the value for the cell at <code>columnIndex</code> and
209: * <code>rowIndex</code>.
210: *
211: * @param rowIndex the row whose value is to be queried
212: * @param columnIndex the column whose value is to be queried
213: * @return the value Object at the specified cell
214: */
215: public Object getValueAt(final int rowIndex, final int columnIndex) {
216: final StylekeyDescriptionRow or = (StylekeyDescriptionRow) rows
217: .get(rowIndex);
218: switch (columnIndex) {
219: case 0:
220: return String.valueOf(or.getKeyFactory().getClass()
221: .getName());
222: case 1:
223: return String.valueOf(or.getKey().getName());
224: case 2:
225: return String.valueOf(or.getKey().getValueType().getName());
226: case 3:
227: return (or.getKey().isInheritable()) ? Boolean.TRUE
228: : Boolean.FALSE;
229: case 4:
230: return (or.getKey().isTransient()) ? Boolean.TRUE
231: : Boolean.FALSE;
232: default:
233: return null;
234: }
235: }
236: }
|