    001/* ========================================================================
    002 * JCommon : a free general purpose class library for the Java(tm) platform
    003 * ========================================================================
    004 *
    005 * (C) Copyright 2000-2008, by Object Refinery Limited and Contributors.
    006 *
    007 * Project Info:  http://www.jfree.org/jcommon/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 * ShapeList.java
    029 * --------------
    030 * (C) Copyright 2003-2008, by Object Refinery Limited.
    031 *
    032 * Original Author:  David Gilbert (for Object Refinery Limited);
    033 * Contributor(s):   -;
    034 *
    035 * $Id: ShapeList.java,v 1.5 2008/06/17 08:26:05 mungady Exp $
    036 *
    037 * Changes
    038 * -------
    039 * 13-Aug-2003 : Version 1 (DG);
    040 * 17-Jun-2008 : Fixed bug in equals() (DG);
    041 *
    042 */
    043
    044package org.jfree.util;
    045
    046import java.awt.Shape;
    047import java.io.IOException;
    048import java.io.ObjectInputStream;
    049import java.io.ObjectOutputStream;
    050
    051import org.jfree.io.SerialUtilities;
    052
    053
    054/**
    055 * A table of {@link Shape} objects.
    056 */
    057public class ShapeList extends AbstractObjectList {
    058
    059    /**
    060     * Creates a new list.
    061     */
    062    public ShapeList() {
    063        super();
    064    }
    065
    066    /**
    067     * Returns a {@link Shape} object from the list.
    068     *
    069     * @param index the index (zero-based).
    070     *
    071     * @return The object.
    072     */
    073    public Shape getShape(final int index) {
    074        return (Shape) get(index);
    075    }
    076
    077    /**
    078     * Sets the {@link Shape} for an item in the list.  The list is expanded
    079     * if necessary.
    080     *
    081     * @param index  the index (zero-based).
    082     * @param shape  the {@link Shape}.
    083     */
    084    public void setShape(final int index, final Shape shape) {
    085        set(index, shape);
    086    }
    087
    088    /**
    089     * Returns an independent copy of the list.
    090     *
    091     * @return A clone.
    092     *
    093     * @throws CloneNotSupportedException if an item in the list does not
    094     *         support cloning.
    095     */
    096    public Object clone() throws CloneNotSupportedException {
    097        return super.clone();
    098    }
    099
    100    /**
    101     * Tests the list for equality with another object (typically also a list).
    102     *
    103     * @param obj  the other object (<code>null</code> permitted).
    104     *
    105     * @return A boolean.
    106     */
    107    public boolean equals(Object obj) {
    108
    109        if (obj == this) {
    110            return true;
    111        }
    112        if (!(obj instanceof ShapeList)) {
    113            return false;
    114        }
    115        ShapeList that = (ShapeList) obj;
    116        int listSize = size();
    117        for (int i = 0; i < listSize; i++) {
    118           if (!ShapeUtilities.equal((Shape) get(i), (Shape) that.get(i))) {
    119               return false;
    120           }
    121        }
    122        return true;
    123
    124    }
    125
    126    /**
    127     * Returns a hash code value for the object.
    128     *
    129     * @return the hashcode
    130     */
    131    public int hashCode() {
    132        return super.hashCode();
    133    }
    134
    135    /**
    136     * Provides serialization support.
    137     *
    138     * @param stream  the output stream.
    139     *
    140     * @throws IOException  if there is an I/O error.
    141     */
    142    private void writeObject(final ObjectOutputStream stream) throws IOException {
    143
    144        stream.defaultWriteObject();
    145        final int count = size();
    146        stream.writeInt(count);
    147        for (int i = 0; i < count; i++) {
    148            final Shape shape = getShape(i);
    149            if (shape != null) {
    150                stream.writeInt(i);
    151                SerialUtilities.writeShape(shape, stream);
    152            }
    153            else {
    154                stream.writeInt(-1);
    155            }
    156        }
    157
    158    }
    159
    160    /**
    161     * Provides serialization support.
    162     *
    163     * @param stream  the input stream.
    164     *
    165     * @throws IOException  if there is an I/O error.
    166     * @throws ClassNotFoundException  if there is a classpath problem.
    167     */
    168    private void readObject(final ObjectInputStream stream) throws IOException, ClassNotFoundException {
    169
    170        stream.defaultReadObject();
    171        final int count = stream.readInt();
    172        for (int i = 0; i < count; i++) {
    173            final int index = stream.readInt();
    174            if (index != -1) {
    175                setShape(index, SerialUtilities.readShape(stream));
    176            }
    177        }
    178
    179    }
    180
    181}
    182