001    /* ===========================================================
002     * JFreeChart : a free chart library for the Java(tm) platform
003     * ===========================================================
004     *
005     * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors.
006     *
007     * Project Info:  http://www.jfree.org/jfreechart/index.html
008     *
009     * This library is free software; you can redistribute it and/or modify it 
010     * under the terms of the GNU Lesser General Public License as published by 
011     * the Free Software Foundation; either version 2.1 of the License, or 
012     * (at your option) any later version.
013     *
014     * This library is distributed in the hope that it will be useful, but 
015     * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
016     * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 
017     * License for more details.
018     *
019     * You should have received a copy of the GNU Lesser General Public
020     * License along with this library; if not, write to the Free Software
021     * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, 
022     * USA.  
023     *
024     * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 
025     * in the United States and other countries.]
026     *
027     * -------------------------
028     * CategoryToPieDataset.java
029     * -------------------------
030     * (C) Copyright 2003-2005, by Object Refinery Limited.
031     *
032     * Original Author:  David Gilbert (for Object Refinery Limited);
033     * Contributor(s):   Christian W. Zuckschwerdt;
034     *
035     * $Id: CategoryToPieDataset.java,v 1.4.2.1 2005/10/25 21:29:58 mungady Exp $
036     *
037     * Changes
038     * -------
039     * 23-Jan-2003 : Version 1 (DG);
040     * 30-Jul-2003 : Pass through DatasetChangeEvent (CZ);
041     * 29-Jan-2004 : Replaced 'extract' int with TableOrder (DG);
042     * 11-Jan-2005 : Removed deprecated code in preparation for the 1.0.0 
043     *               release (DG);
044     *
045     */
046    
047    package org.jfree.data.category;
048    
049    import java.util.List;
050    
051    import org.jfree.data.general.AbstractDataset;
052    import org.jfree.data.general.DatasetChangeEvent;
053    import org.jfree.data.general.DatasetChangeListener;
054    import org.jfree.data.general.PieDataset;
055    import org.jfree.util.TableOrder;
056    
057    /**
058     * A {@link PieDataset} implementation that obtains its data from one row or 
059     * column of a {@link CategoryDataset}.
060     *
061     */
062    public class CategoryToPieDataset extends AbstractDataset 
063                                      implements PieDataset, DatasetChangeListener {
064    
065        /** The source. */
066        private CategoryDataset source;
067    
068        /** The extract type. */
069        private TableOrder extract;
070    
071        /** The row or column index. */
072        private int index;
073    
074        /**
075         * An adaptor class that converts any {@link CategoryDataset} into a 
076         * {@link PieDataset}, by taking the values from a single row or column.
077         *
078         * @param source  the source dataset (<code>null</code> permitted).
079         * @param extract  extract data from rows or columns? (<code>null</code> 
080         *                 not permitted).
081         * @param index  the row or column index.
082         */
083        public CategoryToPieDataset(CategoryDataset source, 
084                                    TableOrder extract, 
085                                    int index) {
086            if (extract == null) {
087                throw new IllegalArgumentException("Null 'extract' argument.");
088            }
089            this.source = source;
090            this.source.addChangeListener(this);
091            this.extract = extract;
092            this.index = index;
093        }
094    
095        /**
096         * Returns the number of items (values) in the collection.  If the 
097         * underlying dataset is <code>null</code>, this method returns zero.
098         *
099         * @return The item count.
100         */
101        public int getItemCount() {
102            int result = 0;
103            if (this.source != null) {
104                if (this.extract == TableOrder.BY_ROW) {
105                    result = this.source.getColumnCount();
106                }
107                else if (this.extract == TableOrder.BY_COLUMN) {
108                    result = this.source.getRowCount();
109                }
110            }
111            return result;
112        }
113    
114        /**
115         * Returns a value.
116         *
117         * @param item  the item index (zero-based).
118         *
119         * @return The value (possibly <code>null</code>).
120         */
121        public Number getValue(int item) {
122            Number result = null;
123            if (this.source != null) {
124                if (this.extract == TableOrder.BY_ROW) {
125                    result = this.source.getValue(this.index, item);
126                }
127                else if (this.extract == TableOrder.BY_COLUMN) {
128                    result = this.source.getValue(item, this.index);
129                }
130            }
131            return result;
132        }
133    
134        /**
135         * Returns a key.
136         *
137         * @param index  the item index (zero-based).
138         *
139         * @return The key.
140         */
141        public Comparable getKey(int index) {
142            Comparable result = null;
143            if (this.extract == TableOrder.BY_ROW) {
144                result = this.source.getColumnKey(index);
145            }
146            else if (this.extract == TableOrder.BY_COLUMN) {
147                result = this.source.getRowKey(index);
148            }
149            return result;
150        }
151    
152        /**
153         * Returns the index for a given key.
154         *
155         * @param key  the key.
156         *
157         * @return The index.
158         */
159        public int getIndex(Comparable key) {
160            int result = -1;
161            if (this.extract == TableOrder.BY_ROW) {
162                result = this.source.getColumnIndex(key);
163            }
164            else if (this.extract == TableOrder.BY_COLUMN) {
165                result = this.source.getRowIndex(key);
166            }
167            return result;
168        }
169    
170        /**
171         * Returns the keys.
172         *
173         * @return The keys.
174         */
175        public List getKeys() {
176            List result = null;
177            if (this.extract == TableOrder.BY_ROW) {
178                result = this.source.getColumnKeys();
179            }
180            else if (this.extract == TableOrder.BY_COLUMN) {
181                result = this.source.getRowKeys();
182            }
183            return result;
184        }
185    
186        /**
187         * Returns the value for a given key.  If the key is not recognised, the 
188         * method should return <code>null</code> (but note that <code>null</code> 
189         * can be associated with a valid key also).
190         *
191         * @param key  the key.
192         *
193         * @return The value (possibly <code>null</code>).
194         */
195        public Number getValue(Comparable key) {
196            Number result = null;
197            int keyIndex = getIndex(key);
198            if (this.extract == TableOrder.BY_ROW) {
199                result = this.source.getValue(this.index, keyIndex);
200            }
201            else if (this.extract == TableOrder.BY_COLUMN) {
202                result = this.source.getValue(keyIndex, this.index);
203            }
204            return result;
205        }
206        
207        /**
208         * Passes the {@link DatasetChangeEvent} through.
209         * 
210         * @param event  the event.
211         */
212        public void datasetChanged (DatasetChangeEvent event) {
213            fireDatasetChanged();
214        }
215         
216    }