This Bugzilla instance is a read-only archive of historic NetBeans bug reports. To report a bug in NetBeans please follow the project's instructions for reporting issues.

View | Details | Raw Unified | Return to bug 206126
Collapse All | Expand All

(-)a/apisupport.ant/src/org/netbeans/modules/apisupport/project/NbModuleProject.java (-1 / +1 lines)
Lines 934-939 Link Here
934
        }
934
        }
935
        
935
        
936
        private static final String[] RECOMMENDED_TYPES = {
936
        private static final String[] RECOMMENDED_TYPES = {
937
            UIUtil.TEMPLATE_CATEGORY,
937
            "java-classes",         // NOI18N
938
            "java-classes",         // NOI18N
938
            "java-main-class",      // NOI18N
939
            "java-main-class",      // NOI18N
939
            "java-forms",           // NOI18N
940
            "java-forms",           // NOI18N
Lines 945-951 Link Here
945
            "ant-task",             // NOI18N
946
            "ant-task",             // NOI18N
946
            "junit",                // NOI18N                    
947
            "junit",                // NOI18N                    
947
            "simple-files",         // NOI18N
948
            "simple-files",         // NOI18N
948
            UIUtil.TEMPLATE_CATEGORY,
949
        };
949
        };
950
        
950
        
951
        @Override public String[] getPrivilegedTemplates() {
951
        @Override public String[] getPrivilegedTemplates() {
(-)a/java.j2seproject/src/org/netbeans/modules/java/j2seproject/J2SEProject.java (-11 / +14 lines)
Lines 99-104 Link Here
99
import org.netbeans.spi.java.project.support.LookupMergerSupport;
99
import org.netbeans.spi.java.project.support.LookupMergerSupport;
100
import org.netbeans.spi.java.project.support.ui.BrokenReferencesSupport;
100
import org.netbeans.spi.java.project.support.ui.BrokenReferencesSupport;
101
import org.netbeans.spi.project.AuxiliaryConfiguration;
101
import org.netbeans.spi.project.AuxiliaryConfiguration;
102
import org.netbeans.spi.project.LookupProvider.Registration.ProjectType;
103
import org.netbeans.spi.project.ProjectServiceProvider;
102
import org.netbeans.spi.project.ant.AntArtifactProvider;
104
import org.netbeans.spi.project.ant.AntArtifactProvider;
103
import org.netbeans.spi.project.ant.AntBuildExtenderFactory;
105
import org.netbeans.spi.project.ant.AntBuildExtenderFactory;
104
import org.netbeans.spi.project.support.LookupProviderSupport;
106
import org.netbeans.spi.project.support.LookupProviderSupport;
Lines 374-380 Link Here
374
            QuerySupport.createSources(this, helper, evaluator(), getSourceRoots(), getTestSourceRoots(), Roots.nonSourceRoots(ProjectProperties.BUILD_DIR, J2SEProjectProperties.DIST_DIR)),
376
            QuerySupport.createSources(this, helper, evaluator(), getSourceRoots(), getTestSourceRoots(), Roots.nonSourceRoots(ProjectProperties.BUILD_DIR, J2SEProjectProperties.DIST_DIR)),
375
            QuerySupport.createSharabilityQuery2(helper, evaluator(), getSourceRoots(), getTestSourceRoots()),
377
            QuerySupport.createSharabilityQuery2(helper, evaluator(), getSourceRoots(), getTestSourceRoots()),
376
            new CoSAwareFileBuiltQueryImpl(QuerySupport.createFileBuiltQuery(helper, evaluator(), getSourceRoots(), getTestSourceRoots()), this),
378
            new CoSAwareFileBuiltQueryImpl(QuerySupport.createFileBuiltQuery(helper, evaluator(), getSourceRoots(), getTestSourceRoots()), this),
377
            new RecommendedTemplatesImpl (this.updateHelper),
378
            ProjectClassPathModifier.extenderForModifier(cpMod),
379
            ProjectClassPathModifier.extenderForModifier(cpMod),
379
            buildExtender,
380
            buildExtender,
380
            cpMod,
381
            cpMod,
Lines 734-746 Link Here
734
735
735
    }
736
    }
736
737
737
    private static final class RecommendedTemplatesImpl implements RecommendedTemplates, PrivilegedTemplates {
738
    @ProjectServiceProvider(service={RecommendedTemplates.class, PrivilegedTemplates.class}, projectTypes=@ProjectType(id="org-netbeans-modules-java-j2seproject", position=100))
738
        RecommendedTemplatesImpl (UpdateHelper helper) {
739
    public static final class RecommendedTemplatesImpl implements RecommendedTemplates, PrivilegedTemplates {
739
            this.helper = helper;
740
741
        private final J2SEProject project;
742
743
        public RecommendedTemplatesImpl(Project project) {
744
            this.project = (J2SEProject) project;
740
        }
745
        }
741
746
742
        private UpdateHelper helper;
743
744
        // List of primarily supported templates
747
        // List of primarily supported templates
745
748
746
        private static final String[] APPLICATION_TYPES = new String[] {
749
        private static final String[] APPLICATION_TYPES = new String[] {
Lines 752-759 Link Here
752
            "persistence",          // NOI18N
755
            "persistence",          // NOI18N
753
            "oasis-XML-catalogs",   // NOI18N
756
            "oasis-XML-catalogs",   // NOI18N
754
            "XML",                  // NOI18N
757
            "XML",                  // NOI18N
755
            "ant-script",           // NOI18N
756
            "ant-task",             // NOI18N
757
            "web-service-clients",  // NOI18N
758
            "web-service-clients",  // NOI18N
758
            "REST-clients",         // NOI18N
759
            "REST-clients",         // NOI18N
759
            "wsdl",                 // NOI18N
760
            "wsdl",                 // NOI18N
Lines 761-766 Link Here
761
            // "web-types",         // NOI18N
762
            // "web-types",         // NOI18N
762
            "junit",                // NOI18N
763
            "junit",                // NOI18N
763
            // "MIDP",              // NOI18N
764
            // "MIDP",              // NOI18N
765
            "ant-script",           // NOI18N
766
            "ant-task",             // NOI18N
764
            "simple-files"          // NOI18N
767
            "simple-files"          // NOI18N
765
        };
768
        };
766
769
Lines 773-780 Link Here
773
            "persistence",          // NOI18N
776
            "persistence",          // NOI18N
774
            "oasis-XML-catalogs",   // NOI18N
777
            "oasis-XML-catalogs",   // NOI18N
775
            "XML",                  // NOI18N
778
            "XML",                  // NOI18N
776
            "ant-script",           // NOI18N
777
            "ant-task",             // NOI18N
778
            "servlet-types",        // NOI18N
779
            "servlet-types",        // NOI18N
779
            "servlet-types-j2se-only",// NOI18N
780
            "servlet-types-j2se-only",// NOI18N
780
            "web-service-clients",  // NOI18N
781
            "web-service-clients",  // NOI18N
Lines 783-788 Link Here
783
            // "web-types",         // NOI18N
784
            // "web-types",         // NOI18N
784
            "junit",                // NOI18N
785
            "junit",                // NOI18N
785
            // "MIDP",              // NOI18N
786
            // "MIDP",              // NOI18N
787
            "ant-script",           // NOI18N
788
            "ant-task",             // NOI18N
786
            "simple-files"         // NOI18N
789
            "simple-files"         // NOI18N
787
        };
790
        };
788
791
Lines 800-806 Link Here
800
        @Override
803
        @Override
801
        public String[] getRecommendedTypes() {
804
        public String[] getRecommendedTypes() {
802
805
803
            EditableProperties ep = helper.getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH);
806
            EditableProperties ep = project.getUpdateHelper().getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH);
804
            // if the project has no main class, it's not really an application
807
            // if the project has no main class, it's not really an application
805
            boolean isLibrary = ep.getProperty (ProjectProperties.MAIN_CLASS) == null || "".equals (ep.getProperty (ProjectProperties.MAIN_CLASS)); // NOI18N
808
            boolean isLibrary = ep.getProperty (ProjectProperties.MAIN_CLASS) == null || "".equals (ep.getProperty (ProjectProperties.MAIN_CLASS)); // NOI18N
806
            return isLibrary ? LIBRARY_TYPES : APPLICATION_TYPES;
809
            return isLibrary ? LIBRARY_TYPES : APPLICATION_TYPES;
(-)a/javafx2.project/src/org/netbeans/modules/javafx2/project/JFXRecommendedTemplates.java (-3 / +2 lines)
Lines 41-46 Link Here
41
 */
41
 */
42
package org.netbeans.modules.javafx2.project;
42
package org.netbeans.modules.javafx2.project;
43
43
44
import org.netbeans.spi.project.LookupProvider.Registration.ProjectType;
44
import org.netbeans.spi.project.ProjectServiceProvider;
45
import org.netbeans.spi.project.ProjectServiceProvider;
45
import org.netbeans.spi.project.ui.RecommendedTemplates;
46
import org.netbeans.spi.project.ui.RecommendedTemplates;
46
47
Lines 48-56 Link Here
48
 *
49
 *
49
 * @author Tomas Zezula
50
 * @author Tomas Zezula
50
 */
51
 */
51
@ProjectServiceProvider(
52
@ProjectServiceProvider(service=RecommendedTemplates.class, projectTypes=@ProjectType(id="org-netbeans-modules-java-j2seproject", position=200))
52
    service=RecommendedTemplates.class,
53
    projectType={"org-netbeans-modules-java-j2seproject"})
54
public class JFXRecommendedTemplates implements RecommendedTemplates {
53
public class JFXRecommendedTemplates implements RecommendedTemplates {
55
54
56
    private static final String[] RECOMMENDED_TEMPLATES = {
55
    private static final String[] RECOMMENDED_TEMPLATES = {
(-)a/javawebstart/src/org/netbeans/modules/javawebstart/package-info.java (-1 / +1 lines)
Lines 36-42 Link Here
36
 * Portions Copyrighted 2011 Sun Microsystems, Inc.
36
 * Portions Copyrighted 2011 Sun Microsystems, Inc.
37
 */
37
 */
38
38
39
@TemplateRegistration(folder="Other", content="JnlpTemplate.jnlp", category="java-classes", displayName="#JnlpTemplate", description="resources/JNLPTemplate.html", position=500)
39
@TemplateRegistration(folder="Classes", position=2000, content="JnlpTemplate.jnlp", category="java-classes", displayName="#JnlpTemplate", description="resources/JNLPTemplate.html")
40
@Messages("JnlpTemplate=JNLP File")
40
@Messages("JnlpTemplate=JNLP File")
41
package org.netbeans.modules.javawebstart;
41
package org.netbeans.modules.javawebstart;
42
42
(-)a/maven.apisupport/src/org/netbeans/modules/maven/apisupport/ApisupportRecoPrivTemplates.java (-3 / +4 lines)
Lines 44-49 Link Here
44
44
45
import org.netbeans.modules.apisupport.project.api.UIUtil;
45
import org.netbeans.modules.apisupport.project.api.UIUtil;
46
import org.netbeans.modules.maven.api.NbMavenProject;
46
import org.netbeans.modules.maven.api.NbMavenProject;
47
import org.netbeans.spi.project.LookupProvider.Registration.ProjectType;
47
import org.netbeans.spi.project.ProjectServiceProvider;
48
import org.netbeans.spi.project.ProjectServiceProvider;
48
import org.netbeans.spi.project.ui.PrivilegedTemplates;
49
import org.netbeans.spi.project.ui.PrivilegedTemplates;
49
import org.netbeans.spi.project.ui.RecommendedTemplates;
50
import org.netbeans.spi.project.ui.RecommendedTemplates;
Lines 52-58 Link Here
52
 * apisupport specific part of RecommendedTemplates and PrivilegedTemplates,
53
 * apisupport specific part of RecommendedTemplates and PrivilegedTemplates,
53
 * @author Milos Kleint
54
 * @author Milos Kleint
54
 */
55
 */
55
@ProjectServiceProvider(service={RecommendedTemplates.class, PrivilegedTemplates.class}, projectType="org-netbeans-modules-maven/" + NbMavenProject.TYPE_NBM)
56
@ProjectServiceProvider(service={RecommendedTemplates.class, PrivilegedTemplates.class}, projectTypes=@ProjectType(id="org-netbeans-modules-maven/" + NbMavenProject.TYPE_NBM, position=100))
56
public class ApisupportRecoPrivTemplates implements RecommendedTemplates, PrivilegedTemplates {
57
public class ApisupportRecoPrivTemplates implements RecommendedTemplates, PrivilegedTemplates {
57
    
58
    
58
        private static final String[] NBM_PRIVILEGED_NAMES = {
59
        private static final String[] NBM_PRIVILEGED_NAMES = {
Lines 66-81 Link Here
66
            //"Templates/Other/properties.properties", // NOI18N
67
            //"Templates/Other/properties.properties", // NOI18N
67
        };
68
        };
68
        private static final String[] NBM_TYPES = {         
69
        private static final String[] NBM_TYPES = {         
70
            UIUtil.TEMPLATE_CATEGORY,
69
            "java-classes",         // NOI18N
71
            "java-classes",         // NOI18N
70
            "java-main-class",      // NOI18N
72
            "java-main-class",      // NOI18N
71
            "java-forms",           // NOI18N
73
            "java-forms",           // NOI18N
72
            "java-beans",           // NOI18N
74
            "java-beans",           // NOI18N
73
            "oasis-XML-catalogs",   // NOI18N
75
            "oasis-XML-catalogs",   // NOI18N
74
            "XML",                  // NOI18N
76
            "XML",                  // NOI18N
75
            "junit",                // NOI18N                    
77
            "junit",                // NOI18N
76
            "simple-files",         // NOI18N
78
            "simple-files",         // NOI18N
77
            "REST-clients",         // NOI18N
79
            "REST-clients",         // NOI18N
78
            UIUtil.TEMPLATE_CATEGORY,
79
        };
80
        };
80
        
81
        
81
    
82
    
(-)a/maven.persistence/src/org/netbeans/modules/maven/persistence/RecommendedTemplatesImpl.java (-1 / +2 lines)
Lines 42-51 Link Here
42
42
43
package org.netbeans.modules.maven.persistence;
43
package org.netbeans.modules.maven.persistence;
44
44
45
import org.netbeans.spi.project.LookupProvider.Registration.ProjectType;
45
import org.netbeans.spi.project.ProjectServiceProvider;
46
import org.netbeans.spi.project.ProjectServiceProvider;
46
import org.netbeans.spi.project.ui.RecommendedTemplates;
47
import org.netbeans.spi.project.ui.RecommendedTemplates;
47
48
48
@ProjectServiceProvider(service=RecommendedTemplates.class, projectType="org-netbeans-modules-maven")
49
@ProjectServiceProvider(service=RecommendedTemplates.class, projectTypes=@ProjectType(id="org-netbeans-modules-maven", position=700))
49
public class RecommendedTemplatesImpl implements RecommendedTemplates {
50
public class RecommendedTemplatesImpl implements RecommendedTemplates {
50
    public String[] getRecommendedTypes() {
51
    public String[] getRecommendedTypes() {
51
        return new String[] {"persistence"};
52
        return new String[] {"persistence"};
(-)a/maven/src/org/netbeans/modules/maven/queries/RecommendedTemplatesImpl.java (-1 / +2 lines)
Lines 48-58 Link Here
48
import org.netbeans.api.project.Project;
48
import org.netbeans.api.project.Project;
49
import org.netbeans.api.project.ProjectUtils;
49
import org.netbeans.api.project.ProjectUtils;
50
import org.netbeans.modules.maven.api.NbMavenProject;
50
import org.netbeans.modules.maven.api.NbMavenProject;
51
import org.netbeans.spi.project.LookupProvider.Registration.ProjectType;
51
import org.netbeans.spi.project.ProjectServiceProvider;
52
import org.netbeans.spi.project.ProjectServiceProvider;
52
import org.netbeans.spi.project.ui.PrivilegedTemplates;
53
import org.netbeans.spi.project.ui.PrivilegedTemplates;
53
import org.netbeans.spi.project.ui.RecommendedTemplates;
54
import org.netbeans.spi.project.ui.RecommendedTemplates;
54
55
55
@ProjectServiceProvider(service={RecommendedTemplates.class, PrivilegedTemplates.class}, projectType="org-netbeans-modules-maven")
56
@ProjectServiceProvider(service={RecommendedTemplates.class, PrivilegedTemplates.class}, projectTypes=@ProjectType(id="org-netbeans-modules-maven", position=100))
56
public final class RecommendedTemplatesImpl implements RecommendedTemplates, PrivilegedTemplates {
57
public final class RecommendedTemplatesImpl implements RecommendedTemplates, PrivilegedTemplates {
57
58
58
    private static final String[] JAR_APPLICATION_TYPES = {
59
    private static final String[] JAR_APPLICATION_TYPES = {
(-)a/nbbuild/antsrc/org/netbeans/nbbuild/LayerIndex.java (-3 / +83 lines)
Lines 51-62 Link Here
51
import java.io.InputStreamReader;
51
import java.io.InputStreamReader;
52
import java.io.PrintWriter;
52
import java.io.PrintWriter;
53
import java.io.StringReader;
53
import java.io.StringReader;
54
import java.text.Collator;
54
import java.util.ArrayList;
55
import java.util.ArrayList;
56
import java.util.Arrays;
55
import java.util.Comparator;
57
import java.util.Comparator;
56
import java.util.Enumeration;
58
import java.util.Enumeration;
57
import java.util.HashMap;
59
import java.util.HashMap;
58
import java.util.HashSet;
60
import java.util.HashSet;
59
import java.util.List;
61
import java.util.List;
62
import java.util.Locale;
60
import java.util.Map;
63
import java.util.Map;
61
import java.util.Properties;
64
import java.util.Properties;
62
import java.util.Set;
65
import java.util.Set;
Lines 110-115 Link Here
110
        serviceOutput = f;
113
        serviceOutput = f;
111
    }
114
    }
112
115
116
    private File templatesOutput;
117
    public void setTemplatesOutput(File f) {
118
        templatesOutput = f;
119
    }
120
113
    private String resourceId;
121
    private String resourceId;
114
    private List<ZipResource> resources;
122
    private List<ZipResource> resources;
115
    /** If this parameter is provided, then this tasks creates a resource
123
    /** If this parameter is provided, then this tasks creates a resource
Lines 129-134 Link Here
129
        SortedMap<String,String> files = new TreeMap<String,String>(); // layer path -> cnb
137
        SortedMap<String,String> files = new TreeMap<String,String>(); // layer path -> cnb
130
        SortedMap<String,SortedMap<String,String>> labels = new TreeMap<String,SortedMap<String,String>>(); // layer path -> cnb -> label
138
        SortedMap<String,SortedMap<String,String>> labels = new TreeMap<String,SortedMap<String,String>>(); // layer path -> cnb -> label
131
        final Map<String,Integer> positions = new TreeMap<String,Integer>(); // layer path -> position
139
        final Map<String,Integer> positions = new TreeMap<String,Integer>(); // layer path -> position
140
        SortedMap<String,Set<String>> templateCategories = new TreeMap<String,Set<String>>(Collator.getInstance(Locale.ENGLISH)); // templateCategory item (or "") -> layer paths
132
        SortedMap<String,SortedMap<String,Set<String>>> serviceImpls = new TreeMap<String,SortedMap<String,Set<String>>>(); // path -> interface -> [impl]
141
        SortedMap<String,SortedMap<String,Set<String>>> serviceImpls = new TreeMap<String,SortedMap<String,Set<String>>>(); // path -> interface -> [impl]
133
        Map<String,Integer> servicePositions = new HashMap<String,Integer>(); // impl -> position
142
        Map<String,Integer> servicePositions = new HashMap<String,Integer>(); // impl -> position
134
        for (FileSet fs : filesets) {
143
        for (FileSet fs : filesets) {
Lines 154-160 Link Here
154
                                ZipResource res = new LayerResource(jar, layer, layer.replaceFirst("/[^/]+$", "").replace('/', '.') + ".xml");
163
                                ZipResource res = new LayerResource(jar, layer, layer.replaceFirst("/[^/]+$", "").replace('/', '.') + ".xml");
155
                                resources.add(res);
164
                                resources.add(res);
156
                            } else {
165
                            } else {
157
                                parse(jf.getInputStream(jf.getEntry(layer)), files, labels, positions, cnb, jf);
166
                                parse(jf.getInputStream(jf.getEntry(layer)), files, labels, positions, templateCategories, cnb, jf);
158
                            }
167
                            }
159
                        }
168
                        }
160
                        ZipEntry generatedLayer = jf.getEntry("META-INF/generated-layer.xml");
169
                        ZipEntry generatedLayer = jf.getEntry("META-INF/generated-layer.xml");
Lines 163-169 Link Here
163
                                ZipResource res = new LayerResource(jar, generatedLayer.getName(), cnb + "-generated.xml");
172
                                ZipResource res = new LayerResource(jar, generatedLayer.getName(), cnb + "-generated.xml");
164
                                resources.add(res);
173
                                resources.add(res);
165
                            } else {
174
                            } else {
166
                                parse(jf.getInputStream(generatedLayer), files, labels, positions, cnb + "@", jf);
175
                                parse(jf.getInputStream(generatedLayer), files, labels, positions, templateCategories, cnb + "@", jf);
167
                            }
176
                            }
168
                        }
177
                        }
169
                        if (serviceOutput != null) {
178
                        if (serviceOutput != null) {
Lines 189-194 Link Here
189
            if (serviceOutput != null) {
198
            if (serviceOutput != null) {
190
                writeServiceIndex(serviceImpls, servicePositions);
199
                writeServiceIndex(serviceImpls, servicePositions);
191
            }
200
            }
201
            if (templatesOutput != null) {
202
                writeTemplateIndex(templateCategories, labels, positions);
203
            }
192
        } catch (IOException x) {
204
        } catch (IOException x) {
193
            throw new BuildException(x, getLocation());
205
            throw new BuildException(x, getLocation());
194
        }
206
        }
Lines 213-224 Link Here
213
    }
225
    }
214
226
215
    private void parse(InputStream is, final Map<String,String> files, final SortedMap<String,SortedMap<String,String>> labels,
227
    private void parse(InputStream is, final Map<String,String> files, final SortedMap<String,SortedMap<String,String>> labels,
216
            final Map<String,Integer> positions, final String cnb, final JarFile jf) throws Exception {
228
            final Map<String,Integer> positions, final Map<String,Set<String>> templateCategories, final String cnb, final JarFile jf) throws Exception {
217
        SAXParserFactory f = SAXParserFactory.newInstance();
229
        SAXParserFactory f = SAXParserFactory.newInstance();
218
        f.setValidating(false);
230
        f.setValidating(false);
219
        f.setNamespaceAware(false);
231
        f.setNamespaceAware(false);
220
        f.newSAXParser().parse(is, new DefaultHandler() {
232
        f.newSAXParser().parse(is, new DefaultHandler() {
221
            String prefix = "";
233
            String prefix = "";
234
            List<String> templateCategory;
235
            boolean template;
222
            void register(String path) {
236
            void register(String path) {
223
                if (!files.containsKey(path)) {
237
                if (!files.containsKey(path)) {
224
                    files.put(path, cnb);
238
                    files.put(path, cnb);
Lines 270-275 Link Here
270
                            throw new SAXException(x);
284
                            throw new SAXException(x);
271
                        }
285
                        }
272
                    }
286
                    }
287
                } else if (qName.equals("attr") && attributes.getValue("name").equals("template")) {
288
                    template = Boolean.parseBoolean(attributes.getValue("boolvalue"));
289
                } else if (qName.equals("attr") && attributes.getValue("name").equals("templateCategory")) {
290
                    templateCategory = Arrays.asList(attributes.getValue("stringvalue").split(" *, *"));
273
                }
291
                }
274
            }
292
            }
275
            private void loadDisplayName(String bundle, String key) throws SAXException {
293
            private void loadDisplayName(String bundle, String key) throws SAXException {
Lines 308-316 Link Here
308
                if (qName.equals("folder")) {
326
                if (qName.equals("folder")) {
309
                    prefix = prefix.replaceFirst("[^/]+/$", "");
327
                    prefix = prefix.replaceFirst("[^/]+/$", "");
310
                } else if (qName.equals("file")) {
328
                } else if (qName.equals("file")) {
329
                    // XXX really want to track simple=false, and templateCategory on folders
330
                    if (template && prefix.matches("Templates/(?!Project/|Licenses/|Services/|JSF/JSF_From_Entity_Wizard/|JSF/JSF_From_Entity_Snippets/).+")) {
331
                        if (templateCategory != null) {
332
                            for (String category : templateCategory) {
333
                                if (category.equals("invisible")) {
334
                                    continue;
335
                                }
336
                                registerTemplateCategory(category);
337
                            }
338
                        } else {
339
                            registerTemplateCategory("");
340
                        }
341
                        template = false;
342
                    }
343
                    templateCategory = null;
311
                    prefix = prefix.replaceFirst("[^/]+$", "");
344
                    prefix = prefix.replaceFirst("[^/]+$", "");
312
                }
345
                }
313
            }
346
            }
347
            void registerTemplateCategory(String category) {
348
                Set<String> paths = templateCategories.get(category);
349
                if (paths == null) {
350
                    paths = new TreeSet<String>();
351
                    templateCategories.put(category, paths);
352
                }
353
                paths.add(prefix);
354
            }
314
            @Override
355
            @Override
315
            public InputSource resolveEntity(String pub, String sys) throws IOException, SAXException {
356
            public InputSource resolveEntity(String pub, String sys) throws IOException, SAXException {
316
                return new InputSource(new StringReader(""));
357
                return new InputSource(new StringReader(""));
Lines 615-618 Link Here
615
        }
656
        }
616
    }
657
    }
617
658
659
    private void writeTemplateIndex(Map<String,Set<String>> templateCategories, SortedMap<String,SortedMap<String,String>> labels, Map<String,Integer> positions) throws IOException {
660
        PrintWriter pw = new PrintWriter(templatesOutput, "UTF-8");
661
        Comparator<String> order = new LayerPathComparator(positions);
662
        for (Map.Entry<String,Set<String>> categoryEntry : templateCategories.entrySet()) {
663
            pw.print("CATEGORY ");
664
            String category = categoryEntry.getKey();
665
            pw.println(category.isEmpty() ? "<any>" : "'" + category + "'");
666
            SortedMap<String,SortedSet<String>> templatesByFolder = new TreeMap<String,SortedSet<String>>(order);
667
            for (String path : categoryEntry.getValue()) {
668
                int slash = path.lastIndexOf('/');
669
                String folder = path.substring(0, slash + 1);
670
                SortedSet<String> templates = templatesByFolder.get(folder);
671
                if (templates == null) {
672
                    templates = new TreeSet<String>(order);
673
                    templatesByFolder.put(folder, templates);
674
                }
675
                templates.add(path);
676
            }
677
            for (Map.Entry<String,SortedSet<String>> folderEntry : templatesByFolder.entrySet()) {
678
                String folder = folderEntry.getKey();
679
                pw.print("  FOLDER " + folder);
680
                printlnLabel(pw, folder, labels);
681
                for (String template : folderEntry.getValue()) {
682
                    pw.print("    " + template.substring(folder.length()));
683
                    printlnLabel(pw, template, labels);
684
                }
685
            }
686
        }
687
        pw.close();
688
        log(templatesOutput + ": template index written");
689
    }
690
    private static void printlnLabel(PrintWriter pw, String path, SortedMap<String,SortedMap<String,String>> labels) {
691
        SortedMap<String,String> possibilities = labels.get(path);
692
        if (possibilities != null && possibilities.size() == 1) {
693
            pw.print(" (\"" + possibilities.values().iterator().next() + "\")");
694
        }
695
        pw.println();
696
    }
697
618
}
698
}
(-)a/nbbuild/build.xml (-1 / +1 lines)
Lines 1515-1521 Link Here
1515
          </condition>
1515
          </condition>
1516
      </fail>
1516
      </fail>
1517
      <taskdef name="layerindex" classname="org.netbeans.nbbuild.LayerIndex" classpath="${nbantext.jar}"/>
1517
      <taskdef name="layerindex" classname="org.netbeans.nbbuild.LayerIndex" classpath="${nbantext.jar}"/>
1518
      <layerindex output="${generated.files.dir}/layers.txt" serviceoutput="${generated.files.dir}/services.txt">
1518
      <layerindex output="${generated.files.dir}/layers.txt" serviceoutput="${generated.files.dir}/services.txt" templatesoutput="${generated.files.dir}/templates.txt">
1519
          <modules dir="${build}">
1519
          <modules dir="${build}">
1520
              <include name="**/*.jar"/>
1520
              <include name="**/*.jar"/>
1521
          </modules>
1521
          </modules>
(-)a/nbbuild/javadoctools/disallowed-links.xml (-1 / +1 lines)
Lines 91-96 Link Here
91
    <filter pattern="http://ui\.netbeans\.org/docs/ui/themes/themes\.html" accept="true"/>
91
    <filter pattern="http://ui\.netbeans\.org/docs/ui/themes/themes\.html" accept="true"/>
92
    <filter pattern="http://wiki.netbeans.org/.*" accept="true"/>
92
    <filter pattern="http://wiki.netbeans.org/.*" accept="true"/>
93
    <!-- Useful to point to open layer positions (see e.g. HOWTO-MIME.html): -->
93
    <!-- Useful to point to open layer positions (see e.g. HOWTO-MIME.html): -->
94
    <filter pattern="http://deadlock\.netbeans\.org/hudson/job/nbms-and-javadoc/lastSuccessfulBuild/artifact/nbbuild/build/generated/layers\.txt" accept="true"/>
94
    <filter pattern="http://deadlock\.netbeans\.org/hudson/job/nbms-and-javadoc/last.+Build/artifact/nbbuild/build/generated/.*" accept="true"/>
95
    <!-- forbid the rest of NetBeans sites -->
95
    <!-- forbid the rest of NetBeans sites -->
96
    <filter pattern="http://.*netbeans\.org/.*" accept="false"/>
96
    <filter pattern="http://.*netbeans\.org/.*" accept="false"/>
(-)a/projectui/src/org/netbeans/modules/project/ui/OpenProjectList.java (-3 / +3 lines)
Lines 1292-1298 Link Here
1292
                    if ( fo == null ) {
1292
                    if ( fo == null ) {
1293
                        it.remove(); // Does not exists remove
1293
                        it.remove(); // Does not exists remove
1294
                    }
1294
                    }
1295
                    else if ( isRecommended( rtNames, fo ) ) {
1295
                    else if (isRecommended(rtNames, fo, true)) {
1296
                        result.add( fo );
1296
                        result.add( fo );
1297
                        privilegedTemplates.remove( templateName ); // Not to have it twice
1297
                        privilegedTemplates.remove( templateName ); // Not to have it twice
1298
                    }
1298
                    }
Lines 1316-1322 Link Here
1316
               
1316
               
1317
    }
1317
    }
1318
1318
1319
    static boolean isRecommended(@NonNull String[] recommendedTypes, @NonNull FileObject primaryFile) {
1319
    static boolean isRecommended(@NonNull String[] recommendedTypes, @NonNull FileObject primaryFile, boolean lax) {
1320
        if (recommendedTypes.length == 0) {
1320
        if (recommendedTypes.length == 0) {
1321
            // if no recommendedTypes are supported (i.e. freeform) -> disaply all templates
1321
            // if no recommendedTypes are supported (i.e. freeform) -> disaply all templates
1322
            return true;
1322
            return true;
Lines 1335-1341 Link Here
1335
        } else {
1335
        } else {
1336
            // issue 44871, if attr 'templateCategorized' is not set => all is ok
1336
            // issue 44871, if attr 'templateCategorized' is not set => all is ok
1337
            // no category set, ok display it
1337
            // no category set, ok display it
1338
            return true;
1338
            return lax;
1339
        }
1339
        }
1340
    }
1340
    }
1341
1341
(-)a/projectui/src/org/netbeans/modules/project/ui/TemplateChooserPanelGUI.form (-1 / +1 lines)
Lines 1-4 Link Here
1
<?xml version="1.1" encoding="UTF-8" ?>
1
<?xml version="1.0" encoding="UTF-8" ?>
2
2
3
<Form version="1.2" maxVersion="1.2" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
3
<Form version="1.2" maxVersion="1.2" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
4
  <AuxValues>
4
  <AuxValues>
(-)a/projectui/src/org/netbeans/modules/project/ui/TemplateChooserPanelGUI.java (-34 / +49 lines)
Lines 50-60 Link Here
50
import java.beans.PropertyChangeEvent;
50
import java.beans.PropertyChangeEvent;
51
import java.beans.PropertyChangeListener;
51
import java.beans.PropertyChangeListener;
52
import java.util.Arrays;
52
import java.util.Arrays;
53
import java.util.HashSet;
53
import java.util.List;
54
import java.util.List;
55
import java.util.Set;
56
import java.util.logging.Level;
57
import java.util.logging.Logger;
54
import javax.swing.DefaultComboBoxModel;
58
import javax.swing.DefaultComboBoxModel;
55
import javax.swing.ListCellRenderer;
59
import javax.swing.ListCellRenderer;
56
import javax.swing.event.ChangeListener;
60
import javax.swing.event.ChangeListener;
57
import org.netbeans.api.annotations.common.NonNull;
61
import org.netbeans.api.annotations.common.CheckForNull;
58
import org.netbeans.api.project.Project;
62
import org.netbeans.api.project.Project;
59
import org.openide.filesystems.FileObject;
63
import org.openide.filesystems.FileObject;
60
import org.openide.filesystems.FileUtil;
64
import org.openide.filesystems.FileUtil;
Lines 70-86 Link Here
70
import org.openide.util.NbBundle;
74
import org.openide.util.NbBundle;
71
import org.openide.util.Utilities;
75
import org.openide.util.Utilities;
72
76
73
/** If you are looking for the non-GUI part of the panel please look
74
 * into new file wizard
75
 */
76
77
78
    // #89393: GTK needs cell renderer to implement UIResource to look "natively"
79
/**
77
/**
80
 * Provides the GUI for the template chooser panel.
78
 * Provides the GUI for the template chooser panel.
81
 * @author Jesse Glick
79
 * @author Jesse Glick
82
 */
80
 */
83
final class TemplateChooserPanelGUI extends javax.swing.JPanel implements PropertyChangeListener, AsyncGUIJob {
81
final class TemplateChooserPanelGUI extends javax.swing.JPanel implements PropertyChangeListener, AsyncGUIJob {
82
83
    private static final Logger LOG = Logger.getLogger(TemplateChooserPanelGUI.class.getName());
84
    
84
    
85
    /** prefered dimmension of the panels */
85
    /** prefered dimmension of the panels */
86
    private static final java.awt.Dimension PREF_DIM = new java.awt.Dimension (500, 340);
86
    private static final java.awt.Dimension PREF_DIM = new java.awt.Dimension (500, 340);
Lines 94-100 Link Here
94
    //GUI Builder
94
    //GUI Builder
95
    private TemplatesPanelGUI.Builder builder;
95
    private TemplatesPanelGUI.Builder builder;
96
    private Project project;
96
    private Project project;
97
    private @NonNull String[] projectRecommendedTypes;
97
    private String[] projectRecommendedTypes;
98
    private String category;
98
    private String category;
99
    private String template;
99
    private String template;
100
    private boolean isWarmUp = true;
100
    private boolean isWarmUp = true;
Lines 299-317 Link Here
299
        }
299
        }
300
300
301
        @Override protected boolean createKeys(List<TemplateKey> keys) {
301
        @Override protected boolean createKeys(List<TemplateKey> keys) {
302
            for (DataObject d : folder.getChildren()) {
302
            Set<DataObject> added = new HashSet<DataObject>();
303
                if (isFolderOfTemplates(d)) {
303
            DataObject[] potentialCategories = folder.getChildren();
304
                    boolean leaf = true;
304
            if (projectRecommendedTypes == null) {
305
                    for (DataObject child : ((DataFolder) d).getChildren()) {
305
                return true; // in case readValues has not been called
306
                        if (isFolderOfTemplates(child)) {
306
            }
307
                            leaf = false;
307
            for (String type : projectRecommendedTypes) {
308
                            break;
308
                addMatches(potentialCategories, added, new String[] {type}, false, type, keys);
309
            }
310
            addMatches(potentialCategories, added, projectRecommendedTypes, true, "<any>", keys);
311
            return true;
312
        }
313
        private void addMatches(DataObject[] potentialCategories, Set<DataObject> added, String[] types, boolean lax, String typeDiagnostic, List<TemplateKey> keys) {
314
            for (DataObject d : potentialCategories) {
315
                if (!added.contains(d)) {
316
                    DataObject trigger = isFolderOfTemplates(d, types, lax);
317
                    if (trigger != null) {
318
                        added.add(d);
319
                        LOG.log(Level.FINE, "adding {0} because of {1} matched by {2}", new Object[] {d.getPrimaryFile().getPath(), typeDiagnostic, trigger.getPrimaryFile().getPath()});
320
                        boolean leaf = true;
321
                        for (DataObject child : ((DataFolder) d).getChildren()) {
322
                            if (isFolderOfTemplates(child, projectRecommendedTypes, true) != null) {
323
                                leaf = false;
324
                                break;
325
                            }
309
                        }
326
                        }
327
                        keys.add(new TemplateKey(d, leaf));
310
                    }
328
                    }
311
                    keys.add(new TemplateKey(d, leaf));
312
                }
329
                }
313
            }
330
            }
314
            return true;
315
        }
331
        }
316
        
332
        
317
        @Override protected Node createNodeForKey(TemplateKey k) {
333
        @Override protected Node createNodeForKey(TemplateKey k) {
Lines 330-343 Link Here
330
        
346
        
331
        // Private methods -----------------------------------------------------
347
        // Private methods -----------------------------------------------------
332
        
348
        
333
        private boolean isFolderOfTemplates(DataObject d) {
349
        private @CheckForNull DataObject isFolderOfTemplates(DataObject d, String[] projectRecommendedTypes, boolean lax) {
334
            if (d instanceof DataFolder && !isTemplate((DataFolder)d))  {
350
            if (d instanceof DataFolder && !isTemplate((DataFolder)d))  {
335
                Object o = d.getPrimaryFile().getAttribute("simple"); // NOI18N
351
                Object o = d.getPrimaryFile().getAttribute("simple"); // NOI18N
336
                if (o == null || Boolean.TRUE.equals(o)) {
352
                if (o == null || Boolean.TRUE.equals(o)) {
337
                    return hasChildren((Project) projectsComboBox.getSelectedItem(), d);
353
                    return hasChildren(getProject(), d, projectRecommendedTypes, lax);
338
                }
354
                }
339
            }
355
            }
340
            return false;
356
            return null;
341
        }
357
        }
342
        
358
        
343
    }
359
    }
Lines 353-359 Link Here
353
        
369
        
354
        @Override protected boolean createKeys(List<DataObject> keys) {
370
        @Override protected boolean createKeys(List<DataObject> keys) {
355
            for (DataObject dobj : root.getChildren()) {
371
            for (DataObject dobj : root.getChildren()) {
356
                if (isTemplate(dobj) && OpenProjectList.isRecommended(projectRecommendedTypes, dobj.getPrimaryFile())) {
372
                if (isTemplate(dobj) && OpenProjectList.isRecommended(projectRecommendedTypes, dobj.getPrimaryFile(), true)) {
357
                    if (dobj instanceof DataShadow) {
373
                    if (dobj instanceof DataShadow) {
358
                        dobj = ((DataShadow) dobj).getOriginal();
374
                        dobj = ((DataShadow) dobj).getOriginal();
359
                    }
375
                    }
Lines 410-442 Link Here
410
        return false;
426
        return false;
411
    }
427
    }
412
    
428
    
413
    private boolean hasChildren (Project p, DataObject folder) { 
429
    private @CheckForNull DataObject hasChildren(Project p, DataObject folder, String[] projectRecommendedTypes, boolean lax) {
414
        if (!(folder instanceof DataFolder)) {
430
        if (!(folder instanceof DataFolder)) {
415
            return false;
431
            return null;
416
        }
432
        }
417
        
433
        
418
        DataFolder f = (DataFolder) folder;
434
        DataFolder f = (DataFolder) folder;
419
        if (!OpenProjectList.isRecommended(projectRecommendedTypes, f.getPrimaryFile())) {
435
        if (!OpenProjectList.isRecommended(projectRecommendedTypes, f.getPrimaryFile(), true)) {
420
            // Eg. Licenses folder.
436
            // Eg. Licenses folder.
421
            //see #102508
437
            //see #102508
422
            return false;
438
            return null;
423
        }
439
        }
424
        DataObject[] ch = f.getChildren ();
440
        DataObject[] ch = f.getChildren ();
425
        for (int i = 0; i < ch.length; i++) {
441
        for (int i = 0; i < ch.length; i++) {
426
            if (isTemplate (ch[i]) && OpenProjectList.isRecommended(projectRecommendedTypes, ch[i].getPrimaryFile ())) {
442
            if (isTemplate(ch[i]) && OpenProjectList.isRecommended(projectRecommendedTypes, ch[i].getPrimaryFile(), lax)) {
427
                // XXX: how to filter link to Package template in each java types folder?
443
                // XXX: how to filter link to Package template in each java types folder?
428
                if (!(ch[i] instanceof DataShadow)) {
444
                if (!(ch[i] instanceof DataShadow)) {
429
                    return true;
445
                    return ch[i];
430
                }
446
                }
431
            } else if (ch[i] instanceof DataFolder && hasChildren (p, ch[i])) {
447
            } else if (ch[i] instanceof DataFolder) {
432
                return true;
448
                DataObject t = hasChildren(p, ch[i], projectRecommendedTypes, lax);
449
                if (t != null) {
450
                    return t;
451
                }
433
            }
452
            }
434
        }
453
        }
435
        return false;
454
        return null;
436
        
437
        // simplied but more counts
438
        //return new FileChildren (p, (DataFolder) folder).getNodesCount () > 0;
439
        
440
    }
455
    }
441
    
456
    
442
    public void construct () {
457
    public void construct () {
(-)a/projectui/test/unit/src/org/netbeans/modules/project/ui/TemplateChooserPanelGUITest.java (-2 / +37 lines)
Lines 43-48 Link Here
43
package org.netbeans.modules.project.ui;
43
package org.netbeans.modules.project.ui;
44
44
45
import java.lang.ref.WeakReference;
45
import java.lang.ref.WeakReference;
46
import java.util.logging.Level;
46
import org.netbeans.api.project.Project;
47
import org.netbeans.api.project.Project;
47
import org.netbeans.junit.NbTestCase;
48
import org.netbeans.junit.NbTestCase;
48
import org.netbeans.modules.project.ui.TemplateChooserPanelGUI.FileChooserBuilder;
49
import org.netbeans.modules.project.ui.TemplateChooserPanelGUI.FileChooserBuilder;
Lines 71-76 Link Here
71
        return 300000;
72
        return 300000;
72
    }
73
    }
73
74
75
    @Override protected Level logLevel() {
76
        return Level.FINE;
77
    }
78
79
    @Override protected String logRoot() {
80
        return "org.netbeans.modules.project.ui";
81
    }
82
74
    public void testReadValues() {
83
    public void testReadValues() {
75
        Project p = new P();
84
        Project p = new P();
76
        String category = "";
85
        String category = "";
Lines 123-130 Link Here
123
        t.setAttribute("template", true);
132
        t.setAttribute("template", true);
124
        t.setAttribute("templateCategory", "main");
133
        t.setAttribute("templateCategory", "main");
125
        TemplateChooserPanelGUI gui = new TemplateChooserPanelGUI();
134
        TemplateChooserPanelGUI gui = new TemplateChooserPanelGUI();
126
        gui.construct();
127
        gui.finished();
128
        gui.readValues(new P(), null, null);
135
        gui.readValues(new P(), null, null);
129
        FileChooserBuilder builder = gui.new FileChooserBuilder();
136
        FileChooserBuilder builder = gui.new FileChooserBuilder();
130
        assertChildren("Main, Samples[Main]", builder.createCategoriesChildren(DataFolder.findFolder(r)));
137
        assertChildren("Main, Samples[Main]", builder.createCategoriesChildren(DataFolder.findFolder(r)));
Lines 132-137 Link Here
132
        assertChildren("t5", builder.createTemplatesChildren(DataFolder.findFolder(r.getFileObject("Samples/Main"))));
139
        assertChildren("t5", builder.createTemplatesChildren(DataFolder.findFolder(r.getFileObject("Samples/Main"))));
133
    }
140
    }
134
141
142
    public void testTemplateCategoryOrder() throws Exception { // #206126
143
        FileObject r = FileUtil.createMemoryFileSystem().getRoot();
144
        FileObject f = r.createFolder("Specialized");
145
        f.setAttribute("position", 1);
146
        FileObject t = f.createData("t1");
147
        t.setAttribute("template", true);
148
        t.setAttribute("templateCategory", "inappropriate");
149
        t = f.createData("t2");
150
        t.setAttribute("template", true);
151
        t.setAttribute("templateCategory", "misc");
152
        f = r.createFolder("Common");
153
        f.setAttribute("position", 2);
154
        t = f.createData("t3");
155
        t.setAttribute("template", true);
156
        t.setAttribute("templateCategory", "main");
157
        t = f.createData("t4");
158
        t.setAttribute("template", true);
159
        t.setAttribute("templateCategory", "misc");
160
        f = r.createFolder("Plain");
161
        f.setAttribute("position", 3);
162
        t = f.createData("t5");
163
        t.setAttribute("template", true);
164
        TemplateChooserPanelGUI gui = new TemplateChooserPanelGUI();
165
        gui.readValues(new P(), null, null);
166
        FileChooserBuilder builder = gui.new FileChooserBuilder();
167
        assertChildren("Common, Specialized, Plain", builder.createCategoriesChildren(DataFolder.findFolder(r)));
168
    }
169
135
    private static void assertChildren(String repn, Children c) {
170
    private static void assertChildren(String repn, Children c) {
136
        StringBuilder b = new StringBuilder();
171
        StringBuilder b = new StringBuilder();
137
        representationOf(c, b);
172
        representationOf(c, b);
(-)a/projectuiapi/apichanges.xml (+28 lines)
Lines 107-112 Link Here
107
    <!-- ACTUAL CHANGES BEGIN HERE: -->
107
    <!-- ACTUAL CHANGES BEGIN HERE: -->
108
108
109
    <changes>
109
    <changes>
110
        <change id="RecommendedTemplates.order">
111
            <api name="general"/>
112
            <summary>Order of <code>RecommendedTemplates</code> significant</summary>
113
            <version major="1" minor="57"/>
114
            <date year="2012" month="3" day="19"/>
115
            <author login="jglick"/>
116
            <compatibility semantic="incompatible">
117
                <p>
118
                    Existing implementations should be reviewed and the list of categories possibly reordered.
119
                    (In cases where <code>UILookupMergerSupport.createRecommendedTemplatesMerger</code> was in use,
120
                    it will generally be necessary to use <code>ProjectServiceProvider</code> for all implementations,
121
                    rather than supplying a basic implementation in the project's base lookup.)
122
                </p>
123
                <p>
124
                    Positions of template folders may also need to be adjusted.
125
                </p>
126
            </compatibility>
127
            <description>
128
                <p>
129
                    UI infrastructure will now pay attention to the list of categories
130
                    in <code>RecommendedTemplates</code>, preferring to show template
131
                    folders first which contain templates marked with categories earlier
132
                    in the list.
133
                </p>
134
            </description>
135
            <class package="org.netbeans.spi.project.ui" name="RecommendedTemplates"/>
136
            <issue number="206126"/>
137
        </change>
110
        <change id="FileSensitiveAction.performer">
138
        <change id="FileSensitiveAction.performer">
111
            <api name="general"/>
139
            <api name="general"/>
112
            <summary>Adding ability to create a file sensitive action with custom performer</summary>
140
            <summary>Adding ability to create a file sensitive action with custom performer</summary>
(-)a/projectuiapi/nbproject/project.properties (-1 / +1 lines)
Lines 42-48 Link Here
42
42
43
javac.compilerargs=-Xlint -Xlint:-serial
43
javac.compilerargs=-Xlint -Xlint:-serial
44
javac.source=1.6
44
javac.source=1.6
45
spec.version.base=1.56.0
45
spec.version.base=1.57.0
46
is.autoload=true
46
is.autoload=true
47
javadoc.arch=${basedir}/arch.xml
47
javadoc.arch=${basedir}/arch.xml
48
javadoc.apichanges=${basedir}/apichanges.xml
48
javadoc.apichanges=${basedir}/apichanges.xml
(-)a/projectuiapi/src/org/netbeans/spi/project/ui/RecommendedTemplates.java (+1 lines)
Lines 59-64 Link Here
59
59
60
    /**
60
    /**
61
     * Lists supported template types.
61
     * Lists supported template types.
62
     * <p>Since 1.57 the order is significant and may be considered by UI infrastructure.
62
     * @return types of supported templates (should match template file attribute names)
63
     * @return types of supported templates (should match template file attribute names)
63
     * @see TemplateRegistration#category
64
     * @see TemplateRegistration#category
64
     */
65
     */
(-)a/projectuiapi/src/org/netbeans/spi/project/ui/templates/support/package.html (+10 lines)
Lines 100-110 Link Here
100
There is currently no annotation to define template <em>folders</em>;
100
There is currently no annotation to define template <em>folders</em>;
101
they should be defined in the XML layer as subfolders of <code>Templates</code>
101
they should be defined in the XML layer as subfolders of <code>Templates</code>
102
with <code>displayName</code> and <code>position</code> attributes.
102
with <code>displayName</code> and <code>position</code> attributes.
103
<p>
104
The position of template folders is considered in the UI as a secondary sort key;
105
the order of categories specified in <code>RecommendedTemplates</code> is primary.
106
Use <code>-J-Dorg.netbeans.modules.project.ui.TemplateChooserPanelGUI.level=FINE</code>
107
to see why particular folders are chosen in a particular order.
108
<p>
103
Note that it is possible to set the attribute <code>simple</code> to (boolean) <code>false</code>
109
Note that it is possible to set the attribute <code>simple</code> to (boolean) <code>false</code>
104
in order to hide templates from the list shown in the standard wizards, while still
110
in order to hide templates from the list shown in the standard wizards, while still
105
making it possible to use <code>TemplateRegistration</code> and apply templates programmatically.
111
making it possible to use <code>TemplateRegistration</code> and apply templates programmatically.
106
To hide templates from the "new" wizards but show them in Template Manager,
112
To hide templates from the "new" wizards but show them in Template Manager,
107
just set a category which is never used (such as <code>invisible</code>).
113
just set a category which is never used (such as <code>invisible</code>).
114
<p class="nonnormative">
115
A summary of templates and categories in the NetBeans IDE can be found online:
116
<a href="http://deadlock.netbeans.org/hudson/job/nbms-and-javadoc/lastStableBuild/artifact/nbbuild/build/generated/templates.txt"><code>templates.txt</code></a>
117
</p>
108
<p>
118
<p>
109
There are two important interfaces affecting the behavior of the templates. Implementation of these interfaces should
119
There are two important interfaces affecting the behavior of the templates. Implementation of these interfaces should
110
reside in the project's lookup.
120
reside in the project's lookup.
(-)a/spring.beans/src/org/netbeans/modules/spring/beans/RecommendedTemplatesImpl.java (-4 / +5 lines)
Lines 42-47 Link Here
42
42
43
package org.netbeans.modules.spring.beans;
43
package org.netbeans.modules.spring.beans;
44
44
45
import org.netbeans.spi.project.LookupProvider.Registration.ProjectType;
45
import org.netbeans.spi.project.ProjectServiceProvider;
46
import org.netbeans.spi.project.ProjectServiceProvider;
46
import org.netbeans.spi.project.ui.RecommendedTemplates;
47
import org.netbeans.spi.project.ui.RecommendedTemplates;
47
48
Lines 65-78 Link Here
65
        this.web = web;
66
        this.web = web;
66
    }
67
    }
67
68
68
    @ProjectServiceProvider(service=RecommendedTemplates.class, projectType="org-netbeans-modules-web-project")
69
    @ProjectServiceProvider(service=RecommendedTemplates.class, projectTypes=@ProjectType(id="org-netbeans-modules-web-project", position=1000))
69
    public static RecommendedTemplates forWeb() {
70
    public static RecommendedTemplates forWeb() {
70
        return new RecommendedTemplatesImpl(true);
71
        return new RecommendedTemplatesImpl(true);
71
    }
72
    }
72
73
73
    @ProjectServiceProvider(service=RecommendedTemplates.class, projectType={
74
    @ProjectServiceProvider(service=RecommendedTemplates.class, projectTypes={
74
        "org-netbeans-modules-java-j2seproject",
75
        @ProjectType(id="org-netbeans-modules-java-j2seproject", position=1000),
75
        "org-netbeans-modules-j2ee-ejbjarproject"
76
        @ProjectType(id="org-netbeans-modules-j2ee-ejbjarproject", position=1000)
76
    })
77
    })
77
    public static RecommendedTemplates forNonWeb() {
78
    public static RecommendedTemplates forNonWeb() {
78
        return new RecommendedTemplatesImpl(false);
79
        return new RecommendedTemplatesImpl(false);
(-)a/web.project/src/org/netbeans/modules/web/project/WebProject.java (-11 / +14 lines)
Lines 172-177 Link Here
172
import org.netbeans.spi.java.project.support.ExtraSourceJavadocSupport;
172
import org.netbeans.spi.java.project.support.ExtraSourceJavadocSupport;
173
import org.netbeans.spi.java.project.support.LookupMergerSupport;
173
import org.netbeans.spi.java.project.support.LookupMergerSupport;
174
import org.netbeans.spi.java.project.support.ui.BrokenReferencesSupport;
174
import org.netbeans.spi.java.project.support.ui.BrokenReferencesSupport;
175
import org.netbeans.spi.project.LookupProvider.Registration.ProjectType;
176
import org.netbeans.spi.project.ProjectServiceProvider;
175
import org.netbeans.spi.whitelist.support.WhiteListQueryMergerSupport;
177
import org.netbeans.spi.whitelist.support.WhiteListQueryMergerSupport;
176
import org.netbeans.spi.project.support.ant.PropertyProvider;
178
import org.netbeans.spi.project.support.ant.PropertyProvider;
177
import org.netbeans.spi.project.support.ant.PropertyUtils;
179
import org.netbeans.spi.project.support.ant.PropertyUtils;
Lines 571-577 Link Here
571
                    Roots.nonSourceRoots(ProjectProperties.BUILD_DIR, WebProjectProperties.DIST_DIR)),
573
                    Roots.nonSourceRoots(ProjectProperties.BUILD_DIR, WebProjectProperties.DIST_DIR)),
572
            QuerySupport.createSharabilityQuery(helper, evaluator(), getSourceRoots(), 
574
            QuerySupport.createSharabilityQuery(helper, evaluator(), getSourceRoots(), 
573
                getTestSourceRoots(), WebProjectProperties.WEB_DOCBASE_DIR),
575
                getTestSourceRoots(), WebProjectProperties.WEB_DOCBASE_DIR),
574
            new RecommendedTemplatesImpl(this),
575
            new CoSAwareFileBuiltQueryImpl(QuerySupport.createFileBuiltQuery(helper, evaluator(), getSourceRoots(), getTestSourceRoots()), this),
576
            new CoSAwareFileBuiltQueryImpl(QuerySupport.createFileBuiltQuery(helper, evaluator(), getSourceRoots(), getTestSourceRoots()), this),
576
            ProjectClassPathModifier.extenderForModifier(cpMod),
577
            ProjectClassPathModifier.extenderForModifier(cpMod),
577
            buildExtender,
578
            buildExtender,
Lines 1276-1281 Link Here
1276
    // List of primarily supported templates
1277
    // List of primarily supported templates
1277
1278
1278
    private static final String[] TYPES = new String[] { 
1279
    private static final String[] TYPES = new String[] { 
1280
        "servlet-types",        // NOI18N
1281
        // XXX consider splitting RecommendedTemplatesImpl into two, one returning high-priority categories plus TYPES_EJB, the other returning low-priority categories
1279
        "java-classes",         // NOI18N
1282
        "java-classes",         // NOI18N
1280
        "java-main-class",      // NOI18N
1283
        "java-main-class",      // NOI18N
1281
        "java-forms",           // NOI18N
1284
        "java-forms",           // NOI18N
Lines 1286-1292 Link Here
1286
        "ant-script",           // NOI18N
1289
        "ant-script",           // NOI18N
1287
        "ant-task",             // NOI18N
1290
        "ant-task",             // NOI18N
1288
        "REST-clients",         // NOI18N
1291
        "REST-clients",         // NOI18N
1289
        "servlet-types",        // NOI18N
1290
        "web-types",            // NOI18N
1292
        "web-types",            // NOI18N
1291
        "web-types-server",     // NOI18N
1293
        "web-types-server",     // NOI18N
1292
        "web-services",         // NOI18N
1294
        "web-services",         // NOI18N
Lines 1403-1414 Link Here
1403
        privilegedTemplates.addAll(Arrays.asList(PRIVILEGED_NAMES));
1405
        privilegedTemplates.addAll(Arrays.asList(PRIVILEGED_NAMES));
1404
    }
1406
    }
1405
    
1407
    
1406
    private final class RecommendedTemplatesImpl implements RecommendedTemplates, PrivilegedTemplates {
1408
    @ProjectServiceProvider(service={RecommendedTemplates.class, PrivilegedTemplates.class}, projectTypes=@ProjectType(id="org-netbeans-modules-web-project", position=100))
1409
    public static final class RecommendedTemplatesImpl implements RecommendedTemplates, PrivilegedTemplates {
1407
        private WebProject project;
1410
        private WebProject project;
1408
        private J2eeProjectCapabilities projectCap;
1411
        private J2eeProjectCapabilities projectCap;
1409
        
1412
        
1410
        RecommendedTemplatesImpl (WebProject project) {
1413
        public RecommendedTemplatesImpl(Project project) {
1411
            this.project = project;
1414
            this.project = (WebProject) project;
1412
        }
1415
        }
1413
        
1416
        
1414
        private boolean checked = false;
1417
        private boolean checked = false;
Lines 1421-1427 Link Here
1421
            if (isArchive) {
1424
            if (isArchive) {
1422
                return TYPES_ARCHIVE;
1425
                return TYPES_ARCHIVE;
1423
            } else if (projectCap.isEjb31LiteSupported()){
1426
            } else if (projectCap.isEjb31LiteSupported()){
1424
                List<String> list = new ArrayList(Arrays.asList(TYPES));
1427
                List<String> list = new ArrayList<String>(Arrays.asList(TYPES));
1425
                if (projectCap.isEjb31Supported() || serverSupportsEJB31){
1428
                if (projectCap.isEjb31Supported() || serverSupportsEJB31){
1426
                    list.addAll(Arrays.asList(TYPES_EJB));
1429
                    list.addAll(Arrays.asList(TYPES_EJB));
1427
                } else {
1430
                } else {
Lines 1440-1455 Link Here
1440
            } else {
1443
            } else {
1441
                List<String> list;
1444
                List<String> list;
1442
                if (projectCap.isEjb31LiteSupported()) {
1445
                if (projectCap.isEjb31LiteSupported()) {
1443
                    list = getPrivilegedTemplatesEE5();
1446
                    list = project.getPrivilegedTemplatesEE5();
1444
                    if (projectCap.isEjb31Supported() || serverSupportsEJB31){
1447
                    if (projectCap.isEjb31Supported() || serverSupportsEJB31){
1445
                        list.addAll(13, Arrays.asList(PRIVILEGED_NAMES_EE6_FULL));
1448
                        list.addAll(13, Arrays.asList(PRIVILEGED_NAMES_EE6_FULL));
1446
                    } else {
1449
                    } else {
1447
                        list.addAll(13, Arrays.asList(PRIVILEGED_NAMES_EE6_WEB));
1450
                        list.addAll(13, Arrays.asList(PRIVILEGED_NAMES_EE6_WEB));
1448
                    }
1451
                    }
1449
                } else if (isEE5){
1452
                } else if (isEE5){
1450
                    list = getPrivilegedTemplatesEE5();
1453
                    list = project.getPrivilegedTemplatesEE5();
1451
                } else {
1454
                } else {
1452
                    list = WebProject.this.getPrivilegedTemplates();
1455
                    list = project.getPrivilegedTemplates();
1453
                }
1456
                }
1454
                return list.toArray(new String[list.size()]);
1457
                return list.toArray(new String[list.size()]);
1455
            }
1458
            }
Lines 1457-1469 Link Here
1457
        
1460
        
1458
        private void checkEnvironment() {
1461
        private void checkEnvironment() {
1459
            if (!checked) {
1462
            if (!checked) {
1460
                final Object srcType = helper.getStandardPropertyEvaluator().
1463
                final Object srcType = project.helper.getStandardPropertyEvaluator().
1461
                        getProperty(WebProjectProperties.JAVA_SOURCE_BASED);
1464
                        getProperty(WebProjectProperties.JAVA_SOURCE_BASED);
1462
                if ("false".equals(srcType)) {
1465
                if ("false".equals(srcType)) {
1463
                    isArchive = true;
1466
                    isArchive = true;
1464
                }
1467
                }
1465
                projectCap = J2eeProjectCapabilities.forProject(project);
1468
                projectCap = J2eeProjectCapabilities.forProject(project);
1466
                Profile profile = Profile.fromPropertiesString(eval.getProperty(WebProjectProperties.J2EE_PLATFORM));
1469
                Profile profile = Profile.fromPropertiesString(project.eval.getProperty(WebProjectProperties.J2EE_PLATFORM));
1467
                isEE5 = profile == Profile.JAVA_EE_5;
1470
                isEE5 = profile == Profile.JAVA_EE_5;
1468
                serverSupportsEJB31 = Util.getSupportedProfiles(project).contains(Profile.JAVA_EE_6_FULL);
1471
                serverSupportsEJB31 = Util.getSupportedProfiles(project).contains(Profile.JAVA_EE_6_FULL);
1469
                checked = true;
1472
                checked = true;

Return to bug 206126