1 19 20 package org.openide.src.nodes; 21 22 import java.beans.*; 23 import java.util.Collection ; 24 import java.util.Vector ; 25 26 import org.openide.actions.*; 27 import org.openide.nodes.*; 28 import org.openide.src.*; 29 import org.openide.src.nodes.*; 30 import org.openide.util.actions.SystemAction; 31 import org.openide.util.datatransfer.NewType; 32 33 37 public class DefaultFactory extends Object implements ElementNodeFactory, IconStrings { 38 39 public static final DefaultFactory READ_WRITE = new DefaultFactory(true); 40 41 42 public static final DefaultFactory READ_ONLY = new DefaultFactory(false); 43 44 47 private static final Object CATEGORY_FIELDS = new Object (); 48 49 52 private static final Object CATEGORY_METHODS = new Object (); 53 54 57 private static final Object CATEGORY_CONSTRUCTORS = new Object (); 58 59 private static final Collection CLASS_CATEGORIES; 60 61 private static final Collection INTERFACE_CATEGORIES; 62 63 private static final int FILTER_CATEGORIES = 0x1000; 64 65 static { 66 CLASS_CATEGORIES = new Vector (3, 0); 67 CLASS_CATEGORIES.add(CATEGORY_FIELDS); 68 CLASS_CATEGORIES.add(CATEGORY_CONSTRUCTORS); 69 CLASS_CATEGORIES.add(CATEGORY_METHODS); 70 71 INTERFACE_CATEGORIES = new Vector (2, 0); 72 INTERFACE_CATEGORIES.add(CATEGORY_FIELDS); 73 INTERFACE_CATEGORIES.add(CATEGORY_METHODS); 74 } 75 76 79 private boolean writeable; 80 81 86 public DefaultFactory(boolean writeable) { 87 this.writeable = writeable; 88 } 89 90 93 public boolean isWriteable() { 94 return writeable; 95 } 96 97 100 public Node createMethodNode (final MethodElement element) { 101 return new MethodElementNode(element, writeable); 102 } 103 104 107 public Node createConstructorNode (final ConstructorElement element) { 108 return new ConstructorElementNode(element, writeable); 109 } 110 111 114 public Node createFieldNode (final FieldElement element) { 115 return new FieldElementNode(element, writeable); 116 } 117 118 121 public Node createInitializerNode (final InitializerElement element) { 122 return new InitializerElementNode(element, writeable); 123 } 124 125 128 public Node createClassNode (ClassElement element) { 129 return new ClassElementNode(element, createClassChildren(element), writeable); 130 } 131 132 138 protected Children createClassChildren(ClassElement element) { 139 return createClassChildren( element, writeable ? READ_WRITE : READ_ONLY ); 140 } 141 142 148 final protected Children createClassChildren(ClassElement element, ElementNodeFactory factory ) { 149 150 if (ElementNode.sourceOptions.getCategoriesUsage()) { 151 ClassChildren children = new CategorizingChildren(factory, element, writeable); 152 ClassElementFilter filter = new ClassElementFilter(); 153 filter.setOrder(new int[] { 154 SourceElementFilter.CLASS, 155 SourceElementFilter.INTERFACE, 156 FILTER_CATEGORIES 157 }); 158 children.setFilter(filter); 159 return children; 160 } 161 else { 162 return new ClassChildren(factory, element); 163 } 164 } 165 166 171 public Node createWaitNode () { 172 AbstractNode n = new AbstractNode(Children.LEAF); 173 n.setName(ElementNode.bundle.getString("Wait")); 174 n.setIconBase(WAIT); 175 return n; 176 } 177 178 182 public Node createErrorNode () { 183 AbstractNode n = new AbstractNode(Children.LEAF); 184 n.setName(ElementNode.bundle.getString("Error")); n.setIconBase(ERROR); 186 return n; 187 } 188 189 190 private static final SystemAction[] CATEGORY_ACTIONS = new SystemAction[] { 191 194 SystemAction.get(PasteAction.class), 195 null, 196 SystemAction.get(NewAction.class), 197 null, 198 SystemAction.get(ToolsAction.class), 199 SystemAction.get(PropertiesAction.class) 200 }; 201 202 203 static final int[][] FILTERS = new int[][] { 204 { ClassElementFilter.FIELD }, 205 { ClassElementFilter.CONSTRUCTOR }, 206 { ClassElementFilter.METHOD }, 207 }; 208 209 210 static final String [] NAMES = new String [] { 211 ElementNode.bundle.getString("Fields"), ElementNode.bundle.getString("Constructors"), ElementNode.bundle.getString("Methods"), }; 215 216 217 static final String [] SHORTDESCRS = new String [] { 218 ElementNode.bundle.getString("Fields_HINT"), ElementNode.bundle.getString("Constructors_HINT"), ElementNode.bundle.getString("Methods_HINT"), }; 222 223 224 static final String [] CATEGORY_ICONS = new String [] { 225 FIELDS_CATEGORY, CONSTRUCTORS_CATEGORY, METHODS_CATEGORY 226 }; 227 228 233 static class CategorizingChildren extends ClassChildren { 234 boolean writeable; 235 236 static { 237 ClassChildren.propToFilter.put(ElementProperties.PROP_CLASS_OR_INTERFACE, 238 new Integer (FILTER_CATEGORIES)); 239 } 240 241 CategorizingChildren(ElementNodeFactory factory, ClassElement data, boolean wr) { 242 super(factory, data); 243 writeable = wr; 244 } 245 246 protected Node[] createNodes(Object key) { 247 if (key == CATEGORY_FIELDS) { 248 return new Node[] { 249 new ElementCategoryNode(0, factory, element, writeable) 250 }; 251 } else if (key == CATEGORY_METHODS) { 252 return new Node[] { 253 new ElementCategoryNode(2, factory, element, writeable) 254 }; 255 } else if (key == CATEGORY_CONSTRUCTORS) { 256 return new Node[] { 257 new ElementCategoryNode(1, factory, element, writeable) 258 }; 259 } 260 return super.createNodes(key); 261 } 262 263 protected Collection getKeysOfType(int type) { 264 if (type != FILTER_CATEGORIES) 265 return super.getKeysOfType(type); 266 if (element.isClassOrInterface()) { 267 return CLASS_CATEGORIES; 268 } else { 269 return INTERFACE_CATEGORIES; 270 } 271 } 272 } 273 274 278 static class ElementCategoryNode extends AbstractNode { 279 280 281 ClassElement element; 282 283 284 int newTypeIndex; 285 286 291 ElementCategoryNode(int index, ElementNodeFactory factory, ClassElement element, boolean writeable) { 292 this(index, new ClassChildren(factory, element)); 293 this.element = element; 294 newTypeIndex = writeable ? index : -1; 295 switch (index) { 296 case 0: setName("Fields"); break; case 1: setName("Constructors"); break; case 2: setName("Methods"); break; } 300 } 301 302 306 private ElementCategoryNode(int index, ClassChildren children) { 307 super(children); 308 setDisplayName(NAMES[index]); 309 setShortDescription (SHORTDESCRS[index]); 310 ClassElementFilter filter = new ClassElementFilter(); 311 filter.setOrder(FILTERS[index]); 312 children.setFilter(filter); 313 systemActions = CATEGORY_ACTIONS; 314 setIconBase(CATEGORY_ICONS[index]); 315 } 316 317 319 public boolean canCopy() { 320 return false; 321 } 322 323 326 public NewType[] getNewTypes() { 327 if (!SourceEditSupport.isWriteable(element)) { 328 return new NewType[0]; 329 } 330 switch (newTypeIndex) { 331 case 0: 332 return new NewType[] { 333 new SourceEditSupport.ElementNewType(element, (byte) 1) 334 }; 335 case 1: 336 return new NewType[] { 337 new SourceEditSupport.ElementNewType(element, (byte) 0), 338 new SourceEditSupport.ElementNewType(element, (byte) 2) 339 }; 340 case 2: 341 return new NewType[] { 342 new SourceEditSupport.ElementNewType(element, (byte) 3) 343 }; 344 default: 345 return super.getNewTypes(); 346 } 347 } 348 349 public void createPasteTypes(java.awt.datatransfer.Transferable t, java.util.List s) { 350 Node n = getParentNode(); 351 if (n == null || !(n instanceof ClassElementNode)) { 352 return; 353 } 354 ((ClassElementNode)n).createPasteTypes(t, s); 355 } 356 } 357 358 } 359 | Popular Tags |