<!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 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  alt="" 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>
