1 13 package com.tonbeller.wcf.tree; 14 15 import java.util.ArrayList ; 16 import java.util.List ; 17 18 21 public class FilteringTreeModelDecorator implements TreeModel, DecoratedTreeModel { 22 TreeModel decoree; 23 NodeFilter filter; 24 25 30 NodeFilter hasAlwaysChildren = NodeFilter.TRUE_FILTER; 31 32 public FilteringTreeModelDecorator(TreeModel decoree, NodeFilter filter) { 33 this.decoree = decoree; 34 this.filter = filter; 35 } 36 37 public FilteringTreeModelDecorator(TreeModel decoree, NodeFilter filter, NodeFilter hasAlwaysChildren) { 38 this.decoree = decoree; 39 this.filter = filter; 40 this.hasAlwaysChildren = hasAlwaysChildren; 41 } 42 43 public Object [] getRoots() { 44 return acceptableMembers(decoree.getRoots()); 45 } 46 47 public boolean hasChildren(Object node) { 48 if (!decoree.hasChildren(node)) 49 return false; 50 if(hasAlwaysChildren.accept(node)) 51 return true; 52 53 return hasAcceptableMember(decoree.getChildren(node)); 54 } 55 56 public Object [] getChildren(Object node) { 57 return acceptableMembers(decoree.getChildren(node)); 58 } 59 60 public Object getParent(Object node) { 61 return decoree.getParent(node); 62 } 63 64 boolean hasAcceptableMember(Object [] array) { 65 for (int i = 0; i < array.length; i++) 66 if (filter.accept(array[i])) 67 return true; 68 return false; 69 } 70 71 Object [] acceptableMembers(Object [] array) { 72 List accepted = new ArrayList (); 73 for (int i = 0; i < array.length; i++) 74 if (filter.accept(array[i])) 75 accepted.add(array[i]); 76 return accepted.toArray(); 77 } 78 79 public TreeModel getDecoree() { 80 return decoree; 81 } 82 83 public NodeFilter getFilter() { 84 return filter; 85 } 86 87 public void setDecoree(TreeModel model) { 88 decoree = model; 89 } 90 91 public void setFilter(NodeFilter filter) { 92 this.filter = filter; 93 } 94 95 public void addTreeModelChangeListener(TreeModelChangeListener l) { 96 decoree.addTreeModelChangeListener(l); 97 } 98 99 public void removeTreeModelChangeListener(TreeModelChangeListener l) { 100 decoree.removeTreeModelChangeListener(l); 101 } 102 103 public void fireModelChanged(boolean identityChanged) { 104 decoree.fireModelChanged(identityChanged); 105 } 106 107 112 public NodeFilter getHasAlwaysChildren() { 113 return hasAlwaysChildren; 114 } 115 120 public void setHasAlwaysChildren(NodeFilter hasAlwaysChildren) { 121 this.hasAlwaysChildren = hasAlwaysChildren; 122 } 123 } 124 | Popular Tags |