<!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 Ant-Based Project Type Module Tutorial for NetBeans Platform 6.7</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 Nodes API."/>
    <!--      Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. -->
    <!--     Use is subject to license terms.-->
</head>
<body>
    <h1>NetBeans Ant-Based Project Type Module Tutorial</h1>
    
    <p>This tutorial demonstrates how to create a new project type
         for projects that need to use Ant as their build tool.</p>

   <p class="tips">This tutorial assumes you want to create a project
        type for projects that need to use Ant as their build tool. If this is
        not the case, you should use the <a href="https://platform.netbeans.org/tutorials/nbm-projecttype.html">NetBeans Project Type Module Tutorial</a> instead.

     <p><b>Contents</b></p>
   
       <img  src="../images/articles/67/netbeans-stamp67.gif" class="stamp" width="114" height="114" alt="Content on this page applies to NetBeans IDE 6.7" title="Content on this page applies to NetBeans IDE 6.7"/> </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><a href="#creatingtheproject">Creating the Project</a>
        <li><a href="#creatingthelogicalviewprovider">Creating the Logical View Provider</a>
        <li><a href="#creatingthenodes">Creating the Nodes</a>
        <li><a href="#integratingant">Integrating the Ant Build Tool</a>
        <li><a href="#building">Installing the Module</a>
       </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 6.7</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 or<br/>version 5</td>
            </tr>
        </tbody>
    </table>

    <p>You will also make use of this icon, which you
    can right-click here and download: <img src="../images/tutorials/projecttypes/icon1.png" />

   <p class="tips">Optionally, for troubleshooting purposes, you can <a href="http://kenai.com/projects/nb-antprojectsample">download the
   completed sample</a> and inspect the sources.

    <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 border="1" src="../images/tutorials/projecttypes/sample-3.png" alt="installed result"/>

    <p>In this tutorial, we will create a project type that
    will look as follows in the Projects window:</p>

    <p><img border="1" src="../images/tutorials/projecttypes/demo-6.png" alt="installed result"/>

    <p>Our project type will be defined by specific entries
        in the project's <tt>project.xml</tt> file. The "Build Project"
        menu item, shown in the screenshot above,
        will call the "compile" target in the "build.xml"
        file, both of which are assumed to be present.

    <p>The following are the main NetBeans API classes
        we will be implementing in this tutorial:

      <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/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-projectuiapi/org/netbeans/spi/project/ui/support/NodeFactory.html">org.netbeans.spi.project.ui.support.NodeFactory</a></tt></td>
                <td class="tbltd1">Provides one or more nodes for the logical view.</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>
        </tbody>
    </table>

        <p>At the end of this tutorial, your
         module source structure will be as follows:</p>
    
    <p><img border="1" src="../images/tutorials/projecttypes/demo-7.png" alt="New Sample"/>
    
    <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.

            <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>Do not select "Generate XML Layer", since our module
        will not need a <tt>layer.xml</tt> file. 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). 
    
    <!-- ===================================================================================== -->
    <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.
            
            <ol>
            
            <li>Right-click the project node and 
        choose Properties. The Project Properties dialog box opens.</li>
        <li>In the Libraries panel, add dependencies on the
        following modules:
        
        <p><ul>
            <li>Ant</li>
            <li>Ant-Based Project Support</li>
            <li>Datasystems API</li>
            <li>Dialogs API</li>
            <li>Execution API</li>
            <li>File System API</li>
            <li>Module System 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><p>Expand the module's
             Libraries node
             in the Projects window
             and make sure that the
        list of APIs is as shown in the
            Libraries node below:</p>

    <p><img border="1" src="../images/tutorials/projecttypes/demo-7.png" alt="New Sample"/>
            
            </ol>
    
     <!-- ===================================================================================== -->
            <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>At the end of this section, when you open a folder containing
            a <tt>nbprojects</tt> folder that has a <tt>project.xml</tt>
            with content as defined below...</p>

        <pre class=examplecode>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;project xmlns="https://netbeans.org/ns/project/1"&gt;
    &lt;type&gt;org.netbeans.demo.project.DemoProject&lt;/type&gt;
    &lt;configuration&gt;
        &lt;data xmlns="https://netbeans.org/ns/demo-project/1"&gt;
            &lt;name&gt;test&lt;/name&gt;
        &lt;/data&gt;
    &lt;/configuration&gt;
&lt;/project&gt;</pre>

                 <p>...all the folders
                 and files will be shown in the Projects window, just like the
                 Files window, as shown below:

                <p><img border="1" src="../images/tutorials/projecttypes/demo-1.png" alt="New Sample"/>

                <p>In subsequent sections, we'll filter the display in the Projects
                     window. For now, we'll simply show everything the project
                     provides.

                <p>Do the following:

                <ol>
                <li><p>Create a Java class called <tt>DemoProject</tt>.
                <li><p>Change the default code to the following. Notice that
                     we begin with an annotation that registers the project
                     as applying to projects that have a <tt>project.xml</tt>
                     as defined above.</p>

        <pre class=examplecode>@AntBasedProjectRegistration(type = "org.netbeans.demo.project.DemoProject",
iconResource = "org/netbeans/demo/project/icon1.png",
sharedName = "data",
sharedNamespace = "https://netbeans.org/ns/demo-project/1",
privateName = "project-private",
privateNamespace = "https://netbeans.org/ns/demo-project-private/1")
public class DemoProject implements <a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-modules-projectapi/org/netbeans/api/project/Project.html">Project</a> {

    final AntProjectHelper helper;

    public DemoProject(AntProjectHelper helper) {
        this.helper = helper;
    }

    @Override
    public Lookup getLookup() {
        return Lookups.fixed(new Object[]{
                    new Info()
                });
    }

    @Override
    public FileObject getProjectDirectory() {
        return helper.getProjectDirectory();
    }

    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 String getName() {
            return helper.getProjectDirectory().getName();
        }

        public String getDisplayName() {
            return getName();
        }

        @Override
        public Icon getIcon() {
            return new ImageIcon(ImageUtilities.loadImage(
                    "org/netbeans/demo/project/icon1.png"));
        }

        @Override
        public void addPropertyChangeListener(PropertyChangeListener pcl) {
        }

        @Override
        public void removePropertyChangeListener(PropertyChangeListener pcl) {
        }

        @Override
        public Project getProject() {
            return DemoProject.this;
        }
    }

}
</pre>

        </ol>

     <!-- ===================================================================================== -->
            <h2><a name="creatingthelogicalviewprovider"></a>Creating the Logical View Provider</h2>
            <p>Next, 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>Once we have implemented the <tt>LogicalViewProvider</tt>, we'll
                 have filtered out everything from the Projects window, other than
                 the project node.

            <p><img border="1" src="../images/tutorials/projecttypes/demo-2.png" alt="New Sample"/>

                <p>Once we have achieved the above, we'll begin registering nodes
                     in the project's lookup. In doing so, we'll let the project
                     display nodes that supplement the project node in the
                     Projects window.

                <p>Do the following:

                <ol>
                <li><p>Create a Java class called <tt>DemoProjectLogicalView</tt>.
                <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() {
        return new RootNode(project);
    }

    private static final class RootNode extends AbstractNode {

        public static final String DEMO_PROJECT_ICON_PATH =
                "org/netbeans/demo/project/icon1.png";
        public static final String REGISTERED_NODE_LOCATION =
                "Projects/org-netbeans-demo-project-DemoProject/Nodes";
        final DemoProject project;

        public RootNode(DemoProject project) {
            super(NodeFactorySupport.createCompositeChildren(project, REGISTERED_NODE_LOCATION), Lookups.singleton(project));
            this.project = project;
            setIconBaseWithExtension(DEMO_PROJECT_ICON_PATH);
        }

        @Override
        public Action[] getActions(boolean arg0) {
            Action[] nodeActions = new Action[7];
            nodeActions[0] = CommonProjectActions.newFileAction();
            //The 'null' is a reference to no properties being used, in this case.
            nodeActions[1] = ProjectSensitiveActions.projectCommandAction(ActionProvider.COMMAND_BUILD, "Build Project", null);
            nodeActions[2] = CommonProjectActions.copyProjectAction();
            nodeActions[3] = CommonProjectActions.deleteProjectAction();
            nodeActions[5] = CommonProjectActions.setAsMainProjectAction();
            nodeActions[6] = CommonProjectActions.closeProjectAction();
            return nodeActions;
        }

        @Override
        public Image getIcon(int type) {
            return ImageUtilities.loadImage(DEMO_PROJECT_ICON_PATH);
        }

        @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>  


<p><li>In the <tt>DemoProject</tt>, register the logical view provider
         that you created above. Register the logical view provider
         in the <tt>DemoProject</tt> lookup, as shown in the line in below by:

<pre class=examplecode>@Override
public Lookup getLookup() {
    return Lookups.fixed(new Object[]{
                new Info(),
                <b>new DemoProjectLogicalView(this),</b>
            });
}</pre>

<p><li><p>Run the project and you should see that only the project node is shown
in the Projects window:</p>

 <p><img border="1" src="../images/tutorials/projecttypes/demo-2.png" alt="New Sample"/>

<li><p>Let's now begin registering nodes for our logical view. In our logical
         view, we defined a constant named REGISTERED_NODE_LOCATION. That
         constant points to the place in the System Filesystem where the
logical view will look for its nodes.</p>

         <p>Create a new class called <tt>DemoNodeFactory</tt> and
              define it as follows:

<pre class=examplecode>@NodeFactory.Registration(projectType="org-netbeans-demo-project-DemoProject", position=200)
public class DemoNodeFactory implements <a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-modules-projectuiapi/org/netbeans/spi/project/ui/support/NodeFactory.html">NodeFactory</a> {

    public DemoNodeFactory() {
    }

    @Override
    public NodeList createNodes(Project proj) {
        try {
            AbstractNode nd = new AbstractNode(Children.LEAF);
            nd.setDisplayName("Hello World!");
            return NodeFactorySupport.fixedNodeList(nd);
        } catch (DataObjectNotFoundException ex) {
            Exceptions.printStackTrace(ex);
        }
        return NodeFactorySupport.fixedNodeList();
    }

}</pre

<li><p>Install the module again and you should see your dummy node:</p>

 <p><img border="1" src="../images/tutorials/projecttypes/demo-3.png" alt="New Sample"/>

<li><p>Finally, let's enable some of the menu items on the project node. Do
     so by adding the project to the lookup of the <tt>RootNode</tt>. The <tt>RootNode</tt>
     is defined in <tt>DemoProject</tt> and should be supplemented by the addition
     shown in bold below:
    </p>

<pre class=examplecode>public RootNode(DemoProject project) {
    super(NodeFactorySupport.createCompositeChildren
            (project, REGISTERED_NODE_LOCATION), <b>Lookups.singleton(project)</b>);
    this.project = project;
    setIconBaseWithExtension(DEMO_PROJECT_ICON_PATH);
}</pre>

    <li><p>Install the module again and you should see the following, i.e.,
    various menu items are now functioning on the project node:</p>

 <p><img border="1" src="../images/tutorials/projecttypes/demo-4.png" alt="New Sample"/>

     </ol>

<p>In the next section, we will add a real node to the logical view
     in the Projects window.

     <!-- ===================================================================================== -->
            <h2><a name="creatingthenodes"></a>Creating the Nodes</h2>
            <p>Next, we work some more with the <tt><a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-modules-projectuiapi/org/netbeans/spi/project/ui/support/NodeFactory.html">org.netbeans.spi.project.ui.support.NodeFactory</a></tt>
            class and we extend the <tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-nodes/org/openide/nodes/FilterNode.html">org.openide.nodes.FilterNode</a></tt>.

            <p>At the end of this section, when you open a folder containing
                 a <tt>project.xml</tt> file as specified above, all the folders
                 and files will be shown in the Projects window, just like the
                 Files window, as shown below:

                <p><img border="1" src="../images/tutorials/projecttypes/demo-5.png" alt="New Sample"/>

                <p>In subsequent sections, we'll filter the display in the Projects
                     window. For now, we'll simply show everything the project
                     provides.

                <p>Do the following:

                <ol>
                <li><p>Replace <tt>DemoNodeFactory</tt> with the following:</p>

        <pre class=examplecode>@NodeFactory.Registration(projectType="org-netbeans-demo-project-DemoProject", position=200)
public class DemoNodeFactory implements <a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-modules-projectuiapi/org/netbeans/spi/project/ui/support/NodeFactory.html">NodeFactory</a> {

    public DemoNodeFactory() {
    }

    @Override
    public NodeList createNodes(Project proj) {
        try {
            DemoFilterNode nd = new DemoFilterNode(proj);
            return NodeFactorySupport.fixedNodeList(nd);
        } catch (DataObjectNotFoundException ex) {
            Exceptions.printStackTrace(ex);
        }
        return NodeFactorySupport.fixedNodeList();
    }

}
</pre>

<p><li>Next, we look for the "nbproject" folder in our application and create a <tt>FilterNode</tt>
         for that folder, so we can display it in the logical view of the project.

         <p>Create a new class called <tt>DemoFilterNode</tt> and define it as follows:</p>

<pre class=examplecode>public class DemoFilterNode extends <a href="http://bits.netbeans.org/dev/javadoc/org-openide-nodes/org/openide/nodes/FilterNode.html">FilterNode</a> {

    private static Image smallImage =
            ImageUtilities.loadImage("org/netbeans/demo/project/icon1.png"); // NOI18N

    public DemoFilterNode(Project proj) throws DataObjectNotFoundException {
        super(DataObject.find(proj.getProjectDirectory().getFileObject("nbproject")).getNodeDelegate());
    }

    @Override
    public String getDisplayName() {
        return "Important Files";
    }

    //Next, we add icons, for the default state, which is
    //closed, and the opened state; we will make them the same.
    //Icons in project logical views are
    //based on combinations--you must combine the node's own icon
    //with a distinguishing badge that is merged with it. Here we
    //first obtain the icon from a data folder, then we add our
    //badge to it by merging it via a NetBeans API utility method:
    @Override
    public Image getIcon(int type) {
        DataFolder root = DataFolder.findFolder(FileUtil.getConfigRoot());
        Image original = root.getNodeDelegate().getIcon(type);
        return ImageUtilities.mergeImages(original, smallImage, 7, 7);
    }

    @Override
    public Image getOpenedIcon(int type) {
        DataFolder root = DataFolder.findFolder(FileUtil.getConfigRoot());
        Image original = root.getNodeDelegate().getIcon(type);
        return ImageUtilities.mergeImages(original, smallImage, 7, 7);
    }

}
</pre>


         <li><p>Install the module again and you should see the "nbproject" folder
         presented in the Projects window, with the label and icons defined above:</p>

 <p><img border="1" src="../images/tutorials/projecttypes/demo-5.png" alt="New Sample"/>


         </ol>
                    
     <!-- ===================================================================================== -->
            <h2><a name="integratingant"></a>Integrating the Ant Build Tool</h2>
            <p>Finally, we add a new menu item to the project's contextual menu.
                 We then hook that menu item to the "compile" target in the
                 project's <tt>build.xml</tt> file, which we'll assume is
                 in the application's root directory.


                <p>Do the following:

                <ol>
                <li><p>First, add an <tt>ActionProvider</tt> implementation to
                         the project's lookup, as shown below. Note that included
                         in the <tt>DemoActionProvider</tt> is the Build command:</p>

             <pre class=examplecode>@AntBasedProjectRegistration(type = "org.netbeans.demo.project.DemoProject",
iconResource = "org/netbeans/demo/project/icon1.png",
sharedName = "data",
sharedNamespace = "https://netbeans.org/ns/demo-project/1",
privateName = "project-private",
privateNamespace = "https://netbeans.org/ns/demo-project-private/1")
public class DemoProject implements <a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-modules-projectapi/org/netbeans/api/project/Project.html">Project</a> {

    final AntProjectHelper helper;

    public DemoProject(AntProjectHelper helper) {
        this.helper = helper;
    }

    @Override
    public Lookup getLookup() {
        return Lookups.fixed(new Object[]{
                    new Info(),
                    new DemoProjectLogicalView(this),<b>
                    new DemoActionProvider(),
                    </b> });
    }

    @Override
    public FileObject getProjectDirectory() {
        return helper.getProjectDirectory();
    }

    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 String getName() {
            return helper.getProjectDirectory().getName();
        }

        public String getDisplayName() {
            return getName();
        }

        @Override
        public Icon getIcon() {
            return new ImageIcon(ImageUtilities.loadImage(
                    "org/netbeans/demo/project/icon1.png"));
        }

        @Override
        public void addPropertyChangeListener(PropertyChangeListener pcl) {
        }

        @Override
        public void removePropertyChangeListener(PropertyChangeListener pcl) {
        }

        @Override
        public Project getProject() {
            return DemoProject.this;
        }
    }
<b>
    private final class DemoActionProvider 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,
            ActionProvider.COMMAND_BUILD,};

        @Override
        public String[] getSupportedActions() {
            return supported;
        }

        @Override
        public void invokeAction(String string, Lookup lookup) throws IllegalArgumentException {
            if (string.equals(ActionProvider.COMMAND_DELETE)) {
                DefaultProjectOperations.performDefaultDeleteOperation(DemoProject.this);
            }
            if (string.equals(ActionProvider.COMMAND_COPY)) {
                DefaultProjectOperations.performDefaultCopyOperation(DemoProject.this);
            }
            //Here we find the Ant script and call the target we need!
            if (string.equals(ActionProvider.COMMAND_BUILD)) {
                try {
                    FileObject buildImpl = helper.getProjectDirectory().getFileObject("build.xml");
                    ActionUtils.runTarget(buildImpl, new String[]{"compile"}, null);
                } catch (IOException ex) {
                    Exceptions.printStackTrace(ex);
                }
            }
        }

        @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 if ((command.equals(ActionProvider.COMMAND_BUILD))) {
                return true;
            } else {
                throw new IllegalArgumentException(command);
            }
        }
    }
</b>
}
</pre>

<p><li>Next, let's add the Build command to the logical view. In <tt>DemProjectLogicalView</tt>,
         rewrite <tt>getActions</tt> as follows:


<pre class=examplecode>@Override
public Action[] getActions(boolean arg0) {
    Action[] nodeActions = new Action[7];
    nodeActions[0] = CommonProjectActions.newFileAction();
    //The 'null' indicates that the default icon will be used:
    nodeActions[1] = ProjectSensitiveActions.projectCommandAction(ActionProvider.COMMAND_BUILD, "Build Project", null);
    nodeActions[2] = CommonProjectActions.copyProjectAction();
    nodeActions[3] = CommonProjectActions.deleteProjectAction();
    nodeActions[5] = CommonProjectActions.setAsMainProjectAction();
    nodeActions[6] = CommonProjectActions.closeProjectAction();
    return nodeActions;
}
</pre>

         </ol>

        <!-- ======================================================================================= -->
            
        <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>Check that the module looks as follows
            in the Projects window:</p>
            <p><img border="1" src="../images/tutorials/projecttypes/demo-7.png" alt="finished project">
                <li>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.
                <li><p>Choose File | Open Project
                     and browse to a folder that has a subfolder
                     named "nbprojects" containing a <tt>project.xml</tt>
                     with this content:

<pre class=examplecode>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;project xmlns="https://netbeans.org/ns/project/1"&gt;
    &lt;type&gt;org.netbeans.demo.project.DemoProject&lt;/type&gt;
    &lt;configuration&gt;
        &lt;data xmlns="https://netbeans.org/ns/demo-project/1"&gt;
            &lt;name&gt;test&lt;/name&gt;
        &lt;/data&gt;
    &lt;/configuration&gt;
&lt;/project&gt;</pre>

                     <p>The root directory of the project should have
a <tt>build.xml</tt> file with content such as the following:

<pre class=examplecode>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;project name="" default="default" basedir="."&gt;
    &lt;target name="compile"&gt;
        &lt;echo&gt;Compiling...&lt;/echo&gt;
    &lt;/target&gt;
&lt;/project&gt;</pre>

                 <li><p>Open the project and you should see
                     the Projects window displaying the project's "nbprojects" folder.
                 Right-click the project node and
                          notice the project-level menu
                          items that you defined earlier. Right-click the
                      "Build Project" command and you should be able
                      to build the project.</p>
                 <p><img border="1" src="../images/tutorials/projecttypes/demo-6.png" alt="installed result">

                    </ol>
    
     </div>
      
    
    
    <br>
    <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>
    <br style="clear:both;" />
    <!-- ======================================================================================== -->
    
    <h2><a name="nextsteps"></a>Next Steps</h2>
    
    <p>For more information about creating and developing NetBeans modules, see the following resources: 
    <ul>
        <p><li><a href="https://netbeans.org/kb/trails/platform.html">Other Related Tutorials</a></li>
        <p><li><a href="http://bits.netbeans.org/dev/javadoc/index.html">NetBeans API Javadoc</a></li>
    </ul>
</body>
</html>
