1 19 20 25 26 package org.netbeans.modules.xml.wsdl.ui.view; 27 28 import java.beans.PropertyChangeEvent ; 29 import java.beans.PropertyChangeListener ; 30 import java.beans.PropertyVetoException ; 31 import java.io.File ; 32 import java.io.FileFilter ; 33 import java.util.ArrayList ; 34 import java.util.Arrays ; 35 import java.util.Collection ; 36 import java.util.Collections ; 37 import java.util.List ; 38 import java.util.Map ; 39 import java.util.Set ; 40 41 import javax.swing.SwingUtilities ; 42 import javax.xml.XMLConstants ; 43 44 import org.netbeans.api.project.Project; 45 import org.netbeans.modules.xml.catalogsupport.DefaultProjectCatalogSupport; 46 import org.netbeans.modules.xml.schema.model.GlobalComplexType; 47 import org.netbeans.modules.xml.schema.model.GlobalElement; 48 import org.netbeans.modules.xml.schema.model.GlobalSimpleType; 49 import org.netbeans.modules.xml.schema.model.GlobalType; 50 import org.netbeans.modules.xml.schema.model.Schema; 51 import org.netbeans.modules.xml.schema.model.SchemaComponent; 52 import org.netbeans.modules.xml.schema.model.SchemaComponentReference; 53 import org.netbeans.modules.xml.schema.model.SchemaModel; 54 import org.netbeans.modules.xml.schema.model.SchemaModelFactory; 55 import org.netbeans.modules.xml.schema.ui.nodes.categorized.CategorizedSchemaNodeFactory; 56 import org.netbeans.modules.xml.wsdl.model.Definitions; 57 import org.netbeans.modules.xml.wsdl.model.WSDLModel; 58 import org.netbeans.modules.xml.wsdl.ui.api.property.ElementOrTypePropertyEditor; 59 import org.netbeans.modules.xml.wsdl.ui.view.treeeditor.NodesFactory; 60 import org.netbeans.modules.xml.wsdl.ui.wsdl.nodes.BuiltInTypeFolderNode; 61 import org.netbeans.modules.xml.wsdl.ui.wsdl.nodes.XSDTypesNode; 62 import org.netbeans.modules.xml.xam.ModelSource; 63 import org.netbeans.modules.xml.xam.ui.customizer.FolderNode; 64 import org.netbeans.spi.project.ui.LogicalViewProvider; 65 import org.openide.explorer.ExplorerManager; 66 import org.openide.explorer.propertysheet.PropertyEnv; 67 import org.openide.filesystems.FileObject; 68 import org.openide.filesystems.FileUtil; 69 import org.openide.loaders.DataObject; 70 import org.openide.nodes.AbstractNode; 71 import org.openide.nodes.Children; 72 import org.openide.nodes.FilterNode; 73 import org.openide.nodes.Node; 74 import org.openide.util.Lookup; 75 import org.openide.util.NbBundle; 76 77 81 public class ElementOrTypeChooserPanel extends javax.swing.JPanel implements ExplorerManager.Provider { 82 83 private Map <String , String > namespaceToPrefixMap; 84 private Project mProject; 85 private WSDLModel mModel; 86 private SchemaComponent mPreviousSelectedComponent; 87 88 89 public ElementOrTypeChooserPanel(Project project, Map <String , String > namespaceToPrefixMap, WSDLModel model) { 90 this.namespaceToPrefixMap = namespaceToPrefixMap; 91 this.mProject = project; 92 this.mModel = model; 93 initComponents(); 94 initGUI(); 95 } 96 97 public ElementOrTypeChooserPanel(Project project, Map <String , String > namespaceToPrefixMap, WSDLModel model, SchemaComponent previousSelectedComponent) { 98 this.namespaceToPrefixMap = namespaceToPrefixMap; 99 this.mProject = project; 100 this.mModel = model; 101 this.mPreviousSelectedComponent = previousSelectedComponent; 102 initComponents(); 103 initGUI(); 104 } 105 106 111 private void initComponents() { 113 beanTreeView1 = new org.openide.explorer.view.BeanTreeView(); 114 115 beanTreeView1.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); 116 beanTreeView1.setAutoscrolls(true); 117 beanTreeView1.setDefaultActionAllowed(false); 118 beanTreeView1.setDragSource(false); 119 beanTreeView1.setDropTarget(false); 120 beanTreeView1.setPopupAllowed(false); 121 beanTreeView1.setRootVisible(false); 122 beanTreeView1.setSelectionMode(1); 123 124 org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this); 125 this.setLayout(layout); 126 layout.setHorizontalGroup( 127 layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) 128 .add(beanTreeView1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 410, Short.MAX_VALUE) 129 ); 130 layout.setVerticalGroup( 131 layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) 132 .add(beanTreeView1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 411, Short.MAX_VALUE) 133 ); 134 } 136 private void initGUI() { 137 manager = new ExplorerManager(); 138 manager.addPropertyChangeListener(new ExplorerPropertyChangeListener()); 139 Node rootNode = new AbstractNode(new Children.Array()); 140 manager.setRootContext(rootNode); 141 populateRootNode(rootNode); 142 } 143 144 private void populateRootNode(Node rootNode) { 145 ArrayList <Node> nodes = new ArrayList <Node>(); 146 Node builtInTypes = new BuiltInTypeFolderNode(); 147 Node inlineTypesFolderNode = null; 148 if (mModel != null) { 149 Definitions def = mModel.getDefinitions(); 150 if (def.getTypes() != null) { 151 Collection <Schema> schemas = def.getTypes().getSchemas(); 152 if (schemas != null && !schemas.isEmpty()) { 153 List <Schema> filteredSchemas = new ArrayList <Schema>(); 154 for (Schema schema : schemas) { 155 Collection <SchemaComponent> children = schema.getChildren(); 156 for (SchemaComponent comp : children) { 157 if (comp instanceof GlobalElement || 158 comp instanceof GlobalSimpleType || 159 comp instanceof GlobalComplexType) { 160 filteredSchemas.add(schema); 161 break; 162 } 163 } 164 } 165 if (filteredSchemas.size() > 0) { 166 inlineTypesFolderNode = new InlineTypesFolderNode(NodesFactory.getInstance().create(def.getTypes()), filteredSchemas); 167 } 168 } 169 } 170 } 171 Node externalSchemaNode = null; 172 if (mProject != null) { 173 catalogSupport = new DefaultProjectCatalogSupport(mProject); 174 List <Node> projectNodes = new ArrayList <Node>(); 175 176 externalSchemaNode = new FolderNode(new Children.Array()); 177 externalSchemaNode.setDisplayName(NbBundle.getMessage(ElementOrTypeChooserPanel.class, "LBL_ByFile_DisplayName")); 178 179 Node projectFolderNode = createProjectFolderNode(mProject); 180 if (projectFolderNode != null) { 181 projectNodes.add(projectFolderNode); 182 } 183 Set refProjects = catalogSupport.getProjectReferences(); 184 if (refProjects != null && refProjects.size() > 0) { 185 for (Object o : refProjects) { 186 Project refPrj = (Project) o; 187 projectFolderNode = createProjectFolderNode(refPrj); 188 if (projectFolderNode != null) { 189 projectNodes.add(projectFolderNode); 190 } 191 } 192 } 193 194 externalSchemaNode.getChildren().add(projectNodes.toArray(new Node[projectNodes.size()])); 195 } 196 197 if (inlineTypesFolderNode != null) { 198 nodes.add(inlineTypesFolderNode); 199 } 200 201 if (externalSchemaNode != null) { 202 nodes.add(externalSchemaNode); 203 } 204 if (inlineTypesFolderNode != null) { 205 nodes.add(inlineTypesFolderNode); 206 } 207 208 if (externalSchemaNode != null) { 209 nodes.add(externalSchemaNode); 210 } 211 nodes.add(builtInTypes); 213 214 Node[] nodesArr = nodes.toArray(new Node[nodes.size()]); 215 rootNode.getChildren().add(nodesArr); 216 for (int i = 1; i < nodesArr.length; i++) { 217 beanTreeView1.expandNode(nodesArr[i]); 218 } 219 beanTreeView1.expandNode(nodesArr[0]); 220 221 if (mPreviousSelectedComponent != null) { 222 String tns = mPreviousSelectedComponent.getModel().getSchema().getTargetNamespace(); 223 boolean selected = false; 224 if (tns != null) { 225 if (XMLConstants.W3C_XML_SCHEMA_NS_URI.equals(tns)) { 226 selected = selectNode(builtInTypes, mPreviousSelectedComponent); 227 } else { 228 if (inlineTypesFolderNode == null || !selectNode(inlineTypesFolderNode, mPreviousSelectedComponent)) { 229 selected = externalSchemaNode != null ? selectNode(externalSchemaNode, mPreviousSelectedComponent) : false; 230 } else { 231 selected = true; 232 } 233 } 234 } else { 235 if (inlineTypesFolderNode != null) { 237 selected = selectNode(inlineTypesFolderNode, mPreviousSelectedComponent); 238 } 239 } 240 if (selected) { 241 firePropertyChange(ElementOrTypeChooserPanel.PROP_ACTION_APPLY, false, true); 242 } 243 } 244 245 } 246 247 private ProjectFolderNode createProjectFolderNode(Project project) { 248 LogicalViewProvider viewProvider = (LogicalViewProvider) project.getLookup(). 249 lookup(LogicalViewProvider.class); 250 return new ProjectFolderNode(viewProvider.createLogicalView(), project); 251 } 252 253 private boolean selectNode(Node parentNode, SchemaComponent element) { 254 Children children = parentNode.getChildren(); 255 for (Node node : children.getNodes()) { 256 SchemaComponent sc = null; 257 SchemaComponentReference reference = (SchemaComponentReference) node.getLookup().lookup(SchemaComponentReference.class); 258 if (reference != null) { 259 sc = reference.get(); 260 } 261 if (sc == null) { 262 sc = (SchemaComponent) node.getLookup().lookup(SchemaComponent.class); 263 } 264 265 if (sc == element) { 266 final Node finalNode = node; 267 Runnable run = new Runnable () { 268 public void run() { 269 if(manager != null) { 270 try { 271 manager.setExploredContextAndSelection(finalNode, new Node[] {finalNode}); 272 beanTreeView1.expandNode(finalNode); 273 } catch(PropertyVetoException ex) { 274 } 276 277 } 278 } 279 }; 280 SwingUtilities.invokeLater(run); 281 return true; 282 } 283 284 if (selectNode(node, element)) { 285 return true; 286 } 287 } 288 return false; 289 } 290 291 292 private File [] recursiveListFiles(File file, FileFilter filter) { 293 List <File > files = new ArrayList <File >(); 294 File [] filesArr = file.listFiles(new SchemaFileFilter()); 295 files.addAll(Arrays.asList(filesArr)); 296 File [] dirs = file.listFiles(new DirFileFilter()); 297 for (File dir : dirs) { 298 files.addAll(Arrays.asList(recursiveListFiles(dir, filter))); 299 } 300 return files.toArray(new File [files.size()]); 301 } 302 303 public ExplorerManager getExplorerManager() { 304 return manager; 305 } 306 307 308 309 public static final void main(String [] args) { 310 314 } 315 316 public void apply() { 317 if (selectedComponent != null) { 318 if (selectedComponent instanceof GlobalType) { 319 selectedElementOrType = new ElementOrType((GlobalType)selectedComponent, namespaceToPrefixMap); 320 } else if (selectedComponent instanceof GlobalElement) { 321 selectedElementOrType = new ElementOrType((GlobalElement)selectedComponent, namespaceToPrefixMap); 322 } 323 } 324 } 325 326 @Override 327 public void removeNotify() { 328 if (mEnv != null && mEnv.getState().equals(PropertyEnv.STATE_VALID)) { 329 if (selectedComponent != null) { 330 this.firePropertyChange(ElementOrTypePropertyEditor.PROP_NAME, null, selectedComponent); 331 } 332 } 333 334 super.removeNotify(); 335 } 336 337 private ExplorerManager manager; 338 public static String PROP_ACTION_APPLY = "APPLY"; 339 private ElementOrType selectedElementOrType; 340 private SchemaComponent selectedComponent; 341 private transient DefaultProjectCatalogSupport catalogSupport; 342 343 344 private org.openide.explorer.view.BeanTreeView beanTreeView1; 346 class ExplorerPropertyChangeListener implements PropertyChangeListener { 348 349 public void propertyChange(PropertyChangeEvent evt) { 350 if(evt.getPropertyName().equals(ExplorerManager.PROP_SELECTED_NODES)) { 351 Node[] nodes = (Node[]) evt.getNewValue(); 352 if(nodes.length > 0) { 353 Node node = nodes[0]; 354 firePropertyChange(PROP_ACTION_APPLY, true, false); 356 SchemaComponent sc = null; 357 SchemaComponentReference reference = (SchemaComponentReference) node.getLookup().lookup(SchemaComponentReference.class); 358 if (reference != null) { 359 sc = reference.get(); 360 } 361 if (sc == null) { 362 sc = (SchemaComponent) node.getLookup().lookup(SchemaComponent.class); 363 } 364 365 if (sc != null && (sc instanceof GlobalType || sc instanceof GlobalElement)) { 366 selectedComponent = sc; 367 firePropertyChange(PROP_ACTION_APPLY, false, true); 368 } 369 } 370 } 371 } 372 } 373 374 public ElementOrType getSelectedComponent() { 375 return selectedElementOrType; 376 } 377 378 public SchemaComponent getSelectedSchemaComponent() { 379 return selectedComponent; 380 } 381 382 public void setSelectedComponent(ElementOrType selectedComponent) { 383 this.selectedElementOrType = selectedComponent; 384 } 385 386 387 static class SchemaFileFilter implements FileFilter { 388 389 public boolean accept(File pathname) { 390 boolean result = false; 391 String fileName = pathname.getName(); 392 String fileExtension = null; 393 int dotIndex = fileName.lastIndexOf('.'); 394 if(dotIndex != -1) { 395 fileExtension = fileName.substring(dotIndex +1); 396 } 397 398 if(fileExtension != null 399 && (fileExtension.equalsIgnoreCase(SCHEMA_FILE_EXTENSION))) { 400 result = true; 401 } 402 403 return result; 404 } 405 } 406 407 static class DirFileFilter implements FileFilter { 408 409 public boolean accept(File pathname) { 410 return pathname.isDirectory(); 411 } 412 } 413 414 public static final String SCHEMA_FILE_EXTENSION = "xsd"; 415 416 class ExternalSchemaFolderNode extends AbstractNode { 417 418 public ExternalSchemaFolderNode(Children children) { 419 super(children); 420 setDisplayName(NbBundle.getMessage(ElementOrTypeChooserPanel.class, "LBL_ByFile_DisplayName")); 421 } 422 423 } 424 425 426 class ProjectFolderNode extends FilterNode { 427 public ProjectFolderNode(Node original, Project project) { 428 super(original, new ProjectFolderChildren(project)); 429 } 430 } 431 432 class ProjectFolderChildren extends Children.Keys { 433 434 private final FileObject projectDir; 435 private final Project project; 436 437 public ProjectFolderChildren (Project project) { 438 this.project = project; 439 this.projectDir = project.getProjectDirectory();; 440 } 441 442 @Override 443 public Node[] createNodes(Object key) { 444 FileObject fo = (FileObject) key; 445 ModelSource modelSource = org.netbeans.modules.xml.retriever.catalog.Utilities.getModelSource(fo, false); 446 SchemaModel model = SchemaModelFactory.getDefault().getModel(modelSource); 447 List <Class <? extends SchemaComponent>> filters = new ArrayList <Class <? extends SchemaComponent>>(); 448 filters.add(GlobalSimpleType.class); 449 filters.add(GlobalComplexType.class); 450 filters.add(GlobalElement.class); 451 CategorizedSchemaNodeFactory factory = new CategorizedSchemaNodeFactory( 452 model, filters, Lookup.EMPTY); 453 return new Node[] {new SchemaFileNode( 454 factory.createNode(model.getSchema()), 455 FileUtil.getRelativePath(projectDir, fo))}; 456 457 } 458 459 @Override 460 protected void addNotify() { 461 resetKeys(); 462 } 463 464 @Override 465 protected void removeNotify() { 466 this.setKeys(Collections.EMPTY_SET); 467 468 } 469 470 @SuppressWarnings ("unchecked") 471 private void resetKeys() { 472 ArrayList keys = new ArrayList (); 473 LogicalViewProvider viewProvider = (LogicalViewProvider) project.getLookup(). 474 lookup(LogicalViewProvider.class); 475 Node node = viewProvider.createLogicalView(); 476 Children children = node.getChildren(); 477 for (Node child : children.getNodes()) { 478 DataObject dobj = (DataObject) child.getCookie(DataObject.class); 479 if (dobj != null) { 480 File [] files = recursiveListFiles(FileUtil.toFile(dobj.getPrimaryFile()), new SchemaFileFilter()); 481 for (File file : files) { 482 FileObject fo = FileUtil.toFileObject(file); 483 keys.add(fo); 484 } 485 } 486 } 487 this.setKeys(keys); 488 } 489 490 @Override 491 public boolean remove(final Node[] arr) { 492 return super.remove(arr); 493 } 494 } 495 496 class SchemaFileNode extends FilterNode { 497 498 String displayName; 499 500 public SchemaFileNode(Node original, String path) { 501 super(original, new SchemaFileNodeChildren(original)); 502 displayName = path; 503 504 } 505 506 @Override 507 public String getDisplayName() { 508 return displayName; 509 } 510 511 512 513 } 514 515 static class SchemaFileNodeChildren extends FilterNode.Children { 516 517 public SchemaFileNodeChildren(Node node) { 518 super(node); 519 } 520 521 @Override 522 protected Node[] createNodes(Node n) { 523 return new Node[] {new CategoryFilterNode(n)}; 524 } 525 526 } 527 528 static class CategoryFilterNode extends FilterNode { 529 530 public CategoryFilterNode(Node node) { 531 super(node, new CategoryFilterChildren(node)); 532 } 533 534 535 } 536 537 static class CategoryFilterChildren extends FilterNode.Children { 538 539 public CategoryFilterChildren(Node node) { 540 super(node); 541 } 542 543 @Override 544 protected Node[] createNodes(Node n) { 545 return new Node[] {new ChildLessNode(n)}; 546 } 547 548 } 549 550 static class ChildLessNode extends FilterNode { 551 552 553 public ChildLessNode(Node node) { 554 super(node, Children.LEAF); 555 } 556 557 } 558 559 static class InlineTypesFolderNode extends FilterNode { 560 private Collection <Schema> mSchemas; 561 562 public InlineTypesFolderNode(Node node, Collection <Schema> schemas) { 563 super(node); 564 mSchemas = schemas; 565 setDisplayName(NbBundle.getMessage(XSDTypesNode.class, "INLINE_SCHEMATYPE_NAME")); 566 setChildren(new TypesChildren()); 567 } 568 569 570 class TypesChildren extends Children.Keys { 571 572 public TypesChildren() { 573 574 } 575 576 @Override 577 protected Node[] createNodes(Object key) { 578 List <Class <? extends SchemaComponent>> filters = new ArrayList <Class <? extends SchemaComponent>>(); 579 filters.add(GlobalSimpleType.class); 580 filters.add(GlobalComplexType.class); 581 filters.add(GlobalElement.class); 582 CategorizedSchemaNodeFactory factory = new CategorizedSchemaNodeFactory( 583 ((Schema)key).getModel(), filters, Lookup.EMPTY); 584 Node node = factory.createNode((Schema) key); 585 return new Node[] { node }; 586 587 } 588 589 590 @Override 591 protected void addNotify() { 592 resetKeys(); 593 } 594 595 @Override 596 protected void removeNotify() { 597 this.setKeys(Collections.EMPTY_SET); 598 599 } 600 601 private void resetKeys() { 602 this.setKeys(mSchemas); 603 } 604 605 @Override 606 public boolean remove (final Node[] arr) { 607 resetKeys(); 617 return super.remove(arr); 618 } 619 } 620 } 621 622 public void setEnvForPropertyEditor(PropertyEnv env) { 623 mEnv = env; 624 } 625 626 PropertyEnv mEnv; 627 } 628 | Popular Tags |