<!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 Manifest File Syntax Highlighting Module Tutorial</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 Manifest File Syntax Highlighting Module Tutorial</h1>

<p>
<div style="border: 1px solid rgb(14, 27, 85); padding: 10px 30px; background-color: rgb(231, 231, 231); margin-left: 60px; margin-right: 40px;">
    Please note that this tutorial is <b>obsolete</b>. Go here instead:<p>
    <a href="http://wiki.netbeans.org/How_to_create_support_for_a_new_language">http://wiki.netbeans.org/How_to_create_support_for_a_new_language</a>
</div>

<p>This tutorial shows you how to enhance the IDE by adding syntax highlighting for Manifest files. At the end of this tutorial,
 you will have a NetBeans plug-in module file (NBM) that you can share with others. When it is installed
 via the NetBeans Update Center, the 'name', 'colon', and 'value'
 of manifest entries will have distinct colors, as illustrated below:

<p><img src="../../images/tutorials/mf_syntax/result1.png" alt="Highlighted manifest file">

<p>In addition, you will be able to use the Options window to modify the colors.

<p>The following topics are covered in this tutorial:</p>
<ul>
  <li><a href="#gettingtoknowthesample">Getting to Know the Sample</a></li>
  <ul>
  <li><a href="#installing-software">Installing the Software</a></li>
<li><a href="#installing-sample">Installing the Sample</a></li>
  <li><a href="#introducing-sample">Introducing the Sample</a></li>	
  <li><a href="#introducing-sources">Introducing the Sources</a></li>
  </ul>
  <li><a href="#settingupthemoduleproject">Setting Up the Module Project</a></li>
  <ul>
  <li><a href="#creatingthemoduleproject">Creating the Module Project</a></li>
  <li><a href="#specifying">Specifying the Module's Dependencies</a></li>
  </ul>
  <li><a href="#creatingthemainfiles">Creating the Main Files</a></li>
  <ul>
    <li><a href="#tokenizing">Creating Tokens</a>
    <li><a href="#syntaxing">Creating Syntax</a>
   <li><a href="#testing">Giving the IDE a Reading Test</a>
   <li><a href="#editorkitting">Creating the Editor Kit</a>
    <li><a href="#syntaxcoloring">Creating the Syntax Coloring</a>
 <li><a href="#colorrestoring">Creating the Color Restorer</a></ul>
 <li><a href="#creatingthemainfiles">Creating the Supporting Files</a></li>
  <ul>
    <li><a href="#creatingoptions">Creating Options</a>
    <li><a href="#dipslayingoptionsinoptionswindow">Displaying the Options in the Options Window</a>
   <li><a href="#instantiating">Instantiating the Options</a>
 <li><a href="#registeringoptions">Registering the Options in the NetBeans System Filesystem</a>
</ul>
  <li><a href="#building">Building and Installing the Module</a></li>
 <li><a href="#explore">Exploring Further</a></li>
  

</ul>
<p><a name="top"></a>Once the software is installed, this tutorial can be completed in 60 minutes.

<p>For more information on creating NetBeans plug-in modules, see the <a href="https://platform.netbeans.org/index.html">
NetBeans Development Project home</a> on the NetBeans website. If you have questions, visit the 
 <a href="http://wiki.netbeans.org/wiki/view/NetBeansDeveloperFAQ">NetBeans Developer FAQ</a> or use the feedback link
 at the top of this page.</p>

<br />

<!-- ===================================================================================== -->
<h2><a name="gettingtoknowthesample"></a>Getting to Know the Sample</h2>
<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.</p>
<div class="indent">

 <h3 class="tutorial"><a name="installing-software"></a>Installing the Software</h3>
   
    
      <p>Before you begin, you need to install the following software on your 
        computer:</p>
<ul>
     <li>NetBeans IDE 5.x (<a href="http://www.netbeans.info/downloads/download.php?a=n&p=1">download</a>)</li>
    <li>Java Standard Development Kit (JDK&trade;) version 
      1.4.2 (<a href="http://java.sun.com/j2se/1.4.2/download.html">download</a>) 
      or 5.0 (<a href="http://java.sun.com/j2se/1.5.0/download.jsp">download</a>)</li>
  </ul>   

    <h3 class="tutorial"><a name="installing-sample"></a>Installing the Sample</h3>
<p>Take the following steps to install the sample:
<ol><p><li>Unzip the <a href="https://netbeans.org/files/documents/4/583/ManifestSupport.zip">attached file</a>.
<p><li>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><img src="../../images/tutorials/mf_syntax/final_projects_window.png" alt="Final Projects window">
<p><li>Right-click the project node and choose Install/Reload in Target Platform. The target
 platform opens and the module is installed.</ol>

 <h3 class="tutorial"><a name="introducing-sample"></a>Introducing the Sample</h3>
<ol>
<p><li>Use the New project wizard (Ctrl-Shift-N) to create a new Java application 
 project or NetBeans plug-in module project and notice
 that the project's manifest file has syntax highlighting, as shown in the introduction of this tutorial.
<p><li>Choose Tools &gt; Options. In the Options window, click Fonts & Colors in the left sidebar
 and notice that there is an entry called 'Manifest' in the Language drop-down list, as shown below:

<p><img src="../../images/tutorials/mf_syntax/fonts-and-colors-1.png" alt="Fonts and Colors 1">

<p><li>Select City Lights in the Profile drop-down list at the top of the Fonts & Colors page,
 and notice that the syntax changes, as shown below:

<p><img src="../../images/tutorials/mf_syntax/fonts-and-colors-4.png" alt="Fonts and Colors 4">

<p><li>Click Editor in the left sidebar
 and notice that there is an entry called 'Manifest' in the Language drop-down list, as shown below:

<p><img src="../../images/tutorials/mf_syntax/fonts-and-colors-2.png" alt="Fonts and Colors 2">


<p><li>Click Advanced Options in the lower left corner of the Options window. In the Editor Settings node, notice that there is a new entry
 for the Manifest Editor, as shown below:

<p><img src="../../images/tutorials/mf_syntax/fonts-and-colors-3.png" alt="Fonts and Colors 3">

</ol>

<p>Now that you know what the user interface of the Manifest Support plug-in module looks like,
 let's have a quick look at what each of the source files does.

<p><h3 class="tutorial"><a name="introducing-sources"></a>Introducing the Sources</h3>

<p>The Manifest Support sample consists of main files and supporting files.</p>


<ul><li><p><b>Main Files.</b> The module's main files are in the <tt>org.netbeans.modules.manifestsupport</tt> package:
<p><img src="../../images/tutorials/mf_syntax/final_projects_window1.png" alt="Main files.">

  <p><table width="76%" border="1">

    <tbody><tr>
      <td>
	<div align="left"><b>File</b></div>
      </td>
      <td>
	<div align="left"><b>Description</b></div>

      </td>
    </tr>
 <tr>
      <td align="left" valign="top"><tt>Bundle.properties</tt></td>
      <td>
Localization information.

</td>
    </tr>
    <tr>
      <td align="left" valign="top"><a href="#editorkitting"><tt>ManifestEditorKit.java</tt></a></td>
      <td>

Extends the <a href="https://netbeans.org/download/dev/javadoc/org-netbeans-modules-editor/org/netbeans/modules/editor/NbEditorKit.html">NbEditorKit</a> class. 


</td>
    </tr>
    <tr>
      <td align="left" valign="top"><a href="#syntaxcoloring"><tt>ManifestSettingsInitializer.java</tt></a></td>

      <td>

	      Extends the <a href="https://netbeans.org/download/dev/javadoc/org-netbeans-modules-editor-lib/org/netbeans/editor/Settings.AbstractInitializer.html">Settings.AbstractInitializer</a> class. Includes an inner class than extends the <a href="http://www.netbeans.org/download/dev/javadoc/org-netbeans-modules-editor-lib/org/netbeans/editor/SettingsUtil.TokenColoringInitializer.html">SettingsUtil.TokenColoringInitializer</a> class.



      </td>
    </tr>

    <tr>
      <td align="left" valign="top"><a href="#syntaxing"><tt>ManifestSyntax.java</tt></a></td>
      <td>

Extends the <a href="https://netbeans.org/download/dev/javadoc/org-netbeans-modules-editor-lib/org/netbeans/editor/Syntax.html">Syntax</a> class.



</td>
    </tr>
    <tr>
      <td align="left" valign="top"><a href="#tokenizing"><tt>ManifestTokenContext.java</tt></a></td>
      <td>
Extends the <a href="https://netbeans.org/download/dev/javadoc/org-netbeans-modules-editor-lib/org/netbeans/editor/TokenContext.html">TokenContext</a> class.
</td>
    </tr>
 <tr>
      <td align="left" valign="top"><a href="#colorrestoring"><tt>RestoreColoring.java</tt></a></td>
      <td>
Extends the <a href="https://netbeans.org/download/dev/javadoc/org-openide-modules/org/openide/modules/ModuleInstall.html">ModuleInstall</a> class.



</td>

    </tr>
 <tr>
      <td align="left" valign="top"><tt>layer.xml</tt></td>
      <td>
This is the NetBeans System Filesystem configuration file. It registers the
 following information in the NetBeans System Filesystem:
  <ul>
<li>Ability to distinguish Manifest file data objects (via the <tt>.mf</tt> file extension and <tt>text/x-java-jar-manifest</tt> MIME Type).
<li>Actions that appear in the right-click pop-up menu.
<li>A dummy template for creating new Manifest files is registered in the New File wizard.
<li>Editor kit, containing syntax highlighting information.
<li>Options settings file for instantiation of the relevant information in the Options window.
<li>Coloring information for the Options window, one set for the NetBeans profile and another set for the City Lights profile.

</ul>



</td>

    </tr>
    </tbody>
  </table>
<li><p><b>Supporting Files.</b>


<ul><li><p><b>Data Object Files.</b> The module's files that distinguish Manifest files from other files
 are in the <tt>org.netbeans.modules.manifestsupport.dataobject</tt> package:
<p><img src="../../images/tutorials/mf_syntax/final_projects_window2.png" alt="Data object files.">
<p>For information on these files, see the <a href="https://platform.netbeans.org/tutorials/nbm-filetype.html">NetBeans DataLoader Module Tutorial</a>.
<li><p><b>Options Window Files.</b> The module's files that install information in the Options window
 are in the <tt>org.netbeans.modules.manifestsupport.options</tt> package:
<p><img src="../../images/tutorials/mf_syntax/final_projects_window3.png" alt="Options window files.">
<p><table width="76%" border="1">
    <tbody><tr>
      <td>
	<div align="left"><b>File</b></div>
      </td>
      <td>
	<div align="left"><b>Description</b></div>

      </td>
    </tr>
 <tr>
      <td align="left" valign="top"><tt>Bundle.properties</tt></td>
      <td>
Localization information.

</td>
    </tr>
    <tr>
      <td align="left" valign="top"><tt>ManifestOptions.java</tt></td>
      <td>

Extends the <a href="https://netbeans.org/download/dev/javadoc/org-netbeans-modules-editor/org/netbeans/modules/editor/options/BaseOptions.html">BaseOptions</a> class. 


</td>
    </tr>
    <tr>
      <td align="left" valign="top"><tt>ManifestOptions.settings</tt></td>

      <td>
Instantiation data for the Options window.



      </td>
    </tr>

    <tr>
      <td align="left" valign="top"><tt>ManifestOptionsBeanInfo.java</tt></td>
      <td>

Extends the <a href="https://netbeans.org/download/dev/javadoc/org-netbeans-modules-editor/org/netbeans/modules/editor/options/BaseOptionsBeanInfo.html">BaseOptionsBeanInfo</a> class.



</td>
    </tr>
    <tr>
      <td align="left" valign="top"><tt>mfOptions.gif</tt></td>
      <td>GIF file displayed in the node for the Manifest Editor in the Classic View of the Options window.
</td>
    </tr>





</td>

    </tr>
    </tbody>
  </table>

<li><p><b>Resources.</b> The module's resources
 are in the <tt>org.netbeans.modules.manifestsupport.resources</tt> package
 and in the Unit Test Packages node:
<p><img src="../../images/tutorials/mf_syntax/final_projects_window4.png" alt="Resources files.">
  <p><table width="76%" border="1">

    <tbody><tr>
      <td>
	<div align="left"><b>File</b></div>
      </td>
      <td>
	<div align="left"><b>Description</b></div>

      </td>
    </tr>
 <tr>
      <td align="left" valign="top"><tt>CityLights-Properties-fontsColors.xml</tt></td>
      <td>
Colors for the CityLights profile in the Fonts & Colors page of the Options window.

</td>
    </tr>
    <tr>
      <td align="left" valign="top"><tt>ManifestExample</tt></td>
      <td>

Example used in the Fonts & Colors page of the Options window.



</td>
    </tr>
    <tr>
      <td align="left" valign="top"><tt>NetBeans-Manifest-fontsColors.xml</tt></td>

      <td>
Colors for the NetBeans profile in the Fonts & Colors page of the Options window.



      </td>
    </tr>

    <tr>
      <td align="left" valign="top"><tt>ManifestSyntaxTest.java</tt></td>
      <td>

JUnit test for testing the Manifest file's tokens.



</td>
    </tr>

</td>

    </tr>
    </tbody>
  </table>
<li><p><b>Important Files.</b> The Projects window is typically used to display a project's packages. However,
 to simplify working with some of the more important files in the project, you can access them through the
 Important Files node:
<p><img src="../../images/tutorials/mf_syntax/final_projects_window5.png" alt="Important files.">

<p>For basic information each of the Important Files, see the 
 <a href="https://netbeans.org/kb/articles/quickstart-nbm.html">Introduction to NetBeans Module Development</a>.</ul></ul>

</div>
<br />



<!-- ===================================================================================== -->
<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. <a href="http://www.netbeans.info/downloads/download.php?a=n&p=1">NetBeans IDE 5.x</a> 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>
      <ol>
	<p><li>Choose File &gt; New Project. Under Categories, select NetBeans Plug-in Modules. Under projects, 
 select Module Project and click Next.</li>
	<p><li>In the Name and Location panel, type <tt>ManifestSupport</tt> in Project Name.
 Change the
Project Location to any directory on your computer, such as <tt>c:\mymodules</tt>. Leave the Standalone Module radiobutton
and the Set as Main Project checkbox selected.
 Click Next.

 <p><li>In the Basic Module Configuration panel, replace <tt>yourorghere</tt> in Code Name Base with <tt>netbeans.modules</tt>
  so that the whole name is <tt>org.netbeans.modules.manifestsupport</tt>. Leave <tt>ManifestSupport</tt> as the Module Display Name.
 Leave the location of the localizing bundle and XML layer, so that they will be stored in a
 package with the name <tt>org.netbeans.modules.manifestsupport</tt>. Click Finish.</ol>

<p> The IDE creates the <tt>ManifestSupport</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 subclass several classes that belong to <a href="https://netbeans.org/download/dev/javadoc/">NetBeans APIs</a>. 
 Each has to be declared as a Module dependency. Use the Project Properties dialog box for this purpose.
  <ol>
	  <li>In the Projects window, right-click the <tt>ManifestSupport</tt> project node and choose Properties.
 In the Project Properties dialog box, click Libraries.</li>
	
 <p><li>For each of the following APIs that is not already present in the Libraries panel, click "Add...", 
 select the name from the Module list, and then click OK to confirm it:
<p><ul>
<li><tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-loaders/org/openide/loaders/doc-files/api.html">Datasystems API</a></tt>
<li><tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-text/overview-summary.html">Editor API</a></tt>
<li><tt>Editor Library API</tt>
<li><tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-filesystems/overview-summary.html">File System API</a></tt>
<li><tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-modules/overview-summary.html">Module System API</a></tt>
<li><tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-nodes/overview-summary.html">Nodes API</a></tt>
<li><tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-options/org/openide/options/doc-files/api.html">Settings Options API</a></tt>
<li><tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-text/overview-summary.html">Text API</a></tt>
<li><tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-util/overview-summary.html">Utilities API</a></tt>
<li><tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-windows/overview-summary.html">Window System API</a></tt>
</ul>
<p>You should now see the following:
<p><img src="../../images/tutorials/mf_syntax/proj-props1.png" alt="Project Properties dialog box.">
<p><li>Click OK to exit the Project Properties dialog box.
<p><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>

<pre class=examplecode>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;project xmlns="https://netbeans.org/ns/project/1"&gt;
    &lt;type&gt;org.netbeans.modules.apisupport.project&lt;/type&gt;
    &lt;configuration&gt;
        &lt;data xmlns="https://netbeans.org/ns/nb-module-project/2"&gt;
            &lt;code-name-base&gt;org.netbeans.modules.manifestsupport&lt;/code-name-base&gt;
            &lt;standalone/&gt;
            &lt;module-dependencies&gt;
                &lt;dependency&gt;
                    &lt;code-name-base&gt;org.netbeans.modules.editor&lt;/code-name-base&gt;
                    &lt;build-prerequisite/&gt;
                    &lt;compile-dependency/&gt;
                    &lt;run-dependency&gt;
                        &lt;release-version&gt;3&lt;/release-version&gt;
                        &lt;specification-version&gt;1.25.0.1&lt;/specification-version&gt;
                    &lt;/run-dependency&gt;
                &lt;/dependency&gt;
                &lt;dependency&gt;
                    &lt;code-name-base&gt;org.netbeans.modules.editor.lib&lt;/code-name-base&gt;
                    &lt;build-prerequisite/&gt;
                    &lt;compile-dependency/&gt;
                    &lt;run-dependency&gt;
                        &lt;release-version&gt;1&lt;/release-version&gt;
                        &lt;specification-version&gt;1.8.0.1&lt;/specification-version&gt;
                    &lt;/run-dependency&gt;
                &lt;/dependency&gt;
                &lt;dependency&gt;
                    &lt;code-name-base&gt;org.openide.modules&lt;/code-name-base&gt;
                    &lt;build-prerequisite/&gt;
                    &lt;compile-dependency/&gt;
                    &lt;run-dependency&gt;
                        &lt;specification-version&gt;6.4&lt;/specification-version&gt;
                    &lt;/run-dependency&gt;
                &lt;/dependency&gt;
                &lt;dependency&gt;
                    &lt;code-name-base&gt;org.openide.options&lt;/code-name-base&gt;
                    &lt;build-prerequisite/&gt;
                    &lt;compile-dependency/&gt;
                    &lt;run-dependency&gt;
                        &lt;specification-version&gt;6.3&lt;/specification-version&gt;
                    &lt;/run-dependency&gt;
                &lt;/dependency&gt;
                &lt;dependency&gt;
                    &lt;code-name-base&gt;org.openide.util&lt;/code-name-base&gt;
                    &lt;build-prerequisite/&gt;
                    &lt;compile-dependency/&gt;
                    &lt;run-dependency&gt;
                        &lt;specification-version&gt;6.5&lt;/specification-version&gt;
                    &lt;/run-dependency&gt;
                &lt;/dependency&gt;
                &lt;dependency&gt;
                    &lt;code-name-base&gt;org.openide.filesystems&lt;/code-name-base&gt;
                    &lt;build-prerequisite/&gt;
                    &lt;compile-dependency/&gt;
                    &lt;run-dependency&gt;
                        &lt;specification-version&gt;6.3&lt;/specification-version&gt;
                    &lt;/run-dependency&gt;
                &lt;/dependency&gt;
                &lt;dependency&gt;
                    &lt;code-name-base&gt;org.openide.loaders&lt;/code-name-base&gt;
                    &lt;build-prerequisite/&gt;
                    &lt;compile-dependency/&gt;
                    &lt;run-dependency&gt;
                        &lt;specification-version&gt;5.7&lt;/specification-version&gt;
                    &lt;/run-dependency&gt;
                &lt;/dependency&gt;
                &lt;dependency&gt;
                    &lt;code-name-base&gt;org.openide.nodes&lt;/code-name-base&gt;
                    &lt;build-prerequisite/&gt;
                    &lt;compile-dependency/&gt;
                    &lt;run-dependency&gt;
                        &lt;specification-version&gt;6.6&lt;/specification-version&gt;
                    &lt;/run-dependency&gt;
                &lt;/dependency&gt;
                &lt;dependency&gt;
                    &lt;code-name-base&gt;org.openide.text&lt;/code-name-base&gt;
                    &lt;build-prerequisite/&gt;
                    &lt;compile-dependency/&gt;
                    &lt;run-dependency&gt;
                        &lt;specification-version&gt;6.7&lt;/specification-version&gt;
                    &lt;/run-dependency&gt;
                &lt;/dependency&gt;
                &lt;dependency&gt;
                    &lt;code-name-base&gt;org.openide.windows&lt;/code-name-base&gt;
                    &lt;build-prerequisite/&gt;
                    &lt;compile-dependency/&gt;
                    &lt;run-dependency&gt;
                        &lt;specification-version&gt;6.3&lt;/specification-version&gt;
                    &lt;/run-dependency&gt;
                &lt;/dependency&gt;
            &lt;/module-dependencies&gt;
            &lt;public-packages/&gt;
        &lt;/data&gt;
    &lt;/configuration&gt;
&lt;/project&gt;</pre>

 
  </ol>

<!-- ===================================================================================== -->
  
<h2><a name="creatingthemodule"></a>Creating the Main Files</h2>
<p>Creating the module starts with ensuring that the IDE recognizes Manifest files. By default, it does not
 recognize them and, therefore, treats them as text files. Work through the <a href="https://platform.netbeans.org/tutorials/nbm-filetype.html">NetBeans DataLoader Module Tutorial</a>
 before going further&#8212;make sure that you put the files you create in a package
 called <tt>org.netbeans.modules.manifestsupport.dataobject</tt>. Before you go further with this tutorial,
  the IDE should be able to recognize Manifest files. At the end of the NetBeans DataLoader Module Tutorial, you should
 have a new MIME Type, too: <tt>text/x-java-jar-manifest</tt>. This MIME Type is used throughout this tutorial.
<p>Once you have a dataloader specifically for Manifest files, you need to identify items in the Manifest file that you want the IDE to be able to distinguish
from each other. Each distinct item is called a <i>token</i>. Once you have created tokens, you need to tell the IDE
 how to interpret the text it finds&#8212;it needs to be told which piece of text constitutes which token.
  In other words, you need to create a <i>syntax</i>. Next, you associate the tokens
with colors. In the process, you create an editor specifically for Manifest files. 
<div class="indent">
	<p><h3 class="tutorial"><a name="tokenizing"></a>Creating Tokens</h3>

<p>Do the following:
<ol>
<p><li><b>Create the file.</b> Right-click the <tt>ManifestSupport</tt> project node, choose New &gt; Java Class,
 and type <tt>ManifestTokenContext</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>package org.netbeans.modules.manifestsupport;

import org.netbeans.editor.BaseTokenID;
import org.netbeans.editor.TokenContext;
import org.netbeans.editor.TokenContextPath;
import org.netbeans.editor.Utilities;

public class ManifestTokenContext extends <a href="https://netbeans.org/download/dev/javadoc/org-netbeans-modules-editor-lib/org/netbeans/editor/TokenContext.html">TokenContext</a> {
       
    // Numeric-ids for token categories
    public static final int NAME_ID = 1;
    public static final int COLON_ID = 2;
    public static final int VALUE_ID = 3;
    public static final int END_OF_LINE_ID = 4;
    
    // Token-ids
    public static final BaseTokenID NAME = new BaseTokenID("name", NAME_ID);
    public static final BaseTokenID COLON = new BaseTokenID("colon", COLON_ID);
    public static final BaseTokenID VALUE = new BaseTokenID("value", VALUE_ID);
    public static final BaseTokenID END_OF_LINE =
            new BaseTokenID("end-of-line", END_OF_LINE_ID);
   
    // Context instance declaration
    public static final ManifestTokenContext context = new ManifestTokenContext();
    public static final TokenContextPath contextPath = context.getContextPath();
    
    /**
     * Construct a new ManifestTokenContext
     */
    private ManifestTokenContext() {
        super("mf-");
        
        try {
            addDeclaredTokenIDs();
        } catch (Exception e) {
            Utilities.annotateLoggable(e);
        }
    }
}</pre></li>

<p><li><b>Understand the file.</b> This Java class specifies a token for each item in the Manifest file with which we want to
 work. Each distinct item in a Manifest file is a token:
 'name', 'colon', and 'value'. In addition, there is also a token for the end of the line, because we need to
 work with the end of the line&#8212;the end of the line
 determines where a value ends and the next name begins. The constructor above specifies that all tokens will
 be prefaced by 'mf-'. So, we've now created tokens called 'mf-name', 'mf-colon', 'mf-value', and 'mf-end-of-line'.
</ol>
<h3 class="tutorial"><a name="syntaxing"></a>Creating Syntax</h3>
<p>Do the following:
<ol>
<p><li><b>Create the file.</b> Right-click the <tt>ManifestSupport</tt> project node, choose New &gt; Java Class,
 and type <tt>ManifestSyntax</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>package org.netbeans.modules.manifestsupport;

import org.netbeans.editor.Syntax;
import org.netbeans.editor.TokenID;
import org.openide.ErrorManager;

public class ManifestSyntax extends Syntax {
    
    /**
     * The logger for this class. It can be used for tracing the class activity, 
     * logging debug messages, etc.
     */
    private static final ErrorManager LOGGER = 
            ErrorManager.getDefault().getInstance("org.netbeans.modules." +
            "manifestsupport.ManifestSyntax");
    
    /**
     * Used to avoing calling the log() or notify() method if the message 
     * wouldn't be loggable anyway.
     */
    private static final boolean LOG = 
            LOGGER.isLoggable(ErrorManager.INFORMATIONAL);
    
    // The states for the lexical analyzer
    
    private static final int ISI_NAME = 1; // inside the name part
    private static final int ISA_AFTER_NAME = ISI_NAME + 1; // immediately after the name part
    private static final int ISA_AFTER_COLON = ISA_AFTER_NAME + 1; // immediately after the 
                                                                   // colon between the name 
                                                                   // and the value
    private static final int ISI_VALUE = ISA_AFTER_COLON + 1; // inside the value part
    
    protected TokenID parseToken() {
        TokenID result = doParseToken();
        if (LOG) {
            LOGGER.log(ErrorManager.INFORMATIONAL, "parseToken: " + result);
        }
        return result;
    }
    
    private TokenID doParseToken() {
        char actChar;
        
        while (offset < stopOffset) {
            actChar = buffer[offset];
            
            switch (state) {
                case INIT:
                    switch (actChar) {
                        case ':':
                            state = ISA_AFTER_COLON;
                            offset++;
                            return ManifestTokenContext.COLON;
                        case '\n':
                            state = INIT;
                            offset++;
                            return ManifestTokenContext.END_OF_LINE;
                        default:
                            state = ISI_NAME;
                    }
                    break;
                    
                case ISI_NAME:
                    switch (actChar) {
                        case ':':
                        case '\n':
                            state = ISA_AFTER_NAME;
                            return ManifestTokenContext.NAME;
                    }
                    break;
                    
                case ISA_AFTER_NAME:
                    switch (actChar) {
                        case ':':
                            state = ISA_AFTER_COLON;
                            offset++;
                            return ManifestTokenContext.COLON;
                        case '\n':
                            state = INIT;
                            offset++;
                            return ManifestTokenContext.END_OF_LINE;
                        default:
                            assert false;
                    }
                    break;
                    
                case ISA_AFTER_COLON:
                    switch (actChar) {
                        case '\n':
                            state = INIT;
                            offset++;
                            return ManifestTokenContext.END_OF_LINE;
                        default:
                            state = ISI_VALUE;
                    }
                    break;
                    
                case ISI_VALUE:
                    switch (actChar) {
                        case '\n':
                            state = INIT;
                            return ManifestTokenContext.VALUE;
                    }
                    break;
            }
            
            offset++;
        }
        
        /*
         * At this stage there's no more text in the scanned buffer.
         * It is valid to return a token here only if this is the last
         * buffer (otherwise the token could continue in the next buffer).
         */
        if (lastBuffer) {
            switch (state) {
                case ISI_NAME:
                    state = INIT;
                    return ManifestTokenContext.NAME;
                case ISI_VALUE:
                    state = INIT;
                    return ManifestTokenContext.VALUE;
            }
        }
        
        return null;
    }
    
}</pre></li>

<p><li><b>Understand the file.</b> This Java class tells the IDE which part of the text is which token.
It does this by starting in an initial state and sequentially looking at each character in the text 
and deciding if it stays in that state, moves to another state, or announces that a token was found. 
<p>For example, for names the IDE starts in the initial state and the first time it encounters a valid character 
for a name, it enters the <tt>ISI_NAME</tt> state. It stays in this state until it encounters a <tt>\r</tt>, <tt>\n</tt> or <tt>:</tt>
character, which cannot be part of a name. When it encounters such a character, the IDE knows that 
the characters it just traversed make up a name token. The code runs within a while loop. At the end there is 
a break statement, which increases the offset
in the text. The return statement in the code avoids increasing the offset and ensures that the parsing 
of the next token, after a name, will start with this character (it will likely be a colon, which is a 
 meaningful token itself). 
 The break statement, on the other hand, ensures that offset is increased. When all the characters 
 up to the colon are tested, the IDE knows whether the cursor is inside a name or not.
</ol>

<h3 class="tutorial"><a name="testing"></a>Giving the IDE a Reading Test</h3>

<p>Do the following:
<ol>
<p><li><b>Create the file.</b> Right-click the Unit Test Packages node, choose New &gt; Java Class,
 type <tt>ManifestSyntaxTest</tt> in Class Name, and type <tt>org.netbeans.modules.manifestsupport</tt> in Package.
  Click Finish. The new Java class opens in the Source Editor.
 Replace the default code with the following:

<pre class=examplecode>import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import junit.framework.TestCase;
import org.netbeans.editor.Syntax;
import org.netbeans.editor.TokenID;
import org.netbeans.modules.manifestsupport.*;
import junit.framework.TestCase;

public class ManifestSyntaxTest extends TestCase {
    
    public ManifestSyntaxTest(String testName) {
        super(testName);
    }
    
    public void testNextToken() {
	doParse("Manifest-Version: 1.0", new TokenID[] {
            ManifestTokenContext.NAME,
            ManifestTokenContext.COLON,
            ManifestTokenContext.VALUE,
        });
        doParse("Manifest-Version: 1.0\n\n" + 
                 "OpenIDE-Module: org.netbeans.modules.manifestsupport\n", 
                 new TokenID[] {
           ManifestTokenContext.NAME,
           ManifestTokenContext.COLON,
           ManifestTokenContext.VALUE,
           ManifestTokenContext.END_OF_LINE,
           ManifestTokenContext.END_OF_LINE,
           ManifestTokenContext.NAME,
   	   ManifestTokenContext.COLON,
           ManifestTokenContext.VALUE,
           ManifestTokenContext.END_OF_LINE,
        });
    }
        
    public void doParse(String m, TokenID[] expected) {
        Syntax s = new ManifestSyntax();
        s.load(null, m.toCharArray(), 0, m.length(), true, m.length());
        
        TokenID token = null;
        Iterator i = Arrays.asList(expected).iterator();
        do {
            token = s.nextToken();
            if (token != null) {
                if (!i.hasNext()) {
                    fail("More tokens returned than expected.");
                } else {
                    assertSame("Tokens differ", i.next(), token);
                }
            } else {
                assertFalse("More tokens expected than returned.", i.hasNext());
            }
            System.out.println(token);
        } while (token != null);
    }
}</pre></li>

<p><li><b>Understand the file.</b> This Java class checks that the IDE is able to correctly convert text to tokens.
 To run the test, right-click the project node and choose Run Unit Tests. The test should succeed, returning the
 following result in the JUnit Test Results window:

<p><img src="../../images/tutorials/mf_syntax/junit-success.png" alt="error result from JUnit test.">

<p>You can play with the <tt>testNextToken()</tt> method to see what the IDE does when the entered
 text does not comply with the specified tokens. For example, change the method by deleting one of the token IDs (<tt>ManifestTokenContext.VALUE</tt>),
 so that the method looks as follows:

<p><pre class="examplecode">public void testNextToken() {
   doParse("Manifest-Version: 1.0", new TokenID[] {
        ManifestTokenContext.NAME,
        ManifestTokenContext.COLON,
   });
}</pre>

<p>Now there are more tokens than token IDs. (There are two token IDs here&#8212;<tt>ManifestTokenContext.NAME</tt> and <tt>ManifestTokenContext.COLON</tt>.)  When you run the JUnit test, the message 'More tokens returned than expected.' is returned:

<p><img src="../../images/tutorials/mf_syntax/junit-more-tokens-than-expected.png" alt="error result from JUnit test.">

<p>Now change the method by deleting the colon between <tt>Manifest-Version</tt> and <tt>1.0</tt>, as shown below:

<p><pre class="examplecode">public void testNextToken() {
   doParse("Manifest-Version 1.0", new TokenID[] {
        ManifestTokenContext.NAME,
        ManifestTokenContext.COLON,
        ManifestTokenContext.VALUE,
   });
}</pre>

<p>Now there are too few tokens. When you run the JUnit test, the message 'More tokens expected than returned.' is returned:

<p><img src="../../images/tutorials/mf_syntax/junit-more-tokens-than-returned.png" alt="error result from JUnit test.">

<p>Finally, let's test to see that the IDE understands more than just when there are too many or
 too few tokens&#8212;it should also know when a token is in the wrong place. Add the token
 that specifies the end-of-line. For example, here <tt>\n</tt> is added right after the name and
 before the colon:

<p><pre class="examplecode">public void testNextToken() {
  doParse("Manifest-Version\n:1.0", new TokenID[] {
       ManifestTokenContext.NAME,
       ManifestTokenContext.COLON,
       ManifestTokenContext.VALUE,
  });
}</pre>

<p>When you run the test, the following error is returned:

<p><img src="../../images/tutorials/mf_syntax/junit-wrong-token.png" alt="error result from JUnit test.">

<p>Now that we know that the IDE correctly converts manifest entries into tokens, lets create an editor
 to work with Manifest files and associate colors with tokens.

</ol>


<h3 class="tutorial"><a name="editorkitting"></a>Creating the EditorKit</h3>

<p>Do the following:
<ol>
<p><li><b>Create the file.</b> Right-click the <tt>ManifestSupport</tt> project node, choose New &gt; Java Class,
 and type <tt>ManifestEditorKit</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>package org.netbeans.modules.manifestsupport;

import javax.swing.text.Document;
import org.netbeans.editor.BaseDocument;
import org.netbeans.editor.Syntax;
import org.netbeans.editor.SyntaxSupport;
import org.netbeans.modules.editor.NbEditorKit;
import org.openide.ErrorManager;

public class ManifestEditorKit extends <a href="https://netbeans.org/download/dev/javadoc/org-netbeans-modules-editor/org/netbeans/modules/editor/NbEditorKit.html">NbEditorKit</a> {
   
    public static final String MIME_TYPE = "text/x-java-jar-manifest"; // NOI18N
    
    /** 
     * Creates a new instance of ManifestEditorKit 
     */
    public ManifestEditorKit() { 
    }
    
    /**
     * Create a syntax object suitable for highlighting Manifest file syntax
     */
    public Syntax createSyntax(Document doc) {  
        return new ManifestSyntax();
    }
    
    /**
     * Retrieves the content type for this editor kit
     */
    public String getContentType() {
        return MIME_TYPE;
    }
}</pre></li>

<p><li><b>Understand the file.</b> This Java class specifies an <a href="http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/text/EditorKit.html">EditorKit</a> specifically for a NetBeans editor. Therefore, it extends the <a href="https://netbeans.org/download/dev/javadoc/org-netbeans-modules-editor/org/netbeans/modules/editor/NbEditorKit.html">NBEditorKit</a> class. An editor kit establishes the set of things needed by a text
component to be a reasonably functioning editor for some type  of text content. In this case, the editor is for
content that uses the <tt>text/x-java-jar-manifest</tt> MIME Type.
</ol>


<h3 class="tutorial"><a name="syntaxcoloring"></a>Creating the Syntax Coloring</h3>

<p>Do the following:
<ol>
<p><li><b>Create the file.</b> Right-click the <tt>ManifestSupport</tt> project node, choose New &gt; Java Class,
 and type <tt>ManifestSettingsInitializer</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>package org.netbeans.modules.manifestsupport;

import java.awt.Color;
import java.awt.Font;
import java.util.Map;
import org.netbeans.editor.BaseKit;
import org.netbeans.editor.Coloring;
import org.netbeans.editor.Settings;
import org.netbeans.editor.SettingsDefaults;
import org.netbeans.editor.SettingsNames;
import org.netbeans.editor.SettingsUtil;
import org.netbeans.editor.TokenCategory;
import org.netbeans.editor.TokenContext;
import org.netbeans.editor.TokenContextPath;

public class ManifestSettingsInitializer 
        extends Settings.AbstractInitializer {
    
    public static final String NAME = 
            "manifest-settings-initializer"; // NOI18N
    
    /**
     * Constructor
     */
    public ManifestSettingsInitializer() {
        super(NAME);
    }
    
    /**
     * Update map filled with the settings.
     * @param kitClass kit class for which the settings are being updated.
     *   It is always non-null value.
     * @param settingsMap map holding [setting-name, setting-value] pairs.
     *   The map can be empty if this is the first initializer
     *   that updates it or if no previous initializers updated it.
     */
    public void updateSettingsMap(Class kitClass, Map settingsMap) {
        if (kitClass == BaseKit.class) {
            new ManifestTokenColoringInitializer().
                    updateSettingsMap(kitClass, settingsMap);
        }
        
        if (kitClass == ManifestEditorKit.class) {
            SettingsUtil.updateListSetting(
                    settingsMap,
                    SettingsNames.TOKEN_CONTEXT_LIST,
                    new TokenContext[] 
            { ManifestTokenContext.context }
            );
        }
    }
    
    /**
     * Class for adding syntax coloring to the editor
     */
    /** Properties token coloring initializer. */
    private static class ManifestTokenColoringInitializer 
            extends SettingsUtil.TokenColoringInitializer {
        
        /** Bold font. */
        private static final Font boldFont = 
                SettingsDefaults.defaultFont.deriveFont(Font.BOLD);
        /** Italic font. */
        private static final Font italicFont = 
                SettingsDefaults.defaultFont.deriveFont(Font.ITALIC);
        
        /** Key coloring. */
        private static final Coloring keyColoring = 
                new Coloring(boldFont, Coloring.FONT_MODE_APPLY_STYLE, 
                Color.blue, null);
        /** Value coloring. */
        private static final Coloring valueColoring = 
                new Coloring(null, Color.magenta, null);
        /** Colon coloring. */
        private static final Coloring colonColoring = 
                new Coloring(null, Color.DARK_GRAY, null);
        /** Empty coloring. */
        private static final Coloring emptyColoring = 
                new Coloring(null, null, null);
        
        
        /** Constructs <code>PropertiesTokenColoringInitializer</code>. */
        public ManifestTokenColoringInitializer() {
            super(ManifestTokenContext.context);
        }
        
        
        /** Gets token coloring. */
        public Object getTokenColoring(TokenContextPath tokenContextPath,
                TokenCategory tokenIDOrCategory, boolean printingSet) {
            
            if(!printingSet) {
                int tokenID = tokenIDOrCategory.getNumericID();
                
                if(tokenID == ManifestTokenContext.NAME_ID) {
                    return keyColoring;
                } else if(tokenID == ManifestTokenContext.VALUE_ID) {
                    return valueColoring;
                } else if(tokenID == ManifestTokenContext.COLON_ID) {
                    return colonColoring;
                    
                }
            } else { // printing set
                return SettingsUtil.defaultPrintColoringEvaluator;
            }
            
            return null;
        }
        
    } // End of class ManifestTokenColoringInitializer.
    
}</pre></li>

<p><li><b>Understand the file.</b> This Java class sets the default colors for our tokens. Thanks to the supporting files
 described in the following sections, the user will be able to
 use the Options window to change the defaults.
</ol>

<h3 class="tutorial"><a name="colorrestoring"></a>Creating the Color Restorer</h3>

<p>Do the following:
<ol>
<p><li><b>Create the file.</b> Right-click the <tt>ManifestSupport</tt> project node, choose New &gt; Java Class,
 and type <tt>RestoreColoring </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>package org.netbeans.modules.manifestsupport;

import org.netbeans.editor.LocaleSupport;
import org.netbeans.editor.Settings;
import org.openide.modules.ModuleInstall;
import org.openide.util.NbBundle;

public class RestoreColoring extends <a href="https://netbeans.org/download/dev/javadoc/org-openide-modules/org/openide/modules/ModuleInstall.html">ModuleInstall</a> {
    
    /**
     * <code>Localizer</code> passed to editor.
     */
    private static LocaleSupport.Localizer localizer;
    
    /**
     * Registers properties editor, installs options and copies settings.
     * Overrides superclass method.
     */
    public void restored() {
        addInitializer();
        installOptions();
    }
    
    /**
     * Uninstalls properties options.
     * And cleans up editor settings copy.
     * Overrides superclass method.
     */
    public void uninstalled() {
        uninstallOptions();
    }
    
    /**
     * Adds initializer and registers editor kit.
     */
    public void addInitializer() {
        Settings.addInitializer(new ManifestSettingsInitializer());
    }
    
    /**
     * Installs properties editor and print options.
     */
    public void installOptions() {
        // Adds localizer.
        LocaleSupport.addLocalizer(localizer = new LocaleSupport.Localizer() {
            public String getString(String key) {
                return NbBundle.getMessage(RestoreColoring.class, key);
            }
        });
    }
    
    /** Uninstalls properties editor and print options. */
    public void uninstallOptions() {
        // remove localizer
        LocaleSupport.removeLocalizer(localizer);
    }
    
}</pre></li>

<p><li><b>Understand the file.</b> This Java class is used to install the module and maintain its state. In addition to creating it,
you must specify this class in the module's manifest file, by adding the following line:
<p><pre class="examplecode">OpenIDE-Module-Install: org/netbeans/modules/manifestsupport/RestoreColoring.class</pre><p>

<p>Note that the <tt>OpenIDE-Module-Install</tt> key belongs at the end of the first section (it is highlighted in bold below):

<p><pre class="examplecode">Manifest-Version: 1.0
OpenIDE-Module: org.netbeans.modules.manifestsupport
OpenIDE-Module-Layer: org/netbeans/modules/manifestsupport/layer.xml
OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/manifestsupport/Bundle.properties
OpenIDE-Module-Specification-Version: 1.0
<b>OpenIDE-Module-Install: org/netbeans/modules/manifestsupport/RestoreColoring.class</b>

Name: org/netbeans/modules/manifestsupport/dataobject/ManifestDataLoader.class
OpenIDE-Module-Class: Loader</pre>


</ol>




<h2><a name="creatingthemodule"></a>Creating the Supporting Files</h2>
<p>In this section, you update the 
 Options window to allow the user to customize the way the tokens are presented
 in the IDE. Not only the colors, but also the font type and style, and the Manifest editor itself, can then
  be modified by the user in the Options window.
<div class="indent">

<p><h3 class="tutorial"><a name="creatingoptions"></a>Creating the Options</h3>

<p>Do the following:
<ol>
<p><li><b>Create the file.</b> Right-click the <tt>ManifestSupport</tt> project node, choose New &gt; Java Class,
 type <tt>ManifestOptions</tt> in Class Name, and type <tt>org.netbeans.modules.manifestsupport.options</tt>
 in Package. Click Finish. The new Java class opens in the Source Editor.
 Replace the default code with the following:

<pre class=examplecode>package org.netbeans.modules.manifestsupport.options;

import java.util.MissingResourceException;
import org.netbeans.modules.editor.options.BaseOptions;
import org.netbeans.modules.manifestsupport.ManifestEditorKit;
import org.openide.util.HelpCtx;
import org.openide.util.NbBundle;

public class ManifestOptions extends BaseOptions {
    
    public static String MANIFEST = "Manifest"; // NOI18N
    
    /** Name of property. */
    private static final String HELP_ID = "editing.editor.mf"; // NOI18N
    
    //no manifest specific options at this time
    static final String[] MF_PROP_NAMES = new String[] {};
    
    public ManifestOptions() {
        super(ManifestEditorKit.class, MANIFEST);
    }
    
    /**
     * Gets the help ID
     */
    public HelpCtx getHelpCtx() {
        return new HelpCtx(HELP_ID);
    }
    
    /**
     * Look up a resource bundle message, if it is not found locally defer to
     * the super implementation
     */
    protected String getString(String key) {
        try {
            return NbBundle.getMessage(ManifestOptions.class, key);
        } catch (MissingResourceException e) {
            return super.getString(key);
        }
    }
    
}</pre></li>

<p><li><b>Understand the file.</b> This Java class registers the <tt>ManifestEditorKit</tt> in the
Options window. If there were properties specific to the Manifest Editor, they would be added in
 the <tt>static final String[] MF_PROP_NAMES = new String[] {};</tt> declaration. However, in this 
 implementation, only the default options will be supported. In addition, this file adds the string 'Manifest' to the drop-down list in the Code Templates
 page of the Editor section, as shown below:

<p><img src="../../images/tutorials/mf_syntax/fonts-and-colors-2.png" alt="Fonts and Colors 2">

</ol>

<h3 class="tutorial"><a name="dipslayingoptionsinoptionswindow"></a>Displaying the Options in the Options Window</h3>

<p>Do the following:
<ol>
<p><li><b>Create the file.</b> Create the <tt>ManifestOptionsBeanInfo</tt> file and add it
 to the <tt>org.netbeans.modules.manifestsupport.options</tt> package.
 Replace the default code with the following:

<pre class=examplecode>package org.netbeans.modules.manifestsupport.options;

import java.util.MissingResourceException;
import org.netbeans.modules.editor.options.BaseOptionsBeanInfo;
import org.netbeans.modules.editor.options.OptionSupport;
import org.openide.util.NbBundle;

public class ManifestOptionsBeanInfo extends BaseOptionsBeanInfo {
    
    /**
     * Constructor. The parameter in the superclass constructor is the
     * icon prefix. 
     */
    public ManifestOptionsBeanInfo() {
        super("/org/netbeans/modules/manifestsupport/options/mfOptions"); // NOI18N
    }
    
    /*
     * Gets the property names after merging it with the set of properties
     * available from the BaseOptions from the editor module.
     */
    protected String[] getPropNames() {
        return OptionSupport.mergeStringArrays(
                super.getPropNames(),
                ManifestOptions.MF_PROP_NAMES);
    }
    
    /**
     * Get the class described by this bean info
     */
    protected Class getBeanClass() {
        return ManifestOptions.class;
    }
    
    /**
     * Look up a resource bundle message, if it is not found locally defer to
     * the super implementation
     */
    protected String getString(String key) {
        try {
            return NbBundle.getMessage(ManifestOptionsBeanInfo.class, key);
        } catch (MissingResourceException e) {
            return super.getString(key);
        }
    }
}</pre></li>

<p><li><b>Understand the file.</b> This Java class displays the options specified
in <tt>ManifestOptions</tt> in the Options window. The file referenced in the constructor
 can be any 16x16 pixel file. If you do not have one, you can get it from the downloadable
 ZIP file at the top of the page or you can right-click and save it here: <img src="../../images/tutorials/mf_syntax/mfOptions.gif" alt="mfOptions">

<p>Add a <tt>Bundle.properties</tt> file to the <tt>org.netbeans.modules.manifestsupport.options</tt>
  package and add this line to it:

  <p><pre class="examplecode">OPTIONS_Manifest=Manifest Editor</pre>

<p>The string after the "OPTIONS_" above <b>must</b> match the String declaration in the
 <tt>ManifestOptions</tt> class. For example, in this tutorial, the following string is declared in
 <tt>ManifestOptions.java</tt>:

<p><pre class="examplecode">public static String MANIFEST = "Manifest";</pre>

<p>However, if this line was as follows:

<p><pre class="examplecode">public static String MANIFEST = "MF";</pre>

Then the <tt>Bundle.properties</tt> file would specify this string instead:

<p><pre class="examplecode">OPTIONS_MF=Manifest Editor</pre>

<p>Note also that the string is case-sensitive.

<p>Now this is the label that will be displayed in the Classic View of the Options window, to
 distinguish the Manifest Editor section from the other editors displayed in the Classic View of the Options window, as shown below:

<p><img src="../../images/tutorials/mf_syntax/fonts-and-colors-3.png" alt="Fonts and Colors 3">
<p>Notice that there is an icon to the left of the label 'Manifest Editor' in the screenshot above. This is
 the <tt>mfOptions.gif</tt> file specified in the <tt>ManifestOptionsBeanInfo </tt> class.
</ol>

<h3 class="tutorial"><a name="instantiating"></a>Instantiating the Options</h3>

<p>Do the following:
<ol>
<p><li><b>Create the file.</b> Create an XML file called <tt>ManifestOptions.settings</tt> 
 and place it in the <tt>org.netbeans.modules.manifestsupport.options</tt> package.
 Replace the default code with the following:

<pre class=examplecode>&lt;?xml version="1.0"?&gt;
&lt;!DOCTYPE settings PUBLIC "-//NetBeans//DTD Session settings 1.0//EN" 
 "https://netbeans.org/dtds/sessionsettings-1_0.dtd"&gt;
&lt;settings version="1.0"&gt;
    &lt;module name="org.netbeans.modules.manifestsupport"/&gt;
    &lt;instanceof class="java.io.Externalizable"/&gt;
    &lt;instanceof class="org.openide.util.SharedClassObject"/&gt;
    &lt;instanceof class="java.beans.beancontext.BeanContextProxy"/&gt;
    &lt;instanceof class="java.io.Serializable"/&gt;
    &lt;instanceof class="org.openide.options.SystemOption"/&gt;
    &lt;instanceof class="org.netbeans.modules.editor.options.OptionSupport"/&gt;
    &lt;instanceof class="org.netbeans.modules.editor.options.BaseOptions"/&gt;
    &lt;instance class="org.netbeans.modules.manifestsupport.options.ManifestOptions"/&gt;
&lt;/settings&gt;</pre></li>

<p><li><b>Understand the file.</b> This file lets the IDE quickly instantiate the <tt>ManifestOptions.java</tt>
 file, whenever called upon to do so. The next section shows you how to register the settings file in the
 NetBeans System Filesystem.

</ol>

<h3 class="tutorial"><a name="registeringoptions"></a>Registering the Options in the NetBeans System Filesystem</h3>

<p>To register the module in the Options window, you
 must do the following in the <tt>layer.xml</tt> file:

<ul>
<li>Create default colors for each profile that the IDE supports. Currently, the IDE supports a profile
 called 'NetBeans' and a profile called 'City Lights'. They can be selected from the Profile drop-down list
 at the top of the Fonts & Colors section.
<li>Register the <tt>ManifestEditorKit.java</tt> class.
<li>Register the <tt>ManifestOptions.settings</tt> file.
<li>Create a file containing a text that will be shown in the Preview window,
 at the bottom of the Fonts & Colors section of the Options window.
<li>Localize the strings in the <tt>layer.xml</tt> file.
</ul>

<p>The screenshot on the left shows the NetBeans profile; on the right you see the City Lights profile:

<p><img src="../../images/tutorials/mf_syntax/fonts-and-colors-1.png" alt="Fonts and Colors 1">
<img src="../../images/tutorials/mf_syntax/fonts-and-colors-4.png" alt="Fonts and Colors 4">

<p>Do the following:
<ol>
<p><li><b>Update the <tt>layer.xml</tt> file.</b> Add the following entries to the <tt>layer.xml</tt> file:

<pre class=examplecode>&lt;folder name="Editors"&gt;
    &lt;folder name="text"&gt;
        &lt;folder name="x-java-jar-manifest"&gt;
            &lt;attr name="SystemFileSystem.localizingBundle" 
            stringvalue="org.netbeans.modules.manifestsupport.Bundle"/&gt;
            &lt;folder name="NetBeans"&gt;
                &lt;folder name="Defaults"&gt;
                    &lt;file name="coloring.xml" 
                        url="resources/NetBeans-Manifest-fontsColors.xml"&gt;
                        &lt;attr name="SystemFileSystem.localizingBundle" 
                        stringvalue="org.netbeans.modules.manifestsupport.Bundle"/&gt;
                    &lt;/file&gt;
                &lt;/folder&gt;
            &lt;/folder&gt; 
            &lt;folder name="CityLights"&gt;
                &lt;folder name="Defaults"&gt;
                    &lt;file name="coloring.xml" 
                        url="resources/CityLights-Properties-fontsColors.xml"&gt;
                        &lt;attr name="SystemFileSystem.localizingBundle" 
                        stringvalue="org.netbeans.modules.manifestsupport.Bundle"/&gt;
                    &lt;/file&gt;
                &lt;/folder&gt;
            &lt;/folder&gt;
            &lt;file name="Settings.settings" 
            url="options/ManifestOptions.settings"/&gt;
            &lt;file name="EditorKit.instance"&gt;
                &lt;attr name="instanceClass" 
                stringvalue="org.netbeans.modules.manifestsupport.ManifestEditorKit"/&gt;
            &lt;/file&gt;
        &lt;/folder&gt;
    &lt;/folder&gt;
&lt;/folder&gt;

&lt;folder name="OptionsDialog"&gt;
    &lt;folder name="PreviewExamples"&gt;
        &lt;folder name="text"&gt;
            &lt;file name="x-java-jar-manifest" url="resources/ManifestExample"/&gt;
        &lt;/folder&gt;
    &lt;/folder&gt;
&lt;/folder&gt;</pre></li>

<p><li><b>Localize the Fonts & Colors page.</b> In the package where the <tt>layer.xml</tt> file
is found (i.e., in <tt>org.netbeans.modules.manifestsupport</tt>), add the following entries
 to the <tt>Bundle.properties</tt> file:

<p><pre class="examplecode">text/x-java-jar-manifest=Manifest
NetBeans=NetBeans
mf-name=Name
mf-value=Value
mf-colon=Colon</pre>

<p><li><b>Create a color file for each profile.</b> Create a package called <tt>org.netbeans.modules.manifestsupport.resources</tt>
and add two files, <tt>NetBeans-Manifest-fontsColors.xml</tt> and <tt>CityLights-Properties-fontsColors.xml</tt>:

<ul><p><li><tt>NetBeans-Manifest-fontsColors.xml</tt> has the following content:
<p><pre class="examplecode">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;fontscolors&gt;
    &lt;fontcolor name="mf-name" foreColor="blue" default="default"/&gt;
    &lt;fontcolor name="mf-value" foreColor="magenta" default="default"/&gt;
    &lt;fontcolor name="mf-colon" default="default"/&gt;
&lt;/fontscolors&gt;</pre>

<p><li><tt>CityLights-Properties-fontsColors.xml</tt> has the following content:
<pre class="examplecode">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;fontscolors&gt;
    &lt;fontcolor name="mf-name" default="default"/&gt;
    &lt;fontcolor name="mf-value" default="default"/&gt;
    &lt;fontcolor name="mf-colon" default="default"/&gt;
&lt;/fontscolors&gt;</pre></ul>

<p><li><b>Create the Preview file.</b> At the bottom of the Fonts & Colors section in the Options window,
 the user can preview changes made to the way the Manifest file's entries are displayed in the editor.
 To specify the text that is displayed in the preview window, you need to create a file, as
 specified in the <tt>OptionsDialog</tt> folder of the <tt>layer.xml</tt> file above.
  In the <tt>org.netbeans.modules.manifestsupport.resources</tt> package,
add a file called <tt>ManifestExample</tt> (note that this file has no extension), with the following content:

<p><pre class="examplecode">Manifest-Version: 1.0</pre>

</ol>

<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">Installing and Testing the NetBeans Module</h3>
	<p>
      <ol>
	      <li>In the Projects window, right-click the <tt>ManifestSupport</tt> project and choose Install/Reload
	      in Target Platform. 
	      <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. 
 <li>Choose File &gt; New Project (Ctrl-Shift-N). Create a new Java application project
 or a new Plug-in Module project. Open the project's Manifest file in the Source Editor
 and notice the syntax highlighting. <p>For other aspects of this module, see the <a href="#introducing-sample">Introducing the Sample</a> section.
</ol>	<p>
<h3 class="tutorial">Creating a Shareable Module Binary (NBM File)</h3>
 <p>An NBM file is a NetBeans module packaged for delivery via the web. 
       The principal differences between NBM files and module JAR files are:
       <ul><li>An NBM file is compressed.
	       <li>An NBM file can contain more than one JAR file&#8212;modules can package any libraries they use into their NBM file.
	       <li>An NBM file contains metadata that NetBeans will use to display information about it in the Update Center, such as the manifest contents, the license, etc.
	       <li>An NBM file is typically signed for security purposes.</ul>
       <p>NBM files are just ZIP files with a special extension. They use the JDK's mechanism for 
       signing JAR files. Unless you are doing something unusual, you will not need to worry about the 
       contents of an NBM file&#8212;just let the standard Ant build script for NBM creation take care of 
       it for you. The IDE generates the build script based on the options you enter in the project's 
       Project Properties dialog box. You can set the module's dependencies, versioning, and packaging 
       information in the Project Properties dialog box. You can further customize program execution 
       by editing the Ant script and Ant properties for the project.
      <ol>
	      <li>In the Projects window, right-click the <tt>ManifestSupport</tt> project node and choose Create NBM.

	      <p>The NBM file is created and you can view it in the Files window (Ctrl-2):
	      <p align="left"><img src="../../images/tutorials/mf_syntax/create-nbm.png" alt="Shareable NBM.">
	      <li>Make it available to others via, for example, e-mail. 
	      <p><li>Use the Update Center to install the NBM file.
       </ol>
 
<h2><a name="explore"></a>Exploring Further</h2> <div class="indent">

<p>Below are some other avenues that you might want to explore.</p>

<h3 class="tutorial">Associating the EditorKit with a JEditorPane</h3>

<p>Instead of using the EditorKit in the Source Editor, you can associate it
with a <a href="http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JEditorPane.html">JEditorPane</a>.
<p>Do the following:
<ol>
	<p><li>Select the <tt>JEditorPane</tt>, click the <tt>editorKit</tt> property,
	 and make the following selections:
<p align="left"><img src="../../images/tutorials/mf_syntax/editorPane.png" alt="editorPane.">

<p><li>Select the <tt>JEditorPane</tt>, click the <tt>contentType</tt> property,
and type the Manifest file's MIME Type (<tt>text/x-java-jar-manifest</tt>):
<p align="left"><img src="../../images/tutorials/mf_syntax/editorPane2.png" alt="editorPane2.">

<p><li>When you deploy the module, syntax highlighting will be enabled in the JEditorPane:
<p align="left"><img src="../../images/tutorials/mf_syntax/editorPane3.png" alt="editorPane3.">
<p>In effect, the JEditorPane is now your editor. You can use the Options window to
 modify fonts and colors, just as if you were using the Source Editor.
</ol>
	<h3 class="tutorial">Code Folding</h3>

	<p>To come.</p>

  <h3 class="tutorial">Indentation Engine</h3>

<p>To come.</p>

 <h3 class="tutorial">Other Options</h3>
 <p>To come.</p>



 
</div>
      <br />

<h2><a name="explore"></a>Applying What You Have Learned</h2> <div class="indent">

	<p>Once you are comfortable with the principles outlined in this tutorial,
	you can begin applying them to your own scenarios. For example, here is
	NetBeans user Valentin Buergel's Wiki syntax highlighting:</p>

<p align="left"><img src="../../images/tutorials/mf_syntax/wiki-screenshot.png" alt="wiki-screenshot">



 
</div>
      <br />

      
<!-- ===================================================================================== -->
<br>
<div class="feedback-box"><a href="https://netbeans.org/about/contact_form.html?to=3&amp;subject=Feedback:%20Manifest%20Highlighting%20Module%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 Module, see the following resources: 
  <ul>
	  <p><li><a href="https://platform.netbeans.org/index.html">Module Developer's Resources</a></li>
	  <p><li><a href="https://netbeans.org/download/dev/javadoc/">NetBeans API List (Current Development Version)</a></li>
	  <p><li><a href="http://apisupport.netbeans.org/new-apisupport.html">New API Support-Proposal</a></li></ul>
  </p>
  
  <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>
      <td>
	 1
      </td>
      <td>
         23 October 2005
      </td>
      <td><ul>
	      <li>Initial version.
	     
	      
	    
      </td>
  </tr>
 <tr>
      <td>
	 2
      </td>
      <td>
         30 November 2005
      </td>
      <td><ul>
		      <li>Added Valentin's screenshot at the end.
		      <li>Fixed some smaller issues:
		      <ul><li><a href="https://netbeans.org/bugzilla/show_bug.cgi?id=69568">issue 69568</a>
			      <li>Wrong closing tag in one of the coloring XML files.
			      <li><tt>NbEditorKit</tt> was mistakenly <tt>NBEditorkit</tt> before
		      </ul>
		      <li>Need to fix several larger issues (from Andrei Badea and one or two people from openide mailing list)
		       soon.

	     
	      
	    
      </td>
  </tr>
 <tr>
      <td>
	 3
      </td>
      <td>
         5 March 2006
      </td>
      <td><ul>
		      <li>Several fixes:
		      <ul><li>Successfully worked through the whole tutorial, using NetBeans IDE 5.x (final version).
			      <li>Added new test (from Andrei Badea) to assert new line parsing is working.
			      <li>Fixed layer.xml error relating to new way of registering the preview file.
			      <li>Tried to use Andrei Badea (and Vladimir) fixes for manifestSyntax,java, but that broke other things.
			       Need to check that with him.
			      
		      </ul>
		      	    
      </td>
  </tr>
  <tr>
      <td>
	 4
      </td>
      <td>
         13 June 2006
      </td>
      <td><ul>
		 <li>Took the ZIP attached to this tutorial, installed the NBM in 5.5 dev. No
		 problems, worked as expected, except JUnit test had problems -- no junit.framework.test
		 found in JUnit module.</li>
                 <li>Following suggestion by Tim B., shortened many lines of code to ensure that
                 people don't need to scroll to the right too much, but some instances of this problem
                 remain.</li>
                 <li>Need to go back to the code snippets and put back links to Javadoc, which
                 were removed when I replaced the code, straight from the Source Editor, which I
                 did to make sure that the shortened lines wouldn't cause errors.</li>
		 <li>Need to change the ZIP file to match the changes made in previous versions of the
		 tutorial.</li>
                 <li>Need to integrate the Module Installer wizard, no need to manually create
                 one (plus automatic manifest.mf and project.xml change).</li>
		 </ul>     	    
      </td>
  </tr>
  
  </tbody>
  </table>
  <p>Many thanks to Andrei Badea, Tom Ball, and Martin Adamek for help and inspiration.
</body>
</html>
