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}