blob: 3bece48cca4f5c5471ef89c7d5b413cd781bd4e1 [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<!-- -*- xhtml -*- -->
<title>NetBeans Plugin Quick Start for NetBeans Platform 6.8</title>
<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 http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="description"
content="A guide describing how to implement a Google Toolbar Module into NetBeans IDE.">
<link rel="stylesheet" type="text/css" href="https://netbeans.org/netbeans.css">
</head>
<!-- Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. -->
<!-- Use is subject to license terms.-->
<body>
<h1><a name="top"></a>NetBeans Plugin Quick Start</h1>
<p>Welcome to NetBeans plugin development!
<p>This tutorial provides a very simple and quick introduction to
the NetBeans plugin development workflow by walking you through the creation
of a new toolbar for NetBeans IDE. Once you are done with this tutorial, you
will have a general knowledge of how to create, build, and install
plugins for NetBeans IDE.
<p>After you finish this tutorial, you can move on to the
<a href="https://netbeans.org/kb/trails/platform.html">NetBeans Platform learning trail</a>.
The learning trail provides comprehensive tutorials
that highlight a wide range of NetBeans APIs for a variety of application types.
If you do not want to do a "Hello World" application, you can skip this
tutorial and jump straight to the learning trail.
<p><strong class="notes">Note: </strong>This is not the latest version of this
document. <a href="../nbm-google.html">Click here</a> to
see the most up to date version.
<p><b>Contents</b></p>
<p><img src="../images/articles/69/netbeans-stamp8-9.png" class="stamp" width="114" height="114" alt="Content on this page applies to NetBeans IDE 6.5, 6.7, 6.8" title="Content on this page applies to NetBeans IDE 6.5, 6.7, 6.8"/></p>
<ul class="toc">
<li><a href="#creating-module-project">Setting Up the Module Project</a></li>
<li><a href="#coding-module">Coding the Module</a>
<ul>
<li><a href="#creating-action">Creating the Action</a></li>
<li><a href="#creating-panel">Creating the JPanel Form</a></li>
<li><a href="#resolving-errors">Resolving Errors</a></li>
<li><a href="#overriding">Implementing Presenter.Toolbar</a></li>
</ul>
</li>
<li><a href="#compiling">Compiling, Installing and Using the Module</a>
<li><a href="#sharing-plugin">Sharing the Module</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.8 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 or<br/>version 5</td>
</tr>
</tbody>
</table>
<p class="tips">Optionally, for troubleshooting purposes, you can <a href="http://plugins.netbeans.org/PluginPortal/faces/PluginDetailPage.jsp?pluginid=13794">download the
completed sample</a> and inspect the sources.
<p>The toolbar you create in this tutorial will
look as follows:</p>
<img src="../images/tutorials/google/60/googlebar-2.png" border="1"
alt="Google toolbar displaying sample search string">
<p><p>When the user presses Enter in the toolbar above, the IDE's default
browser will open and the text in the toolbar will be sent to a Google search,
with the results available in the open browser. To create this toolbar, you
will use the <a href="http://bits.netbeans.org/dev/javadoc/">NetBeans APIs</a> to enhance
the IDE's feature set. Specifically, you will create an action that is invoked by
a button in the toolbar. You will then create a Swing JPanel containing a <tt>JLabel</tt>
and <tt>JTextField</tt> as GUI components.
Finally, you will implement <a href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/actions/Presenter.Toolbar.html"><tt>Presenter.Toolbar</tt></a> to
return the JPanel so that it displays in the toolbar, instead of the button.
<!-- ===================================================================================== -->
<br>
<h2 class="tutorial"><a name="creating-module-project"></a>Setting up the Module Project</h2>
<p>When developing the module, you have to make sure the structure of your project is set up correctly.
NetBeans IDE provides a Module Project wizard that sets up all of the basic files required for a module.</p>
<ol>
<li>Choose File &gt; New Project (Ctrl+Shift+N). Under Categories, select NetBeans Modules.
Under Projects, select Module. Click Next.</li>
<li>In the Name and Location panel, type <tt>GoogleToolbar</tt> in the Project Name field.
Change the Project Location to any directory on your computer. Leave the Standalone Module option
and Set as Main Project checkbox selected. Click Next.</li>
<li>In the Basic Module Configuration panel, type <tt>org.myorg.googletoolbar</tt>
in Code Name Base.
<li>Select "Generate XML Layer". Leave the
locations of both the localizing bundle and the XML layer file
so that they will be stored in a package with
the name <tt>org/myorg/googletoolbar</tt>. Click Finish.</li>
</ol>
<p>The IDE creates the <tt>GoogleToolbar</tt> project. The project contains all of your sources and project
metadata, such as the project's Ant build script. The project opens in the IDE. You can view its logical
structure in the Projects window (Ctrl+1) and its file structure in the Files window (Ctrl+2).
<p>If you expand the Important Files node, you can open the Module Manifest, which has
this content:
<pre class="examplecode">Manifest-Version: 1.0
OpenIDE-Module: org.myorg.googletoolbar
OpenIDE-Module-Layer: org/myorg/googletoolbar/layer.xml
OpenIDE-Module-Localizing-Bundle: org/myorg/googletoolbar/Bundle.properties
OpenIDE-Module-Specification-Version: 1.0</pre>
<p>For details on these NetBeans-specific manifest keys, read the <a href="http://bits.netbeans.org/dev/javadoc/org-openide-modules/org/openide/modules/doc-files/api.html">NetBeans Modules API</a> Javadoc description.
<br>
<!-- ===================================================================================== -->
<br>
<h2><a name="coding-module"></a>Coding the Module</h2>
<p>In order to code the module, you need to complete the following steps:</p>
<ul>
<li><a href="#creating-action">Creating the Action</a></li>
<li><a href="#creating-panel">Creating the JPanel</a></li>
<li><a href="#resolving-errors">Resolving Errors</a></li>
<li><a href="#overriding">Overriding getToolbarPresenter()</a></li>
</ul>
<div class="indent">
<h3 class="tutorial"><a name="creating-action"></a>Creating the Action</h3>
<ol>
<li>Right-click the project node and choose New &gt; Action (if Action is not displayed, access it by
choosing Other, then in the New File wizard under Categories, select Module Development).
Click Next.</li>
<li>In the Action Type panel keep the default setting, which will let the IDE create an action that
subclasses <tt>ActionListener</tt>, as shown below:
<br><br>
<img src="../images/tutorials/google/65/action-wiz-1.png" alt="Step 1 of New Action wizard">
<br><br>
Click Next.
<li>In the GUI Registration panel, select File from the Category drop-down list. The Category drop-down
list controls where an action is shown in the Keyboard Shortcuts editor in the IDE. Next, deselect
Global Menu Item and select Global Toolbar Button. In the Toolbar drop-down list, select File, then
in the Position drop-down list, select <i>any position in the drop-down list</i>, such as
the one shown below:
<br><br>
<img src="../images/tutorials/google/65/action-wiz-2.png" />
<br><br>
Click Next.
<li><p>In the Name and Location panel, type <tt>GoogleAction</tt> as the Class Name and <tt>Google
Action</tt> as the Display Name. Browse to an icon that has a dimension of 16x16 pixels. In fact,
you will not use the icon&#8212;instead, you will display the JPanel Form that you create in the next
section. However, the New Action wizard requires you to specify an icon. Therefore, the icon could
be of any dimension, since you will not be using it. Click Finish.</p>
<p><b class="notes">Note:</b> <tt>GoogleAction.java</tt>
is added to the <tt>org.myorg.googletoolbar</tt> package in the Projects window.
</li>
</ol>
<h3 class="tutorial"><a name="creating-panel"></a>Creating the JPanel</h3>
<p>In this section, you will create a JPanel which will be the toolbar that
you will display as part of the application's main toolbar.
<ol>
<li>Right-click the project node and choose New &gt; Other. Under Categories, select Swing GUI Forms.
Under Projects, select JPanel Form. Click Next.</li>
<li>In the Name and Location panel, type <tt>GooglePanel</tt> as the Class Name and select the package
from the drop-down list. Click Finish. <tt>GooglePanel.java</tt> is added to the package and is
opened in the Design view in the Source Editor.</li>
<li>Place the cursor at the bottom right-hand corner of the JPanel, then select the JPanel and drag the
cursor to resize it, so that its width and length resemble that of a toolbar, as shown below:
<br><br>
<img src="../images/tutorials/google/60/jpanel-2.png" border="1" alt="resized JPanel"></li>
<li>Drag a JTextField item and a JLabel item from the Palette (Ctrl+Shift+8) directly into the JPanel,
then resize the JPanel and the other two items so that they fit snugly together. Finally, click the
JLabel and change its text to <tt>Google:</tt>, then delete the default text in the JTextField.
Your JPanel should now resemble the image shown below:
<br><br>
<img src="../images/tutorials/google/60/jpanel-3.png" border="1"
alt="JTextField and JLabel included in JPanel"></li>
<li>Make sure the Property Inspector is open (Window &gt; Navigating &gt; Inspector), then right-click
the JTextField and choose Events &gt; Key &gt; keyTyped. This generates a <tt>jTextField1KeyTyped()</tt>
method in the <tt>GooglePanel.java</tt> source code, which displays in the Source Editor, as shown below:
<br><br>
<img src="../images/tutorials/google/60/jpanel-4.png" border="1"
alt="JTextField1KeyTyped() method generated in source code"></li>
<li>In the Source Editor, in the Source view of <tt>GooglePanel.java</tt>, fill out the
<tt>jTextField1KeyTyped()</tt> method as follows (inserted text shown in <strong>bold</strong>):
<pre class="examplecode">
private void jTextField1KeyTyped(java.awt.event.KeyEvent evt) {
<strong>int i = evt.getKeyChar();
if (i == KeyEvent.VK_ENTER){//The ENTER KEY
// we display the google url.
try{
URLDisplayer.getDefault().showURL
(new URL(&quot;http://www.google.com/search?hl=en&amp;q=&quot;+jTextField1.getText()+&quot;&amp;btnG=Google+Search&quot;));
} catch (Exception eee){
return;//nothing much to do
}
}</strong>
}</pre>
</li>
</ol>
<p>If you need to, right-click in the Source Editor and choose Format (Alt+Shift+F).</p>
<h3 class="tutorial"><a name="resolving-errors"></a>Resolving Errors</h3>
<p>Notice that one line of code is underlined in red, indicating errors. This is because
required packages have not been imported yet. Place your cursor over the light bulb icon
displayed in the column to the immediate left of the red line for <tt>URLDisplayer</tt>. A
tooltip displays, indicating the reason for the error:
<br><br>
<img src="../images/tutorials/google/60/tooltip.png" border="1"
alt="tooltip for URLDisplayer error in Source Editor"></p>
<p>In order to solve this, you need to make the <tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/openide/awt/HtmlBrowser.URLDisplayer.html">HtmlBrowser.URLDisplayer</a></tt> class, included in the
<a href="http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/openide/awt/package-summary.html">
<tt>org.openide.awt</tt></a> package, accessible to your project. To do so, perform the following steps:</p>
<ol>
<li>Right-click the project node in the Projects window and choose Properties. In the Project Properties
dialog that displays, select Libraries under the Categories heading. Then, under Module Dependencies,
click the Add button. The Add Module Dependency Dialog displays.</li>
<li>In the filter text box displayed at the top of the Add Module Dependency Dialog, start typing
<tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/openide/awt/HtmlBrowser.URLDisplayer.html">URLDisplayer</a></tt> and notice that the selection of returned modules narrows until the only
remaining listing is the <a href="http://bits.netbeans.org/dev/javadoc/org-openide-awt/overview-summary.html">UI
Utilities API</a>:
<br><br>
<img src="../images/tutorials/google/60/add-module-dependency.png"
alt="Add Module Dependency dialog displaying the UI Utilities API">
<br><br>
Click OK, then click OK again to exit the Project Properties dialog.</li>
<li>Right-click in the Source Editor and choose Fix Imports (Alt+Shift+F). The Fix All Imports dialog
displays, listing suggested paths for unrecognized classes:
<br><br>
<img src="../images/tutorials/google/60/fix-all-imports.png"
alt="Fix All Imports dialog containing suggested paths for unrecognized classes">
<br><br>
Click OK. The IDE creates the following import statements for <tt>GooglePanel.java</tt>:
<pre>
import java.net.URL;
import <a href="http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/openide/awt/HtmlBrowser.URLDisplayer.html">org.openide.awt.HtmlBrowser.URLDisplayer</a>;
</pre>
Also notice that all errors disappear from the Source Editor.</li>
</ol>
<h3 class="tutorial"><a name="overriding"></a>Implementing Presenter.Toolbar</h3>
<p>Because the JPanel you just created is the actual component that will display the Google toolbar, you need
to implement <tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/actions/Presenter.Toolbar.html">Presenter.Toolbar</a></tt> to display it
in the toolbar. In <tt>GoogleAction.java</tt>, do the
following:</p>
<ol>
<li>Open <tt>GoogleAction.java</tt> and notice that it has this content:
<pre class="examplecode">
package org.myorg.googletoolbar;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public final class GoogleAction implements ActionListener {
public void actionPerformed(ActionEvent e) {
// TODO implement action body
}
}</pre>
<li>Change the signature so that <tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/actions/Presenter.Toolbar.html">Presenter.Toolbar</a></tt> is implemented too,
because you want the action to be presented in the toolbar.
<pre class="examplecode">
package org.myorg.googletoolbar;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public final class GoogleAction implements Presenter.Toolbar, ActionListener {
Component comp = new GooglePanel();
@Override
public void actionPerformed(ActionEvent e) {
// TODO implement action body
}
@Override
public Component getToolbarPresenter() {
return comp;
}
}</pre>
<li>Open the <tt>layer.xml</tt> file and you should see the following:
<pre class="examplecode">
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.2//EN" "https://netbeans.org/dtds/filesystem-1_2.dtd"&gt;
&lt;filesystem&gt;
&lt;folder name="Actions"&gt;
&lt;folder name="File"&gt;
&lt;file name="org-myorg-googletoolbar-GoogleAction.instance"&gt;
&lt;attr name="SystemFileSystem.localizingBundle" stringvalue="org.myorg.googletoolbar.Bundle"/&gt;
&lt;attr name="delegate" newvalue="org.myorg.googletoolbar.GoogleAction"/&gt;
&lt;attr name="displayName" bundlevalue="org.myorg.googletoolbar.Bundle#CTL_GoogleAction"/&gt;
&lt;attr name="iconBase" stringvalue="org/myorg/googletoolbar/icon.png"/&gt;
&lt;attr name="instanceCreate" methodvalue="org.openide.awt.Actions.alwaysEnabled"/&gt;
&lt;attr name="noIconInMenu" stringvalue="false"/&gt;
&lt;/file&gt;
&lt;/folder&gt;
&lt;/folder&gt;
&lt;folder name="Toolbars"&gt;
&lt;folder name="File"&gt;
&lt;file name="org-myorg-googletoolbar-GoogleAction.shadow"&gt;
&lt;attr name="originalFile" stringvalue="Actions/File/org-myorg-googletoolbar-GoogleAction.instance"/&gt;
&lt;attr name="position" intvalue="0"/&gt;
&lt;/file&gt;
&lt;/folder&gt;
&lt;/folder&gt;
&lt;/filesystem&gt;</pre>
<p><li>The content shown above was created by the New Action wizard.
Delete the "instanceCreate" attribute because you do not
want to create an instance of an Action class, in this case. After
all, here you want a JPanel to appear there instead.
</ol>
<p>In this section, you have created a JPanel that will display a JTextField
and a JLabel. When Enter is pressed in the JTextField, its content
will be sent to a Google search. The HTML browser will open and you
will see the result of the Google search. The action class is used
to integrate the JPanel within the application's toolbar, as registered
in the <tt>layer.xml</tt> file.
</div>
<!-- ======================================================================================= -->
<br>
<h2><a name="compiling"></a>Compiling, Installing and Using the Module</h2>
<p>NetBeans IDE uses an Ant build script to compile and install your module in the IDE. The build script was
created for you when you created the module project in <a href="#creating-module-project">Setting Up the
Module Project</a> above. Now that the module is ready to be compiled and added to the IDE, you can use
NetBeans IDE's support for Ant to do so:</p>
<ol>
<li>In the Projects window, right-click the <tt>GoogleToolbar</tt> project node and choose Run.
The module is built and installed in a new instance of the IDE (i.e., the target
platform). By default, the default target platform is the version of the IDE you are currently working
in. The target platform opens so that you can try out the new module.</li>
<li>When it is successfully installed, the module adds a new button in the IDE's Edit toolbar.
<p><p><b class="notes">Note:</b> The toolbar button does not display an icon. Instead, it displays the JPanel you created in
<a href="#creating-panel">Creating the JPanel</a> above:
<br><br>
<img src="../images/tutorials/google/60/googlebar.png" border="1"
alt="Google toolbar embedded in IDE's Edit toolbar"></li>
<li>Type a search string in the text field:
<br><br>
<img src="../images/tutorials/google/60/googlebar-2.png" border="1"
alt="Google toolbar displaying sample search string"></li>
<li>Press Enter. The IDE's default browser starts up, if you have set one
in the Options window. The Google URL and your search string are sent to the
browser and a search is performed. When the search results are returned, you can view them in the browser.</li>
</ol>
<br>
<h2 class="tutorial"><a name="sharing-plugin"></a>Sharing the Module</h2>
<p>Now that you have built a working module that enhances the IDE, why not share it with other developers?
NetBeans IDE offers an easy way to create a binary NetBeans Module file (.nbm) which is a universal means
of allowing others to experiment with it in their own versions of the IDE (in fact, this is what you did in
<a href="#compiling">Compiling, Installing and Using the Module</a> above).
<p>To create a module binary, do the following:</p>
In the Projects window, right-click the <tt>GoogleToolbar</tt> project node and choose Create NBM. The
new NBM file is created and you can view it in the Files window (Ctrl+2):
<br><br>
<img src="../images/tutorials/google/60/create-nbm.png" border="1" alt="new NBM file displayed in the Files window">
<br>
<div class="feedback-box"><a name="feedback"></a>
<a href="https://netbeans.org/about/contact_form.html?to=3&amp;subject=Feedback:%20Google%20Toolbar%20Module%20Tutorial">
Send Us Your Feedback</a></div>
<br style="clear:both;" />
<!-- ======================================================================================== -->
<h2><a name="nextsteps"></a>See Also</h2>
<p>This concludes the NetBeans Plugin Quick Start. This document has described
how to create a plugin that adds a Google Search toolbar to the IDE.
For more information about creating and developing plugins, see the following resources:
<ul>
<li><a href="https://netbeans.org/kb/trails/platform.html">NetBeans Platform Learning Trail</a></li>
<li><a href="http://bits.netbeans.org/dev/javadoc/">NetBeans API Javadoc</a></li>
<li>NetBeans API classes used in this tutorial:
<ul>
<li><tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/openide/awt/HtmlBrowser.URLDisplayer.html">HtmlBrowser.URLDisplayer</a></tt>
<li><tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/actions/Presenter.Toolbar.html">Presenter.Toolbar</a></tt>
</ul>
</li>
</ul>
<hr>
<!-- ======================================================================================== -->
</body>
</html>