001: /* ===========================================================
002: * JFreeChart : a free chart library for the Java(tm) platform
003: * ===========================================================
004: *
005: * (C) Copyright 2000-2006, 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: * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
025: * in the United States and other countries.]
026: *
027: * ----------------------
028: * AbstractDialLayer.java
029: * ----------------------
030: * (C) Copyright 2006, by Object Refinery Limited.
031: *
032: * Original Author: David Gilbert (for Object Refinery Limited);
033: * Contributor(s): -;
034: *
035: * $Id: AbstractDialLayer.java,v 1.1.2.2 2006/11/17 11:06:44 mungady Exp $
036: *
037: * Changes
038: * -------
039: * 06-Nov-2006 : Version 1 (DG);
040: * 17-Nov-2007 : Added visible flag (DG);
041: *
042: */
043:
044: package org.jfree.experimental.chart.plot.dial;
045:
046: import java.io.IOException;
047: import java.io.ObjectInputStream;
048: import java.util.Arrays;
049: import java.util.EventListener;
050: import java.util.List;
051:
052: import javax.swing.event.EventListenerList;
053:
054: /**
055: * A base class that can be used to implement a {@link DialLayer}. It includes
056: * an event notification mechanism.
057: */
058: public abstract class AbstractDialLayer implements DialLayer {
059:
060: /** A flag that controls whether or not the layer is visible. */
061: private boolean visible;
062:
063: /** Storage for registered listeners. */
064: private transient EventListenerList listenerList;
065:
066: /**
067: * Creates a new instance.
068: */
069: protected AbstractDialLayer() {
070: this .visible = true;
071: this .listenerList = new EventListenerList();
072: }
073:
074: /**
075: * Returns <code>true</code> if this layer is visible (should be displayed),
076: * and <code>false</code> otherwise.
077: *
078: * @return A boolean.
079: */
080: public boolean isVisible() {
081: return this .visible;
082: }
083:
084: /**
085: * Sets the flag that determines whether or not this layer is drawn by
086: * the plot, and sends a {@link DialLayerChangeEvent} to all registered
087: * listeners.
088: *
089: * @param visible the flag.
090: */
091: public void setVisible(boolean visible) {
092: this .visible = visible;
093: notifyListeners(new DialLayerChangeEvent(this ));
094: }
095:
096: /**
097: * Registers an object for notification of changes to the dial layer.
098: *
099: * @param listener the object that is being registered.
100: *
101: * @see #removeChangeListener(DialLayerChangeListener)
102: */
103: public void addChangeListener(DialLayerChangeListener listener) {
104: this .listenerList.add(DialLayerChangeListener.class, listener);
105: }
106:
107: /**
108: * Deregisters an object for notification of changes to the dial layer.
109: *
110: * @param listener the object to deregister.
111: *
112: * @see #addChangeListener(DialLayerChangeListener)
113: */
114: public void removeChangeListener(DialLayerChangeListener listener) {
115: this .listenerList.remove(DialLayerChangeListener.class,
116: listener);
117: }
118:
119: /**
120: * Returns <code>true</code> if the specified object is registered with
121: * the dataset as a listener. Most applications won't need to call this
122: * method, it exists mainly for use by unit testing code.
123: *
124: * @param listener the listener.
125: *
126: * @return A boolean.
127: */
128: public boolean hasListener(EventListener listener) {
129: List list = Arrays.asList(this .listenerList.getListenerList());
130: return list.contains(listener);
131: }
132:
133: /**
134: * Notifies all registered listeners that the dial layer has changed.
135: * The {@link DialLayerChangeEvent} provides information about the change.
136: *
137: * @param event information about the change to the axis.
138: */
139: protected void notifyListeners(DialLayerChangeEvent event) {
140: Object[] listeners = this .listenerList.getListenerList();
141: for (int i = listeners.length - 2; i >= 0; i -= 2) {
142: if (listeners[i] == DialLayerChangeListener.class) {
143: ((DialLayerChangeListener) listeners[i + 1])
144: .dialLayerChanged(event);
145: }
146: }
147: }
148:
149: /**
150: * Provides serialization support.
151: *
152: * @param stream the input stream.
153: */
154: private void readObject(ObjectInputStream stream)
155: throws IOException, ClassNotFoundException {
156: stream.defaultReadObject();
157: this .listenerList = new EventListenerList();
158: }
159:
160: }
|