001: /*
002: * GeoTools - OpenSource mapping toolkit
003: * http://geotools.org
004: * (C) 2005-2006, Geotools Project Managment Committee (PMC)
005: * (C) 2005, Institut de Recherche pour le Développement
006: *
007: * This library is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU Lesser General Public
009: * License as published by the Free Software Foundation; either
010: * version 2.1 of the License, or (at your option) any later version.
011: *
012: * This library is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: */
017: package org.geotools.image.io;
018:
019: // J2SE dependencies
020: import java.io.Serializable;
021: import java.util.EventListener;
022: import javax.swing.event.EventListenerList;
023: import javax.imageio.ImageReader;
024: import javax.imageio.event.IIOReadWarningListener;
025: import javax.imageio.event.IIOReadProgressListener;
026:
027: // Geotools dependencies
028: import org.geotools.resources.XArray;
029:
030: /**
031: * A container of image I/O listeners. This class provides a set of {@code addFooListener(...)}
032: * and {@code removeFooListener(...)} methods for adding and removing various listeners, and a
033: * {@code addListenersTo(...)} method for copying listeners to the an image reader. This class is
034: * convenient when {@code ImageReader.addFooListener(...)} can't be invoked directly because the
035: * {@link ImageReader} instance is not yet know or available.
036: *
037: * @since 2.1
038: * @source $URL: http://svn.geotools.org/geotools/tags/2.4.1/modules/library/coverage/src/main/java/org/geotools/image/io/IIOListeners.java $
039: * @version $Id: IIOListeners.java 20970 2006-08-11 07:53:22Z jgarnett $
040: * @author Martin Desruisseaux
041: *
042: * @todo Add other listener types.
043: */
044: public class IIOListeners implements Serializable {
045: /**
046: * For compatibility with different versions.
047: */
048: private static final long serialVersionUID = 6944397966242054247L;
049:
050: /**
051: * The listener categories for read operations.
052: */
053: private static final Class[] READ = {
054: IIOReadProgressListener.class, IIOReadWarningListener.class };
055:
056: /**
057: * List of listeners.
058: */
059: private final EventListenerList listeners = new EventListenerList();
060:
061: /**
062: * Creates a new instance of {@code IIOListeners}.
063: */
064: public IIOListeners() {
065: }
066:
067: /**
068: * Adds an {@code IIOReadProgressListener} to the list of registered progress listeners.
069: */
070: public void addIIOReadProgressListener(
071: final IIOReadProgressListener listener) {
072: listeners.add(IIOReadProgressListener.class, listener);
073: }
074:
075: /**
076: * Removes an {@code IIOReadProgressListener} from the list of registered progress listeners.
077: */
078: public void removeIIOReadProgressListener(
079: final IIOReadProgressListener listener) {
080: listeners.remove(IIOReadProgressListener.class, listener);
081: }
082:
083: /**
084: * Adds an {@code IIOReadWarningListener} to the list of registered warning listeners.
085: */
086: public void addIIOReadWarningListener(
087: final IIOReadWarningListener listener) {
088: listeners.add(IIOReadWarningListener.class, listener);
089: }
090:
091: /**
092: * Removes an {@code IIOReadWarningListener} from the list of registered warning listeners.
093: */
094: public void removeIIOReadWarningListener(
095: final IIOReadWarningListener listener) {
096: listeners.remove(IIOReadWarningListener.class, listener);
097: }
098:
099: /**
100: * Returns all {@linkplain IIOReadProgressListener read progress} and
101: * {@linkplain IIOReadWarningListener read warning} listeners.
102: */
103: public EventListener[] getReadListeners() {
104: return getListeners(READ);
105: }
106:
107: /**
108: * Returns all listeners of the given classes.
109: */
110: private EventListener[] getListeners(final Class[] categories) {
111: int count = 0;
112: final Object[] list = listeners.getListenerList();
113: final EventListener[] listeners = new EventListener[list.length / 2];
114: add: for (int i = 0; i < list.length; i += 2) {
115: final Class type = (Class) list[i];
116: for (int j = categories.length; --j >= 0;) {
117: if (type.equals(categories[i])) {
118: /*
119: * Found a listener in one of the specified categories.
120: * Ensure that it was not already added in the list.
121: */
122: final EventListener candidate = (EventListener) list[i + 1];
123: for (int k = count; --k >= 0;) {
124: if (listeners[k] == candidate) {
125: // Avoid duplication.
126: continue add;
127: }
128: }
129: listeners[count++] = candidate;
130: continue add;
131: }
132: }
133: }
134: return (EventListener[]) XArray.resize(listeners, count);
135: }
136:
137: /**
138: * Add all listeners registered in this object to the specified image reader.
139: */
140: public void addListenersTo(final ImageReader reader) {
141: final Object[] listeners = this .listeners.getListenerList();
142: for (int i = 0; i < listeners.length;) {
143: final Object classe = listeners[i++];
144: final Object listener = listeners[i++];
145: if (IIOReadProgressListener.class.equals(classe)) {
146: final IIOReadProgressListener l = (IIOReadProgressListener) listener;
147: reader.removeIIOReadProgressListener(l); // Ensure singleton
148: reader.addIIOReadProgressListener(l);
149: continue;
150: }
151: if (IIOReadWarningListener.class.equals(classe)) {
152: final IIOReadWarningListener l = (IIOReadWarningListener) listener;
153: reader.removeIIOReadWarningListener(l); // Ensure singleton
154: reader.addIIOReadWarningListener(l);
155: continue;
156: }
157: }
158: }
159: }
|