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 186943
Collapse All | Expand All

(-)a/apisupport.refactoring/src/org/netbeans/modules/apisupport/hints/TemplateHinter.java (+1 lines)
Lines 151-156 Link Here
151
                        if (category != null) {
151
                        if (category != null) {
152
                            params.put("category", category.split(", ?"));
152
                            params.put("category", category.split(", ?"));
153
                        }
153
                        }
154
                        params.put("requireProject", file.getAttribute("requireProject"));
154
                        ModifiersTree nue = ctx.addAnnotation(wc, modifiers, TemplateRegistration.class.getName(), TemplateRegistrations.class.getName(), params);
155
                        ModifiersTree nue = ctx.addAnnotation(wc, modifiers, TemplateRegistration.class.getName(), TemplateRegistrations.class.getName(), params);
155
                        ctx.delete(file);
156
                        ctx.delete(file);
156
                        wc.rewrite(modifiers, GeneratorUtilities.get(wc).importFQNs(nue));
157
                        wc.rewrite(modifiers, GeneratorUtilities.get(wc).importFQNs(nue));
(-)a/css.editor/src/org/netbeans/modules/css/resources/layer.xml (+1 lines)
Lines 175-180 Link Here
175
                <attr name="SystemFileSystem.icon" urlvalue="nbresloc:/org/netbeans/modules/css/resources/style_sheet_16.png"/>
175
                <attr name="SystemFileSystem.icon" urlvalue="nbresloc:/org/netbeans/modules/css/resources/style_sheet_16.png"/>
176
                <attr name="SystemFileSystem.localizingBundle" stringvalue="org.netbeans.modules.css.resources.Bundle"/>
176
                <attr name="SystemFileSystem.localizingBundle" stringvalue="org.netbeans.modules.css.resources.Bundle"/>
177
                <attr name="templateCategory" stringvalue="simple-files"/>
177
                <attr name="templateCategory" stringvalue="simple-files"/>
178
                <attr name="requireProject" boolvalue="false"/>
178
            </file>
179
            </file>
179
        </folder>
180
        </folder>
180
    </folder>
181
    </folder>
(-)a/favorites/src/org/netbeans/modules/favorites/resources/layer.xml (+2 lines)
Lines 62-67 Link Here
62
                <attr name="template" boolvalue="true"/>
62
                <attr name="template" boolvalue="true"/>
63
                <attr name="SystemFileSystem.localizingBundle" stringvalue="org.netbeans.modules.favorites.Bundle"/>
63
                <attr name="SystemFileSystem.localizingBundle" stringvalue="org.netbeans.modules.favorites.Bundle"/>
64
                <attr name="templateWizardURL" urlvalue="nbresloc:/org/netbeans/modules/favorites/resources/templatesFolder.html"/>
64
                <attr name="templateWizardURL" urlvalue="nbresloc:/org/netbeans/modules/favorites/resources/templatesFolder.html"/>
65
                <attr name="requireProject" boolvalue="false"/>
65
            </folder>
66
            </folder>
66
            <attr name="SystemFileSystem.localizingBundle" stringvalue="org.netbeans.modules.favorites.Bundle"/>
67
            <attr name="SystemFileSystem.localizingBundle" stringvalue="org.netbeans.modules.favorites.Bundle"/>
67
            <file name="file">
68
            <file name="file">
Lines 72-77 Link Here
72
                <attr name="SystemFileSystem.icon" urlvalue="nbresloc:/org/netbeans/modules/favorites/resources/newFile.png"/>
73
                <attr name="SystemFileSystem.icon" urlvalue="nbresloc:/org/netbeans/modules/favorites/resources/newFile.png"/>
73
                <attr name="templateWizardURL" urlvalue="nbresloc:/org/netbeans/modules/favorites/resources/templatesFile.html"/>
74
                <attr name="templateWizardURL" urlvalue="nbresloc:/org/netbeans/modules/favorites/resources/templatesFile.html"/>
74
                <attr name="templateCategory" stringvalue="simple-files"/>
75
                <attr name="templateCategory" stringvalue="simple-files"/>
76
                <attr name="requireProject" boolvalue="false"/>
75
            </file>
77
            </file>
76
        </folder>
78
        </folder>
77
        <!-- file with default template for properties -->
79
        <!-- file with default template for properties -->
(-)a/html/src/org/netbeans/modules/html/package-info.java (-2 / +2 lines)
Lines 37-44 Link Here
37
 */
37
 */
38
38
39
@TemplateRegistrations({
39
@TemplateRegistrations({
40
    @TemplateRegistration(folder="Other", position=100, displayName="#Templates/Other/html.html", content="templates/html.html", scriptEngine="freemarker", category="simple-files", description="TemplateHelp.html"),
40
    @TemplateRegistration(folder="Other", position=100, displayName="#Templates/Other/html.html", content="templates/html.html", scriptEngine="freemarker", category="simple-files", description="TemplateHelp.html", requireProject=false),
41
    @TemplateRegistration(folder="Other", position=200, displayName="#Templates/Other/xhtml.xhtml", content="templates/xhtml.xhtml", scriptEngine="freemarker", category="simple-files", description="XhtmlTemplateHelp.html")
41
    @TemplateRegistration(folder="Other", position=200, displayName="#Templates/Other/xhtml.xhtml", content="templates/xhtml.xhtml", scriptEngine="freemarker", category="simple-files", description="XhtmlTemplateHelp.html", requireProject=false)
42
})
42
})
43
package org.netbeans.modules.html;
43
package org.netbeans.modules.html;
44
44
(-)a/javascript2.editor/src/org/netbeans/modules/javascript2/editor/resources/layer.xml (+2 lines)
Lines 415-420 Link Here
415
                <attr name="SystemFileSystem.localizingBundle" stringvalue="org.netbeans.modules.javascript2.editor.resources.Bundle"/>
415
                <attr name="SystemFileSystem.localizingBundle" stringvalue="org.netbeans.modules.javascript2.editor.resources.Bundle"/>
416
                <attr name="templateCategory" stringvalue="simple-files"/>
416
                <attr name="templateCategory" stringvalue="simple-files"/>
417
                <attr name="templateWizardURL" urlvalue="nbresloc:/org/netbeans/modules/javascript2/editor/resources/javascript.html"/>
417
                <attr name="templateWizardURL" urlvalue="nbresloc:/org/netbeans/modules/javascript2/editor/resources/javascript.html"/>
418
                <attr name="requireProject" boolvalue="false"/>
418
            </file>
419
            </file>
419
            <file name="json.json" url="nbresloc:/org/netbeans/modules/javascript2/editor/resources/jsontemplate.json">
420
            <file name="json.json" url="nbresloc:/org/netbeans/modules/javascript2/editor/resources/jsontemplate.json">
420
                <attr name="position" intvalue="450"/>
421
                <attr name="position" intvalue="450"/>
Lines 423-428 Link Here
423
                <attr name="SystemFileSystem.localizingBundle" stringvalue="org.netbeans.modules.javascript2.editor.resources.Bundle"/>
424
                <attr name="SystemFileSystem.localizingBundle" stringvalue="org.netbeans.modules.javascript2.editor.resources.Bundle"/>
424
                <attr name="templateCategory" stringvalue="simple-files"/>
425
                <attr name="templateCategory" stringvalue="simple-files"/>
425
                <attr name="templateWizardURL" urlvalue="nbresloc:/org/netbeans/modules/javascript2/editor/resources/json.html"/>
426
                <attr name="templateWizardURL" urlvalue="nbresloc:/org/netbeans/modules/javascript2/editor/resources/json.html"/>
427
                <attr name="requireProject" boolvalue="false"/>
426
            </file>
428
            </file>
427
        </folder>
429
        </folder>
428
    </folder>
430
    </folder>
(-)a/openide.loaders/apichanges.xml (+17 lines)
Lines 109-114 Link Here
109
<!-- ACTUAL CHANGES BEGIN HERE: -->
109
<!-- ACTUAL CHANGES BEGIN HERE: -->
110
110
111
  <changes>
111
  <changes>
112
      <change id="TemplateRegistration.requireProject">
113
          <api name="loaders"/>
114
          <summary>Allow registration of templates which do not require a Project instance</summary>
115
          <version major="7" minor="46"/>
116
          <date day="25" month="1" year="2013"/>
117
          <author login="280Z28"/>
118
          <compatibility addition="yes" binary="compatible" source="compatible" semantic="compatible" deprecation="no" deletion="no" modification="no"/>
119
          <description>
120
              <p>Templates may be registered with <code>requireProject = false</code>
121
              in the annotation to indicate the template does not require a Project
122
              instance to be created. These templates show in the New File dialog
123
              even when no project is open in the IDE.
124
              </p>
125
          </description>
126
          <class package="org.netbeans.api.templates" name="TemplateRegistration"/>
127
          <issue number="186943"/>
128
      </change>
112
      <change id="lazymenu.properties">
129
      <change id="lazymenu.properties">
113
          <api name="awt"/>
130
          <api name="awt"/>
114
          <summary>Control what client properties pulldown menus have</summary>
131
          <summary>Control what client properties pulldown menus have</summary>
(-)a/openide.loaders/manifest.mf (-1 / +1 lines)
Lines 1-6 Link Here
1
Manifest-Version: 1.0
1
Manifest-Version: 1.0
2
OpenIDE-Module: org.openide.loaders
2
OpenIDE-Module: org.openide.loaders
3
OpenIDE-Module-Specification-Version: 7.45
3
OpenIDE-Module-Specification-Version: 7.46
4
OpenIDE-Module-Localizing-Bundle: org/openide/loaders/Bundle.properties
4
OpenIDE-Module-Localizing-Bundle: org/openide/loaders/Bundle.properties
5
OpenIDE-Module-Provides: org.netbeans.modules.templates.v1_0
5
OpenIDE-Module-Provides: org.netbeans.modules.templates.v1_0
6
OpenIDE-Module-Layer: org/netbeans/modules/openide/loaders/layer.xml
6
OpenIDE-Module-Layer: org/netbeans/modules/openide/loaders/layer.xml
(-)a/openide.loaders/src/org/netbeans/api/templates/TemplateRegistration.java (+5 lines)
Lines 126-129 Link Here
126
     */
126
     */
127
    String[] category() default {};
127
    String[] category() default {};
128
128
129
    /**
130
     * Set to false if the template can be instantiated without a project.
131
     * @since 7.46
132
     */
133
    boolean requireProject() default true;
129
}
134
}
(-)a/openide.loaders/src/org/netbeans/modules/templates/TemplateProcessor.java (+1 lines)
Lines 146-151 Link Here
146
            }
146
            }
147
            f.stringvalue("templateCategory", sb.toString());
147
            f.stringvalue("templateCategory", sb.toString());
148
        }
148
        }
149
        f.boolvalue("requireProject", t.requireProject());
149
        f.write();
150
        f.write();
150
    }
151
    }
151
152
(-)a/projectui/src/org/netbeans/modules/project/ui/NewFileWizard.java (-7 / +18 lines)
Lines 47-55 Link Here
47
import java.beans.PropertyChangeListener;
47
import java.beans.PropertyChangeListener;
48
import java.text.MessageFormat;
48
import java.text.MessageFormat;
49
import javax.swing.JComponent;
49
import javax.swing.JComponent;
50
import org.netbeans.api.annotations.common.NonNull;
50
import org.netbeans.api.annotations.common.CheckForNull;
51
import org.netbeans.api.annotations.common.NullAllowed;
51
import org.netbeans.api.project.Project;
52
import org.netbeans.api.project.Project;
52
import org.netbeans.api.project.ProjectUtils;
53
import org.netbeans.api.project.ProjectUtils;
54
import org.netbeans.api.project.SourceGroup;
53
import org.netbeans.api.project.Sources;
55
import org.netbeans.api.project.Sources;
54
import org.netbeans.modules.project.uiapi.ProjectChooserFactory;
56
import org.netbeans.modules.project.uiapi.ProjectChooserFactory;
55
import org.netbeans.spi.project.ui.templates.support.Templates;
57
import org.netbeans.spi.project.ui.templates.support.Templates;
Lines 63-83 Link Here
63
65
64
public final class NewFileWizard extends TemplateWizard {
66
public final class NewFileWizard extends TemplateWizard {
65
67
66
    @NonNull
68
    @NullAllowed
67
    private Project currP;
69
    private Project currP;
68
    private MessageFormat format;
70
    private MessageFormat format;
69
    // private String[] recommendedTypes;
71
    // private String[] recommendedTypes;
70
72
71
    @NonNull
73
    @CheckForNull
72
    private Project getCurrentProject() {
74
    private Project getCurrentProject() {
73
        return currP;
75
        return currP;
74
    }
76
    }
75
77
76
    private void setCurrentProject(@NonNull Project p) {
78
    private void setCurrentProject(@NullAllowed Project p) {
77
        this.currP = p;
79
        this.currP = p;
78
    }
80
    }
79
81
80
    public NewFileWizard(@NonNull Project project /*, String recommendedTypes[] */) {
82
    public NewFileWizard(@NullAllowed Project project /*, String recommendedTypes[] */) {
81
        setCurrentProject(project);
83
        setCurrentProject(project);
82
        putProperty(ProjectChooserFactory.WIZARD_KEY_PROJECT, getCurrentProject());
84
        putProperty(ProjectChooserFactory.WIZARD_KEY_PROJECT, getCurrentProject());
83
        format = new MessageFormat(NbBundle.getBundle(NewFileWizard.class).getString("LBL_NewFileWizard_MessageFormat"));
85
        format = new MessageFormat(NbBundle.getBundle(NewFileWizard.class).getString("LBL_NewFileWizard_MessageFormat"));
Lines 155-162 Link Here
155
157
156
    @Override
158
    @Override
157
    protected WizardDescriptor.Panel<WizardDescriptor> createTargetChooser() {
159
    protected WizardDescriptor.Panel<WizardDescriptor> createTargetChooser() {
158
        Sources c = ProjectUtils.getSources(getCurrentProject());
160
        Project project = getCurrentProject();
159
        return Templates.buildSimpleTargetChooser(getCurrentProject(), c.getSourceGroups(Sources.TYPE_GENERIC)).create();
161
        SourceGroup[] sourceGroups;
162
        if (project != null) {
163
            Sources c = ProjectUtils.getSources(project);
164
            sourceGroups = c.getSourceGroups(Sources.TYPE_GENERIC);
165
        }
166
        else {
167
            sourceGroups = new SourceGroup[0];
168
        }
169
170
        return Templates.buildSimpleTargetChooser(project, sourceGroups).create();
160
    }
171
    }
161
}
172
}
162
 
173
 
(-)a/projectui/src/org/netbeans/modules/project/ui/OpenProjectList.java (-5 / +19 lines)
Lines 1088-1094 Link Here
1088
1088
1089
               
1089
               
1090
    // Used from NewFile action        
1090
    // Used from NewFile action        
1091
    public List<DataObject> getTemplatesLRU( @NonNull Project project,  PrivilegedTemplates priv ) {
1091
    public List<DataObject> getTemplatesLRU( @NullAllowed Project project,  PrivilegedTemplates priv ) {
1092
        List<FileObject> pLRU = getTemplateNamesLRU( project,  priv );
1092
        List<FileObject> pLRU = getTemplateNamesLRU( project,  priv );
1093
        List<DataObject> templates = new ArrayList<DataObject>();
1093
        List<DataObject> templates = new ArrayList<DataObject>();
1094
        for( Iterator<FileObject> it = pLRU.iterator(); it.hasNext(); ) {
1094
        for( Iterator<FileObject> it = pLRU.iterator(); it.hasNext(); ) {
Lines 1265-1271 Link Here
1265
            this.icon = icon;
1265
            this.icon = icon;
1266
        }
1266
        }
1267
    }
1267
    }
1268
    public static List<TemplateItem> prepareTemplates(@NonNull Project project, @NonNull Lookup lookup) {
1268
    public static List<TemplateItem> prepareTemplates(@NullAllowed Project project, @NonNull Lookup lookup) {
1269
        // check the action context for recommmended/privileged templates..
1269
        // check the action context for recommmended/privileged templates..
1270
        PrivilegedTemplates privs = lookup.lookup(PrivilegedTemplates.class);
1270
        PrivilegedTemplates privs = lookup.lookup(PrivilegedTemplates.class);
1271
        final List<TemplateItem> items = new ArrayList<TemplateItem>();
1271
        final List<TemplateItem> items = new ArrayList<TemplateItem>();
Lines 1354-1366 Link Here
1354
            OpenProjectListSettings.getInstance().setMainProjectURL( mainRoot );
1354
            OpenProjectListSettings.getInstance().setMainProjectURL( mainRoot );
1355
    }
1355
    }
1356
        
1356
        
1357
    private ArrayList<FileObject> getTemplateNamesLRU( @NonNull final Project project, PrivilegedTemplates priv ) {
1357
    private ArrayList<FileObject> getTemplateNamesLRU( @NullAllowed final Project project, PrivilegedTemplates priv ) {
1358
        // First take recently used templates and try to find those which
1358
        // First take recently used templates and try to find those which
1359
        // are supported by the project.
1359
        // are supported by the project.
1360
        
1360
        
1361
        final ArrayList<FileObject> result = new ArrayList<FileObject>(NUM_TEMPLATES);
1361
        final ArrayList<FileObject> result = new ArrayList<FileObject>(NUM_TEMPLATES);
1362
        
1362
        
1363
        PrivilegedTemplates pt = priv != null ? priv : project.getLookup().lookup( PrivilegedTemplates.class );
1363
        PrivilegedTemplates pt = priv != null ? priv : project != null ? project.getLookup().lookup( PrivilegedTemplates.class ) : null;
1364
        String ptNames[] = pt == null ? null : pt.getPrivilegedTemplates();        
1364
        String ptNames[] = pt == null ? null : pt.getPrivilegedTemplates();        
1365
        final ArrayList<String> privilegedTemplates = new ArrayList<String>( Arrays.asList( pt == null ? new String[0]: ptNames ) );
1365
        final ArrayList<String> privilegedTemplates = new ArrayList<String>( Arrays.asList( pt == null ? new String[0]: ptNames ) );
1366
        
1366
        
Lines 1379-1385 Link Here
1379
                    if ( fo == null ) {
1379
                    if ( fo == null ) {
1380
                        it.remove(); // Does not exists remove
1380
                        it.remove(); // Does not exists remove
1381
                    }
1381
                    }
1382
                    else if ( isRecommended( rtNames, fo ) ) {
1382
                    else if ( isRecommended( project, rtNames, fo ) ) {
1383
                        result.add( fo );
1383
                        result.add( fo );
1384
                        privilegedTemplates.remove( templateName ); // Not to have it twice
1384
                        privilegedTemplates.remove( templateName ); // Not to have it twice
1385
                    }
1385
                    }
Lines 1426-1431 Link Here
1426
        }
1426
        }
1427
    }
1427
    }
1428
1428
1429
    static boolean isRecommended(@NullAllowed Project project, @NonNull String[] recommendedTypes, @NonNull FileObject primaryFile) {
1430
        if (project != null) {
1431
            return isRecommended(recommendedTypes, primaryFile);
1432
        }
1433
1434
        if (primaryFile.isFolder()) {
1435
            // folders of templates do not require a project for display
1436
            return true;
1437
        }
1438
1439
        Object requireProject = primaryFile.getAttribute("requireProject");
1440
        return Boolean.FALSE.equals(requireProject);
1441
    }
1442
1429
    /**
1443
    /**
1430
     * Returns list of recommended template types for project. Do not call in
1444
     * Returns list of recommended template types for project. Do not call in
1431
     * loop because it may scan project files to resolve its type which is time
1445
     * loop because it may scan project files to resolve its type which is time
(-)a/projectui/src/org/netbeans/modules/project/ui/ProjectChooserFactoryImpl.java (-1 / +2 lines)
Lines 47-52 Link Here
47
import java.io.File;
47
import java.io.File;
48
import javax.swing.JFileChooser;
48
import javax.swing.JFileChooser;
49
import org.netbeans.api.annotations.common.NonNull;
49
import org.netbeans.api.annotations.common.NonNull;
50
import org.netbeans.api.annotations.common.NullAllowed;
50
import org.netbeans.api.project.Project;
51
import org.netbeans.api.project.Project;
51
import org.netbeans.modules.project.uiapi.ProjectChooserFactory;
52
import org.netbeans.modules.project.uiapi.ProjectChooserFactory;
52
import org.netbeans.api.project.SourceGroup;
53
import org.netbeans.api.project.SourceGroup;
Lines 66-72 Link Here
66
        return ProjectChooserAccessory.createProjectChooser( false );
67
        return ProjectChooserAccessory.createProjectChooser( false );
67
    }
68
    }
68
69
69
    public @Override WizardDescriptor.Panel<WizardDescriptor> createSimpleTargetChooser(@NonNull Project project, @NonNull SourceGroup[] folders,
70
    public @Override WizardDescriptor.Panel<WizardDescriptor> createSimpleTargetChooser(@NullAllowed Project project, @NonNull SourceGroup[] folders,
70
            WizardDescriptor.Panel<WizardDescriptor> bottomPanel, boolean freeFileExtension) {
71
            WizardDescriptor.Panel<WizardDescriptor> bottomPanel, boolean freeFileExtension) {
71
        return new SimpleTargetChooserPanel(project, folders, bottomPanel, false, freeFileExtension);
72
        return new SimpleTargetChooserPanel(project, folders, bottomPanel, false, freeFileExtension);
72
    }
73
    }
(-)a/projectui/src/org/netbeans/modules/project/ui/SimpleTargetChooserPanel.java (-9 / +48 lines)
Lines 45-55 Link Here
45
package org.netbeans.modules.project.ui;
45
package org.netbeans.modules.project.ui;
46
46
47
import java.awt.Component;
47
import java.awt.Component;
48
import java.io.File;
48
import java.io.IOException;
49
import java.io.IOException;
49
import javax.swing.JPanel;
50
import javax.swing.JPanel;
50
import javax.swing.event.ChangeEvent;
51
import javax.swing.event.ChangeEvent;
51
import javax.swing.event.ChangeListener;
52
import javax.swing.event.ChangeListener;
52
import org.netbeans.api.annotations.common.NonNull;
53
import org.netbeans.api.annotations.common.NonNull;
54
import org.netbeans.api.annotations.common.NullAllowed;
53
import org.netbeans.api.project.Project;
55
import org.netbeans.api.project.Project;
54
import org.netbeans.api.project.SourceGroup;
56
import org.netbeans.api.project.SourceGroup;
55
import static org.netbeans.modules.project.ui.Bundle.*;
57
import static org.netbeans.modules.project.ui.Bundle.*;
Lines 70-76 Link Here
70
    private final ChangeSupport changeSupport = new ChangeSupport(this);
72
    private final ChangeSupport changeSupport = new ChangeSupport(this);
71
    private SimpleTargetChooserPanelGUI gui;
73
    private SimpleTargetChooserPanelGUI gui;
72
74
73
    @NonNull
75
    @NullAllowed
74
    private Project project;
76
    private Project project;
75
    @NonNull
77
    @NonNull
76
    private SourceGroup[] folders;
78
    private SourceGroup[] folders;
Lines 80-86 Link Here
80
    private boolean freeFileExtension;
82
    private boolean freeFileExtension;
81
    
83
    
82
    @SuppressWarnings("LeakingThisInConstructor")
84
    @SuppressWarnings("LeakingThisInConstructor")
83
    SimpleTargetChooserPanel(@NonNull Project project, @NonNull SourceGroup[] folders,
85
    SimpleTargetChooserPanel(@NullAllowed Project project, @NonNull SourceGroup[] folders,
84
            WizardDescriptor.Panel<WizardDescriptor> bottomPanel, boolean isFolder, boolean freeFileExtension) {
86
            WizardDescriptor.Panel<WizardDescriptor> bottomPanel, boolean isFolder, boolean freeFileExtension) {
85
        this.folders = folders;
87
        this.folders = folders;
86
        this.project = project;
88
        this.project = project;
Lines 105-111 Link Here
105
    }
107
    }
106
108
107
    private boolean noFolders() { // #202410
109
    private boolean noFolders() { // #202410
108
        return folders != null && folders.length == 0;
110
        // if the project is null then any folder on the system is available
111
        return project != null && folders != null && folders.length == 0;
109
    }
112
    }
110
113
111
    public @Override HelpCtx getHelp() {
114
    public @Override HelpCtx getHelp() {
Lines 126-132 Link Here
126
            return false;
129
            return false;
127
        }
130
        }
128
131
129
        boolean ok = ( gui != null && gui.getTargetName() != null && gui.getTargetGroup() != null &&
132
        boolean ok = ( gui != null && gui.getTargetName() != null &&
130
               ( bottomPanel == null || bottomPanel.isValid() ) );
133
               ( bottomPanel == null || bottomPanel.isValid() ) );
131
        
134
        
132
        if (!ok) {
135
        if (!ok) {
Lines 136-143 Link Here
136
        // check if the file name can be created
139
        // check if the file name can be created
137
        FileObject template = Templates.getTemplate( wizard );
140
        FileObject template = Templates.getTemplate( wizard );
138
141
139
        String errorMessage = ProjectUtilities.canUseFileName(gui.getTargetGroup().getRootFolder(),
142
        FileObject rootFolder;
140
                gui.getTargetFolder(), gui.getTargetName(), template.getExt(), isFolder, freeFileExtension);
143
        String targetFolder;
144
        if (gui.getTargetGroup() != null) {
145
            rootFolder = gui.getTargetGroup().getRootFolder();
146
            targetFolder = gui.getTargetFolder();
147
        }
148
        else if (gui.getTargetFolder() != null) {
149
            rootFolder = FileUtil.toFileObject(FileUtil.normalizeFile(new File(gui.getTargetFolder())));
150
            targetFolder = "";
151
        }
152
        else {
153
            rootFolder = null;
154
            targetFolder = null;
155
        }
156
157
        String errorMessage = ProjectUtilities.canUseFileName(rootFolder,
158
                targetFolder, gui.getTargetName(), template.getExt(), isFolder, freeFileExtension);
141
        wizard.putProperty(WizardDescriptor.PROP_ERROR_MESSAGE, errorMessage);
159
        wizard.putProperty(WizardDescriptor.PROP_ERROR_MESSAGE, errorMessage);
142
160
143
        return errorMessage == null;
161
        return errorMessage == null;
Lines 170-176 Link Here
170
        // Try to preselect a folder            
188
        // Try to preselect a folder            
171
        FileObject preselectedTarget = Templates.getTargetFolder( wizard );
189
        FileObject preselectedTarget = Templates.getTargetFolder( wizard );
172
        if (preselectedTarget == null) {
190
        if (preselectedTarget == null) {
173
            preselectedTarget = project.getProjectDirectory();
191
            if (project != null) {
192
                preselectedTarget = project.getProjectDirectory();
193
            }
194
            else {
195
                String home = System.getProperty("user.home");
196
                if (home != null && new File(home).isDirectory()) {
197
                    preselectedTarget = FileUtil.toFileObject(FileUtil.normalizeFile(new File(home)));
198
                }
199
            }
174
        }
200
        }
175
        // Try to preserve the already entered target name
201
        // Try to preserve the already entered target name
176
        String targetName = isFolder ? null : Templates.getTargetName( wizard );
202
        String targetName = isFolder ? null : Templates.getTargetName( wizard );
Lines 222-229 Link Here
222
    }
248
    }
223
    
249
    
224
    private FileObject getTargetFolderFromGUI () {
250
    private FileObject getTargetFolderFromGUI () {
225
        FileObject rootFolder = gui.getTargetGroup().getRootFolder();
251
        FileObject rootFolder;
226
        String folderName = gui.getTargetFolder();
252
        String folderName;
253
        if (gui.getTargetGroup() != null) {
254
            rootFolder = gui.getTargetGroup().getRootFolder();
255
            folderName = gui.getTargetFolder();
256
        }
257
        else if (gui.getTargetFolder() != null) {
258
            rootFolder = FileUtil.toFileObject(FileUtil.normalizeFile(new File(gui.getTargetFolder())));
259
            folderName = "";
260
        }
261
        else {
262
            rootFolder = null;
263
            folderName = null;
264
        }
265
227
        String newObject = gui.getTargetName ();
266
        String newObject = gui.getTargetName ();
228
        
267
        
229
        if (newObject.indexOf ('/') > 0) { // NOI18N
268
        if (newObject.indexOf ('/') > 0) { // NOI18N
(-)a/projectui/src/org/netbeans/modules/project/ui/SimpleTargetChooserPanelGUI.java (-40 / +68 lines)
Lines 62-68 Link Here
62
import org.netbeans.api.project.Project;
62
import org.netbeans.api.project.Project;
63
import org.netbeans.api.project.ProjectUtils;
63
import org.netbeans.api.project.ProjectUtils;
64
import org.netbeans.api.project.SourceGroup;
64
import org.netbeans.api.project.SourceGroup;
65
import org.netbeans.api.project.Sources;
66
import org.openide.awt.Mnemonics;
65
import org.openide.awt.Mnemonics;
67
import org.openide.filesystems.FileObject;
66
import org.openide.filesystems.FileObject;
68
import org.openide.filesystems.FileUtil;
67
import org.openide.filesystems.FileUtil;
Lines 70-75 Link Here
70
import org.openide.loaders.DataObjectNotFoundException;
69
import org.openide.loaders.DataObjectNotFoundException;
71
import org.openide.util.ChangeSupport;
70
import org.openide.util.ChangeSupport;
72
import static org.netbeans.modules.project.ui.Bundle.*;
71
import static org.netbeans.modules.project.ui.Bundle.*;
72
import org.openide.filesystems.FileChooserBuilder;
73
import org.openide.util.NbBundle.Messages;
73
import org.openide.util.NbBundle.Messages;
74
74
75
/**
75
/**
Lines 83-100 Link Here
83
    
83
    
84
    private final ListCellRenderer CELL_RENDERER = new GroupCellRenderer();
84
    private final ListCellRenderer CELL_RENDERER = new GroupCellRenderer();
85
85
86
    @NonNull
86
    @NullAllowed
87
    private Project project;
87
    private Project project;
88
    private String expectedExtension;
88
    private String expectedExtension;
89
    private final ChangeSupport changeSupport = new ChangeSupport(this);
89
    private final ChangeSupport changeSupport = new ChangeSupport(this);
90
    @NonNull
90
    @NonNull
91
    private SourceGroup[] folders;
91
    private final SourceGroup[] folders;
92
    private boolean isFolder;
92
    private boolean isFolder;
93
    private boolean freeFileExtension;
93
    private boolean freeFileExtension;
94
    
94
    
95
    @SuppressWarnings("LeakingThisInConstructor")
95
    @SuppressWarnings("LeakingThisInConstructor")
96
    @Messages("LBL_SimpleTargetChooserPanel_Name=Name and Location")
96
    @Messages("LBL_SimpleTargetChooserPanel_Name=Name and Location")
97
    public SimpleTargetChooserPanelGUI( @NonNull Project project, @NonNull SourceGroup[] folders, Component bottomPanel, boolean isFolder, boolean freeFileExtension) {
97
    public SimpleTargetChooserPanelGUI( @NullAllowed Project project, @NonNull SourceGroup[] folders, Component bottomPanel, boolean isFolder, boolean freeFileExtension) {
98
        this.project = project;
98
        this.project = project;
99
        this.folders = folders.clone();
99
        this.folders = folders.clone();
100
        this.isFolder = isFolder;
100
        this.isFolder = isFolder;
Lines 126-142 Link Here
126
        "LBL_TargetChooser_FileName_Label=File &Name:",
126
        "LBL_TargetChooser_FileName_Label=File &Name:",
127
        "LBL_TargetChooser_Folder_Label=Fo&lder:",
127
        "LBL_TargetChooser_Folder_Label=Fo&lder:",
128
        "LBL_TargetChooser_CreatedFile_Label=&Created File:",
128
        "LBL_TargetChooser_CreatedFile_Label=&Created File:",
129
        "# sample folder name", "LBL_folder_name=folder"
129
        "# sample folder name", "LBL_folder_name=folder",
130
        "LBL_TargetChooser_NoProject=None"
130
    })
131
    })
131
    final void initValues(FileObject template, @NullAllowed FileObject preselectedFolder, String documentName) {
132
    final void initValues(FileObject template, @NullAllowed FileObject preselectedFolder, String documentName) {
132
        assert project != null;
133
        if (project != null) {
133
        
134
            projectTextField.setText(ProjectUtils.getInformation(project).getDisplayName());
134
        projectTextField.setText(ProjectUtils.getInformation(project).getDisplayName());
135
        } else {
135
        
136
            projectTextField.setText(LBL_TargetChooser_NoProject());
136
        Sources sources = ProjectUtils.getSources( project );
137
138
        if (folders == null) {
139
            folders = sources.getSourceGroups( Sources.TYPE_GENERIC );
140
        }
137
        }
141
138
142
        if ( folders.length < 2 ) {
139
        if ( folders.length < 2 ) {
Lines 163-168 Link Here
163
            }
160
            }
164
            folderTextField.setText(getRelativeNativeName(rootFolder, preselectedFolder));
161
            folderTextField.setText(getRelativeNativeName(rootFolder, preselectedFolder));
165
        }
162
        }
163
        else if (project == null && preselectedFolder != null) {
164
            folderTextField.setText(preselectedFolder.getPath().replace('/', File.separatorChar));
165
        }
166
166
167
        String ext = template == null ? "" : template.getExt(); // NOI18N
167
        String ext = template == null ? "" : template.getExt(); // NOI18N
168
        expectedExtension = ext.length() == 0 ? "" : "." + ext; // NOI18N
168
        expectedExtension = ext.length() == 0 ? "" : "." + ext; // NOI18N
Lines 217-226 Link Here
217
        
217
        
218
        String folderName = folderTextField.getText().trim();
218
        String folderName = folderTextField.getText().trim();
219
        
219
        
220
        if ( folderName.length() == 0 ) {
220
        if ( folderName.isEmpty() ) {
221
            if (project == null) {
222
                String home = System.getProperty("user.home");
223
                if (home != null && new File(home).isDirectory()) {
224
                    return home;
225
                }
226
            }
227
221
            return null;
228
            return null;
222
        }
229
        }
223
        else {           
230
        else {           
231
            if (project == null && !new File(folderName).isAbsolute()) {
232
                String home = System.getProperty("user.home");
233
                if (home != null && new File(home).isDirectory()) {
234
                    FileObject homeFileObject = FileUtil.toFileObject(FileUtil.normalizeFile(new File(home)));
235
                    folderName = FileUtil.getFileDisplayName(homeFileObject) + File.separatorChar + folderName;
236
                }
237
            }
238
224
            return folderName.replace( File.separatorChar, '/' ); // NOI18N
239
            return folderName.replace( File.separatorChar, '/' ); // NOI18N
225
        }
240
        }
226
    }
241
    }
Lines 429-447 Link Here
429
    private void updateCreatedFolder() {
444
    private void updateCreatedFolder() {
430
        
445
        
431
        SourceGroup sg = (SourceGroup)locationComboBox.getSelectedItem();
446
        SourceGroup sg = (SourceGroup)locationComboBox.getSelectedItem();
432
        if (sg == null) {
447
        FileObject root = sg != null ? sg.getRootFolder() : null;
433
            return;
448
        String documentName = documentNameTextField.getText().trim();
449
        String folderName = getTargetFolder();
450
        if (folderName == null) {
451
            folderName = "";
434
        }
452
        }
435
        FileObject root = sg.getRootFolder();
436
        if (root == null) {
437
            return;
438
        }
439
            
440
        String folderName = folderTextField.getText().trim();
441
        String documentName = documentNameTextField.getText().trim();
442
        
453
        
443
        String createdFileName = FileUtil.getFileDisplayName( root ) + 
454
        String createdFileName = (root != null ? FileUtil.getFileDisplayName( root ) : "") +
444
            ( folderName.startsWith("/") || folderName.startsWith( File.separator ) ? "" : "/" ) + // NOI18N
455
            ( root == null || folderName.startsWith("/") || folderName.startsWith( File.separator ) ? "" : "/" ) + // NOI18N
445
            folderName + 
456
            folderName + 
446
            ( folderName.endsWith("/") || folderName.endsWith( File.separator ) || folderName.length() == 0 ? "" : "/" ) + // NOI18N
457
            ( folderName.endsWith("/") || folderName.endsWith( File.separator ) || folderName.length() == 0 ? "" : "/" ) + // NOI18N
447
            documentName + (!freeFileExtension || documentName.indexOf('.') == -1 ? expectedExtension : "");
458
            documentName + (!freeFileExtension || documentName.indexOf('.') == -1 ? expectedExtension : "");
Lines 456-477 Link Here
456
    
467
    
457
    public @Override void actionPerformed(ActionEvent e) {
468
    public @Override void actionPerformed(ActionEvent e) {
458
        if ( browseButton == e.getSource() ) {
469
        if ( browseButton == e.getSource() ) {
459
            FileObject fo=null;
470
            if (project != null) {
460
            // Show the browse dialog             
471
                FileObject fo;
461
            
472
                // Show the browse dialog
462
            SourceGroup group = (SourceGroup)locationComboBox.getSelectedItem();
473
463
            if (group == null) { // #161478
474
                SourceGroup group = (SourceGroup)locationComboBox.getSelectedItem();
464
                return;
475
                if (group == null) { // #161478
476
                    return;
477
                }
478
479
                fo = BrowseFolders.showDialog( new SourceGroup[] { group },
480
                                               project,
481
                                               folderTextField.getText().replace( File.separatorChar, '/' ) ); // NOI18N
482
483
                if ( fo != null && fo.isFolder() ) {
484
                    String relPath = FileUtil.getRelativePath( group.getRootFolder(), fo );
485
                    folderTextField.setText( relPath.replace( '/', File.separatorChar ) ); // NOI18N
486
                }
465
            }
487
            }
466
            
488
            else {
467
            fo = BrowseFolders.showDialog( new SourceGroup[] { group }, 
489
                String previousTargetFolder = getTargetFolder();
468
                                           project, 
490
                File targetFolder =
469
                                           folderTextField.getText().replace( File.separatorChar, '/' ) ); // NOI18N
491
                    new FileChooserBuilder(SimpleTargetChooserPanel.class)
470
                        
492
                        .setDirectoriesOnly(true)
471
            if ( fo != null && fo.isFolder() ) {
493
                        .setDefaultWorkingDirectory(new File(previousTargetFolder != null ? previousTargetFolder : "."))
472
                String relPath = FileUtil.getRelativePath( group.getRootFolder(), fo );
494
                        .forceUseOfDefaultWorkingDirectory(previousTargetFolder != null)
473
                folderTextField.setText( relPath.replace( '/', File.separatorChar ) ); // NOI18N
495
                        .showSaveDialog();
474
            }                        
496
497
                FileObject fo = targetFolder != null ? FileUtil.toFileObject(FileUtil.normalizeFile(targetFolder)) : null;
498
499
                if ( fo != null && fo.isFolder() ) {
500
                    folderTextField.setText( fo.getPath().replace( '/', File.separatorChar ) ); // NOI18N
501
                }
502
            }
475
        }
503
        }
476
        else if ( locationComboBox == e.getSource() )  {
504
        else if ( locationComboBox == e.getSource() )  {
477
            updateCreatedFolder();
505
            updateCreatedFolder();
(-)a/projectui/src/org/netbeans/modules/project/ui/TemplateChooserPanel.java (-3 / +3 lines)
Lines 49-55 Link Here
49
import java.awt.event.ActionListener;
49
import java.awt.event.ActionListener;
50
import javax.swing.event.ChangeEvent;
50
import javax.swing.event.ChangeEvent;
51
import javax.swing.event.ChangeListener;
51
import javax.swing.event.ChangeListener;
52
import org.netbeans.api.annotations.common.NonNull;
52
import org.netbeans.api.annotations.common.NullAllowed;
53
import org.netbeans.api.project.Project;
53
import org.netbeans.api.project.Project;
54
import org.netbeans.modules.project.uiapi.ProjectChooserFactory;
54
import org.netbeans.modules.project.uiapi.ProjectChooserFactory;
55
import org.netbeans.spi.project.ui.templates.support.Templates;
55
import org.netbeans.spi.project.ui.templates.support.Templates;
Lines 74-85 Link Here
74
    private final ChangeSupport changeSupport = new ChangeSupport(this);
74
    private final ChangeSupport changeSupport = new ChangeSupport(this);
75
    private TemplateChooserPanelGUI gui;
75
    private TemplateChooserPanelGUI gui;
76
76
77
    @NonNull
77
    @NullAllowed
78
    private Project project;
78
    private Project project;
79
    // private String[] recommendedTypes;
79
    // private String[] recommendedTypes;
80
    private WizardDescriptor wizard;
80
    private WizardDescriptor wizard;
81
81
82
    TemplateChooserPanel( @NonNull Project p /*, String recommendedTypes[] */ ) {
82
    TemplateChooserPanel( @NullAllowed Project p /*, String recommendedTypes[] */ ) {
83
        this.project = p;
83
        this.project = p;
84
        /* this.recommendedTypes = recommendedTypes; */
84
        /* this.recommendedTypes = recommendedTypes; */
85
    }
85
    }
(-)a/projectui/src/org/netbeans/modules/project/ui/TemplateChooserPanelGUI.java (-6 / +11 lines)
Lines 56-62 Link Here
56
import javax.swing.DefaultComboBoxModel;
56
import javax.swing.DefaultComboBoxModel;
57
import javax.swing.ListCellRenderer;
57
import javax.swing.ListCellRenderer;
58
import javax.swing.event.ChangeListener;
58
import javax.swing.event.ChangeListener;
59
import org.netbeans.api.annotations.common.CheckForNull;
59
import org.netbeans.api.annotations.common.NonNull;
60
import org.netbeans.api.annotations.common.NonNull;
61
import org.netbeans.api.annotations.common.NullAllowed;
60
import org.netbeans.api.project.Project;
62
import org.netbeans.api.project.Project;
61
import static org.netbeans.modules.project.ui.Bundle.*;
63
import static org.netbeans.modules.project.ui.Bundle.*;
62
import org.netbeans.modules.project.ui.spi.TemplateCategorySorter;
64
import org.netbeans.modules.project.ui.spi.TemplateCategorySorter;
Lines 91-96 Link Here
91
93
92
    //GUI Builder
94
    //GUI Builder
93
    private TemplatesPanelGUI.Builder builder;
95
    private TemplatesPanelGUI.Builder builder;
96
    @NullAllowed
94
    private Project project;
97
    private Project project;
95
    private @NonNull String[] projectRecommendedTypes;
98
    private @NonNull String[] projectRecommendedTypes;
96
    private String category;
99
    private String category;
Lines 110-116 Link Here
110
        projectsComboBox.setRenderer (projectCellRenderer);
113
        projectsComboBox.setRenderer (projectCellRenderer);
111
     }
114
     }
112
    
115
    
113
    public void readValues (@NonNull Project p, String category, String template) {
116
    public void readValues (@NullAllowed Project p, String category, String template) {
114
        assert p != null : "Project can not be null";   //NOI18N
117
        assert p != null : "Project can not be null";   //NOI18N
115
        boolean wf;
118
        boolean wf;
116
        synchronized (this) {
119
        synchronized (this) {
Lines 135-150 Link Here
135
138
136
    /** Called from readSettings, to initialize the GUI with proper components
139
    /** Called from readSettings, to initialize the GUI with proper components
137
     */
140
     */
138
    private void initValues( Project p ) {
141
    private void initValues( @NullAllowed Project p ) {
139
        // Populate the combo box with list of projects
142
        // Populate the combo box with list of projects
140
        Project openProjects[] = OpenProjectList.getDefault().getOpenProjects();
143
        Project openProjects[] = OpenProjectList.getDefault().getOpenProjects();
141
        Arrays.sort(openProjects, OpenProjectList.projectByDisplayName());
144
        Arrays.sort(openProjects, OpenProjectList.projectByDisplayName());
142
        DefaultComboBoxModel projectsModel = new DefaultComboBoxModel( openProjects );
145
        DefaultComboBoxModel projectsModel = new DefaultComboBoxModel( openProjects );
143
        projectsComboBox.setModel( projectsModel );
146
        projectsComboBox.setModel( projectsModel );
147
        projectsComboBox.setEnabled(openProjects.length > 0);
144
        this.selectProject (p);
148
        this.selectProject (p);
145
    }
149
    }
146
150
147
    private void selectProject (Project p) {
151
    private void selectProject (@NullAllowed Project p) {
148
        if (p != null) {
152
        if (p != null) {
149
            DefaultComboBoxModel projectsModel = (DefaultComboBoxModel) projectsComboBox.getModel ();
153
            DefaultComboBoxModel projectsModel = (DefaultComboBoxModel) projectsComboBox.getModel ();
150
            if ( projectsModel.getIndexOf( p ) == -1 ) {
154
            if ( projectsModel.getIndexOf( p ) == -1 ) {
Lines 171-176 Link Here
171
        this.defaultActionListener = al;
175
        this.defaultActionListener = al;
172
    }
176
    }
173
177
178
    @CheckForNull
174
    public Project getProject() {
179
    public Project getProject() {
175
        boolean wf;
180
        boolean wf;
176
        synchronized (this) {
181
        synchronized (this) {
Lines 371-377 Link Here
371
        
376
        
372
        @Override protected boolean createKeys(List<DataObject> keys) {
377
        @Override protected boolean createKeys(List<DataObject> keys) {
373
            for (DataObject dobj : root.getChildren()) {
378
            for (DataObject dobj : root.getChildren()) {
374
                if (isTemplate(dobj) && OpenProjectList.isRecommended(projectRecommendedTypes, dobj.getPrimaryFile())) {
379
                if (isTemplate(dobj) && OpenProjectList.isRecommended(project, projectRecommendedTypes, dobj.getPrimaryFile())) {
375
                    if (dobj instanceof DataShadow) {
380
                    if (dobj instanceof DataShadow) {
376
                        dobj = ((DataShadow) dobj).getOriginal();
381
                        dobj = ((DataShadow) dobj).getOriginal();
377
                    }
382
                    }
Lines 436-449 Link Here
436
        }
441
        }
437
        
442
        
438
        DataFolder f = (DataFolder) folder;
443
        DataFolder f = (DataFolder) folder;
439
        if (!OpenProjectList.isRecommended(projectRecommendedTypes, f.getPrimaryFile())) {
444
        if (!OpenProjectList.isRecommended(p, projectRecommendedTypes, f.getPrimaryFile())) {
440
            // Eg. Licenses folder.
445
            // Eg. Licenses folder.
441
            //see #102508
446
            //see #102508
442
            return false;
447
            return false;
443
        }
448
        }
444
        DataObject[] ch = f.getChildren ();
449
        DataObject[] ch = f.getChildren ();
445
        for (int i = 0; i < ch.length; i++) {
450
        for (int i = 0; i < ch.length; i++) {
446
            if (isTemplate (ch[i]) && OpenProjectList.isRecommended(projectRecommendedTypes, ch[i].getPrimaryFile ())) {
451
            if (isTemplate (ch[i]) && OpenProjectList.isRecommended(p, projectRecommendedTypes, ch[i].getPrimaryFile ())) {
447
                // XXX: how to filter link to Package template in each java types folder?
452
                // XXX: how to filter link to Package template in each java types folder?
448
                if (!(ch[i] instanceof DataShadow)) {
453
                if (!(ch[i] instanceof DataShadow)) {
449
                    return true;
454
                    return true;
(-)a/projectui/src/org/netbeans/modules/project/ui/actions/NewFile.java (-60 / +8 lines)
Lines 47-53 Link Here
47
import java.awt.EventQueue;
47
import java.awt.EventQueue;
48
import java.awt.event.ActionEvent;
48
import java.awt.event.ActionEvent;
49
import java.awt.event.ActionListener;
49
import java.awt.event.ActionListener;
50
import java.beans.BeanInfo;
51
import java.beans.PropertyChangeEvent;
50
import java.beans.PropertyChangeEvent;
52
import java.beans.PropertyChangeListener;
51
import java.beans.PropertyChangeListener;
53
import java.io.IOException;
52
import java.io.IOException;
Lines 58-72 Link Here
58
import java.util.logging.Logger;
57
import java.util.logging.Logger;
59
import javax.swing.Action;
58
import javax.swing.Action;
60
import javax.swing.Icon;
59
import javax.swing.Icon;
61
import javax.swing.ImageIcon;
62
import javax.swing.JComponent;
60
import javax.swing.JComponent;
63
import javax.swing.JMenu;
61
import javax.swing.JMenu;
64
import javax.swing.JMenuItem;
62
import javax.swing.JMenuItem;
65
import javax.swing.JPopupMenu.Separator;
63
import javax.swing.JPopupMenu.Separator;
66
import org.netbeans.api.annotations.common.NonNull;
64
import org.netbeans.api.annotations.common.CheckForNull;
65
import org.netbeans.api.annotations.common.NullAllowed;
67
import org.netbeans.api.project.Project;
66
import org.netbeans.api.project.Project;
68
import org.netbeans.modules.project.ui.NewFileWizard;
67
import org.netbeans.modules.project.ui.NewFileWizard;
69
import org.netbeans.modules.project.ui.NoProjectNew;
70
import org.netbeans.modules.project.ui.OpenProjectList;
68
import org.netbeans.modules.project.ui.OpenProjectList;
71
import org.netbeans.modules.project.ui.OpenProjectList.TemplateItem;
69
import org.netbeans.modules.project.ui.OpenProjectList.TemplateItem;
72
import org.netbeans.modules.project.ui.ProjectUtilities;
70
import org.netbeans.modules.project.ui.ProjectUtilities;
Lines 79-85 Link Here
79
import org.openide.loaders.DataFolder;
77
import org.openide.loaders.DataFolder;
80
import org.openide.loaders.DataObject;
78
import org.openide.loaders.DataObject;
81
import org.openide.loaders.DataObjectNotFoundException;
79
import org.openide.loaders.DataObjectNotFoundException;
82
import org.openide.nodes.Node;
83
import org.openide.util.Lookup;
80
import org.openide.util.Lookup;
84
import org.openide.util.Mutex;
81
import org.openide.util.Mutex;
85
import org.openide.util.NbBundle.Messages;
82
import org.openide.util.NbBundle.Messages;
Lines 121-127 Link Here
121
        Mutex.EVENT.readAccess(new Runnable() {
118
        Mutex.EVENT.readAccess(new Runnable() {
122
            @Override
119
            @Override
123
            public void run() {
120
            public void run() {
124
                setEnabled(OpenProjectList.getDefault().getOpenProjects().length > 0);
121
                setEnabled(true);
125
                setDisplayName(LBL_NewFileAction_Name());
122
                setDisplayName(LBL_NewFileAction_Name());
126
            }
123
            }
127
        });
124
        });
Lines 149-165 Link Here
149
            context = getLookup();
146
            context = getLookup();
150
        }
147
        }
151
148
152
        if ( !inProject ) {
153
            // Context outside of projects
154
            NoProjectNew.showDialog( template, preselectedFolder( context ) );
155
            return;
156
        }
157
        
158
        if (OpenProjectList.getDefault().getOpenProjects().length == 0) {
159
            // Can sometimes happen when pressing Ctrl-N, it seems.
160
            return;
161
        }
162
163
        final NewFileWizard wd = new NewFileWizard( preselectedProject( context ) /* , null */ );
149
        final NewFileWizard wd = new NewFileWizard( preselectedProject( context ) /* , null */ );
164
        
150
        
165
        DataFolder preselectedFolder = preselectedFolder( context );
151
        DataFolder preselectedFolder = preselectedFolder( context );
Lines 229-246 Link Here
229
215
230
    protected void fillSubMenu() {
216
    protected void fillSubMenu() {
231
        Project projects[] = ActionsUtil.getProjectsFromLookup( getLookup(), null );
217
        Project projects[] = ActionsUtil.getProjectsFromLookup( getLookup(), null );
232
        if ( projects != null && projects.length > 0 ) {
218
        fillSubMenu(subMenu, projects.length > 0 ? projects[0] : null);
233
            fillSubMenu(subMenu, projects[0]);
234
        }
235
        else {
236
            // When no project is seleceted only file and folder can be created
237
            fillNonProjectSubMenu(subMenu);
238
        }
239
    }
219
    }
240
220
241
    // Private methods ---------------------------------------------------------
221
    // Private methods ---------------------------------------------------------
242
222
243
    @NonNull
223
    @CheckForNull
244
    private Project preselectedProject( Lookup context ) {
224
    private Project preselectedProject( Lookup context ) {
245
        Project preselectedProject = null;
225
        Project preselectedProject = null;
246
226
Lines 261-270 Link Here
261
            }
241
            }
262
        }
242
        }
263
243
264
        if ( preselectedProject == null ) {
265
            assert false : "Action should be disabled"; // NOI18N
266
        }
267
268
        return preselectedProject;
244
        return preselectedProject;
269
    }
245
    }
270
246
Lines 300-306 Link Here
300
        "LBL_NewFileAction_File_PopupName=Other...",
276
        "LBL_NewFileAction_File_PopupName=Other...",
301
        "NewFile.please_wait=Please wait..."
277
        "NewFile.please_wait=Please wait..."
302
    })
278
    })
303
    private void fillSubMenu(final JMenu menuItem, @NonNull final Project project) {
279
    private void fillSubMenu(final JMenu menuItem, @NullAllowed final Project project) {
304
        menuItem.removeAll();
280
        menuItem.removeAll();
305
        JMenuItem wait = new JMenuItem(NewFile_please_wait());
281
        JMenuItem wait = new JMenuItem(NewFile_please_wait());
306
        wait.setEnabled(false);
282
        wait.setEnabled(false);
Lines 318-323 Link Here
318
                                    i.icon);
294
                                    i.icon);
319
                            item.addActionListener(menuListener);
295
                            item.addActionListener(menuListener);
320
                            item.putClientProperty(TEMPLATE_PROPERTY, i.template);
296
                            item.putClientProperty(TEMPLATE_PROPERTY, i.template);
297
                            item.putClientProperty(IN_PROJECT_PROPERTY, project != null);
321
                            menuItem.add(item);
298
                            menuItem.add(item);
322
                        }
299
                        }
323
                        if (!items.isEmpty()) {
300
                        if (!items.isEmpty()) {
Lines 326-331 Link Here
326
                        JMenuItem fileItem = new JMenuItem(LBL_NewFileAction_File_PopupName(), (Icon) getValue(Action.SMALL_ICON));
303
                        JMenuItem fileItem = new JMenuItem(LBL_NewFileAction_File_PopupName(), (Icon) getValue(Action.SMALL_ICON));
327
                        fileItem.addActionListener(menuListener);
304
                        fileItem.addActionListener(menuListener);
328
                        fileItem.putClientProperty(TEMPLATE_PROPERTY, null);
305
                        fileItem.putClientProperty(TEMPLATE_PROPERTY, null);
306
                        fileItem.putClientProperty(IN_PROJECT_PROPERTY, project != null);
329
                        menuItem.add(fileItem);
307
                        menuItem.add(fileItem);
330
                        // #205616 - need to refresh please wait node
308
                        // #205616 - need to refresh please wait node
331
                        menuItem.getPopupMenu().pack();
309
                        menuItem.getPopupMenu().pack();
Lines 335-370 Link Here
335
        });
313
        });
336
    }
314
    }
337
315
338
    private void fillNonProjectSubMenu(JMenu menuItem) {
339
        menuItem.removeAll();
340
341
        ActionListener menuListener = new PopupListener();
342
343
        DataFolder preselectedFolder = preselectedFolder( getLookup() );
344
345
        boolean canWrite;
346
        if ( preselectedFolder == null ) {
347
            canWrite = false;
348
        }
349
        else {
350
            FileObject pf = preselectedFolder.getPrimaryFile();
351
            canWrite = pf != null && pf.canWrite();
352
        }
353
354
        DataObject templates[] = NoProjectNew.getTemplates();
355
        for( int i = 0; i < templates.length; i++ ) {
356
            Node n = templates[i].getNodeDelegate();
357
            JMenuItem item = new JMenuItem(
358
                    LBL_NewFileAction_Template_PopupName(n.getDisplayName()),
359
                                      new ImageIcon( n.getIcon( BeanInfo.ICON_COLOR_16x16 ) ) );
360
            item.addActionListener( menuListener );
361
            item.putClientProperty( TEMPLATE_PROPERTY, templates[i] );
362
            item.putClientProperty( IN_PROJECT_PROPERTY, Boolean.FALSE );
363
            item.setEnabled( canWrite );
364
            menuItem.add( item );
365
        }
366
    }
367
368
    private class PopupListener implements ActionListener {
316
    private class PopupListener implements ActionListener {
369
317
370
        @Override
318
        @Override
(-)a/projectuiapi/src/org/netbeans/modules/project/uiapi/ProjectChooserFactory.java (-1 / +2 lines)
Lines 47-52 Link Here
47
import java.io.File;
47
import java.io.File;
48
import javax.swing.JFileChooser;
48
import javax.swing.JFileChooser;
49
import org.netbeans.api.annotations.common.NonNull;
49
import org.netbeans.api.annotations.common.NonNull;
50
import org.netbeans.api.annotations.common.NullAllowed;
50
import org.netbeans.api.project.Project;
51
import org.netbeans.api.project.Project;
51
import org.netbeans.api.project.SourceGroup;
52
import org.netbeans.api.project.SourceGroup;
52
import org.openide.WizardDescriptor;
53
import org.openide.WizardDescriptor;
Lines 71-77 Link Here
71
72
72
    public JFileChooser createProjectChooser(); 
73
    public JFileChooser createProjectChooser(); 
73
    
74
    
74
    public WizardDescriptor.Panel<WizardDescriptor> createSimpleTargetChooser(@NonNull Project project, @NonNull SourceGroup[] folders,
75
    public WizardDescriptor.Panel<WizardDescriptor> createSimpleTargetChooser(@NullAllowed Project project, @NonNull SourceGroup[] folders,
75
            WizardDescriptor.Panel<WizardDescriptor> bottomPanel, boolean freeFileExtension);
76
            WizardDescriptor.Panel<WizardDescriptor> bottomPanel, boolean freeFileExtension);
76
            
77
            
77
}
78
}
(-)a/projectuiapi/src/org/netbeans/spi/project/ui/templates/support/Templates.java (-5 / +6 lines)
Lines 46-51 Link Here
46
46
47
import java.io.IOException;
47
import java.io.IOException;
48
import org.netbeans.api.annotations.common.NonNull;
48
import org.netbeans.api.annotations.common.NonNull;
49
import org.netbeans.api.annotations.common.NullAllowed;
49
import org.netbeans.api.project.FileOwnerQuery;
50
import org.netbeans.api.project.FileOwnerQuery;
50
import org.netbeans.api.project.Project;
51
import org.netbeans.api.project.Project;
51
import org.netbeans.api.project.SourceGroup;
52
import org.netbeans.api.project.SourceGroup;
Lines 264-275 Link Here
264
     * The user is prompted to choose a location for the new file and a name.
265
     * The user is prompted to choose a location for the new file and a name.
265
     * Instantiation is handled by {@link DataObject#createFromTemplate}.
266
     * Instantiation is handled by {@link DataObject#createFromTemplate}.
266
     * @param project The project to work on.
267
     * @param project The project to work on.
267
     * @param folders a nonempty list of possible roots to create the new file in
268
     * @param folders a nonempty list of possible roots to create the new file in,
269
     * or an empty list if {@code project} is null
268
     * @return a builder which can be used to customize and then create the target chooser
270
     * @return a builder which can be used to customize and then create the target chooser
269
     * @since org.netbeans.modules.projectuiapi/1 1.45
271
     * @since org.netbeans.modules.projectuiapi/1 1.45
270
     */
272
     */
271
    public static SimpleTargetChooserBuilder buildSimpleTargetChooser(@NonNull Project project, @NonNull SourceGroup[] folders) {
273
    public static SimpleTargetChooserBuilder buildSimpleTargetChooser(@NullAllowed Project project, @NonNull SourceGroup[] folders) {
272
        Parameters.notNull("project", project);
273
        Parameters.notNull("folders", folders);
274
        Parameters.notNull("folders", folders);
274
        return new SimpleTargetChooserBuilder(project, folders);
275
        return new SimpleTargetChooserBuilder(project, folders);
275
    }
276
    }
Lines 280-292 Link Here
280
     * @since org.netbeans.modules.projectuiapi/1 1.45
281
     * @since org.netbeans.modules.projectuiapi/1 1.45
281
     */
282
     */
282
    public static final class SimpleTargetChooserBuilder {
283
    public static final class SimpleTargetChooserBuilder {
283
        @NonNull
284
        @NullAllowed
284
        final Project project;
285
        final Project project;
285
        @NonNull
286
        @NonNull
286
        final SourceGroup[] folders;
287
        final SourceGroup[] folders;
287
        WizardDescriptor.Panel<WizardDescriptor> bottomPanel;
288
        WizardDescriptor.Panel<WizardDescriptor> bottomPanel;
288
        boolean freeFileExtension;
289
        boolean freeFileExtension;
289
        SimpleTargetChooserBuilder(@NonNull Project project, @NonNull SourceGroup[] folders) {
290
        SimpleTargetChooserBuilder(@NullAllowed Project project, @NonNull SourceGroup[] folders) {
290
            this.project = project;
291
            this.project = project;
291
            this.folders = folders;
292
            this.folders = folders;
292
        }
293
        }
(-)a/properties/src/org/netbeans/modules/properties/Layer.xml (+1 lines)
Lines 56-61 Link Here
56
                <attr name="templateWizardURL" urlvalue="nbresloc:/org/netbeans/modules/properties/TemplateHelp.html"/>
56
                <attr name="templateWizardURL" urlvalue="nbresloc:/org/netbeans/modules/properties/TemplateHelp.html"/>
57
                <attr name="SystemFileSystem.icon" urlvalue="nbresloc:/org/netbeans/modules/properties/propertiesObject.png"/>
57
                <attr name="SystemFileSystem.icon" urlvalue="nbresloc:/org/netbeans/modules/properties/propertiesObject.png"/>
58
                <attr name="templateCategory" stringvalue="simple-files"/>
58
                <attr name="templateCategory" stringvalue="simple-files"/>
59
                <attr name="requireProject" boolvalue="false"/>
59
            </file>            
60
            </file>            
60
        </folder>
61
        </folder>
61
    </folder>
62
    </folder>
(-)a/xml/src/org/netbeans/modules/xml/resources/mf-layer.xml (+4 lines)
Lines 66-71 Link Here
66
                <attr name="templateWizardIterator" methodvalue="org.netbeans.modules.xml.wizard.impl.XMLWizardIterator.singleton"/>
66
                <attr name="templateWizardIterator" methodvalue="org.netbeans.modules.xml.wizard.impl.XMLWizardIterator.singleton"/>
67
                <attr name="templateCategory" stringvalue="XML"/>
67
                <attr name="templateCategory" stringvalue="XML"/>
68
                <attr name="javax.script.ScriptEngine" stringvalue="freemarker"/>
68
                <attr name="javax.script.ScriptEngine" stringvalue="freemarker"/>
69
                <attr name="requireProject" boolvalue="false"/>
69
            </file>
70
            </file>
70
            
71
            
71
            <file name="emptyDTD.dtd" url="templates/emptyDTD.dtd.template">
72
            <file name="emptyDTD.dtd" url="templates/emptyDTD.dtd.template">
Lines 77-82 Link Here
77
                <attr name="templateWizardIterator" newvalue="org.netbeans.modules.xml.wizard.impl.DTDWizardIterator"/>
78
                <attr name="templateWizardIterator" newvalue="org.netbeans.modules.xml.wizard.impl.DTDWizardIterator"/>
78
                <attr name="templateCategory" stringvalue="XML"/>
79
                <attr name="templateCategory" stringvalue="XML"/>
79
                <attr name="javax.script.ScriptEngine" stringvalue="freemarker"/>
80
                <attr name="javax.script.ScriptEngine" stringvalue="freemarker"/>
81
                <attr name="requireProject" boolvalue="false"/>
80
            </file>
82
            </file>
81
                        
83
                        
82
            <file name="XmlSchema.xsd" url="templates/emptyXmlSchema.xsd.template">
84
            <file name="XmlSchema.xsd" url="templates/emptyXmlSchema.xsd.template">
Lines 87-92 Link Here
87
                <attr name="templateWizardURL" urlvalue="nbresloc:/org/netbeans/modules/xml/resources/emptySchema.html"/>
89
                <attr name="templateWizardURL" urlvalue="nbresloc:/org/netbeans/modules/xml/resources/emptySchema.html"/>
88
                <attr name="templateCategory" stringvalue="XML"/>
90
                <attr name="templateCategory" stringvalue="XML"/>
89
                <attr name="javax.script.ScriptEngine" stringvalue="freemarker"/>
91
                <attr name="javax.script.ScriptEngine" stringvalue="freemarker"/>
92
                <attr name="requireProject" boolvalue="false"/>
90
            </file>
93
            </file>
91
                        
94
                        
92
            <file name="xml_entity.ent" url="templates/xml_entity.ent.template">
95
            <file name="xml_entity.ent" url="templates/xml_entity.ent.template">
Lines 97-102 Link Here
97
                <attr name="templateWizardURL" urlvalue="nbresloc:/org/netbeans/modules/xml/resources/xml_entity.html"/>
100
                <attr name="templateWizardURL" urlvalue="nbresloc:/org/netbeans/modules/xml/resources/xml_entity.html"/>
98
                <attr name="templateCategory" stringvalue="oasis-XML-catalogs"/>
101
                <attr name="templateCategory" stringvalue="oasis-XML-catalogs"/>
99
                <attr name="javax.script.ScriptEngine" stringvalue="freemarker"/>
102
                <attr name="javax.script.ScriptEngine" stringvalue="freemarker"/>
103
                <attr name="requireProject" boolvalue="false"/>
100
            </file>
104
            </file>
101
105
102
        </folder> <!-- XML -->
106
        </folder> <!-- XML -->
(-)a/xsl/src/org/netbeans/modules/xsl/resources/mf-layer.xml (+1 lines)
Lines 59-64 Link Here
59
                <attr name="templateWizardURL" urlvalue="nbresloc:/org/netbeans/modules/xsl/resources/templates/stylesheet.html"/>
59
                <attr name="templateWizardURL" urlvalue="nbresloc:/org/netbeans/modules/xsl/resources/templates/stylesheet.html"/>
60
                <attr name="templateCategory" stringvalue="XML"/>
60
                <attr name="templateCategory" stringvalue="XML"/>
61
                <attr name="templateWizardIterator" newvalue="org.netbeans.modules.xsl.wizard.XSLWizardIterator"/>
61
                <attr name="templateWizardIterator" newvalue="org.netbeans.modules.xsl.wizard.XSLWizardIterator"/>
62
                <attr name="requireProject" boolvalue="false"/>
62
            </file>
63
            </file>
63
        </folder> <!-- XML -->
64
        </folder> <!-- XML -->
64
    </folder> <!-- Templates -->
65
    </folder> <!-- Templates -->

Return to bug 186943