blob: a816919f9e09f4e8ce67a9414d2807ad1285d2f5 [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 Editor Component Palette Module Tutorial for NetBeans Platform 6.0</title>
<link rel="stylesheet" type="text/css" href="https://netbeans.org/netbeans.css">
<meta name="AUDIENCE" content="NBUSER">
<meta name="TYPE" content="ARTICLE">
<meta name="EXPIRES" content="N">
<meta name="developer" content="gwielenga@netbeans.org">
<meta name="indexed" content="y">
<meta name="description"
content="A short guide to using the Nodes API.">
<!-- Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved. -->
<!-- Use is subject to license terms.-->
</head>
<body>
<h1>NetBeans Editor Component Palette Module Tutorial</h1>
<p>This tutorial demonstrates how to create a component palette that provides drag-and-drop code snippets
for a new file type. Code snippets serve to speed up coding. The IDE provides a component palette for JSP files,
HTML files, and Form files. In this tutorial, you learn how to create a component palette for a different file type&#8212;one
that is not recognized by the IDE by default.
<p><strong class="notes">Note: </strong>This is not the latest version of this
document. It applies to NetBeans IDE 6.0/6.1 only.
<a href="../nbm-palette-api2.html">Click here</a> to
see the most up to date version.
<p><b>Contents</b></p>
<img src="../../images/articles/60/netbeans-stamp60-61.gif" class="stamp" width="114" height="114" alt="Content on this page applies to NetBeans IDE 6.1" title="Content on this page applies to NetBeans IDE 6.1"> </p>
<ul class="toc">
<li><a href="#intro">Introduction to Component Palettes</a>
<ul>
<li><a href="#installing-sample">Getting to Know the Sample</a></li>
</ul>
</li>
<li><a href="#creatingthemoduleproject">Setting Up the Module Project</a>
<li><a href="#recognizing-filetype">Recognizing the New File Type</a>
<li><a href="#coding-module">Creating the Component Palette and Code Snippets</a>
<ul>
<li><a href="#creating-palettes">Creating the Component Palette</a>
<li><a href="#creating-snippets">Creating the Code Snippets</a>
</ul>
<li><a href="#registering-module">Registering the Module</a>
<ul>
<li><a href="#declaring-resources">Declaring the Resources</a>
<li><a href="#registering-resoucres">Registering the Resources</a>
</ul>
</li>
<li><a href="#reusing">Reusing Code Snippets from Other Palettes</a>
<li><a href="#building">Building and Installing the Module</a>
<ul>
<li><a href="#install-plugin">Installing and Using the Module</a>
<li><a href="#share-plugin">Creating a Shareable Module Binary</a>
</ul>
</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">NetBeans IDE</td>
<td class="tbltd1">version
<a href="http://download.netbeans.org/netbeans/6.1/final/">version 6.1</a> or<br>
version 6.0</td>
</tr>
<tr>
<td class="tbltd1">Java Developer Kit (JDK)</td>
<td class="tbltd1"><a href="http://java.sun.com/javase/downloads/index.jsp">version 6</a> or<br>
version 5</td>
</tr>
</tbody>
</table>
<h2 class="tutorial"><a name="intro"></a>Introduction to Component Palettes</h2>
<p>In this tutorial, you first use the New File Type wizard to create the
classes that enable the IDE to recognize
a new file type. Then, you implement several classes provided by the
<a href="https://netbeans.org/download/dev/javadoc/org-netbeans-spi-palette/overview-summary.html">NetBeans Palette API</a>.
Finally, you register the new component palette in the <tt>layer.xml</tt> file.
<p>The component palette that you create in this tutorial will be used by the JBoss deployment descriptor file (<tt>jboss-web.xml</tt>).
The <tt>jboss-web.xml</tt> file is distinguished from all other XML files by its namespace:
<p><pre class=examplecode>&lt;!DOCTYPE jboss-web
PUBLIC "-//JBoss//DTD Web Application 2.3//EN"
"http://www.jboss.org/j2ee/dtd/jboss-web_3_0.dtd"&gt;</pre>
<p>The component palette that you create in this tutorial will only be visible when a file with the namespace above
is open in the IDE's Source Editor. For these files only, the component palette will include code snippets for three typical elements in
a <tt>jboss-web.xml</tt> file: "Context Root", "Security Domain",
and "Resource Reference". As shown below, the tooltip will display the tags that will be inserted at the cursor in the Source Editor
when the code snippet is dragged-and-dropped:
<p><img border="1" src="../../images/tutorials/componentpalette/completed-module-60.png" alt="Completed module.">
<p>If you do not want to create a new component palette, but only want to add a code snippet to an existing component palette,
see the <a href="nbm-palette-api1.html">NetBeans Code Snippet Module Tutorial</a>.
<div class="indent">
<h3 class="tutorial"><a name="installing-sample"></a>Getting to Know the Sample</h3>
<p>Take the following steps to install the sample:
<ol><li>Unzip the <a href="https://netbeans.org/files/documents/4/651/Jbosswebxml.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>
<p><img src="../../images/tutorials/componentpalette/completed-projects-window-60.png" border="1" alt="Completed projects window.">
<p><li>Right-click the project node and choose Install/Reload in Target Platform. The target
platform opens and the module is installed.
<p><li>Verify that the module is correctly installed by opening the Files window (Ctrl-2) and
double-clicking the <tt>test-jboss-web.xml</tt> file that you find there:</p>
<p><img src="../../images/tutorials/componentpalette/test-jboss-60.png" border="1" alt="Test file.">
<p>The file opens in the Source Editor and the component palette opens, and displays three code snippets, as
in the screenshot shown in the introduction of this tutorial.
If the component palette does not open automatically, press Ctrl-Shift-8 to open it manually.
<p><li>Choose Tools &gt; Palette &gt; JBoss Code Clips from the main menu bar, as shown below:</p>
<p><img src="../../images/tutorials/componentpalette/palette-menu-item-60.png" border="1" alt="New menu item.">
<p>The Palette Manager appears, containing your new code snippets, as shown below:</p>
<p><img src="../../images/tutorials/componentpalette/palette-manager-60.png" border="1" alt="New palette manager.">
</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="creatingthemoduleproject"></a>Setting up the Module Project</h2>
<p>Before you start writing the module, you have to make sure you
that your project is set up correctly. The IDE provides a wizard that sets up all the basic files
needed for a module.</p>
<ol>
<li>Choose File &gt; New Project (Ctrl-Shift-N). Under Categories, select NetBeans Modules. Under projects,
select Module Project and click Next.</li>
<p><li>In the Name and Location panel, type <tt>Jbosswebxml</tt> in Project Name.
Change the
Project Location to any directory on your computer, such as <tt>c:\mymodules</tt>. Leave the Standalone Module radiobutton
and the Set as Main Project checkbox selected.
Click Next.
<p><li>In the Basic Module Configuration panel, replace <tt>yourorghere</tt> in Code Name Base with <tt>org.netbeans.modules</tt>,
so that the whole code name base is <tt>org.netbeans.modules.jbosswebxml</tt>.
Leave the location of the localizing bundle and XML layer, so that they will be stored in a
package with the name <tt>org/netbeans/modules/jbosswebxml</tt>. Click Finish.</ol>
<p> The IDE creates the <tt>Jbosswebxml</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).</ol>
<br />
<!-- ===================================================================================== -->
<h2><a name="recognizing-filetype"></a>Recognizing the New File Type</h2>
<p>In order to treat JBoss deployment descriptor files
differently to all other types of files, we need to create
a NetBeans data object specifically for this
type of file, as well as a loader for loading our
new data object.
<ol>
<li>Right-click the project node and
choose New &gt; Other and then, in the NetBeans Module Development
category, choose File Type. Click Next.</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>public-id="-//JBoss//DTD Web Application 2.3//EN"</tt> in the by XML Root Element edit box.</ul>
<p>The File Recognition panel should now look as follows:</p>
<p align="left"><img border="1" src="../../images/tutorials/componentpalette/filewizard1-60.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.
<li><b>by
<ul><li> 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>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 the XML file's
<tt>doctype</tt> element.
</ul></ul>
<p>Click Next.
<p><li>In the Name and Location panel, type <tt>Jbossdd</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 align="left"><p align="left"><img border="1" src="../../images/tutorials/componentpalette/filewizard2_60.png" alt="Step 2 of New File wizard.">
<p><b>Note:</b> If you do not have a suitable
16x16 pixel image file, you can right-click
on this image, download it, and
access it in the wizard above: <img src="../../images/tutorials/filetype/Datasource.gif" alt="Datasource.gif">
<p><li>Click Finish.</p>
<p>The Projects window should now look as follows:
<p align="left"><img src="../../images/tutorials/componentpalette/projectswindow2_60.png" border="1" alt="Final Projects window."></ol>
<p>Each of the newly generated files is briefly introduced:
<ul>
<p><li><b>JbossddDataLoader.java.</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>JbossddResolver.xml.</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>. Change the rule so that a <tt>&lt;doc-type&gt;</tt> defines it,
as shown below (the line to be changed is highlighted below):
<p><pre class=examplecode>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE MIME-resolver PUBLIC "-//NetBeans//DTD MIME Resolver 1.0//EN"
"https://netbeans.org/dtds/mime-resolver-1_0.dtd"&gt;
&lt;MIME-resolver&gt;
&lt;file&gt;
&lt;ext name="xml"/&gt;
&lt;resolver mime="text/x-jboss+xml"&gt;
&lt;xml-rule&gt;
<b>&lt;doctype public-id="-//JBoss//DTD Web Application 2.3//EN"/&gt;</b>
&lt;/xml-rule&gt;
&lt;/resolver&gt;
&lt;/file&gt;
&lt;/MIME-resolver&gt;</pre>
<p><li><b>JbossddDataObject.java.</b> Wraps a <tt>FileObject</tt>. <tt>DataObjects</tt> are produced by <tt>DataLoaders</tt>.
For more information, see <a href="wiki.netbeans.org/wiki/view/DevFaqDataObject">What is a DataObject?</a>.
<p><li><b>JbossddDataNode.java.</b> Provides what you <i>see</i> in the IDE&#8212;functionality like actions, icons, and localized names.
<p><li><b>JbossddDataLoaderBeanInfo.java.</b> Controls the appearance of the <tt>DataLoader</tt> in the Object Types section
of the Options window.
</ul>
</p>
<br />
<!-- ===================================================================================== -->
<h2><a name="coding-module"></a>Creating the Component Palette and Code Snippets</h2>
<br />
<div class="indent">
<h3 class="tutorial"><a name="specifying"></a>Specifying the Module's Dependencies</h3>
<p>You will need to subclass several classes that belong to <a href="https://netbeans.org/download/dev/javadoc/">NetBeans APIs</a>.
Each has to be declared as a Module dependency. Use the Project Properties dialog box for this purpose.
<ol>
<li>In the Projects window, right-click the <tt>Jbosswebxml</tt> project node and choose Properties.
In the Project Properties dialog box, click Libraries.</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:</p>
<p><img src="../../images/tutorials/componentpalette/projprops_60.png" border="1" alt="All source files.">
<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 the
long list of APIs that you selected have been
declared as module dependencies.</li>
</ol>
<h3 class="tutorial"><a name="creating-palettes"></a>Creating the Component Palette</h3>
<p>Component Palettes are defined
by the <a href="https://netbeans.org/download/dev/javadoc/org-netbeans-spi-palette/overview-summary.html">NetBeans Palette API</a>.
Implementing the NetBeans Palette API for this tutorial means implementing the following NetBeans Palette API classes:
<p><table width="76%" border="1">
<tbody><tr>
<td>
<div align="left"><b>File</b></div>
</td>
<td>
<div align="left"><b>Description</b></div>
</td>
</tr>
<tr>
<td align="left" valign="top"><tt><a href="https://netbeans.org/download/dev/javadoc/org-netbeans-spi-palette/org/netbeans/spi/palette/PaletteFactory.html">PaletteFactory</a></tt></td>
<td>Creates a new instance of the Component Palette. To do so, it invokes
the <tt>createPalette</tt> method which creates a new palette from the <tt>JBOSSPalette</tt> folder, which is defined
in the <tt>layer.xml</tt> file.</td>
</tr>
<tr>
<td align="left" valign="top"><tt><a href="https://netbeans.org/download/dev/javadoc/org-netbeans-spi-palette/org/netbeans/spi/palette/PaletteController.html">PaletteController</a></tt></td>
<td>Provides access to data in the Component Palette.</td>
</tr>
<tr>
<td align="left" valign="top"><tt><a href="https://netbeans.org/download/dev/javadoc/org-netbeans-spi-palette/org/netbeans/spi/palette/PaletteActions.html">PaletteActions</a></tt></td>
<td>(to be done)
</td>
</tr>
</tbody>
</table>
<p>In addition, you will also create the following supporting classes:
<p><table width="76%" border="1">
<tbody><tr>
<td>
<div align="left"><b>File</b></div>
</td>
<td>
<div align="left"><b>Description</b></div>
</td>
</tr>
<tr>
<td align="left" valign="top"><tt>JbossddPaletteUtilities</tt></td>
<td>Handles insertion of the dropped code snippet.</td>
</tr>
<tr>
<td align="left" valign="top"><tt>JbossddPaletteCustomizerAction </tt></td>
<td>Provides the menu item that opens the Palette Manager.
</td>
</tr>
<tr>
<td align="left" valign="top"><tt>JbossddPaletteDropDefault</tt></td>
<td>(to be done)
</td>
</tr>
</tbody>
</table>
<p>To implement the NetBeans Palette API,
take the following steps:
<ol>
<li>Right-click the <tt>org.netbeans.modules.jbosswebxml</tt> project node and
choose New &gt; Java Class. Create the first of the following files, type
<tt>org.netbeans.modules.jbosswebxml.palette</tt> in the package drop-down list,
click Finish, and then repeat the process to create the others:
<p><ul>
<li><tt>JbossddPaletteActions</tt>
<li><tt>JbossddPaletteCustomizerAction</tt>
<li><tt>JbossddPaletteDropDefault</tt>
<li><tt>JbossddPaletteFactory</tt>
<li><tt>JbossddPaletteUtilities</tt></ul>
<p>You should now have the following files (highlighted in the screenshot below):
<p align="left"><img border="1" src="../../images/tutorials/componentpalette/palette1.png" alt="Main palette files.">
<p><li>Replace the default content of the <tt>JbossddPaletteFactory.java</tt> file with the following:
<p><pre class="examplecode">package org.netbeans.modules.jbosswebxml.palette;
import java.io.IOException;
import <a href="https://netbeans.org/download/dev/javadoc/org-netbeans-spi-palette/org/netbeans/spi/palette/PaletteController.html">org.netbeans.spi.palette.PaletteController</a>;
import <a href="https://netbeans.org/download/dev/javadoc/org-netbeans-spi-palette/org/netbeans/spi/palette/PaletteFactory.html">org.netbeans.spi.palette.PaletteFactory</a>;
public class JbossddPaletteFactory {
public static final String JBOSS_PALETTE_FOLDER = "JBOSSPalette";
private static PaletteController palette = null;
public static PaletteController getPalette() throws IOException {
if (palette == null)
palette = PaletteFactory.createPalette(JBOSS_PALETTE_FOLDER, new JbossddPaletteActions());
return palette;
}
}</pre>
<p><li>Replace the default content of the <tt>JbossddPaletteActions.java</tt> file with the following:
<p><pre class="examplecode">package org.netbeans.modules.jbosswebxml.palette;
import java.awt.event.ActionEvent;
import java.io.IOException;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.text.JTextComponent;
import org.netbeans.editor.Utilities;
import org.netbeans.spi.palette.PaletteActions;
import org.netbeans.spi.palette.PaletteController;
import org.openide.DialogDisplayer;
import org.openide.NotifyDescriptor;
import org.openide.text.ActiveEditorDrop;
import org.openide.util.Lookup;
import org.openide.util.NbBundle;
public class JbossddPaletteActions extends <a href="https://netbeans.org/download/dev/javadoc/org-netbeans-spi-palette/org/netbeans/spi/palette/PaletteActions.html">PaletteActions</a> {
/** Creates a new instance of JbossddPaletteActions */
public JbossddPaletteActions() {
}
public Action[] getImportActions() {
return new Action[0]; //TODO implement this
}
public Action[] getCustomCategoryActions(Lookup category) {
return new Action[0]; //TODO implement this
}
public Action[] getCustomItemActions(Lookup item) {
return new Action[0]; //TODO implement this
}
public Action[] getCustomPaletteActions() {
return new Action[0]; //TODO implement this
}
public Action getPreferredAction( Lookup item ) {
return new MFPaletteInsertAction(item);
}
private static class MFPaletteInsertAction extends AbstractAction {
private Lookup item;
MFPaletteInsertAction(Lookup item) {
this.item = item;
}
public void actionPerformed(ActionEvent e) {
ActiveEditorDrop drop = (ActiveEditorDrop) item.lookup(ActiveEditorDrop.class);
JTextComponent target = Utilities.getFocusedComponent();
if (target == null) {
String msg = NbBundle.getMessage(JbossddPaletteActions.class, "MSG_ErrorNoFocusedDocument");
DialogDisplayer.getDefault().notify(new NotifyDescriptor.Message(msg, NotifyDescriptor.ERROR_MESSAGE));
return;
}
try {
drop.handleTransfer(target);
}
finally {
Utilities.requestFocus(target);
}
try {
PaletteController pc = JbossddPaletteFactory.getPalette();
pc.clearSelection();
}
catch (IOException ioe) {
} //should not occur
}
}
}</pre>
<p><li>Replace the default content of the <tt>JbossddPaletteUtilities.java</tt> file with the following:
<p><pre class="examplecode">package org.netbeans.modules.jbosswebxml.palette;
import java.awt.Component;
import java.awt.Container;
import java.util.StringTokenizer;
import javax.swing.JTree;
import javax.swing.text.BadLocationException;
import javax.swing.text.Caret;
import javax.swing.text.Document;
import javax.swing.text.JTextComponent;
import org.netbeans.api.project.FileOwnerQuery;
import org.netbeans.api.project.Project;
import org.netbeans.api.project.ProjectUtils;
import org.netbeans.api.project.SourceGroup;
import org.netbeans.api.project.Sources;
import org.netbeans.editor.BaseDocument;
import org.netbeans.editor.Formatter;
import org.openide.filesystems.FileObject;
public class JbossddPaletteUtilities {
/** Creates a new instance of JbossddPaletteUtilities */
public JbossddPaletteUtilities() {
}
public static void insert(String s, JTextComponent target)
throws BadLocationException {
insert(s, target, true);
}
public static void insert(String s, JTextComponent target, boolean reformat)
throws BadLocationException {
if (s == null)
s = "";
Document doc = target.getDocument();
if (doc == null)
return;
if (doc instanceof BaseDocument)
((BaseDocument)doc).atomicLock();
int start = insert(s, target, doc);
if (reformat && start &gt;= 0 && doc instanceof BaseDocument) { // format the inserted text
int end = start + s.length();
Formatter f = ((BaseDocument)doc).getFormatter();
f.reformat((BaseDocument)doc, start, end);
}
if (doc instanceof BaseDocument)
((BaseDocument)doc).atomicUnlock();
}
private static int insert(String s, JTextComponent target, Document doc)
throws BadLocationException {
int start = -1;
try {
//at first, find selected text range
Caret caret = target.getCaret();
int p0 = Math.min(caret.getDot(), caret.getMark());
int p1 = Math.max(caret.getDot(), caret.getMark());
doc.remove(p0, p1 - p0);
//replace selected text by the inserted one
start = caret.getDot();
doc.insertString(start, s, null);
} catch (BadLocationException ble) {}
return start;
}
}</pre>
<p><li>Replace the default content of the <tt>JbossddPaletteCustomizerAction.java</tt> file with the following:
<p><pre class="examplecode">package org.netbeans.modules.jbosswebxml.palette;
import java.io.IOException;
import org.openide.ErrorManager;
import org.openide.util.HelpCtx;
import org.openide.util.NbBundle;
import <a href="https://netbeans.org/download/dev/javadoc/org-openide-util/org/openide/util/actions/CallableSystemAction.html">org.openide.util.actions.CallableSystemAction</a>;
public class JbossddPaletteCustomizerAction extends <a href="https://netbeans.org/download/dev/javadoc/org-openide-util/org/openide/util/actions/CallableSystemAction.html">CallableSystemAction</a> {
private static String name;
public JbossddPaletteCustomizerAction () {
putValue("noIconInMenu", Boolean.TRUE); // NOI18N
}
protected boolean asynchronous() {
return false;
}
/** Human presentable name of the action. This should be
* presented as an item in a menu.
* @return the name of the action
*/
public String getName() {
if (name == null)
name = NbBundle.getBundle(JbossddPaletteCustomizerAction.class).getString("ACT_OpenJbossddCustomizer"); // NOI18N
return name;
}
/** Help context where to find more about the action.
* @return the help context for this action
*/
public HelpCtx getHelpCtx() {
return null;
}
/** This method is called by one of the "invokers" as a result of
* some user's action that should lead to actual "performing" of the action.
*/
public void performAction() {
try {
JbossddPaletteFactory.getPalette().showCustomizer();
}
catch (IOException ioe) {
ErrorManager.getDefault().notify(ErrorManager.EXCEPTION, ioe);
}
}
}</pre>
<p><li>Replace the default content of the <tt>JbossddPaletteDropDefault.java</tt> file with the following:
<p><pre class="examplecode">package org.netbeans.modules.jbosswebxml.palette;
import javax.swing.text.BadLocationException;
import javax.swing.text.JTextComponent;
import org.openide.text.ActiveEditorDrop;
public class JbossddPaletteDropDefault implements ActiveEditorDrop {
String body;
public JbossddPaletteDropDefault(String body) {
this.body = body;
}
public boolean handleTransfer(JTextComponent targetComponent) {
if (targetComponent == null)
return false;
try {
JbossddPaletteUtilities.insert(body, (JTextComponent)targetComponent);
}
catch (BadLocationException ble) {
return false;
}
return true;
}
}</pre>
<p><li>Right-click the <tt>org.netbeans.modules.jbosswebxml.palette</tt> node, choose New &gt; File/Folder,
and select Properties File from the Other category. Click Next. Name the file Bundle and then click Finish.
Add the following keys to the new <tt>Bundle.properties</tt> file:
<p><pre class="examplecode">MSG_ErrorNoFocusedDocument=No document selected. Please select a document to insert the item into.
ACT_OpenJbossddCustomizer=&JBoss Code Clips</pre>
</ol>
<h3 class="tutorial"><a name="creating-snippets"></a>Creating the Code Snippets</h3>
<p>Each code snippet requires the following files:
<ul>
<li>A Java class that defines the piece of code to be dragged into the Source Editor. This Java class
must refer to <tt>JbossddPaletteUtilities.java</tt>, which defines how the piece of code should be
inserted. For example, indentation and formatting are defined here.
<li>A properties file that defines the labels and tooltips.
<li>A 16x16 pixel image for the 'Small Icon' display.
<li>A 32x32 pixel image for the 'Big Icon' display.</ul>
<p>After you have created or added the above files to the NetBeans module, you declare them in a resource declaration XML file,
which you register in the NetBeans System Filesystem by using the <tt>layer.xml</tt> file.
<p>For details on all of the items above, work through the <a href="nbm-palette-api1.html">NetBeans Code Snippet Module Tutorial</a>.
<p>As an example,
when you create three code snippets called <tt>ContextRoot.java</tt>, <tt>ResourceReference.java</tt>, and
<tt>SecurityDomain.java</tt>, the result might be as follows (the highlighted packages below contain the code snippets and
their supporting resources):
<p align="left"><img src="../../images/tutorials/componentpalette/palette4-60.png" border="1" alt="Main palette files.">
</div>
<br />
<h2><a name="registering-module"></a>Registering the Module</h2>
<p>In this section, we register the menu item
and code snippets in the <tt>layer.xml</tt> file and in the
<tt>Bundle.properties</tt> file.
<ol>
<li>Add the following tags to the <tt>layer.xml</tt> file:
<p><pre class="examplecode">&lt;folder name="Menu"&gt;
&lt;folder name="Tools"&gt;
&lt;folder name="PaletteManager"&gt;
&lt;file name="org-netbeans-modules-jbosswebxml-palette-JbossddPaletteCustomizerAction.instance"/&gt;
&lt;/folder&gt;
&lt;/folder&gt;
&lt;/folder&gt;
&lt;folder name="JBOSSPalette"&gt;
&lt;folder name="JBoss"&gt;
&lt;attr name="SystemFileSystem.localizingBundle"
stringvalue="org.netbeans.modules.jbosswebxml.palette.Bundle"/&gt;
&lt;file name="ContextRoot.xml"
url="nbresloc:/org/netbeans/modules/jbosswebxml/palette/items/resources/ContextRoot.xml"/&gt;
&lt;file name="SecurityDomain.xml"
url="nbresloc:/org/netbeans/modules/jbosswebxml/palette/items/resources/SecurityDomain.xml"/&gt;
&lt;file name="ResourceReference.xml"
url="nbresloc:/org/netbeans/modules/jbosswebxml/palette/items/resources/ResourceReference.xml"/&gt;
&lt;/folder&gt;
&lt;/folder&gt;</pre>
<p><li>Add the following to the <tt>Bundle.properties</tt> file that is in the same package as
the <tt>layer.xml</tt> file:
<p><pre class="examplecode">JBOSSPalette/JBoss=JBoss Deployment Descriptor
JBOSSPalette/JBoss/ContextRoot.xml=Context Root
JBOSSPalette/JBoss/ResourceReference.xml=Resource Reference
JBOSSPalette/JBoss/SecurityDomain.xml=Security Domain</pre>
<p>The key-value pairs listed above localize the items registered in the <tt>layer.xml</tt> file.
</ol>
<h2><a name="reusing"></a>Reusing Code Snippets from Other Palettes</h2>
<p class="tips">Optionally, you can merge your collection of code snippets with the code snippets provided
by other modules. For example, if you want to merge your code snippets so that the <tt>jboss-web.xml</tt> file has
access to the code snippets provided by the JSP module and the HTML module,
take the steps below.
<ol><li>In <tt>org.netbeans.modules.jbosswebxml.palette</tt>, change the value for
the <tt>ACT_OpenJbossddCustomizer</tt> so that it matches the names of the same action
provided by the HTML module and the JSP module:
<pre class="examplecode">ACT_OpenJbossddCustomizer=&amp;HTML/JSP Code Clips</pre>
<li>Hide the other two actions (the action in the
HTML module and the JSP module that displays the JSP/HTML Code Clips
Palette Manager) by adding the two lines in bold below to the <tt>layer.xml</tt> file:
<pre class="examplecode">&lt;folder name="Menu"&gt;
&lt;folder name="Tools"&gt;
&lt;folder name="PaletteManager"&gt;
&lt;file name="org-netbeans-modules-jbosswebxml-palette-JbossddPaletteCustomizerAction.instance"/&gt;
<b>&lt;file name="org-netbeans-modules-html-palette-HTMLPaletteCustomizerAction.instance_hidden"/&gt;
&lt;file name="org-netbeans-modules-web-core-palette-JSPPaletteCustomizerAction.instance_hidden"/&gt;</b>
&lt;/folder&gt;
&lt;/folder&gt;
&lt;/folder&gt;</pre>
<li>Finally, declare the resource declaration XML files of the HTML module and the JSP module as
shadow files:</i>
<pre class="examplecode">&lt;folder name="JBOSSPalette"&gt;
&lt;folder name="JBoss"&gt;
&lt;attr name="SystemFileSystem.localizingBundle"
stringvalue="org.netbeans.modules.jbosswebxml.Bundle"/&gt;
&lt;file name="ContextRoot.xml"
url="ContextRoot.xml"/&gt;
&lt;file name="ResourceReference.xml"
url="ResourceReference.xml"/&gt;
&lt;file name="SecurityDomain.xml"
url="SecurityDomain.xml"/&gt;
&lt;/folder&gt;
<b>&lt;folder name="HTML.shadow"&gt;
&lt;attr name="SystemFileSystem.localizingBundle"
stringvalue="org.netbeans.modules.web.core.palette.Bundle"/&gt;
&lt;attr name="originalFile"
stringvalue="HTMLPalette/HTML"/&gt;
&lt;/folder&gt;
&lt;folder name="HTML_Forms.shadow"&gt;
&lt;attr name="SystemFileSystem.localizingBundle"
stringvalue="org.netbeans.modules.web.core.palette.Bundle"/&gt;
&lt;attr name="originalFile"
stringvalue="HTMLPalette/HTML_Forms"/&gt;
&lt;/folder&gt;
&lt;folder name="JSP.shadow"&gt;
&lt;attr name="SystemFileSystem.localizingBundle"
stringvalue="org.netbeans.modules.web.core.palette.Bundle"/&gt;
&lt;attr name="originalFile"
stringvalue="JSPPalette/JSP"/&gt;
&lt;/folder&gt;
&lt;folder name="Database.shadow"&gt;
&lt;attr name="SystemFileSystem.localizingBundle"
stringvalue="org.netbeans.modules.web.core.palette.Bundle"/&gt;
&lt;attr name="originalFile"
stringvalue="JSPPalette/Database"/&gt;
&lt;/folder&gt;</b>
&lt;/folder&gt;</pre></ul>
</ol>
<p>Now, when you build and install the module, as described in the next section, the Component Palette for
<tt>jboss-web.xml</tt> files will contain <i>all</i> the code snippets provided by the JSP module
as well as <i>all</i> the code snippets provided by the HTML module.
<br />
<!-- ======================================================================================= -->
<h2><a name="building"></a>Building and Installing the Module</h2>
<p>The IDE uses an Ant build script to build and install your module. The build script is created for you
when you create the module project.</p>
<div class="indent">
<h3 class="tutorial"><a name="install-plugin"></a>Installing and Using the Module</h3>
<ol>
<li>In the Projects window, right-click the <tt>Jbosswebxml</tt> project 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="share-plugin"></a>Creating a Shareable Module Binary</h3>
<ol>
<li>In the Projects window, right-click the the project node and choose Create NBM.</p>
<p>The NBM file is created and you can view it in the Files window (Ctrl-2):
<p align="left"><img src="../../images/tutorials/componentpalette/create-nbm-60.png" border="1" 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 Plugin Manager. Choose Tools &gt; Plugins
from the main menu.
</ol>
</div>
<br />
<br>
<div class="feedback-box"><a href="https://netbeans.org/about/contact_form.html?to=3&amp;subject=Feedback:%20Component%20Palette%20Module%20Tutorial">Send Us Your Feedback</a></div>
<br style="clear:both;" />
<!-- ======================================================================================== -->
<h2><a name="nextsteps"></a>Next Steps</h2>
<p>For more information about creating and developing NetBeans modules, see the following resources:
<ul>
<p><li><a href="https://netbeans.org/kb/trails/platform.html">Other Related Tutorials</a></li>
<p><li><a href="https://netbeans.org/download/dev/javadoc/">NetBeans API Javadoc</a></li>
</ul>
<hr>
<!-- ======================================================================================== -->
<h2><a name="version"></a>Versioning </h2>
<p>
<table width="76%" border="1">
<tbody>
<tr>
<td>
<div align="left"><b>Version</b></div>
</td>
<td>
<div align="left"><b>Date</b></div>
</td>
<td>
<div align="left"><b>Changes</b></div>
</td>
<td>
<div align="left"><b>Open Issues</b></div>
</td>
</tr>
<tr>
<td>
1
</td>
<td>
29 November 2005
</td>
<td>
Initial version
</td>
<td>
<ul>
<li>Needs to be reviewed! Use at your own risk!
<li>Need to add explanation for adding own dialog box for predefining values.
<li>Explanatory text for the use of the NetBeans APIs to be added.
<li>Check for copy-paste errors.
<li>Need to add more Javadoc links, for NetBeans API classes in the code.
</ul>
</td>
</tr>
<tr>
<td>
2
</td>
<td>
30 November 2005
</td>
<td>
<li>Changed the ZIP file because of problems (see <a href="https://netbeans.org/bugzilla/show_bug.cgi?id=69571">Issue 69571</a>).
<li>Removed hyphens and changed screenshots.
</td>
<td>
All other issues from above must still be done.
</td>
</tr>
<tr>
<td>
3
</td>
<td>
8 December 2005
</td>
<td>
<li>Fixed reopened issue <a href="https://netbeans.org/bugzilla/show_bug.cgi?id=69571">Issue 69571</a>
<td>
All other issues from above must still be done.
</td>
</tr>
<tr>
<td>
4
</td>
<td>
22 August 2006
</td>
<td>
<li>Minor tweaks.
<td>
All other issues from above must still be done.
<br>Discovered that the editor support file is missing in the tutorial,
but not in the module that you can download from the top of the file.
<br>Discovered that there are several gaps and tbds in this tutorial.
</td>
</tr>
<tr>
<td>
5
</td>
<td>
30 May 2007
</td>
<td>
Began updating this tutorial for 6.0.
</td>
</tr>
</tbody>
</table>
</body>
</html>