1 16 package org.apache.log4j.lf5.viewer.categoryexplorer; 17 18 import org.apache.log4j.lf5.LogRecord; 19 20 import javax.swing.*; 21 import javax.swing.tree.DefaultTreeModel ; 22 import javax.swing.tree.TreeNode ; 23 import javax.swing.tree.TreePath ; 24 import java.awt.*; 25 import java.awt.event.ActionEvent ; 26 import java.awt.event.ActionListener ; 27 import java.util.Enumeration ; 28 29 37 38 40 public class CategoryExplorerModel extends DefaultTreeModel { 41 45 49 protected boolean _renderFatal = true; 50 protected ActionListener _listener = null; 51 protected ActionEvent _event = new ActionEvent (this, 52 ActionEvent.ACTION_PERFORMED, 53 "Nodes Selection changed"); 54 55 59 63 public CategoryExplorerModel(CategoryNode node) { 64 super(node); 65 } 66 70 public void addLogRecord(LogRecord lr) { 71 CategoryPath path = new CategoryPath(lr.getCategory()); 72 addCategory(path); CategoryNode node = getCategoryNode(path); 74 node.addRecord(); if (_renderFatal && lr.isFatal()) { 76 TreeNode [] nodes = getPathToRoot(node); 77 int len = nodes.length; 78 CategoryNode parent; 79 80 for (int i = 1; i < len - 1; i++) { 83 parent = (CategoryNode) nodes[i]; 84 parent.setHasFatalChildren(true); 85 nodeChanged(parent); 86 } 87 node.setHasFatalRecords(true); 88 nodeChanged(node); 89 } 90 } 91 92 public CategoryNode getRootCategoryNode() { 93 return (CategoryNode) getRoot(); 94 } 95 96 public CategoryNode getCategoryNode(String category) { 97 CategoryPath path = new CategoryPath(category); 98 return (getCategoryNode(path)); 99 } 100 101 104 public CategoryNode getCategoryNode(CategoryPath path) { 105 CategoryNode root = (CategoryNode) getRoot(); 106 CategoryNode parent = root; 108 for (int i = 0; i < path.size(); i++) { 109 CategoryElement element = path.categoryElementAt(i); 110 111 Enumeration children = parent.children(); 113 114 boolean categoryAlreadyExists = false; 115 while (children.hasMoreElements()) { 116 CategoryNode node = (CategoryNode) children.nextElement(); 117 String title = node.getTitle().toLowerCase(); 118 119 String pathLC = element.getTitle().toLowerCase(); 120 if (title.equals(pathLC)) { 121 categoryAlreadyExists = true; 122 parent = node; 124 break; } 126 } 127 128 if (categoryAlreadyExists == false) { 129 return null; } 131 } 132 133 return (parent); 134 } 135 136 140 public boolean isCategoryPathActive(CategoryPath path) { 141 CategoryNode root = (CategoryNode) getRoot(); 142 CategoryNode parent = root; boolean active = false; 144 145 for (int i = 0; i < path.size(); i++) { 146 CategoryElement element = path.categoryElementAt(i); 147 148 Enumeration children = parent.children(); 150 151 boolean categoryAlreadyExists = false; 152 active = false; 153 154 while (children.hasMoreElements()) { 155 CategoryNode node = (CategoryNode) children.nextElement(); 156 String title = node.getTitle().toLowerCase(); 157 158 String pathLC = element.getTitle().toLowerCase(); 159 if (title.equals(pathLC)) { 160 categoryAlreadyExists = true; 161 parent = node; 163 164 if (parent.isSelected()) { 165 active = true; 166 } 167 168 break; } 170 } 171 172 if (active == false || categoryAlreadyExists == false) { 173 return false; 174 } 175 } 176 177 return (active); 178 } 179 180 181 188 public CategoryNode addCategory(CategoryPath path) { 189 CategoryNode root = (CategoryNode) getRoot(); 190 CategoryNode parent = root; 192 for (int i = 0; i < path.size(); i++) { 193 CategoryElement element = path.categoryElementAt(i); 194 195 Enumeration children = parent.children(); 197 198 boolean categoryAlreadyExists = false; 199 while (children.hasMoreElements()) { 200 CategoryNode node = (CategoryNode) children.nextElement(); 201 String title = node.getTitle().toLowerCase(); 202 203 String pathLC = element.getTitle().toLowerCase(); 204 if (title.equals(pathLC)) { 205 categoryAlreadyExists = true; 206 parent = node; 208 break; 209 } 210 } 211 212 if (categoryAlreadyExists == false) { 213 CategoryNode newNode = new CategoryNode(element.getTitle()); 215 216 221 insertNodeInto(newNode, parent, parent.getChildCount()); 223 refresh(newNode); 224 225 parent = newNode; 227 228 } 229 } 230 231 return parent; 232 } 233 234 public void update(CategoryNode node, boolean selected) { 235 if (node.isSelected() == selected) { 236 return; } 238 if (selected) { 240 setParentSelection(node, true); 241 } else { 242 setDescendantSelection(node, false); 243 } 244 } 245 246 public void setDescendantSelection(CategoryNode node, boolean selected) { 247 Enumeration descendants = node.depthFirstEnumeration(); 248 CategoryNode current; 249 while (descendants.hasMoreElements()) { 250 current = (CategoryNode) descendants.nextElement(); 251 if (current.isSelected() != selected) { 253 current.setSelected(selected); 254 nodeChanged(current); 255 } 256 } 257 notifyActionListeners(); 258 } 259 260 public void setParentSelection(CategoryNode node, boolean selected) { 261 TreeNode [] nodes = getPathToRoot(node); 262 int len = nodes.length; 263 CategoryNode parent; 264 265 for (int i = 1; i < len; i++) { 268 parent = (CategoryNode) nodes[i]; 269 if (parent.isSelected() != selected) { 270 parent.setSelected(selected); 271 nodeChanged(parent); 272 } 273 } 274 notifyActionListeners(); 275 } 276 277 278 public synchronized void addActionListener(ActionListener l) { 279 _listener = AWTEventMulticaster.add(_listener, l); 280 } 281 282 public synchronized void removeActionListener(ActionListener l) { 283 _listener = AWTEventMulticaster.remove(_listener, l); 284 } 285 286 public void resetAllNodeCounts() { 287 Enumeration nodes = getRootCategoryNode().depthFirstEnumeration(); 288 CategoryNode current; 289 while (nodes.hasMoreElements()) { 290 current = (CategoryNode) nodes.nextElement(); 291 current.resetNumberOfContainedRecords(); 292 nodeChanged(current); 293 } 294 } 295 296 302 public TreePath getTreePathToRoot(CategoryNode node) { 303 if (node == null) { 304 return null; 305 } 306 return (new TreePath (getPathToRoot(node))); 307 } 308 309 protected void notifyActionListeners() { 313 if (_listener != null) { 314 _listener.actionPerformed(_event); 315 } 316 } 317 318 321 protected void refresh(final CategoryNode node) { 322 SwingUtilities.invokeLater(new Runnable () { 323 public void run() { 324 nodeChanged(node); } 326 }); 327 } 328 329 333 337 } 338 339 340 341 342 343 344 | Popular Tags |