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     * GradientPaintReadHandler
029     * ------------------------
030     * (C) Copyright 2003, by Thomas Morgner and Contributors.
031     *
032     * Original Author:  Thomas Morgner;
033     * Contributor(s):   David Gilbert (for Object Refinery Limited);
034     *
035     * $Id: GradientPaintReadHandler.java,v 1.2 2005/10/18 13:33:32 mungady Exp $
036     *
037     * Changes (from 25-Nov-2003)
038     * --------------------------
039     * 25-Nov-2003 : Added standard header and Javadocs (DG);
040     *
041     */
042    
043    package org.jfree.xml.parser.coretypes;
044    
045    import java.awt.Color;
046    import java.awt.GradientPaint;
047    import java.awt.geom.Point2D;
048    
049    import org.jfree.xml.parser.AbstractXmlReadHandler;
050    import org.jfree.xml.parser.XmlReadHandler;
051    import org.jfree.xml.parser.XmlReaderException;
052    import org.xml.sax.Attributes;
053    import org.xml.sax.SAXException;
054    
055    /**
056     * A SAX handler for reading a {@link GradientPaint} from an XML element.
057     */
058    public class GradientPaintReadHandler extends AbstractXmlReadHandler  {
059    
060        /** The gradient paint under construction. */
061        private GradientPaint gradient;
062    
063        /** The handler for color 1. */
064        private XmlReadHandler color1Handler;
065    
066        /** The handler for color 2. */
067        private XmlReadHandler color2Handler;
068    
069        /** The handler for point 1. */
070        private XmlReadHandler point1Handler;
071    
072        /** The handler for point 2. */
073        private XmlReadHandler point2Handler;
074    
075        /**
076         * Creates a new handler.
077         */
078        public GradientPaintReadHandler() {
079            super();
080        }
081    
082        /**
083         * Returns the gradient paint under construction.
084         * 
085         * @return the gradient paint.
086         */
087        public Object getObject() {
088            return this.gradient;
089        }
090    
091        /**
092         * Returns the handler for a child element.
093         * 
094         * @param tagName  the tag name.
095         * @param atts  the attributes.
096         * 
097         * @return the handler.
098         * @throws SAXException to indicate a parsing error.
099         * @throws XmlReaderException if there is a reader error.
100         */
101        protected XmlReadHandler getHandlerForChild(final String tagName, final Attributes atts)
102            throws SAXException, XmlReaderException {
103            if ("color1".equals(tagName)) {
104                this.color1Handler = getRootHandler().createHandler(Color.class, tagName, atts);
105                return this.color1Handler;
106            }
107            else if ("color2".equals(tagName)) {
108                this.color2Handler = getRootHandler().createHandler(Color.class, tagName, atts);
109                return this.color2Handler;
110            }
111            else if ("point1".equals(tagName)) {
112                this.point1Handler = getRootHandler().createHandler(Point2D.class, tagName, atts);
113                return this.point1Handler;
114            }
115            else if ("point2".equals(tagName)) {
116                this.point2Handler = getRootHandler().createHandler(Point2D.class, tagName, atts);
117                return this.point2Handler;
118            }
119            return null;
120        }
121    
122        /**
123         * At the end of parsing the element, the gradient paint is constructed.
124         * 
125         * @throws XmlReaderException if there is a parsing error.
126         */
127        protected void doneParsing() throws XmlReaderException {
128            if (this.point1Handler == null || this.point2Handler == null 
129                || this.color1Handler == null || this.color2Handler == null) {
130                throw new XmlReaderException("Not all required subelements are defined.");
131            }
132            this.gradient = new GradientPaint
133                ((Point2D) this.point1Handler.getObject(),
134                (Color) this.color1Handler.getObject(),
135                (Point2D) this.point2Handler.getObject(),
136                (Color) this.color2Handler.getObject());
137        }
138    
139    }