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/ant.freeform/src/org/netbeans/modules/ant/freeform/FreeformProject.java (-1 lines)
Lines 138-144 Link Here
138
            new ArtifactProvider(this), // AntArtifactProvider
138
            new ArtifactProvider(this), // AntArtifactProvider
139
            new LookupMergerImpl(), // LookupMerger or ActionProvider
139
            new LookupMergerImpl(), // LookupMerger or ActionProvider
140
            UILookupMergerSupport.createPrivilegedTemplatesMerger(),
140
            UILookupMergerSupport.createPrivilegedTemplatesMerger(),
141
            UILookupMergerSupport.createRecommendedTemplatesMerger(),
142
            new FreeformProjectOperations(this),
141
            new FreeformProjectOperations(this),
143
	    new FreeformSharabilityQuery(this), //SharabilityQueryImplementation
142
	    new FreeformSharabilityQuery(this), //SharabilityQueryImplementation
144
            Accessor.DEFAULT.createProjectAccessor(this), //Access to AntProjectHelper and PropertyEvaluator
143
            Accessor.DEFAULT.createProjectAccessor(this), //Access to AntProjectHelper and PropertyEvaluator
(-)a/apisupport.ant/src/org/netbeans/modules/apisupport/project/NbModuleProject.java (-2 / +1 lines)
Lines 318-324 Link Here
318
        ic.add(new ModuleOperations(this));
318
        ic.add(new ModuleOperations(this));
319
        ic.add(LookupProviderSupport.createSourcesMerger());
319
        ic.add(LookupProviderSupport.createSourcesMerger());
320
        ic.add(UILookupMergerSupport.createPrivilegedTemplatesMerger());
320
        ic.add(UILookupMergerSupport.createPrivilegedTemplatesMerger());
321
        ic.add(UILookupMergerSupport.createRecommendedTemplatesMerger());
322
        ic.add(new TemplateAttributesProvider(this, getHelper(), getModuleType() == NbModuleType.NETBEANS_ORG));
321
        ic.add(new TemplateAttributesProvider(this, getHelper(), getModuleType() == NbModuleType.NETBEANS_ORG));
323
        ic.add(new FileEncodingQueryImpl());
322
        ic.add(new FileEncodingQueryImpl());
324
        ic.add(new AnnotationProcessingQueryImpl(this));
323
        ic.add(new AnnotationProcessingQueryImpl(this));
Lines 934-939 Link Here
934
        }
933
        }
935
        
934
        
936
        private static final String[] RECOMMENDED_TYPES = {
935
        private static final String[] RECOMMENDED_TYPES = {
936
            UIUtil.TEMPLATE_CATEGORY,
937
            "java-classes",         // NOI18N
937
            "java-classes",         // NOI18N
938
            "java-main-class",      // NOI18N
938
            "java-main-class",      // NOI18N
939
            "java-forms",           // NOI18N
939
            "java-forms",           // NOI18N
Lines 945-951 Link Here
945
            "ant-task",             // NOI18N
945
            "ant-task",             // NOI18N
946
            "junit",                // NOI18N                    
946
            "junit",                // NOI18N                    
947
            "simple-files",         // NOI18N
947
            "simple-files",         // NOI18N
948
            UIUtil.TEMPLATE_CATEGORY,
949
        };
948
        };
950
        
949
        
951
        @Override public String[] getPrivilegedTemplates() {
950
        @Override public String[] getPrivilegedTemplates() {
(-)a/j2ee.clientproject/src/org/netbeans/modules/j2ee/clientproject/AppClientProject.java (-1 lines)
Lines 350-356 Link Here
350
            new AppClientPersistenceProvider(this, evaluator(), cpProvider),
350
            new AppClientPersistenceProvider(this, evaluator(), cpProvider),
351
            enterpriseResourceSupport,
351
            enterpriseResourceSupport,
352
            UILookupMergerSupport.createPrivilegedTemplatesMerger(),
352
            UILookupMergerSupport.createPrivilegedTemplatesMerger(),
353
            UILookupMergerSupport.createRecommendedTemplatesMerger(),
354
            LookupProviderSupport.createSourcesMerger(),
353
            LookupProviderSupport.createSourcesMerger(),
355
            ExtraSourceJavadocSupport.createExtraSourceQueryImplementation(this, helper, eval),
354
            ExtraSourceJavadocSupport.createExtraSourceQueryImplementation(this, helper, eval),
356
            LookupMergerSupport.createSFBLookupMerger(),
355
            LookupMergerSupport.createSFBLookupMerger(),
(-)a/j2ee.earproject/src/org/netbeans/modules/j2ee/earproject/EarProject.java (-1 lines)
Lines 246-252 Link Here
246
            new EarProjectOperations(this),
246
            new EarProjectOperations(this),
247
            new AntArtifactProviderImpl(),
247
            new AntArtifactProviderImpl(),
248
            UILookupMergerSupport.createPrivilegedTemplatesMerger(),
248
            UILookupMergerSupport.createPrivilegedTemplatesMerger(),
249
            UILookupMergerSupport.createRecommendedTemplatesMerger(),
250
            LookupProviderSupport.createSourcesMerger(),
249
            LookupProviderSupport.createSourcesMerger(),
251
            buildExtender,
250
            buildExtender,
252
            new SourceForBinaryQueryImpl(this),
251
            new SourceForBinaryQueryImpl(this),
(-)a/j2ee.ejbjarproject/src/org/netbeans/modules/j2ee/ejbjarproject/EjbJarProject.java (-1 lines)
Lines 462-468 Link Here
462
                new EjbJarJPAModuleInfo(this),
462
                new EjbJarJPAModuleInfo(this),
463
                new EjbJarJPATargetInfo(this),
463
                new EjbJarJPATargetInfo(this),
464
                UILookupMergerSupport.createPrivilegedTemplatesMerger(),
464
                UILookupMergerSupport.createPrivilegedTemplatesMerger(),
465
                UILookupMergerSupport.createRecommendedTemplatesMerger(),
466
                LookupProviderSupport.createSourcesMerger(),
465
                LookupProviderSupport.createSourcesMerger(),
467
                WhiteListQueryMergerSupport.createWhiteListQueryMerger(),
466
                WhiteListQueryMergerSupport.createWhiteListQueryMerger(),
468
                QuerySupport.createTemplateAttributesProvider(helper, encodingQuery),
467
                QuerySupport.createTemplateAttributesProvider(helper, encodingQuery),
(-)a/java.j2seproject/src/org/netbeans/modules/java/j2seproject/J2SEProject.java (-9 / +13 lines)
Lines 115-121 Link Here
115
import org.netbeans.spi.project.support.ant.ReferenceHelper;
115
import org.netbeans.spi.project.support.ant.ReferenceHelper;
116
import org.netbeans.spi.project.ui.PrivilegedTemplates;
116
import org.netbeans.spi.project.ui.PrivilegedTemplates;
117
import org.netbeans.spi.project.ui.ProjectOpenedHook;
117
import org.netbeans.spi.project.ui.ProjectOpenedHook;
118
import org.netbeans.spi.project.ui.RecommendedTemplates;
119
import org.netbeans.spi.project.ui.support.UILookupMergerSupport;
118
import org.netbeans.spi.project.ui.support.UILookupMergerSupport;
120
import org.netbeans.spi.queries.FileBuiltQueryImplementation;
119
import org.netbeans.spi.queries.FileBuiltQueryImplementation;
121
import org.netbeans.spi.queries.FileEncodingQueryImplementation;
120
import org.netbeans.spi.queries.FileEncodingQueryImplementation;
Lines 143-148 Link Here
143
import static org.netbeans.spi.project.support.ant.GeneratedFilesHelper.FLAG_OLD_PROJECT_XML;
142
import static org.netbeans.spi.project.support.ant.GeneratedFilesHelper.FLAG_OLD_PROJECT_XML;
144
import static org.netbeans.spi.project.support.ant.GeneratedFilesHelper.FLAG_OLD_STYLESHEET;
143
import static org.netbeans.spi.project.support.ant.GeneratedFilesHelper.FLAG_OLD_STYLESHEET;
145
import static org.netbeans.spi.project.support.ant.GeneratedFilesHelper.FLAG_UNKNOWN;
144
import static org.netbeans.spi.project.support.ant.GeneratedFilesHelper.FLAG_UNKNOWN;
145
import org.netbeans.spi.project.ui.RecommendedTemplates2;
146
import org.netbeans.spi.whitelist.support.WhiteListQueryMergerSupport;
146
import org.netbeans.spi.whitelist.support.WhiteListQueryMergerSupport;
147
/**
147
/**
148
 * Represents one plain J2SE project.
148
 * Represents one plain J2SE project.
Lines 382-388 Link Here
382
            new J2SEConfigurationProvider(this),
382
            new J2SEConfigurationProvider(this),
383
            new J2SEPersistenceProvider(this, cpProvider),
383
            new J2SEPersistenceProvider(this, cpProvider),
384
            UILookupMergerSupport.createPrivilegedTemplatesMerger(),
384
            UILookupMergerSupport.createPrivilegedTemplatesMerger(),
385
            UILookupMergerSupport.createRecommendedTemplatesMerger(),
386
            LookupProviderSupport.createSourcesMerger(),
385
            LookupProviderSupport.createSourcesMerger(),
387
            encodingQuery,
386
            encodingQuery,
388
            new J2SEPropertyEvaluatorImpl(evaluator()),
387
            new J2SEPropertyEvaluatorImpl(evaluator()),
Lines 734-740 Link Here
734
733
735
    }
734
    }
736
735
737
    private static final class RecommendedTemplatesImpl implements RecommendedTemplates, PrivilegedTemplates {
736
    private static final class RecommendedTemplatesImpl implements RecommendedTemplates2, PrivilegedTemplates {
738
        RecommendedTemplatesImpl (UpdateHelper helper) {
737
        RecommendedTemplatesImpl (UpdateHelper helper) {
739
            this.helper = helper;
738
            this.helper = helper;
740
        }
739
        }
Lines 752-759 Link Here
752
            "persistence",          // NOI18N
751
            "persistence",          // NOI18N
753
            "oasis-XML-catalogs",   // NOI18N
752
            "oasis-XML-catalogs",   // NOI18N
754
            "XML",                  // NOI18N
753
            "XML",                  // NOI18N
755
            "ant-script",           // NOI18N
756
            "ant-task",             // NOI18N
757
            "web-service-clients",  // NOI18N
754
            "web-service-clients",  // NOI18N
758
            "REST-clients",         // NOI18N
755
            "REST-clients",         // NOI18N
759
            "wsdl",                 // NOI18N
756
            "wsdl",                 // NOI18N
Lines 761-766 Link Here
761
            // "web-types",         // NOI18N
758
            // "web-types",         // NOI18N
762
            "junit",                // NOI18N
759
            "junit",                // NOI18N
763
            // "MIDP",              // NOI18N
760
            // "MIDP",              // NOI18N
761
            "ant-script",           // NOI18N
762
            "ant-task",             // NOI18N
764
            "simple-files"          // NOI18N
763
            "simple-files"          // NOI18N
765
        };
764
        };
766
765
Lines 773-780 Link Here
773
            "persistence",          // NOI18N
772
            "persistence",          // NOI18N
774
            "oasis-XML-catalogs",   // NOI18N
773
            "oasis-XML-catalogs",   // NOI18N
775
            "XML",                  // NOI18N
774
            "XML",                  // NOI18N
776
            "ant-script",           // NOI18N
777
            "ant-task",             // NOI18N
778
            "servlet-types",        // NOI18N
775
            "servlet-types",        // NOI18N
779
            "servlet-types-j2se-only",// NOI18N
776
            "servlet-types-j2se-only",// NOI18N
780
            "web-service-clients",  // NOI18N
777
            "web-service-clients",  // NOI18N
Lines 783-788 Link Here
783
            // "web-types",         // NOI18N
780
            // "web-types",         // NOI18N
784
            "junit",                // NOI18N
781
            "junit",                // NOI18N
785
            // "MIDP",              // NOI18N
782
            // "MIDP",              // NOI18N
783
            "ant-script",           // NOI18N
784
            "ant-task",             // NOI18N
786
            "simple-files"         // NOI18N
785
            "simple-files"         // NOI18N
787
        };
786
        };
788
787
Lines 798-809 Link Here
798
        };
797
        };
799
798
800
        @Override
799
        @Override
801
        public String[] getRecommendedTypes() {
800
        public Map<Integer,String> getRecommendedTypes() {
802
801
803
            EditableProperties ep = helper.getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH);
802
            EditableProperties ep = helper.getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH);
804
            // if the project has no main class, it's not really an application
803
            // 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
804
            boolean isLibrary = ep.getProperty (ProjectProperties.MAIN_CLASS) == null || "".equals (ep.getProperty (ProjectProperties.MAIN_CLASS)); // NOI18N
806
            return isLibrary ? LIBRARY_TYPES : APPLICATION_TYPES;
805
            String[] types = isLibrary ? LIBRARY_TYPES : APPLICATION_TYPES;
806
            Map<Integer,String> result = new HashMap<Integer,String>();
807
            for (int i = 0; i < types.length; i++) {
808
                result.put((i + 1) * 100, types[i]);
809
            }
810
            return result;
807
        }
811
        }
808
812
809
        @Override
813
        @Override
(-)a/javacard.project/src/org/netbeans/modules/javacard/project/JCProject.java (-1 lines)
Lines 255-261 Link Here
255
                    refHelper.createSubprojectProvider(),
255
                    refHelper.createSubprojectProvider(),
256
                    encodingQuery,
256
                    encodingQuery,
257
                    UILookupMergerSupport.createPrivilegedTemplatesMerger(),
257
                    UILookupMergerSupport.createPrivilegedTemplatesMerger(),
258
                    UILookupMergerSupport.createRecommendedTemplatesMerger(),
259
                    LookupProviderSupport.createSourcesMerger(),
258
                    LookupProviderSupport.createSourcesMerger(),
260
                    //PENDING replace second getRoots() with null if
259
                    //PENDING replace second getRoots() with null if
261
                    //http://www.netbeans.org/issues/show_bug.cgi?id=162270 gets
260
                    //http://www.netbeans.org/issues/show_bug.cgi?id=162270 gets
(-)a/javafx2.project/src/org/netbeans/modules/javafx2/project/JFXRecommendedTemplates.java (-9 / +7 lines)
Lines 41-61 Link Here
41
 */
41
 */
42
package org.netbeans.modules.javafx2.project;
42
package org.netbeans.modules.javafx2.project;
43
43
44
import java.util.Collections;
45
import java.util.Map;
44
import org.netbeans.spi.project.ProjectServiceProvider;
46
import org.netbeans.spi.project.ProjectServiceProvider;
45
import org.netbeans.spi.project.ui.RecommendedTemplates;
47
import org.netbeans.spi.project.ui.RecommendedTemplates2;
46
48
47
/**
49
/**
48
 *
50
 *
49
 * @author Tomas Zezula
51
 * @author Tomas Zezula
50
 */
52
 */
51
@ProjectServiceProvider(
53
@ProjectServiceProvider(
52
    service=RecommendedTemplates.class,
54
    service=RecommendedTemplates2.class,
53
    projectType={"org-netbeans-modules-java-j2seproject"})
55
    projectType={"org-netbeans-modules-java-j2seproject"})
54
public class JFXRecommendedTemplates implements RecommendedTemplates {
56
public class JFXRecommendedTemplates implements RecommendedTemplates2 {
55
56
    private static final String[] RECOMMENDED_TEMPLATES = {
57
        "javafx"    //NOI18N
58
    };
59
57
60
    /**
58
    /**
61
     * Returns template types for JFX.
59
     * Returns template types for JFX.
Lines 63-70 Link Here
63
     * @return JFX template tape
61
     * @return JFX template tape
64
     */
62
     */
65
    @Override
63
    @Override
66
    public String[] getRecommendedTypes() {
64
    public Map<? extends Number,String> getRecommendedTypes() {
67
        return RECOMMENDED_TEMPLATES;
65
        return Collections.singletonMap(450, "javafx"); // NOI18N
68
    }
66
    }
69
67
70
}
68
}
(-)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 (-7 / +16 lines)
Lines 42-59 Link Here
42
42
43
package org.netbeans.modules.maven.apisupport;
43
package org.netbeans.modules.maven.apisupport;
44
44
45
import java.util.HashMap;
46
import java.util.Map;
45
import org.netbeans.modules.apisupport.project.api.UIUtil;
47
import org.netbeans.modules.apisupport.project.api.UIUtil;
46
import org.netbeans.modules.maven.api.NbMavenProject;
48
import org.netbeans.modules.maven.api.NbMavenProject;
47
import org.netbeans.spi.project.ProjectServiceProvider;
49
import org.netbeans.spi.project.ProjectServiceProvider;
48
import org.netbeans.spi.project.ui.PrivilegedTemplates;
50
import org.netbeans.spi.project.ui.PrivilegedTemplates;
49
import org.netbeans.spi.project.ui.RecommendedTemplates;
51
import org.netbeans.spi.project.ui.RecommendedTemplates2;
50
52
51
/**
53
/**
52
 * apisupport specific part of RecommendedTemplates and PrivilegedTemplates,
54
 * apisupport specific part of RecommendedTemplates and PrivilegedTemplates,
53
 * @author Milos Kleint
55
 * @author Milos Kleint
54
 */
56
 */
55
@ProjectServiceProvider(service={RecommendedTemplates.class, PrivilegedTemplates.class}, projectType="org-netbeans-modules-maven/" + NbMavenProject.TYPE_NBM)
57
@ProjectServiceProvider(service={RecommendedTemplates2.class, PrivilegedTemplates.class}, projectType="org-netbeans-modules-maven/" + NbMavenProject.TYPE_NBM)
56
public class ApisupportRecoPrivTemplates implements RecommendedTemplates, PrivilegedTemplates {
58
public class ApisupportRecoPrivTemplates implements RecommendedTemplates2, PrivilegedTemplates {
57
    
59
    
58
        private static final String[] NBM_PRIVILEGED_NAMES = {
60
        private static final String[] NBM_PRIVILEGED_NAMES = {
59
            "Templates/Classes/Class.java", // NOI18N
61
            "Templates/Classes/Class.java", // NOI18N
Lines 66-86 Link Here
66
            //"Templates/Other/properties.properties", // NOI18N
68
            //"Templates/Other/properties.properties", // NOI18N
67
        };
69
        };
68
        private static final String[] NBM_TYPES = {         
70
        private static final String[] NBM_TYPES = {         
71
            UIUtil.TEMPLATE_CATEGORY,
69
            "java-classes",         // NOI18N
72
            "java-classes",         // NOI18N
70
            "java-main-class",      // NOI18N
73
            "java-main-class",      // NOI18N
71
            "java-forms",           // NOI18N
74
            "java-forms",           // NOI18N
72
            "java-beans",           // NOI18N
75
            "java-beans",           // NOI18N
73
            "oasis-XML-catalogs",   // NOI18N
76
            "oasis-XML-catalogs",   // NOI18N
74
            "XML",                  // NOI18N
77
            "XML",                  // NOI18N
75
            "junit",                // NOI18N                    
78
            "junit",                // NOI18N
76
            "simple-files",         // NOI18N
79
            "simple-files",         // NOI18N
77
            "REST-clients",         // NOI18N
80
            "REST-clients",         // NOI18N
78
            UIUtil.TEMPLATE_CATEGORY,
79
        };
81
        };
80
        
82
        
81
    
83
    
82
    public @Override String[] getRecommendedTypes() {
84
    @Override public Map<? extends Number,String> getRecommendedTypes() {
83
        return NBM_TYPES;
85
        return mapify(NBM_TYPES);
86
    }
87
    private static Map<? extends Number,String> mapify(String[] types) {
88
        Map<Integer,String> result = new HashMap<Integer,String>();
89
        for (int i = 0; i < types.length; i++) {
90
            result.put((i + 1) * 100, types[i]);
91
        }
92
        return result;
84
    }
93
    }
85
    
94
    
86
    public @Override String[] getPrivilegedTemplates() {
95
    public @Override String[] getPrivilegedTemplates() {
(-)a/maven.persistence/src/org/netbeans/modules/maven/persistence/RecommendedTemplatesImpl.java (-5 / +7 lines)
Lines 42-53 Link Here
42
42
43
package org.netbeans.modules.maven.persistence;
43
package org.netbeans.modules.maven.persistence;
44
44
45
import java.util.Collections;
46
import java.util.Map;
45
import org.netbeans.spi.project.ProjectServiceProvider;
47
import org.netbeans.spi.project.ProjectServiceProvider;
46
import org.netbeans.spi.project.ui.RecommendedTemplates;
48
import org.netbeans.spi.project.ui.RecommendedTemplates2;
47
49
48
@ProjectServiceProvider(service=RecommendedTemplates.class, projectType="org-netbeans-modules-maven")
50
@ProjectServiceProvider(service=RecommendedTemplates2.class, projectType="org-netbeans-modules-maven")
49
public class RecommendedTemplatesImpl implements RecommendedTemplates {
51
public class RecommendedTemplatesImpl implements RecommendedTemplates2 {
50
    public String[] getRecommendedTypes() {
52
    @Override public Map<? extends Number,String> getRecommendedTypes() {
51
        return new String[] {"persistence"};
53
        return Collections.singletonMap(777, "persistence");
52
    }
54
    }
53
}
55
}
(-)a/maven/src/org/netbeans/modules/maven/NbMavenProjectImpl.java (-1 lines)
Lines 651-657 Link Here
651
                    state,
651
                    state,
652
                    UILookupMergerSupport.createProjectOpenHookMerger(null),
652
                    UILookupMergerSupport.createProjectOpenHookMerger(null),
653
                    UILookupMergerSupport.createPrivilegedTemplatesMerger(),
653
                    UILookupMergerSupport.createPrivilegedTemplatesMerger(),
654
                    UILookupMergerSupport.createRecommendedTemplatesMerger(),
655
                    LookupProviderSupport.createSourcesMerger(),
654
                    LookupProviderSupport.createSourcesMerger(),
656
                    ProjectClassPathModifier.extenderForModifier(this),
655
                    ProjectClassPathModifier.extenderForModifier(this),
657
                    LookupMergerSupport.createClassPathModifierMerger());
656
                    LookupMergerSupport.createClassPathModifierMerger());
(-)a/maven/src/org/netbeans/modules/maven/queries/RecommendedTemplatesImpl.java (-13 / +22 lines)
Lines 43-59 Link Here
43
package org.netbeans.modules.maven.queries;
43
package org.netbeans.modules.maven.queries;
44
44
45
import java.util.ArrayList;
45
import java.util.ArrayList;
46
import java.util.Collections;
47
import java.util.HashMap;
46
import java.util.List;
48
import java.util.List;
49
import java.util.Map;
47
import org.netbeans.api.java.project.JavaProjectConstants;
50
import org.netbeans.api.java.project.JavaProjectConstants;
48
import org.netbeans.api.project.Project;
51
import org.netbeans.api.project.Project;
49
import org.netbeans.api.project.ProjectUtils;
52
import org.netbeans.api.project.ProjectUtils;
50
import org.netbeans.modules.maven.api.NbMavenProject;
53
import org.netbeans.modules.maven.api.NbMavenProject;
51
import org.netbeans.spi.project.ProjectServiceProvider;
54
import org.netbeans.spi.project.ProjectServiceProvider;
52
import org.netbeans.spi.project.ui.PrivilegedTemplates;
55
import org.netbeans.spi.project.ui.PrivilegedTemplates;
53
import org.netbeans.spi.project.ui.RecommendedTemplates;
56
import org.netbeans.spi.project.ui.RecommendedTemplates2;
54
57
55
@ProjectServiceProvider(service={RecommendedTemplates.class, PrivilegedTemplates.class}, projectType="org-netbeans-modules-maven")
58
@ProjectServiceProvider(service={RecommendedTemplates2.class, PrivilegedTemplates.class}, projectType="org-netbeans-modules-maven")
56
public final class RecommendedTemplatesImpl implements RecommendedTemplates, PrivilegedTemplates {
59
public final class RecommendedTemplatesImpl implements RecommendedTemplates2, PrivilegedTemplates {
57
60
58
    private static final String[] JAR_APPLICATION_TYPES = {
61
    private static final String[] JAR_APPLICATION_TYPES = {
59
        "java-classes",
62
        "java-classes",
Lines 145-151 Link Here
145
        prohibited.add(NbMavenProject.TYPE_OSGI);
148
        prohibited.add(NbMavenProject.TYPE_OSGI);
146
    }
149
    }
147
    
150
    
148
    @Override public String[] getRecommendedTypes() {
151
    @Override public Map<? extends Number,String> getRecommendedTypes() {
149
        String packaging = project.getLookup().lookup(NbMavenProject.class).getPackagingType();
152
        String packaging = project.getLookup().lookup(NbMavenProject.class).getPackagingType();
150
        if (packaging == null) {
153
        if (packaging == null) {
151
            packaging = NbMavenProject.TYPE_JAR;
154
            packaging = NbMavenProject.TYPE_JAR;
Lines 153-177 Link Here
153
        packaging = packaging.trim();
156
        packaging = packaging.trim();
154
        if (NbMavenProject.TYPE_POM.equals(packaging)) {
157
        if (NbMavenProject.TYPE_POM.equals(packaging)) {
155
            if (ProjectUtils.getSources(project).getSourceGroups(JavaProjectConstants.SOURCES_TYPE_JAVA).length > 0) {
158
            if (ProjectUtils.getSources(project).getSourceGroups(JavaProjectConstants.SOURCES_TYPE_JAVA).length > 0) {
156
                return JAR_APPLICATION_TYPES.clone(); // #192735
159
                return mapify(JAR_APPLICATION_TYPES); // #192735
157
                // #192735
158
            }
160
            }
159
            return POM_APPLICATION_TYPES.clone();
161
            return mapify(POM_APPLICATION_TYPES);
160
        }
162
        }
161
        if (NbMavenProject.TYPE_JAR.equals(packaging)) {
163
        if (NbMavenProject.TYPE_JAR.equals(packaging)) {
162
            return JAR_APPLICATION_TYPES.clone();
164
            return mapify(JAR_APPLICATION_TYPES);
163
        }
165
        }
164
        if (NbMavenProject.TYPE_WAR.equals(packaging)) {
166
        if (NbMavenProject.TYPE_WAR.equals(packaging)) {
165
            return GENERIC_WEB_TYPES.clone();
167
            return mapify(GENERIC_WEB_TYPES);
166
        }
168
        }
167
        if (NbMavenProject.TYPE_EJB.equals(packaging)) {
169
        if (NbMavenProject.TYPE_EJB.equals(packaging)) {
168
            return GENERIC_EJB_TYPES.clone();
170
            return mapify(GENERIC_EJB_TYPES);
169
        }
171
        }
170
        if (NbMavenProject.TYPE_EAR.equals(packaging)) {
172
        if (NbMavenProject.TYPE_EAR.equals(packaging)) {
171
            return GENERIC_EAR_TYPES.clone();
173
            return mapify(GENERIC_EAR_TYPES);
172
        }
174
        }
173
        if (prohibited.contains(packaging)) {
175
        if (prohibited.contains(packaging)) {
174
            return new String[0];
176
            return Collections.emptyMap();
175
        }
177
        }
176
        // If packaging is unknown, any type of sources is recommanded.
178
        // If packaging is unknown, any type of sources is recommanded.
177
        //TODO in future we probably can try to guess based on what plugins are
179
        //TODO in future we probably can try to guess based on what plugins are
Lines 179-185 Link Here
179
        // If packaging is unknown, any type of sources is recommanded.
181
        // If packaging is unknown, any type of sources is recommanded.
180
        //TODO in future we probably can try to guess based on what plugins are
182
        //TODO in future we probably can try to guess based on what plugins are
181
        // defined in the lifecycle.
183
        // defined in the lifecycle.
182
        return ALL_TYPES.clone();
184
        return mapify(ALL_TYPES);
185
    }
186
    private static Map<? extends Number,String> mapify(String[] types) {
187
        Map<Integer,String> result = new HashMap<Integer,String>();
188
        for (int i = 0; i < types.length; i++) {
189
            result.put((i + 1) * 100, types[i]);
190
        }
191
        return result;
183
    }
192
    }
184
    
193
    
185
    @Override public String[] getPrivilegedTemplates() {
194
    @Override public String[] getPrivilegedTemplates() {
(-)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/LazyProject.java (-4 / +5 lines)
Lines 49-60 Link Here
49
import java.util.Collection;
49
import java.util.Collection;
50
import java.util.Collections;
50
import java.util.Collections;
51
import java.util.Iterator;
51
import java.util.Iterator;
52
import java.util.Map;
52
import javax.swing.Action;
53
import javax.swing.Action;
53
import javax.swing.Icon;
54
import javax.swing.Icon;
54
import org.netbeans.api.project.Project;
55
import org.netbeans.api.project.Project;
55
import org.netbeans.api.project.ProjectInformation;
56
import org.netbeans.api.project.ProjectInformation;
56
import org.netbeans.spi.project.ui.LogicalViewProvider;
57
import org.netbeans.spi.project.ui.LogicalViewProvider;
57
import org.netbeans.spi.project.ui.RecommendedTemplates;
58
import org.netbeans.spi.project.ui.RecommendedTemplates2;
58
import org.netbeans.spi.project.ui.support.CommonProjectActions;
59
import org.netbeans.spi.project.ui.support.CommonProjectActions;
59
import org.openide.filesystems.FileObject;
60
import org.openide.filesystems.FileObject;
60
import org.openide.filesystems.FileUtil;
61
import org.openide.filesystems.FileUtil;
Lines 77-83 Link Here
77
 * @author Tim Boudreau, Jaroslav Tulach
78
 * @author Tim Boudreau, Jaroslav Tulach
78
 */
79
 */
79
final class LazyProject implements
80
final class LazyProject implements
80
Project, ProjectInformation, SearchInfo, LogicalViewProvider, RecommendedTemplates {
81
Project, ProjectInformation, SearchInfo, LogicalViewProvider, RecommendedTemplates2 {
81
    URL url;
82
    URL url;
82
    String displayName;
83
    String displayName;
83
    ExtIcon icon;
84
    ExtIcon icon;
Lines 140-147 Link Here
140
        return null;
141
        return null;
141
    }
142
    }
142
143
143
    public String[] getRecommendedTypes() {
144
    @Override public Map<? extends Number,String> getRecommendedTypes() {
144
        return new String[] { "simple-files" }; // NOI18N
145
        return Collections.singletonMap(0, "simple-files"); // NOI18N
145
    }
146
    }
146
    
147
    
147
    
148
    
(-)a/projectui/src/org/netbeans/modules/project/ui/OpenProjectList.java (-19 / +4 lines)
Lines 83-89 Link Here
83
import javax.swing.Icon;
83
import javax.swing.Icon;
84
import javax.swing.SwingUtilities;
84
import javax.swing.SwingUtilities;
85
import org.netbeans.api.annotations.common.NonNull;
85
import org.netbeans.api.annotations.common.NonNull;
86
import org.netbeans.api.annotations.common.NullAllowed;
87
import org.netbeans.api.progress.ProgressHandle;
86
import org.netbeans.api.progress.ProgressHandle;
88
import org.netbeans.api.progress.ProgressHandleFactory;
87
import org.netbeans.api.progress.ProgressHandleFactory;
89
import org.netbeans.api.project.FileOwnerQuery;
88
import org.netbeans.api.project.FileOwnerQuery;
Lines 98-104 Link Here
98
import org.netbeans.spi.project.SubprojectProvider;
97
import org.netbeans.spi.project.SubprojectProvider;
99
import org.netbeans.spi.project.ui.PrivilegedTemplates;
98
import org.netbeans.spi.project.ui.PrivilegedTemplates;
100
import org.netbeans.spi.project.ui.ProjectOpenedHook;
99
import org.netbeans.spi.project.ui.ProjectOpenedHook;
101
import org.netbeans.spi.project.ui.RecommendedTemplates;
102
import org.openide.ErrorManager;
100
import org.openide.ErrorManager;
103
import org.openide.awt.StatusDisplayer;
101
import org.openide.awt.StatusDisplayer;
104
import org.openide.filesystems.FileChangeAdapter;
102
import org.openide.filesystems.FileChangeAdapter;
Lines 1284-1290 Link Here
1284
            
1282
            
1285
            ProjectManager.mutex().writeAccess(new Mutex.Action<Void>() {
1283
            ProjectManager.mutex().writeAccess(new Mutex.Action<Void>() {
1286
                public @Override Void run() {
1284
                public @Override Void run() {
1287
                String[] rtNames = getRecommendedTypes(project);
1285
                String[] rtNames = TemplateChooserPanelGUI.getRecommendedTypes(project);
1288
                Iterator<String> it = getRecentTemplates().iterator();
1286
                Iterator<String> it = getRecentTemplates().iterator();
1289
                for( int i = 0; i < NUM_TEMPLATES && it.hasNext(); i++ ) {
1287
                for( int i = 0; i < NUM_TEMPLATES && it.hasNext(); i++ ) {
1290
                    String templateName = it.next();
1288
                    String templateName = it.next();
Lines 1292-1298 Link Here
1292
                    if ( fo == null ) {
1290
                    if ( fo == null ) {
1293
                        it.remove(); // Does not exists remove
1291
                        it.remove(); // Does not exists remove
1294
                    }
1292
                    }
1295
                    else if ( isRecommended( rtNames, fo ) ) {
1293
                    else if (isRecommended(rtNames, fo, true)) {
1296
                        result.add( fo );
1294
                        result.add( fo );
1297
                        privilegedTemplates.remove( templateName ); // Not to have it twice
1295
                        privilegedTemplates.remove( templateName ); // Not to have it twice
1298
                    }
1296
                    }
Lines 1316-1322 Link Here
1316
               
1314
               
1317
    }
1315
    }
1318
1316
1319
    static boolean isRecommended(@NonNull String[] recommendedTypes, @NonNull FileObject primaryFile) {
1317
    static boolean isRecommended(@NonNull String[] recommendedTypes, @NonNull FileObject primaryFile, boolean lax) {
1320
        if (recommendedTypes.length == 0) {
1318
        if (recommendedTypes.length == 0) {
1321
            // if no recommendedTypes are supported (i.e. freeform) -> disaply all templates
1319
            // if no recommendedTypes are supported (i.e. freeform) -> disaply all templates
1322
            return true;
1320
            return true;
Lines 1335-1357 Link Here
1335
        } else {
1333
        } else {
1336
            // issue 44871, if attr 'templateCategorized' is not set => all is ok
1334
            // issue 44871, if attr 'templateCategorized' is not set => all is ok
1337
            // no category set, ok display it
1335
            // no category set, ok display it
1338
            return true;
1336
            return lax;
1339
        }
1337
        }
1340
    }
1338
    }
1341
1339
1342
    /**
1343
     * Returns list of recommended template types for project. Do not call in
1344
     * loop because it may scan project files to resolve its type which is time
1345
     * consuming.
1346
     */
1347
    static @NonNull String[] getRecommendedTypes(@NullAllowed Project project) {
1348
        if (project == null) {
1349
            return new String[0];
1350
        }
1351
        RecommendedTemplates rt = project.getLookup().lookup(RecommendedTemplates.class);
1352
        return rt == null ? new String[0] : rt.getRecommendedTypes();
1353
    }
1354
    
1355
    private static List<String> getCategories (String source) {
1340
    private static List<String> getCategories (String source) {
1356
        ArrayList<String> categories = new ArrayList<String> ();
1341
        ArrayList<String> categories = new ArrayList<String> ();
1357
        StringTokenizer cattok = new StringTokenizer (source, ","); // NOI18N
1342
        StringTokenizer cattok = new StringTokenizer (source, ","); // NOI18N
(-)a/projectui/src/org/netbeans/modules/project/ui/TemplateChooserPanelGUI.java (-35 / +92 lines)
Lines 50-61 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;
54
import java.util.LinkedHashSet;
55
import java.util.LinkedList;
53
import java.util.List;
56
import java.util.List;
57
import java.util.Map;
58
import java.util.Set;
59
import java.util.TreeMap;
60
import java.util.logging.Level;
61
import java.util.logging.Logger;
54
import javax.swing.DefaultComboBoxModel;
62
import javax.swing.DefaultComboBoxModel;
55
import javax.swing.ListCellRenderer;
63
import javax.swing.ListCellRenderer;
56
import javax.swing.event.ChangeListener;
64
import javax.swing.event.ChangeListener;
65
import org.netbeans.api.annotations.common.CheckForNull;
57
import org.netbeans.api.annotations.common.NonNull;
66
import org.netbeans.api.annotations.common.NonNull;
67
import org.netbeans.api.annotations.common.NullAllowed;
58
import org.netbeans.api.project.Project;
68
import org.netbeans.api.project.Project;
69
import org.netbeans.spi.project.ui.RecommendedTemplates2;
59
import org.openide.filesystems.FileObject;
70
import org.openide.filesystems.FileObject;
60
import org.openide.filesystems.FileUtil;
71
import org.openide.filesystems.FileUtil;
61
import org.openide.loaders.DataFolder;
72
import org.openide.loaders.DataFolder;
Lines 67-86 Link Here
67
import org.openide.nodes.Node;
78
import org.openide.nodes.Node;
68
import org.openide.util.AsyncGUIJob;
79
import org.openide.util.AsyncGUIJob;
69
import org.openide.util.ChangeSupport;
80
import org.openide.util.ChangeSupport;
81
import org.openide.util.Lookup;
70
import org.openide.util.NbBundle;
82
import org.openide.util.NbBundle;
71
import org.openide.util.Utilities;
83
import org.openide.util.Utilities;
72
84
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
/**
85
/**
80
 * Provides the GUI for the template chooser panel.
86
 * Provides the GUI for the template chooser panel.
81
 * @author Jesse Glick
87
 * @author Jesse Glick
82
 */
88
 */
83
final class TemplateChooserPanelGUI extends javax.swing.JPanel implements PropertyChangeListener, AsyncGUIJob {
89
final class TemplateChooserPanelGUI extends javax.swing.JPanel implements PropertyChangeListener, AsyncGUIJob {
90
91
    private static final Logger LOG = Logger.getLogger(TemplateChooserPanelGUI.class.getName());
84
    
92
    
85
    /** prefered dimmension of the panels */
93
    /** prefered dimmension of the panels */
86
    private static final java.awt.Dimension PREF_DIM = new java.awt.Dimension (500, 340);
94
    private static final java.awt.Dimension PREF_DIM = new java.awt.Dimension (500, 340);
Lines 94-100 Link Here
94
    //GUI Builder
102
    //GUI Builder
95
    private TemplatesPanelGUI.Builder builder;
103
    private TemplatesPanelGUI.Builder builder;
96
    private Project project;
104
    private Project project;
97
    private @NonNull String[] projectRecommendedTypes;
105
    private String[] projectRecommendedTypes;
98
    private String category;
106
    private String category;
99
    private String template;
107
    private String template;
100
    private boolean isWarmUp = true;
108
    private boolean isWarmUp = true;
Lines 116-122 Link Here
116
        boolean wf;
124
        boolean wf;
117
        synchronized (this) {
125
        synchronized (this) {
118
            this.project = p;
126
            this.project = p;
119
            this.projectRecommendedTypes = OpenProjectList.getRecommendedTypes(p);
127
            this.projectRecommendedTypes = getRecommendedTypes(p);
120
            this.category = category;
128
            this.category = category;
121
            this.template = template;
129
            this.template = template;
122
            wf = this.isWarmUp;
130
            wf = this.isWarmUp;
Lines 299-317 Link Here
299
        }
307
        }
300
308
301
        @Override protected boolean createKeys(List<TemplateKey> keys) {
309
        @Override protected boolean createKeys(List<TemplateKey> keys) {
302
            for (DataObject d : folder.getChildren()) {
310
            Set<DataObject> added = new HashSet<DataObject>();
303
                if (isFolderOfTemplates(d)) {
311
            DataObject[] potentialCategories = folder.getChildren();
304
                    boolean leaf = true;
312
            if (projectRecommendedTypes == null) {
305
                    for (DataObject child : ((DataFolder) d).getChildren()) {
313
                return true; // in case readValues has not been called
306
                        if (isFolderOfTemplates(child)) {
314
            }
307
                            leaf = false;
315
            for (String type : projectRecommendedTypes) {
308
                            break;
316
                addMatches(potentialCategories, added, new String[] {type}, false, type, keys);
317
            }
318
            addMatches(potentialCategories, added, projectRecommendedTypes, true, "<any>", keys);
319
            return true;
320
        }
321
        private void addMatches(DataObject[] potentialCategories, Set<DataObject> added, String[] types, boolean lax, String typeDiagnostic, List<TemplateKey> keys) {
322
            for (DataObject d : potentialCategories) {
323
                if (!added.contains(d)) {
324
                    DataObject trigger = isFolderOfTemplates(d, types, lax);
325
                    if (trigger != null) {
326
                        added.add(d);
327
                        LOG.log(Level.FINE, "adding {0} because of {1} matched by {2}", new Object[] {d.getPrimaryFile().getPath(), typeDiagnostic, trigger.getPrimaryFile().getPath()});
328
                        boolean leaf = true;
329
                        for (DataObject child : ((DataFolder) d).getChildren()) {
330
                            if (isFolderOfTemplates(child, projectRecommendedTypes, true) != null) {
331
                                leaf = false;
332
                                break;
333
                            }
309
                        }
334
                        }
335
                        keys.add(new TemplateKey(d, leaf));
310
                    }
336
                    }
311
                    keys.add(new TemplateKey(d, leaf));
312
                }
337
                }
313
            }
338
            }
314
            return true;
315
        }
339
        }
316
        
340
        
317
        @Override protected Node createNodeForKey(TemplateKey k) {
341
        @Override protected Node createNodeForKey(TemplateKey k) {
Lines 319-325 Link Here
319
        }
343
        }
320
        
344
        
321
        @Override public void actionPerformed (ActionEvent event) {
345
        @Override public void actionPerformed (ActionEvent event) {
322
            projectRecommendedTypes = OpenProjectList.getRecommendedTypes(getProject());
346
            projectRecommendedTypes = getRecommendedTypes(getProject());
323
            final String cat = getCategoryName ();
347
            final String cat = getCategoryName ();
324
            String template =  ((TemplatesPanelGUI)TemplateChooserPanelGUI.this.templatesPanel).getSelectedTemplateName();
348
            String template =  ((TemplatesPanelGUI)TemplateChooserPanelGUI.this.templatesPanel).getSelectedTemplateName();
325
            refresh(false);
349
            refresh(false);
Lines 330-343 Link Here
330
        
354
        
331
        // Private methods -----------------------------------------------------
355
        // Private methods -----------------------------------------------------
332
        
356
        
333
        private boolean isFolderOfTemplates(DataObject d) {
357
        private @CheckForNull DataObject isFolderOfTemplates(DataObject d, String[] projectRecommendedTypes, boolean lax) {
334
            if (d instanceof DataFolder && !isTemplate((DataFolder)d))  {
358
            if (d instanceof DataFolder && !isTemplate((DataFolder)d))  {
335
                Object o = d.getPrimaryFile().getAttribute("simple"); // NOI18N
359
                Object o = d.getPrimaryFile().getAttribute("simple"); // NOI18N
336
                if (o == null || Boolean.TRUE.equals(o)) {
360
                if (o == null || Boolean.TRUE.equals(o)) {
337
                    return hasChildren((Project) projectsComboBox.getSelectedItem(), d);
361
                    return hasChildren(getProject(), d, projectRecommendedTypes, lax);
338
                }
362
                }
339
            }
363
            }
340
            return false;
364
            return null;
341
        }
365
        }
342
        
366
        
343
    }
367
    }
Lines 353-359 Link Here
353
        
377
        
354
        @Override protected boolean createKeys(List<DataObject> keys) {
378
        @Override protected boolean createKeys(List<DataObject> keys) {
355
            for (DataObject dobj : root.getChildren()) {
379
            for (DataObject dobj : root.getChildren()) {
356
                if (isTemplate(dobj) && OpenProjectList.isRecommended(projectRecommendedTypes, dobj.getPrimaryFile())) {
380
                if (isTemplate(dobj) && OpenProjectList.isRecommended(projectRecommendedTypes, dobj.getPrimaryFile(), true)) {
357
                    if (dobj instanceof DataShadow) {
381
                    if (dobj instanceof DataShadow) {
358
                        dobj = ((DataShadow) dobj).getOriginal();
382
                        dobj = ((DataShadow) dobj).getOriginal();
359
                    }
383
                    }
Lines 410-442 Link Here
410
        return false;
434
        return false;
411
    }
435
    }
412
    
436
    
413
    private boolean hasChildren (Project p, DataObject folder) { 
437
    private @CheckForNull DataObject hasChildren(Project p, DataObject folder, String[] projectRecommendedTypes, boolean lax) {
414
        if (!(folder instanceof DataFolder)) {
438
        if (!(folder instanceof DataFolder)) {
415
            return false;
439
            return null;
416
        }
440
        }
417
        
441
        
418
        DataFolder f = (DataFolder) folder;
442
        DataFolder f = (DataFolder) folder;
419
        if (!OpenProjectList.isRecommended(projectRecommendedTypes, f.getPrimaryFile())) {
443
        if (!OpenProjectList.isRecommended(projectRecommendedTypes, f.getPrimaryFile(), true)) {
420
            // Eg. Licenses folder.
444
            // Eg. Licenses folder.
421
            //see #102508
445
            //see #102508
422
            return false;
446
            return null;
423
        }
447
        }
424
        DataObject[] ch = f.getChildren ();
448
        DataObject[] ch = f.getChildren ();
425
        for (int i = 0; i < ch.length; i++) {
449
        for (int i = 0; i < ch.length; i++) {
426
            if (isTemplate (ch[i]) && OpenProjectList.isRecommended(projectRecommendedTypes, ch[i].getPrimaryFile ())) {
450
            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?
451
                // XXX: how to filter link to Package template in each java types folder?
428
                if (!(ch[i] instanceof DataShadow)) {
452
                if (!(ch[i] instanceof DataShadow)) {
429
                    return true;
453
                    return ch[i];
430
                }
454
                }
431
            } else if (ch[i] instanceof DataFolder && hasChildren (p, ch[i])) {
455
            } else if (ch[i] instanceof DataFolder) {
432
                return true;
456
                DataObject t = hasChildren(p, ch[i], projectRecommendedTypes, lax);
457
                if (t != null) {
458
                    return t;
459
                }
433
            }
460
            }
434
        }
461
        }
435
        return false;
462
        return null;
436
        
437
        // simplied but more counts
438
        //return new FileChildren (p, (DataFolder) folder).getNodesCount () > 0;
439
        
440
    }
463
    }
441
    
464
    
442
    public void construct () {
465
    public void construct () {
Lines 469-472 Link Here
469
        }
492
        }
470
    }
493
    }
471
    
494
    
495
    /**
496
     * Returns list of recommended template types for project. Do not call in
497
     * loop because it may scan project files to resolve its type which is time
498
     * consuming.
499
     */
500
    static @NonNull String[] getRecommendedTypes(@NullAllowed Project project) {
501
        if (project == null) {
502
            return new String[0];
503
        }
504
        return getRecommendedTypes(project.getLookup());
505
    }
506
    @SuppressWarnings("deprecation")
507
    static @NonNull String[] getRecommendedTypes(@NonNull Lookup lookup) {
508
        Map<Number,List<String>> typeMap = new TreeMap<Number,List<String>>();
509
        for (RecommendedTemplates2 rt2 : lookup.lookupAll(RecommendedTemplates2.class)) {
510
            for (Map.Entry<? extends Number,String> entry : rt2.getRecommendedTypes().entrySet()) {
511
                List<String> types = typeMap.get(entry.getKey());
512
                if (types == null) {
513
                    types = new LinkedList<String>();
514
                    typeMap.put(entry.getKey(), types);
515
                }
516
                types.add(entry.getValue());
517
            }
518
        }
519
        Set<String> types = new LinkedHashSet<String>();
520
        for (List<String> _types : typeMap.values()) {
521
            types.addAll(_types);
522
        }
523
        for (org.netbeans.spi.project.ui.RecommendedTemplates rt : lookup.lookupAll(org.netbeans.spi.project.ui.RecommendedTemplates.class)) {
524
            types.addAll(Arrays.asList(rt.getRecommendedTypes()));
525
        }
526
        return types.toArray(new String[types.size()]);
527
    }
528
472
}
529
}
(-)a/projectui/test/unit/src/org/netbeans/modules/project/ui/TemplateChooserPanelGUITest.java (-6 / +73 lines)
Lines 43-52 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.Arrays;
47
import java.util.Collections;
48
import java.util.HashMap;
49
import java.util.Map;
50
import java.util.logging.Level;
46
import org.netbeans.api.project.Project;
51
import org.netbeans.api.project.Project;
47
import org.netbeans.junit.NbTestCase;
52
import org.netbeans.junit.NbTestCase;
48
import org.netbeans.modules.project.ui.TemplateChooserPanelGUI.FileChooserBuilder;
53
import org.netbeans.modules.project.ui.TemplateChooserPanelGUI.FileChooserBuilder;
49
import org.netbeans.spi.project.ui.RecommendedTemplates;
54
import org.netbeans.spi.project.ui.RecommendedTemplates2;
50
import org.openide.filesystems.FileObject;
55
import org.openide.filesystems.FileObject;
51
import org.openide.filesystems.FileUtil;
56
import org.openide.filesystems.FileUtil;
52
import org.openide.loaders.DataFolder;
57
import org.openide.loaders.DataFolder;
Lines 71-76 Link Here
71
        return 300000;
76
        return 300000;
72
    }
77
    }
73
78
79
    @Override protected Level logLevel() {
80
        return Level.FINE;
81
    }
82
83
    @Override protected String logRoot() {
84
        return "org.netbeans.modules.project.ui";
85
    }
86
74
    public void testReadValues() {
87
    public void testReadValues() {
75
        Project p = new P();
88
        Project p = new P();
76
        String category = "";
89
        String category = "";
Lines 123-130 Link Here
123
        t.setAttribute("template", true);
136
        t.setAttribute("template", true);
124
        t.setAttribute("templateCategory", "main");
137
        t.setAttribute("templateCategory", "main");
125
        TemplateChooserPanelGUI gui = new TemplateChooserPanelGUI();
138
        TemplateChooserPanelGUI gui = new TemplateChooserPanelGUI();
126
        gui.construct();
127
        gui.finished();
128
        gui.readValues(new P(), null, null);
139
        gui.readValues(new P(), null, null);
129
        FileChooserBuilder builder = gui.new FileChooserBuilder();
140
        FileChooserBuilder builder = gui.new FileChooserBuilder();
130
        assertChildren("Main, Samples[Main]", builder.createCategoriesChildren(DataFolder.findFolder(r)));
141
        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"))));
143
        assertChildren("t5", builder.createTemplatesChildren(DataFolder.findFolder(r.getFileObject("Samples/Main"))));
133
    }
144
    }
134
145
146
    public void testTemplateCategoryOrder() throws Exception { // #206126
147
        FileObject r = FileUtil.createMemoryFileSystem().getRoot();
148
        FileObject f = r.createFolder("Specialized");
149
        f.setAttribute("position", 1);
150
        FileObject t = f.createData("t1");
151
        t.setAttribute("template", true);
152
        t.setAttribute("templateCategory", "inappropriate");
153
        t = f.createData("t2");
154
        t.setAttribute("template", true);
155
        t.setAttribute("templateCategory", "misc");
156
        f = r.createFolder("Common");
157
        f.setAttribute("position", 2);
158
        t = f.createData("t3");
159
        t.setAttribute("template", true);
160
        t.setAttribute("templateCategory", "main");
161
        t = f.createData("t4");
162
        t.setAttribute("template", true);
163
        t.setAttribute("templateCategory", "misc");
164
        f = r.createFolder("Plain");
165
        f.setAttribute("position", 3);
166
        t = f.createData("t5");
167
        t.setAttribute("template", true);
168
        TemplateChooserPanelGUI gui = new TemplateChooserPanelGUI();
169
        gui.readValues(new P(), null, null);
170
        FileChooserBuilder builder = gui.new FileChooserBuilder();
171
        assertChildren("Common, Specialized, Plain", builder.createCategoriesChildren(DataFolder.findFolder(r)));
172
    }
173
174
    @SuppressWarnings("deprecation")
175
    public void testGetRecommendedTypes() throws Exception {
176
        assertEquals("[early, principal, oops, old1, old2, old3, old4]", Arrays.toString(TemplateChooserPanelGUI.getRecommendedTypes(Lookups.fixed(new RecommendedTemplates2() {
177
            @Override public Map<? extends Number, String> getRecommendedTypes() {
178
                return Collections.singletonMap(100, "principal");
179
            }
180
        }, new RecommendedTemplates2() {
181
            @Override public Map<? extends Number, String> getRecommendedTypes() {
182
                return Collections.singletonMap(50, "early");
183
            }
184
        }, new org.netbeans.spi.project.ui.RecommendedTemplates() {
185
            @Override public String[] getRecommendedTypes() {
186
                return new String[] {"old1", "old2"};
187
            }
188
        }, new RecommendedTemplates2() {
189
            @Override public Map<? extends Number, String> getRecommendedTypes() {
190
                return Collections.singletonMap(100, "oops");
191
            }
192
        }, new org.netbeans.spi.project.ui.RecommendedTemplates() {
193
            @Override public String[] getRecommendedTypes() {
194
                return new String[] {"old3", "old4"};
195
            }
196
        }))));
197
    }
198
135
    private static void assertChildren(String repn, Children c) {
199
    private static void assertChildren(String repn, Children c) {
136
        StringBuilder b = new StringBuilder();
200
        StringBuilder b = new StringBuilder();
137
        representationOf(c, b);
201
        representationOf(c, b);
Lines 162-170 Link Here
162
        }
226
        }
163
227
164
        public @Override Lookup getLookup() {
228
        public @Override Lookup getLookup() {
165
            return Lookups.singleton(new RecommendedTemplates() {
229
            return Lookups.singleton(new RecommendedTemplates2() {
166
                public @Override String[] getRecommendedTypes() {
230
                public @Override Map<? extends Number,String> getRecommendedTypes() {
167
                    return new String[] {"main", "misc"};
231
                    Map<Number,String> types = new HashMap<Number,String>();
232
                    types.put(1, "main");
233
                    types.put(2, "misc");
234
                    return types;
168
                }
235
                }
169
            });
236
            });
170
        }
237
        }
(-)a/projectuiapi/apichanges.xml (+34 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="RecommendedTemplates2">
111
            <api name="general"/>
112
            <summary><code>RecommendedTemplates2</code> supersedes <code>RecommendedTemplates</code></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 of <code>RecommendedTemplates</code> should be changed to
119
                    <code>RecommendedTemplates2</code>.
120
                    Uses of <code>UILookupMergerSupport.createRecommendedTemplatesMerger</code> may be removed.
121
                </p>
122
                <p>
123
                    Positions of template folders may also need to be adjusted.
124
                    Order of displayed folders may differ from previous behavior
125
                    even if no <code>RecommendedTemplates2</code> implementations
126
                    are in use, since the overall sort mechanism now gives priority
127
                    to the project's ordering preferences (via categories) rather
128
                    than the global ordering preferences (via folders).
129
                </p>
130
            </compatibility>
131
            <description>
132
                <p>
133
                    UI infrastructure will now pay attention to an ordered list of categories
134
                    in <code>RecommendedTemplates2</code>, preferring to show template
135
                    folders first which contain templates marked with categories earlier
136
                    in the list.
137
                </p>
138
            </description>
139
            <class package="org.netbeans.spi.project.ui" name="RecommendedTemplates"/>
140
            <class package="org.netbeans.spi.project.ui" name="RecommendedTemplates2"/>
141
            <class package="org.netbeans.spi.project.ui.support" name="UILookupMergerSupport"/>
142
            <issue number="206126"/>
143
        </change>
110
        <change id="FileSensitiveAction.performer">
144
        <change id="FileSensitiveAction.performer">
111
            <api name="general"/>
145
            <api name="general"/>
112
            <summary>Adding ability to create a file sensitive action with custom performer</summary>
146
            <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 (+2 lines)
Lines 54-60 Link Here
54
 * For more information about registering templates see overview of
54
 * For more information about registering templates see overview of
55
 * {@link org.netbeans.spi.project.ui.templates.support} package.
55
 * {@link org.netbeans.spi.project.ui.templates.support} package.
56
 * @author Petr Hrebejk
56
 * @author Petr Hrebejk
57
 * @deprecated Implement {@link RecommendedTemplates2} instead.
57
 */
58
 */
59
@Deprecated
58
public interface RecommendedTemplates {
60
public interface RecommendedTemplates {
59
61
60
    /**
62
    /**
(-)a/projectuiapi/src/org/netbeans/spi/project/ui/RecommendedTemplates.java (-4 / +10 lines)
Lines 44-67 Link Here
44
44
45
package org.netbeans.spi.project.ui;
45
package org.netbeans.spi.project.ui;
46
46
47
import java.util.Map;
47
import org.netbeans.api.templates.TemplateRegistration;
48
import org.netbeans.api.templates.TemplateRegistration;
49
import org.netbeans.spi.project.ui.support.UILookupMergerSupport;
48
50
49
/**
51
/**
50
 * List of template types supported by a project when making a new file.
52
 * List of template types supported by a project when making a new file.
51
 * An instance should be placed in {@link org.netbeans.api.project.Project#getLookup}
53
 * An instance should be placed in {@link org.netbeans.api.project.Project#getLookup}
52
 * to affect the recommended template list for that project.
54
 * to affect the recommended template list for that project.
53
 * <p>
55
 * <p>
56
 * Unlike {@link RecommendedTemplates} this service supports ordering of template categories.
57
 * Zero or more instances of either service may be present in project lookup;
58
 * instances of this service will take priority.
59
 * <p>
54
 * For more information about registering templates see overview of
60
 * For more information about registering templates see overview of
55
 * {@link org.netbeans.spi.project.ui.templates.support} package.
61
 * {@link org.netbeans.spi.project.ui.templates.support} package.
56
 * @author Petr Hrebejk
62
 * @since 1.57
57
 */
63
 */
58
public interface RecommendedTemplates {
64
public interface RecommendedTemplates2 {
59
65
60
    /**
66
    /**
61
     * Lists supported template types.
67
     * Lists supported template types.
62
     * @return types of supported templates (should match template file attribute names)
68
     * @return types of supported templates (should match template file attribute names), lower positions first
63
     * @see TemplateRegistration#category
69
     * @see TemplateRegistration#category
64
     */
70
     */
65
    public String[] getRecommendedTypes();
71
    Map<? extends Number,String> getRecommendedTypes();
66
    
72
    
67
}
73
}
(-)a/projectuiapi/src/org/netbeans/spi/project/ui/support/UILookupMergerSupport.java (-14 / +14 lines)
Lines 52-58 Link Here
52
import org.netbeans.spi.project.LookupMerger;
52
import org.netbeans.spi.project.LookupMerger;
53
import org.netbeans.spi.project.ui.PrivilegedTemplates;
53
import org.netbeans.spi.project.ui.PrivilegedTemplates;
54
import org.netbeans.spi.project.ui.ProjectOpenedHook;
54
import org.netbeans.spi.project.ui.ProjectOpenedHook;
55
import org.netbeans.spi.project.ui.RecommendedTemplates;
55
import org.netbeans.spi.project.ui.RecommendedTemplates2;
56
import org.openide.util.Lookup;
56
import org.openide.util.Lookup;
57
57
58
/**
58
/**
Lines 67-81 Link Here
67
    }
67
    }
68
    
68
    
69
    /**
69
    /**
70
     * Create a {@link org.netbeans.spi.project.LookupMerger} instance 
70
     * @deprecated No longer needed; caller will look for all instances of {@link org.netbeans.spi.project.ui.RecommendedTemplates} and {@link RecommendedTemplates2}.
71
     * for {@link org.netbeans.spi.project.ui.RecommendedTemplates}. Allows to merge 
72
     * templates from multiple sources. 
73
     * @return instance to include in project lookup
74
     */
71
     */
75
    public static LookupMerger<RecommendedTemplates> createRecommendedTemplatesMerger() {
72
    @Deprecated
73
    public static LookupMerger<org.netbeans.spi.project.ui.RecommendedTemplates> createRecommendedTemplatesMerger() {
76
        return new RecommendedMerger();
74
        return new RecommendedMerger();
77
    }
75
    }
78
    
76
79
    /**
77
    /**
80
     * Create a {@link org.netbeans.spi.project.LookupMerger} instance 
78
     * Create a {@link org.netbeans.spi.project.LookupMerger} instance 
81
     * for {@link org.netbeans.spi.project.ui.PrivilegedTemplates}. Allows to merge 
79
     * for {@link org.netbeans.spi.project.ui.PrivilegedTemplates}. Allows to merge 
Lines 108-121 Link Here
108
            return new PrivilegedTemplatesImpl(lookup);
106
            return new PrivilegedTemplatesImpl(lookup);
109
        }
107
        }
110
    }
108
    }
111
    
109
112
    private static class RecommendedMerger implements LookupMerger<RecommendedTemplates> {
110
    @Deprecated
111
    private static class RecommendedMerger implements LookupMerger<org.netbeans.spi.project.ui.RecommendedTemplates> {
113
        
112
        
114
        public Class<RecommendedTemplates> getMergeableClass() {
113
        public Class<org.netbeans.spi.project.ui.RecommendedTemplates> getMergeableClass() {
115
            return RecommendedTemplates.class;
114
            return org.netbeans.spi.project.ui.RecommendedTemplates.class;
116
        }
115
        }
117
116
118
        public RecommendedTemplates merge(Lookup lookup) {
117
        public org.netbeans.spi.project.ui.RecommendedTemplates merge(Lookup lookup) {
119
            return new RecommendedTemplatesImpl(lookup);
118
            return new RecommendedTemplatesImpl(lookup);
120
        }
119
        }
121
    }
120
    }
Lines 157-163 Link Here
157
        }
156
        }
158
    }
157
    }
159
    
158
    
160
    private static class RecommendedTemplatesImpl implements RecommendedTemplates {
159
    @Deprecated
160
    private static class RecommendedTemplatesImpl implements org.netbeans.spi.project.ui.RecommendedTemplates {
161
        
161
        
162
        private Lookup lkp;
162
        private Lookup lkp;
163
        
163
        
Lines 167-173 Link Here
167
        
167
        
168
        public String[] getRecommendedTypes() {
168
        public String[] getRecommendedTypes() {
169
            Set<String> templates = new LinkedHashSet<String>();
169
            Set<String> templates = new LinkedHashSet<String>();
170
            for (RecommendedTemplates pt : lkp.lookupAll(RecommendedTemplates.class)) {
170
            for (org.netbeans.spi.project.ui.RecommendedTemplates pt : lkp.lookupAll(org.netbeans.spi.project.ui.RecommendedTemplates.class)) {
171
                String[] temp = pt.getRecommendedTypes();
171
                String[] temp = pt.getRecommendedTypes();
172
                if (temp == null) {
172
                if (temp == null) {
173
                    throw new IllegalStateException(pt.getClass().getName() + " returns null from getRecommendedTemplates() method."); //NOI18N
173
                    throw new IllegalStateException(pt.getClass().getName() + " returns null from getRecommendedTemplates() method."); //NOI18N
(-)a/projectuiapi/src/org/netbeans/spi/project/ui/templates/support/package.html (-24 / +21 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>RecommendedTemplates2</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.
Lines 130-166 Link Here
130
}
140
}
131
</code></pre>
141
</code></pre>
132
<p>
142
<p>
133
The second interface is {@link org.netbeans.spi.project.ui.RecommendedTemplates},
143
The second interface is {@link org.netbeans.spi.project.ui.RecommendedTemplates2},
134
which influences the appearance of templates in the New File wizard according to project types. The implementation of the interface has to return
144
which influences the appearance of templates in the New File wizard according to project types. The implementation of the interface has to return
135
array of Strings which corresponds to names of template categories listed in the <code>templateCategory</code> attribute of template files. All templates 
145
array of Strings which corresponds to names of template categories listed in the <code>templateCategory</code> attribute of template files. All templates 
136
which list at least one recommended category in the <code>templateCategory</code> attribute will be listed for given project type.<br>
146
which list at least one recommended category in the <code>templateCategory</code> attribute will be listed for given project type.<br>
137
<b>Note:</b> if no <code>templateCategory</code> is declared then this template will be visible for each project regardless its type.<br>
147
<b>Note:</b> if no <code>templateCategory</code> is declared then this template will be visible for each project regardless its type.<br>
138
<p>
148
<p>
139
Example implementation of <code>RecommendedTemplates</code> interface:
149
Example implementation of <code>RecommendedTemplates2</code> interface:
140
<pre><code>
150
<pre>
141
private static final class RecommendedTemplatesImpl implements RecommendedTemplates {
151
&#64;ServiceProvider(service=RecommendedTemplates2.class, projectType="some-project-type")
142
    
152
public class RecommendedTemplatesImpl implements RecommendedTemplates2 {
143
    // List of primarily supported templates categories
153
    &#64;Override public Map&lt;? extends Number,String> getRecommendedTypes() {
144
    private static final String[] TYPES = new String[] { 
154
        Map&lt;Integer,String> types = new HashMap&lt;>();
145
        "java-classes",         
155
        types.put(100, "java-classes");
146
        "java-main-class",      
156
        types.put(110, "java-main-class");
147
        "java-forms",           
157
        return types;
148
        "gui-java-application", 
149
        "java-beans",           
150
        "oasis-XML-catalogs",   
151
        "XML",                  
152
        "ant-script",           
153
        "ant-task",             
154
        "junit",                
155
        "simple-files"          
156
    };
157
158
    public String[] getRecommendedTypes() {
159
        return TYPES;
160
    }
158
    }
161
162
}
159
}
163
</code></pre>
160
</pre>
164
161
165
</body>
162
</body>
166
</html>
163
</html>
(-)a/spring.beans/src/org/netbeans/modules/spring/beans/RecommendedTemplatesImpl.java (-16 / +10 lines)
Lines 42-63 Link Here
42
42
43
package org.netbeans.modules.spring.beans;
43
package org.netbeans.modules.spring.beans;
44
44
45
import java.util.Collections;
46
import java.util.Map;
45
import org.netbeans.spi.project.ProjectServiceProvider;
47
import org.netbeans.spi.project.ProjectServiceProvider;
46
import org.netbeans.spi.project.ui.RecommendedTemplates;
48
import org.netbeans.spi.project.ui.RecommendedTemplates2;
47
49
48
/**
50
/**
49
 *
51
 *
50
 * @author Andrei Badea
52
 * @author Andrei Badea
51
 */
53
 */
52
public class RecommendedTemplatesImpl implements RecommendedTemplates {
54
public class RecommendedTemplatesImpl implements RecommendedTemplates2 {
53
54
    private static final String[] SPRING_TYPES = new String[] {
55
        "spring-types" // NOI18N
56
    };
57
58
    private static final String[] SPRING_WEB_TYPES = new String[] {
59
        "spring-web-types" // NOI18N
60
    };
61
55
62
    private final boolean web;
56
    private final boolean web;
63
57
Lines 65-84 Link Here
65
        this.web = web;
59
        this.web = web;
66
    }
60
    }
67
61
68
    @ProjectServiceProvider(service=RecommendedTemplates.class, projectType="org-netbeans-modules-web-project")
62
    @ProjectServiceProvider(service=RecommendedTemplates2.class, projectType="org-netbeans-modules-web-project")
69
    public static RecommendedTemplates forWeb() {
63
    public static RecommendedTemplates2 forWeb() {
70
        return new RecommendedTemplatesImpl(true);
64
        return new RecommendedTemplatesImpl(true);
71
    }
65
    }
72
66
73
    @ProjectServiceProvider(service=RecommendedTemplates.class, projectType={
67
    @ProjectServiceProvider(service=RecommendedTemplates2.class, projectType={
74
        "org-netbeans-modules-java-j2seproject",
68
        "org-netbeans-modules-java-j2seproject",
75
        "org-netbeans-modules-j2ee-ejbjarproject"
69
        "org-netbeans-modules-j2ee-ejbjarproject"
76
    })
70
    })
77
    public static RecommendedTemplates forNonWeb() {
71
    public static RecommendedTemplates2 forNonWeb() {
78
        return new RecommendedTemplatesImpl(false);
72
        return new RecommendedTemplatesImpl(false);
79
    }
73
    }
80
74
81
    public String[] getRecommendedTypes() {
75
    @Override public Map<? extends Number,String> getRecommendedTypes() {
82
        return web ? SPRING_WEB_TYPES : SPRING_TYPES;
76
        return Collections.singletonMap(1000, web ? "spring-web-types" : "spring-types"); // NOI18N
83
    }
77
    }
84
}
78
}
(-)a/web.project/src/org/netbeans/modules/web/project/WebProject.java (-8 / +15 lines)
Lines 134-140 Link Here
134
import org.netbeans.spi.project.support.ant.GeneratedFilesHelper;
134
import org.netbeans.spi.project.support.ant.GeneratedFilesHelper;
135
import org.netbeans.spi.project.support.ant.ProjectXmlSavedHook;
135
import org.netbeans.spi.project.support.ant.ProjectXmlSavedHook;
136
import org.netbeans.spi.project.ui.PrivilegedTemplates;
136
import org.netbeans.spi.project.ui.PrivilegedTemplates;
137
import org.netbeans.spi.project.ui.RecommendedTemplates;
138
import org.netbeans.spi.project.ui.support.UILookupMergerSupport;
137
import org.netbeans.spi.project.ui.support.UILookupMergerSupport;
139
import org.netbeans.spi.project.support.ant.ReferenceHelper;
138
import org.netbeans.spi.project.support.ant.ReferenceHelper;
140
import org.netbeans.spi.project.support.ant.PropertyEvaluator;
139
import org.netbeans.spi.project.support.ant.PropertyEvaluator;
Lines 175-180 Link Here
175
import org.netbeans.spi.whitelist.support.WhiteListQueryMergerSupport;
174
import org.netbeans.spi.whitelist.support.WhiteListQueryMergerSupport;
176
import org.netbeans.spi.project.support.ant.PropertyProvider;
175
import org.netbeans.spi.project.support.ant.PropertyProvider;
177
import org.netbeans.spi.project.support.ant.PropertyUtils;
176
import org.netbeans.spi.project.support.ant.PropertyUtils;
177
import org.netbeans.spi.project.ui.RecommendedTemplates2;
178
import org.netbeans.spi.queries.FileEncodingQueryImplementation;
178
import org.netbeans.spi.queries.FileEncodingQueryImplementation;
179
import org.openide.filesystems.FileLock;
179
import org.openide.filesystems.FileLock;
180
import org.openide.filesystems.FileSystem;
180
import org.openide.filesystems.FileSystem;
Lines 585-591 Link Here
585
            new WebJPAModuleInfo(this),
585
            new WebJPAModuleInfo(this),
586
            new WebJPATargetInfo(this),
586
            new WebJPATargetInfo(this),
587
            UILookupMergerSupport.createPrivilegedTemplatesMerger(),
587
            UILookupMergerSupport.createPrivilegedTemplatesMerger(),
588
            UILookupMergerSupport.createRecommendedTemplatesMerger(),
589
            LookupProviderSupport.createSourcesMerger(),
588
            LookupProviderSupport.createSourcesMerger(),
590
            WhiteListQueryMergerSupport.createWhiteListQueryMerger(),
589
            WhiteListQueryMergerSupport.createWhiteListQueryMerger(),
591
            new WebPropertyEvaluatorImpl(evaluator()),
590
            new WebPropertyEvaluatorImpl(evaluator()),
Lines 1276-1281 Link Here
1276
    // List of primarily supported templates
1275
    // List of primarily supported templates
1277
1276
1278
    private static final String[] TYPES = new String[] { 
1277
    private static final String[] TYPES = new String[] { 
1278
        "servlet-types",        // NOI18N
1279
        "java-classes",         // NOI18N
1279
        "java-classes",         // NOI18N
1280
        "java-main-class",      // NOI18N
1280
        "java-main-class",      // NOI18N
1281
        "java-forms",           // NOI18N
1281
        "java-forms",           // NOI18N
Lines 1286-1292 Link Here
1286
        "ant-script",           // NOI18N
1286
        "ant-script",           // NOI18N
1287
        "ant-task",             // NOI18N
1287
        "ant-task",             // NOI18N
1288
        "REST-clients",         // NOI18N
1288
        "REST-clients",         // NOI18N
1289
        "servlet-types",        // NOI18N
1290
        "web-types",            // NOI18N
1289
        "web-types",            // NOI18N
1291
        "web-types-server",     // NOI18N
1290
        "web-types-server",     // NOI18N
1292
        "web-services",         // NOI18N
1291
        "web-services",         // NOI18N
Lines 1403-1409 Link Here
1403
        privilegedTemplates.addAll(Arrays.asList(PRIVILEGED_NAMES));
1402
        privilegedTemplates.addAll(Arrays.asList(PRIVILEGED_NAMES));
1404
    }
1403
    }
1405
    
1404
    
1406
    private final class RecommendedTemplatesImpl implements RecommendedTemplates, PrivilegedTemplates {
1405
    private final class RecommendedTemplatesImpl implements RecommendedTemplates2, PrivilegedTemplates {
1407
        private WebProject project;
1406
        private WebProject project;
1408
        private J2eeProjectCapabilities projectCap;
1407
        private J2eeProjectCapabilities projectCap;
1409
        
1408
        
Lines 1416-1437 Link Here
1416
        private boolean isEE5 = false;
1415
        private boolean isEE5 = false;
1417
        private boolean serverSupportsEJB31 = false;
1416
        private boolean serverSupportsEJB31 = false;
1418
1417
1419
        public String[] getRecommendedTypes() {
1418
        @Override public Map<? extends Number,String> getRecommendedTypes() {
1420
            checkEnvironment();
1419
            checkEnvironment();
1421
            if (isArchive) {
1420
            if (isArchive) {
1422
                return TYPES_ARCHIVE;
1421
                return mapify(TYPES_ARCHIVE);
1423
            } else if (projectCap.isEjb31LiteSupported()){
1422
            } else if (projectCap.isEjb31LiteSupported()){
1424
                List<String> list = new ArrayList(Arrays.asList(TYPES));
1423
                List<String> list = new ArrayList(Arrays.asList(TYPES));
1424
                // XXX intermix these into TYPES somehow nice
1425
                if (projectCap.isEjb31Supported() || serverSupportsEJB31){
1425
                if (projectCap.isEjb31Supported() || serverSupportsEJB31){
1426
                    list.addAll(Arrays.asList(TYPES_EJB));
1426
                    list.addAll(Arrays.asList(TYPES_EJB));
1427
                } else {
1427
                } else {
1428
                    list.addAll(Arrays.asList(TYPES_EJB_LITE));
1428
                    list.addAll(Arrays.asList(TYPES_EJB_LITE));
1429
                }
1429
                }
1430
                return list.toArray(new String[list.size()]);
1430
                return mapify(list.toArray(new String[list.size()]));
1431
            }else{
1431
            }else{
1432
                return TYPES;
1432
                return mapify(TYPES);
1433
            }
1433
            }
1434
        }
1434
        }
1435
        private Map<? extends Number,String> mapify(String[] types) {
1436
            Map<Integer,String> result = new HashMap<Integer,String>();
1437
            for (int i = 0; i < types.length; i++) {
1438
                result.put((i + 1) * 100, types[i]);
1439
            }
1440
            return result;
1441
        }
1435
        
1442
        
1436
        public String[] getPrivilegedTemplates() {
1443
        public String[] getPrivilegedTemplates() {
1437
            checkEnvironment();
1444
            checkEnvironment();

Return to bug 206126