<!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 XML Editor Extension 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 extending the NetBeans XML Editor.">
<!--      Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. -->
<!--     Use is subject to license terms.-->
</head>
<body>
<h1>NetBeans XML Editor Extension Module Tutorial</h1>

<p>This tutorial demonstrates how to create a module that extends the functionality offered by one of the IDE's editors.
 The IDE has several editors&#8212;for example, the XML editor, the Java editor, the JSP editor, and the SQL editor.
 Normally all the IDE's editors are referred to collectively as the Source Editor. However, each of the editors
 is distinct&#8212;its functionality is targeted at the file type for which it exists. In this tutorial,
 you add an action to the XML editor. After you create and install the module, and you open an XML file,
  the editor's contextual menu will include a menu item that displays the XML file's tags in the Output Window. 

 <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-xmleditor.html">the 6.0/6.1 version
    of this document</a>.

  <p><b>Contents</b></p>
   
   <img  src="../images/articles/68/netbeans-stamp-65-67-68.gif" 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="#creatingthemoduleproject">Setting Up the Module Project</a>
<ul><li><a href="#create-plug-in">Creating the Module Project the Sample</a></li>
<li><a href="#specify-dependencies">Specifying the Module's Dependencies</a></li></ul></li>
  <li><a href="#create-tag-handler">Coding the Module</a>
  <li><a href="#creating-action">Creating the Action</a>
  <li><a href="#building">Building and Installing the Module</a>
  <ul><li><a href="#install-plugin">Installing the Module</a>
  <li><a href="#use-plugin">Using the Module</a>
  <li><a href="#share-plugin">Creating a Shareable Module Binary</a></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.5 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="http://plugins.netbeans.org/PluginPortal/faces/PluginDetailPage.jsp?pluginid=14039">download the completed sample</a>.

<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>ShowXMLStructure</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.showxmlstructure</tt>
     in Code Name Base.
    <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/showxmlstructure</tt>. Click Finish.</li>
</ol>

 <p> The IDE creates the <tt>ShowXMLStructure</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="specify-dependencies"></a>Specifying the Module's Dependencies</h3>

<p>You will need to subclass several classes that belong to NetBeans APIs. 
 Each has to be declared as a module dependency. Use the Project Properties dialog box for this purpose,
 as described below.
      <ol>
	<li>In the Projects window, right-click the <tt>ShowXMLStructure</tt> project and choose Properties.

<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:
<p><ul>
<li><tt>I/O APIs</tt>
<li><tt>Nodes API</tt>
<li><tt>Text API</tt>
<li><tt>Utilities API</tt>
<li><tt>Window System API</tt></ul>
<p>Click OK to exit the Project Properties dialog box.
      </ol>
<p>In the Projects window, expand the Important Files
 node and double-click Project Metadata and notice that the APIs you selected have been
 declared as module dependencies.


      </div>
      <br />

<!-- ===================================================================================== -->
<h2><a name="create-tag-handler"></a>Coding the Module</h2>

 <br />

<div class="indent">


<h3 class="tutorial"><a name="creating-action"></a>Creating the Action</h3>

<ol>
	
	 <li><p>Right-click the project node and
	      choose New &gt; Other. Under Categories, select Module Development. Under Projects, 
     select Action, as shown below:</p>
           <p align="left"><img src="../images/tutorials/taghandler/65-action.png" alt="Step 1 of New Action wizard."></p>

            <p>Click Next.</p></li>
           <li><p>In the Action Type panel and click Conditionally Enabled. Select <tt>EditorCookie</tt>, which
              is the name of the class that lets the Source Editor access the action, as shown below:</p>
           <p align="left"><img src="../images/tutorials/taghandler/65-action-2.png" alt="Step 2 of New Action wizard."></p>

	      
              <p>Click Next.</p></li>

              <li><p>In the GUI Registration panel, select the 'Edit' category in the Category drop-down list.
                  The Category drop-down list controls where an action is shown in the Keyboard Shortcuts editor in the IDE.
              Next, select Editor Contect Menu Item and then select the <tt>text/xml</tt> MIME type, as shown below:</p>
	      
<p align="left"><img src="../images/tutorials/taghandler/65-action-3.png" alt="Step 3 of New Action wizard."></p>

<p>Notice that you can set the position of the menu item and that you
              can separate the menu item from the item before it and after it. Click Next.</p></li>

   <li><p>In the Name and Location panel, type <tt>ShowXMLStructureAction</tt> as the Class Name
   and type <tt>Show XML Structure</tt> as the Display Name. You should now see the following:</p>
<p align="left"><img src="../images/tutorials/taghandler/65-action-4.png" alt="Step 4 of New Action wizard."></p>
   <p>Menu items provided by contextual menus
   do not display icons. Therefore, click Finish and <tt>ShowXMLStructureAction.java</tt> is added to the package.
    The content of the file is as follows:</p>

<pre class="examplecode">package org.netbeans.modules.showxmlstructure;

import org.openide.cookies.EditorCookie;
import org.openide.nodes.Node;
import org.openide.util.HelpCtx;
import org.openide.util.NbBundle;
import org.openide.util.actions.CookieAction;

public final class ShowXMLStructureAction extends CookieAction {

    protected void performAction(Node[] activatedNodes) {
        EditorCookie editorCookie = activatedNodes[0].getLookup().lookup(EditorCookie.class);
        // TODO use editorCookie
    }

    protected int mode() {
        return CookieAction.MODE_EXACTLY_ONE;
    }

    public String getName() {
        return NbBundle.getMessage(ShowXMLStructureAction.class, "CTL_ShowXMLStructureAction");
    }

    protected Class[] cookieClasses() {
        return new Class[]{EditorCookie.class};
    }

    @Override
    protected void initialize() {
        super.initialize();
        // see org.openide.util.actions.SystemAction.iconResource() Javadoc for more details
        putValue("noIconInMenu", Boolean.TRUE);
    }

    public HelpCtx getHelpCtx() {
        return HelpCtx.DEFAULT_HELP;
    }

    @Override
    protected boolean asynchronous() {
        return false;
    }

}</pre>



   <li>In the Source Editor, rewrite the <tt>performAction</tt> method as follows,
    after reading and understanding the comments in the code:

<pre class="examplecode">protected void performAction(Node[] activatedNodes) {
    EditorCookie editorCookie = activatedNodes[0].getLookup().lookup(EditorCookie.class);
    <b>//Get the tab name from the Bundle.properties file:</b>
    String tabName = NbBundle.getMessage(ShowXMLStructureAction.class, "LBL_tabName");
    <b>// "XML Structure" tab is created in Output Window for writing the list of tags:</b>
    InputOutput io = IOProvider.getDefault().getIO(tabName, false);
    io.select(); <b>//"XML Structure" tab is selected</b>
    try {
        <b>//Get the InputStream from the EditorCookie:</b>
        InputStream is = ((org.openide.text.CloneableEditorSupport) editorCookie).getInputStream();
        <b>//Use the NetBeans org.openide.xml.XMLUtil class to create a org.w3c.dom.Document:</b>
        Document doc = XMLUtil.parse(new InputSource(is), true, true, null, null);
        <b>//Create a list of nodes, for all the elements:</b>
        NodeList list = doc.getElementsByTagName("*");
        <b>//Iterate through the list:</b>
        for (int i = 0; i < list.getLength(); i++) {
            <b>//For each node in the list, create a org.w3c.dom.Node:</b>
            org.w3c.dom.Node mainNode = list.item(i);
            <b>//Create a map for all the attributes of the org.w3c.dom.Node:</b>
            NamedNodeMap map = mainNode.getAttributes();
            <b>//Get the name of the node:</b>
            String nodeName = mainNode.getNodeName();
            <b>//Create a StringBuilder for the Attributes of the Node:</b>
            StringBuilder attrBuilder = new StringBuilder();
            <b>//Iterate through the map of attributes:</b>
            for (int j = 0; j < map.getLength(); j++) {
                <b>//Each iteration, create a new Node:</b>
                org.w3c.dom.Node attrNode = map.item(j);
                <b>//Get the name of the current Attribute:</b>
                String attrName = attrNode.getNodeName();
                <b>//Add the current Attribute to the StringBuilder:</b>
                attrBuilder.append("*" + attrName + " ");
            }
            <b>//Print the element and its attributes to the Output window:</b>
            io.getOut().println("ELEMENT: " + nodeName +
                    " --> ATTRIBUTES: " + attrBuilder.toString());
        }
        <b>//Close the InputStream:</b>
        is.close();
    } catch (SAXException ex) {
        Exceptions.printStackTrace(ex);
    } catch (IOException ex) {
        Exceptions.printStackTrace(ex);
    }
}</pre>

<li>Add the display names to the <tt>Bundle.properties</tt> file:

<p><pre class="examplecode">LBL_tabName=XML Structure</pre>

</ol>
 </div>
      <br />

<!-- ======================================================================================= -->

<h2><a name="building"></a>Building and Installing the Module</h2>
<p>The IDE uses an Ant build script to build and install your module. The build script is created for you
when you create the module project.</p>
<div class="indent">

	<h3 class="tutorial"><a name="install-plugin"></a>Installing the Module</h3>
<p>In the Projects window, right-click the <tt>ShowXMLStructure</tt> project and choose Run.
	      <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. 

       <h3 class="tutorial"><a name="use-plugin"></a>Using the Module</h3>
       <ol>
           <li><p>Choose File &gt; New Project (Ctrl-Shift-N) and create a new project.</p></li>
	       <li><p>In the Files window (Ctrl-2), expand the project node and then expand the <tt>nbproject</tt> node.
           Double-click <tt>build-impl.xml</tt> so that it opens in the Source Editor</p></li>
                <li><p>Right-click anywhere in the Source Editor and notice the new popup menu item called "Show XML Structure".
	        Choose the menu item and notice that the tag handler prints all the elements
            and attributes to the Output window,
		 which is at at the bottom of the IDE, as shown below:</p>
                <p align="left"><img border="1" src="../images/tutorials/taghandler/65-result.png" alt="New Output window."></p></li>
	<li><p>Open a different file type in the Source Editor. For example, open a Java class. Right-click anywhere in the
    Source Editor and notice that the new popup menu item is not included in the contextual menu. That is
    because the New Action wizard created the following entries for you, which cause the action to be
    available for XML files only:</p>

<pre class="examplecode">&lt;folder name="Actions"&gt;
    &lt;folder name="Edit"&gt;
        &lt;file name="org-netbeans-modules-showxmlstructure-ShowXMLStructureAction.instance"/&gt;
    &lt;/folder&gt;
&lt;/folder&gt;
&lt;folder name="Editors"&gt;
    &lt;folder name="text"&gt;
        &lt;folder name="xml"&gt;
            &lt;folder name="Popup"&gt;
                &lt;file name="org-netbeans-modules-showxmlstructure-ShowXMLStructureAction.shadow"&gt;
                    &lt;attr name="originalFile" stringvalue="Actions/Edit/org-netbeans-modules-showxmlstructure-ShowXMLStructureAction.instance"/&gt;
                    &lt;attr name="position" intvalue="1100"/&gt;
                &lt;/file&gt;
            &lt;/folder&gt;
        &lt;/folder&gt;
    &lt;/folder&gt;
&lt;/folder&gt;</pre>

 </ol>

 <h3 class="tutorial"><a name="share-plugin"></a>Creating a Shareable Module Binary</h3>
  
      <ol>
          <li><p>In the Projects window, right-click the <tt>ShowXMLStructure</tt> project and choose Create NBM.</p>

              <p>The NBM file is created and you can view it in the Files window (Ctrl-2):</p>
	      <p align="left"><img src="../images/tutorials/taghandler/65-nbm-generated.png" alt="Shareable NBM.">
          <li>Make it available to others via, for example, the <a href="http://plugins.netbeans.org/PluginPortal/">Plugin Portal</a>.
       </ol>
    </div>
    
    <br>
<div class="feedback-box"><a href="https://netbeans.org/about/contact_form.html?to=3&amp;subject=Feedback:%20XML%20Editor%20Extension%20Tutorial">Send Us Your Feedback</a></div>
<br style="clear:both;" />

      

 <!-- ======================================================================================== -->
    
    <h2><a name="nextsteps"></a>Next Steps</h2>
    
    <p>For more information about creating and developing NetBeans modules, see the following resources: 
    <ul>
        <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>
    
    <hr>
    <!-- ======================================================================================== -->
    
<h2><a name="version"></a>Versioning </h2>
  
<p>

<table width="76%" border="1">
 <tbody>
   <tr>
      <td>
        <div align="left"><b>Version</b></div>
      </td>
      <td>
	<div align="left"><b>Date</b></div>
      </td>
      <td>
	<div align="left"><b>Changes</b></div>
      </td>
  </tr>
  <tr>
      <td>
         1
      </td>
      <td>
         11 July 2005
      </td>
      <td>
         Initial version
      </td>
  </tr>
 <tr>
      <td>
         2
      </td>
      <td>
         27 September 2005
      </td>
      <td>
	      <ul><li>Added Action wizard
		      <li>Renamed from "NetBeans Tag Handler Plug-in Tutorial"
		      to "NetBeans Source Editor Extension Module Tutorial".
		      <li>Added issue 7 below.</ul>
      </td>
  </tr> 
 <tr>
      <td>
         3
      </td>
      <td>
         28 September 2005
      </td>
      <td>
	      <ul><li>Renamed the tutorial, because 'Source Editor' doesn't
	       cover the SQL editor, which could also be extended using the steps in this tutorial.
	       <li>Rewrote the introductory paragraph.</ul>
      </td>
  </tr> 
   <tr>
      <td>
         4
      </td>
      <td>
         11 June 2007
      </td>
      <td>
	      Worked through whole tutorial, and cleaned up, for 6.0,
              also changed screenshots.
      </td>
  </tr>
  <tr>
      <td>
         5
      </td>
      <td>
         17 November 2007
      </td>
      <td>
	      Fixed spacing between steps. Tried out the attached sample,
              and it works as described.
      </td>
  </tr>
  <tr>
      <td>
         6
      </td>
      <td>
         1 November 2008
      </td>
      <td>
	      Updated to 6.5: badge, table, etc. But also vastly simplified
           the tutorial, by using the NetBeans XMLUtil class, thus was
           able to remove a whole section and a lot of code.
      </td>
  </tr>
  </tbody>
</table>
<p>
<table width="76%" border="1">
 <tbody>
   <tr>
      <td>
        <b>Issue Number</b>
      </td>
      <td>
	<b>Description</b>
      </td>
      <td>
	<b>Status</b>
      </td>
  </tr>
  <tr>
      <td>
         1
      </td>
      <td>
	      Code and tutorial itself need to be reviewed. 
      </td>
      <td>
	      To be fixed.
      </td>
  </tr>
  <tr>
      <td>
         2
      </td>
      <td>
	      Tutorial needs to be updated once Phase III and IV are complete.
      </td>
      <td>
	     Done.
      </td>
  </tr>
 <tr>
      <td>
         3
      </td>
      <td>
	      Some APIs used in this tutorial have deprecated methods. This will
	      produce errors in the Output window, but should not impact functioning
	      of module.
      </td>
      <td>
	      To be fixed.
      </td>
  </tr>
<tr>
      <td>
         4
      </td>
      <td>
	      Clear explanations -- and links to Javadoc -- to be added for all APIs, classes, and methods.
	      Also Javadoc links for each of the dependencies and why they are needed in this tutorial.
      </td>
      <td>
	      To be fixed.
      </td>
  </tr>

<tr>
      <td>
       5
      </td>
      <td>
	      Maybe other identifiers for JSP editor, HTML editor, etc. should be mentioned.
	      For example, instead of "xml" (in layer.xml), use "html", "x-properties", "base" etc.
      </td>
      <td>
	      To be fixed.
      </td>
  </tr> 
<tr>
      <td>
       6
      </td>
      <td>
	      Explain what a cookie is. Explain what a cookie action is.
      </td>
      <td>
	      To be fixed.
      </td>
  </tr> 
<tr>
      <td>
      7
      </td>
      <td>
	      Need to change downloadable, because currently
	       the tag handler and the show XML action are separate files
	       while in the downloadable code, they're in the same file.
	        For the same reason, must change screenshots where one file
		 instead of two are shown.
      </td>
      <td>
	      Done.
      </td>
  </tr> 


  </tbody>
</table>
</body>
</html>
