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