1 19 20 package org.netbeans.modules.dbschema.nodes; 21 22 import java.beans.PropertyChangeListener ; 23 import java.beans.PropertyChangeEvent ; 24 import java.util.*; 25 26 import org.openide.nodes.Children; 27 import org.openide.nodes.Node; 28 import org.openide.util.WeakListeners; 30 31 import org.netbeans.modules.dbschema.*; 32 33 35 public class SchemaChildren extends Children.Keys { 36 37 protected static HashMap propToFilter; 38 39 40 protected SchemaElement element; 41 42 protected SchemaElementFilter filter; 43 44 protected DBElementNodeFactory factory; 45 46 private PropertyChangeListener wPropL; 47 49 private DBElementListener propL; 50 51 protected Collection[] cpl; 52 53 private boolean nodesInited = false; 54 55 static { 56 propToFilter = new HashMap (); 57 propToFilter.put (DBElementProperties.PROP_TABLES, new Integer (TableElementFilter.TABLE)); 58 propToFilter.put (DBElementProperties.PROP_COLUMNS, new Integer (TableElementFilter.COLUMN)); 59 propToFilter.put (DBElementProperties.PROP_INDEXES, new Integer (TableElementFilter.INDEX)); 60 propToFilter.put (DBElementProperties.PROP_KEYS, new Integer (TableElementFilter.FK)); 61 } 62 63 67 public SchemaChildren (final SchemaElement element) { 68 this(DefaultDBFactory.READ_ONLY, element); 69 } 70 71 76 public SchemaChildren (final DBElementNodeFactory factory, final SchemaElement element) { 77 super(); 78 this.element = element; 79 this.factory = factory; 80 this.filter = null; 81 } 82 83 84 85 88 public Class getFilterClass () { 89 return SchemaElementFilter.class; 90 } 91 92 94 public Object getFilter () { 95 return filter; 96 } 97 98 101 public void setFilter (final Object filter) { 102 if (!(filter instanceof SchemaElementFilter)) 103 throw new IllegalArgumentException (); 104 105 this.filter = (SchemaElementFilter)filter; 106 if (nodesInited) 108 refreshAllKeys (); 109 } 110 111 113 116 protected void addNotify () { 117 refreshAllKeys (); 118 119 if (wPropL == null) { 121 propL = new DBElementListener(); 122 wPropL = WeakListeners.propertyChange (propL, element); 123 } 124 else { 125 wPropL = WeakListeners.propertyChange (propL, element); 127 } 128 129 element.addPropertyChangeListener (wPropL); 130 nodesInited = true; 131 } 132 133 protected void removeNotify () { 134 setKeys (java.util.Collections.EMPTY_SET); 135 nodesInited = false; 136 } 137 138 141 protected Node[] createNodes (final Object key) { 142 if (key instanceof TableElement) 143 return new Node[] { factory.createTableNode((TableElement)key) }; 144 145 return new Node[0]; 147 } 148 149 150 151 152 155 protected void refreshAllKeys () { 156 cpl = new Collection [getOrder ().length]; 157 158 refreshKeys (SchemaElementFilter.TABLE); 159 } 160 161 163 protected void refreshKeys (int filter) { 164 int[] order = getOrder (); 165 LinkedList keys = new LinkedList(); 166 167 for (int i = 0; i < order.length; i++) 169 if (((order[i] & filter) != 0) || (cpl [i] == null)) 170 keys.addAll(cpl [i] = getKeysOfType(order[i])); 171 else 172 keys.addAll(cpl [i]); 173 174 setKeys(keys); 176 } 177 178 180 protected Collection getKeysOfType (final int elementType) { 181 LinkedList keys = new LinkedList(); 182 183 if ((elementType & SchemaElementFilter.TABLE) != 0) 184 filterModifiers(((SchemaElement)element).getTables(), keys); 185 186 return keys; 187 } 188 189 191 private void filterModifiers (DBElement[] elements, Collection keys) { 192 int i, k = elements.length; 193 194 for (i = 0; i < k; i ++) 195 keys.add (elements [i]); 196 } 197 198 200 protected int[] getOrder () { 201 return (filter == null || (filter.getOrder() == null)) ? SchemaElementFilter.DEFAULT_ORDER : filter.getOrder(); 202 } 203 204 206 208 private final class DBElementListener implements PropertyChangeListener { 209 public DBElementListener () {} 210 211 216 public void propertyChange (PropertyChangeEvent evt) { 217 Integer i = (Integer ) propToFilter.get (evt.getPropertyName ()); 218 if (i != null) 219 refreshKeys(i.intValue()); 220 } 221 } } 223 | Popular Tags |