/*
* Copyright (C) 2006-2014 Gabriel Burca (gburca dash virtmus at ebixio dot com)
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package com.ebixio.util;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
/**
* A version of PropertyChangeSupport that adds a listener only once. The listener
* must be of WeakPropertyChangeListener type, or else it is added unconditionally.
*
* @author Gabriel Burca <gburca dash virtmus at ebixio dot com>
*/
public class PropertyChangeSupportUnique extends PropertyChangeSupport {
public PropertyChangeSupportUnique(Object sourceBean) {
super(sourceBean);
}
@Override
public void addPropertyChangeListener(PropertyChangeListener listener) {
if (listener instanceof WeakPropertyChangeListener) {
if (! isNew((WeakPropertyChangeListener)listener)) {
return;
}
}
super.addPropertyChangeListener(listener);
}
@Override
public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
if (listener instanceof WeakPropertyChangeListener) {
if (! isNew(propertyName, (WeakPropertyChangeListener)listener)) {
return;
}
}
super.addPropertyChangeListener(propertyName, listener);
}
private boolean isNew(WeakPropertyChangeListener newListener) {
return !contains(getPropertyChangeListeners(), newListener);
}
private boolean isNew(String propertyName, WeakPropertyChangeListener newListener) {
return !contains(getPropertyChangeListeners(propertyName), newListener);
}
/** Checks to see if the new listener is already in the list. */
private boolean contains(PropertyChangeListener[] pcl, WeakPropertyChangeListener newListener) {
for (PropertyChangeListener p: pcl) {
if (p instanceof WeakPropertyChangeListener) {
if (newListener.isSameListener(p)) {
return true;
}
}
}
return false;
}
}