<!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 Extension Module Tutorial for NetBeans Platform 7.1</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 APIs for extending project types."/>
        <!--      Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. -->
        <!--     Use is subject to license terms.-->
    </head>
    <body>
        <h1>NetBeans Project Type Extension Module Tutorial</h1>

        <p>This tutorial demonstrates how to extend an existing project type.</p>

        <p><strong class="notes">Note: </strong>This document uses NetBeans Platform 7.1 and
            NetBeans IDE 7.1. If you
            are using an earlier version, see <a href="../70/nbm-projectextension.html">the previous version
                of this document</a>.</p>

        <p><b>Contents</b></p>

        <p><img src="../../images/articles/71/netbeans-stamp.png" class="stamp" width="114" height="114" alt="Content on this page applies to NetBeans IDE 7.1" title="Content on this page applies to NetBeans IDE 7.1"/></p>
        <ul class="toc">
            <li><a href="#intro">Introduction to Project Extensions</a></li>
            <li><a href="#creatingthemoduleproject">Creating the Module Project</a></li>
            <li><a href="#settingdependencies">Setting Dependencies</a></li>
            <li><a href="#extendingthelookup">Extending the Project Lookup</a></li>
            <li><a href="#extendingthelogicalview">Extending the Project Logical View</a></li>
            <li><a href="#extendingthecustomizer">Extending the Project Customizer</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.1 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 or above</td>
                </tr>
            </tbody>
        </table>

        <p>You will also make use of this icon, which you
            can right-click here and download: <img alt="" src="../../images/tutorials/projectextensions/webPagesBadge.gif" /></p>

        <h2 class="tutorial"><a name="intro"></a>Introduction to Project Extensions</h2>

        <p>New NetBeans IDE APIs since NetBeans IDE 6.0
            enable you to add new nodes to an existing project type's logical view, new objects to an
            existing project type's lookup, and new panels to an existing project type's Project
            Properties dialog box. For example, in this tutorial,
            to illustrate these extensions, we extend the web application
            project type, by adding a new 'Important Files' node, exposing the content of the
            project's 'nbproject' folder, as shown here:</p>

        <p><img src="../../images/tutorials/projectextensions/result-69.png" alt="New node"/></p>

        <p>Prior to NetBeans IDE 6.0, no NetBeans IDE APIs existed for extending existing project types.
            Instead, you would need to create new project types from scratch. From 6.0 onwards, you are
            recommended to extend existing project types rather than create new ones. This will
            keep the number of project types to a minimum and avoid a large number of project
            types with very small differences. However, it is still possible to create project
            types from scratch, as before.</p>

        <p>Annotations are used throughout this tutorial to register the lookup extension,
            logical view extension, and project customizer extension. As you will see
            below, the extensions will be registered for the project type
            "org-netbeans-modules-web-project", which is the web application project type.
            Here is a list of strings representing other project types supported by
            NetBeans IDE:</p>

        <ul>
            <li>org-netbeans-modules-ant-freeform</li>
            <li>org-netbeans-modules-apisupport-project</li>
            <li>org-netbeans-modules-apisupport-project-suite</li>
            <li>org-netbeans-modules-j2ee-archiveproject</li>
            <li>org-netbeans-modules-j2ee-clientproject</li>
            <li>org-netbeans-modules-j2ee-earproject</li>
            <li>org-netbeans-modules-j2ee-ejbjarproject</li>
            <li>org-netbeans-modules-java-j2seproject</li>
        </ul>

        <p>Other project types may be available, depending on the modules that are part
            of your specific installation of NetBeans IDE or other application on the
            NetBeans Platform.</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>ImportantWebFiles</tt> in the Project Name field.
                Change the Project Location to any directory on your computer. Click Next.</li>
            <li>In the Basic Module Configuration panel, type <tt>org.netbeans.modules.importantwebfiles</tt>
                in Code Name Base. Click Finish.</li>
        </ol>

        <p> The IDE creates the <tt>ImportantWebFiles</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>In the Libraries panel, add dependencies on the
                following modules:
                <p></p>
                <ul>
                    <li>Datasystems 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>Utilities API</li>
                    <li>Web APIs</li>
                </ul>
            </li>
            <li>Click OK.</li>

        </ol>

        <!-- ===================================================================================== -->
        <h2><a name="extendingthelookup"></a>Extending the Project Lookup</h2>
        <p>We start by implementing the <tt>LookupProviderImpl</tt>
            class, which we will register via an annotation.</p>

        <ol>
            <li><p>Create a Java class called <tt>LookupProviderImpl</tt>.</p></li>
            <li><p>Change the default code to the following:</p>

                <pre class="examplecode">@LookupProvider.Registration(projectType = "org-netbeans-modules-web-project")
public class LookupProviderImpl implements LookupProvider {

    public Lookup createAdditionalLookup(Lookup lookup) {
        
        Project prj = lookup.lookup(Project.class);
        
        <b>//If there is a web module provider in the
        //project's lookup, add a new lookup item to
        //the lookup, which we will look for to determine
        //whether a node should be created:</b>
        WebModuleProvider wmp = lookup.lookup(WebModuleProvider.class);
        if (wmp != null) {
            return Lookups.fixed(new MyCoolLookupItem(prj));
        }
        
        <b>//If there is no web module in the lookup,
        //we do not add a new item to our lookup,
        //so that later a node will not be created:</b>
        return Lookups.fixed();
        
    }

}</pre>  </li>

            <li>Create a new Java class called <tt>MyCoolLookupItem</tt>.</li>

            <li><p>Change the default code to the following:</p>

                <pre class="examplecode">public class MyCoolLookupItem {

    public MyCoolLookupItem(Project prj) {
    }

}</pre>  </li>

        </ol>
        <p>You now have a module that adds
             an object named <tt>MyCoolLookupItem</tt>
             to the <tt>Lookup</tt> of web projects.
             The object has access to the web project,
             via the <tt>Project</tt> class received
             from the <tt>createAdditionalLookup</tt>
             method.</p>
        <!-- ===================================================================================== -->
        <h2><a name="extendingthelogicalview"></a>Extending the Project Logical View</h2>
        <p>We start by implementing the <tt>ImportantFilesNodeFactoryImpl</tt>
            class, which we will register via an annotation.</p>

        <ol>
            <li><p>Create a Java class called <tt>ImportantFilesNodeFactoryImpl</tt>.</p></li>

            <li><p>Change the default code to the following:</p>

                <pre class="examplecode">@NodeFactory.Registration(projectType = "org-netbeans-modules-web-project")
public class ImportantFilesNodeFactoryImpl implements <a href="https://netbeans.org/download/dev/javadoc/org-netbeans-modules-projectuiapi/org/netbeans/spi/project/ui/support/NodeFactory.html">NodeFactory</a> {

    Project proj;

    public <a href="https://netbeans.org/download/dev/javadoc/org-netbeans-modules-projectuiapi/org/netbeans/spi/project/ui/support/NodeList.html">NodeList</a> createNodes(Project project) {
      
        this.proj = project;
        
        <b>//If there is no 'nbproject' folder,
        //return an empty list of nodes:</b>
        if (proj.getProjectDirectory().getFileObject("nbproject") == null) {
            return NodeFactorySupport.fixedNodeList();
        }
        
        <b>//If our item is in the project's lookup,
        //return a new node in the node list:</b>
        MyCoolLookupItem item = project.getLookup().lookup(MyCoolLookupItem.class);
        if (item != null) {
            try {
                ImportantFilesNode nd = new ImportantFilesNode(proj);
                return NodeFactorySupport.fixedNodeList(nd);
            } catch (DataObjectNotFoundException ex) {
                Exceptions.printStackTrace(ex);
            }
        }
        
        <b>//If our item isn't in the lookup,
        //then return an empty list of nodes:</b>
        return NodeFactorySupport.fixedNodeList();
        
    }
    
}</pre></li>

            <li>Create a new Java class called <tt>ImportantFilesNode</tt>.</li>

            <li><p>Change the default code to the following:</p>

                <pre class="examplecode">public class ImportantFilesNode extends <a href="https://netbeans.org/download/dev/javadoc/org-openide-nodes/org/openide/nodes/FilterNode.html">FilterNode</a> {

    private static Image smallImage = 
          ImageUtilities.loadImage("/org/netbeans/modules/importantwebfiles/webPagesBadge.gif"); // NOI18N

    public ImportantFilesNode(Project proj) throws DataObjectNotFoundException {
        super(DataObject.find(proj.getProjectDirectory().getFileObject("nbproject")).getNodeDelegate());
    }

    public String getDisplayName() {
        return "Important Files";
    }
     
    <b>//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:</b>
    
    public Image getIcon(int type) {
        DataFolder root = DataFolder.findFolder(FileUtil.getConfigRoot());
        Image original = root.getNodeDelegate().getIcon(type);
        return ImageUtilities.mergeImages(original, smallImage, 7, 7);
    }

    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>


            <li>Right-click this icon and save it in the main package of your module: <img  alt="" src="../../images/tutorials/projectextensions/webPagesBadge.gif" /></li>

        </ol>

        <!-- ======================================================================================= -->

        <h2><a name="extendingthecustomizer"></a>Extending the Project Customizer</h2>
        <p>Finally, we create two new tabs in the Project Properties dialog of the web application project type.</p>

        <ol>
            <li><p>Create a Java class called <tt>ImportantFilesCustomizerTab</tt>.</p></li>
            <li><p>Change the default code to the following:</p>

                <pre class="examplecode">@NbBundle.Messages({
    "LBL_Config_Murphy1=Murphy 1",
    "LBL_Config_Murphy2=Murphy 2 "})
public class ImportantFilesCustomizerTab implements ProjectCustomizer.CompositeCategoryProvider {

    private String name;

    @ProjectCustomizer.CompositeCategoryProvider.Registration(projectType = "org-netbeans-modules-web-project", position = 100)
    public static ImportantFilesCustomizerTab createMurphy1() {
        return new ImportantFilesCustomizerTab(Bundle.LBL_Config_Murphy1());
    }

    @ProjectCustomizer.CompositeCategoryProvider.Registration(projectType = "org-netbeans-modules-web-project", position = 110)
    public static ImportantFilesCustomizerTab createMurphy2() {
        return new ImportantFilesCustomizerTab(Bundle.LBL_Config_Murphy2());
    }

    private ImportantFilesCustomizerTab(String name) {
        this.name = name;
    }

    @Override
    public Category createCategory(Lookup lkp) {
        ProjectCustomizer.Category toReturn = null;
        if (Bundle.LBL_Config_Murphy1().equals(name)) {
            toReturn = ProjectCustomizer.Category.create(
                    Bundle.LBL_Config_Murphy1(),
                    Bundle.LBL_Config_Murphy1(),
                    null);
        } else {
            toReturn = ProjectCustomizer.Category.create(
                    Bundle.LBL_Config_Murphy2(),
                    Bundle.LBL_Config_Murphy2(), // NOI18N
                    null);
        }
        return toReturn;
    }

    @Override
    public JComponent createComponent(Category category, Lookup lkp) {
        String nm = category.getName();
        if (Bundle.LBL_Config_Murphy1().equals(nm)) {
            JPanel jPanel1 = new JPanel();
            jPanel1.setLayout(new BorderLayout());
            jPanel1.add(new JLabel(Bundle.LBL_Config_Murphy1()), BorderLayout.CENTER);
            return jPanel1;
        } else {
            JPanel jPanel2 = new JPanel();
            jPanel2.setLayout(new BorderLayout());
            jPanel2.add(new JLabel(Bundle.LBL_Config_Murphy2()), BorderLayout.CENTER);
            return jPanel2;
        }
    }

}</pre>  </li>

        </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>Right-click the module project and run it.</li>
                <li><p>Create a new web application, or open an
                        existing one, and notice that it
                        has an Important Files node, containing the files
                        from the 'nbproject' folder:</p>
                    <p><img src="../../images/tutorials/projectextensions/result-69.png" alt="installed result"/></p></li>
                <li><p>Right-click the web application project and choose Properties.
                        In the Project Properties dialog box, notice your new tabs:</p>
                    <p><img src="../../images/tutorials/projectextensions/proj-props-69.png" alt="installed result"/></p></li>
            </ol>

        </div>

        <div class="feedback-box"><a href="https://netbeans.org/about/contact_form.html?to=3&amp;subject=Feedback:%20Project%20Extension%207.1%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="https://netbeans.org/download/dev/javadoc/">NetBeans API Javadoc</a></li>
        </ul>
    </body>
</html>
