001/*
002 * $Id$
003 *
004 * Copyright 2009 Sun Microsystems, Inc., 4150 Network Circle,
005 * Santa Clara, California 95054, U.S.A. All rights reserved.
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 * You should have received a copy of the GNU Lesser General Public
018 * License along with this library; if not, write to the Free Software
019 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
020 *
021 */
022package org.jdesktop.swingx.event;
023
024import javax.swing.event.EventListenerList;
025import javax.swing.event.TreeExpansionEvent;
026import javax.swing.event.TreeExpansionListener;
027
028/**
029 * Helper to listen to TreeExpansion events and notify with a remapped source.
030 * 
031 * @author Jeanette Winzenburg
032 */
033public class TreeExpansionBroadcaster implements TreeExpansionListener {
034
035    private Object source;
036
037    private EventListenerList listeners;
038
039    public TreeExpansionBroadcaster(Object source) {
040        this.source = source;
041    }
042
043    public void addTreeExpansionListener(TreeExpansionListener l) {
044        getEventListenerList().add(TreeExpansionListener.class, l);
045    }
046
047    public void removeTreeExpansionListener(TreeExpansionListener l) {
048        if (!hasListeners())
049            return;
050        listeners.remove(TreeExpansionListener.class, l);
051    }
052
053    /**
054     * @return
055     */
056    private EventListenerList getEventListenerList() {
057        if (listeners == null) {
058            listeners = new EventListenerList();
059        }
060        return listeners;
061    }
062
063    // -------------------- TreeExpansionListener
064    @Override
065    public void treeExpanded(TreeExpansionEvent event) {
066        if (!hasListeners())
067            return;
068        fireTreeExpanded(retarget(event));
069    }
070
071    @Override
072    public void treeCollapsed(TreeExpansionEvent event) {
073        if (!hasListeners())
074            return;
075        fireTreeCollapsed(retarget(event));
076    }
077
078    /**
079     * @param event
080     */
081    private void fireTreeExpanded(TreeExpansionEvent event) {
082        TreeExpansionListener[] ls = listeners
083                .getListeners(TreeExpansionListener.class);
084        for (int i = ls.length - 1; i >= 0; i--) {
085            ls[i].treeExpanded(event);
086        }
087    }
088
089    /**
090     * @param event
091     */
092    private void fireTreeCollapsed(TreeExpansionEvent event) {
093        TreeExpansionListener[] ls = listeners
094                .getListeners(TreeExpansionListener.class);
095        for (int i = ls.length - 1; i >= 0; i--) {
096            ls[i].treeCollapsed(event);
097        }
098    }
099
100    /**
101     * @param event
102     * @return
103     */
104    private TreeExpansionEvent retarget(TreeExpansionEvent event) {
105        return new TreeExpansionEvent(source, event.getPath());
106    }
107
108    /**
109     * @return
110     */
111    private boolean hasListeners() {
112        return listeners != null && listeners.getListenerCount() > 0;
113    }
114
115}