<!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 Code Snippet Module Tutorial for NetBeans Platform 6.5</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 Palette API."/>
<!--      Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. -->
<!--     Use is subject to license terms.-->
</head>
<body>
<h1>NetBeans Code Snippet Module Tutorial</h1>

<p>This tutorial demonstrates how to create and add code snippets to the HTML/JSP Component Palette. Code snippets are small pieces of code
 that can be dragged from a component palette and dropped in the Source Editor. They serve to speed up coding. The HTML/JSP Component Palette
 has several code snippets already, but you might want to add some additional ones and share them with others.</p>

   <p><strong class="notes">Note: </strong>This document uses the NetBeans IDE 6.5 Release. If you
    are using an earlier version, see <a href="60/nbm-palette-api1.html">the 6.0/6.1 version
        of this document</a>.</p>
 
   <p><b>Contents</b></p>
   
   <p><img src="../images/articles/69/netbeans-stamp7-8-9.png" class="stamp" width="114" height="114" alt="Content on this page applies to NetBeans IDE 6.5, 6.7, 6.8" title="Content on this page applies to NetBeans IDE 6.5, 6.7, 6.8"/></p>
      <ul class="toc">
<li><a href="#intro">Introduction to Code Snippets</a></li>
<li><a href="#creatingthemoduleproject">Setting Up the Module Project</a>
<ul>
<li><a href="#create-plug-in">Creating the Module Project</a></li>
<li><a href="#specifying">Specifying the Module's Dependencies</a></li>
</ul>
</li>

<li><a href="#coding-module">Coding the Code Snippet</a>
<ul>
    <li><a href="#creating-snippet">Creating the Code Snippet</a></li>
<li><a href="#defining-insertion">Defining the Insertion</a></li>
</ul>
</li>

<li><a href="#registering-module">Declaring and Registering the Code Snippet</a>
<ul>
<li><a href="#declaring-resources">Declaring the Code Snippet</a></li>
<li><a href="#registering-resources">Registering the Code Snippet</a></li>
<li><a href="#adding-customizer">Optional: Adding a Customizer</a></li>
</ul>
</li>

<li><a href="#building">Building and Installing the Code Snippet</a>
<ul>
<li><a href="#try-plugin">Trying Out the Code Snippet</a></li>
<li><a href="#share-plugin">Creating a Shareable Module Binary</a></li>
</ul></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 6.75 or above</td>
            </tr>
            <tr>
                <td class="tbltd1"><a href="http://java.sun.com/javase/downloads/index.jsp">Java Developer Kit (JDK)</a></td>
                <td class="tbltd1">Version 6 or<br/>version 5</td>
            </tr>
        </tbody>
    </table>
    
 <p class="tips">Optionally, for troubleshooting purposes, you
  can <a href="https://netbeans.org/files/documents/4/637/newhtmlsnippets.zip">download the completed sample</a>.</p>
 
<h2 class="tutorial"><a name="intro"></a>Introduction to Code Snippets</h2>

<p>To create a code snippet, you use the
 <a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-spi-palette/overview-summary.html">NetBeans Palette API</a>.
 A code snippet requires the following files:</p>
<ul>
<li>A Java class that defines the piece of code to be dragged into the Source Editor.</li>
<li>A display name for the palette item.</li>
<li>A tooltip for the palette item.</li>
<li>A 16x16 pixel image for the 'Small Icon' display.</li>
    <li>A 32x32 pixel image for the 'Big Icon' display.</li>
</ul> 

<p>After you have created or added the above files to the NetBeans module, you declare them in a resource declaration XML file,
    which you register in the NetBeans System Filesystem by using the <tt>layer.xml</tt> file.</p>

<h2 class="tutorial"><a name="creatingthemoduleproject"></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. The IDE provides a wizard that sets up all the basic files
 needed for a module.</p>
<div class="indent">

<h3 class="tutorial"><a name="create-plug-in"></a>Creating the Module Project</h3>

<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>Newhtmlsnippets</tt> in the Project Name field.
        Change the Project Location to any directory on your computer. Leave the Standalone Module option
        and Set as Main Project checkbox selected. Click Next.</li>
    <li>In the Basic Module Configuration panel, type <tt>org.netbeans.modules.newhtmlsnippets</tt>
     in Code Name Base.</li>
    <li>Select "Generate XML Layer". Leave the
        locations of both the localizing bundle and the XML layer file
        so that they will be stored in a package with
        the name <tt>org/netbeans/modules/newhtmlsnippets</tt>. Click Finish.</li>
</ol>

<p> The IDE creates the <tt>Newhtmlsnippets</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>You will need to use several classes that belong to the <a href="http://bits.netbeans.org/dev/javadoc/index.html">NetBeans APIs</a>.
    Each has to be declared as a module dependency. Use the Project Properties dialog box for this purpose.</p>
  <ol>
	  <li>In the Projects window, right-click the <tt>Newhtmlsnippets</tt> project node and choose Properties.
 In the Project Properties dialog box, click Libraries.</li>
	
 <li><p>For each of the following, click "Add...",
 select the name from the Module list, and then click OK to confirm it:</p>

 <ul>
     <li>Common Palette</li>
     <li>Text API</li>
     <li>Utilities API</li>
 </ul>

     <p>Click OK to exit the Project Properties dialog box.</p></li>
<li>In the Projects window, expand the Important Files node, double-click the Project Metadata node, and note that the APIs you selected have been
 declared as Module dependencies.</li>

  </ol>
      </div>

<!-- ===================================================================================== -->
<h2><a name="coding-module"></a>Coding the Code Snippet</h2>

<p>In this section, you create <tt>BR.java</tt>, which defines
 a code snippet for an HTML line break. By implementing the
 <tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-text/org/openide/text/ActiveEditorDrop.html">ActiveEditorDrop</a></tt> class,
  you let the NetBeans APIs provide the infrastructure for
  a palette item for NetBeans editors. You also
  create <tt>HTMLPaletteUtilities.java</tt>, which defines
  the insertion of the tag in the editor.</p>

<div class="indent">


<h3 class="tutorial"><a name="creating-snippet"></a>Creating the Code Snippet</h3>
 
<ol>
	 <li>Right-click the <tt>org.netbeans.modules.newhtmlsnippets</tt> node and 
	      choose New &gt; Java Class. Type <tt>BR</tt> in Class Name, make sure that the <tt>org.netbeans.modules.newhtmlsnippets</tt>
 package is selected in the Package drop-down list, and click Finish.</li>
	     

   <li>Replace the default content of the <tt>BR.java</tt> file with the following:

<pre class="examplecode">package org.netbeans.modules.newhtmlsnippets;

import javax.swing.text.BadLocationException;
import javax.swing.text.JTextComponent;
import org.netbeans.modules.newhtmlsnippets.HTMLPaletteUtilities;
import <a href="http://bits.netbeans.org/dev/javadoc/org-openide-text/org/openide/text/ActiveEditorDrop.html">org.openide.text.ActiveEditorDrop</a>;

public class BR implements <a href="http://bits.netbeans.org/dev/javadoc/org-openide-text/org/openide/text/ActiveEditorDrop.html">ActiveEditorDrop</a> {
    
    public BR() {
    }
    
    private String createBody() {
        String Br = "&lt;br&gt;";
        return Br;
    }
    
    public boolean <a href="http://bits.netbeans.org/dev/javadoc/org-openide-text/org/openide/text/ActiveEditorDrop.html#handleTransfer(javax.swing.text.JTextComponent)">handleTransfer(JTextComponent targetComponent</a>) {
        String body = createBody();
        try {
            HTMLPaletteUtilities.insert(body, targetComponent);
        } catch (BadLocationException ble) {
            return false;
        }
        return true;
    }
    
}</pre>

    <p>Right-click in the Source Editor and choose Format (Alt-Shift-F).</p></li>

</ol>

<p>A red error message remains because you have not created the <tt>HTMLPaletteUtilities</tt>
class yet, which you will do in the next section.</p>

<h3 class="tutorial"><a name="defining-insertion"></a>Defining the Insertion</h3>

<p>In this section, you create the <tt>HTMLPaletteUtilities</tt> class, which
defines the place where the snippet will be dropped.</p>

<ol>
	
	 <li>Right-click the <tt>org.netbeans.modules.newhtmlsnippets</tt> node and 
	      choose New &gt; Java Class. Type <tt>HTMLPaletteUtilities</tt> in Class Name, make sure that the <tt>org.netbeans.modules.newhtmlsnippets</tt>
 package is selected in the Package drop-down list, and click Finish.</li>
	     

   <li>Replace the default content of the <tt>HTMLPaletteUtilities.java</tt> file with the following:

<pre class="examplecode">package org.netbeans.modules.newhtmlsnippets;

import javax.swing.text.BadLocationException;
import javax.swing.text.Caret;
import javax.swing.text.Document;
import javax.swing.text.JTextComponent;
import javax.swing.text.StyledDocument;
import <a href="https://netbeans.org/download/dev/javadoc/org-openide-text/org/openide/text/NbDocument.html">org.openide.text.NbDocument</a>;

public class HTMLPaletteUtilities {
  
    public static void insert(final String s,final JTextComponent target) throws BadLocationException {
        
        final StyledDocument doc = (StyledDocument)target.getDocument();
        
        class AtomicChange implements Runnable {
            
            public void run() {
                Document value = target.getDocument();
                if (value == null)
                    return;
                try {
                    insert(s, target, doc);
                } catch (BadLocationException e) {}
            }
        }
        
        try {
            <a href="https://netbeans.org/download/dev/javadoc/org-openide-text/org/openide/text/NbDocument.html#runAtomicAsUser(javax.swing.text.StyledDocument,%20java.lang.Runnable)">NbDocument.runAtomicAsUser(doc, new AtomicChange())</a>;
        } catch (BadLocationException ex) {}
        
    }
    
    private static int insert(String s, JTextComponent target, Document doc) throws BadLocationException {
        
        int start = -1;
        
        try {
            
            <b>//firstly, find selected text range:</b>
            Caret caret = target.getCaret();
            int p0 = Math.min(caret.getDot(), caret.getMark());
            int p1 = Math.max(caret.getDot(), caret.getMark());
            doc.remove(p0, p1 - p0);
            
            <b>//then, replace selected text range with the inserted one:</b>
            start = caret.getDot();
            doc.insertString(start, s, null);
        
        } catch (BadLocationException ble) {}
        
        return start;

    }

}</pre>

    <p>Right-click in the Source Editor and choose Format (Alt-Shift-F).</p></li>


</ol>


 </div>

<h2><a name="registering-module"></a>Declaring and Registering the Code Snippet</h2>

<p>Code snippets are registered in two phases. Firstly, you declare
 a code snippet in an XML file that conforms to the
 NetBeans Editor Palette Item DTD.
 In this XML file, you declare your <tt>ActiveEditorDrop</tt> implementation
 class, a 16x16 pixel icon, a 32x32 pixel icon, a display name,
 and a tooltip.</p>
  
 <p><strong class="notes">Note: </strong>Use the 1.0 version of the DTD if you
 want the display name and tooltip to be defined in a properties
  file. Use the 1.1 version of the DTD if you want to declare the
  display name and tooltip witin the XML file itself. Both approaches
  are described below.</p>
 
  <p>Secondly, you register the XML file in the <tt>layer.xml</tt> file,
      in the palette's folder.</p>
  
<div class="indent">


<h3 class="tutorial"><a name="declaring-resources"></a>Declaring the Code Snippet</h3>

<p>The NetBeans Editor Palette Item DTD is used to
declare the <tt>ActiveEditorDrop</tt> class, the icons, the
display name, and the tooltip.</p>

<ol>
		 
<li>Right-click the <tt>org.netbeans.modules.newhtmlsnippets</tt> package node and 
	      choose New &gt; Other. Select XML Document in the XML folder and click Next.
Type <tt>BR</tt> in File Name. Type <tt>\resources</tt> at the end of <tt>src\org\netbeans\modules\newhtmlsnippets</tt> in Folder.
 Click Finish.</li>
	     

   <li>Replace the default content of the <tt>BR.xml</tt> file with the following:

<pre class="examplecode">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE editor_palette_item PUBLIC "-//NetBeans//Editor Palette Item 1.0//EN"
  "https://netbeans.org/dtds/editor-palette-item-1_0.dtd"&gt;

&lt;editor_palette_item version="1.0"&gt;

    &lt;class name="org.netbeans.modules.newhtmlsnippets.BR" /&gt;

    &lt;icon16 urlvalue="org/netbeans/modules/newhtmlsnippets/resources/BR16.png" /&gt;
    &lt;icon32 urlvalue="org/netbeans/modules/newhtmlsnippets/resources/BR32.png" /&gt;
   
    &lt;description localizing-bundle="org.netbeans.modules.newhtmlsnippets.Bundle"
               display-name-key="NAME_html-BR"
               tooltip-key="HINT_html-BR" /&gt;
               
&lt;/editor_palette_item&gt;</pre>

<p>In the 1.1 DTD, you can define the display name and tooltip without
 using a properties file. Below, only the difference with the previous
 XML file definition is highlighted:</p>
 
 <pre class="examplecode">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE editor_palette_item PUBLIC "<b>-//NetBeans//Editor Palette Item 1.1//EN</b>"
  "https://netbeans.org/dtds/<b>editor-palette-item-1_1.dtd</b>"&gt;

&lt;editor_palette_item version="1.0"&gt;

    &lt;class name="org.netbeans.modules.newhtmlsnippets.BR" /&gt;

    &lt;icon16 urlvalue="org/netbeans/modules/newhtmlsnippets/resources/BR16.png" /&gt;
    &lt;icon32 urlvalue="org/netbeans/modules/newhtmlsnippets/resources/BR32.png" /&gt;
   
    <b>&lt;inline-description&gt;
       &lt;display-name&gt;New Line&lt;/display-name&gt;
       &lt;tooltip&gt;
           &lt;b&gt;
              br
           &lt;/b&gt;
       &lt;/tooltip&gt;
    &lt;/inline-description&gt;</b>
               
&lt;/editor_palette_item&gt;</pre>

 <p><strong class="notes">Note: </strong>You can choose either of the two
     approaches above, depending on your requirements.</p></li>

<li><p>Add a 16x16 pixel icon and a 32x32 pixel icon to the new <tt>resources</tt> folder. Name them
    <tt>BR16.png</tt> and <tt>BR32.png</tt>. They can also be in other icon formats, such as GIF or JPG. Make sure that
    the resource is correctly declared in the <tt>BR.xml</tt> file. You can
    right-click them here and then save them to your module's source
structure:</p>
 
    <p><img src="../images/tutorials/codesnippet/BR32.png" alt="BR32"/></p>
    <p><img src="../images/tutorials/codesnippet/BR16.png" alt="BR16"/></p></li>
 
 <li><p>If you want to use a properties file
  for declaring the palette item's display name
  and tooltip, which implies that you are using the 1.0 DTD,
  add the following to the <tt>Bundle.properties</tt> file:</p>
     <p><img src="../images/tutorials/codesnippet/bundle-60.png" alt="new bundle keys"/></p>
        </li>
</ol>

<p>At this point, the project source structure should be as follows:</p>

<p><img src="../images/tutorials/codesnippet/65-proj-1.png"/></p>

<h3 class="tutorial"><a name="registering-resources"></a>Registering the Code Snippet</h3>

<p>The <tt>layer.xml</tt> file registers the user interface
 elements of your module in your application, which in this
 case is the IDE. Here, we need to register the palette item
 in the <tt>layer.xml</tt> file so that the item will appear
 in the HTML Palette.</p>

<ol>
	
	 <li>Add the following tags to the <tt>layer.xml</tt> file, between the <tt>&lt;filesystem&gt;</tt> tags:

<pre class="examplecode">&lt;folder name="HTMLPalette"&gt;
   &lt;folder name="HTML"&gt;
      &lt;file name="BR.xml" url="resources/BR.xml"&gt;
         &lt;attr name="position" intvalue="150"/&gt;
      &lt;/file&gt;
   &lt;/folder&gt;
&lt;/folder&gt;</pre></li>

<li><p>Optionally, you can reorder the items in
 the palette. When you do so, you can use the user interface
provided for this purpose to do so.</p>
 
 <p>Expand the <tt>layer.xml</tt> node and then
 expand <tt>&lt;this layer in context&gt;</tt>. A folder appears for every folder declared by
 every <tt>layer.xml</tt> file of every module registered in the IDE. </p>

<p>Notice that the "HTMLPalette" folder
is marked in bold. This matches the name of the folder you created in your own <tt>layer.xml</tt> file.
Expand the folder
 and notice that its subfolder, HTML, is also in bold. Expand the HTML folder and notice that
 the <tt>BR.xml</tt>
  resource declaration file that you declared has been added to the resource declaration files provided by other
  modules:</p>

<p><img src="../images/tutorials/codesnippet/65-layer.png" alt="layer in context"/></p>

<p>When you right-click on the node, several options are available, such as
"Delete" and "Copy".</p>

<p>As an experiment, drag the "New Line" node and drop it right below the "Table" node. Double-click
the <tt>layer.xml</tt> file and notice that the value of the "position" element changes whenever
you move the "New Line" node to a different place.</p>
</li>
</ol>


<h3 class="tutorial"><a name="adding-customizer"></a>Optional: Adding a Customizer</h3>

<p>Optionally, you can let a <tt>JPanel</tt> appear when
the palette item is dropped. In the <tt>JPanel</tt>, you
can let the user define values for attributes that relate
to the tag that is about to be created. However, note that
adding such a customizer is optional. In the case of a
line break, which is what we are creating in this tutorial,
there are no attributes that relate to the BR tag. For that
reason, to illustrate the customizer functionality, we
will add a comment before the BR tag, by means of a
customizer.</p>

<p><strong class="notes">Note: </strong>If you check out the <tt>html</tt> module
from the NetBeans sources, you will find many examples
of customizers in the <tt>org/netbeans/modules/html/palette/items</tt>
package.</p>

<ol>

    <li>Add a dependency on the NetBeans <tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-dialogs/overview-summary.html">Dialogs API</a></tt>.</li>
    <li><p>Use the New File dialog (Ctrl-N)
     to create a <tt>JPanel</tt> in the <tt>org.netbeans.modules.newhtmlsnippets</tt> package.
    Name it <tt>BRCustomizer</tt>.</p></li>
    <li><p>Use the Pallette (Ctrl-Shift-8) to drag and drop a <tt>JLabel</tt> and a <tt>JTextField</tt>
    onto the <tt>JPanel</tt> and arrange the <tt>JPanel</tt>
as follows:</p>
        <p><img src="../images/tutorials/codesnippet/customizer-in-palette-60.png" alt="customizer in design mode"/></p>
    </li>
<li>You will need to declare the following at the top of
the <tt>BRCustomizer</tt> class:

<pre>private Dialog dialog = null;
private DialogDescriptor descriptor = null;
private boolean dialogOK = false;

BR br;
JTextComponent target;</pre></li>

<li>Rewrite the <tt>BRCustomizer</tt> constructor
 as follows:

<pre>public BRCustomizer(BR br, JTextComponent target) {
    this.br = br;
    this.target = target;

    initComponents();
}</pre></li>

<li>In your <tt>BRCustomizer</tt> class, add this method,
 so that, in the next steps, you can open the customizer from your
 <tt>ActiveEditorDrop</tt> implementation class:

<pre class="examplecode">public boolean showDialog() {

    dialogOK = false;

    String displayName = "";
    try {
        displayName = NbBundle.getBundle("org.netbeans.modules.newhtmlsnippets.Bundle").getString("NAME_html-BR"); // NOI18N
    } catch (Exception e) {
        //Handle the exception here.
    }

    descriptor = new DialogDescriptor(this, NbBundle.getMessage(BRCustomizer.class, "LBL_Customizer_InsertPrefix") + " " + displayName, true,
            DialogDescriptor.OK_CANCEL_OPTION, DialogDescriptor.OK_OPTION,
            new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                    if (descriptor.getValue().equals(DialogDescriptor.OK_OPTION)) {
                        evaluateInput();
                        dialogOK = true;
                    }
                    dialog.dispose();
                }

            });

    dialog = DialogDisplayer.getDefault().createDialog(descriptor);
    dialog.setVisible(true);
    repaint();

    return dialogOK;

}</pre></li>

<li>Define the <tt>evaluateInput()</tt> method, which
is called in the <tt>showDialog()</tt> method above, as
follows:

<pre>private void evaluateInput() {

   String comment = jTextField1.getText();
   br.setComment(comment);

}</pre></li>

<li>Add to the <tt>Bundle.properties</tt> file:

<pre>LBL_Customizer_InsertPrefix=Insert
NAME_html-BR=Line Break</pre></li>

	 <li>Hook your customizer into the
         <tt>ActiveEditorDrop</tt> implementation class
         as follows (only the lines that are changed
         are highlighted below):

<pre class="examplecode">package org.netbeans.modules.newhtmlsnippets;

import javax.swing.text.BadLocationException;
import javax.swing.text.JTextComponent;
import org.netbeans.modules.newhtmlsnippets.HTMLPaletteUtilities;
import <a href="https://netbeans.org/download/dev/javadoc/org-openide-text/org/openide/text/ActiveEditorDrop.html">org.openide.text.ActiveEditorDrop</a>;

public class BR implements <a href="https://netbeans.org/download/dev/javadoc/org-openide-text/org/openide/text/ActiveEditorDrop.html">ActiveEditorDrop</a> {

    <b>private String comment = "";</b>

    public BR() {
    }

    private String createBody() {
        <b>comment = getComment();
        String Br = "&lt;!-- " + comment + " --&gt;"
                + "\n        &lt;br&gt;";</b>
        return Br;
    }

    public boolean <a href="https://netbeans.org/download/dev/javadoc/org-openide-text/org/openide/text/ActiveEditorDrop.html#handleTransfer(javax.swing.text.JTextComponent)">handleTransfer(JTextComponent targetComponent</a>) {

        <b>BRCustomizer c = new BRCustomizer(this, targetComponent);
        boolean accept = c.showDialog();
        if (accept) {</b>
            String body = createBody();
            try {
                HTMLPaletteUtilities.insert(body, targetComponent);
            } catch (BadLocationException ble) {
                <b>accept = false;</b>
            }
        }
        <b>return accept;</b>

    }

    <b>public String getComment() {
        return comment;
    }

    public void setComment(String comment) {
        this.comment = comment;
    }</b>

}</pre>

         </li>

</ol>

<p>Your project source structure should now include your <tt>JPanel</tt>:</p>
<p><img src="../images/tutorials/codesnippet/65-proj-2.png"/></p>

</div>  

<!-- ======================================================================================= -->

<h2><a name="building"></a>Building and Installing the Code Snippet</h2>
<p>Now we need to think about installation and distribution.
 In the first section below, we install the code snippet,
 next we create an NBM file and examine distribution channels.</p>
<div class="indent">

	<h3 class="tutorial"><a name="try-plugin"></a>Trying Out the Code Snippet</h3>
        
              <p>Install and try out the code snippet,
                  by following the steps below.</p>
                  <ol>
                  <li><p>In the Projects window, right-click the <tt>Newhtmlsnippets</tt> project and choose Run. </p>
	      <p>The module is built and installed in the target platform. The target platform opens so that you
	      can try out your new module. The default target platform is the 
          installation used by the current instance of the development IDE.</p>
                  </li>
    
    <li><p>Create a new HTML file in the IDE. When the
 HTML file opens, it displays the Component Palette (Ctrl-Shift-8) with one additional code snippet, called "New Line", with a tooltip that displays the
 result of dragging-and-dropping the item:</p>

<p><img src="../images/tutorials/codesnippet/result1-60.png" alt="new snippet in component palette"/></p>

    </li>

<li>Drag the 'New Line' item into the Source Editor and, if you completed the optional
 section on creating a customizer (above), you will see a customizer:

 <p><img src="../images/tutorials/codesnippet/customizer-in-action-60.png" alt="customizer in action"/></p>

</li>
 
<li><p>Type a comment, click OK, and
    notice that a new <tt>&lt;br&gt;</tt> tag is inserted
at the cursor, together with an HTML comment:</p>
 
 <p><img src="../images/tutorials/codesnippet/result2-60.png" alt="dropped line break"/></p>

 <p><strong class="notes">Note: </strong>Above, the text
  "breaking up the paragraph with a line break" was
 typed into the customizer.</p>

</li>

</ol>

 <h3 class="tutorial"><a name="share-plugin"></a>Creating a Shareable Module Binary</h3>
  
              <p>An NBM file is the binary version of the module that
                  provides the code snippet. Below, using one menu item, we create
                  the NBM file.</p>
                  
                  <ol>

              <li><p>In the Projects window, right-click the <tt>newhtmlsnippet</tt> project and choose Create NBM.</p>
	      <p>The NBM file is created and you can view it in the Files window (Ctrl-2), as shown
               below:</p>
                  <p><img src="../images/tutorials/codesnippet/65-proj-3.png" alt="Shareable NBM."/></p></li>
	      <li>Make the module available to others via, for example, the
                  <a href="http://plugins.netbeans.org/PluginPortal/">Plugin Portal</a>.</li>
	      <li>The recipient can install the module by using their IDE's Plugin Manager. They
               would choose Tools &gt; Plugins
	       from the main menu.</li>
       </ol>
</div>

<div class="feedback-box"><a href="https://netbeans.org/about/contact_form.html?to=3&amp;subject=Feedback:%20Code%20Snippet%20Module%20Tutorial">Send Us Your Feedback</a></div>

<!-- ======================================================================================== -->

<h2><a name="nextsteps"></a>Next Steps</h2>

<p>For more information about creating and developing NetBeans modules, see the following resources: </p>
  <ul>
	  <li><a href="https://netbeans.org/kb/trails/platform.html">Other Related Tutorials</a></li>
	  <li><a href="http://bits.netbeans.org/dev/javadoc/index.html">NetBeans API Javadoc</a></li>
  </ul>
  
<!-- ======================================================================================== -->
<!--
<h2><a name="version"></a>Versioning </h2>
  
<p>

<table width="76%">
 <tbody>
   <tr>
      <td>
        <div><b>Version</b></div>
      </td>
      <td>
	<div><b>Date</b></div>
      </td>
      <td>
	<div><b>Changes</b></div>
</td>
<td>
	<div><b>Open Issues</b></div>
      </td>
  </tr>
  <tr>
      <td>
         1
      </td>
      <td>
	      28 November 2005
      </td>
      <td>
         Initial version
 </td>
<td>
	<ul>
		<li>Is it the same for Swing/AWT Components?
		<li>How could formatting/indentation be different?
		<li>Need to add explanation for adding own dialog box for predefining values.
		<li>Need new screenshot of the Component Palette, to show the new snippet under the
		existing Table snippet.
		<li>Explanatory text for the use of the NetBeans APIs to be added.
		<li>Show how to share snippets between palettes via shadow files.
		
	</ul>
      </td>
  </tr>
<tr>
      <td>
         2
      </td>
      <td>
	      2 December 2005
      </td>
      <td>
       
 </td>
<td>
	<ul>
		<li>Fixed <a href="https://netbeans.org/bugzilla/show_bug.cgi?id=69620">issue 69620</a>
		
	</ul>
      </td>
  </tr>
<tr>
      <td>
         3
      </td>
      <td>
	      8 December 2005
      </td>
      <td>
       
 </td>
<td>
	<ul>
		<li>Fixed <a href="https://netbeans.org/bugzilla/show_bug.cgi?id=69766">issue 69766</a>
		
	</ul>
      </td>
  </tr>
  <tr>
      <td>
         4
      </td>
      <td>
	      1 June 2007
      </td>
      <td>
       
 </td>
<td>
	<ul>
		<li>Began updating for 6.0
		
	</ul>
      </td>
  </tr>
  <tr>
      <td>
         5
      </td>
      <td>
	      2 November 2008
      </td>
      <td>

 </td>
<td>
	<ul>
		<li>Began updating for 6.5

	</ul>
      </td>
  </tr>

  </tbody>
</table>-->
</body>
</html>
