1 // $Id: AbstractTreeModel.java 165 2009-05-28 21:46:38Z agony $ 2 /* 3 * xsAnalyzer - XML schema analyzing tool. Copyright (C) 2008 Michael Engelhardt 4 * 5 * This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public 6 * License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later 7 * version. 8 * 9 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied 10 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. 11 * 12 * You should have received a copy of the GNU General Public License along with this program; if not, write to the Free 13 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 14 */ 15 package de.mindcrimeilab.swing.util; 16 17 import javax.swing.event.EventListenerList; 18 import javax.swing.event.TreeModelEvent; 19 import javax.swing.event.TreeModelListener; 20 import javax.swing.tree.TreeModel; 21 import javax.swing.tree.TreePath; 22 23 /** 24 * 25 * @author Michael Engelhardt<me@mindcrime-ilab.de> 26 * @author $Author: agony $ 27 * @version $Revision: 165 $ 28 * 29 */ 30 public abstract class AbstractTreeModel implements TreeModel { 31 32 /** Listeners. */ 33 protected EventListenerList listenerList = new EventListenerList(); 34 35 public AbstractTreeModel() { 36 super(); 37 } 38 39 @Override 40 public void valueForPathChanged(TreePath path, Object newValue) { 41 fireTreeStructureChanged(this, path); 42 } 43 44 /*----------------------------------------------------------------------*/ 45 /*------------------------------Events----------------------------------*/ 46 /* Copied from javax.swing.tree.DefaultTreeModel */ 47 /*-----------------------------------------------------------------------*/ 48 // 49 // Events 50 // 51 /** 52 * Adds a listener for the TreeModelEvent posted after the tree changes. 53 * 54 * @see #removeTreeModelListener 55 * @param l 56 * the listener to add 57 */ 58 public void addTreeModelListener(TreeModelListener l) { 59 listenerList.add(TreeModelListener.class, l); 60 } 61 62 /** 63 * Removes a listener previously added with <B>addTreeModelListener()</B>. 64 * 65 * @see #addTreeModelListener 66 * @param l 67 * the listener to remove 68 */ 69 public void removeTreeModelListener(TreeModelListener l) { 70 listenerList.remove(TreeModelListener.class, l); 71 } 72 73 /** 74 * Returns an array of all the tree model listeners registered on this model. 75 * 76 * @return all of this model's <code>TreeModelListener</code>s or an empty array if no tree model listeners are 77 * currently registered 78 * 79 * @see #addTreeModelListener 80 * @see #removeTreeModelListener 81 * 82 * @since 1.4 83 */ 84 public TreeModelListener[] getTreeModelListeners() { 85 return listenerList.getListeners(TreeModelListener.class); 86 } 87 88 /* 89 * Notifies all listeners that have registered interest for notification on this event type. The event instance is 90 * lazily created using the parameters passed into the fire method. 91 * 92 * @param source the node where the tree model has changed 93 * 94 * @param path the path to the root node 95 * 96 * @see EventListenerList 97 */ 98 protected void fireTreeStructureChanged(Object source, TreePath path) { 99 // Guaranteed to return a non-null array 100 Object[] listeners = listenerList.getListenerList(); 101 TreeModelEvent e = null; 102 // Process the listeners last to first, notifying 103 // those that are interested in this event 104 for (int i = listeners.length - 2; i >= 0; i -= 2) { 105 if (listeners[i] == TreeModelListener.class) { 106 // Lazily create the event: 107 if (e == null) { 108 e = new TreeModelEvent(source, path); 109 } 110 ((TreeModelListener) listeners[i + 1]).treeStructureChanged(e); 111 } 112 } 113 } 114 115 protected void fireTreeStructureChanged(Object source, Object[] path, int[] childIndices, Object[] children) { 116 // Guaranteed to return a non-null array 117 Object[] listeners = listenerList.getListenerList(); 118 TreeModelEvent e = null; 119 // Process the listeners last to first, notifying 120 // those that are interested in this event 121 for (int i = listeners.length - 2; i >= 0; i -= 2) { 122 if (listeners[i] == TreeModelListener.class) { 123 // Lazily create the event: 124 if (e == null) { 125 e = new TreeModelEvent(source, path, childIndices, children); 126 } 127 ((TreeModelListener) listeners[i + 1]).treeStructureChanged(e); 128 } 129 } 130 } 131 }