001/* ===========================================================
002 * JFreeChart : a free chart library for the Java(tm) platform
003 * ===========================================================
004 *
005 * (C) Copyright 2000-2013, 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 * [Oracle and Java are registered trademarks of Oracle and/or its affiliates. 
025 * Other names may be trademarks of their respective owners.]
026 *
027 * --------------------
028 * AbstractOverlay.java
029 * --------------------
030 * (C) Copyright 2009-2013, by Object Refinery Limited.
031 *
032 * Original Author:  David Gilbert (for Object Refinery Limited);
033 * Contributor(s):   -;
034 *
035 * Changes:
036 * --------
037 * 09-Apr-2009 : Version 1 (DG);
038 * 02-Jul-2013 : Use ParamChecks (DG);
039 *
040 */
041
042package org.jfree.chart.panel;
043
044import javax.swing.event.EventListenerList;
045import org.jfree.chart.ChartPanel;
046import org.jfree.chart.event.ChartChangeEvent;
047import org.jfree.chart.event.OverlayChangeEvent;
048import org.jfree.chart.event.OverlayChangeListener;
049import org.jfree.chart.util.ParamChecks;
050
051/**
052 * A base class for implementing overlays for a {@link ChartPanel}.
053 *
054 * @since 1.0.13
055 */
056public class AbstractOverlay {
057
058    /** Storage for registered change listeners. */
059    private transient EventListenerList changeListeners;
060
061    /**
062     * Default constructor.
063     */
064    public AbstractOverlay() {
065        this.changeListeners = new EventListenerList();
066    }
067
068    /**
069     * Registers an object for notification of changes to the overlay.
070     *
071     * @param listener  the listener (<code>null</code> not permitted).
072     *
073     * @see #removeChangeListener(OverlayChangeListener)
074     */
075    public void addChangeListener(OverlayChangeListener listener) {
076        ParamChecks.nullNotPermitted(listener, "listener");
077        this.changeListeners.add(OverlayChangeListener.class, listener);
078    }
079
080    /**
081     * Deregisters an object for notification of changes to the overlay.
082     *
083     * @param listener  the listener (<code>null</code> not permitted)
084     *
085     * @see #addChangeListener(OverlayChangeListener)
086     */
087    public void removeChangeListener(OverlayChangeListener listener) {
088        ParamChecks.nullNotPermitted(listener, "listener");
089        this.changeListeners.remove(OverlayChangeListener.class, listener);
090    }
091
092    /**
093     * Sends a default {@link ChartChangeEvent} to all registered listeners.
094     * <P>
095     * This method is for convenience only.
096     */
097    public void fireOverlayChanged() {
098        OverlayChangeEvent event = new OverlayChangeEvent(this);
099        notifyListeners(event);
100    }
101
102    /**
103     * Sends a {@link ChartChangeEvent} to all registered listeners.
104     *
105     * @param event  information about the event that triggered the
106     *               notification.
107     */
108    protected void notifyListeners(OverlayChangeEvent event) {
109       Object[] listeners = this.changeListeners.getListenerList();
110        for (int i = listeners.length - 2; i >= 0; i -= 2) {
111            if (listeners[i] == OverlayChangeListener.class) {
112                ((OverlayChangeListener) listeners[i + 1]).overlayChanged(
113                        event);
114            }
115        }
116    }
117
118}
119