1 //////////////////////////////////////////////////////////////////////////////// 2 // checkstyle: Checks Java source code for adherence to a set of rules. 3 // Copyright (C) 2001-2002 Oliver Burn 4 // 5 // This library is free software; you can redistribute it and/or 6 // modify it under the terms of the GNU Lesser General Public 7 // License as published by the Free Software Foundation; either 8 // version 2.1 of the License, or (at your option) any later version. 9 // 10 // This library is distributed in the hope that it will be useful, 11 // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 // Lesser General Public License for more details. 14 // 15 // You should have received a copy of the GNU Lesser General Public 16 // License along with this library; if not, write to the Free Software 17 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18 //////////////////////////////////////////////////////////////////////////////// 19 20 /* 21 * %W% %E% 22 * 23 * Copyright 1997, 1998 Sun Microsystems, Inc. All Rights Reserved. 24 * 25 * Redistribution and use in source and binary forms, with or 26 * without modification, are permitted provided that the following 27 * conditions are met: 28 * 29 * - Redistributions of source code must retain the above copyright 30 * notice, this list of conditions and the following disclaimer. 31 * 32 * - Redistribution in binary form must reproduce the above 33 * copyright notice, this list of conditions and the following 34 * disclaimer in the documentation and/or other materials 35 * provided with the distribution. 36 * 37 * Neither the name of Sun Microsystems, Inc. or the names of 38 * contributors may be used to endorse or promote products derived 39 * from this software without specific prior written permission. 40 * 41 * This software is provided "AS IS," without a warranty of any 42 * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND 43 * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, 44 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY 45 * EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY 46 * DAMAGES OR LIABILITIES SUFFERED BY LICENSEE AS A RESULT OF OR 47 * RELATING TO USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE OR 48 * ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE 49 * FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, 50 * SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER 51 * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF 52 * THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS 53 * BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 54 * 55 * You acknowledge that this software is not designed, licensed or 56 * intended for use in the design, construction, operation or 57 * maintenance of any nuclear facility. 58 */ 59 60 package com.puppycrawl.tools.checkstyle.gui; 61 62 import javax.swing.event.EventListenerList; 63 import javax.swing.event.TreeModelEvent; 64 import javax.swing.event.TreeModelListener; 65 import javax.swing.tree.TreePath; 66 67 /** 68 * An abstract implementation of the TreeTableModel interface, handling 69 * the list of listeners. 70 * 71 * <a href="http://java.sun.com/products/jfc/tsc/articles/treetable1/index.html">Original Source Location</a> 72 * 73 * @author Philip Milne 74 */ 75 public abstract class AbstractTreeTableModel implements TreeTableModel 76 { 77 private final Object root; 78 private final EventListenerList listenerList = new EventListenerList(); 79 80 public AbstractTreeTableModel(Object root) 81 { 82 this.root = root; 83 } 84 85 // 86 // Default implmentations for methods in the TreeModel interface. 87 // 88 89 @Override 90 public Object getRoot() 91 { 92 return root; 93 } 94 95 @Override 96 public boolean isLeaf(Object node) 97 { 98 return getChildCount(node) == 0; 99 } 100 101 @Override 102 public void valueForPathChanged(TreePath path, Object newValue) 103 { 104 } 105 106 // This is not called in the JTree's default mode: use a naive implementation. 107 @Override 108 public int getIndexOfChild(Object parent, Object child) 109 { 110 for (int i = 0; i < getChildCount(parent); i++) { 111 if (getChild(parent, i).equals(child)) { 112 return i; 113 } 114 } 115 return -1; 116 } 117 118 @Override 119 public void addTreeModelListener(TreeModelListener l) 120 { 121 listenerList.add(TreeModelListener.class, l); 122 } 123 124 @Override 125 public void removeTreeModelListener(TreeModelListener l) 126 { 127 listenerList.remove(TreeModelListener.class, l); 128 } 129 130 /* 131 * Notify all listeners that have registered interest for 132 * notification on this event type. The event instance 133 * is lazily created using the parameters passed into 134 * the fire method. 135 * @see EventListenerList 136 */ 137 protected void fireTreeNodesChanged(Object source, Object[] path, 138 int[] childIndices, 139 Object[] children) 140 { 141 // Guaranteed to return a non-null array 142 final Object[] listeners = listenerList.getListenerList(); 143 TreeModelEvent e = null; 144 // Process the listeners last to first, notifying 145 // those that are interested in this event 146 for (int i = listeners.length - 2; i >= 0; i -= 2) { 147 if (listeners[i] == TreeModelListener.class) { 148 // Lazily create the event: 149 if (e == null) { 150 e = new TreeModelEvent(source, path, 151 childIndices, children); 152 } 153 ((TreeModelListener) listeners[i + 1]).treeNodesChanged(e); 154 } 155 } 156 } 157 158 /* 159 * Notify all listeners that have registered interest for 160 * notification on this event type. The event instance 161 * is lazily created using the parameters passed into 162 * the fire method. 163 * @see EventListenerList 164 */ 165 protected void fireTreeNodesInserted(Object source, Object[] path, 166 int[] childIndices, 167 Object[] children) 168 { 169 // Guaranteed to return a non-null array 170 final Object[] listeners = listenerList.getListenerList(); 171 TreeModelEvent e = null; 172 // Process the listeners last to first, notifying 173 // those that are interested in this event 174 for (int i = listeners.length - 2; i >= 0; i -= 2) { 175 if (listeners[i] == TreeModelListener.class) { 176 // Lazily create the event: 177 if (e == null) { 178 e = new TreeModelEvent(source, path, 179 childIndices, children); 180 } 181 ((TreeModelListener) listeners[i + 1]).treeNodesInserted(e); 182 } 183 } 184 } 185 186 /* 187 * Notify all listeners that have registered interest for 188 * notification on this event type. The event instance 189 * is lazily created using the parameters passed into 190 * the fire method. 191 * @see EventListenerList 192 */ 193 protected void fireTreeNodesRemoved(Object source, Object[] path, 194 int[] childIndices, 195 Object[] children) 196 { 197 // Guaranteed to return a non-null array 198 final Object[] listeners = listenerList.getListenerList(); 199 TreeModelEvent e = null; 200 // Process the listeners last to first, notifying 201 // those that are interested in this event 202 for (int i = listeners.length - 2; i >= 0; i -= 2) { 203 if (listeners[i] == TreeModelListener.class) { 204 // Lazily create the event: 205 if (e == null) { 206 e = new TreeModelEvent(source, path, 207 childIndices, children); 208 } 209 ((TreeModelListener) listeners[i + 1]).treeNodesRemoved(e); 210 } 211 } 212 } 213 214 /* 215 * Notify all listeners that have registered interest for 216 * notification on this event type. The event instance 217 * is lazily created using the parameters passed into 218 * the fire method. 219 * @see EventListenerList 220 */ 221 protected void fireTreeStructureChanged(Object source, Object[] path, 222 int[] childIndices, 223 Object[] children) 224 { 225 // Guaranteed to return a non-null array 226 final Object[] listeners = listenerList.getListenerList(); 227 TreeModelEvent e = null; 228 // Process the listeners last to first, notifying 229 // those that are interested in this event 230 for (int i = listeners.length - 2; i >= 0; i -= 2) { 231 if (listeners[i] == TreeModelListener.class) { 232 // Lazily create the event: 233 if (e == null) { 234 e = new TreeModelEvent(source, path, 235 childIndices, children); 236 } 237 ((TreeModelListener) listeners[i + 1]).treeStructureChanged(e); 238 } 239 } 240 } 241 242 // 243 // Default impelmentations for methods in the TreeTableModel interface. 244 // 245 246 @Override 247 public Class<?> getColumnClass(int column) 248 { 249 return Object.class; 250 } 251 252 /** By default, make the column with the Tree in it the only editable one. 253 * Making this column editable causes the JTable to forward mouse 254 * and keyboard events in the Tree column to the underlying JTree. 255 */ 256 @Override 257 public boolean isCellEditable(Object node, int column) 258 { 259 return getColumnClass(column) == TreeTableModel.class; 260 } 261 262 @Override 263 public void setValueAt(Object value, Object node, int column) 264 { 265 } 266 267 268 // Left to be implemented in the subclass: 269 270 /* 271 * public Object getChild(Object parent, int index) 272 * public int getChildCount(Object parent) 273 * public int getColumnCount() 274 * public String getColumnName(Object node, int column) 275 * public Object getValueAt(Object node, int column) 276 */ 277 }