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