<!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 Platform Porting Tutorial for NetBeans Platform 7.1</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 porting a Swing application to the NetBeans PLatform."/>
        <!--      Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. -->
        <!--     Use is subject to license terms.-->
    </head>
    <body>
        <h1>NetBeans Platform Porting Tutorial</h1>

        <p>This tutorial demonstrates how to port a simple Swing application to the <a href="https://platform.netbeans.org/screenshots.html">NetBeans Platform</a>.
            Though the scenario below is simple, the basic concepts of "porting" an application to the NetBeans
            Platform will become clear. In the end, some general principles will be identified, based on the
            steps taken in the tutorial. Hopefully, they will be useful to you when porting your own
            Swing applications to the NetBeans Platform.</p>

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

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

        <p><img src="../../images/articles/71/netbeans-stamp.png" class="stamp" width="114" height="114" alt="Content on this page applies to NetBeans IDE 7.1" title="Content on this page applies to NetBeans IDE 7.1"/></p>
        <ul class="toc">
            <li><a href="#intro">Introduction to Porting</a></li>
            <li><a href="#getting">Getting the Anagram Game</a></li>
            <li><a href="#compliance">Levels of Compliance</a>
                <ul>
                    <li><a href="#creating">Creating the NetBeans Platform Application</a></li>
                    <li><a href="#porting0">Porting Level 0: Launchable</a></li>
                    <li><a href="#porting1">Porting Level 1: Integration</a></li>
                    <li><a href="#porting3">Porting Level 2: Use Case Support</a></li>
                    <li><a href="#porting4">Porting Level 3: Aligned</a></li>
                </ul></li>
            <li><a href="#tips">Porting Tips & Tricks</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">NetBeans IDE</td>
                    <td class="tbltd1">version 7.1 or above</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 or above</a></td>
                </tr>
                <!--                <tr>
                                    <td class="tbltd1"><a href="http://plugins.netbeans.org/PluginPortal/faces/PluginDetailPage.jsp?pluginid=2753">Download the Sample</a></td>
                                    <td class="tbltd1"></td>
                                </tr>-->
            </tbody>
        </table>

        <h2 class="tutorial"><a name="intro"></a>Introduction to Porting</h2>

        <p>Before beginning this procedure, it makes sense to ask why one would want to do so in the
            first place. A typical Swing application consists of a domain-specific layer on top of a
            general framework. The general framework normally provides features dealing with an
            application's infrastructure, such
            as an application's menu bar, windowing system (also known as "docking framework"), and
            lifecycle management. Typically this framework is very generic and is (or could be)
            reused by many applications within the
            same organization.</p> <p>The NetBeans Platform exists specifically to cater to these infrastructural
            concerns. You do not need to create these on your own for your own Swing applications. You
            can simply move the useful domain-specific parts of your application to the
            NetBeans Platform and then,
            from that point onwards, the NetBeans Platform will be the new underlying 'plumbing' layer
            of your application. You can then focus on the more interesting parts of your application,
            specifically, the domain-specific parts. This will speed up your development process and give you
            a consistent basis for all your applications.</p>

        <p>In this tutorial, we will begin with the Anagram Game, which is a standard Swing application
            sample that is distributed with NetBeans IDE. We will, step by step, move it to the NetBeans
            Platform and gradually see the advantages of doing so.</p>

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

        <h2 class="tutorial"><a name="getting"></a>Getting the Anagram Game</h2>

        <p>We begin by getting the Anagram Game, which is one of the IDE's standard Java samples,
            from the New Project wizard. Then we run it and analyze its parts.</p>

        <div class="indent">

            <ol>
                <li><p>Choose File &gt; New Project (Ctrl-Shift-N). Under Categories, select Samples &gt; Java. Under Projects,
                        select Anagram Game. Click Next and Finish.</p>

                    <p>You should now see the Anagram Game application outlined in the Projects window, as shown here:</p>

                    <p><img alt="" style="border: 1px solid black" src="../../images/tutorials/porting/70/ag0.png"/></p>

                    <p>The application contains the following classes:</p>

                    <ul>
                        <li><b><tt>WordLibrary.java</tt></b>. Provides an abstract class, with
                            abstract methods like <code>getWord(int idx)</code>, <code>getScrambledWord(int idx)</code>,
                            and <code>isCorrect(int idx, String userGuess)</code>.</li>
                        <li><b><tt>StaticWordLibrary.java</tt></b>. Extends <code>WordLibrary.java</code>,
                            providing a list of scrambled words, as well
                            as their unscrambled equivalents, together with the getters and setters for accessing them
                            and for evaluating them.</li>
                        <li><b><tt>Anagrams.java</tt></b>. Provides the main user interface of the application,
                            principally consisting of a <code>JFrame</code> with
                            a <tt>JPanel</tt> containing labels and text fields. Also included
                            is a menu bar containing a File menu, with the menu items 'About' and 'Exit'.</li>
                        <li><b><tt>About.java</tt></b>. Provides the About box, accessed from the File menu.</li>
                    </ul></li>

                <li><p>Run the application and you should see the following:</p>

                    <p><img alt="" src="../../images/tutorials/porting/70/ag1.png"/></p></li>

                <li><p>When you specify the correctly unscrambled word, you will see this:</p>

                    <p><img alt="" src="../../images/tutorials/porting/70/ag2.png"/></p></li>

            </ol>

        </div>

        <p>Before porting this application to the NetBeans Platform, we need to think
            about <i>the stages in which we want to port our application</i>. In other
            words, you do not need to port everything at once. And there are different
            levels to which you can integrate your application, from a mostly superfical
            level to a level that aligns your application completely with the paradigms
            and purposes of the NetBeans Platform. The next section will show the levels
            of compliance your application can have with the NetBeans Platform.</p>

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

        <h2 class="tutorial"><a name="compliance"></a>Levels of Compliance</h2>

        <p>Converting an application to be fit for a framework such as the NetBeans Platform can be done
            on various levels. The integration can be shallow and use just a few integration points or
            it can be deeper, tightly following the paradigms of the NetBeans Platform.</p>

        <p>The stages can be described as follows:</p>

        <h4 id="section-LevelsOfCompliance-Level0Launchable">Level 0: Launchable</h4>

        <p>One or more of the following can be done to make your application launchable with as
            few changes as possible:</p>

        <ul>
            <li>Enhance your manifest with NetBeans key/value pairs so that your JAR is recognized as an
                OSGi bundle or as a
                NetBeans module.</li>
            <li>Set dependencies between modules. In the manifest, with instances of plain Class-Path you can set dependencies
                between modules.</li>
            <li>Register a menu item in the declarative
                layer file (<tt>layer.xml</tt>) of your module, to
                invoke your original application. This file can be automatically 
                created and populated when the module is compiled,
                via annotations on Action classes, as you will learn to do later
                in this tutorial.</li>
        </ul>

        <p>In this tutorial, we will do all of the above. We will enhance the manifest, which the module
            project wizard will do for us. We will create a menu item that will
            invoke our application. To do so, we will move our application's classes into a module source
            structure. Then we will create a new Java <code>ActionListener</code> for opening the <code>JFrame</code>
            of the application. We will annotate the <code>ActionListener</code> to register it in
            the application's registry as a new menu item. From that action, we will invoke our application.</p>

        <h4 id="section-LevelsOfCompliance-Level1Integrated">Level 1: Integrated</h4>

        <p>Here are some pointers for integrating the application more
            tightly with the NetBeans Platform:</p>

        <ul>
            <li>Integrate visually to get the benefits of the NetBeans Window System, which is
                its docking framework.</li>
            <li>Use NetBeans Window System API and the Dialog APIs, primarily the <tt>TopComponent</tt> class and the
                <tt>DialogDisplayer</tt> class.</li>
            <li>Change initialization code of your application, use the <tt>ModuleInstall</tt>
                class or declarative registrations, through the layer file or the META-INF/services folder.</li>
        </ul>

        <p>In this tutorial, we will move the relevant parts of the <tt>JPanel</tt>
            from the <tt>JFrame</tt> to a new <tt>TopComponent</tt>. The <tt>TopComponent</tt> class
            creates a window on the NetBeans Platform, which in our case will show our <tt>JPanel</tt>.</p>

        <h4 id="section-LevelsOfCompliance-Level2UseCaseSupport">Level 2: Use Case Support</h4>

        <p>This level of compliance with the NetBeans Platform is concerned with one or more of the following activities:</p>

        <ul>
            <li>Bind your application to other modules by inspecting existing functionality and trying to use it.</li>
            <li>Simplify the workflow to fit into the NetBeans Platform paradigms.</li>
            <li>Listen to the global selection to discover what other modules are doing and update your state accordingly.</li>
        </ul>

        <p>In this tutorial, we will listen for the existence of <tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-text/org/openide/cookies/EditorCookie.html">EditorCookie</a>s</tt>.
            A cookie is a <i>capability</i>.
            With a Java interface, your object's capabilities are fixed at compile time, while NetBeans Platform cookies
            allow your object to behave dynamically because your object can expose capabilities, or
            not, based on its state. An <tt>EditorCookie</tt>
            defines an editor, with interfaces for common activities such as opening a document, closing the editor,
            background loading of files, document saving, and modification notifications.</p> <p>We will listen for the
            existence of such a cookie and then we will pass the content of the editor to the <tt>TopComponent</tt>, in the
            form of words. By doing this, we are doing what the first item above outlines, i.e., inspecting existing
            functionality and reusing it within the context of our ported application. This is a modest level of integration.
            However, it pays off because it shows how you can reuse functionality provided by the NetBeans Platform or
            by any other application created on top of the NetBeans Platform, such as NetBeans IDE..</p>

        <h4 id="section-LevelsOfCompliance-Level3Aligned">Level 3: Aligned</h4>

        <p>In this final stage of your porting activity, you are concerned with the following thoughts, first and foremost:</p>

        <ul>
            <li>Become a good citizen of the NetBeans Platform, by exposing your own state to other modules so that they know what you are doing.</li>
            <li>Eliminate duplicated functionality, by
                reusing the Navigator, Favorites window, Task List, Progress API, etc., instead of creating or maintaining your own.</li>
            <li>Cooperate with other modules and adapt your application to the NetBeans Platform way of doing things.</li>
        </ul>

        <p>Towards the end of this tutorial, we will adopt this level of compliance by letting our <tt>TopComponent</tt>
            expose a <tt>SaveCookie</tt> when changes are made to the "Guessed Word" text field. By doing this, we will
            enable the Save menu item under the Tools menu. This kind of integration brings the full benefits of the
            NetBeans Platform, however it also requires some effort to attain.</p>


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

        <h2 class="tutorial"><a name="creating"></a>Creating the NetBeans Platform Application</h2>

        <p>First, let's create the basis of our application. We use a wizard to do so. This
            is the typical first practical step of creating a new application
            on top of the NetBeans Platform application.</p>

        <div class="indent">

            <ol>
                <li><p>Choose File &gt; New Project (Ctrl-Shift-N). Under Categories, select NetBeans Modules.
                        Under Projects,
                        select NetBeans Platform Application, as shown below:</p>

                    <p><img alt="" src="../../images/tutorials/porting/70/agp0.png"/></p>

                    <p>Click Next.</p></li>
                <li><p>Name the application <code>AnagramApplication</code>, as shown below:</p>

                    <p><img alt="" src="../../images/tutorials/porting/70/agp01.png"/></p>
                    <p>Click Finish</p>
                    <p>You now have a NetBeans Platform application. You can run it and
                        you will see an empty main window, with a menu bar and a tool bar:</p>

                    <p><img alt="" src="../../images/tutorials/porting/70/agp02.png"/></p>


                    <p>Look
                        under some of the menus, click a few toolbar buttons, and explore the
                        basis of your new application. For example, open the Properties window
                        and the Output window, from the Window menu, and you have the starting
                        point of a complex application:
                    </p>
                    <p><img alt="" src="../../images/tutorials/porting/70/agp03.png"/></p>


                    <p>Next, we create a first custom module. We will name it
                        <code>AnagramCore</code> because, in the end, it will
                        contain the essential parts of the application.
                        Using subsequent tutorials on the <a href="https://netbeans.org/kb/trails/platform.html">NetBeans Platform Learning Trail</a>, we
                        will be able to add more features to the application, none of which
                        will be manadatory parts, since the user will be able to plug
                        them into the application. The core module, however, that is, <code>AnagramCore</code>,
                        will be a required module in every distribution of the application.</p></li>

                <li><p>Right-click the application's "Modules" node and choose "Add New...", as shown below:</p>

                    <p><img alt="" src="../../images/tutorials/porting/70/agp04.png"/></p>

                    <p>Click Next.</p></li>

                <li><p>Type <tt>AnagramGameCore</tt> in Project Name and choose somewhere
                        to store the module, as shown below:</p>

                    <p><img alt="" src="../../images/tutorials/porting/70/agp2.png"/></p>

                    <p>Click Next.</p></li>

                <li><p>Type a unique name in the Code Name Base field,
                        which provides the unique identifier for your module.
                        It could be anything, but here it is <tt>com.toy.anagrams.core</tt>
                        because it is convenient to reproduce the package structure
                        of the original application, which is "com.toy.anagrams.*".
                        Do not click "Generate OSGi Bundle", because in this tutorial
                        you will use the default NetBeans module system.
                    </p>
                    <p>Click Finish.</p>

                    <p>Below the original Anagram Game sample, you should now see the source structure of your
                        new module, as shown here:</p>

                    <p><img alt="" src="../../images/tutorials/porting/70/agp4.png"/></p></li>

            </ol>

        </div>

        <p>Above, we can see that we now have the original application,
            together with the module to which it
            will be ported. In the next sections, we will begin porting the application to
            the module, using the porting levels described earlier.</p>

        <!-- ===================================================================================== -->
        <h2 class="tutorial"><a name="porting0"></a>Porting Level 0: Launchable</h2>


        <p>At this stage, we simply want to be able to launch our application.
            To do that we will create a menu item that invokes the application.
            We begin
            by copying the application's sources into the module source structure.</p>

        <div class="indent">

            <ol>
                <li><p>Copy the two packages from the Anagram Game into the module. Below,
                        the new packages and classes in the module are highlighted:</p>
                    <p><img alt=""  src="../../images/tutorials/porting/70/agport0.png"/></p></li>

                <li><p>In the <code>com.toy.anagrams.core</code> package, create a new Java
                        class named <code>OpenAnagramGameAction</code>, implementing
                        the standard JDK <code>ActionListener</code> as follows:</p>

                    <pre class="examplecode">import com.toy.anagrams.ui.Anagrams;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class OpenAnagramGameAction implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        new Anagrams().setVisible(true);
    }

}</pre>

                    <p>When the user
                        invokes the <code>OpenAnagramGameAction</code>, the
                        <code>JFrame</code> from the Anagram Game will open.</p>

                </li>

                <li><p>Next, we need to register the new <code>OpenAnagramGameAction</code> in
                        the NetBeans central registry, which is also known as the "System FileSystem".
                        We will do this via annotations that will generate entries in the central registry.
                        To use these annotations, the AnagramGameCore module needs to have a library dependency
                        on the module that provides the annotations.</p>
                    <p>Right-click on the module's "Libraries" node and choose "Add Module Dependency",
                        as shown below:</p>
                    <p><img alt=""  src="../../images/tutorials/porting/70/agport0a.png"/></p>               
                    <p>Start typing "ActionRegistration" and you will see that the filter narrows
                        to show the library dependency that provides the <code>ActionRegistration</code>
                        class:</p>
                    <p><img alt=""  src="../../images/tutorials/porting/70/agport0b.png"/></p>               

                    <li><p>Now you can annotate your <code>Action</code> class as follows:</p>

                        <pre class="examplecode"><a href="http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/openide/awt/ActionID.html">@ActionID</a>(id="com.toy.anagrams.core.OpenAnagramGameAction",category="Window")
<a href="http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/openide/awt/ActionRegistration.html">@ActionRegistration</a>(displayName = "#CTL_OpenAnagramGameAction")
<a href="http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/openide/awt/ActionReferences.html">@ActionReferences</a>({
    <a href="http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/openide/awt/ActionReference.html">@ActionReference</a>(path = "Menu/Window", position = 10)
})
<a href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/NbBundle.Messages.html">@Messages</a>("CTL_OpenAnagramGameAction=Open Anagram Game")
public class OpenAnagramGameAction implements ActionListener {
    
    @Override
    public void actionPerformed(ActionEvent e) {
        new Anagrams().setVisible(true);
    }
    
}</pre>                    

                        <li><p>In the Projects window,
                                right-click the AnagramApplication project node
                                and choose Run. The application starts up, installing
                                all the modules provided by the application, which
                                includes our custom module.</p></li>

                        <li><p>Under the Window menu,
                                you should find the menu item "Open Anagram Game".</p>
                            <p><img alt=""  src="../../images/tutorials/porting/70/agport0c.png"/></p>               
                            <p>Click "Open Anagram Game" and your application appears, as before.</p></li>

                        </ol>

                        </div>

                        <p>The application is displayed, but note that it is not
                            well integrated with the NetBeans Platform. For example,
                            it is not modal and it is impossible to close the <code>JFrame</code>,
                            unless you close the application. The latter is because
                            the application now manages the lifecycle of the <code>JFrame</code>.
                            In the next section,
                            we will integrate
                            the Anagram Game more tightly with the NetBeans Platform.</p>

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

                        <h2 class="tutorial"><a name="porting1"></a>Porting Level 1: Integration</h2>

                        <p>In this section, we integrate the application
                            more tightly by creating a new window, so that we have a user
                            interface, that is,
                            a window, to which we can move those contents of
                            the <tt>JFrame</tt> that are useful to our new application.</p>

                        <div class="indent">

                            <ol>
                                <li><p>Right-click the <code>com.toy.anagrams.core</code> package in the Projects window and then
                                        choose New &gt; Other. Under Categories, select Module Development. Under File Types,
                                        select Window. Click Next.</p>
                                </li>

                                <li><p>Choose the position where you would
                                        like the window to appear. For purposes of this
                                        tutorial choose "editor", which will place the
                                        Anagram Game in the main part of the application.
                                        Also check the first checkbox, to specify that the window should
                                        open automatically when the application starts up. Click Next.</p>
                                </li>


                                <li><p>Type <tt>Anagram</tt> in Class Name
                                        Prefix and select <tt>com.toy.anagrams.core</tt>
                                        in Package, as shown here:</p>

                                    <p><img alt=""  src="../../images/tutorials/porting/70/agport6.png"/></p>

                                    <p>Above, notice that the IDE shows the files it
                                        will create and modify.</p></li>

                                <li><p>Click Finish. Now you have a new Java class named "AnagramGameTopComponent.java".
                                        Double-click it and the Matisse GUI Builder opens. You can use the GUI Builder to
                                        design your windows:
                                        <p><img alt="" style="border: 1px solid" src="../../images/tutorials/porting/70/agport8.png"/></p></li>

                                <li><p>Open the <tt>Anagrams</tt> class in
                                        the <code>com.toy.anagrams.ui</code> package. Click within the
                                        Anagrams in the GUI Builder until you see an orange line around
                                        the <code>JPanel</code>, as shown below:</p>

                                    <p><img alt="" src="../../images/tutorials/porting/70/agport8a.png"/></p></li>

                                <li><p>When you see the orange line around the <code>JPanel</code>, as shown above,
                                        right-click it and choose "Copy".
                                        Then paste the <code>JPanel</code> into the <code>AnagramTopComponent</code> and you should see
                                        the old user interface in your new <code>AnagramTopComponent</code> class:</p>

                                    <p><img alt="" style="border: 1px solid" src="../../images/tutorials/porting/70/agport9.png"/></p></li>

                                <li><p>You have now ported the user interface of the Anagram Game.
                                        A few variables need still to be moved from the <code>Anagrams</code>
                                        class to the new <code>AnagramTopComponent</code> class. Declare these
                                        two, which are in the <code>Anagrams</code> class, at the top of your
                                        new <code>AnagramTopComponent</code> class.</p>

                                    <pre class="examplecode">private int wordIdx = 0;
private WordLibrary wordLibrary;</pre>

                                    <p>Next, look in the constructor of the <code>Anagrams</code> class. The first line
                                        in the constructor is as follows:</p>

                                    <pre class="examplecode">wordLibrary = WordLibrary.getDefault();</pre>

                                    <p>Copy that statement. Paste it into the <code>TopComponent</code> class, making it
                                        the new first statement in the constructor of the <code>TopComponent</code> class.</p>

                                    <p>Check that the first part of your <code>TopComponent</code> class is now as follows:</p>

                                    <pre class="examplecode">...
...
...
import com.toy.anagrams.lib.WordLibrary;
import org.openide.util.NbBundle;
import org.openide.windows.TopComponent;
import org.netbeans.api.settings.ConvertAsProperties;
import org.openide.awt.ActionID;
import org.openide.awt.ActionReference;

/**
 * Top component which displays something.
 */
<a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-modules-settings/org/netbeans/api/settings/ConvertAsProperties.html">@ConvertAsProperties</a>(dtd = "-//com.toy.anagrams.core//Anagram//EN",
autostore = false)
<a href="http://bits.netbeans.org/dev/javadoc/org-openide-windows/org/openide/windows/TopComponent.Description.html">@TopComponent.Description</a>(preferredID = "AnagramTopComponent",
//iconBase="SET/PATH/TO/ICON/HERE", 
persistenceType = TopComponent.PERSISTENCE_ALWAYS)
<a href="http://bits.netbeans.org/dev/javadoc/org-openide-windows/org/openide/windows/TopComponent.Registration.html">@TopComponent.Registration</a>(mode = "editor", openAtStartup = true)
<a href="http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/openide/awt/ActionID.html">@ActionID</a>(category = "Window", id = "com.toy.anagrams.core.AnagramTopComponent")
<a href="http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/openide/awt/ActionReference.html">@ActionReference</a>(path = "Menu/Window" /*, position = 333 */)
<a href="http://bits.netbeans.org/dev/javadoc/org-openide-windows/org/openide/windows/TopComponent.OpenActionRegistration.html">@TopComponent.OpenActionRegistration</a>(displayName = "#CTL_AnagramAction",
preferredID = "AnagramTopComponent")
public final class AnagramTopComponent extends TopComponent {

    private int wordIdx = 0;
    private WordLibrary wordLibrary;

    public AnagramTopComponent() {
        wordLibrary = WordLibrary.getDefault();
        initComponents();
        setName(NbBundle.getMessage(AnagramTopComponent.class, "CTL_AnagramTopComponent"));
        setToolTipText(NbBundle.getMessage(AnagramTopComponent.class, "HINT_AnagramTopComponent"));
    }
...
...
...</pre>                            

                                </li>


                                <li><p>Run the application again. When the
                                        application starts up, you should now see the Anagram Game window, which
                                        you defined in this section. You will also find
                                        a new menu item that opens the window, under the
                                        Window menu. Also notice that the game works as before. You
                                        need to click the "New Word" button once, to have the module
                                        call up a new word, and then you can use it as
                                        before:</p>

                                    <p><img alt=""  src="../../images/tutorials/porting/70/agport10.png"/></p></li>

                            </ol>

                        </div>

                        <p>As a final step in this section, you can simply delete
                            the <code>com.toy.anagrams.ui</code> package. That package
                            contains the two UI classes from the original Anagram Game.
                            You do not need either of these two classes anymore. Simply
                            delete the package that contains them, since you have ported everything of interest
                            to the NetBeans Platform. Then also delete the <code>OpenAnagramGameAction</code> class,
                            since this class is not needed because the <code>AnagramTopComponent</code>
                            provides its own <code>Action</code> for opening the window.</p>


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

                        <h2 class="tutorial"><a name="porting3"></a>Porting Level 2: Use Case Support</h2>

                        <p>In this section, we are concerned with listening to the global selection and making use
                            of data we find there. The global selection is the registry for
                            global singletons and instances of objects which have been registered in the system by modules.
                            Here we query the lookup for <tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-text/org/openide/cookies/EditorCookie.html">EditorCookie</a></tt>s and make use of the <tt>EditorCookie</tt>'s
                            document to fill the string array that defines the scrambled words displayed in
                            the <tt>TopComponent</tt>. </p>


                        <p>A cookie is a capability. With a Java interface, your object's capabilities are
                            fixed at compile time, while NetBeans Platform cookies allow your object to behave dynamically
                            because your object can expose capabilities, or not, based on its state. An <code>EditorCookie</code>
                            defines an editor, with interfaces for common activities such as opening a document, closing the
                            editor, background loading of files, document saving, and modification notifications. We will
                            listen for the existence of such a cookie and then we will pass the content of the editor
                            to the TopComponent, in the form of words. By doing this, we are inspecting existing functionality
                            and reusing it within the context of our ported application. This is a modest level of
                            integration. However, it pays off because you are reusing functionality provided by the NetBeans Platform.</p>

                        <div class="indent">

                            <ol>
                                <li>We begin by tweaking the <tt>StaticWordLibrary</tt> class. We do this so that
                                    we can set its list of words externally. The sample provides a hardcoded list,
                                    but we want to be able to set that list ourselves, via an external action. Therefore,
                                    add this method to <tt>StaticWordLibrary</tt>:

                                    <pre class="examplecode">public static void setScrambledWordList(String[] inScrambledWordList) {
    SCRAMBLED_WORD_LIST = inScrambledWordList;
}</pre>    

                                    <p>Importantly, change the class signature of <tt>StaticWordLibrary</tt>
                                        to <code>public class</code> and remove the <code>final</code>
                                        from the signature of <code>SCRAMBLED_WORD_LIST</code></p>

                                    <p>Next, we will create an action that will obtain the content of a Manifest file,
                                        break the content down into words, and fill the <tt>SCRAMBLED_WORD_LIST</tt> string array
                                        with these words.</p>

                                </li>

                                <li>As you learned to do in the previous section, set library
                                    dependencies on the Text API and the Nodes API.</li>

                                <li>Create a Java class
                                    named <code>SetScrambledAnagramsAction</code>, in the <code>com.toy.anagrams.core</code> package,
                                    and define it as follows:

                                    <pre class="examplecode"><a href="http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/openide/awt/ActionID.html">@ActionID</a>(id="com.toy.anagrams.core.SetScrambledAnagramsAction",category="Window")
<a href="http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/openide/awt/ActionRegistration.html">@ActionRegistration</a>(displayName = "#CTL_SetScrambledAnagramsAction")
<a href="http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/openide/awt/ActionReferences.html">@ActionReferences</a>({
    <a href="http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/openide/awt/ActionReference.html">@ActionReference</a>(path = "Editors/text/x-manifest/Popup", position = 10)
})
<a href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/NbBundle.Messages.html">@Messages</a>("CTL_SetScrambledAnagramsAction=Set Scrambled Words")
public final class SetScrambledAnagramsAction implements ActionListener {

    private final EditorCookie context;

    public SetScrambledAnagramsAction(EditorCookie context) {
        this.context = context;
    }

    @Override
    public void actionPerformed(ActionEvent ev) {
        try {
            //Get the EditorCookie's document:
            StyledDocument doc = context.getDocument();
            //Get the complete textual content:
            String all = doc.getText(0, doc.getLength());
            //Make words from the content:
            String[] tokens = all.split(" ");
            //Pass the words to the WordLibrary class:
            StaticWordLibrary.setScrambledWordList(tokens);
            //Open the TopComponent:
            TopComponent win = WindowManager.getDefault().findTopComponent("AnagramTopComponent");
            win.open();
            win.requestActive();
        } catch (BadLocationException ex) {
            Exceptions.printStackTrace(ex);
        }
    }

}</pre></li>


                                <li><p>As discussed above, when we run the application we want to be able to right-click
                                        within a Manifest file, choose a menu item, and invoke our Action. Right now,
                                        however, the NetBeans Platform is unable to distinguish Manifest files
                                        from any other file. Therefore, we need to enable Manifest support in our
                                        application.</p>
                                    <p>For demonstration purposes, we will enable ALL the modules in the NetBeans Platform,
                                        as well as those provided by NetBeans IDE. As a result, when we run the
                                        application, a new instance of NetBeans IDE will start up, together with
                                        our custom module.</p>
                                    <p>To achieve the above, expand the Important Files node in the application, then open
                                        the NetBeans Platform Config file, which on disk
                                        is named <code>platform.properties</code>. Notice that many modules have
                                        been disabled. You can enable them via the Project Properties dialog
                                        of the NetBeans Platform application. Since we are simply going to enable
                                        ALL of them, we need only change the content of the <code>platform.properties</code>
                                        file to the following:</p>

                                    <pre class="examplecode">cluster.path=\
    ${nbplatform.active.dir}/apisupport:\
    ${nbplatform.active.dir}/harness:\
    ${nbplatform.active.dir}/ide:\
    ${nbplatform.active.dir}/java:\
    ${nbplatform.active.dir}/nb:\
    ${nbplatform.active.dir}/platform:\
    ${nbplatform.active.dir}/profiler:\
    ${nbplatform.active.dir}/websvccommon
disabled.modules=
nbplatform.active=default</pre>

                                    <p>In the next step, when we run the application, all the groups
                                        of modules (called "clusters") will be enabled, nothing will
                                        be excluded, and you will see NetBeans IDE started up.</p></li>

                                <li><p>Build the application. Then, after you have done so, 
                                        run the application. Go to the Window menu and choose
                                        Favorites. In the Favorites window, browse to a Manifest
                                        file. Open the file. Inside the file, i.e., in the Manifest
                                        Editor, right-click, and invoke the Set Scrambled Words
                                        action via the menu item.</p>

                                    <p><img alt=""  src="../../images/tutorials/porting/70/ageditorcookie3.png"/></p>

                                    <p>The <code>AnagramTopComponent</code> is displayed and,
                                        when you click the Next Word button, you will see that
                                        the scrambled words all come from the selected Manifest file.</p>

                                    <p><img alt=""  src="../../images/tutorials/porting/70/ageditorcookie4.png"/></p>


                                </li>

                            </ol>

                        </div>

                        <p>The result of this exercise is that you now see the content of the Manifest
                            file in the Scrambled Word text field.
                            Of course, these words are not really scrambled and you cannot
                            really unscramble them. However, your module is
                            making use of the content of a file that is supported by a
                            different set of modules altogether, that is, the Manifest support
                            modules, as well as related editor modules.</p>


                        <p>Optionally, before continuing, you can now remove all the groups of
                            modules (known as "clusters") provided by NetBeans IDE, which
                            may not be relevant for your own application. To do so, right-click
                            the <code>AnagramApplication</code> node in the Projects window,
                            choose Properties, go to the Libraries tab, and uncheck all the
                            checkboxes, except for <code>harness</code> and <code>platform</code>.
                            Run the application again and you will see that all the project-related
                            and editor-related features of the application have now been removed.</p>

                        <!-- ===================================================================================== -->
                        <h2 class="tutorial"><a name="porting4"></a>Porting Level 3: Aligned</h2>


                        <p>In this section, we are concerned with becoming a "good citizen" of the
                            NetBeans Platform. We are going to expose the state of the TopComponent to
                            the other modules, so that we can cooperate with them.</p>
                        <p>As an example of this, we
                            will modify the TopComponent to offer a <tt>SaveCookie</tt>, which gives
                            the user a way to store the text typed in the text field. By offering the
                            <tt>SaveCookie</tt> when changes are made in the text field, the Save button
                            and the Save menu item under the File menu will become enabled. That is because
                            the NetBeans Platform provides a context-sensitive Action called <code>SaveAction</code>.
                            The <code>SaveAction</code> becomes enabled whenever the capability of being saved,
                            in other words, the <code>SaveCookie</code>, is available. In this case,
                            we will make the <code>SaveCookie</code> available whenever the user types
                            something in the <code>guessedWord</code> text field. Then the <code>SaveAction</code>
                            will automatically become enabled.</p>
                        <p>When the user
                            selects the enabled button or menu item, a dialog will be displayed and the button
                            and menu item will become disabled, until the next time that a change is made
                            to the text field.</p>

                        <div class="indent">

                            <ol>

                                <li>Begin by setting a library dependency on the Dialogs API, which you learned
                                    to do in the previous sections.
                                </li>

                                <li>Next, we define an implementation of the <code>SaveCookie</code>, somewhere
                                    within the <code>AnagramTopComponent</code> class:

                                    <pre class="examplecode">private class SaveCookieImpl implements SaveCookie {

    @Override
    public void save() throws IOException {

        Confirmation msg = new NotifyDescriptor.Confirmation("Do you want to save \""
                + guessedWord.getText() + "\"?", NotifyDescriptor.OK_CANCEL_OPTION,
                NotifyDescriptor.QUESTION_MESSAGE);

        Object result = DialogDisplayer.getDefault().notify(msg);

        //When user clicks "Yes", indicating they really want to save,
        //we need to disable the Save button and Save menu item,
        //so that it will only be usable when the next change is made
        //to the text field:
        if (NotifyDescriptor.YES_OPTION.equals(result)) {
            fire(false);
            //Implement your save functionality here.
        }

    }

}</pre>

                                    <p>We have not defined the <code>fire</code> method yet, so the related
                                        statement above will be underlined in red until we do so.</p>
                                </li>

                                <li><p>In the constructor, call the as-yet-undefined <code>fire</code> method,
                                        passing in true this time, whenever a change is detected in the
                                        <code>guessedWord</code> text field:</p>

                                    <pre class="examplecode">guessedWord.getDocument().addDocumentListener(new DocumentListener() {

    @Override
    public void insertUpdate(DocumentEvent arg0) {
        fire(true);
    }

    public void removeUpdate(DocumentEvent arg0) {
        fire(true);
    }

    public void changedUpdate(DocumentEvent arg0) {
        fire(true);
    }

});</pre></li>

                                <li><p>Now we declare an <code><a href="http://bits.netbeans.org/dev/javadoc/org-openide-util-lookup/org/openide/util/lookup/InstanceContent.html">InstanceContent</a></code> at the top of the class. The
                                        <code>InstanceContent</code> class is a very powerful class in the NetBeans Platform,
                                        enabling you to update the Lookup on the fly, at runtime. We also declare
                                        the implementation of our <code>SaveCookie</code>:</p>


                                    <pre class="examplecode">InstanceContent ic;
SaveCookieImpl impl;</pre></li>

                                <li><p>Next, at the end of the constructor, we instantiate the <code>SaveCookie</code> and the <code>InstanceContent</code>,
                                        while adding the <code>InstanceContent</code> to the <code>Lookup</code>
                                        of the <code>AnagramTopComponent</code>:</p>

                                    <pre class="examplecode">impl = new SaveCookieImpl();

ic = new InstanceContent();

associateLookup(new AbstractLookup(ic));</pre></li>

                                <li><p>Now we can add the <code>fire</code> method, which
                                        dynamically adds and removes the <code>SaveCookie</code>
                                        from the <code>InstanceContent</code>:</p>

                                    <pre class="examplecode">public void fire(boolean modified) {
    if (modified) {
        //If the text is modified,
        //we add the SaveCookie implementation
        //to the InstanceContent, which
        //is in the Lookup of the TopComponent:
        ic.add(impl);
    } else {
        //Otherwise, we remove the SaveCookie
        //from the InstanceContent:
        ic.remove(impl);
    }
}</pre></li>

                                <li><p>Run the application again. Make a change in the "Guessed Word" text field and
                                        notice that the Save menu item is enabled:</p>
                                    <p><img alt="" style="border: 1px solid black" src="../../images/tutorials/porting/70/ageditorcookie2.png"/></p>


                                    <p>Click the menu item,
                                        click the "OK" button in the
                                        dialog...</p>

                                    <p><img alt="" style="border: 1px solid black" src="../../images/tutorials/porting/70/ageditorcookie5.png"/></p>

                                    <p>...and notice that the Save menu item is disabled afterwards.</p>

                                </li>

                            </ol>

                        </div>

                        <p>Congratulations! Now that your application is making use of existing NetBeans Platform functionality,
                            you have taken
                            one further step
                            in successfully aligning it with the NetBeans Platform. Other modules can be now be
                            plugged into the NetBeans Platform to take advantage of, or even extend, features added by your
                            application.  Hence, not only can your application benefit from what the NetBeans Platform provides,
                            but you can create features that other modules can use as well.</p>
                        <!--
                                <p>You need to continue finding ways
                                    to further align your original application with the functionality offered by the NetBeans Platform,
                                    in order to make it even more of a good "good citizen" and useful member of the community of modules
                                    within the application.</p>
                
                                <p>For example, you can write a new node, with child nodes for each
                                    word defined in the class:</p>
                
                                <pre class="examplecode">public class WordListNode extends AbstractNode {
                
                            private int index;
                            private final WordLibrary wordLibrary;
                
                            public WordListNode() {
                                this(WordLibrary.getDefault());
                            }
                
                            private WordListNode(WordLibrary w) {
                                super(new WordListChildren(w));
                                wordLibrary = w;
                            }
                
                            WordListNode(int index, WordLibrary w) {
                                super(Children.LEAF);
                                this.index = index;
                                this.wordLibrary = w;
                
                                setName("Index: " + index);
                                setDisplayName(wordLibrary.getWord(index));
                            }
                
                            @Override
                            public String getHtmlDisplayName() {
                                return "&lt;b&gt;" + wordLibrary.getWord(index) + "&lt;/b&gt; (&lt;i&gt;" + wordLibrary.getScrambledWord(index) + "&lt;/i&gt;)";
                            }
                
                            private static class WordListChildren extends Children.Keys&lt;Integer&gt; {
                                private final WordLibrary wordLibrary;
                
                                public WordListChildren(WordLibrary wordLibrary) {
                                    this.wordLibrary = wordLibrary;
                                }
                
                                @Override
                                protected void addNotify() {
                                    List&lt;Integer&gt; arr = new ArrayList&lt;Integer&gt;();
                                    for (int i = 0; i &lt; wordLibrary.getSize(); i++) {
                                        arr.add(i);
                                    }
                                    setKeys(arr);
                                }
                
                                @Override
                                protected void removeNotify() {
                                    setKeys(Collections.&lt;Integer&gt;emptyList());
                                }
                
                                @Override
                                protected Node[] createNodes(Integer index) {
                                    WordListNode node = new WordListNode(index, wordLibrary);
                                    return new Node[] { node };
                                }
                            }
                
                        }</pre>
                
                                <p>In return, the lifecycle of the original application is now handled by the NetBeans Platform
                                    and you can leverage as much of the existing modules' functionality as is reasonable for your module. In fact,
                                    your original application is now no longer an application, but an integral part of a larger application.</p>
                        -->
                        <!-- ===================================================================================== -->

                        <h2 class="tutorial"><a name="tips"></a>Porting Tips & Tricks</h2>

                        <p>There are several next steps one can take at this point, aside from further aligning
                            the application with the NetBeans Platform, as outlined above:</p>

                        <ul>
                            <li><b>Attain a thorough understanding of what the NetBeans Platform provides.</b>
                                As you port your application, you will learn more and more about the
                                various features that the NetBeans Platform makes available. A central
                                problem is that the NetBeans Platform is quite large and attaining a thorough
                                overview of all that it offers can be a lengthy process. A quick shortcut
                                is to download and print out the <a href="http://refcardz.dzone.com/refcardz/netbeans-platform-70">NetBeans Platform 7.0 Refcard</a>,
                                which is a free DZone document that highlights all the NetBeans Platform
                                benefits, features, APIs, and many tips and tricks in an easy
                                to digest format.</li>

                            <li><b>Become aware of the differences between standard Swing applications
                                    and the NetBeans Platform.</b> For the most part, the standard Swing approach to
                                creating a user interface will continue to work for your NetBeans Platform
                                application. However, the NetBeans Platform approach is better, easier, or both
                                in some cases.  One example is that of the NetBeans Dialogs API.  The standard Swing approach,
                                via, for example, the <tt>JOptionsPane</tt>, works OK, but using the NetBeans Dialogs API is easier,
                                because it automatically centers your dialog in the application and allows you to dismiss it
                                with the ESC key.  Using the Dialogs API also lets you plug in a different DialogDisplayer,
                                which can make it easier to customize or test your application.

                                <p>Below is a list of the principle differences between the typical Swing approach
                                    and that of the NetBeans Platform:</p>

                                <ul>
                                    <li>Loading of images</li>
                                    <li>Loading of resource bundles and localized string</li>
                                    <li>Assigning of mnemonics to labels and buttons</li>
                                    <li>Showing dialogs</li>
                                </ul>
                                <p>For details on all of the above items, read
                                    this FAQ: <a href="http://wiki.netbeans.org/wiki/view/DevFaqNbIdeosyncracies">Common calls that should be done slightly differently in NetBeans than standard Swing apps (loading images, localized strings, showing dialogs)</a>.</p>

                                <p>In addition, note that, since the NetBeans Platform now handles the lifecycle of your module, since it is
                                    now part of the whole application, you can no longer use <tt>System.exit</tt>. Instead, you need to use <tt>LifecycleManager</tt>. To
                                    run code on start up, which should only be done when absolutely necessary, you need to use the NetBeans <tt>ModuleInstall</tt> class and,
                                    specifically, its <tt>restored</tt> method. A useful reference in this context is <a href="http://www.ociweb.com/jnb/jnbOct2005.html#porting">Porting a Java Swing Application to the NetBeans Platform</a>,
                                    by Tom Wheeler, in <a href="http://www.ociweb.com/jnb/jnbOct2005.html#porting">Building A Complete NetBeans Platform Application</a>.</p></li>

                            <li><p><b>Create a module project for each distinct part of your application.</b> The
                                    NetBeans Platform provides a modular architecture out of the box. Break your
                                    application into one or more modules. Doing so requires some analysis of your
                                    original application and an assessment of which parts could best fit within
                                    a new module and how to communicate between them. Since the example in this
                                    tutorial was simple, we only needed one module. A next step might be to put the
                                    <tt>WordLibrary</tt> class in a separate module and expose it as a public API.
                                    The <tt>StaticWordLibrary</tt> would be put into another module, providing
                                    an implementation of the <tt>WordLibrary</tt> API. Doing so would let other modules
                                    provide user interfaces on top of the API provided by the first module, without
                                    depending in any way on the implementations.</p>

                                <p>As shown above, you need to put the modules in a module suite. Then set
                                    a dependency in the plugin module on the API module, using the Libraries
                                    panel in the plugin module's Project Properties dialog box. The size of each module, i.e.,
                                    when one should create a new module or continue developing within an existing one, is a
                                    question of debate. Smaller is better, in general.</p></li>

                            <li><b>Always keep reevaluating what you really need to port.</b> Look at the NetBeans Platform and
                                decide where there is overlap with your own application. Where there is overlap,
                                such as the menu bar and About box, decide what you want to do. Typically, you
                                want to leverage as much as possible from the NetBeans Platform. Therefore, you
                                would port as little as possible from your own application, while keeping as much
                                of it as is useful to you.</li>

                            <li><b>Move distinct parts of your user interface to one or more TopComponents.</b> On the NetBeans
                                Platform, the <tt>TopComponent</tt> class provides the top level Swing container. In effect,
                                it is a window. Move the user interface from your original application to one or
                                more of these windows and discard your original <tt>JFrame</tt>s.</li>

                            <li><b>Copy the Java classes that do not provide user interface elements.</b> We simply
                                copied the original <tt>WordLibrary.java</tt> class. You can do the same with the model
                                of your own Swing applications. You might need to tweak some code to smoothen the transition
                                between the old Swing application and the new NetBeans Platform application, but (as
                                in the case shown in this tutorial) this might not even be necessary.</li>

                            <li><b>Learn from others.</b> Aside from joining the dev@platform.netbeans.org mailing list,
                                also read the following two crucial articles:
                                <ul>
                                    <li><a href="http://netbeans.dzone.com/10-tips-4-porting-2-netbeans">Top 10 Tips for Porting to the NetBeans Platform</a></li>
                                    <li><a href="http://java.dzone.com/news/how-to-split-into-modules">How to Split an Application into Modules?</a></li>
                                </ul>
                            </li>

                            <li><b>Watch the Top 10 NetBeans APIs Screencast.</b> The <a href="https://platform.netbeans.org/tutorials/nbm-10-top-apis.html">screencast series</a>
                                gives a good overview of the NetBeans Platform, with many useful code snippets and coding patterns.</li>

                        </ul>


                        <div class="feedback-box"><a href="https://netbeans.org/about/contact_form.html?to=3&amp;subject=Feedback:%20NetBeans%20Platform%20Porting%207.1%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:</p>
                        <ul>
                            <li><a href="https://netbeans.org/kb/trails/platform.html">Other Related Tutorials</a></li>
                            <li><a href="https://netbeans.org/download/dev/javadoc/">NetBeans API Javadoc</a></li>
                        </ul>

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


                        </body>
                        </html>
