blob: e016175e4c756ece23cd7b82cea80668c8d24134 [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<!-- -*- xhtml -*- -->
<title>NetBeans Multiview Editor Module Tutorial</title>
<link rel="stylesheet" type="text/css" href="https://netbeans.org/netbeans.css">
<meta name="AUDIENCE" content="NBUSER">
<meta name="TYPE" content="ARTICLE">
<meta name="EXPIRES" content="N">
<meta name="developer" content="gwielenga@netbeans.org">
<meta name="indexed" content="y">
<meta name="description"
content="A short guide to using the Multiview API.">
<!-- Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. -->
<!-- Use is subject to license terms.-->
</head>
<body>
<h1>NetBeans Multiview Editor Module Tutorial</h1>
<p><small><a href="mailto:nbdocs_feedback@usersguide.netbeans.org?subject=Feedback:%20NetBeans%20IDE%20Multiview%20Editor%20Module%20Tutorial">Feedback</a></small></p>
<p>This tutorial walks you through an implementation of the <a href="https://netbeans.org/download/dev/javadoc/org-netbeans-core-multiview/overview-summary.html">MultiView API</a>. A multiview displays multiple views on data in the IDE. For example, the <tt>web.xml</tt> file can be edited in a <i>source</i> view
as well as in a <i>design</i> view&#8212;in the former, you work with XML tags; in the latter, you use user interface
components such as drop-down lists and checkboxes.
<p>The multiview that you create in this tutorial is an editor for a subset of the data in the JBoss deployment descriptor (<tt>jboss-web.xml</tt>).
The multiview editor that you create in this tutorial will only be visible when an XML file with the <tt>jboss-web.xml</tt> namespace
is open in the IDE's Source Editor. (However, since the JBoss deployment descriptor does not officially have a namespace, the placeholder <tt>jbosstype</tt> is
used instead.) Specifically for these files, the user will have two views for editing, as shown below.
<p>This is the Source view:
<p><img src="../images/tutorials/multiview/final_pic1.png" alt="Source view.">
<p>And this is the Design view:
<p><img src="../images/tutorials/multiview/final_pic2.png" alt="Design view.">
<p>When a change is made in one of the views, it is immediately synchronized with the other view. So when, for example,
the value of the 'Description' field above is modified in the Design view, the Source view is changed at the same time.
<p>The following topics are covered below:</p>
<ul>
<li><a href="#installing-software">Installing the Software</a>
<ul>
<li><a href="#installing-sample">Installing the Sample</a></li>
</ul>
</li>
<li><a href="#setting-up-module-project">Setting Up the Module Project</a>
<li><a href="#recognizing-new-file-type">Recognizing the New File Type</a>
<li><a href="#creating-design-view">Creating the Design View</a>
<ul>
<li><a href="#creating-window-component">Creating the Window Component</a>
<li><a href="#specifying-module-dependencies">Specifying the Module's Dependencies</a>
<li><a href="#designing-design-view">Designing the Design View</a>
<li><a href="#adding-editor-support">Adding Editor Support</a>
<li><a href="#enabling-multiview-editor">Enabling the Multiview Editor</a>
</ul>
<li><a href="#registering-module">Registering the Module</a>
<li><a href="#building-and-installing-module">Building and Installing the Module</a>
<ul>
<li><a href="#installing-and-using-nodule">Installing and Using the Module</a>
<li><a href="#creating-shareable-module-library">Creating a Shareable Module Binary</a>
</ul>
</ul>
<p><a name="top"></a>Once the software is installed, this tutorial can be completed in 45 minutes.
<p>For more information on working with modules, see the <a href="https://platform.netbeans.org/index.html">
NetBeans Development Project home</a> on the NetBeans website. If you have questions, visit the
<a href="http://wiki.netbeans.org/wiki/view/NetBeansDeveloperFAQ">NetBeans Developer FAQ</a> or use the feedback link
at the top of this page.</p>
<br />
<!-- ===================================================================================== -->
<h2 class="tutorial"><a name="installing-software"></a>Installing the Software</h2>
<p>Before you begin, you need to install the following software on your
computer:</p>
<ul>
<li>NetBeans IDE 5.x (<a href="http://www.netbeans.info/downloads/download.php?a=n&p=1">download</a>)</li>
<li>Java Standard Development Kit (JDK&trade;) version
1.4.2 (<a href="http://java.sun.com/j2se/1.4.2/download.html">download</a>)
or 5.0 (<a href="http://java.sun.com/j2se/1.5.0/download.jsp">download</a>)</li>
</ul>
<br />
<div class="indent">
<h3 class="tutorial"><a name="installing-sample"></a>Installing the Sample</h3>
<p>Take the following steps to install the sample:
<ol><p><li>Unzip the <a href="https://netbeans.org/files/documents/4/657/jbossVisualEditor.zip">attached file</a>.
<p><li>In the IDE, choose File &gt; Open Project and browse to the folder that contains the unzipped file.
Open the module project. It should look as follows:
<p><img src="../images/tutorials/multiview/projects_window_final.png" alt="Completed projects window.">
<p>In the illustration above, the two selected files provide the implementation of the <a href="https://netbeans.org/download/dev/javadoc/org-netbeans-core-multiview/overview-summary.html">MultiView API</a>.
<p><li>Right-click the project node and choose Install/Reload in Target Platform. When the new instance of the IDE
opens, create a new web application, right-click it, choose New &gt; File/Folder, and select the new <tt>jboss-web.xml</tt> file:
<p><img src="../images/tutorials/multiview/newfile.png" alt="Test file.">
<p>Click Next. Name the file whatever you like and store it in a folder of your choice.
When you complete the wizard and the new file opens in the Source Editor,
notice that you now have two views on your data&#8212;a Design view and
a Source view:
<p><img src="../images/tutorials/multiview/jboss-web-xml2.png" alt="Test file.">
</ol>
<p>Now that you know what the end result looks like, you will create the module from scratch and learn about each part
while creating it.
</div>
<br />
<!-- ===================================================================================== -->
<h2 class="tutorial"><a name="setting-up-module-project"></a>Setting up the Module Project</h2>
<p>Before you start writing the module, you have to make sure you
that your project is set up correctly. <a href="http://www.netbeans.info/downloads/download.php?a=n&p=1">NetBeans IDE 5.x</a> provides a wizard that sets up all the basic files
needed for a module.</p>
<ol>
<p><li>Choose File &gt; New Project (Ctrl-Shift-N). Under Categories, select NetBeans Plug-in Modules. Under projects,
select Module Project and click Next.</li>
<p><li>In the Name and Location panel, type <tt>jbossVisualEditor</tt> in Project Name.
Change the
Project Location to any directory on your computer. Leave the Standalone Module radio button
and the Set as Main Project checkbox selected.
Click Next.
<p><li>In the Basic Module Configuration panel, replace <tt>yourorghere</tt> in Code Name Base with <tt>org.netbeans</tt>,
so that the whole code name base is <tt>org.netbeans.jbossvisualeditor</tt>.
Leave the display name unchanged. Do not change the location of the localizing bundle and the location of the XML layer, so that they will be stored in a
package with the name <tt>org/netbeans/jbossvisualeditor</tt>. Click Finish.</ol>
<p> The IDE creates the <tt>jbossVisualEditor</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, this is what the projects window should
look like right now:
<p align="left"><img src="../images/tutorials/multiview/projects_window_zero.png" alt="projects window zero"></ol>
<br />
<!-- ===================================================================================== -->
<h2><a name="recognizing-new-file-type"></a>Recognizing the New File Type</h2>
<p>Since you are making a multiview editor for JBoss deployment descriptors, you need to make sure that
the IDE knows how to recognize one. In principle, the JBoss deployment descriptor is an XML file like most
other XML files&#8212;it's <tt>.xml</tt> file extension is non-distinctive. In these cases, a distinction can
be made via the file's first element, its namespace, or its doctype. In this tutorial, you will distinguish JBoss deployment
descriptors via their namespace.
<ol>
<p><li>Right-click the project node and
choose New &gt; File Type. </li>
<p><li>In the File Recognition panel, do the following:
<p><ul><li>Type <tt>text/x-jboss+xml</tt> in the MIME Type edit box.
<li>Type <tt>jbosstype</tt> in the by XML Root Element edit box.</ul>
<p>The File Recognition panel should now look as follows:
<p align="left"><img src="../images/tutorials/multiview/filewizard1.png" alt="Step 1 of New File wizard.">
<p>Note the following about the fields in the File Recognition panel:
<ul>
<li><b>MIME Type.</b> Specifies the data object's unique MIME type.
<p><ul><li><b>by 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:
<p><ul><li><tt>.abc,.def</tt>
<li><tt>.abc .def</tt>
<li><tt>abc def</tt>
<li><tt>abc,.def ghi, .wow</ul></tt>
<p>Note that manifests in JAR files are "MANIFEST.MF" and can be case-sensitive (at least on Unix). For
this reason, you specify <i>two</i> MIME types in this tutorial&#8212;<tt>.mf</tt> and <tt>.MF</tt>.
<li><b>by 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. In this tutorial, the distinction will be based on an imaginary namespace, <tt>jbosstype</tt>.
</ul></ul>
<p>Click Next.
<p><li>In the Name and Location panel, do the following:
<ul><p><li>In Class Name Prefix, type <tt>jbossdd</tt>.
<p><li>In Icon, browse to any 16x16 pixel image file as the new file type's icon. Several
16x16 pixel image files are found within your NetBeans installation directory, for example, in this
location:
<p><tt>enterprise2\jakarta-tomcat-5.5.7\server\webapps\admin\images.</tt>
<p>For example, you could use the <tt>Datasource.gif</tt> image in the above directory.
This is what it looks like: <img src="../images/tutorials/filetype/Datasource.gif" alt="Datasource.gif">
<p><li>In Package, change <tt>org.netbeans.jbossvisualeditor</tt> to <tt>org.netbeans.jbossvisualeditor.dataloader</tt>.</ul>
<p><li>Click Finish.
<p>The Projects window should now look as follows:
<p align="left"><img src="../images/tutorials/multiview/projects_window_first.png" alt="Final Projects window."></ol>
<p>Each of the newly generated files (highlighted above) is briefly introduced:
<ul>
<p><li><b><tt>jbossddDataLoader.java</tt>.</b> Recognizes the <tt>text/x-jboss+xml</tt> MIME type. Functions as a factory for
the <tt>DataObject</tt>. For more information, see <a href="http://wiki.netbeans.org/wiki/view/DevFaqDataLoader">What is a DataLoader?</a>.
<p><li><b><tt>jbossddResolver.xml</tt>.</b> Maps the MIME type to an <tt>&lt;xml-rule&gt;</tt> that restricts the <tt>DataLoader</tt>
to only recongize XML files that match the <tt>&lt;xml-rule&gt;</tt>. In this tutorial, the rule specifes that only files that have <tt>jbosstype</tt> as
their namespace will be recognized by the <tt>DataLoader</tt>.
<p><li><b><tt>jbossddDataObject.java</tt>.</b> Wraps a <tt>FileObject</tt>. <tt>DataObjects</tt> are produced by <tt>DataLoaders</tt>.
For more information, see <a href="http://wiki.netbeans.org/wiki/view/DevFaqDataObject">What is a DataObject?</a>.
<p><li><b><tt>jbossddDataNode.java</tt>.</b> Provides what you <i>see</i> in the IDE&#8212;functionality like actions, icons, and localized names.
<p><li><b><tt>jbossddDataLoaderBeanInfo.java</tt>.</b> Controls the appearance of the <tt>DataLoader</tt> in the Object Types section
of the Options window.
<p><li><b><tt>jbossddTemplate.xml</tt>.</b> Provides a dummy template that the <tt>layer.xml</tt> file registers in the New File wizard. Change the
default content of this file to the following:
<p><pre class="examplecode">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;jboss-web xmlns="jbosstype"&gt;
&lt;context-root&gt;/hello&lt;/context-root&gt;
&lt;resource-ref&gt;
&lt;description&gt;The default DS&lt;/description&gt;
&lt;res-ref-name&gt;jdbc/DefaultDS&lt;/res-ref-name&gt;
&lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt;
&lt;res-auth&gt;Container&lt;/res-auth&gt;
&lt;/resource-ref&gt;
&lt;/jboss-web&gt;</pre>
</ul>
</p>
<br />
<!-- ===================================================================================== -->
<h2 class="tutorial"><a name="creating-design-view"></a>Creating the Design View</h2>
<p>The multiview editor is actually already halfdone before you begin&#8212;the <i>source</i> view is there by default.
So, all you need to do is create the <i>design</i> view, which is built up out of components such as <tt>JTextFields</tt>
and <tt>JComboBoxes</tt>. Components such as these are used to set values for the JBoss deployment desciptor. Creating
the <i>design</i> view is what this section is all about.
<div class="indent">
<h3 class="tutorial"><a name="specifying"></a>Creating the Window Component</h3>
<ol>
<p><li>Right-click the <tt>jbossVisualEditor</tt> project node and
choose New &gt; Window Component. </li>
<p><li>In the Basic Settings panel, choose <tt>editor</tt> from the Window Position drop-down list.
This positions the Design view in the <tt>editor</tt> mode of the IDE, where the Source
Editor, containing the Source view, is also found. <p>Do not select the
Open on Application Start checkbox, because you want the Design view to be displayed only when the JBoss deployment descriptor is
open in the Source Editor, instead of whenever the IDE opens. Click Next.
<p><li>In the Name and Location panel, do the following:
<ul><p><li>In Class Name Prefix, type <tt>designView</tt>.
<p><li>In Icon, browse to any 16x16 pixel image file as the new file type's icon.
<p><li>In Package, change <tt>org.netbeans.jbossvisualeditor</tt> to <tt>org.netbeans.jbossvisualeditor.editor</tt>.</ul>
<p><li>Click Finish.
<p>The Projects window should now look as follows:
<p align="left"><img src="../images/tutorials/multiview/projects_window_second.png" alt="Final Projects window."></ol>
<p>Each of the newly generated files (highlighted above) is briefly introduced:
<ul>
<p><li><b><tt>designViewTopComponent.java</tt>.</b> Implements the <a href="https://netbeans.org/download/dev/javadoc/org-openide-windows/org/openide/windows/TopComponent.html">TopComponent</a> class.
<p><li><b><tt>designViewAction.java</tt>.</b> Provides an action for opening <tt>designViewTopComponent.java</tt>.
<p><li><b><tt>designViewTopComponentSettings.xml</tt>.</b> Specifies...
<p><li><b><tt>designViewTopComponentWstcref.xml</tt>.</b> Specifies...
</ul>
<h3 class="tutorial"><a name="specifying-module-dependencies"></a>Specifying the Module's Dependencies</h3>
<p>You will need to subclass several classes that belong to the <a href="https://netbeans.org/download/dev/javadoc/">NetBeans APIs</a>.
Each has to be declared as a Module dependency. Use the Project Properties dialog box for this purpose.
<ol>
<li>In the Projects window, right-click the <tt>jbosswebxml</tt> project node and choose Properties.
In the Project Properties dialog box, click Libraries.
<p>You should see that the following libraries have been declared for you by the IDE. The IDE did
this when you used the New File wizard and the New Window Component wizard. Here is what you should see:
<p><img src="../images/tutorials/multiview/proj_props2.png" alt="All source files.">
<p>Now you need to add some more for the tasks that follow.
</li>
<p><li>For each of the following APIs, click "Add...",
select the name from the Module list, and then click OK to confirm it:
<ul><p><li>UI Utilities API
<p><li>Core - MultiView Windows
</ul>
<p><li>Click OK to exit the Project Properties dialog box.
<p><li>In the Projects window, expand the Important Files node, double-click the Project Metadata node, and note that the APIs you selected have been
declared as Module dependencies.
</ol>
<h3 class="tutorial"><a name="designing-design-view"></a>Designing the Design View</h3>
<ol><li>In the <tt>org.netbeans.jbossvisualeditor.editor</tt> package, double-click <tt>designViewTopComponent.java</tt>. The implementation of <tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-windows/org/openide/windows/TopComponent.html">TopComponent</a></tt>
opens in the Design view of the Source Editor.
<p><li>Drag and drop <tt>JPanels</tt>, <tt>JLabels</tt>, <tt>JTextFields</tt>, and <tt>JComboBoxes</tt> onto the <tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-windows/org/openide/windows/TopComponent.html">TopComponent</a></tt>. Name the
<tt>JLabels</tt> however you like.
<p>Make sure that you change the names of the <tt>JTextFields</tt> and <tt>JComboBoxes</tt> as follows:
<ul><p><li><tt>JTextField: contextroot
<p><li>JTextField: description
<p><li>JTextField: name
<p><li>JComboBox: type
<p><li>JCombobox: authority</tt></ul>
<p>You can also add bordered titles to the <tt>JPanels</tt> and put some values in the <tt>JComboBoxes</tt>. At the end of
this subsection, your <tt><a href="https://netbeans.org/download/dev/javadoc/org-openide-windows/org/openide/windows/TopComponent.html">TopComponent</a></tt> should look something like this:
<p><img src="../images/tutorials/multiview/description_being_named.png" alt="multi design view">
<p>In the illustration above, you see that the name of one of the <tt>JTextFields</tt> is set to <tt>description</tt>.
</ol>
<h3 class="tutorial"><a name="designing-design-view"></a>Coding the Design View</h3>
<p>This is where the real work begins! Till now, you have used wizards and the GUI Builder. From now until the end of this tutorial,
you are entering uncharted territory&#8212;the IDE currently does not provide specific assistance for the MultiView API in the way that, for
example, the
<a href="https://netbeans.org/download/dev/javadoc/org-openide-windows/org/openide/windows/TopComponent.html">TopComponent</a> class is supported by the Window Component wizard. However, you
will be shown how to use many of the Source Editor's features while building the multiview editor for the JBoss deployment descriptor.
Throughout this subsection, you will be coding <tt>designViewTopComponent.java</tt> in the Source Editor's Source view.
<ol>
<p><li>By default, this is the <tt>designViewTopComponent.java</tt> class's class declaration:
<p><pre class="examplecode">final class designViewTopComponent extends <a href="https://netbeans.org/download/dev/javadoc/org-openide-windows/org/openide/windows/TopComponent.html">TopComponent</a> {</pre>
<p>Change it to the following in the Source Editor:
<p><pre class="examplecode">final class designViewTopComponent extends CloneableTopComponent implements MultiViewElement, Serializable {</pre>
<p>Red wavy lines appear under the class declaration, indicating an error.
Put the cursor in the line and press Alt-Enter. The IDE suggests a solution:
<p><img src="../images/tutorials/multiview/alt-enter-1.png" alt="alt-enter-1">
<p>Select the suggestion. Several import statements are generated for you.
<p>Continue pressing Alt-Enter in the class declaration. Accept any suggestions the IDE gives you, such as the following:
<p><img src="../images/tutorials/multiview/alt-enter-2.png" alt="alt-enter-2">
<p>Now you have several new methods and import statements, all required by the NetBeans APIs that you will be using later.
<p><li>The red wavy lines have not disappeared, indicating that there are still errors. When you hover
your mouse over the red error icon, you see the cause of the error:
<p><img src="../images/tutorials/multiview/alt-enter-4.png" alt="alt-enter-4">
<p>To fix this, and similar errors that follow after you fix this specific error, paste the following code
into <tt>designViewTopComponent.java</tt>, right at the end after the final method:
<p><pre class="examplecode">// &lt;editor-fold defaultstate="collapsed" desc=" Boilerplate code "&gt;
public void componentActivated() {
try {
loadData();
} catch (SAXException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
} catch (ParserConfigurationException ex) {
ex.printStackTrace();
}
}
public void componentDeactivated() {
}
public void componentShowing() {
}
public void componentHidden() {
}// &lt;/editor-fold&gt;</pre>
<p>Notice that a red wavy line appears under <tt>loadData()</tt>. This is because you have not defined
this method yet. Press Alt-Enter in this line and the IDE displays a suggestion:
<p><img src="../images/tutorials/multiview/alt-enter-5.png" alt="alt-enter-5">
<p>Accept the suggestion. The <tt>loadData()</tt> method is created. (Red wavy lines will still be present, but you
will solve those later.) The IDE will use
this method to load the values of the XML tags into the <tt>JTextFields</tt> and <tt>JComboBoxes</tt> in the Design view. Doing this means, in turn,
using the <tt>loadData()</tt> method to traverse the <tt>Document</tt> object. Before going further,
declare the following variables at the top of the class:
<p><pre class="examplecode">private MultiViewElementCallback callback;
private CloseOperationState cos;
private jbossddEditorSupport support;
private Node contextrootNode;
private Node descriptionNode;
private Node nameNode;
private Node typeNode;
private Node authorityNode;
private Document xmldoc;
private NodeListener listener;
private MultiDataObject.Entry entry;</pre>
<p>Right-click in the IDE and choose Fix Imports (Alt-Shift-F) to let the IDE generate the required import statements. In the
Fix Imports dialog box, choose <tt>org.w3c.dom.Document</tt> and <tt>org.w3c.dom.Node</tt>. No imports will be found for
<tt>jbossddEditorSupport</tt>, because you have not created this class yet.
<p>Now fill out the new <tt>loadData()</tt> method so that its content is as follows:
<p><pre class="examplecode">private void loadData() throws IOException, ParserConfigurationException, SAXException{
jbossddEditorSupport support = (jbossddEditorSupport) entry.getDataObject().getCookie(jbossddEditorSupport.class);
if(null != support){
InputStream is = support.getInputStream();
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
xmldoc = builder.parse(is);
NodeList list = xmldoc.getElementsByTagName("context-root");
if(list.getLength() &gt; 0){
Node current = list.item(0);
//Set the context-root textfield with the content of the node
contextrootNode = current.getFirstChild();
this.contextroot.setText(contextrootNode.getNodeValue());
//Set the the description textfield with the content of node
descriptionNode = xmldoc.getElementsByTagName("description").item(0).getFirstChild();
this.description.setText(descriptionNode.getNodeValue());
//Set the resource reference name textfield with the content of node
nameNode = xmldoc.getElementsByTagName("res-ref-name").item(0).getFirstChild();
this.name.setText(nameNode.getNodeValue());
//Set the resource type textfield with the content of node
typeNode = xmldoc.getElementsByTagName("res-type").item(0).getFirstChild();
this.type.setSelectedItem(typeNode.getNodeValue());
//Set the resource authority textfield with the content of node
authorityNode = xmldoc.getElementsByTagName("res-auth").item(0).getFirstChild();
this.authority.setSelectedItem(authorityNode.getNodeValue());
}
is.close();
}
}</pre>
<p>New red wavy lines appear, because your code refers to <tt>jbossddEditorSupport.java</tt>, which
you have not created yet. You will do this in the <a href="#adding-editor-support">Adding Editor Support</a> section.
<p><li>Next, specify what should happen when the user types values in the Design view. For each component (in the case of this tutorial,
that means for each <tt>JTextField</tt> and <tt>JComboBox</tt>), add a <tt>KeyListener</tt>, as shown below. When the <tt>keyReleased</tt> event
for each component is invoked, the content of the related component is put in a specified node in the <tt>Document</tt> object.
<p><pre class="examplecode">private void addSupport(){
contextroot.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
contextrootNode.setNodeValue(contextroot.getText());
ByteArrayOutputStream os = new ByteArrayOutputStream();
try {
XMLUtil.write(xmldoc, os, "UTF-8");
StyledDocument doc = support.getDocument();
doc.remove(0, doc.getLength());
doc.insertString(0, os.toString(), null);
os.close();
} catch (IOException ex) {
ex.printStackTrace();
}catch (BadLocationException ex) {
ex.printStackTrace();
}
entry.getDataObject().setModified(true);
}
public void keyTyped(KeyEvent e) {
}
});
description.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
descriptionNode.setNodeValue(description.getText());
ByteArrayOutputStream os = new ByteArrayOutputStream();
try {
XMLUtil.write(xmldoc, os, "UTF-8");
StyledDocument doc = support.getDocument();
doc.remove(0, doc.getLength());
doc.insertString(0, os.toString(), null);
os.close();
} catch (IOException ex) {
ex.printStackTrace();
}catch (BadLocationException ex) {
ex.printStackTrace();
}
}
public void keyTyped(KeyEvent e) {
}
});
name.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
nameNode.setNodeValue(name.getText());
ByteArrayOutputStream os = new ByteArrayOutputStream();
try {
XMLUtil.write(xmldoc, os, "UTF-8");
StyledDocument doc = support.getDocument();
doc.remove(0, doc.getLength());
doc.insertString(0, os.toString(), null);
os.close();
} catch (IOException ex) {
ex.printStackTrace();
}catch (BadLocationException ex) {
ex.printStackTrace();
}
}
public void keyTyped(KeyEvent e) {
}
});
type.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
typeNode.setNodeValue(type.getSelectedItem().toString());
ByteArrayOutputStream os = new ByteArrayOutputStream();
try {
XMLUtil.write(xmldoc, os, "UTF-8");
StyledDocument doc = support.getDocument();
doc.remove(0, doc.getLength());
doc.insertString(0, os.toString(), null);
os.close();
} catch (IOException ex) {
ex.printStackTrace();
}catch (BadLocationException ex) {
ex.printStackTrace();
}
}
public void keyTyped(KeyEvent e) {
}
});
authority.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
authorityNode.setNodeValue(authority.getSelectedItem().toString());
ByteArrayOutputStream os = new ByteArrayOutputStream();
try {
XMLUtil.write(xmldoc, os, "UTF-8");
StyledDocument doc = support.getDocument();
doc.remove(0, doc.getLength());
doc.insertString(0, os.toString(), null);
os.close();
} catch (IOException ex) {
ex.printStackTrace();
}catch (BadLocationException ex) {
ex.printStackTrace();
}
}
public void keyTyped(KeyEvent e) {
}
});
}</pre>
<p><li>Somewhere in <tt>designViewTopComponent.java</tt> the following methods are defined:
<p><pre class="examplecode">public JComponent getVisualRepresentation() {
}
public JComponent getToolbarRepresentation() {
}
public void setMultiViewCallback(MultiViewElementCallback multiViewElementCallback) {
}
public CloseOperationState canCloseElement() {
}</pre>
<p>Replace these methods with the following (and then press Alt-Shift-F to fix the import statements):
<p><pre class="examplecode">public JComponent getVisualRepresentation() {
return this;
}
public JComponent getToolbarRepresentation() {
return new JToolBar();
}
public void setMultiViewCallback(MultiViewElementCallback multiViewElementCallback) {
this.callback = callback;
}
public CloseOperationState canCloseElement() {
if (entry.getDataObject().isModified()) {
return this.cos;
} else {
return CloseOperationState.STATE_OK;
}
}</pre>
<p><li><i>Below</i> the existing constructor in <tt>designViewTopComponent.java</tt>, add the following methods:
<p><pre class="examplecode">public designViewTopComponent(MultiDataObject.Entry entry, CloseOperationState cos){
this();
this.entry = entry;
this.cos = cos;
this.support = (jbossddEditorSupport) entry.getDataObject().getCookie(jbossddEditorSupport.class);
addSupport();
try {
loadData();
} catch (SAXException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
} catch (ParserConfigurationException ex) {
ex.printStackTrace();
}
init();
}
protected void updateNameAndIcon(DataObject o, org.openide.nodes.Node n) {
String displayName = n.getDisplayName();
if (o.isModified()) {
setName(NbBundle.getMessage(designViewTopComponent.class, "LBL_modified_name", displayName));
} else {
setName(displayName);
}
setIcon(n.getIcon(BeanInfo.ICON_COLOR_16x16));
}
private void init(){
final DataObject o = entry.getDataObject();
final org.openide.nodes.Node n = o.getNodeDelegate();
updateNameAndIcon(o, n);
listener = new NodeAdapter() {
public void propertyChange(PropertyChangeEvent ev) {
String prop = ev.getPropertyName();
if (prop == null ||
prop.equals(org.openide.nodes.Node.PROP_DISPLAY_NAME) ||
prop.equals(org.openide.nodes.Node.PROP_ICON) ||
prop.equals(DataObject.PROP_MODIFIED)) {
updateNameAndIcon(o, n);
}
}
};
n.addNodeListener(NodeOp.weakNodeListener(listener, n));
o.addPropertyChangeListener(WeakListeners.propertyChange(listener, o));
}</pre>
</ol>
<h3 class="tutorial"><a name="adding-editor-support"></a>Adding Editor Support</h3>
<ol><li>Inner class:
<p><pre class="examplecode">private class DesignView implements <a href="https://netbeans.org/download/dev/javadoc/org-netbeans-core-multiview/org/netbeans/core/spi/multiview/MultiViewDescription.html">MultiViewDescription</a>, Serializable{
private static final long serialVersionUID = 0L;
private <a href="https://netbeans.org/download/dev/javadoc/org-openide-loaders/org/openide/loaders/MultiDataObject.Entry.html">MultiDataObject.Entry</a> entry;
private <a href="https://netbeans.org/download/dev/javadoc/org-netbeans-core-multiview/org/netbeans/core/spi/multiview/CloseOperationState.html">CloseOperationState</a> cos;
public DesignView(MultiDataObject.Entry entry, CloseOperationState cos){
this.cos = cos;
this.entry = entry;
}
public int <a href="https://netbeans.org/download/dev/javadoc/org-netbeans-core-multiview/org/netbeans/core/spi/multiview/MultiViewDescription.html#getPersistenceType()">getPersistenceType()</a> {
return TopComponent.PERSISTENCE_ONLY_OPENED;
}
public String <a href="https://netbeans.org/download/dev/javadoc/org-netbeans-core-multiview/org/netbeans/core/spi/multiview/MultiViewDescription.html">getDisplayName()</a> {
return "Design";
}
public Image <a href="https://netbeans.org/download/dev/javadoc/org-netbeans-core-multiview/org/netbeans/core/spi/multiview/MultiViewDescription.html#getIcon()">getIcon()</a> {
return entry.getDataObject().getNodeDelegate().getIcon(BeanInfo.ICON_COLOR_16x16);
}
public HelpCtx <a href="https://netbeans.org/download/dev/javadoc/org-netbeans-core-multiview/org/netbeans/core/spi/multiview/MultiViewDescription.html#getHelpCtx()">getHelpCtx()</a> {
return entry.getDataObject().getHelpCtx();
}
public String <a href="https://netbeans.org/download/dev/javadoc/org-netbeans-core-multiview/org/netbeans/core/spi/multiview/MultiViewDescription.html#preferredID()">preferredID()</a> {
return ".design";
}
public MultiViewElement <a href="https://netbeans.org/download/dev/javadoc/org-netbeans-core-multiview/org/netbeans/core/spi/multiview/MultiViewDescription.html#createElement()">createElement()</a> {
designViewTopComponent component = new designViewTopComponent(entry, cos);
return component;
}
}</pre>
<li>Inner class:
<p><pre class="examplecode">private class SourceView implements MultiViewDescription, Serializable{
private static final long serialVersionUID = 0L;
private jbossddDataObject object;
private CloseOperationState cos;
public SourceView(jbossddDataObject object, CloseOperationState cos){
this.cos = cos;
this.object = object;
}
public int getPersistenceType() {
return TopComponent.PERSISTENCE_ONLY_OPENED;
}
public String getDisplayName() {
return "Source";
}
public Image getIcon() {
return object.getNodeDelegate().getIcon(BeanInfo.ICON_COLOR_16x16);
}
public HelpCtx getHelpCtx() {
return object.getHelpCtx();
}
public String preferredID() {
return ".source";
}
public MultiViewElement createElement() {
return new XMLElement(object, cos);
}
public class XMLElement extends CloneableEditor
implements MultiViewElement, Serializable{
private static final long serialVersionUID = 0L;
private transient MultiViewElementCallback _multiViewObserver;
jbossddDataObject object;
CloseOperationState cos;
/** Creates a new instance of MetaViewXMLElement */
public XMLElement(jbossddDataObject object, CloseOperationState cos) {
super((jbossddEditorSupport)object.getCookie(jbossddEditorSupport.class));
this.cos = cos;
this.object = object;
}
public JComponent getVisualRepresentation() {
return this;
}
public JComponent getToolbarRepresentation() {
return new javax.swing.JToolBar();
}
public void setMultiViewCallback(MultiViewElementCallback multiViewElementCallback) {
_multiViewObserver = multiViewElementCallback;
}
public CloseOperationState canCloseElement() {
if (this.object.isModified()) {
return this.cos;
} else {
return CloseOperationState.STATE_OK;
}
}
public void componentDeactivated() {
super.componentDeactivated();
}
public void componentActivated() {
super.componentActivated();
}
public void componentHidden() {
super.componentHidden();
}
public void componentShowing() {
super.componentShowing();
}
public void componentOpened() {
super.componentOpened();
}
public void componentClosed() {
super.componentClosed();
}
}
}</pre>
</ol>
<h3 class="tutorial"><a name="enabling-multiview-editor"></a>Enabling the Multiview Editor</h3>
<ol><li>a
</ol>
</div>
<br />
<h2><a name="registering-module"></a>Registering the Module</h2>
<p>The <tt>layer.xml</tt> file registers everything that you want to make available to the NetBeans system.
However, in this tutorial you do not need to register anything manually yourself
because the New File wizard and the New Window Component wizard did that for you automatically. For example, when you
created the new file type, the New File wizard added XML tags to the <tt>layer.xml</tt> file to register the
new file type's dummy template in the New File wizard.
<br />
<!-- ======================================================================================= -->
<h2><a name="building-and-installing-module"></a>Building and Installing the Module</h2>
<p>The IDE uses an Ant build script to build and install your module. The build script is created for you
when you create the module project.</p>
<div class="indent">
<h3 class="tutorial"><a name="install-plugin"></a>Installing and Using the Module</h3>
<ol>
<li>In the Projects window, right-click the <tt>jbossVisualEditor</tt> project node and choose Install/Reload
in Target Platform.
<p>The module is built and installed in the target platform. The target platform opens so that you
can try out your new module. The default target platform is the
installation used by the current instance of the development IDE.
<p><li>Verify that the module is correctly installed by using it as
shown in <a href="#installing-sample">Installing the Sample</a>.
</ol>
<h3 class="tutorial"><a name="creating-shareable-module-binary"></a>Creating a Shareable Module Binary</h3>
<ol>
<li>In the Projects window, right-click the <tt>jbossVisualEditor</tt> project and choose Create NBM.
<p>The NBM file is created and you can view it in the Files window (Ctrl-2):
<p align="left"><img src="../images/tutorials/multiview/create-nbm.png" alt="Shareable NBM.">
<li>Make the module available to others via, for example, e-mail.
<p><li>The recipient can install the module by using the Update Center. Choose Tools &gt; Update Center
from the main menu.
</ol>
</div>
<br />
<!-- ======================================================================================== -->
<h2><a name="nextsteps"></a>Next Steps</h2>
<p>For more information about creating and developing NetBeans modules, see the following resources:
<ul>
<p><li><a href="https://platform.netbeans.org/index.html">Module Developer's Resources</a></li>
<p><li><a href="https://netbeans.org/download/dev/javadoc/">NetBeans API List (Current Development Version)</a></li>
<p><li><a href="http://apisupport.netbeans.org/new-apisupport.html">New API Support-Proposal</a></li></ul>
</p>
<hr>
<!-- ======================================================================================== -->
<h2><a name="version"></a>Versioning </h2>
<p>
<table width="76%" border="1">
<tbody>
<tr>
<td>
<div align="left"><b>Version</b></div>
</td>
<td>
<div align="left"><b>Date</b></div>
</td>
<td>
<div align="left"><b>Changes</b></div>
</td>
<td>
<div align="left"><b>Open Issues</b></div>
</td>
</tr>
<tr>
<td>
1
</td>
<td>
14 December 2005
</td>
<td>
Initial version
</td>
<td><ul><li>Maybe find out and use the <i>real</i> namespace instead of my made up one.
<li>Find out why the DOCTYPE resolver didn't work.
<li>Maybe redesign the Design view using correct Matisse approach and official u.i. specs.
<li>Find out why the menu-item doesn't produce the Design view with all the values filled in.
<li>More info needed on the <tt>addSupport()</tt> method.
<li>Many more code explanations needed.
<ul>
</ul>
</td>
</tr>
</tbody>
</table>
</body>
</html>