<!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>—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—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>—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—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—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 > 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 > 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—<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"><folder name="Loaders"> | |
<folder name="text"> | |
<folder name="x-abc"> | |
<folder name="Actions"> | |
<file name="org-openide-actions-CopyAction.shadow"> | |
<attr name="originalFile" stringvalue="Actions/Edit/org-openide-actions-CopyAction.instance"/> | |
<attr name="position" intvalue="400"/> | |
</file> | |
<file name="org-openide-actions-CutAction.shadow"> | |
<attr name="originalFile" stringvalue="Actions/Edit/org-openide-actions-CutAction.instance"/> | |
<attr name="position" intvalue="300"/> | |
</file> | |
<file name="org-openide-actions-DeleteAction.shadow"> | |
<attr name="originalFile" stringvalue="Actions/Edit/org-openide-actions-DeleteAction.instance"/> | |
<attr name="position" intvalue="600"/> | |
</file> | |
<file name="org-openide-actions-FileSystemAction.shadow"> | |
<attr name="originalFile" stringvalue="Actions/System/org-openide-actions-FileSystemAction.instance"/> | |
<attr name="position" intvalue="1100"/> | |
</file> | |
<file name="org-openide-actions-OpenAction.shadow"> | |
<attr name="originalFile" stringvalue="Actions/System/org-openide-actions-OpenAction.instance"/> | |
<attr name="position" intvalue="100"/> | |
</file> | |
<file name="org-openide-actions-PropertiesAction.shadow"> | |
<attr name="originalFile" stringvalue="Actions/System/org-openide-actions-PropertiesAction.instance"/> | |
<attr name="position" intvalue="1400"/> | |
</file> | |
<file name="org-openide-actions-RenameAction.shadow"> | |
<attr name="originalFile" stringvalue="Actions/System/org-openide-actions-RenameAction.instance"/> | |
<attr name="position" intvalue="700"/> | |
</file> | |
<file name="org-openide-actions-SaveAsTemplateAction.shadow"> | |
<attr name="originalFile" stringvalue="Actions/System/org-openide-actions-SaveAsTemplateAction.instance"/> | |
<attr name="position" intvalue="900"/> | |
</file> | |
<file name="org-openide-actions-ToolsAction.shadow"> | |
<attr name="originalFile" stringvalue="Actions/System/org-openide-actions-ToolsAction.instance"/> | |
<attr name="position" intvalue="1300"/> | |
</file> | |
<file name="sep-1.instance"> | |
<attr name="instanceClass" stringvalue="javax.swing.JSeparator"/> | |
<attr name="position" intvalue="200"/> | |
</file> | |
<file name="sep-2.instance"> | |
<attr name="instanceClass" stringvalue="javax.swing.JSeparator"/> | |
<attr name="position" intvalue="500"/> | |
</file> | |
<file name="sep-3.instance"> | |
<attr name="instanceClass" stringvalue="javax.swing.JSeparator"/> | |
<attr name="position" intvalue="800"/> | |
</file> | |
<file name="sep-4.instance"> | |
<attr name="instanceClass" stringvalue="javax.swing.JSeparator"/> | |
<attr name="position" intvalue="1000"/> | |
</file> | |
<file name="sep-5.instance"> | |
<attr name="instanceClass" stringvalue="javax.swing.JSeparator"/> | |
<attr name="position" intvalue="1200"/> | |
</file> | |
</folder> | |
<folder name="Factories"> | |
<file name="AbcDataLoader.instance"> | |
<attr name="SystemFileSystem.icon" urlvalue="nbresloc:/org/myorg/abcfiletype/Datasource.gif"/> | |
<attr name="dataObjectClass" stringvalue="org.myorg.abcfiletype.AbcDataObject"/> | |
<attr name="instanceCreate" methodvalue="org.openide.loaders.DataLoaderPool.factory"/> | |
<attr name="mimeType" stringvalue="text/x-abc"/> | |
</file> | |
</folder> | |
</folder> | |
</folder> | |
</folder> | |
<folder name="Services"> | |
<folder name="MIMEResolver"> | |
<file name="AbcResolver.xml" url="AbcResolver.xml"> | |
<attr name="displayName" bundlevalue="org.myorg.abcfiletype.Bundle#Services/MIMEResolver/AbcResolver.xml"/> | |
</file> | |
</folder> | |
</folder> | |
<folder name="Templates"> | |
<folder name="Other"> | |
<file name="AbcTemplate.abc" url="AbcTemplate.abc"> | |
<attr name="displayName" bundlevalue="org.myorg.abcfiletype.Bundle#Templates/Other/AbcTemplate.abc"/> | |
<attr name="template" boolvalue="true"/> | |
</file> | |
</folder> | |
</folder></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 > 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 > 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">... | |
... | |
... | |
<folder name="Loaders"> | |
<folder name="text"> | |
<folder name="x-abc"> | |
<folder name="Actions"> | |
<b><file name="org-myorg-abcfiletype-MyAction.shadow"> | |
<attr name="originalFile" stringvalue="Actions/File/org-myorg-abcfiletype-MyAction.instance"/> | |
<attr name="position" intvalue="0"/> | |
</file></b> | |
<file name="org-openide-actions-CopyAction.shadow"> | |
<attr name="originalFile" stringvalue="Actions/Edit/org-openide-actions-CopyAction.instance"/> | |
<attr name="position" intvalue="400"/> | |
</file> | |
<file name="org-openide-actions-CutAction.shadow"> | |
<attr name="originalFile" stringvalue="Actions/Edit/org-openide-actions-CutAction.instance"/> | |
<attr name="position" intvalue="300"/> | |
</file> | |
<file name="org-openide-actions-DeleteAction.shadow"> | |
<attr name="originalFile" stringvalue="Actions/Edit/org-openide-actions-DeleteAction.instance"/> | |
<attr name="position" intvalue="600"/> | |
</file> | |
<file name="org-openide-actions-FileSystemAction.shadow"> | |
<attr name="originalFile" stringvalue="Actions/System/org-openide-actions-FileSystemAction.instance"/> | |
<attr name="position" intvalue="1100"/> | |
</file> | |
<file name="org-openide-actions-OpenAction.shadow"> | |
<attr name="originalFile" stringvalue="Actions/System/org-openide-actions-OpenAction.instance"/> | |
<attr name="position" intvalue="100"/> | |
</file> | |
... | |
... | |
...</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 > 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<String> { | |
private final AbcDataObject dObj; | |
public AbcChildFactory(AbcDataObject dObj) { | |
this.dObj = dObj; | |
} | |
@Override | |
protected boolean createKeys(List list) { | |
FileObject fObj = dObj.getPrimaryFile(); | |
try { | |
List<String> 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<Integer> { | |
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 > Plugins) to install it.</li> | |
</ol> | |
</div> | |
<!-- ======================================================================================== --> | |
<p></p> | |
<div class="feedback-box"><a href="https://netbeans.org/about/contact_form.html?to=3&subject=Feedback:%20File%20Type%20Module%20Tutorial">Send Us Your Feedback</a></div> | |
<!-- ======================================================================================== --> | |
<h2><a name="nextsteps"></a>Next Steps</h2> | |
<p>For more information about creating and developing NetBeans modules, see the following resources: </p> | |
<ul> | |
<li><a href="https://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> |