blob: 84ec4d89871a078d1c0f5a775fe3b2d666b0e1c9 [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<!-- -*- xhtml -*- -->
<title>NetBeans Project Type Module Tutorial for NetBeans Platform 7.0</title>
<link rel="stylesheet" type="text/css" href="https://netbeans.org/netbeans.css"/>
<meta name="AUDIENCE" content="NBUSER"/>
<meta name="TYPE" content="ARTICLE"/>
<meta name="EXPIRES" content="N"/>
<meta name="developer" content="gwielenga@netbeans.org"/>
<meta name="indexed" content="y"/>
<meta name="description"
content="A short guide to using the Project API."/>
<!-- Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. -->
<!-- Use is subject to license terms.-->
</head>
<body>
<h1>NetBeans Project Type Module Tutorial</h1>
<p>This tutorial demonstrates how to create a new project type in an Ant-based NetBeans Platform application.</p>
<p class="tips">Rather than creating a new project type, you might want to extend an existing
project type instead, in which case refer to the <a href="https://platform.netbeans.org/tutorials/nbm-projectextension.html">NetBeans Project Type Extension Module Tutorial</a>.
For Maven-based NetBeans Platform applications, see <a href="http://netbeans.dzone.com/how-create-maven-nb-project-type">How to Create a Custom Project Type in a Mavenized NetBeans Platform Application</a>.
If the projects for which you're creating a project type (whether on Ant or Maven based NetBeans Platform applications)
need to use Ant as their build tool, you should
use the <a href="https://platform.netbeans.org/tutorials/nbm-projecttypeant.html">NetBeans Ant-Based Project Type Module Tutorial</a> instead.</p>
<p><strong class="notes">Note: </strong>This document uses the NetBeans IDE 7.0 Release or above. If you
are using an earlier version, see <a href="691/nbm-projecttype.html">the previous version
of this document</a>.</p>
<p><b>Contents</b></p>
<p><img src="../../images/articles/70/netbeans-stamp.gif" class="stamp" width="114" height="114" alt="Content on this page applies to NetBeans IDE 7.0" title="Content on this page applies to NetBeans IDE 7.0"/></p>
<ul class="toc">
<li><a href="#intro">Introduction to Project Types</a></li>
<li><a href="#creatingthemoduleproject">Creating the Module Project</a></li>
<li><a href="#settingdependencies">Setting Dependencies</a></li>
<li><a href="#creatingtheprojectfactory">Creating the Project Factory</a></li>
<li><a href="#creatingtheproject">Creating the Project</a></li>
<li><a href="#creatingthelogicalviewprovider">Creating the Logical View Provider</a></li>
<li><a href="#projectsample">Registering the Project Type as Project Sample</a></li>
<li><a href="#building">Installing the Module</a></li>
</ul>
<p><b>To follow this tutorial, you need the software and resources listed in the following
table.</b></p>
<table>
<tbody>
<tr>
<th class="tblheader" scope="col">Software or Resource</th>
<th class="tblheader" scope="col">Version Required</th>
</tr>
<tr>
<td class="tbltd1"><a href="https://netbeans.org/downloads/index.html">NetBeans IDE</a></td>
<td class="tbltd1">version 7.0 or above</td>
</tr>
<tr>
<td class="tbltd1"><a href="http://java.sun.com/javase/downloads/index.jsp">Java Developer Kit (JDK)</a></td>
<td class="tbltd1">Version 6</td>
</tr>
</tbody>
</table>
<p>You will also make use of these two icons, which you
can right-click here and download: <img alt="" src="../../images/tutorials/projecttypes/icon1.png" /> <img src="../../images/tutorials/projecttypes/icon2.png" alt="" /></p>
<p class="tips">Optionally, for troubleshooting purposes, you can <a href="http://plugins.netbeans.org/PluginPortal/faces/PluginDetailPage.jsp?pluginid=12170">download the
completed sample</a> and inspect the sources.</p>
<h2 class="tutorial"><a name="intro"></a>Introduction to Project Types</h2>
<p>A <i>project type</i> is a NetBeans Platform term for a grouping of
folders and files that is treated as a single unit. Treating
related folders and files as a single unit makes working
with them easier for the end user. One way in which a project
type simplifies life for the user is that you are able to fill
the Projects window only with those folders and files that the end user
is most likely to work.</p> <p>For example, the Java
project type in NetBeans IDE helps the end user to work with the folders
and files belonging to a single Java application. As you can see
below, the folders and files the end user most needs to work with
are shown in the Projects window:</p>
<p><img style="border: 1px solid" src="../../images/tutorials/projecttypes/70pics/sample-3.png" alt="installed result"/></p>
<p>In this tutorial, we will create a project type that
will look as follows in the Projects window and Files window:</p>
<p><img src="../../images/tutorials/projecttypes/70pics/nb-sample-proj6.png" alt="installed result"/></p>
<p>Our project type will be defined by the
existence of a subfolder named "texts". If a folder
contains a subfolder with that name, the NetBeans
Platform will recognize it as a project type. The
user will be able to open the project into a
NetBeans Platform application and the content
of the "texts" folder will be displayed in
the Projects window. The user will also be able to
create new projects, via the New Projects window (Ctrl-Shift-N),
which is where we will register two sample projects.</p>
<p>The following are the main NetBeans API classes
we will be implementing in this tutorial:</p>
<table>
<tbody>
<tr>
<th class="tblheader" scope="col">Class</th>
<th class="tblheader" scope="col">Description</th>
</tr>
<tr>
<td class="tbltd1"><tt><a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-modules-projectapi/org/netbeans/spi/project/ProjectFactory.html">org.netbeans.spi.project.ProjectFactory</a></tt></td>
<td class="tbltd1">Determines when a folder or file
is a valid project and then creates the implemention
of <tt>org.netbeans.api.project.Project</tt>.</td>
</tr>
<tr>
<td class="tbltd1"><tt><a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-modules-projectapi/org/netbeans/api/project/Project.html">org.netbeans.api.project.Project</a></tt></td>
<td class="tbltd1">Represents the project.</td>
</tr>
<tr>
<td class="tbltd1"><tt><a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-modules-projectuiapi/org/netbeans/spi/project/ui/LogicalViewProvider.html">org.netbeans.spi.project.ui.LogicalViewProvider</a></tt></td>
<td class="tbltd1">Provides the logical view for the project.</td>
</tr>
<tr>
<td class="tbltd1"><tt><a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-modules-projectapi/org/netbeans/api/project/ProjectInformation.html">org.netbeans.api.project.ProjectInformation</a></tt></td>
<td class="tbltd1">Provides supplemental information for the project.</td>
</tr>
<tr>
<td class="tbltd1"><tt><a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-modules-projectapi/org/netbeans/spi/project/ActionProvider.html">org.netbeans.spi.project.ActionProvider</a></tt></td>
<td class="tbltd1">Provides one or more actions for the project.</td>
</tr>
<tr>
<td class="tbltd1"><tt><a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-modules-projectapi/org/netbeans/spi/project/CopyOperationImplementation.html">org.netbeans.spi.project.CopyOperationImplementation</a></tt></td>
<td class="tbltd1">Provides the Copy operation for the project.</td>
</tr>
<tr>
<td class="tbltd1"><tt><a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-modules-projectapi/org/netbeans/spi/project/DeleteOperationImplementation.html">org.netbeans.spi.project.DeleteOperationImplementation</a></tt></td>
<td class="tbltd1">Provides the Delete operation for the project.</td>
</tr>
</tbody>
</table>
<p>At the end of this tutorial, your
module source structure will be as follows:</p>
<p><img src="../../images/tutorials/projecttypes/70pics/sample-2.png" alt="New Sample"/></p>
<h2 class="tutorial"><a name="creatingthemoduleproject"></a>Creating the Module Project</h2>
<p>We begin by working through the New Module Project
wizard. At the end of it, we will have a basic
source structure, with some default files, that
every NetBeans module requires.</p>
<ol>
<li>Choose File &gt; New Project (Ctrl+Shift+N). Under Categories, select NetBeans Modules.
Under Projects, select Module. Click Next.</li>
<li>In the Name and Location panel, type <tt>DemoProjectType</tt> in the Project Name field.
Change the Project Location to any directory on your computer. Leave the Standalone Module option
and Set as Main Project checkbox selected. Click Next.</li>
<li>In the Basic Module Configuration panel, type <tt>org.netbeans.demo.project</tt>
in Code Name Base.</li>
<li>Do not select "Generate XML Layer", since our module
will not need a <tt>layer.xml</tt> file until later in this tutorial, when the New Project Template
wizard will create it for us. Leave the
location of the localizing bundle
so that it will be stored in a package with
the name <tt>org/netbeans/demo/project</tt>. Click Finish.</li>
</ol>
<p> The IDE creates the <tt>DemoProjectType</tt>
project. The project contains all of your sources and
project metadata, such as the project's Ant build script. The project
opens in the IDE. You can view its logical structure in the Projects window (Ctrl-1) and its
file structure in the Files window (Ctrl-2).</p>
<!-- ===================================================================================== -->
<h2><a name="settingdependencies"></a>Setting Dependencies</h2>
<p>We will need to make use of several NetBeans APIs. In this
step, we select the modules that provide the NetBeans APIs
that we will need.</p>
<ol>
<li>Right-click the project node and
choose Properties. The Project Properties dialog box opens.</li>
<li><p>In the Libraries panel, add dependencies on the
following modules:</p>
<p></p>
<ul>
<li>Datasystems API</li>
<li>Dialogs API</li>
<li>File System API</li>
<li>Lookup API</li>
<li>Nodes API</li>
<li>Project API</li>
<li>Project UI API</li>
<li>UI Utilities API</li>
<li>Utilities API</li>
</ul>
</li>
</ol>
<!-- ===================================================================================== -->
<h2><a name="creatingtheprojectfactory"></a>Creating the Project Factory</h2>
<p>We start by implementing the <tt><a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-modules-projectapi/org/netbeans/spi/project/ProjectFactory.html">org.netbeans.spi.project.ProjectFactory</a></tt>
class.</p>
<ol>
<li><p>Create a Java class called <tt>DemoProjectFactory</tt>.</p></li>
<li><p>Change the default code to the following:</p>
<pre class=examplecode>@org.openide.util.lookup.ServiceProvider(service=ProjectFactory.class)
public class DemoProjectFactory implements <a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-modules-projectapi/org/netbeans/spi/project/ProjectFactory.html">ProjectFactory</a> {
public static final String PROJECT_DIR = "texts";
<b>//Specifies when a project is a project, i.e.,
//if the project directory "texts" is present:</b>
@Override
public boolean isProject(FileObject projectDirectory) {
return projectDirectory.getFileObject(PROJECT_DIR) != null;
}
<b>//Specifies when the project will be opened, i.e.,
//if the project exists:</b>
@Override
public Project loadProject(FileObject dir, ProjectState state) throws IOException {
return isProject(dir) ? new DemoProject(dir, state) : null;
}
@Override
public void saveProject(final Project project) throws IOException, ClassCastException {
FileObject projectRoot = project.getProjectDirectory();
if (projectRoot.getFileObject(PROJECT_DIR) == null) {
throw new IOException("Project dir " + projectRoot.getPath() +
" deleted," +
" cannot save project");
}
<b>//Force creation of the texts dir if it was deleted:</b>
((DemoProject) project).getTextFolder(true);
}
}</pre>
</li>
</ol>
<p class="tips">The @ServiceProvider annotation used in the class signature
above will cause a META-INF/services file to be created when the module
is compiled. Within that folder, a file named after the fully qualified
name of the interface will be found, containing the fully qualified name
of the implementing class. That is the standard JDK mechanism, since JDK 6,
for registering implementations of interfaces. That is how project types
are registered in the NetBeans Plaform.</p>
<!-- ===================================================================================== -->
<h2><a name="creatingtheproject"></a>Creating the Project</h2>
<p>Next, we implement the <tt><a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-modules-projectapi/org/netbeans/api/project/Project.html">org.netbeans.api.project.Project</a></tt>
class.</p>
<ol>
<li><p>Create a Java class called <tt>DemoProject</tt>.</p></li>
<li><p>Change the default code to the following:</p>
<pre class=examplecode>class DemoProject implements <a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-modules-projectapi/org/netbeans/api/project/Project.html">Project</a> {
private final FileObject projectDir;
private final ProjectState state;
private Lookup lkp;
public DemoProject(FileObject projectDir, ProjectState state) {
this.projectDir = projectDir;
this.state = state;
}
@Override
public FileObject getProjectDirectory() {
return projectDir;
}
FileObject getTextFolder(boolean create) {
FileObject result =
projectDir.getFileObject(DemoProjectFactory.PROJECT_DIR);
if (result == null && create) {
try {
result = projectDir.createFolder(DemoProjectFactory.PROJECT_DIR);
} catch (IOException ioe) {
Exceptions.printStackTrace(ioe);
}
}
return result;
}
<b>//The project type's capabilities are registered in the project's lookup:</b>
@Override
public Lookup getLookup() {
if (lkp == null) {
lkp = Lookups.fixed(new Object[]{
state, <b>//allow outside code to mark the project as needing saving</b>
new ActionProviderImpl(), <b>//Provides standard actions like Build and Clean</b>
new DemoDeleteOperation(),
new DemoCopyOperation(this),
new Info(), <b>//Project information implementation</b>
new DemoProjectLogicalView(this), <b>//Logical view of project implementation</b>
});
}
return lkp;
}
private final class ActionProviderImpl implements <a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-modules-projectapi/org/netbeans/spi/project/ActionProvider.html">ActionProvider</a> {
private String[] supported = new String[]{
ActionProvider.COMMAND_DELETE,
ActionProvider.COMMAND_COPY,
};
@Override
public String[] getSupportedActions() {
return supported;
}
@Override
public void invokeAction(String string, Lookup lookup) throws IllegalArgumentException {
if (string.equalsIgnoreCase(ActionProvider.COMMAND_DELETE)) {
DefaultProjectOperations.performDefaultDeleteOperation(DemoProject.this);
}
if (string.equalsIgnoreCase(ActionProvider.COMMAND_COPY)) {
DefaultProjectOperations.performDefaultCopyOperation(DemoProject.this);
}
}
@Override
public boolean isActionEnabled(String command, Lookup lookup) throws IllegalArgumentException {
if ((command.equals(ActionProvider.COMMAND_DELETE))) {
return true;
} else if ((command.equals(ActionProvider.COMMAND_COPY))) {
return true;
} else {
throw new IllegalArgumentException(command);
}
}
}
private final class DemoDeleteOperation implements <a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-modules-projectapi/org/netbeans/spi/project/DeleteOperationImplementation.html">DeleteOperationImplementation</a> {
public void notifyDeleting() throws IOException {
}
public void notifyDeleted() throws IOException {
}
public List&lt;FileObject&gt; getMetadataFiles() {
List&lt;FileObject&gt; dataFiles = new ArrayList&lt;FileObject&gt;();
return dataFiles;
}
public List&lt;FileObject&gt; getDataFiles() {
List&lt;FileObject&gt; dataFiles = new ArrayList&lt;FileObject&gt;();
return dataFiles;
}
}
private final class DemoCopyOperation implements <a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-modules-projectapi/org/netbeans/spi/project/CopyOperationImplementation.html">CopyOperationImplementation</a> {
private final DemoProject project;
private final FileObject projectDir;
public DemoCopyOperation(DemoProject project) {
this.project = project;
this.projectDir = project.getProjectDirectory();
}
public List&lt;FileObject&gt; getMetadataFiles() {
return Collections.EMPTY_LIST;
}
public List&lt;FileObject&gt; getDataFiles() {
return Collections.EMPTY_LIST;
}
public void notifyCopying() throws IOException {
}
public void notifyCopied(Project arg0, File arg1, String arg2) throws IOException {
}
}
private final class Info implements <a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-modules-projectapi/org/netbeans/api/project/ProjectInformation.html">ProjectInformation</a> {
@Override
public Icon getIcon() {
return new ImageIcon(ImageUtilities.loadImage(
"org/netbeans/demo/project/icon2.png"));
}
@Override
public String getName() {
return getProjectDirectory().getName();
}
@Override
public String getDisplayName() {
return getName();
}
@Override
public void addPropertyChangeListener(PropertyChangeListener pcl) {
//do nothing, won't change
}
@Override
public void removePropertyChangeListener(PropertyChangeListener pcl) {
//do nothing, won't change
}
@Override
public Project getProject() {
return DemoProject.this;
}
}
}
</pre>
</li>
</ol>
<!-- ===================================================================================== -->
<h2><a name="creatingthelogicalviewprovider"></a>Creating the Logical View Provider</h2>
<p>Finally, we implement the <tt><a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-modules-projectuiapi/org/netbeans/spi/project/ui/LogicalViewProvider.html">org.netbeans.spi.project.ui.LogicalViewProvider</a></tt>
class.</p>
<ol>
<li><p>Create a Java class called <tt>DemoProjectLogicalView</tt>.</p></li>
<li><p>Change the default code to the following:</p>
<pre class=examplecode>class DemoProjectLogicalView implements <a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-modules-projectuiapi/org/netbeans/spi/project/ui/LogicalViewProvider.html">LogicalViewProvider</a> {
private final DemoProject project;
public DemoProjectLogicalView(DemoProject project) {
this.project = project;
}
@Override
public org.openide.nodes.Node createLogicalView() {
try {
<b>//Get the Text directory, creating if deleted</b>
FileObject text = project.getTextFolder(true);
<b>//Get the DataObject that represents it</b>
DataFolder textDataObject =
DataFolder.findFolder(text);
<b>//Get its default node-we'll wrap our node around it to change the
//display name, icon, etc</b>
Node realTextFolderNode = textDataObject.getNodeDelegate();
<b>//This FilterNode will be our project node</b>
return new TextNode(realTextFolderNode, project);
} catch (DataObjectNotFoundException donfe) {
Exceptions.printStackTrace(donfe);
<b>//Fallback-the directory couldn't be created -
//read-only filesystem or something evil happened</b>
return new AbstractNode(Children.LEAF);
}
}
<b>/** This is the node you actually see in the project tab for the project */</b>
private static final class TextNode extends <a href="http://bits.netbeans.org/dev/javadoc/org-openide-nodes/org/openide/nodes/FilterNode.html">FilterNode</a> {
final DemoProject project;
public TextNode(Node node, DemoProject project) throws DataObjectNotFoundException {
super(node, new FilterNode.Children(node),
<b>//The projects system wants the project in the Node's lookup.
//NewAction and friends want the original Node's lookup.
//Make a merge of both</b>
new ProxyLookup(new Lookup[]{Lookups.singleton(project),
node.getLookup()
}));
this.project = project;
}
@Override
public Action[] getActions(boolean arg0) {
Action[] nodeActions = new Action[7];
nodeActions[0] = CommonProjectActions.newFileAction();
nodeActions[1] = CommonProjectActions.copyProjectAction();
nodeActions[2] = CommonProjectActions.deleteProjectAction();
nodeActions[5] = CommonProjectActions.setAsMainProjectAction();
nodeActions[6] = CommonProjectActions.closeProjectAction();
return nodeActions;
}
@Override
public Image getIcon(int type) {
return ImageUtilities.loadImage("org/netbeans/demo/project/icon1.png");
}
@Override
public Image getOpenedIcon(int type) {
return getIcon(type);
}
@Override
public String getDisplayName() {
return project.getProjectDirectory().getName();
}
}
@Override
public Node findPath(Node root, Object target) {
//leave unimplemented for now
return null;
}
}
</pre> </li>
</ol>
<!-- ======================================================================================= -->
<h2><a name="projectsample"></a>Registering the Project Type as Project Sample</h2>
<p>In this section, we create some project samples that make use of our
project type. We also register these project samples in the
New Project window of our application.</p>
<div class="indent">
<ol>
<li><p>Create some folders and files on disk. The folders and files
should meet the requirements for projects of the type that you
have defined in your module. For example, in the case of this
tutorial, make sure that you have a folder that has a subfolder
named "texts".</p></li>
<li><p>Run the module that you created in this tutorial. A new instance
of your NetBeans IDE starts up. Now your new project type is installed
in NetBeans IDE. Open the sample projects you created in the previous
step. </p>
<p>Also open the module itself into the new instance of NetBeans IDE. Create a
new subpackage, named "sample", as shown below, then right-click it
and choose New | Project Template:</p>
<p><img style="border: 1px solid" src="../../images/tutorials/projecttypes/70pics/nb-sample-proj1.png" alt="installed result"/></p>
<li><p>Use the New Project Template wizard to register your first sample project:</p>
<p><img src="../../images/tutorials/projecttypes/70pics/nb-sample-proj7.png" alt="installed result"/></p>
<p>Specify the name of the template, the display text, and the location:
<p><img src="../../images/tutorials/projecttypes/70pics/nb-sample-proj2.png" alt="installed result"/></p>
<p>Once you have completed the wizard, use it again to register your second sample project:
<p><img src="../../images/tutorials/projecttypes/70pics/nb-sample-proj3.png" alt="installed result"/></p>
<li><p>Check that the new instance of NetBeans IDE shows you the following in the Projects window:</p>
<p><img style="border: 1px solid" src="../../images/tutorials/projecttypes/70pics/nb-sample-proj4.png" alt="installed result"/></p>
</ol>
<p>You have now used the New Project Template wizard to register some project samples
into the central registry of your application. Look in the <tt>layer.xml</tt> file
that the Project Template wizard created:</p>
<pre class=examplecode>&lt;folder name="Templates"&gt;
&lt;folder name="Project"&gt;
&lt;folder name="Text"&gt;
&lt;file name="TextProject1Project.zip" url="TextProject1Project.zip"&gt;
&lt;attr name="displayName" bundlevalue="org.netbeans.demo.project.Bundle#Templates/Project/Text/TextProject1Project.zip"/&gt;
&lt;attr name="instantiatingIterator" methodvalue="org.netbeans.demo.project.sample.project1.TextProject1WizardIterator.createIterator"/&gt;
&lt;attr name="instantiatingWizardURL" urlvalue="nbresloc:/org/netbeans/demo/project/sample/project1/TextProject1Description.html"/&gt;
&lt;attr name="template" boolvalue="true"/&gt;
&lt;/file&gt;
&lt;file name="TextProject2Project.zip" url="TextProject2Project.zip"&gt;
&lt;attr name="displayName" bundlevalue="org.netbeans.demo.project.Bundle#Templates/Project/Text/TextProject2Project.zip"/&gt;
&lt;attr name="instantiatingIterator" methodvalue="org.netbeans.demo.project.sample.project2.TextProject2WizardIterator.createIterator"/&gt;
&lt;attr name="instantiatingWizardURL" urlvalue="nbresloc:/org/netbeans/demo/project/sample/project2/TextProject2Description.html"/&gt;
&lt;attr name="template" boolvalue="true"/&gt;
&lt;/file&gt;
&lt;/folder&gt;
&lt;/folder&gt;
&lt;/folder&gt;</pre>
<p class="tips">Also notice that you have some ZIP files
containing your sample projects,
created by the Project Template wizard, together with several
classes from the NetBeans Wizard API. For further information, refer to the
<a href="https://platform.netbeans.org/tutorials/nbm-projectsamples.html">NetBeans Project Sample Module Tutorial</a>.
</div>
<!-- ======================================================================================= -->
<h2><a name="building"></a>Installing the Module</h2>
<p>Finally, we install the module and make use of the result.</p>
<div class="indent">
<ol>
<li><p>Right-click the module project and choose "Run".
The application for which the module is
being created starts up and the module
installs into it.</p></li>
<li><p>Choose File | Open Project
and browse to a folder that has a subfolder
named "texts". </p>
<li><p>Open the project and you should see
the Projects window displaying
your project. The content of the "texts"
folder should be shown in the Projects window:</p>
<p><img style="border: 1px solid" src="../../images/tutorials/projecttypes/70pics/nb-sample-proj6.png" alt="installed result"/></p>
<li><p>Alternatively, you can use the New Project wizard (Ctrl-Shift-N) to create
your projects using the templates you created:</p>
<p><img style="border: 1px solid" src="../../images/tutorials/projecttypes/70pics/nb-sample-proj5.png" alt="installed result"/></p>
</ol>
</div>
<div class="feedback-box"><a href="https://netbeans.org/about/contact_form.html?to=3&amp;subject=Feedback:%20Project%20Type%20Module%20Tutorial">Send Us Your Feedback</a></div>
<!-- ======================================================================================== -->
<h2><a name="nextsteps"></a>Next Steps</h2>
<p>For more information about creating and developing NetBeans modules, see the following resources:</p>
<ul>
<li><a href="https://netbeans.org/kb/trails/platform.html">Other Related Tutorials</a></li>
<li><a href="http://bits.netbeans.org/dev/javadoc/index.html">NetBeans API Javadoc</a></li>
</ul>
</body>
</html>