KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > netbeans > modules > xml > wsdl > ui > view > ElementOrTypeChooserPanel


1 /*
2  * The contents of this file are subject to the terms of the Common Development
3  * and Distribution License (the License). You may not use this file except in
4  * compliance with the License.
5  *
6  * You can obtain a copy of the License at http://www.netbeans.org/cddl.html
7  * or http://www.netbeans.org/cddl.txt.
8  *
9  * When distributing Covered Code, include this CDDL Header Notice in each file
10  * and include the License file at http://www.netbeans.org/cddl.txt.
11  * If applicable, add the following below the CDDL Header, with the fields
12  * enclosed by brackets [] replaced by your own identifying information:
13  * "Portions Copyrighted [year] [name of copyright owner]"
14  *
15  * The Original Software is NetBeans. The Initial Developer of the Original
16  * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun
17  * Microsystems, Inc. All Rights Reserved.
18  */

19
20 /*
21  * ElementOrTypeChooserPanel.java
22  *
23  * Created on September 1, 2006, 2:37 PM
24  */

25
26 package org.netbeans.modules.xml.wsdl.ui.view;
27
28 import java.beans.PropertyChangeEvent JavaDoc;
29 import java.beans.PropertyChangeListener JavaDoc;
30 import java.beans.PropertyVetoException JavaDoc;
31 import java.io.File JavaDoc;
32 import java.io.FileFilter JavaDoc;
33 import java.util.ArrayList JavaDoc;
34 import java.util.Arrays JavaDoc;
35 import java.util.Collection JavaDoc;
36 import java.util.Collections JavaDoc;
37 import java.util.List JavaDoc;
38 import java.util.Map JavaDoc;
39 import java.util.Set JavaDoc;
40
41 import javax.swing.SwingUtilities JavaDoc;
42 import javax.xml.XMLConstants JavaDoc;
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 /**
78  *
79  * @author skini
80  */

81 public class ElementOrTypeChooserPanel extends javax.swing.JPanel JavaDoc implements ExplorerManager.Provider {
82     
83     private Map JavaDoc<String JavaDoc, String JavaDoc> namespaceToPrefixMap;
84     private Project mProject;
85     private WSDLModel mModel;
86     private SchemaComponent mPreviousSelectedComponent;
87     
88     /** Creates new form ElementOrTypeChooserPanel */
89     public ElementOrTypeChooserPanel(Project project, Map JavaDoc<String JavaDoc, String JavaDoc> 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 JavaDoc<String JavaDoc, String JavaDoc> 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     /** This method is called from within the constructor to
107      * initialize the form.
108      * WARNING: Do NOT modify this code. The content of this method is
109      * always regenerated by the Form Editor.
110      */

111     // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
112
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     }// </editor-fold>//GEN-END:initComponents
135

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 JavaDoc<Node> nodes = new ArrayList JavaDoc<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 JavaDoc<Schema> schemas = def.getTypes().getSchemas();
152                 if (schemas != null && !schemas.isEmpty()) {
153                     List JavaDoc<Schema> filteredSchemas = new ArrayList JavaDoc<Schema>();
154                     for (Schema schema : schemas) {
155                         Collection JavaDoc<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 JavaDoc<Node> projectNodes = new ArrayList JavaDoc<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 JavaDoc refProjects = catalogSupport.getProjectReferences();
184             if (refProjects != null && refProjects.size() > 0) {
185                 for (Object JavaDoc 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         //builtin is last
212
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 JavaDoc 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                 // must be inline.
236
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 JavaDoc run = new Runnable JavaDoc() {
268                     public void run() {
269                         if(manager != null) {
270                                 try {
271                                     manager.setExploredContextAndSelection(finalNode, new Node[] {finalNode});
272                                     beanTreeView1.expandNode(finalNode);
273                                 } catch(PropertyVetoException JavaDoc ex) {
274                                     //ignore this
275
}
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 JavaDoc[] recursiveListFiles(File JavaDoc file, FileFilter JavaDoc filter) {
293         List JavaDoc<File JavaDoc> files = new ArrayList JavaDoc<File JavaDoc>();
294         File JavaDoc[] filesArr = file.listFiles(new SchemaFileFilter());
295         files.addAll(Arrays.asList(filesArr));
296         File JavaDoc[] dirs = file.listFiles(new DirFileFilter());
297         for (File JavaDoc dir : dirs) {
298             files.addAll(Arrays.asList(recursiveListFiles(dir, filter)));
299         }
300         return files.toArray(new File JavaDoc[files.size()]);
301     }
302     
303     public ExplorerManager getExplorerManager() {
304         return manager;
305     }
306     
307     
308     
309     public static final void main(String JavaDoc[] args) {
310 /* JFrame frame = new JFrame();
311         frame.add(new ElementOrTypeChooserEditorPanel());
312         frame.setVisible(true);
313         frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);*/

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 JavaDoc
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 JavaDoc PROP_ACTION_APPLY = "APPLY";
339     private ElementOrType selectedElementOrType;
340     private SchemaComponent selectedComponent;
341     private transient DefaultProjectCatalogSupport catalogSupport;
342     
343     
344     // Variables declaration - do not modify//GEN-BEGIN:variables
345
private org.openide.explorer.view.BeanTreeView beanTreeView1;
346     // End of variables declaration//GEN-END:variables
347
class ExplorerPropertyChangeListener implements PropertyChangeListener JavaDoc {
348         
349         public void propertyChange(PropertyChangeEvent JavaDoc 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                     //set the selected node to null and state as invalid by default
355
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 JavaDoc {
388         
389         public boolean accept(File JavaDoc pathname) {
390             boolean result = false;
391             String JavaDoc fileName = pathname.getName();
392             String JavaDoc 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 JavaDoc {
408         
409         public boolean accept(File JavaDoc pathname) {
410             return pathname.isDirectory();
411         }
412     }
413     
414     public static final String JavaDoc 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 JavaDoc
443         public Node[] createNodes(Object JavaDoc 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 JavaDoc<Class JavaDoc<? extends SchemaComponent>> filters = new ArrayList JavaDoc<Class JavaDoc<? 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 JavaDoc
460         protected void addNotify() {
461             resetKeys();
462         }
463         
464         @Override JavaDoc
465         protected void removeNotify() {
466             this.setKeys(Collections.EMPTY_SET);
467             
468         }
469         
470         @SuppressWarnings JavaDoc("unchecked")
471         private void resetKeys() {
472             ArrayList JavaDoc keys = new ArrayList JavaDoc();
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 JavaDoc[] files = recursiveListFiles(FileUtil.toFile(dobj.getPrimaryFile()), new SchemaFileFilter());
481                     for (File JavaDoc file : files) {
482                         FileObject fo = FileUtil.toFileObject(file);
483                         keys.add(fo);
484                     }
485                 }
486             }
487             this.setKeys(keys);
488         }
489         
490         @Override JavaDoc
491         public boolean remove(final Node[] arr) {
492             return super.remove(arr);
493         }
494     }
495     
496     class SchemaFileNode extends FilterNode {
497
498         String JavaDoc displayName;
499         
500         public SchemaFileNode(Node original, String JavaDoc path) {
501             super(original, new SchemaFileNodeChildren(original));
502             displayName = path;
503             
504         }
505
506         @Override JavaDoc
507         public String JavaDoc 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 JavaDoc
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 JavaDoc
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 JavaDoc<Schema> mSchemas;
561          
562          public InlineTypesFolderNode(Node node, Collection JavaDoc<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 JavaDoc
577         protected Node[] createNodes(Object JavaDoc key) {
578             List JavaDoc<Class JavaDoc<? extends SchemaComponent>> filters = new ArrayList JavaDoc<Class JavaDoc<? 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 JavaDoc
591         protected void addNotify() {
592             resetKeys();
593         }
594         
595         @Override JavaDoc
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 JavaDoc
606         public boolean remove (final Node[] arr) {
607             //HACK: we want to reset the keys
608
//and also want to call super.remove
609
//so that tree gets refreshed.
610
//we need to add resetkeys
611
//because when nodes are created from
612
//persisted bpel info
613
//super.remove() does not delete a node.(it is not in nodes collection)
614
//supper.remove() removes node when user create
615
//a new node for the first time. So we need both here.
616
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