<!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>File Type Integration Tutorial for NetBeans Platform 6.9</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 DataLoader API, as well as other APIs
 relating to file support."/>
<!--      Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. -->
<!--     Use is subject to license terms.-->
</head>
<body>
	<h1>File Type Integration Tutorial</h1>

<p>This tutorial shows you how to write a module that lets the IDE,
or any other application built on the NetBeans Platform, recognize a new file type.</p>

   <p><b class="notes">Note:</b> This document is applicable to NetBeans Platform 6.9 and above. If you
    are using an earlier version, see <a href="68/nbm-filetype.html">the previous version
    of this document</a>.</p>

   <p><b>Contents</b></p>
   
   <p><img src="../images/articles/69/netbeans-stamp69.png" class="stamp" width="114" height="114" alt="Content on this page applies to NetBeans IDE 6.9 and above" title="Content on this page applies to NetBeans IDE 6.9 and above"/></p>
      <ul class="toc">
  <li><a href="#intro">Introduction to File Type Integration</a></li>
  <li><a href="#creating">Creating the Module Project</a></li>
  <li><a href="#recognizing">Recognizing Abc Files</a></li>
  <li><a href="#install">Installing and Trying Out the Functionality</a></li>
  <li><a href="#adding">Creating Features for Abc Files</a>
  <ul>
      <li><a href="#action">Adding a Context-Sensitive Action</a></li>
      <li><a href="#topcomponent">Opening the File into a Window</a></li>
      <li><a href="#multiview">Creating a Multiview Window</a></li>
      <li><a href="#parse">Parsing the File</a></li>
      <li><a href="#properties">Extending the Properties Window</a></li>
  </ul></li>
  <li><a href="#share">Creating a Shareable Binary</a></li>
       </ul>
         
<p><b>To follow this tutorial, you need the software and resources listed in the following 
table.</b></p>

      <table>
        <tbody>
            <tr>
                <th class="tblheader" scope="col">Software or Resource</th>
                <th class="tblheader" scope="col">Version Required</th>
            </tr> 
            <tr>
                <td class="tbltd1"><a href="https://netbeans.org/downloads/index.html">NetBeans IDE</a></td>
                <td class="tbltd1">version 6.9 or above</td>
            </tr>
            <tr>
                <td class="tbltd1"><a href="http://java.sun.com/javase/downloads/index.jsp">Java Developer Kit (JDK)</a></td>
                <td class="tbltd1">Version 6</td>
            </tr>
        </tbody>
    </table>
    



<h2 class="tutorial"><a name="intro"></a>Introduction to File Type Integration</h2>

<p>File types that are recognized in the IDE have their own icons, menu items, and behavior. 
The "files" being shown are <tt>FileObjects</tt>&#8212;wrappers
around <tt>java.io.File</tt> or, in the case of configuration files, typically wrappers around data stored in some other way, 
such as inside XML files in modules. What you actually <i>see</i> are <tt>Nodes</tt>, which provide functionality like actions
and localized names to objects like files. In between <tt>Nodes</tt> and <tt>FileObjects</tt> are <tt>DataObjects</tt>. 
A <tt>DataObject</tt> is like a <tt>FileObject</tt>, except that it knows what kind of file is being shown, and there are 
usually different types of <tt>DataObject</tt> for files with different extensions and XML files with different namespaces.
Each <tt>DataObject</tt> is provided by a different module, each implementing support for one or more file types&#8212;for example,
the Image module makes it possible to recognize and open <tt>.gif</tt> and <tt>.png</tt> files.</p>

<p>A module that recognizes a file type installs a <tt>DataLoader</tt>&#8212;a factory for a file-type-specific <tt>DataObject</tt>.
When a folder is expanded, the IDE asks each known <tt>DataLoader</tt>, "Do you know what this is?" The first one that says 
"Yes" creates the <tt>DataObject</tt> for the file. In order to actually display something for each file, the system calls 
<tt>DataObject.getNodeDelegate()</tt> for each <tt>DataObject</tt> and the <tt>Nodes</tt> are what you actually see in the IDE.</p>

<p>Below, the diagram on the left shows what each item mentioned above makes available:</p>

<p><img  src="../images/tutorials/filetype/diagram-dataobject2.png" alt="Diagram."/></p>

<p>In this tutorial, you create a module that installs a <tt>DataLoader</tt> for imaginary "Abc" files 
(<tt>.abc</tt> file extension). By default, a file with the "abc" extension is treated as any other file that
the IDE does not recognize&#8212;it is treated as a text file and, as a result, the IDE provides the same functionality for
Abc files as it does for text files. Once you have created the module, you will be shown how to enhance it
with functionality that will be available to Abc files only. When you complete the development cycle, you can easily let others make use of
 your module&#8212;the IDE lets you create a binary that you can share with others, who can then install it through the
 Plugin Manager of their application.</p>

<!-- ===================================================================================== -->

<h2 class="tutorial"><a name="creating"></a>Creating the Module Project</h2>
      
<p>In this section, we use a wizard to create the source structure that every NetBeans module requires. The
source structure consists of certain folders in specific places and a set of files that are
always needed. For example, every NetBeans module requires a <tt>nbproject</tt> folder, which holds
the project's metadata, and a <tt>layer.xml</tt> file, for declarative registration of items
such as toolbar buttons and windows.</p>

<ol>
          
	      <li>Choose File &gt; New Project (Ctrl-Shift-N). Under Categories, select NetBeans Modules. Under Projects, 
 select Module and click Next.</li>
	<li><p>In the Name and Location panel, type <tt>AbcFileType</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
selected. The panel should now look as follows:</p>

<p><img src="../images/tutorials/filetype/69-projectwizard1.png" alt="Step 1 of New Project wizard."/></p>
 <p>Click Next.</p></li>

<li><p>In the Basic Module Configuration panel, type <tt>org.myorg.abcfiletype</tt>
 as the Code Name Base. 
 Add spaces to the suggested Module Display Name, so that it is changed to <tt>Abc File Type</tt>.
 Select the "Generate XML Layer" checkbox and
 leave the location of the localizing bundle and XML layer as they are,
 so that they will be stored in a
 package with the name <tt>org/myorg/abcfiletype</tt>. The panel should now look as follows:</p>

<p><img  src="../images/tutorials/filetype/69-projectwizard2.png" alt="Step 2 of New Project wizard."/></p></li>

<li>Click Finish.</li></ol>

<p> The IDE creates the <tt>Abc File Type</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). For example, the Projects window should now look as follows:</p>

<p><img style="border: 1px solid rgb(14, 27, 85);" src="../images/tutorials/filetype/69-projectswindow1.png" alt="Initial Projects window."/></p>

<!-- ===================================================================================== -->
<h2><a name="recognizing"></a>Recognizing Abc Files</h2>

<p>In this section, we use a wizard to create the classes necessary for
 recognizing Abc files as being distinct from all other files. As discussed
 at the start of this tutorial, we need a data object and a data loader, as
 well as a MIME type resolver, and registration entries in the <tt>layer.xml</tt> file,
 to do so. The New File Type wizard will create all of these for us.</p>

  
 <ol>
	
	 <li>Right-click the project node and 
	      choose New &gt; File Type.</li>
	      <li>In the File Recognition panel, do the following:
<ul>
<li>Type <tt>text/x-abc</tt> in the MIME Type edit box.</li>
<li>Type <tt>.abc .ABC</tt> in the by Filename Extension edit box.</li>
</ul>
<p>The File Recognition panel should now look as follows:</p>

	       <p><img src="../images/tutorials/filetype/69-filewizard1.png" alt="Step 1 of New File wizard."/></p>

	       <p>Note the following about the fields in the File Recognition panel:</p>
	       <ul>
		       <li><b>MIME Type.</b> Specifies the data object's unique MIME type.</li>
		       <li>by
			       <ul><li><b>Filename Extension.</b> Specifies one or more file extensions that the IDE will recognize 
		       as belonging to the specified MIME type. The file extension can optionally be preceded 
		       by a dot. Separators are commas, spaces, or both. Therefore, all of the following are valid:
		       <ul><li><tt>.abc,.def</tt></li>
			       <li><tt>.abc .def</tt></li>
			       <li><tt>abc def</tt></li>
			       <li><tt>abc,.def ghi, .wow</tt></li></ul>
			<p>Let's imagine that Abc files be case-sensitive. For
 this reason, you specify <i>two</i> MIME types in this tutorial&#8212;<tt>.abc</tt> and <tt>.ABC</tt>.</p></li>
		       <li><b>XML Root Element.</b> Specifies a unique namespace that distinguishes the XML file 
		       type from all other XML file types. Since many XML files have the same extension (<tt>xml</tt>),
			 the IDE distinguishes between
		       XML files via their XML root elements. More specifically, the IDE can distinguish between namespaces and
		       the first XML element in XML files. You can use this to, for example, distinguish
		       between a JBoss deployment descriptor and a WebLogic deployment descriptor. Once you have made
		       this distinction, you can ensure that menu items added to the JBoss deployment descriptor's contextual menu
			are not available to the WebLogic deployment descriptor. For an example, see
 the <a href="nbm-palette-api2.html">NetBeans Component Palette Module Tutorial</a>.</li></ul></li>
</ul>
	      
	      <p>Click Next.</p></li>

	      <li><p>In the Name and Location panel, type <tt>Abc</tt> as the Class Name Prefix
	      and browse to any 16x16 pixel image file as the new file type's icon, as shown below.</p>
	      
<p><img src="../images/tutorials/filetype/69-filewizard2.png" alt="Step 2 of New File wizard."/></p>


              <p><b>Note:</b> You can use any icon of a 16x16 pixel dimension. If you like, you can
              click on this one and save it locally, and then
              specify it in the wizard step above: <img style="border: 1px solid #0e1b55" src="../images/tutorials/filetype/Datasource.gif" alt="Datasource.gif"/></p></li>

<li>Click Finish.</li></ol>

<p>The Projects window should now look as follows:</p>

<p><img style="border: 1px solid #0e1b55"  src="../images/tutorials/filetype/69-projectswindow2.png" alt="Final Projects window."/></p>

<p>Each of the newly generated files is briefly introduced:</p>
 <ul>
	<li><b>AbcDataObject.java.</b> Wraps a <tt>FileObject</tt>. DataObjects are produced by DataLoaders.
	 For more information, see <a href="http://wiki.netbeans.org/wiki/view/DevFaqDataObject">What is a DataObject?</a>.</li>
 <li><b>AbcResolver.xml.</b> Maps the <tt>.abc</tt> and <tt>.ABC</tt> extensions to the MIME type. The <tt>AbcDataLoader</tt> only 
 recognizes the MIME type; it does not know about the file extension. That is the task of the MIME type resolver,
  which uses <a href="http://bits.nbextras.org/dev/javadoc/org-openide-filesystems/org/openide/filesystems/doc-files/resolverDocumentation.html">these</a>
  rules to determine whether a file is recognized.</li>
	 <li><b>AbcTemplate.abc.</b> Provides the basis of a file template that is registered
         in the <tt>layer.xml</tt> such that it will be installed in the New File dialog
         as a new template.</li>
         <li><b>AbcDataObjectTest.java.</b> JUnit test class for the <tt>DataObject</tt>.</li>
</ul>
      
      <p>In the <tt>layer.xml</tt> file, you should see the following:</p>
      
<pre class="examplecode">&lt;folder name="Loaders"&gt;
    &lt;folder name="text"&gt;
        &lt;folder name="x-abc"&gt;
            &lt;folder name="Actions"&gt;
                &lt;file name="org-openide-actions-CopyAction.shadow"&gt;
                    &lt;attr name="originalFile" stringvalue="Actions/Edit/org-openide-actions-CopyAction.instance"/&gt;
                    &lt;attr name="position" intvalue="400"/&gt;
                &lt;/file&gt;
                &lt;file name="org-openide-actions-CutAction.shadow"&gt;
                    &lt;attr name="originalFile" stringvalue="Actions/Edit/org-openide-actions-CutAction.instance"/&gt;
                    &lt;attr name="position" intvalue="300"/&gt;
                &lt;/file&gt;
                &lt;file name="org-openide-actions-DeleteAction.shadow"&gt;
                    &lt;attr name="originalFile" stringvalue="Actions/Edit/org-openide-actions-DeleteAction.instance"/&gt;
                    &lt;attr name="position" intvalue="600"/&gt;
                &lt;/file&gt;
                &lt;file name="org-openide-actions-FileSystemAction.shadow"&gt;
                    &lt;attr name="originalFile" stringvalue="Actions/System/org-openide-actions-FileSystemAction.instance"/&gt;
                    &lt;attr name="position" intvalue="1100"/&gt;
                &lt;/file&gt;
                &lt;file name="org-openide-actions-OpenAction.shadow"&gt;
                    &lt;attr name="originalFile" stringvalue="Actions/System/org-openide-actions-OpenAction.instance"/&gt;
                    &lt;attr name="position" intvalue="100"/&gt;
                &lt;/file&gt;
                &lt;file name="org-openide-actions-PropertiesAction.shadow"&gt;
                    &lt;attr name="originalFile" stringvalue="Actions/System/org-openide-actions-PropertiesAction.instance"/&gt;
                    &lt;attr name="position" intvalue="1400"/&gt;
                &lt;/file&gt;
                &lt;file name="org-openide-actions-RenameAction.shadow"&gt;
                    &lt;attr name="originalFile" stringvalue="Actions/System/org-openide-actions-RenameAction.instance"/&gt;
                    &lt;attr name="position" intvalue="700"/&gt;
                &lt;/file&gt;
                &lt;file name="org-openide-actions-SaveAsTemplateAction.shadow"&gt;
                    &lt;attr name="originalFile" stringvalue="Actions/System/org-openide-actions-SaveAsTemplateAction.instance"/&gt;
                    &lt;attr name="position" intvalue="900"/&gt;
                &lt;/file&gt;
                &lt;file name="org-openide-actions-ToolsAction.shadow"&gt;
                    &lt;attr name="originalFile" stringvalue="Actions/System/org-openide-actions-ToolsAction.instance"/&gt;
                    &lt;attr name="position" intvalue="1300"/&gt;
                &lt;/file&gt;
                &lt;file name="sep-1.instance"&gt;
                    &lt;attr name="instanceClass" stringvalue="javax.swing.JSeparator"/&gt;
                    &lt;attr name="position" intvalue="200"/&gt;
                &lt;/file&gt;
                &lt;file name="sep-2.instance"&gt;
                    &lt;attr name="instanceClass" stringvalue="javax.swing.JSeparator"/&gt;
                    &lt;attr name="position" intvalue="500"/&gt;
                &lt;/file&gt;
                &lt;file name="sep-3.instance"&gt;
                    &lt;attr name="instanceClass" stringvalue="javax.swing.JSeparator"/&gt;
                    &lt;attr name="position" intvalue="800"/&gt;
                &lt;/file&gt;
                &lt;file name="sep-4.instance"&gt;
                    &lt;attr name="instanceClass" stringvalue="javax.swing.JSeparator"/&gt;
                    &lt;attr name="position" intvalue="1000"/&gt;
                &lt;/file&gt;
                &lt;file name="sep-5.instance"&gt;
                    &lt;attr name="instanceClass" stringvalue="javax.swing.JSeparator"/&gt;
                    &lt;attr name="position" intvalue="1200"/&gt;
                &lt;/file&gt;
            &lt;/folder&gt;
            &lt;folder name="Factories"&gt;
                &lt;file name="AbcDataLoader.instance"&gt;
                    &lt;attr name="SystemFileSystem.icon" urlvalue="nbresloc:/org/myorg/abcfiletype/Datasource.gif"/&gt;
                    &lt;attr name="dataObjectClass" stringvalue="org.myorg.abcfiletype.AbcDataObject"/&gt;
                    &lt;attr name="instanceCreate" methodvalue="org.openide.loaders.DataLoaderPool.factory"/&gt;
                    &lt;attr name="mimeType" stringvalue="text/x-abc"/&gt;
                &lt;/file&gt;
            &lt;/folder&gt;
        &lt;/folder&gt;
    &lt;/folder&gt;
&lt;/folder&gt;
&lt;folder name="Services"&gt;
    &lt;folder name="MIMEResolver"&gt;
        &lt;file name="AbcResolver.xml" url="AbcResolver.xml"&gt;
            &lt;attr name="displayName" bundlevalue="org.myorg.abcfiletype.Bundle#Services/MIMEResolver/AbcResolver.xml"/&gt;
        &lt;/file&gt;
    &lt;/folder&gt;
&lt;/folder&gt;
&lt;folder name="Templates"&gt;
    &lt;folder name="Other"&gt;
        &lt;file name="AbcTemplate.abc" url="AbcTemplate.abc"&gt;
            &lt;attr name="displayName" bundlevalue="org.myorg.abcfiletype.Bundle#Templates/Other/AbcTemplate.abc"/&gt;
            &lt;attr name="template" boolvalue="true"/&gt;
        &lt;/file&gt;
    &lt;/folder&gt;
&lt;/folder&gt;</pre>


      
    <!-- ======================================================================================= -->

<h2><a name="install"></a>Installing and Trying Out the Functionality</h2>
<p>Let's now install the module and then use the basic
 functionality we've created so far.
  The IDE uses an Ant build script to build and install your module. The build 
  script is created for you
when you create the project.</p>
<div class="indent">


      <ol>
	      <li><p>In the Projects window, right-click the <tt>Abc File Type</tt> project and choose Run.</p>
	      <p>A new instance of the IDE starts, installing your module into itself.</p></li>
	       <li><p>Choose Window | Favorites and then browse to the "AbcTemplate.abc" file
                   in your module source structure. Notice that the icon assigned to
                   your file type is shown for your file and that you can open the
                   file in the IDE's text editor:</p>
         <p><img  src="../images/tutorials/filetype/69-run-module1.png" alt="Dummy template."/></p></li>
	       <li>Next, let's use the IDE to create a new file of our template,
                   using the template registered in the module. To get started,
                   use the New Project dialog (Ctrl-Shift-N)
            to create any kind of application in the IDE.</li>
               <li><p>Once you have a project, right-click the application node and choose New &gt; Other. In the Other
		 category, a template is available for working with the new file type:</p>
         <p><img  src="../images/tutorials/filetype/69-run-module2.png" alt="Dummy template."/></p>
         <p>Complete the wizard and you will have created a template that
         can be used for starting off the user's work with the given file type.</p>
		 <p class="tips">If you want to provide default code via the template, add the code to the
		  <tt>AbcTemplate.abc</tt> file that the New File Type wizard created for you.</p></li>
       </ol>          
   </div>

<!-- ===================================================================================== -->
<h2><a name="adding"></a>Creating Features for Abc Files</h2>
<p>Now that the NetBeans Platform is able to distinguish Abc files from all other types of files,
it is time to add features specifically for these types of files. In this section, we add a menu
item on the right-click contextual menu of the file's node in the explorer windows, such as in
the Projects window, and we enable the file to open into a window, instead of into an editor.</p>

      <div class="indent">
          
          <h3 class="tutorial"><a name="action"></a>Adding a Context-Sensitive Action</h3>
          
          <p>In this subsection, we use the New Action wizard to create a Java class that
          will perform an action for our file type. The wizard will also register the class
          in the <tt>layer.xml</tt> file such that the user will be able to invoke the
          action from the right-click contextual menu of the file type's node in an explorer window.</p>
          
          <ol>
              
              <li>Right-click the project node and 
              choose New &gt; Action.</li>
              <li><p>In the Action Type panel, click Conditionally Enabled. Type <tt>org.myorg.abcfiletype.AbcDataObject</tt>, which
              is the fully qualified name of the data object generated above by the New File Type wizard, as shown below:</p>
              
              <p><img  src="../images/tutorials/filetype/69-action1.png" alt="Step 1 of New Action wizard."/></p>
              
              <p>Click Next.</p></li>
              
              <li><p>In the GUI Registration panel, select the 'File' 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.</p>
              <p>Next, Unselect Global Menu Item and then select File Type Contect Menu Item.
              In the Content Type drop-down list, select the MIME type you specified above in the New File Type
              wizard, as shown below:</p>
              
              <p><img  src="../images/tutorials/filetype/69-action2.png" alt="Step 2 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>MyAction</tt> as the Class Name
              and type <tt>My Action</tt> as the Display Name. Optionally, provide an icon
              to be displayed.</p>
              
              <p><img  src="../images/tutorials/filetype/69-action3.png" alt="Step 3 of New Action wizard."/></p>
              
              <p>Click Finish and <tt>MyAction.java</tt> is added to the <tt>org.myorg.abcfiletype</tt> package.</p></li>
              
              <li>In the Source Editor, add some code to the action's <tt>actionPerformed</tt> method:
              
<pre class="examplecode">@Override
public void actionPerformed(ActionEvent ev) {
   FileObject f = context.getPrimaryFile();
   String displayName = FileUtil.getFileDisplayName(f);
   String msg = "I am " + displayName + ". Hear me roar!";
   NotifyDescriptor nd = new NotifyDescriptor.Message(msg);
   DialogDisplayer.getDefault().notify(nd);
}</pre>
              <p>Press Ctrl-Shift-I. The IDE automatically adds import statements to the top of the class.</p>

<p class="tips">Some code
              is still underlined in red, to indicate that not all of the required packages are on the classpath.
              Right-click the project node, choose Properties, and click Libraries in the Project Properties dialog box.
              Click add at the top of the Libraries pane and add the Dialogs API.</p>
              
              <p>In the <tt>MyAction.java</tt> class, press Ctrl-Shift-I again. The red underlining disappears because
              the IDE finds the required packages in the Dialogs API.</p>

              <p>The code should now be as follows:</p>

<pre class="examplecode">import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import org.openide.DialogDisplayer;
import org.openide.NotifyDescriptor;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;

public final class MyAction implements ActionListener {

    private final AbcDataObject context;

    public MyAction(AbcDataObject context) {
        this.context = context;
    }

    public void actionPerformed(ActionEvent ev) {
        FileObject f = context.getPrimaryFile();
        String displayName = FileUtil.getFileDisplayName(f);
        String msg = "I am " + displayName + ". Hear me roar!";
        NotifyDescriptor nd = new NotifyDescriptor.Message(msg);
        DialogDisplayer.getDefault().notify(nd);
    }

}</pre>

              </li>
              
              <li><p>Open the <tt>layer.xml</tt> file and notice that your Action has been registered
               in the "Loaders" folder, as follows:</p>

 <pre class="examplecode">...
...
...
  &lt;folder name="Loaders"&gt;
        &lt;folder name="text"&gt;
            &lt;folder name="x-abc"&gt;
                &lt;folder name="Actions"&gt;
                    <b>&lt;file name="org-myorg-abcfiletype-MyAction.shadow"&gt;
                        &lt;attr name="originalFile" stringvalue="Actions/File/org-myorg-abcfiletype-MyAction.instance"/&gt;
                        &lt;attr name="position" intvalue="0"/&gt;
                    &lt;/file&gt;</b>
                    &lt;file name="org-openide-actions-CopyAction.shadow"&gt;
                        &lt;attr name="originalFile" stringvalue="Actions/Edit/org-openide-actions-CopyAction.instance"/&gt;
                        &lt;attr name="position" intvalue="400"/&gt;
                    &lt;/file&gt;
                    &lt;file name="org-openide-actions-CutAction.shadow"&gt;
                        &lt;attr name="originalFile" stringvalue="Actions/Edit/org-openide-actions-CutAction.instance"/&gt;
                        &lt;attr name="position" intvalue="300"/&gt;
                    &lt;/file&gt;
                    &lt;file name="org-openide-actions-DeleteAction.shadow"&gt;
                        &lt;attr name="originalFile" stringvalue="Actions/Edit/org-openide-actions-DeleteAction.instance"/&gt;
                        &lt;attr name="position" intvalue="600"/&gt;
                    &lt;/file&gt;
                    &lt;file name="org-openide-actions-FileSystemAction.shadow"&gt;
                        &lt;attr name="originalFile" stringvalue="Actions/System/org-openide-actions-FileSystemAction.instance"/&gt;
                        &lt;attr name="position" intvalue="1100"/&gt;
                    &lt;/file&gt;
                    &lt;file name="org-openide-actions-OpenAction.shadow"&gt;
                        &lt;attr name="originalFile" stringvalue="Actions/System/org-openide-actions-OpenAction.instance"/&gt;
                        &lt;attr name="position" intvalue="100"/&gt;
                    &lt;/file&gt;
                    ...
                    ...
                    ...</pre>


              <p>Notice that the "org-openide-actions-OpenAction.shadow" file is registered
                   at position 100, while your new Action is registered at position 0. The Action
                   in the first position is the Action known as the "default Action" and will
                   be invoked when the file is created. Rather than invoking your new Action,
                   it makes more sense to invoke the Open Action instead, whenever the file
                   is created. Therefore, change the position in "org-openide-actions-OpenAction.shadow"
                   to 0 and change your own Action's position to 100.</p>
              </li>

              <li>Run the module again, as you did in the previous section.</li>
              <li><p>Create an Abc file, using the template shown
               in the previous section, and right-click the file's node in one of the
               explorer views, such as in the Projects window or Favorites window.</p>
	       <p>Notice that the Abc file has the icon
	       you assigned to it in its module and that the list of actions defined in its <tt>layer.xml</tt> file
	        is available from the right-click contextual menu:</p>
		<p><img src="../images/tutorials/filetype/69-dummytemplate.png" alt="Final Projects window."/></p></li>
		<li><p>Choose the new menu item, the Abc file's name and location are shown:</p>
		<p><img src="../images/tutorials/filetype/69-information.png" alt="Information."/></p></li>
		
              
          </ol>

 <p>You now know how to create a new context-sensitive action that appears in the context
  menu of a file of the given type, in the Projects window, Files window
 or the Favorites window.</p>

          <h3 class="tutorial"><a name="topcomponent"></a>Opening the File into a Window</h3>
          <p>By default, when the user opens a file of the type that we have defined in this tutorial,
          the file will open into a text editor. However, it's more likely that
          you may want to create a custom editor. Some custom editors are for text
          editing, while others provide a visual representation of the underlying file.
          In the latter case, you want to let the user drag and drop widgets onto the 
          visual representation of the underlying file.
          The first step in creating such a user interface is to let the user open the file into a window.
          This subsection shows you how to do that and points you to a tutorial you
          can follow for extending the window to include widgets from the NetBeans Visual Library.</p>
          <ol>
              <li><p>Right-click the project node and
              choose New &gt; Window Component. Set "editor" for Window Position
               and "Open on Application Start", as shown below:</p>
              
 <p><img  src="../images/tutorials/filetype/69-topc-1.png" alt="Step 1 of New Action wizard."/></p></li>
<li><p>Click Next and type "Abc" as the Class Name Prefix:</p>
 <p><img  src="../images/tutorials/filetype/69-topc-2.png" alt="Step 1 of New Action wizard."/></p>
 <p>Click Finish.</p>
              </li>
              <li>Change the <tt>DataObject</tt> to use <tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-loaders/org/openide/loaders/OpenSupport.html">OpenSupport</a></tt> instead of DataEditorSupport,
              by changing the <tt>DataObject's</tt> constructor as follows:

<pre class="examplecode">public AbcDataObject(FileObject pf, MultiFileLoader loader)
        throws DataObjectExistsException, IOException {

    super(pf, loader);
    CookieSet cookies = getCookieSet();
    <b>//cookies.add((Node.Cookie) DataEditorSupport.create(this, getPrimaryEntry(), cookies));
    cookies.add((Node.Cookie) new AbcOpenSupport(getPrimaryEntry()));</b>
              
}</pre>
       </li>
              
              <li>Create the <tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-loaders/org/openide/loaders/OpenSupport.html">OpenSupport</a></tt> class:
              
<pre class="examplecode">class AbcOpenSupport extends OpenSupport implements OpenCookie, CloseCookie {

    public AbcOpenSupport(AbcDataObject.Entry entry) {
        super(entry);
    }

    protected CloneableTopComponent createCloneableTopComponent() {
        AbcDataObject dobj = (AbcDataObject) entry.getDataObject();
        AbcTopComponent tc = new AbcTopComponent();
        tc.setDisplayName(dobj.getName());
        return tc;
    }
 
}</pre>              
              
              <p class="tips">Tweak the TopComponent to extend CloneableTopComponent,
              instead of TopComponent.</p></li>
          </ol>	
<p>Run the module again and then,
 when an Abc file is opened, the <tt>OpenSupport</tt> class handles the
 opening, such that it opens the file into the <tt>TopComponent</tt> instead
 of the basic editor that <tt>DataEditorSupport</tt> provides:</p>
 
  <p><img src="../images/tutorials/filetype/69-topc-3.png" alt="Step 1 of New Action wizard."/></p>

     <p class="tips">The <a href="https://platform.netbeans.org/tutorials/nbm-visual_library.html">NetBeans Visual Library Tutorial</a>
       provides an example of what you can do
       to develop the TopComponent further such that
       it will visually display the content of a file
       that corresponds to the file type defined in this tutorial.</p>
          
      <br />

<!-- ======================================================================================= -->

<h3><a name="multiview"></a>Creating a Multiview Window</h3>

<p>Now that we are able to open a file into a window, let's make the window
 more interesting. We'll create a multiview window. The first tab of
 a multiview window is typically used to display a visual representation
 of the file, while the second tab typically shows the source view. More
 than two tabs can also be provided, each tab providing further levels
 of detail about the opened file.</p>

      <ol>
	      <li>Right-click the project node and choose Properties. In the Project
           Properties dialog, choose Libraries, and click Add.
           Set a dependency on "<a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-core-multiview/overview-summary.html">MultiView Windows</a>". Click OK and then
           click OK again to exit the Project Properties dialog.</li>
	      <li>For each tab that you want to create in the multiview window, create a class that
          implements <tt><a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-core-multiview/org/netbeans/core/spi/multiview/MultiViewDescription.html">MultiViewDescription</a></tt> and <tt>Serializable</tt>.<p>For
           purposes of this tutorial, start by creating a class called
          <tt>AbcMultiviewDescription1</tt>, implementing the specified classes:</p>
<pre class="examplecode">public class AbcMultiviewDescription1 implements MultiViewDescription, Serializable {

    public int getPersistenceType() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public String getDisplayName() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public Image getIcon() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public HelpCtx getHelpCtx() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public String preferredID() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public MultiViewElement createElement() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

}</pre>

          <p class="tips">In the <tt>AbcMultiviewDescription1</tt> class above,
           the method <tt>createElement()</tt> returns a MultiViewElement.
           What you want to return here is your <tt>TopComponent</tt>, which
           we will do in the next step.</p></li>

  <li>Rewrite the class signature of the <tt>TopComponent</tt>. To provide a multiview element for
   the description in the previous step, we need to implement
           <tt><a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-core-multiview/org/netbeans/core/spi/multiview/MultiViewElement.html">MultiViewElement</a></tt>:

<pre>public final class AbcTopComponent extends CloneableTopComponent implements MultiViewElement {</pre></li>

<li><p>In the <tt>TopComponent</tt>, you now need to delete (or comment out) the methods
 <tt>findInstance()</tt>, <tt>getPersistenceType()</tt>, <tt>writeProperties()</tt>, <tt>readProperties()</tt>, , <tt>readPropertiesImpl()</tt>
 and <tt>preferredID()</tt> because these methods are handled by the <tt>MultiViewElement</tt>.
 Also remove the @ConvertAsProperties annotation at the top of the TopComponent,
 since serialization will also need to be handled via the <tt>MultiViewElement</tt> implementation.</p>

    <p>Don't worry about any remaining red underline markings; these will be resolved
         in the next step in this tutorial.</p>

</li>

<li>For the moment, provide very simple
 implementations of each of the required methods. Start by defining
 a new <tt>JToolbar</tt> at the top of the <tt>TopComponent</tt> class:

 <pre>private JToolBar toolbar = new JToolBar();</pre>

<p>Next, implement the methods as follows, in the <tt>TopComponent</tt>:</p>

 <pre class="examplecode">    public JComponent getVisualRepresentation() {
        return this;
    }

    public JComponent getToolbarRepresentation() {
        return toolbar;
    }

    public void setMultiViewCallback(MultiViewElementCallback arg0) {
    }

    public CloseOperationState canCloseElement() {
        return null;
    }

    public Action[] getActions() {
        return new Action[]{};
    }

    public Lookup getLookup() {
        return Lookups.singleton(this);
    }

    public void componentShowing() {
    }

    public void componentHidden() {
    }

    public void componentActivated() {
    }

    public void componentDeactivated() {
    }

    public UndoRedo getUndoRedo() {
        return UndoRedo.NONE;
    }</pre></li>

 <li>Now you can redefine the <tt>AbcMultiviewDescription1</tt> as follows:

 <pre class="examplecode">public class AbcMultiviewDescription1 implements MultiViewDescription, Serializable {

    public int getPersistenceType() {
        return TopComponent.PERSISTENCE_ALWAYS;
    }

    public String getDisplayName() {
        return "Tab 1";
    }

    public Image getIcon() {
        return ImageUtilities.loadImage("/org/myorg/abcfiletype/Datasource.gif");
    }

    public HelpCtx getHelpCtx() {
        return null;
    }

    public String preferredID() {
       return "AbcMultiviewDescription1";
    }

    public MultiViewElement createElement() {
        return new AbcTopComponent();
    }

}</pre></li>

          <li>Change the <tt>createCloneableTopComponent</tt> method in the
           <tt>OpenSupport</tt> class to open your <tt>TopComponent</tt>
           via the <tt>MultiViewDescription</tt> class you created above:

<pre class="examplecode">protected CloneableTopComponent createCloneableTopComponent() {

    // Create an array of multiview descriptors:
    AbcMultiviewDescription1 firstTab = new AbcMultiviewDescription1();
    MultiViewDescription[] descriptionArray = { firstTab };

    // Create the multiview window:
    CloneableTopComponent tc = MultiViewFactory.createCloneableMultiView(descriptionArray, firstTab,  null);
    tc.setDisplayName(entry.getDataObject().getName());
    return tc;

}</pre>


 <p class="tips">The second argument
 in <tt>MultiViewFactory.createCloneableMultiView</tt> determines which of
 the tabs is open by default. Here it is <tt>firstTab</tt>, the tab defined by
 <tt>AbcMultiViewDescription1</tt>.</p></li>

<li><p>Install and open the file again. Now you have a multiview window with one tab:</p>

    <p><img src="../images/tutorials/filetype/69-mvdeployed.png" alt="multiview deployed"/></p></li>

       </ol>

 <p>You now have a single tab in a multiview window. For each additional tab,
  create a new <tt>MultiviewDescription</tt> class, with a new <tt>TopComponent</tt>,
  and then instantiate the <tt>MultiViewDescription</tt> class in the
  <tt>OpenSupport</tt> extension class, as shown above.</p>

    </div>


<!-- ======================================================================================= -->

<h2><a name="parse"></a>Parsing the File</h2>

<p>A <tt>DataObject</tt> is like a <tt>FileObject</tt>, except that it 
    knows what kind of file is being shown. The "New File Type" wizard
 created a <tt>DataObject</tt> for our file type, so let's now use it
 to parse the underlying file and expose its content as new nodes
 in the explorer views, e.g., the Projects window, Files window,
 and the Favorites window.</p>


		 <p class="tips">For background to this section and
                     complete details on support for nodes
                  on the NetBeans Platform, see <a href="https://platform.netbeans.org/tutorials/nbm-nodesapi2.html">NetBeans Nodes API Tutorial</a>.</p>


<div class="indent">

      <ol>
	      <li>Open the <tt>AbcDataObject</tt> class and notice this method:

<pre class="examplecode">@Override
protected Node createNodeDelegate() {
    return new DataNode(this, Children.LEAF, getLookup());
}</pre>

                  <p>The method above provides a default Node for the underlying file. The default
                  Node has no child nodes, which is evident by the "Children.LEAF" parameter
                  that you see above.</p>

                  <p>Instead of passing in "Children.LEAF", use the <tt>ChildFactory</tt>
                      class to create new child nodes of our Node class:</p>

<pre class="examplecode">@Override
protected Node createNodeDelegate() {
    return new DataNode(
            this,
            <b>Children.create(new AbcChildFactory(this), true),</b>
            getLookup());
}</pre>

              </li>

          <li>Define the <tt>ChildFactory</tt> as follows:

<pre class="examplecode">private static class AbcChildFactory extends ChildFactory&lt;String&gt; {

    private final AbcDataObject dObj;

    public AbcChildFactory(AbcDataObject dObj) {
        this.dObj = dObj;
    }

    @Override
    protected boolean createKeys(List list) {
        FileObject fObj = dObj.getPrimaryFile();
        try {
            List&lt;String&gt; dObjContent = fObj.asLines();
            list.addAll(dObjContent);
        } catch (IOException ex) {
            Exceptions.printStackTrace(ex);
        }
        return true;
    }

    @Override
    protected Node createNodeForKey(String key) {
        Node childNode = new AbstractNode(Children.LEAF);
        childNode.setDisplayName(key);
        return childNode;
    }

}</pre></li>

          <li>In your module, open <tt>AbcTemplate.abc</tt> and enter the following text, or something like it,
               i.e., add several lines of text to your template file:

<pre class="examplecode">hello
world
how are things
today</pre></li>


          <li><p>Run the module again and then notice that you can expand the template file:</p>

 	      <p><img style="border: 1px solid #0e1b55" src="../images/tutorials/filetype/69-parse.png" alt="Parse"/></p>
      </li>


       </ol>

    </div>
<!-- ======================================================================================= -->

<h2><a name="properties"></a>Extending the Properties Window</h2>

<p>Our Node now has child Nodes. In this section, we also assign properties to our Node.
 The properties are displayed in the Properties window.</p>

		 <p class="tips">For background to this section and
                     complete details on support for properties
                  on the NetBeans Platform, see <a href="https://platform.netbeans.org/tutorials/nbm-property-editors.html">NetBeans Property Editor Tutorial</a>.</p>

<p>By default, the following properties are shown in the Properties window
     for our new file:</p>

  	      <p><img src="../images/tutorials/filetype/69-props-1.png" alt="Parse"/></p>

              <p>We will now change the default properties to show a custom property instead.</p>
<div class="indent">

      <ol>
	      <li>Open the <tt>AbcDataObject</tt> class and change the <tt>createNodeDelegate</tt>
                   method so that our own <tt>AbcNode</tt> will be created instead
                   of the generic <tt>DataNode</tt>:

<pre class="examplecode">@Override
protected Node createNodeDelegate() {
    return new <b>AbcNode</b>(
            this,
            Children.create(new AbcChildFactory(this), true),
            getLookup());
}</pre>
                   <p>The <tt>AbcNode</tt> does not exist yet, you will create it in the
                       next step.</p></li>

          <li>Define the <tt>AbcNode</tt> as follows:

<pre class="examplecode">class AbcNode extends DataNode {

    public AbcNode(AbcDataObject aThis, Children kids, Lookup lookup) {
        super(aThis, kids, lookup);
    }

    @Override
    protected Sheet createSheet() {
        Sheet sheet = super.createSheet();
        Sheet.Set set = Sheet.createPropertiesSet();
        sheet.put(set);
        set.put(new LineCountProperty(this));
        return sheet;
    }

    private static class LineCountProperty extends ReadOnly&lt;Integer&gt; {

        private final AbcNode node;

        public LineCountProperty(AbcNode node) {
            super("lineCount", Integer.class, "Line Count", "Number of Lines");
            this.node = node;
        }

        @Override
        public Integer getValue() throws IllegalAccessException, InvocationTargetException {
            int lineCount = 0;
            DataObject abcDobj = node.getDataObject();
            FileObject abcFo = abcDobj.getPrimaryFile();
            try {
                lineCount = abcFo.asLines().size();
            } catch (IOException ex) {
                Exceptions.printStackTrace(ex);
            }
            return lineCount;
        }

    }

}</pre></li>


          <li><p>Run the module again, open the Properties window, and notice
                   your property is displayed:</p>

 	      <p><img src="../images/tutorials/filetype/69-props-2.png" alt="Parse"/></p>
      </li>


       </ol>

    </div>

<!-- ======================================================================================= -->

<h2><a name="share"></a>Creating a Shareable Module Binary</h2>

<p>Now that the module is complete, you can let others use it. To do so, you
    need to create a binary "NBM" (NetBeans module) file and distribute it.</p>

<div class="indent">

      <ol>
	      <li>In the Projects window, right-click the <tt>Abc File Type</tt> project and choose Create NBM.

	      <p>The NBM file is created and you can view it in the Files window (Ctrl-2):</p>
	      <p><img style="border: 1px solid #0e1b55" src="../images/tutorials/filetype/69-shareable-nbm.png" alt="Shareable NBM."/></p></li>
	      <li>Make it available to others via, for example, the
              <a href="http://plugins.netbeans.org/PluginPortal/">NetBeans Plugin Portal</a>.
              The recipient should
	      use the Plugin Manager (Tools &gt; Plugins) to install it.</li>
       </ol>

    </div>


<!-- ======================================================================================== -->


<p></p>
<div class="feedback-box"><a href="https://netbeans.org/about/contact_form.html?to=3&amp;subject=Feedback:%20File%20Type%20Module%20Tutorial">Send Us Your Feedback</a></div>
<br style="clear:both;" /></br>
  
  
<!-- ======================================================================================== -->

<h2><a name="nextsteps"></a>Next Steps</h2>

<p>For more information about creating and developing NetBeans modules, see the following resources: </p>
  <ul>
	  <li><a href="https://platform.netbeans.org/index.html">NetBeans Platform Homepage</a></li>
	  <li><a href="https://netbeans.org/download/dev/javadoc/">NetBeans API List (Current Development Version)</a></li>
  <li><a href="https://netbeans.org/kb/trails/platform.html">Other Related Tutorials</a></li></ul>
  
<!-- ======================================================================================== -->
<!-- 
<h2><a name="version"></a>Versioning </h2>
  
<p>

<table width="76%" >
 <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>
         25 August 2005
      </td>
      <td>
	      <ul><li>Initial version.
		      <li>To do:
		      <ul><li>Add post-creation customizations (i.e., the "Extending Support for the New File Type" section).
		      <li>Explain what the generated files are for (placeholders currently).
		      <li>Explain the layer file's entries.
		      <li>Explain the first File Type panel (placeholders currently).
		      <li>Maybe create a separate tutorial for recognizing XML files.</ul></ul>
      </td>
  </tr>
<tr>
      <td>
         2
      </td>
      <td>
         23 September 2005
      </td>
      <td>
	      <ul><li>A lot of info added from the FAQ and added the Action wizard and System Filesystem Browser.
		      <li>To do:
		      <ul><li>Explain <tt>LoaderBeanInfo.java</tt> and <tt>Resolver.xml</tt> (one line each)
			      <li>Maybe create a separate tutorial for recognizing XML files.
			      <li>Using Tomcat GIF maybe not good idea.
			      <li>Maybe the action should do something useful.
			      <li>Maybe direct links to FAQ not good idea.
			      <li>Probably more needed on <tt>layer.xml</tt> file.
			      <li>Maybe other useful apisupport functionality could be added to this scenario.
			      <li>More info needed on MIME types.
			      <li>The introductory paragraphs should be illustrated with a graphic. A diagram to
			      show relationship between node, dataobject, fileobject, dataloader, etc.</ul></ul> 
      </td>
  </tr>

<tr>
      <td>
         3
      </td>
      <td>
         28 September 2005
      </td>
      <td>
	      <ul><li>Integrated comments from Jesse Glick.
		      <li>To do:
		      <ul>    <li>More info needed on MIME types.
			      <li>The introductory paragraphs should be illustrated with a graphic. A diagram to
			      show relationship between node, dataobject, fileobject, dataloader, etc.
			      <li>Many Javadoc links to be added (also for <tt>performAction</tt>.
			      <li>Info on cookies, cookie actions, cookie classes needed.
			      <li>Action ended up in text-html even though I chose my own mime type.
			      <li>Need to explain or link to explanation for instance, shadow, etc.
			      <li>Platform Manager needs to be mentioned in the context of installing
			      in target platform.
			      <li>Show how to add properties to the property sheet.</ul></ul> 
      </td>
  </tr>
<tr>
      <td>
         4
      </td>
      <td>
         4 October 2005
      </td>
      <td>
	      <ul><li>Added two diagrams in the introductory paragraphs, from Tim Boudreau's JavaOne presentation.
 <li>To do:
		      <ul>    <li>More info needed on MIME types.
			      <li>Many Javadoc links to be added (also for <tt>performAction</tt>).
			      <li>Need to create section near the start: "Related FAQs":
			      <ul><li>Info on cookies, cookie actions, cookie classes needed.
				      <li>Need to explain or link to explanation for instance, shadow, etc.
			      <li>DataLoader, DataObject, etc.</ul>
			      <li>Platform Manager needs to be mentioned in the context of installing
			      in target platform.
			      <li>Show how to add properties to the property sheet.
			      <li>Mention the dummy template that you get, how to modify it,
	       			and how to set the description in the New File wizard.</ul></ul> 
		     
      </td>
  </tr>
<tr>
      <td>
         4
      </td>
      <td>
         4 November 2005
      </td>
      <td>
	      <ul><li>Added downloadable source code, new 'Installing the Sample' section, and link to
		       Syntax Highlighting tutorial at the end.
 <li>To do:
 <ul>   <li>Same items as on 4 October still to be done.</ul> 
		     
      </td>
  </tr>
<tr>
      <td>
         5
      </td>
      <td>
         29 November 2005
      </td>
      <td>
	      <ul><li>Added links to brand new Component Palette tutorial.
 <li>To do:
 <ul>   <li>Same items as on 4 October still to be done.</ul> 
		     
      </td>
  </tr>
<tr>
      <td>
         6
      </td>
      <td>
	      21 April 2006
      </td>
      <td>
	      <ul><li>Changed the title from "DataLoader Module Tutorial" to "Recognizing a File Type Tutorial".
 <li>To do:
 <ul>   <li>Same items as on 4 October still to be done.</ul> 
		     
      </td>
  </tr>
  <tr>
      <td>
         7
      </td>
      <td>
	      17 November 2007
      </td>
      <td>
	      <ul><li>Updated the whole tutorial to 6.0, replaced all screenshots, and
              now [because the 6.0 IDE already provides support for manifest files], the
              tutorial focuses on imaginary Abc files.
 <li>To do:
 <ul>   <li>Need to replace the download, which is the same as before, dealing with manifest files.
       <li>Same items as on 4 October still to be done.
       <li>Added OpenSupport into TopComponent, with a reference to Visual Library.</ul>  
	<li>Changed title to File Type Integration Tutorial
        <li>Tweaked several places throughout tutorial, for 6.0
      </td>
  </tr>
   <tr>
                <td>
                    8
                </td>
                <td>
                    15 April 2008
                </td>
                <td>
                    Updated the styles (badge, table of contents, required software table)
                    to the new format.
                </td>
            </tr>
   <tr>
                <td>
                    9
                </td>
                <td>
                    16 July 2008
                </td>
                <td>
                    Created new version for 6.5, because of changes to the
                    way file type recognition is done in that release. To do:
                    <ul>
                        <li>6.5-specific badge
                        <li>Required software table
                        <li>Search for DataNode, BeanInfo, DataLoader and reword
                        <li>Check screenshots
                        <li>Make sure all the sections work as before
                    </ul>
                </td>
            </tr>
   <tr>
                <td>
                    10
                </td>
                <td>
                    4 April 2009
                </td>
                <td>
                    Worked through everything and added the multiview section.
                </td>
            </tr>
   <tr>
                <td>
                    11
                </td>
                <td>
                    9 Feb 2010
                </td>
                <td>
                    Changed JPanel to TopComponent in multiview section.
                </td>
            </tr>
            <tr>
                <td>
                    12
                </td>
                <td>
                    10 Feb 2010
                </td>
                <td>
                    Added links to javadoc for the MultiView classes.
                </td>
            </tr>
            <tr>
                <td>
                    13
                </td>
                <td>
                    18 Feb 2010
                </td>
                <td>
                    Added style for borders and fixed action instructions.
                </td>
            </tr>
            <tr>
                <td>
                    14
                </td>
                <td>
                    20 November 2010
                </td>
                <td>
                    Going through everything for 6.9, updating, changing screenshots everywhere, Nimbus.
                    Added the "Parsing the File" section, need to add Javadoc links and explanations.
                    Added the "Extending the Properties Window" section, need to add Javadoc links and explanations.
                </td>
            </tr>
  </tbody>
</table>
-->
</body>
</html>
