<!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 System Properties Module Tutorial for NetBeans Platform 7.0</title>
    <link rel="stylesheet" type="text/css" href="https://netbeans.org/netbeans.css"/>
  <meta name="AUDIENCE" content="NBUSER"/>
  <meta name="TYPE" content="ARTICLE"/>
  <meta name="EXPIRES" content="N"/>
  <meta name="developer" content="gwielenga@netbeans.org"/>
  <meta name="indexed" content="y"/>
  <meta name="description"
 content="A short guide to using the Nodes API."/>
<!--      Copyright (c) 2009, 2010, 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><b class="notes">Note:</b> This document uses the NetBeans IDE 7.0 Release or above. If you
            are using an earlier version, see <a href="691/nbm-nodesapi.html">the previous version
                of this document</a>.</p>

 
     <p><b>Contents</b></p>
   
        <p><img src="../../images/articles/70/netbeans-stamp.gif" class="stamp" width="114" height="114" alt="Content on this page applies to NetBeans IDE 7.0" title="Content on this page applies to NetBeans IDE 7.0"/></p>
      <ul class="toc">
  <li><a href="#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 7.0 or above</td>
            </tr>
            <tr>
                <td class="tbltd1"><a href="http://java.sun.com/javase/downloads/index.jsp">Java Developer Kit (JDK)</a></td>
                <td class="tbltd1">Version 6</td>
            </tr>
        </tbody>
    </table>

<!-- ===================================================================================== -->
<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 border="1" 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 border="1" 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, you have to make sure you
  that your project is set up correctly. NetBeans IDE provides a wizard that sets up all the basic files
 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. Make sure that the Standalone Module option
        and the Set as Main Project checkbox are selected. Click Next.</li>
    <li>In the Basic Module Configuration panel, type <tt>org.myorg.systemproperties</tt>
        in Code Name Base.</li>
    <li>Leave the location of the localizing bundle unchanged.
        Leave the two checkboxes unchecked. 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>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:

<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></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, double-click Project Metadata and note that the APIs you selected have been
 declared as Module dependencies.</li>

  </ol>

</div>

<!-- ===================================================================================== -->
<h2><a name="creatingandgettingtoknowthemainfiles"></a>Creating the Main Files</h2>

<p>The meat of the 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>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 static org.myorg.systemproperties.Bundle.*;
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(LBL_AllPropsNode());
        setShortDescription(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 LBL_NewProp();
                }
                @Override
                public void create() throws IOException {
                    NotifyDescriptor.InputLine msg = new NotifyDescriptor.InputLine(LBL_NewProp_dialog(), MSG_NewProp_dialog_key());
                    DialogDisplayer.getDefault().notify(msg);
                    String key = msg.getInputText();
                    if ("".equals(key)) {
                        return;
                    }
                    msg = new NotifyDescriptor.InputLine(MSG_NewProp_dialog_value(), 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 Runtime tab.
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. Following this method is the definition of the name on the
menu item, such as New System Property, and the help context. The @Messages annotation
lets you define bundles messages right inside your Java class. Add this statement
to your list of import statements at the top of the class:
<pre class="examplecode">import static org.myorg.systemproperties.Bundle.*;</pre>

</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>

</div>

    <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;
import static org.myorg.systemproperties.Bundle.*;

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(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, PROP_value(), 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></li></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>

    <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;
import static org.myorg.systemproperties.Bundle.*;

public class RefreshPropsAction extends AbstractAction {

    @Messages("LBL_RefreshProps=Refresh")
    public RefreshPropsAction() {
        super(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>
</ul></li></ol>

<!-- ===================================================================================== -->

<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, if you like,
                      get the icons from the <a href="../samples/zips/SystemProperties.zip">ZIP file attached to this tutorial</a>.
                      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>
                  
                  <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 border="1" src="../../images/tutorials/sysprops/nbm-sysprops-70-2.png" alt="System Properties module."/></p>

 <li>Use the module as described in the <a href="#introducing-sample">Introducing the Sample</a> section.</li>
    </ol>

<div class="feedback-box"><a href="https://netbeans.org/about/contact_form.html?to=3&amp;subject=Feedback:%20System%20Properties%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 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>
    
</body>

</html>
