<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <!-- -*- xhtml -*- -->
        <title>NetBeans IDE 7.2 Plugin Quick Start</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 in NetBeans IDE 7.2.">
        <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 IDE 7.2 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 any NetBeans Platform application. Once you are done with this tutorial, you 
            will have a general understanding of how to create, build, and install 
            plugins for the NetBeans Platform.

        <p class="tips">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 need to do a "Hello World" tutorial, you can skip the instructions 
            that follow and jump straight to the learning trail. 

        <p><b class="notes">Note:</b> This document uses NetBeans IDE 7.2 and NetBeans Platform 7.2. If you
            are using an earlier version, see <a href="71/nbm-google.html">the previous version
                of this document</a>.</p>

        <p><b>Contents</b></p>

        <p><img src="../../images/articles/72/netbeans-stamp.gif" class="stamp" width="114" height="114" alt="Content on this page applies to NetBeans IDE 7.2" title="Content on this page applies to NetBeans IDE 7.2"/></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 Toolbar</a></li>
                </ul>
            </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 7.2 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 above</td>
                </tr>
            </tbody>
        </table>

        <p>The toolbar you create in this tutorial will
            look as follows:</p>

        <img src="../../images/tutorials/google/70/google-result.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 opens and the text in the toolbar is sent to a Google search,
            with the results available in the open browser.</p>

        <p>To create this toolbar, you
            will use the <a href="http://bits.netbeans.org/dev/javadoc/">NetBeans APIs</a> to enhance 
            the NetBeans Platform's feature set. Specifically, you will create and register an action invoked by
            a button created by the NetBeans Platform in the toolbar. You will then create
            a <tt>JPanel</tt> 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 <tt>JPanel</tt> so that it displays in the toolbar, instead of the button.

        <p class="tips"> Do some background reading before diving into
            this tutorial. In particular, read the <a href="http://bits.netbeans.org/dev/javadoc/org-openide-modules/org/openide/modules/doc-files/api.html">Modules API Reference</a> document,
            which explains what modules are and provides some
            context for this tutorial. Also note that there is an extensive Reference Material section
            on the <a href="https://netbeans.org/kb/trails/platform.html">NetBeans Platform Learning Trail</a>.</p>


        <!-- ===================================================================================== -->  

        <br>
        <h2 class="tutorial"><a name="creating-module-project"></a>Setting up the Module Project</h2>

        <p>We begin by creating the source structure common to all NetBeans Platform modules. Read the <a href="http://bits.netbeans.org/dev/javadoc/org-openide-modules/org/openide/modules/doc-files/api.html">Modules API Reference</a> for details.</p>

        <div class="indent">

            <ol>
                <li>Choose File &gt; New Project (Ctrl+Shift+N). Under Categories, select NetBeans Modules. 
                    Under Projects, select Module: 
                    <br><br>
                    <img src="../../images/tutorials/google/72/new-project-0.png" alt="Step 0 of New Project wizard">

                    <br><br>

                    Click Next.</li>
                <li>In the Name and Location panel:<br><br>
                    <ul><li>In the Project Name field, type <tt>GoogleToolbar</tt>.</li>
                        <li>In the Project Location field, change the value to any directory on your computer where
                            the module will be stored.</li></ul>
                    <p>If you see the below, click Next.
                        <br><br>
                        <img src="../../images/tutorials/google/72/new-project-1.png" alt="Step 1 of New Project wizard">

                        <br><br>

                </li>
                <li>In the Basic Module Configuration panel:<br><br>
                    <ul><li>Type <tt>org.myorg.googletoolbar</tt>
                            in "Code Name Base", which defines the unique string identifying the
                            module you are creating. The code name base is also used as the main
                            package of the module, i.e., your main package will be "org.myorg.googletoolbar".
                        <li>Do not select the "Generate OSGi Bundle" checkbox, since we
                            will be using the default NetBeans module system, rather than OSGi.</ul>
                    <br>
                    <img src="../../images/tutorials/google/72/new-project-2.png" alt="Step 2 of New Project wizard">

                    <br><br>
                    If you see the above, click Finish.</li>
            </ol>

        </div>

        <p>The IDE creates the <tt>GoogleToolbar</tt> project:
            <br><br>
            <img src="../../images/tutorials/google/72/new-project-3.png" alt="Step 3 of New Project wizard">

            <br><br></p>

        <p>A project is
            a NetBeans IDE compilation/deployment unit. It contains a "build.xml"
            file, which is an Ant script for compiling and running the project.
            The project contains all of your sources.</p>

        <p>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>

        <p>If you expand the Important Files node, you can open the manifest, which has
            this content:</p>

        <pre class="examplecode">Manifest-Version: 1.0
OpenIDE-Module: org.myorg.googletoolbar
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.
        </p>

        <!-- ===================================================================================== -->

        <br>
        <h2><a name="coding-module"></a>Coding the Module</h2>

        <p>In order to create a Google toolbar, you need to complete the following steps:</p>

        <ul>
            <li><a href="#creating-action">Create the Action</a></li>
            <li><a href="#creating-panel">Create the Toolbar</a></li>
        </ul>

        <div class="indent">
            <h3 class="tutorial"><a name="creating-action"></a>Creating the Action</h3>
            <p>In this section, you use the New Action wizard in NetBeans IDE to create a new Action.
                An Action is a piece of code invoked by the user to do something
                in the application. An Action can be invoked from a menu item, toolbar button,
                and keyboard shortcut in the application.</p>

            <p class="notes"><b>Note:</b> As you will see,
                the New Action wizard creates a Java class with annotations. At compile-time,
                the annotations are converted into XML elements in a file contributed
                to the virtual filesystem of the application, which is how an Action is
                registered in the application. For many questions and answers
                relating to the creation and registration of Actions in the NetBeans Platform, see <a href="http://wiki.netbeans.org/NetBeansDeveloperFAQ#Actions:_How_to_add_things_to_Files.2C_Folders.2C_Menus.2C_Toolbars_and_more">Actions: How to add things to Files, Folders, Menus, Toolbars and more</a>
                in the <a href="http://wiki.netbeans.org/NetBeansDeveloperFAQ">NetBeans Platform Wiki</a>.

            <div class="indent">

                <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: 
                        <br><br>
                        <img src="../../images/tutorials/google/72/new-action-1.png" alt="Step 1 of New Action wizard">
                        <br><br>
                        Click Next.</li>
                    <li>In the Action Type panel:
                        <br><br>

                        <ul><li>Keep the default setting, which will let the IDE create an action that 
                                subclasses <tt>ActionListener</tt>, as shown below.</li></ul>

                        <br>
                        <img src="../../images/tutorials/google/72/new-action-2.png" alt="Step 1 of New Action wizard">

                        <br><br>
                        Click Next.

                    <li>In the GUI Registration panel:
                        <br><br>
                        <ul>
                            <li>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.</li> 
                            <li>Deselect 
                                Global Menu Item because we will not need a menu item.</li>
                            <li>Select Global Toolbar Button. In the Toolbar drop-down list, select File, then 
                                in the Position drop-down list, select the toolbar button's position within the toolbar, such as
                                the one shown below.</li></ul>

                        <br>
                        <img src="../../images/tutorials/google/72/new-action-3.png" alt="Step 1 of New Action wizard">

                        <br><br>       
                        Click Next.

                    <li><p>In the Name, Icon, and Location panel:
                            <br><br>
                        <ul><li>In the Class Name field, type <tt>GoogleActionListener</tt></li>
                            <li>In the Display Name field, type <tt>Google</tt></li>
                            <li>In the Icon field, browse to an icon that has a dimension of 16x16 pixels.
                                <br><br>
                                <p class="tips">If needed, here are two icons you can use:</p>
                                <ul><li>16x16: <img src="../../images/tutorials/google/70/google.png" alt="16x16"></li>
                                    <li>24x24: <img src="../../images/tutorials/google/70/google24.png" alt="24x24"></li></ul>
                                <p>However, 
                                    note that in the end, you will not use the icon at all once you have created the toolbar&#8212;instead, you will display 
                                    the JPanel that you create in the next 
                                    section. </p>
                            </li></ul>
                        <p>The Name, Icon, and Location panel of the New Action wizard should now look like this:</p>
                        <br>
                        <img src="../../images/tutorials/google/72/new-action-4.png" alt="Step 1 of New Action wizard">
                    </li>
                    <li><p>
                            Click Finish. The module source structure is now as follows:

                            <br><br>
                            <img src="../../images/tutorials/google/72/new-action-5.png" alt="Step 1 of New Action wizard">

                            <br><br>

                        <p><tt>GoogleActionListener.java</tt>, which you should see in the Projects window, has this content:
                        <pre class="examplecode">package org.myorg.googletoolbar;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import org.openide.awt.ActionID;
import org.openide.awt.ActionReference;
import org.openide.awt.ActionRegistration;
import org.openide.util.NbBundle.Messages;

<a href="http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/openide/awt/ActionID.html">@ActionID</a>(
        category = "File",
        id = "org.myorg.googletoolbar.GoogleActionListener")
<a href="http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/openide/awt/ActionRegistration.html">@ActionRegistration</a>(
        iconBase = "org/myorg/googletoolbar/google.png",
        displayName = "#CTL_GoogleActionListener")
<a href="http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/openide/awt/ActionReference.html">@ActionReference</a>(
        path = "Toolbars/File", 
        position = 0)
<a href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/NbBundle.Messages.html">@Messages</a>("CTL_GoogleActionListener=Google")
public final class GoogleActionListener implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO implement action body
    }
    
}</pre>         

                        <p class="notes"><b>Note:</b> When you build the module, which is done automatically in the next step
                            when you run the module, the class annotations
                            that you see above will be converted to XML tags in a file
                            that will be contributed to the virtual filesystem of
                            the application. The XML file will be named "generated-layer.xml" and
                            will be found in the "build\classes\META-INF"
                            folder of your module, which you can see if the Files window (Ctrl-2)
                            is open in the IDE. This file is created at compile-time and contains
                            XML entries generated from the NetBeans annotations that you have defined in
                            your Java classes. Together with the "layer.xml" file that your module can
                            optionally provide, the "generated-layer.xml" file defines the contributions
                            that the module makes to the virtual filesystem. Read about the virtual filesystem <a href="http://wiki.netbeans.org/DevFaqSystemFilesystem">here</a>,
                            in the <a href="http://wiki.netbeans.org/NetBeansDeveloperFAQ">NetBeans Platform Wiki</a>.</p>           
                    </li>

                    <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 (which is currently set to be 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. You should
                        be able to see your button and click it:

                        <br><br>
                        <img src="../../images/tutorials/google/72/new-action-6.png" border="1"
                             alt="Google toolbar displaying sample search string"></li>

                </ol>

            </div>

            <p>In the next section, you change the <tt>JButton</tt> that has been created
                for you in the toolbar by the NetBeans Platform with your own <tt>JComponent</tt>.</p>
            <h3 class="tutorial"><a name="creating-panel"></a>Creating the Toolbar</h3>
            <p>In this section, you create a <tt>JPanel</tt> that will replace
                the <tt>JButton</tt> that the NetBeans Platform created for you
                in the previous section.

            <div class="indent">

                <ol>
                    <li>Right-click the project node and choose New &gt; Other. Under Categories, select Swing GUI Forms. 
                        Under File Types, select JPanel Form: 
                        <br><br>
                        <p><img src="../../images/tutorials/google/72/new-panel-1.png" border="1" alt="resized JPanel"/></p>
                        <br><p>Click Next.</p></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:
                        <br><br>
                        <p><img src="../../images/tutorials/google/72/new-panel-2.png" border="1" alt="resized JPanel"/></p>
                        <br><p>Click Finish. <tt>GooglePanel.java</tt> is added to the package and is 
                            opened in the Design view in the Source Editor.</p></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/72/new-panel-3.png" border="1" alt="resized JPanel"></li>

                    <li>Drag a <tt>JTextField</tt> item and a <tt>JLabel</tt> item from the Palette (Ctrl+Shift+8) directly into the <tt>JPanel</tt>, 
                        then resize the <tt>JPanel</tt> and the other two items so that they fit snugly together. Finally, press F2 on the 
                        <tt>JLabel</tt> and change its text to <tt>Google:</tt>, then delete the default text in the <tt>JTextField</tt>. (If
                        you click F2 over the <tt>JLabel</tt> and the <tt>JTextField</tt>, their display text will become editable.)
                        Your <tt>JPanel</tt> should now resemble the image shown below:

                        <br><br>
                        <img src="../../images/tutorials/google/72/new-panel-4.png" border="1"
                             alt="JTextField and JLabel included in JPanel"></li>

                    <li>Double-click on the JTextField (or right-click on it and choose Events &gt; Action &gt; actionPerformed). This generates a 
                        <tt>jTextField1ActionPerformed()</tt> 
                        method in the <tt>GooglePanel.java</tt> source code, which displays in the Source Editor. 
                        Fill out the 
                        <tt>jTextField1ActionPerformed</tt> method as follows (inserted text shown in <strong>bold</strong>):

                        <pre class="examplecode">private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) {
    <b>
    try {
        String searchText = URLEncoder.encode(jTextField1.getText(), "UTF-8");
        URLDisplayer.getDefault().showURL
           (new URL(&quot;http://www.google.com/search?hl=en&amp;q=&quot;+searchText+&quot;&amp;btnG=Google+Search&quot;));
    } catch (Exception eee){
        return;//nothing much to do
    }
    </b>
}</pre>

                        <p>If you need to, right-click in the Source Editor and choose Format (Alt+Shift+F).</p></li>

                    <li>Right-click in the Source Editor and choose Fix Imports (Ctrl+Shift+I). The Fix All Imports dialog
                        displays, listing suggested paths for unrecognized classes:

                        <br><br>
                        <img src="../../images/tutorials/google/72/new-panel-5.png"
                             alt="Fix All Imports dialog containing suggested paths for unrecognized classes">                

                        <br><br>
                        Click OK. The IDE creates the following import statements at the top of the class:

                        <pre>import java.net.URL;
import java.net.URLEncoder;
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>

                    <li><p>Because the <tt>JPanel</tt> you have created is the component that will be rendered in the 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>
                            in the <tt>ActionListener</tt> you created earlier, in order to display the <tt>JPanel</tt>
                            in the toolbar. Change the signature of Open <tt>GoogleActionListener.java</tt>.  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. 
                            When using <tt>Presenter.Toolbar</tt>, you need to extend <tt>AbstractAction</tt>, instead of
                            implementing <tt>ActionListener</tt>. Also, you can
                            delete the "iconBase" attribute (as well as the icons from the source tree)
                            because you no longer need an icon in this scenario. </p>

                        <br><p>The result
                            of these changes is as follows:</p>

                        <pre class="examplecode">package org.myorg.googletoolbar;

import java.awt.Component;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import org.openide.awt.ActionID;
import org.openide.awt.ActionReference;
import org.openide.awt.ActionRegistration;
import org.openide.util.NbBundle.Messages;
import org.openide.util.actions.Presenter;

@ActionID(
        category = "File",
        id = "org.myorg.googletoolbar.GoogleActionListener")
@ActionRegistration(
        // iconBase = "org/myorg/googletoolbar/google.png",
        displayName = "#CTL_GoogleActionListener")
@ActionReference(
        path = "Toolbars/File", 
        position = 0)
@Messages("CTL_GoogleActionListener=Google")
public final class GoogleActionListener extends AbstractAction implements Presenter.Toolbar {

    @Override
    public void actionPerformed(ActionEvent e) {
        // not needed, JPanel handles actions
    }

    @Override
    public Component getToolbarPresenter() {
        return new GooglePanel();
    }
    
}</pre>    

                    </li>

                    <li>Run the module again. This time, instead of a <tt>JButton</tt>, you
                        should see your <tt>JPanel</tt>. Type a search string in the text field:

                        <br><br>
                        <p><img src="../../images/tutorials/google/72/new-panel-6.png" border="1"
                                alt="Google toolbar displaying sample search string"></p>
                        <br>
                        <p>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.</p></li>

                </ol>

            </div>

        </div>

        <p>In this section, you have created a <tt>JPanel</tt> that displays a <tt>JTextField</tt>
            and a <tt>JLabel</tt>. When you press Enter in the <tt>JTextField</tt>, its content
            is sent to a Google search. The HTML browser opens and you
            see the result of the Google search. The <tt>ActionListener</tt> is used
            to integrate the <tt>JPanel</tt> within the application's toolbar, as registered
            via the annotations in the <tt>ActionListener</tt>.



            <br>
        <div class="feedback-box"><a name="feedback"></a>
            <a href="https://netbeans.org/about/contact_form.html?to=3&amp;subject=Feedback:%20NetBeans%20Plugin%20Quick%20Start%207.2">
                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>

        <!-- ======================================================================================== -->


    </body>
</html>
