<!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>Platform Swing Porting Tutorial for the NetBeans Platform</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, 2011, 2012, 2013, 2014 Oracle and/or its affiliates. All rights reserved. -->
        <!--     Use is subject to license terms.-->
    </head>
    <body>
        <h1>NetBeans Platform Swing Porting Tutorial</h1>

        <p>This tutorial demonstrates how to port the Swing components and business logic
            of a simple Java 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 8.0 and
            NetBeans IDE 8.0. If you
            are using an earlier version, see <a href="74/nbm-porting-basic.html">the previous version
                of this document</a>.</p>

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

        <p><img src="../images/articles/81/netbeans-stamp.png" class="stamp" width="114" height="114" alt="Content on this page applies to NetBeans IDE 8.0" title="Content on this page applies to NetBeans IDE 8.0"/></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 8.0 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 7 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>

        <p class="tips">For troubleshooting purposes, you are welcome to download the <a href="http://java.net/projects/nb-api-samples/sources/api-samples/show/versions/8.0/tutorials/porting-basic">completed tutorial source code</a>.</p>

        <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 port an application
            to the NetBeans Platform 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. You should now see
                        the Anagram Game application in the Projects window, as shown here:</p>
                    <br/>
                    <p><img alt="" src="../images/tutorials/porting/73/ag0.png"/></p>
                    <br/>
                    <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>
                    <br/>
                    <p><img alt="" src="../images/tutorials/porting/73/ag1.png"/></p>
                </li>
                <li><p>When you enter the correctly unscrambled word, you will see this:</p>
                    <br/>
                    <p><img alt="" src="../images/tutorials/porting/73/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><a href="http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/netbeans/api/actions/Savable.html">Savable</a></tt> 
            when changes are made to the "Guessed Word" text field. By doing this, we will
            enable the NetBeans Platform Save actions, which can be invoked from the File menu, toolbar,
            and keyboard shortcuts. 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>
                    <br/>
                    <p><img alt="" src="../images/tutorials/porting/73/agp0.png"/></p>
                    <br/>
                    <p>Click Next.</p></li>
                <li><p>Name the application <code>AnagramApplication</code>, as shown below:</p>
                    <br/>
                    <p><img alt="" src="../images/tutorials/porting/73/agp1.png"/></p>
                    <br/>
                    <p>Click Finish. You now have a NetBeans Platform application. You can right-click it
                        and then run it and
                        you will see an empty main window, with a menu bar and a tool bar:</p>
                    <br/>
                    <p><img alt="" src="../images/tutorials/porting/73/agp2.png"/></p>
                    <br/>
                    <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>
                    <br/>
                    <p><img alt="" src="../images/tutorials/porting/73/agp3.png"/></p>
                    <br/>
                    <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>
                    <br/>
                    <p><img alt="" src="../images/tutorials/porting/73/agp4.png"/></p>
                </li>
                <li><p>Type <tt>AnagramGameCore</tt> in Project Name and accept the default
                        project location, which is the root folder of the application, as shown below:</p>
                    <br/>
                    <p><img alt="" src="../images/tutorials/porting/73/agp5.png"/></p>
                    <br/>
                    <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>
                    <br/>
                    <p><img alt="" src="../images/tutorials/porting/73/agp6.png"/></p>
                    <br/>
                    <p>Click Finish. Below the original Anagram Game sample, you should now see the source structure of your
                        new module, as shown here:</p>
                    <br/>
                    <p><img alt="" src="../images/tutorials/porting/73/agp7.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>
                    <br/>
                    <p><img alt=""  src="../images/tutorials/porting/73/agc1.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> class 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>As you can see in the code above, 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.
                        Right-click on the module's "Libraries" node and choose "Add Module Dependency",
                        as shown below:</p>
                    <br/>
                    <p><img alt=""  src="../images/tutorials/porting/73/agc2.png"/></p>               
                    <br/>
                    <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>
                    <br/>
                    <p><img alt=""  src="../images/tutorials/porting/73/agc3.png"/></p> 
                    <br/>
                    <p>Click OK. Next, add another dependency, this time on the Utilities API, which provides
                        the <tt>@Messages</tt> annotation that you will use below.</p>
                </li>
                <li><p>Now you can annotate your <code>Action</code> class as follows:</p>

                    <pre class="examplecode">package com.toy.anagrams.core;

import com.toy.anagrams.ui.Anagrams;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import org.openide.awt.ActionID;
import org.openide.awt.ActionReference;
import org.openide.awt.ActionReferences;
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>(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", as shown below:
                        </p>
                        <br/>
                        <p><img alt=""  src="../images/tutorials/porting/73/agc4.png"/></p>               
                        <br/>
                        <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:</p>
                    <br/>
                    <p><img alt=""  src="../images/tutorials/porting/73/agw0.png"/></p>
                    <br/>
                    <p>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:</p>
                    <br/>
                    <p><img alt=""  src="../images/tutorials/porting/73/agw1.png"/></p>
                    <br/>
                    <p>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>
                    <br/>
                    <p><img alt=""  src="../images/tutorials/porting/73/agw2.png"/></p>
                    <br/>
                    <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>
                    <br/>
                    <p><img alt="" style="border: 1px solid" src="../images/tutorials/porting/73/agw3.png"/></p>
                    <br/>
                </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/73/agw4.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>
                    <br/>
                    <p><img alt="" style="border: 1px solid" src="../images/tutorials/porting/73/agw5.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>Make sure to add the import statement for the <tt>WordLibrary</tt> class to the
                        import section at the top of the class:</p>
                    <pre class="examplecode">import com.toy.anagrams.lib.WordLibrary;</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>
                    <br/>
                    <p><img alt=""  src="../images/tutorials/porting/73/agw6.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 class="notes"><b>Note:</b> 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">package com.toy.anagrams.core;

import com.toy.anagrams.lib.StaticWordLibrary;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.StyledDocument;
import org.openide.awt.ActionID;
import org.openide.awt.ActionReference;
import org.openide.awt.ActionReferences;
import org.openide.awt.ActionRegistration;
import org.openide.cookies.EditorCookie;
import org.openide.util.Exceptions;
import org.openide.util.NbBundle.Messages;
import org.openide.windows.TopComponent;
import org.openide.windows.WindowManager;

<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 {
            <b>//Get the EditorCookie's document:</b>
            StyledDocument doc = context.getDocument();
            <b>//Get the complete textual content:</b>
            String all = doc.getText(0, doc.getLength());
            <b>//Make words from the content:</b>
            String[] tokens = all.split(" ");
            <b>//Pass the words to the WordLibrary class:</b>
            StaticWordLibrary.setScrambledWordList(tokens);
            <b>//Open the TopComponent:</b>
            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. For demonstration purposes, we will enable ALL the modules 
                        in the NetBeans Platform,
                        as well as those provided by NetBeans IDE that relate to Java development.
                        As a result, when we run the
                        application, a new instance of NetBeans IDE for Java development will start up, together with
                        our custom module. To achieve the above, expand the Important Files node in the 
                        AnagramApplication, then open
                        the NetBeans Platform Config file, which on disk
                        is named <code>platform.properties</code>. Notice that many clusters (groups
                        of modules) and individual modules have
                        been excluded or disabled. You can enable them via the Project Properties dialog
                        of the NetBeans Platform application. Since we are simply going to enable
                        ALL of those that relate to Java development them, 
                        we need only change the content of the <code>platform.properties</code>
                        file to the following:</p>

                    <pre class="examplecode">branding.token=anagramapplication
cluster.path=\
    ${nbplatform.active.dir}/extide:\
    ${nbplatform.active.dir}/harness:\
    ${nbplatform.active.dir}/ide:\
    ${nbplatform.active.dir}/java:\
    ${nbplatform.active.dir}/platform:\
    ${nbplatform.active.dir}/websvccommon
disabled.modules=\
    javaewah.dummy,\
    org.apache.commons.httpclient,\
    org.apache.commons.io,\
    org.apache.commons.lang,\
    org.apache.ws.commons.util,\
    org.apache.xmlrpc,\
    org.eclipse.core.contenttype,\
    org.eclipse.core.jobs,\
    org.eclipse.core.net,\
    org.eclipse.core.runtime,\
    org.eclipse.core.runtime.compatibility.auth,\
    org.eclipse.equinox.app,\
    org.eclipse.equinox.common,\
    org.eclipse.equinox.preferences,\
    org.eclipse.equinox.registry,\
    org.eclipse.equinox.security,\
    org.eclipse.jgit,\
    org.eclipse.mylyn.bugzilla.core,\
    org.eclipse.mylyn.commons.core,\
    org.eclipse.mylyn.commons.net,\
    org.eclipse.mylyn.commons.repositories.core,\
    org.eclipse.mylyn.commons.xmlrpc,\
    org.eclipse.mylyn.tasks.core,\
    org.eclipse.mylyn.wikitext.confluence.core,\
    org.eclipse.mylyn.wikitext.core,\
    org.eclipse.mylyn.wikitext.textile.core,\
    org.netbeans.core.browser,\
    org.netbeans.core.browser.webview,\
    org.netbeans.libs.git,\
    org.netbeans.libs.ini4j,\
    org.netbeans.libs.javafx,\
    org.netbeans.libs.jsch.agentproxy,\
    org.netbeans.libs.nbi.ant,\
    org.netbeans.libs.nbi.engine,\
    org.netbeans.libs.smack,\
    org.netbeans.libs.svnClientAdapter,\
    org.netbeans.libs.svnClientAdapter.javahl,\
    org.netbeans.libs.svnClientAdapter.svnkit,\
    org.netbeans.modules.apisupport.harness,\
    org.netbeans.modules.bugtracking,\
    org.netbeans.modules.bugtracking.bridge,\
    org.netbeans.modules.bugtracking.commons,\
    org.netbeans.modules.bugzilla,\
    org.netbeans.modules.css.prep,\
    org.netbeans.modules.editor.global.format,\
    org.netbeans.modules.extexecution.impl,\
    org.netbeans.modules.git,\
    org.netbeans.modules.html.angular,\
    org.netbeans.modules.html.custom,\
    org.netbeans.modules.html.knockout,\
    org.netbeans.modules.hudson.git,\
    org.netbeans.modules.hudson.mercurial,\
    org.netbeans.modules.hudson.subversion,\
    org.netbeans.modules.hudson.tasklist,\
    org.netbeans.modules.languages,\
    org.netbeans.modules.lexer.nbbridge,\
    org.netbeans.modules.localhistory,\
    org.netbeans.modules.localtasks,\
    org.netbeans.modules.mercurial,\
    org.netbeans.modules.mylyn.util,\
    org.netbeans.modules.notifications,\
    org.netbeans.modules.parsing.ui,\
    org.netbeans.modules.properties.syntax,\
    org.netbeans.modules.server,\
    org.netbeans.modules.spellchecker,\
    org.netbeans.modules.spellchecker.bindings.htmlxml,\
    org.netbeans.modules.spellchecker.bindings.properties,\
    org.netbeans.modules.spellchecker.dictionary_en,\
    org.netbeans.modules.spellchecker.kit,\
    org.netbeans.modules.subversion,\
    org.netbeans.modules.target.iterator,\
    org.netbeans.modules.team.commons,\
    org.netbeans.modules.team.ide,\
    org.netbeans.modules.utilities.project,\
    org.netbeans.modules.versioning,\
    org.netbeans.modules.versioning.core,\
    org.netbeans.modules.versioning.indexingbridge,\
    org.netbeans.modules.versioning.masterfs,\
    org.netbeans.modules.versioning.system.cvss.installer,\
    org.netbeans.modules.versioning.ui,\
    org.netbeans.modules.versioning.util,\
    org.netbeans.modules.web.webkit.debugging,\
    org.netbeans.modules.websvc.saas.kit,\
    org.netbeans.modules.websvc.saas.services.amazon,\
    org.netbeans.modules.websvc.saas.services.delicious,\
    org.netbeans.modules.websvc.saas.services.flickr,\
    org.netbeans.modules.websvc.saas.services.google,\
    org.netbeans.modules.websvc.saas.services.strikeiron,\
    org.netbeans.modules.websvc.saas.services.weatherbug,\
    org.netbeans.modules.websvc.saas.services.zillow,\
    org.netbeans.modules.websvc.saas.services.zvents,\
    org.netbeans.modules.websvc.saas.ui,\
    org.openidex.util
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 by right-clicking it and choosing "Clean and Build".
                        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>
                    <br/>
                    <p><img alt=""  src="../images/tutorials/porting/73/age0.png"/></p>
                    <br/>
                    <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>
                    <br/>
                    <p><img alt=""  src="../images/tutorials/porting/73/age1.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>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><a href="http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/netbeans/api/actions/Savable.html">Savable</a></tt>, which gives
            the user a way to store the text typed in the text field. By offering the
            <tt>Savable</tt> when changes are made in the text field, the Save button
            and the Save menu item under the File menu and the shortcuts for invoking
            the Save action 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>Savable</code>, is available. In this case,
            we will make the <code>Savable</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 extension of the <code><a href="http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/netbeans/spi/actions/AbstractSavable.html">AbstractSavable</a></code>, somewhere
                    within the <code>AnagramTopComponent</code> class:

                    <pre class="examplecode">class MySavable extends AbstractSavable {
    private final Object obj;
    public MySavable(Object obj) {
        this.obj = obj;
        register();
    }
    @Override
    protected String findDisplayName() {
        return "My name is " + obj.toString(); // get display name somehow
    }
    @Override
    protected void handleSave() throws IOException {
        // save 'obj' somehow
        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.
        }
    }
    @Override
    public boolean equals(Object other) {
        if (other instanceof MySavable) {
            return ((MySavable)other).obj.equals(obj);
        }
        return false;
    }
    @Override
    public int hashCode() {
        return obj.hashCode();
    }
}</pre>

                    <p class="tips">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);
    }
    @Override
    public void removeUpdate(DocumentEvent arg0) {
        fire(true);
    }
    @Override
    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>Savable</code>:</p>


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

                <li><p>Next, at the end of the constructor, we instantiate the <code>Savable</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 MySavable(guessedWord.getText());

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>Savable</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 Savable implementation
        //to the InstanceContent, which
        //is in the Lookup of the TopComponent:
        ic.add(impl);
    } else {
        //Otherwise, we remove the Savable
        //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%208.0%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>
