Package com.cburch.logisim.util

Source Code of com.cburch.logisim.util.PropertyChangeWeakSupport$ListenerData

/* Copyright (c) 2010, Carl Burch. License information is located in the
* com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */

package com.cburch.logisim.util;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.lang.ref.WeakReference;
import java.util.Iterator;
import java.util.concurrent.ConcurrentLinkedQueue;

public class PropertyChangeWeakSupport {
    private static final String ALL_PROPERTIES = "ALL PROPERTIES";

    private static class ListenerData {
        String property;
        WeakReference<PropertyChangeListener> listener;
        ListenerData(String property, PropertyChangeListener listener) {
            this.property = property;
            this.listener = new WeakReference<PropertyChangeListener>(listener);
        }
    }

    private Object source;
    private ConcurrentLinkedQueue<ListenerData> listeners;

    public PropertyChangeWeakSupport(Object source) {
        this.source = source;
        this.listeners = new ConcurrentLinkedQueue<ListenerData>();
    }

    public void addPropertyChangeListener(PropertyChangeListener listener) {
        addPropertyChangeListener(ALL_PROPERTIES, listener);
    }

    public void addPropertyChangeListener(String property, PropertyChangeListener listener) {
        listeners.add(new ListenerData(property, listener));
    }

    public void removePropertyChangeListener(PropertyChangeListener listener) {
        removePropertyChangeListener(ALL_PROPERTIES, listener);
    }

    public void removePropertyChangeListener(String property, PropertyChangeListener listener) {
        for (Iterator<ListenerData> it = listeners.iterator(); it.hasNext(); ) {
            ListenerData data = it.next();
            PropertyChangeListener l = data.listener.get();
            if (l == null) {
                it.remove();
            } else if (data.property.equals(property) && l == listener) {
                it.remove();
            }
        }
    }

    public void firePropertyChange(String property, Object oldValue, Object newValue) {
        PropertyChangeEvent e = null;
        for (Iterator<ListenerData> it = listeners.iterator(); it.hasNext(); ) {
            ListenerData data = it.next();
            PropertyChangeListener l = data.listener.get();
            if (l == null) {
                it.remove();
            } else if (data.property == ALL_PROPERTIES
                    || data.property.equals(property)) {
                if (e == null) {
                    e = new PropertyChangeEvent(source, property, oldValue, newValue);
                }
                l.propertyChange(e);
            }
        }
    }

    public void firePropertyChange(String property, int oldValue, int newValue) {
        PropertyChangeEvent e = null;
        for (Iterator<ListenerData> it = listeners.iterator(); it.hasNext(); ) {
            ListenerData data = it.next();
            PropertyChangeListener l = data.listener.get();
            if (l == null) {
                it.remove();
            } else if (data.property == ALL_PROPERTIES
                    || data.property.equals(property)) {
                if (e == null) {
                    e = new PropertyChangeEvent(source, property,
                        Integer.valueOf(oldValue), Integer.valueOf(newValue));
                }
                l.propertyChange(e);
            }
        }
    }

    public void firePropertyChange(String property, boolean oldValue, boolean newValue) {
        PropertyChangeEvent e = null;
        for (Iterator<ListenerData> it = listeners.iterator(); it.hasNext(); ) {
            ListenerData data = it.next();
            PropertyChangeListener l = data.listener.get();
            if (l == null) {
                it.remove();
            } else if (data.property == ALL_PROPERTIES
                    || data.property.equals(property)) {
                if (e == null) {
                    e = new PropertyChangeEvent(source, property,
                        Boolean.valueOf(oldValue), Boolean.valueOf(newValue));
                }
                l.propertyChange(e);
            }
        }
    }

}
TOP

Related Classes of com.cburch.logisim.util.PropertyChangeWeakSupport$ListenerData

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.