components/visual-panels/core/src/java/util/com/oracle/solaris/vp/util/misc/event/PropertyChangeListeners.java
author Dan Labrecque <dan.labrecque@oracle.com>
Thu, 24 May 2012 04:16:47 -0400
changeset 827 0944d8c0158b
permissions -rw-r--r--
7169052 Integrate Visual Panels into Userland

/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */

/*
 * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved.
 */

package com.oracle.solaris.vp.util.misc.event;

import java.beans.*;
import java.util.*;

public class PropertyChangeListeners
    extends EventListeners<PropertyChangeListener>
    implements EventDispatcher<PropertyChangeEvent, PropertyChangeListener>,
    PropertyChangeListener {

    //
    // Instance data
    //

    // Map of PropertyChangeListeners interested only in a single property
    private Map<PropertyChangeListener, List<String>> map =
	new HashMap<PropertyChangeListener, List<String>>();

    //
    // EventDispatcher methods
    //

    @Override
    public void dispatch(PropertyChangeListener listener,
	PropertyChangeEvent event) {

	List<String> propNames = map.get(listener);

	// Dispatch if listener is not property-specific, or is specific to the
	// changed property
	if (propNames == null || propNames.contains(event.getPropertyName())) {
	    listener.propertyChange(event);
	}
    }

    //
    // PropertyChangeListener methods
    //

    @Override
    public void propertyChange(PropertyChangeEvent event) {
	dispatch((EventDispatcher<PropertyChangeEvent, PropertyChangeListener>)
	    this, event);
    }

    //
    // EventListeners methods
    //

    @Override
    public boolean remove(PropertyChangeListener listener) {
	boolean removed = super.remove(listener);
	if (removed) {
	    map.remove(listener);
	}
	return removed;
    }

    //
    // PropertyChangeListeners methods
    //

    public void add(String propName, PropertyChangeListener listener) {
	add(listener);

	List<String> propNames = map.get(listener);
	if (propNames == null) {
	    propNames = new LinkedList<String>();
	    map.put(listener, propNames);
	}

	int index = Collections.binarySearch(propNames, propName);
	if (index < 0) {
	    index = -1 - index;
	    propNames.add(index, propName);
	}
    }

    public boolean remove(String propName, PropertyChangeListener listener) {
	List<String> propNames = map.get(listener);
	if (propNames != null) {
	    propNames.remove(propName);
	    if (propNames.isEmpty()) {
		map.remove(listener);
	    } else {
		return false;
	    }
	}
	return super.remove(listener);
    }
}