<!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>System Properties Module Tutorial for NetBeans Platform</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, 2011, 2012, 2013, 2014 Oracle and/or its affiliates. All rights reserved. -->
        <!--     Use is subject to license terms.-->
    </head>
    <body>
        <h1>NetBeans System Properties Module Tutorial</h1>

        <p>This tutorial is intended to demonstrate aspects of the <a href="https://netbeans.org/download/dev/javadoc/org-openide-nodes/org/openide/nodes/package-summary.html">NetBeans Nodes API</a>.</p>

        <p><strong class="notes">Note: </strong>This document uses NetBeans Platform 8.0 and
            NetBeans IDE 8.0. If you
            are using an earlier version, see <a href="74/nbm-nodesapi.html">the previous version
                of this document</a>.</p>


        <p><b>Contents</b></p>

        <p><img src="../images/articles/81/netbeans-stamp.png" class="stamp" width="114" height="114" alt="Content on this page applies to NetBeans IDE 8.0" title="Content on this page applies to NetBeans IDE 8.0"/></p>
        <ul class="toc">
            <!--<li><a href="#gettingtoknowthesample">Getting to Know the Sample</a>
            <ul>
            <li><a href="#introducing-sample">Introducing the Sample</a></li>	
            <li><a href="#introducing-sources">Introducing the Sources</a></li>
            </ul></li>-->
            <li><a href="#settingupthemoduleproject">Setting Up the Module Project</a>
                <ul>
                    <li><a href="#creatingthemoduleproject">Creating the Module Project</a></li>
                    <li><a href="#specifying">Specifying the Module's Dependencies</a></li>
                </ul></li>
            <li><a href="#creatingandgettingtoknowthemainfiles">Creating the Main Files</a>
                <ul>
                    <li><a href="#AllPropsNode"><tt>AllPropsNode.java</tt></a></li>
                    <li><a href="#PropertiesNotifier"><tt>PropertiesNotifier.java</tt></a></li>
                    <li><a href="#AllPropsChildFactory"><tt>AllPropsChildFactory.java</tt></a></li>
                    <li><a href="#OnePropNode"><tt>OnePropNode.java</tt></a></li>
                    <li><a href="#RefreshPropsAction"><tt>RefreshPropsAction.java</tt></a></li>
                </ul></li>
            <li><a href="#finetuning">Setting Up the Supporting Files</a></li>
            <li><a href="#building">Building and 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 8.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 7 or above</td>
                </tr>
            </tbody>
        </table>

        <p class="tips">For troubleshooting purposes, you are welcome to download the <a href="http://java.net/projects/nb-api-samples/sources/api-samples/show/versions/8.0/tutorials/SystemProperties">completed tutorial source code</a>.</p>

        <!-- ===================================================================================== -->
        <!--<h2><a name="gettingtoknowthesample"></a>Getting to Know the Sample</h2>
        
        <p>This tutorial will help you understand the following:</p>
        <ul>
        <li>how to add a hierarchy of nodes to the Services window</li>
        <li>how to rename and delete nodes</li>
        <li>how to to display subnodes</li>
        <li>how to change the list of nodes</li>
        <li>how to create a property sheet</li>
        <li>how to assign properties</li>
        <li>how to perform other common tasks</li></ul>
        
        <p>Working through this sample is
        important because the <a href="https://netbeans.org/download/dev/javadoc/org-openide-nodes/org/openide/nodes/package-summary.html">NetBeans Nodes API</a> is one of the more ubiquitous APIs and reflects
        information that exists independently of the nodes. You interact
        through an interface to this live information.</p>
        
        <p>Before you start writing the module, you have to make sure you have all of the necessary software.
         In addition, you might want to play with the sample before building it yourself. Getting to know the
         sample lets you know what you are in for during the rest of this tutorial!</p>
        <div class="indent">
        
            <h3 class="tutorial"><a name="installing-sample"></a>Installing the Sample</h3>
        
            <p>In this section, we download and install the sample, so that we can become
                acquainted with it before recreating it ourselves.</p>
        
        <ol>
            
            <li>Unzip the <a href="../samples/zips/SystemProperties.zip">attached file</a>.</li>
        
                <li><p>In the IDE, choose File > Open Project and browse to the folder that contains the unzipped file.
            Open the module project. It should look as follows:</p>
                    <p><img style="border:1px solid black" src="../images/tutorials/sysprops/nbm-sysprops-70.png" alt="All source files."/></p></li>
        
                <li>Right-click the project node and choose Install/Reload in Target Platform. The target
                    platform opens and the module is installed.</li>
        
        </ol>
        
            <h3 class="tutorial"><a name="introducing-sample"></a>Introducing the Sample</h3>
        
            <p>In this section, we look at the functionality provided by the module, from
            the perspective of an end user. Once we know in detail what the module will provide,
            we will be in a better position to build it from scratch.</p>
        
            <ol>
        
            <li><p>Open the Services window (Ctrl-5) and notice that you have a new node with a large number (~50) of subnodes,
            each labeled according to a key for specific Java properties:</p>
        
                <p><img style="border:1px solid black" src="../images/tutorials/sysprops/nbm-sysprops-70-2.png" alt="System Properties module."/></p>
        
                <p> Contextual menu items appear when you
        right-click the main node and subnodes. For the subnodes, the Java
        runtime's generalized properties are used to configure basic mechanisms such as
        search paths for fonts, location of the Java Virtual Machine (JVM), default locale,
        and so on. These are typically string keys, similar to <tt>name.name.name</tt>, and an
        associated string value. Values can be queried or set from within the Java language.
        In addition, they can be used to set default values at JVM start up. When the System Properties node is
        extended, it will display one node for each of the keys, each labeled according to the
        key. For example:</p>
        
        <ul>
        <li>The value <tt>java.vm.vendor</tt> may display the value Sun Microsystems, Inc.,
        for example.</li>
        <li>The value <tt>path.separator</tt> may display a semicolon, depending on your
        configuration.</li>
        <li>The value <tt>user.language</tt> may display the value English, depending on your
        configuration.</li></ul>
        
        </li>
        
        <li>Play with the sample:
        
        <ul>
        
        <li><b>Show the property sheet.</b> Right-click a subnode and choose Properties. 
         The property sheet is displayed with a single Properties tab, 
        containing two properties. The first property is labeled Name and
        it gives the same name as the node (key), while the other is labeled Value and
        displays the string value of the property.</li>
        
        <li><b>Rename a property.</b> Click on a subnode and then click it again. This lets you rename a key in
        place, while keeping the same value. Alternatively, click
        on the Name property in the property sheet, or right-click a subnode and choose Rename.</li>
        
        <li><b>Change a value.</b> Click on the Value tab in the property sheet and type in a new value. This
         resets the system property to the entered value.</li>
        
         <li><b>Add a property.</b> Right click the main System Properties node and choose Add System Property. This lets you add a new system property
         to the list.</li>
        
         <li><b>Delete a property.</b> Select a property and press Delete. This removes the property.</li>
        
             <li><b>Refresh the list.</b> Right click the main System Properties node and choose Refresh. This prompts the module
         to recheck the values, refreshing the list as needed.</li>
        
        </ul></li>
        
            </ol>
        
        <h3 class="tutorial"><a name="introducing-sources"></a>Introducing the Sources</h3>
        
        <p>The System Properties sample consists of main files and supporting files.</p>
        
        
        <ul>
            
            <li><p><b>Main Files.</b> The module's main
                    files are its Java classes.</p>
                <p>The Java classes are introduced in alphabetical order below:</p>
        
            <table width="76%" border="1">
        
            <tbody><tr>
              <td>
                <div><b>File</b></div>
              </td>
              <td>
                <div><b>Description</b></div>
        
              </td>
            </tr>
            <tr>
              <td valign="top"><tt>AllPropsChildFactory.java</tt></td>
              <td>
        
        This children object is responsible for keeping track of the list of nodes underneath
        the System Properties node. When first asked for the list, it retrieves all system
        properties and asks the node implementation to keep track of all the system
        property names. The interface for doing this is a class called Children.
        
        
        </td>
            </tr>
            <tr>
              <td valign="top"><tt>AllPropsNode.java</tt></td>
        
              <td>
        This node specifies what children will be under it, and asks to use
        AllPropsChildFactory to keep track of the list of child nodes. The module takes care
        of things such as its context menu.
              </td>
            </tr>
        
            <tr>
              <td valign="top"><tt>OnePropNode.java</tt></td>
              <td>
        
        This is the node representing a single property, and is an AbstractNode. Its
        constructor requires that the user supply the key, in the form of a string. For every
        system property name, OnePropNode is used to display it. When the user expands
        the system properties node, it builds a list of keys, then creates a corresponding
        number of OnePropNodes. Each OnePropNode displays a single key, and does not
        directly interact with its parent node -- its knowledge is limited to a single system
        property and how to deal with it, as well as notifying the PropertiesNotifier
        if there are any changes.This design makes it easier to reuse such nodes, including
        placing them in other contexts.
        
        
        
        </td>
            </tr>
            <tr>
              <td valign="top"><tt>PropertiesNotifier.java</tt></td>
              <td>
        Manages routing events whenever there are changes, including adding, deleting,
        or renaming a property, or when a property value has changed.
        </td>
            </tr>
         <tr>
              <td valign="top"><tt>RefreshPropsAction.java</tt></td>
              <td>
        This action appears in the pop-up menu under System Properties with the label Refresh.
        It forces a refresh to occur, updating the display of information based
        on the current state of system properties.
        
        
        
        </td>
        
            </tr>
            </tbody>
          </table>
            </li>
        
        <li><p><b>Supporting Files.</b> The module's supporting files are
                in the <tt>org.myorg.systemproperties</tt> package and
                in the Important Files node.</p>
        
            <p>The supporting files in the <tt>org.myorg.systemproperties</tt> package are introduced in alphabetical order below:</p>
        
         <table width="76%" border="1">
        
            <tbody><tr>
              <td>
                <div><b>File</b></div>
              </td>
              <td>
                <div><b>Description</b></div>
        
              </td>
            </tr>
            <tr>
              <td valign="top"><tt>allPropsIcon.gif</tt></td>
              <td>Icon for the System Properties node.</td>
            </tr>
            <tr>
                    <td valign="top"><tt>Bundle.properties</tt></td>
        
              <td>
        This is a standard Java properties file, which uses the syntax <tt>Key=Value</tt>. Keys are
        code names for things that appear in the source code, with values designating those
        things which will be displayed to the user.
        This file is useful for localization. For example, by creating a properties file such
        as <tt>Bundle_ja.properties</tt>, and filling all the values with Japanese, this module will automatically display
        everything in Japanese, if the
        user is running the IDE in Japanese mode.
        
              
              </td>
        
            </tr>
        
            <tr>
                    <td valign="top"><tt>onePropIcon.gif</tt></td>
        
              <td>
                Icon for subnodes.
              </td>
        
            </tr>
        
            </tbody>
          </table>
        
        <p>The files in the Important Files node are 
            introduced in the order in which they appear in the Projects window:</p>
        
          <table width="76%" border="1">
        
            <tbody><tr>
              <td>
                <div><b>File</b></div>
              </td>
              <td>
                <div><b>Description</b></div>
        
              </td>
            </tr>
            <tr>
              <td valign="top">Module Manifest</td>
              <td>Declares project as module.</td>
            </tr>
            <tr>
              <td valign="top">Build Script</td>
        
              <td>
               Contains Ant targets for building the project.
              </td>
            </tr>
            <tr>
                    <td valign="top">Project Metadata</td>
        
              <td>
                Contains project metadata, such as dependencies, for project.
              </td>
        
            </tr>
            <tr>
              <td valign="top">Project Properties</td>
              <td>Contains project properties.</td>
            </tr>
            <tr>
              <td valign="top">NetBeans Platform Config</td>
              <td>Contains platform properties.</td>
        
            </tr>
            <tr>
              <td valign="top">Per-user NetBeans Platform Config</td>
              <td>Contains user-specific properties.</td>
        
            </tr>
            </tbody>
          </table>
        
        </li>
        
        </ul>
        
        </div>
        -->
        <!-- ===================================================================================== -->
        <h2><a name="settingupthemoduleproject"></a>Setting Up the Module Project</h2>
        <p>Before you start writing the module, set up its structure
            and dependencies correctly. NetBeans IDE provides a wizard and dialogs
            that set up all the basic files
            and configurations needed for a module.</p>
        <div class="indent">

            <h3 class="tutorial"><a name="creatingthemoduleproject"></a>Creating the Module Project</h3>

            <p>In this section, we use the New Module wizard to create the source structure needed by all
                module projects.</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>SystemProperties</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.myorg.systemproperties</tt>
                    in Code Name Base. Click Finish.</li>
            </ol>

            <p> The IDE creates the <tt>System Properties</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>

            <h3 class="tutorial"><a name="specifying"></a>Specifying the Module's Dependencies</h3>

            <p>Later, you will need to subclass several classes that belong to NetBeans APIs. 
                Each NetBeans API, provided by a module, has to be declared as a module dependency. 
                Use the Project Properties dialog box for this purpose, as explained below.</p>

            <ol>

                <li><p>In the Projects window, right-click the <tt>System Properties</tt> project and choose Properties.
                        In the Project Properties dialog box, click Libraries and then click Add... Start typing 'CallableSystemAction',
                        which is one of the NetBeans API classes you will need later. As you type, notice that the filter narrows,
                        displaying only those modules that can provide the class that you are typing.</p></li>

                <li><p>For each of the following APIs, click "Add..." in the Libraries panel, 
                    select the name from the Module list, and then click OK to confirm it:</p>

                    <ul>
                        <li><tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-actions/overview-summary.html">Actions API</a></tt></li>
                        <li><tt><a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-core-ide/overview-summary.html">Core IDE</a></tt> (click "Show Non-API Modules" to see it)</li>
                        <li><tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-dialogs/overview-summary.html">Dialogs API</a></tt></li>
                        <li><tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-util-lookup/overview-summary.html">Lookup API</a></tt></li>
                        <li><tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-nodes/overview-summary.html">Nodes API</a></tt></li>
                        <li><tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-util/overview-summary.html">Utilities API</a></tt></li>
                        <li><tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-windows/overview-summary.html">Window System API</a></tt></li>
                    </ul>

                    <p>Click OK to exit the Project Properties dialog box.</p></li>

                <li>In the Projects window, expand the Important Files node
                    and double-click "Project Metadata". The <tt>project.xml</tt>
                    file opens. Note that the modules you selected have been
                    declared as dependencies.</li>

            </ol>

        </div>

        <!-- ===================================================================================== -->
        <h2><a name="creatingandgettingtoknowthemainfiles"></a>Creating the Main Files</h2>

        <p>The functionality of a NetBeans module is provided by its Java classes. In this section,
            you will create and examine each of them:</p>

        <ul>
            <li><tt>AllPropsNode.java</tt></li>
            <li><tt>PropertiesNotifier.java</tt></li>
            <li><tt>AllPropsChildFactory.java</tt></li>
            <li><tt>OnePropNode.java</tt></li>
            <li><tt>RefreshPropsAction.java</tt></li>
        </ul>	

        <div class="indent">

            <h3 class="tutorial"><a name="AllPropsNode"></a>AllPropsNode.java</h3>

            <p>This Java class specifies the definition of the main node. The definition includes
                a display name, as well as a definition of the children that will be under the main node. The definition
                of the children is provided by the
                <tt>AllPropsChildFactory</tt> class, which keeps track of the list of child nodes. The class also takes care
                of things such as the main node's context menu.</p>

            <p>Via the <a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-core-ide/org/netbeans/api/core/ide/ServicesTabNodeRegistration.html">@ServicesTabNodeRegistration</a> annotation, the node
                is registered as a new node within the Services window.</p>

            <p>Do the following:</p>

            <ol>

                <li><b>Create the file.</b> Right-click the <tt>org.myorg.systemproperties</tt> node and choose New &gt; Other. Under
                    Categories, choose Java Classes. Under File Types, choose Java Class. 
                    Click Next and type <tt>AllPropsNode</tt> in Class Name. Click Finish. The new Java class opens in the Source Editor.
                    Replace the default code with the following:

                    <pre class="examplecode">import java.io.IOException;
import javax.swing.Action;
import org.netbeans.api.core.ide.ServicesTabNodeRegistration;
import org.openide.DialogDisplayer;
import org.openide.NotifyDescriptor;
import org.openide.actions.NewAction;
import org.openide.actions.OpenLocalExplorerAction;
import org.openide.actions.PropertiesAction;
import org.openide.actions.ToolsAction;
import org.openide.nodes.AbstractNode;
import org.openide.nodes.Children;
import org.openide.nodes.Node;
import org.openide.util.HelpCtx;
import org.openide.util.NbBundle.Messages;
import org.openide.util.actions.SystemAction;
import org.openide.util.datatransfer.NewType;

@ServicesTabNodeRegistration(name = "AllPropsNode",
displayName = "#LBL_AllPropsNode",
shortDescription = "#HINT_AllPropsNode",
iconResource = "org/myorg/systemproperties/allPropsIcon.gif",
position = 2021)
@Messages({
    "LBL_AllPropsNode=System Properties",
    "HINT_AllPropsNode=Shows all currently set system properties."
})
public class AllPropsNode extends AbstractNode {

    public AllPropsNode() {
        super(Children.create(new AllPropsChildFactory(), false));
        setDisplayName(Bundle.LBL_AllPropsNode());
        setShortDescription(Bundle.HINT_AllPropsNode());
        setIconBaseWithExtension("org/myorg/systemproperties/allPropsIcon.gif");
    }

    @Override
    public Action[] getActions(boolean context) {
        Action[] result = new Action[]{
            new RefreshPropsAction(),
            null,
            SystemAction.get(OpenLocalExplorerAction.class),
            null,
            SystemAction.get(NewAction.class),
            null,
            SystemAction.get(ToolsAction.class),
            SystemAction.get(PropertiesAction.class),};
        return result;
    }

    @Override
    public HelpCtx getHelpCtx() {
        return HelpCtx.DEFAULT_HELP;
    }

    @Override
    public Node cloneNode() {
        return new AllPropsNode();
    }

    @Messages({
        "LBL_NewProp=System Property",
        "LBL_NewProp_dialog=Create New Property",
        "MSG_NewProp_dialog_key=New property name:",
        "MSG_NewProp_dialog_value=New property value:"})
    @Override
    public NewType[] getNewTypes() {
        return new NewType[]{
            new NewType() {
                @Override
                public String getName() {
                    return Bundle.LBL_NewProp();
                }
                @Override
                public void create() throws IOException {
                    NotifyDescriptor.InputLine msg = new NotifyDescriptor.InputLine(Bundle.LBL_NewProp_dialog(), Bundle.MSG_NewProp_dialog_key());
                    DialogDisplayer.getDefault().notify(msg);
                    String key = msg.getInputText();
                    if ("".equals(key)) {
                        return;
                    }
                    msg = new NotifyDescriptor.InputLine(Bundle.MSG_NewProp_dialog_value(), Bundle.MSG_NewProp_dialog_key());
                    DialogDisplayer.getDefault().notify(msg);
                    String value = msg.getInputText();
                    System.setProperty(key, value);
                    PropertiesNotifier.changed();
                }
            }
        };
    }
    
}</pre>

                </li>

                <li><b>Understand the file.</b> Here is an explanation of the class:

                    <ul>

                        <li><b><tt>public class AllPropsNode extends <a href="https://netbeans.org/download/dev/javadoc/org-openide-nodes/org/openide/nodes/AbstractNode.html">AbstractNode</a></tt>.</b> <tt>AbstractNode</tt> is a generic Node subclass. <tt><a href="http://www.netbeans.org/download/dev/javadoc/org-openide-nodes/org/openide/nodes/Node.html">Node</a></tt> is the abstract
                            class, <tt>AbstractNode</tt> is the common implementation that can be customized.</li>

                        <li><b>Constructor:</b>

                            <ul>
                                <li><b><tt>public AllPropsNode</tt>.</b> In creating this node, it first calls super -- the <a href="https://netbeans.org/download/dev/javadoc/org-openide-nodes/org/openide/nodes/AbstractNode.html#AbstractNode(org.openide.nodes.Children)">constructor
                                        for the super class (AbstractNode)</a>. This creates the infrastructure for
                                    AbstractNode, and shows that it is mandatory to supply a child object for its
                                    use. This object represents the list of children of the node, creating a separate class
                                    for clarity: AllPropsChildFactory.
                                    <ul>
                                        <li><b><tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-nodes/org/openide/nodes/AbstractNode.html#setIconBaseWithExtension%28java.lang.String%29">setIconBaseWithExtension</a></tt>.</b> Designates the location for the associated icon.</li>
                                        <li><b><tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-nodes/org/openide/nodes/Node.html#setDisplayName(java.lang.String)">setDisplayName</a></tt>.</b> Sets the name the user sees. This defaults to the internal name,
                                            but it is better to set it to something localized.</li>
                                        <li><b><tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-nodes/org/openide/nodes/Node.html#setShortDescription(java.lang.String)">setShortDescription</a></tt>.</b> Sets the associated tool tip. This is the override to specify
                                            what goes into the node context menu. </li>
                                    </ul></li></ul></li>

                        <li><b>Methods:</b>

                            <ul>

                                <!-- 1 -->
                                <li><b><tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-nodes/org/openide/nodes/Node.html#getActions(boolean)">getActions</a></tt>.</b> The following is a list of actions to be
                                    displayed in the menu, with separators between the menu items. The following
                                    methods are used:

                                    <ul>

                                        <li><tt>RefreshPropsAction</tt> is an action defined in another source file</li>

                                        <li><tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-actions/org/openide/actions/NewAction.html">NewAction</a></tt> enables the creation of a new subnode or key-value pair</li>

                                        <li><tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-actions/org/openide/actions/OpenLocalExplorerAction.html">OpenLocalExplorerAction</a></tt> permits the user to make a new Explorer window
                                            showing only system properties</li>

                                    </ul>

                                    <p>Both <tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-actions/org/openide/actions/ToolsAction.html">ToolsAction</a></tt> and <tt><a href="http://www.netbeans.org/download/dev/javadoc/org-openide-actions/org/openide/actions/PropertiesAction.html">PropertiesAction</a></tt> are standard actions that most nodes
                                        should have.</p></li>

                                <!-- 2 -->
                                <li><b><tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-nodes/org/openide/nodes/AbstractNode.html#getHelpCtx()">getHelpCtx</a></tt>.</b> Supplies an IDE key for the context help. When building context help
                                    for this Module, this is how you would associate a specific node with a
                                    specific help string.</li>

                                <!-- 3 -->
                                <li><b><tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-nodes/org/openide/nodes/AbstractNode.html#cloneNode()">cloneNode</a></tt>.</b> Creates a new copy of the node that enables other parts of the IDE to
                                    display a separate copy of the System Properties list, other than the Services window.
                                    This is more efficient than the fallback implementation, which is to delegate to the
                                    original.</li>

                                <!-- 3 -->
                                <li><b><tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-nodes/org/openide/nodes/AbstractNode.html#getNewTypes()">getNewTypes</a></tt>.</b> Returns a list of <tt><a href="http://www.netbeans.org/download/dev/javadoc/org-openide-util/org/openide/util/datatransfer/NewType.html">NewType</a></tt> objects. When
                                    there is a <tt>NewAction</tt> in the context menu, the action displays menu items
                                    corresponding to each of the <tt>NewTypes</tt> in the node. The action provides the actual
                                    GUI, such as showing a submenu. You specify abstract definitions
                                    and make the new objects. In this example, only one <tt>NewType</tt> is returned,
                                    since there is only one type of thing that can reasonably be created (a new system
                                    property); however, more than one <tt>NewType</tt> could be returned, and they would be
                                    displayed in a submenu.</li>

                                <li><b><tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-util/org/openide/util/datatransfer/NewType.html#create()">create</a></tt>.</b> Creates the new object. In this example, there
                                    will be dialog boxes for the key-in values.</li>

                                <li><b><tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-dialogs/org/openide/NotifyDescriptor.InputLine.html">NotifyDescriptor.InputLine</a></tt>.</b> The description of a small dialog with a single
                                    text entry field pop up, a title for the dialog, and a message.</li>

                                <li><b><tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-dialogs/org/openide/DialogDisplayer.html#notify(org.openide.NotifyDescriptor)">DialogDisplayer.getDefault().notify(desc)</a></tt>.</b> Displays all this in a pop-up dialog.</li>

                                <li><b><tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-dialogs/org/openide/NotifyDescriptor.InputLine.html#getInputText()">getInputText</a></tt>.</b> Retrieves the user input for the key.

                                    <p>The same is done for the value, again using <tt>DialogDisplayer.getDefault</tt> and
                                        <tt>getInputText</tt>.</p>

                                    <p>Next, <tt>System.setProperty</tt>, from the Java API, is called to set the system
                                        property.</p>

                                    <p>Finally, another class, <tt>PropertiesNotifier.changed</tt> (created next), is called to indicate
                                        to other classes and Module components that something about the current set of
                                        system properties has changed and updates are required. For example, there may
                                        be a new property, or an existing value may have changed.</p></li>

                            </ul></li>
                    </ul></li>
            </ol>

            <h3 class="tutorial"><a name="PropertiesNotifier"></a>PropertiesNotifier.java</h3>

            <p>This Java class manages routing events whenever there are changes, including adding, deleting,
                or renaming a property, or when a property value has changed. You could also see it as a helper routine, very similar 
                to a JavaBeans component
                that has an event set attached to it. However, it is not strictly a JavaBeans component -- there
                are no instances of this class -- but its static methods are used like JavaBeans
                instance methods. Use is made of the <a href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/ChangeSupport.html">ChangeSupport</a>
                class from the NetBeans APIs, which is an equivalent of <tt>PropertyChangeSupport</tt> for <tt>ChangeListeners</tt>.</p>

            <ol>
                <li><b>Create the file.</b> Right-click the <tt>org.myorg.systemproperties</tt> node, choose New &gt; Java Class,
                    and type <tt>PropertiesNotifier</tt> in Class Name. Click Finish. The new Java class opens in the Source Editor.
                    Replace the default code with the following:

                    <pre class="examplecode">import javax.swing.event.ChangeListener;
import org.openide.util.ChangeSupport;

public class PropertiesNotifier {

    private static final ChangeSupport cs = new ChangeSupport(PropertiesNotifier.class);

    public static void addChangeListener(ChangeListener listener) {
        cs.addChangeListener(listener);
    }

    public static void removeChangeListener(ChangeListener listener) {
        cs.removeChangeListener(listener);
    }

    public static void changed() {
        cs.fireChange();
    }
    
}</pre>

                </li>

                <li><b>Understand the file.</b> The methods defined for this class are as follows:

                    <ul>

                        <li><b><tt><a name="PropertiesNotifierchanged" id="PropertiesNotifierchanged"></a>changed</tt>.</b> Fires an event to those processes that are listening. Every component that
                            displays information based on a system property must listen for these events and
                            update their displays as needed.</li>

                        <li><b><tt>addChangeListener</tt></b> and <b><tt>removeChangeListener</tt>.</b> Lets components register
                            themselves as listeners for these events. Processes which have displayed state can
                            add a <tt>ChangeListener</tt> to this class. To ensure proper updates, processes that
                            affect the state call <tt>changed</tt>.</li>

                    </ul></li>

            </ol>

            <h3 class="tutorial"><a name="AllPropsChildFactory"></a>AllPropsChildFactory.java</h3>

            <p>This Java class is responsible for keeping track of the list of nodes underneath
                the main node. When first asked for the list, the class retrieves all system
                properties and asks the node implementation to keep track of all the system
                property names. The abstract class doing this is
                called <tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-nodes/org/openide/nodes/Children.html">Children</a></tt>.</p>

            <p>In this example, a popular children implementation called <tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-nodes/org/openide/nodes/ChildFactory.Detachable.html">ChildFactory</a></tt> is used.
                By subclassing <tt>ChildFactory</tt>, you need not explicitly keep track of
                the nodes -- this implementation does that. Instead, you keep track
                of a set of keys, which are lighter weight objects. Each key typically represents one
                node. You must tell the implementation how to create a
                node for each key. You can decide for yourself what type of keys to
                use.</p>

            <p>In this example, the keys are names of system properties.</p>

            <ol>
                <li><b>Create the file.</b> Right-click the <tt>org.myorg.systemproperties</tt> node, choose New &gt; Java Class,
                    and type <tt>AllPropsChildFactory</tt> in Class Name. Click Finish. The new Java class opens in the Source Editor.
                    Replace the default code with the following code:

                    <pre class="examplecode">import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.openide.nodes.ChildFactory;
import org.openide.nodes.Node;

public class AllPropsChildFactory extends ChildFactory.Detachable&lt;String&gt; {

    private ChangeListener listener;

    @Override
    protected void addNotify() {
        PropertiesNotifier.addChangeListener(listener = new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent ev) {
                refresh(true);
            }
        });
    }

    @Override
    protected void removeNotify() {
        if (listener != null) {
            PropertiesNotifier.removeChangeListener(listener);
            listener = null;
        }
    }

    @Override
    protected Node createNodeForKey(String key) {
        return new OnePropNode(key);
    }

    @Override
    protected boolean createKeys(List&lt;String&gt; toPopulate) {
        List&lt;String&gt; keys = new ArrayList&lt;String&gt;();
        for (Object prop : System.getProperties().keySet()) {
            keys.add((String) prop);
        }
        Collections.sort(keys);
        toPopulate.addAll(keys);
        return true;
    }

}</pre>

                </li>

                <li><b>Understand the file.</b> The important methods that should be defined when implementing
                    <tt>ChildFactory</tt> include:

                    <ul><li><b><tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-nodes/org/openide/nodes/ChildFactory.Detachable.html#addNotify%28%29">addNotify</a></tt>.</b> Called the first time that a list of
                            nodes is needed by the platform. An example of this is when the System Properties node
                            is expanded. When <tt>addNotify</tt> is called, it calls the helper method <tt>refreshList</tt>
                            to determine the keys, then it registers itself with the <tt>PropertiesNotifier</tt>,
                            requesting notification of any system property changes. If there is such a change,
                            the list will be refreshed.</li>
                        <li><b><tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-nodes/org/openide/nodes/ChildFactory.Detachable.html#removeNotify%28%29">removeNotify</a></tt>.</b> Called when the user collapses a System Properties node and
                            starts working on something else. The platform will notice that the list of nodes is
                            no longer needed, and it will free up the memory that is no longer being used.
                            Note that momentarily collapsing the node will not trigger this call. When
                            <tt>removeNotify</tt> is called, it removes the listener, as it is no longer interested in
                            receiving notifications. In addition, <tt>refresh</tt> is called. This method
                            is defined by <tt>ChildFactory</tt> for use by the subclasses.</li>
                        <li><b><tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-nodes/org/openide/nodes/ChildFactory.html#createKeys%28java.util.List%29">createKeys</a></tt>.</b> The <tt>System.getProperties</tt> call retrieves all of the properties
                            currently defined in the system. This call goes through all of the property names,
                            keeping and sorting this list. When <tt>true</tt> is returned,
                            every item found in the <tt>toPopulate</tt> list is 
                            automatically passed to <tt>createNodeForKey</tt>, where the
                            subnodes are created, one per system property, sorted by property name.</li>
                        <li><b><tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-nodes/org/openide/nodes/ChildFactory.html#createNodeForKey%28T%29">createNodeForKey</a></tt>.</b> Called by the implementation whenever it needs to construct a
                            child node. It is passed the key for which it is making a node. It returns either none,
                            one, or more nodes corresponding to what should be displayed for the key. In this
                            example, a new instance of one property node is being created, and the system
                            property name is passed into its constructor.</li></ul></li>

            </ol>

            <h3 class="tutorial"><a name="OnePropNode"></a>OnePropNode.java</h3>

            <p>This Java class provides the <tt>AbstractNode</tt> implementation for a single property. 
                Its constructor requires a string key. This class displays a single system property name. When the user expands
                the system properties node, it builds a list of keys, then creates a corresponding
                number of <tt>OnePropNodes</tt>. Each <tt>OnePropNode</tt> displays a single key, and does not
                directly interact with its parent node -- its knowledge is limited to a single system
                property and how to deal with it, as well as notifying the <tt>PropertiesNotifier</tt>
                if there are any changes. This design makes it easier to reuse such nodes, including
                placing them in other contexts.</p>

            <ol>
                <li><b>Create the file.</b> Right-click the <tt>org.myorg.systemproperties</tt> node, choose New &gt; Java Class,
                    and type <tt>OnePropNode</tt> in Class Name. Click Finish. The new Java class opens in the Source Editor.
                    Replace the default code with the following:

                    <pre class="examplecode">import java.io.IOException;
import java.util.Properties;
import javax.swing.Action;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.openide.actions.DeleteAction;
import org.openide.actions.PropertiesAction;
import org.openide.actions.RenameAction;
import org.openide.actions.ToolsAction;
import org.openide.nodes.AbstractNode;
import org.openide.nodes.Children;
import org.openide.nodes.Node;
import org.openide.nodes.PropertySupport;
import org.openide.nodes.Sheet;
import org.openide.util.NbBundle.Messages;
import org.openide.util.actions.SystemAction;

public class OnePropNode extends AbstractNode {

    private String key;
    private ChangeListener listener;

    @Messages("HINT_OnePropNode=Represents one system property.")
    public OnePropNode(String key) {
        super(Children.LEAF);
        this.key = key;
        setIconBaseWithExtension("org/myorg/systemproperties/onePropIcon.gif");
        super.setName(key);
        setShortDescription(Bundle.HINT_OnePropNode());
    }

    @Override
    public Action[] getActions(boolean context) {
        Action[] result = new Action[]{
            SystemAction.get(DeleteAction.class),
            SystemAction.get(RenameAction.class),
            null,
            SystemAction.get(ToolsAction.class),
            SystemAction.get(PropertiesAction.class),};
        return result;
    }

    @Override
    public Action getPreferredAction() {
        return SystemAction.get(PropertiesAction.class);
    }

    @Override
    public Node cloneNode() {
        return new OnePropNode(key);
    }

    @Messages({"PROP_value=Value","HINT_value=Value of this system property."})
    @Override
    protected Sheet createSheet() {
        Sheet sheet = super.createSheet();
        Sheet.Set props = sheet.get(Sheet.PROPERTIES);
        if (props == null) {
            props = Sheet.createPropertiesSet();
            sheet.put(props);
        }
        props.put(new PropertySupport.Name(this));
        class ValueProp extends PropertySupport.ReadWrite {
            public ValueProp() {
                super("value", String.class, Bundle.PROP_value(), Bundle.HINT_value());
            }
            @Override
            public Object getValue() {
                return System.getProperty(key);
            }
            @Override
            public void setValue(Object nue) {
                System.setProperty(key, (String) nue);
                PropertiesNotifier.changed();
            }
        }
        props.put(new ValueProp());
        PropertiesNotifier.addChangeListener(listener = new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent ev) {
                firePropertyChange("value", null, null);
            }
        });
        return sheet;
    }

    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        if (listener != null) {
            PropertiesNotifier.removeChangeListener(listener);
        }
    }

    @Override
    public boolean canRename() {
        return true;
    }

    @Override
    public void setName(String nue) {
        Properties p = System.getProperties();
        String value = p.getProperty(key);
        p.remove(key);
        if (value != null) {
            p.setProperty(nue, value);
        }
        System.setProperties(p);
        PropertiesNotifier.changed();
    }

    @Override
    public boolean canDestroy() {
        return true;
    }

    @Override
    public void destroy() throws IOException {
        Properties p = System.getProperties();
        p.remove(key);
        System.setProperties(p);
        PropertiesNotifier.changed();
    }
    
}</pre>

                </li>

                <li><b>Understand the file.</b> Here is an explanation of the class:

                    <ol>

                        <li><b><tt>public class OnePropNode extends AbstractNode</tt>.</b> <tt>AbstractNode</tt> is a generic Node subclass. <tt>Node</tt> is the abstract
                            class, <tt>AbstractNode</tt> is the common implementation that can be customized.</li>

                        <li><b>Constructor:</b>

                            <ul>

                                <li><b><tt>super(<a href="https://netbeans.org/download/dev/javadoc/org-openide-nodes/org/openide/nodes/Children.html#LEAF">Children.LEAF</a>)</tt>.</b> Tells the node�s hierarchy that this
                                    is a leaf node that will not need to be expanded and will not have any children. It
                                    then stores the key and sets the icon.</li>

                                <li><b><tt>super.<a href="https://netbeans.org/download/dev/javadoc/org-openide-nodes/org/openide/nodes/AbstractNode.html#setName(java.lang.String)">setName(key)</a></tt>.</b>  Sets the name of the key. The inherited version is used,
                                    to set the node name (it does not attempt to rename the actual property).</li>

                                <li><b><tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-nodes/org/openide/nodes/Node.html#setShortDescription(java.lang.String)">setShortDescription</a></tt>.</b> Sets the associated tool tip. This is the override to specify
                                    what goes into the node context menu. </li>

                            </ul></li>

                        <li><b>Methods:</b>

                            <ul>

                                <li><b><tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-nodes/org/openide/nodes/AbstractNode.html#getPreferredAction%28%29">getPreferredAction</a></tt>.</b> Sets what is run by default if the node is double clicked or
                                    similar user actions are performed. In this example, the default action is to pop up
                                    the property sheet. </li>

                                <li><b><tt>createSheet</tt>.</b> Configures the look of
                                    the property sheet. This creates the list of tabs in the property sheet, along with the
                                    list of properties. <tt>createSheet</tt> is not called until there is a need to display the list
                                    of properties.

                                    <ul>

                                        <li><b><tt>super.<a href="https://netbeans.org/download/dev/javadoc/org-openide-nodes/org/openide/nodes/AbstractNode.html#createSheet()">createSheet</a></tt>.</b> Ensures there is a sheet to start with.</li>

                                        <li><b><tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-nodes/org/openide/nodes/Sheet.html#get(java.lang.String)">sheet.get (Sheet.PROPERTIES)</a></tt>.</b> Checks to see if there is a tab named
                                            <tt>Properties</tt>. If not, <tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-nodes/org/openide/nodes/Sheet.html#createPropertiesSet()">Sheet.createPropertiesSet</a></tt> makes one. Note that <tt><a href="http://www.netbeans.org/download/dev/javadoc/org-openide-nodes/org/openide/nodes/Sheet.html">Sheet</a></tt>
                                            refers to the entire set of properties for the node, and <tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-nodes/org/openide/nodes/Sheet.Set.html">Sheet.Set</a></tt> is one tab in the
                                            property sheet.</li>

                                        <li><b><tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-nodes/org/openide/nodes/PropertySupport.Name.html">PropertySupport.Name</a></tt>.</b> Creates a <tt>Name</tt> property that reflects
                                            the name of the node. The code is already synchronizing the node name with the
                                            system property name.</li>

                                        <li><b><tt>ValueProp</tt>.</b> Is an inner class, a custom property that is created for this example.
                                            <tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-nodes/org/openide/nodes/PropertySupport.ReadWrite.html">PropertySupport.ReadWrite</a></tt> is the base class for entering and viewing values.
                                            The super call provides a code name for the property as well as a display name and
                                            a tool tip for the user.

                                            <ul>
                                                <li><b><tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-nodes/org/openide/nodes/Node.Property.html#getValue()">getValue</a></tt>.</b> Looks up the system property.</li>
                                                <li><b><tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-nodes/org/openide/nodes/Node.Property.html#setValue(java.lang.Object)">setValue</a></tt>.</b> Sets a new value for the
                                                    system property and notifies other processes that the value has changed.</li>
                                            </ul>

                                            <p>The property is added to the property sheet, along with a <tt>ChangeListener</tt>, which
                                                listens for changes in system properties, which may mean that this specific property
                                                has changed. If true, then the <tt>firePropertyChange</tt> node fires a change to say that
                                                one of the properties in its property sheet is no longer valid, and checks and updates
                                                should be made accordingly. Note that the name of the property is value, which
                                                matches the internal name assigned when creating <tt>ValueProp</tt>.</p></li>

                                    </ul></li>

                                <li><b><tt>finalize</tt>.</b> Called when the class is destroyed -- whenever this node
                                    is destroyed, the <tt>ChangeListener</tt> is removed.</li>

                                <li><b><tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-nodes/org/openide/nodes/AbstractNode.html#canRename()">canRename</a></tt>.</b> Returns <tt>true</tt>, allowing the node to be renamed.</li>

                                <li><b><tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-nodes/org/openide/nodes/AbstractNode.html#setName(java.lang.String)">setName</a></tt>.</b> Called when the node is renamed, such as from the rename action, an inplace
                                    rename from the Explorer, or from the Name property in the property sheet.
                                    This action retrieves all system properties and associated values, removes the key,
                                    adds a new property with a new name and value, and sets the system properties.
                                    This action also notifies all concerned that it has changed, though it does not directly
                                    rename itself (see <tt>AllPropsChildFactory</tt> next).</li>

                                <li><b><tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-nodes/org/openide/nodes/AbstractNode.html#canDestroy()">canDestroy</a></tt>.</b> Gives permission to delete this node.</li>

                                <li><b><tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-nodes/org/openide/nodes/Node.html#destroy()">destroy</a>.</tt></b> Retrieves system properties, removes its key, sets
                                    properties back, and notifies all concerned of changes. Note that this <tt>destroy</tt>
                                    method does not remove the node -- it only removes the system property and
                                    notifies interested parties that this property is gone. The node is actually removed
                                    later, by <tt>AllPropsChildFactory</tt>. <tt>AllPropsChildFactory</tt> realizes this property no longer
                                    exists, and creates a new set of keys that no longer includes this property. Then the
                                    <tt>ChildFactory</tt> implementation automatically removes that node. This is done to
                                    reflect the actual state of the system.</li>
                            </ul>
                        </li></ol></ol>

            <h3 class="tutorial"><a name="RefreshPropsAction"></a>RefreshPropsAction.java</h3>

            <p>This Java class provides the "Refresh" action that appears in the pop-up menu under the "System Properties" main node.
                It forces a refresh to occur, updating the display of information based
                on the current state of system properties. It is a plain <tt>AbstractAction</tt> and is
                always enabled, yet is not sensitive to what is selected. In principle, it could also be placed
                as a button in a toolbar.</p>
            <div class="indent">
                <ol>
                    <li><b>Create the file.</b> Right-click the <tt>org.myorg.systemproperties</tt> node, choose New &gt; Java Class,
                        and type <tt>RefreshPropsAction</tt> in Class Name. Click Finish. The new Java class opens in the Source Editor.
                        Replace the default code with the following:

                        <pre class="examplecode">import org.openide.util.NbBundle.Messages;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;

public class RefreshPropsAction extends AbstractAction {

    @Messages("LBL_RefreshProps=Refresh")
    public RefreshPropsAction() {
        super(Bundle.LBL_RefreshProps());
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        PropertiesNotifier.changed();
    }
    
}</pre>        

                    </li>

                    <li><b>Understand the file.</b> When the action is invoked, the standard JDK <tt>actionPerformed</tt> method is called:
                        <ul><li><b><tt>actionPerformed</tt>.</b> Calls <tt><a href="#PropertiesNotifierchanged">PropertiesNotifier.changed</a></tt> to indicate to other classes 
                                and Module components that something about the current set of system properties has changed and 
                                updates are required. For example, a new property may have been added or an existing value may have been changed.</li></ul>
                    </li>
                </ol>
            </div>
            </li>
            </ol>
        </div>
        <!-- ===================================================================================== -->

        <h2><a name="finetuning"></a>Setting Up the Supporting Files</h2>
        <p>Once you have coded the main files, you must include the icons you'd like to use. For the icons used to display the nodes, you can use any 16x16 pixel icons you want, so long as they are
            named <tt>allPropsIcon.gif</tt> and <tt>onePropIcon.gif</tt>, which
            is what they are named in the code above.</p> 
        <p>Alternatively, use the icons below:</p>
        <p><img style="border:1px solid black" src="../images/tutorials/sysprops/allPropsIcon.gif" alt="System Properties module."/></p></li>
        <p><img style="border:1px solid black" src="../images/tutorials/sysprops/onePropIcon.gif" alt="System Properties module."/></p></li>
        <p>Note that the <tt>setIconBaseWithExtension</tt> statements in the constructors of <tt>AllPropsNode.java</tt> and <tt>OnePropNode.java</tt>
            set the location of the icons.</p>

        <!-- ======================================================================================= -->

        <h2><a name="building"></a>Building and Installing the Module</h2>
        <p>Now that you have completed your module, it is time to try it out.
            The IDE uses an Ant build script to build and install your module. The build script was created for you
            when you created the module project.</p>
        <div class="indent">
            <ol>
                <li><p>In the Projects window, right-click the <tt>System Properties</tt> project and choose Install/Reload
                        in Target Platform.</p> 
                    <p>The module is built and installed in the target IDE or Platform. The target IDE or Platform opens so that you
                        can try out your new Module. The default target IDE or Platform is the 
                        installation used by the current instance of the development IDE. Note that when you run your Module, you will be using 
                        a temporary test user directory, not the development IDE's user directory. </p></li>
                <li><p>In the IDE's Services window (Ctrl-5), you should see the new node, together with its many subnodes:</p>

                    <p><img style="border:1px solid black" src="../images/tutorials/sysprops/nbm-sysprops-70-2.png" alt="System Properties module."/></p></li>

            </ol>
        </div>

        <!-- ======================================================================================== -->

        <h2><a name="nextsteps"></a>Next Steps</h2>

        <p>For more information about creating and developing NetBeans Module, 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>

        <div class="feedback-box"><a href="https://netbeans.org/about/contact_form.html?to=3&amp;subject=Feedback: NetBeans Platform System Properties Tutorial 8.0">Send Us Your Feedback</a></div>

    </body>

</html>
