<!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>Selection Management Tutorial for 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="indexed" content="y"/>
        <meta name="description"
              content="A short guide to managing selection."/>
        <!--      Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. -->
        <!--     Use is subject to license terms.-->
    </head>
    <body>
        <h1>NetBeans Selection Management Tutorial I&#8212;Using a TopComponent's Lookup</h1>

        <p>This tutorial covers how to write components that provide a &quot;selected
            object&quot; and how to write components that update themselves as the global
            selection changes.</p>

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

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

        <p><img src="../images/articles/74/netbeans_stamp_74_73_72.png" class="stamp" width="114" height="114" alt="Content on this page applies to NetBeans IDE 7.3" title="Content on this page applies to NetBeans IDE 7.3"/></p>
        <ul class="toc">
            <li><a href="#intro">Introduction to Selection</a></li>
            <li><a href="#setup">Creating the NetBeans Platform Application Project</a></li>
            <li><a href="#createapi">Creating an API and Setting Up Dependencies</a></li>
            <li><a href="#creating-the-viewer-component">Creating the Viewer Component</a></li>
            <li><a href="#creating-the-editor-component">Creating the Editor Component</a></li>
            <li><a href="#running">Running the Code</a></li>
            <li><a href="#the-point">So, What's the Point?</a></li>
            <li><a href="#change-on-the-fly">Changing Selected Objects on the Fly</a></li>
            <li><a href="#multiple-objects">Providing More Than One Object</a></li>
            <li><a href="#next-steps">Next Steps</a></li>
        </ul>

        <p><b>To follow this tutorial, you need the software and resources listed in the following 
                table.</b></p>

        <table>
            <tbody>
                <tr>
                    <th class="tblheader" scope="col">Software or Resource</th>
                    <th class="tblheader" scope="col">Version Required</th>
                </tr>
                <tr>
                    <td class="tbltd1"><a href="https://netbeans.org/downloads/index.html">NetBeans IDE</a></td>
                    <td class="tbltd1">version 7.3 or above</td>
                </tr>
                <tr>
                    <td class="tbltd1"><a href="http://java.sun.com/javase/downloads/index.jsp">Java Developer Kit (JDK)</a></td>
                    <td class="tbltd1">version 7 or above</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/7.3/tutorials/selection-management/1-of-4/EventManager">completed tutorial source code</a>.</p>

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

        <p>&quot;Selection&quot; is an important concept for any non-trivial 
            application.  NetBeans has two basic concepts of selection&#8212;the contents of
            the focused <code>
                <a href="http://wiki.netbeans.org/wiki/view/DevFaqWindowsTopComponent">TopComponent</a></code>'s
            <code><a href="http://wiki.netbeans.org/wiki/view/DevFaqLookup">Lookup</a></code>, and
            the focused <code>TopComponent</code>'s <a href="http://wiki.netbeans.org/wiki/view/DevFaqWhatIsANode">
                activated <code>Node</code>(s)</a>.  Here you will deal only with the <tt>Lookup</tt>
            portion of selection&#8212;doing more advanced things will be covered in a later
            tutorial in this four part series.</p>

        <p>Selection is used to make possible such things as context sensitive 
            actions (actions that are enabled or disabled depending on what is displayed),
            and palette windows such as the Property Sheet or Navigator components in 
            the IDE, which each display some aspect of whatever is selected.</p>

        <p>Basically, each <code>TopComponent</code> has a bag of objects that it can put things
            into, and which other code is able to query.  That bag of objects is its 
            <i>Lookup</i>&#8212;essentially a Map where the keys are class objects and the
            values are objects that extend or implement the key-class.  The thing that
            makes this approach tremendously useful is the ability to use this mechanism
            to decouple the components that provide some object and the components that
            consume those objects&#8212;so they can be implemented in separate modules, or
            new editors for old objects can be provided and the rest of the system will
            continue to work transparently.</p>

        <!-- ===================================================================================== -->
        <h2 class="tutorial"><a name="setup"></a>Creating the NetBeans Platform Application Project</h2>

        <p>The loosely-coupled modular example used in this tutorial will contain three modules constituting a NetBeans Platform application,
            as illustrated below:</p>  
        <p>
            <img src="../images/tutorials/selection-1/73/result-1.png" alt="projects window showing setup" />
        </p>

        <p>Start by
            creating the NetBeans Platform application that
            will contain all three modules:</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:</p>

                    <p>
                        <img src="../images/tutorials/selection-1/73/new-app-1.png" alt="new app, first panel" />
                    </p>

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

                <li><p>In the Name and Location panel, type <tt>EventManager</tt> in Project Name.
                        Change the Project Location to any directory on your computer:</p>
                    <p>
                        <img src="../images/tutorials/selection-1/73/new-app-2.png" alt="new app, second panel" />
                    </p>

                    <p>Click Finish.</p>

                    <p>You now have a NetBeans Platform application project, which is the container
                        for the modules that you will be creating throughout this tutorial:</p>

                    <p>
                        <img src="../images/tutorials/selection-1/73/new-app-3.png" alt="new app, third panel" />
                    </p>

                    <p>Via the configuration files shown in the screenshot above, the NetBeans
                        Platform application project provides a set of pre-defined modules, such as
                        modules that give your application a window system and an action system. The configuration
                        files also
                        sets up the application to be built via the Ant build system. In the next
                        steps, you will be adding three custom modules to the application. The first module will provide an API
                        class, while the other two will share that API module between them. That will ensure
                        that the other two modules do not depend on each other, making them loosely coupled. More
                        on this will become clear as you work through this tutorial.</p>

                </li>

                <li><p>Choose File &gt; New Project (Ctrl-Shift-N) again.   
                        Under Categories, select NetBeans Modules. Under Projects,
                        select Module:</p>

                    <p>
                        <img src="../images/tutorials/selection-1/73/new-mod-1.png" alt="new module, first panel" />
                    </p>

                    <p>Click Next.</p>
                    <p>(Alternatively, expand the "EventManager"
                        project node, right-click the "Modules" node, and then choose "Add New".)</p>
                </li>


                <li><p>In the Name and Location panel, type <tt>MyAPI</tt> in Project Name.
                        Now look at the Project Location field and the Project Folder field.
                        As you can see, the default in the wizard is to create the module within the
                        directory where you just created the "EventManager" application, which means that
                        the module's sources will be organized within the folder where the application
                        is defined. That is the standard way to organize NetBeans Platform application sources.</p>
                    <p>
                        <img src="../images/tutorials/selection-1/73/new-mod-2.png" alt="new module, first panel" />
                    </p>

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

                <li><p>In the Basic Module Configuration panel, set the
                        following values:</p>

                    <p></p><ul>
                        <li><b>Code Name Base.</b> The code name base is a string that
                            uniquely identifies a module. By convention, the value of the code name base is the main
                            package of the module. Therefore, if the main
                            package of your module is going to be "org.me.foo", then that would
                            normally also be the value of the code name base of the module.
                            In this case, since the base package will be "org.myorg.myapi",
                            set the code name base to <tt>org.myorg.myapi</tt>. That will
                            be the string used to identify the module, so that that will also
                            be the string used by other modules that will need to make use of
                            code within this module.</li>
                        <li><b>Module Display Name.</b> Set the module display name to <tt>My API</tt>. That
                            is the text you will see displayed for the module in the Projects window in the IDE.</li>
                        <li><b>Localizing Bundle.</b> Leave the location of the localizing bundle,
                            so that localization keys/values will be stored in the
                            main package, with the name <tt>org/myorg/myapi</tt>. </li>
                        <li><b>Generate OSGi Bundle.</b> Two module systems are supported by the NetBeans Platform,
                            the NetBeans module system and the OSGi framework. Depending on your business
                            requirements, select the module system of your choice. We will use the default module
                            system in this tutorial, that is, the NetBeans module system. </li>

                    </ul>

                    <p>The result should be as follows:</p>

                    <p>
                        <img src="../images/tutorials/selection-1/73/new-mod-3.png" alt="new module, third panel" />
                    </p>

                    <p>Click Finish.</p></li>

                <li><p>You're going to create two more modules now&#8212;follow step 3, 4, and 5
                        above, twice, using the names &quot;MyEditor&quot; (code name base <tt>org.myorg.myeditor</tt>)
                        and &quot;MyViewer&quot; (code name base <tt>org.myorg.myviewer</tt>).</p>
                    <p>At the end of this step, the structure of the application should be as follows:</p>
                    <p>
                        <img src="../images/tutorials/selection-1/73/result-1.png" alt="projects window showing setup" />
                    </p>
                    <p>The reason you are creating three modules in the application is that you are creating a modular
                        application, where the viewer and editor modules will be loosely coupled
                        from each other, only sharing the API module between them. The usefulness
                        of this approach will become clearer as you continue with this tutorial.</p></li>

            </ol>

        </div>

        <h2 class="tutorial"><a name="createapi"></a>Creating an API and Setting Up Dependencies</h2>

        <p>What you're going to do here is create a trivial API class.  In the real world,
            such an API might represent files or some other kind of data that is being
            modelled programmatically.  For the purposes of this tutorial it will suffice
            to have a simple object named "Event", representing a random event, possibly an event such as a calendar event
            or an event within a programmatic sequence. An Event has an index, providing a unique identifier, and a date.</p>

        <div class="indent">

            <ol><li><p>Right click the <code>org.myorg.myapi</code> package and choose 
                        New &gt; Java Class. Name the class <code>Event</code> and click Finish.
                        Replace the default code with the following:</p>
                    <pre class="examplecode">package org.myorg.api;

import java.util.Date;

public final class Event {

    private final Date date = new Date();
    private static int count = 0;
    private final int index;

    public Event() {
        index = count++;
    }

    public Date getDate() {
        return date;
    }

    public int getIndex() {
        return index;
    }

    @Override
    public String toString() {
        return index + " - " + date;
    }

}</pre>    
                    This will be all of the code that this module contains.  As you can see,
                    each time a new instance of <code>Event</code> is created, a counter
                    is incremented&#8212;so there will be some unique identifier to each instance
                    of <code>Event</code>.
                </li>
                <li><p>The next step is to have your API module export the <code>org.myorg.myapi</code>
                        package so other modules can see the Event class in it. By default, all
                        packages are hidden from all other modules in the application.
                        Right click the My API project
                        and choose Properties. In the API Versioning page
                        in the Project Properties dialog box, check the
                        checkbox for <code>org.myorg.myapi</code> in the
                        Public Packages list, as shown below:</p>
                    <p>
                        <img alt="api versioning tab"  src="../images/tutorials/selection-1/73/export-package-1.png"/>
                    </p>

                    <p>Click OK. Now expand the Important Files
                        node and open the Project Metadata file. On disk,
                        this file is named <code>project.xml</code>. Inside this
                        file, notice the following section, which was
                        added when you clicked OK in the dialog above:</p>
                    <pre class="examplecode">
&lt;public-packages&gt;
    &lt;package&gt;org.myorg.myapi&lt;/package&gt;
&lt;/public-packages&gt;</pre>
                    <p>When the module is compiled, the information above
                        in the <code>project.xml</code> file is added to the module's
                        manifest file.</p>
                </li>

                <li>
                    Now you need to set up some dependencies between your modules.  The other two
                    modules, My Editor and My Viewer, will use the 
                    <code>Event</code> class, so each of them needs to
                    say that they <i>depend on</i> the API module.  
                    For each of these two modules in turn,
                    right-click the project node and choose Properties.
                    In the Libraries page of the Project
                    Properties dialog box of both My Editor and My Viewer, click the Add Dependency
                    button.  In the dialog box that pops up, 
                    type <code>Event</code>&#8212;there 
                    should be only one match, which is your API module.  
                    Select it and click
                    OK to add the dependency. You should see the following:</p>
                    <p>
                        <img src="../images/tutorials/selection-1/73/export-package-2.png" alt="adding a dependency"/>
                    </p>

                    <p>Click OK. When you open the Project Metadata file
                        in the Important Files node of the My Editor
                        module and the My Viewer module, you should
                        see that the section below has been added:</p>

                    <pre class="examplecode">&lt;module-dependencies&gt;
    &lt;dependency&gt;
        &lt;code-name-base&gt;org.myorg.myapi&lt;/code-name-base&gt;
        &lt;build-prerequisite/&gt;
        &lt;compile-dependency/&gt;
        &lt;run-dependency&gt;
            &lt;specification-version&gt;1.0&lt;/specification-version&gt;
        &lt;/run-dependency&gt;
    &lt;/dependency&gt;
&lt;/module-dependencies&gt;</pre>
                    <p>Notice that the code name base of the MyAPI module is used
                        to identify it here. When the module is compiled, the information above
                        in the <code>project.xml</code> file is added to the module's
                        manifest file. In the Projects window, the new contract between
                        the modules is represented as follows:</p>
                    <p>
                        <img src="../images/tutorials/selection-1/73/result-2.png" alt="adding a dependency"/>
                    </p>
                </li>

            </ol>

        </div>

        <h2><a name="creating-the-viewer-component"></a>Creating the Viewer Component</h2>

        <p>Now you will create a singleton component that will track if there is an
            <code>Event</code> available in the global selection (i.e., if the 
            focused <code>TopComponent</code> has one in its Lookup).  If there is one, it will display
            some data about it.  One common use case for this sort of thing is creating
            master/detail views.</p>

        <div class="indent">

            <h3><a name="generate-tc"></a>Generating a Singleton TopComponent</h3>

            <p>A &quot;singleton component&quot; is a component like the Projects window in the
                NetBeans IDE, or the Property Sheet or the Navigator&#8212;a component that
                there is only ever one of in the system.  The Window wizard
                will automatically generate all of the code needed to create such
                a singleton component&#8212;you just have to use the form designer or write code
                to provide the contents of your singleton component.</p>

            <div class="indent">

                <ol>
                    <li>Right click the <code>org.myorg.myviewer</code> package and choose
                        New &gt; Other. In the resulting dialog, select Module Development &gt;
                        Window, as shown below:</p>
                        <p>
                            <img src="../images/tutorials/selection-1/73/new-win-1.png" alt="adding a dependency"/>
                        </p>
                        <p>Click Next (or press Enter).</li>
                    <li><p>On the &quot;Basic Settings&quot; page of the wizard, 
                            select <code>explorer</code> as the
                            location in which to place your viewer component, and check the 
                            checkbox to cause the window to open on startup,
                            as shown below:</p>  
                        <p>
                            <img src="../images/tutorials/selection-1/73/new-win-2.png" alt="new window wizard" />
                        </p>
                    </li>
                    <li><p>Click Next to continue to the &quot;Name, Icon and Location&quot;
                            page of the wizard. Set <code>MyViewer</code> as the class name prefix:</p>
                        <p>
                            <img src="../images/tutorials/selection-1/73/new-win-3.png" alt="new window wizard" />
                        </p>
                    </li>
                    <li><p>Click Finish and you should see the following:</p>
                        <p>
                            <img src="../images/tutorials/selection-1/73/new-win-4.png" alt="new window wizard" />
                        </p>
                    </li>
                    <li>
                        <p>You now have a skeleton <code>TopComponent</code>&#8212;a singleton component called
                            <code>MyViewerTopComponent</code>. Open the <code>MyViewerTopComponent</code> file and click its Source tab.
                            Via the annotations that you can see at the top
                            of the Java source file, <code>MyViewerTopComponent</code> will be registered in
                            the layer file of the MyViewer
                            module, together with an <code>Action</code> for opening the <code>MyViewerTopComponent</code>
                            from the Window menu:</p>

                        <pre class="examplecode">@<a href="http://bits.netbeans.org/dev/javadoc/org-openide-windows/org/openide/windows/TopComponent.Description.html">TopComponent.Description</a>(
    preferredID = "MyViewerTopComponent",
    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 = "explorer", 
    openAtStartup = true)
@<a href="http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/openide/awt/ActionID.html">ActionID</a>(
    category = "Window", 
    id = "org.myorg.myviewer.MyViewerTopComponent")
@<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_MyViewerAction",
    preferredID = "MyViewerTopComponent")</pre></li>

                </ol>


            </div>

            <div class="indent">

                <h3><a name="publish-tc"></a>Creating a Context Sensitive TopComponent</h3>

                <p>Open the <code>MyViewerTopComponent</code> file and click its Design tab&#8212;the
                    "Matisse" GUI Builder (also known as the "form editor") opens.
                    You will add two labels to the component, which will display some information
                    about the selected <code>Event</code> if there is one.</p>

                <div class="indent">

                    <ol>
                        <li><p>Drag two JLabels to the form from the Palette (Ctrl-Shift-8), one 
                                below the other, as shown below:</p>
                            <p>
                                <img alt="" src="../images/tutorials/selection-1/73/new-sel-1.png"/>
                            </p>
                            <p>Press F2 on the first label and
                                then change the text as shown above, so that by default it
                                displays "[nothing selected]".</p>
                        </li>
                        <li>Click the Source button in the editor toolbar to switch to the 
                            code editor. Modify the signature of the class, so that <code>MyViewerTopComponent</code>
                            implements <code>LookupListener</code>:
                            <pre class="examplecode">
public class MyViewerTopComponent extends TopComponent implements LookupListener {
                            </pre>        
                            <p>Right-click in the editor and choose Fix Imports, so that
                                <code>LookupListener</code> is imported. Put the caret in the signature line as shown below. A lightbulb glyph
                                should appear in the editor margin. Press Alt-Enter, and then Enter again
                                when the popup appears with the text &quot;Implement All Abstract Methods&quot;.
                                This will add the <code>LookupListener</code>'s method to your class:</p>
                            <p>
                                <img alt="implement methods" src="../images/tutorials/selection-1/implement-methods.png"/>
                            </p>

                            <p>You now have a class that implements <code>LookupListener</code>. Now it needs
                                something to listen to.  In your case, there is a convenient global <code>Lookup</code>
                                object, which proxies the Lookup of whatever component has focus&#8212;it
                                can be obtained from the call <code>Utilities.actionsGlobalContext()</code>.
                                So rather than tracking what component has focus yourself, you can
                                listen to this one global selection <code>Lookup</code>, which will fire appropriate
                                changes whenever focus changes. </p>
                        </li>

                        <li>
                            <p>Edit the source code of the <code>MyViewerTopComponent</code> so that its
                                <code>componentOpened</code>, <code>componentClosed</code>,
                                and <code>resultChanged</code> methods are as follows:</p>

                            <pre class="examplecode">
    private Lookup.Result&lt;Event&gt; result = null;

    @Override
    public void componentOpened() {
        result = Utilities.actionsGlobalContext().lookupResult(Event.class);
        result.addLookupListener (this);
    }
    
    @Override
    public void componentClosed() {
        result.removeLookupListener(this);
    }
    
    @Override
    public void resultChanged(LookupEvent lookupEvent) {
        Collection&lt;? extends Event&gt; allEvents = result.allInstances();
        if (!allEvents.isEmpty()) {
            Event event = allEvents.iterator().next();
            jLabel1.setText(Integer.toString(event.getIndex()));
            jLabel2.setText(event.getDate().toString());
        } else {
            jLabel1.setText("[no selection]");
            jLabel2.setText("");
        }
    }
                            </pre>
                            <ul>
                                <li><code>componentOpened()</code> is called whenever the component is
                                    made visible by the window system;  <code>componentClosed()</code> is
                                    called whenever the user clicks the X button on its tab to close it.
                                    So whenever the component is showing, you want it to be tracking the 
                                    selection&#8212;which is what the above code does.</li>

                                <li>The <code>resultChanged()</code> method is your implementation of
                                    <code>LookupListener</code>.  Whenever the selected <code>Event</code>
                                    changes, it will update the two <code>JLabel</code>s you put on the form.</li>
                            </ul>
                            <p>The required import statements for the <code>MyViewerTopComponent</code> are
                                as follows:</p>

                            <pre class="examplecode">import java.util.Collection;
import org.myorg.myapi.Event;
import org.netbeans.api.settings.ConvertAsProperties;
import org.openide.awt.ActionID;
import org.openide.awt.ActionReference;
import org.openide.util.*;
import org.openide.windows.TopComponent;</pre>

                        </li>

                    </ol>

                </div>
            </div>

            <h2><a name="creating-the-editor-component"></a>Creating the Editor Component</h2>

            <p>Now you need something to actually provide instances of <code>Event</code>,
                for this code to be of any use.  Fortunately this is quite simple.</p>

            <p>You will create another <code>TopComponent</code>, this time, one that opens
                in the editor area and offers an instance of <code>Event</code> from
                its <code>Lookup</code>.  You <i>could</i> use the Window template
                again, but that template is designed for creating singleton components, rather
                than components there can be many of.  So you will simply create a <code>TopComponent</code>
                subclass without the template, and an action which will open additional ones.</p>

            <div class="indent">

                <ol>

                    <li>You will need to add four dependencies to the My Editor module for
                        it to be able to find the classes you will be using.  Right click the My Editor
                        project and choose Properties.  On the Library page
                        of the Project Properties
                        dialog box, click the Add Dependency button, and type <code>TopComponent</code>.  The
                        dialog should automatically suggest setting a dependency on the 
                        Window System API.  Do the same thing for <code>Lookups</code> (Lookup
                        API). Also set a dependency on the Utilities API, as well the UI Utilities API, which provide
                        various helpful supporting classes that are made available by the
                        NetBeans Platform.</li>

                    <li>Right-click the <code>org.myorg.myeditor</code> package in the 
                        My Editor project, and choose New &gt; JPanel Form.</li>

                    <li>Name it &quot;MyEditor&quot;, and finish the wizard.</li>

                    <li>When the form editor opens, drop two JTextFields on the form,
                        one above the other.  On the property sheet, set the Editable property
                        (checkbox) to <code>false</code> for each one.</li>

                    <li>Click the Source button in the editor toolbar to switch to the code editor.</li>

                    <li>Change the signature of <code>MyEditor</code> to extends <code>TopComponent</code>
                        instead of <code>javax.swing.JPanel</code> and annotate the class to specify the
                        location of the window and the menu item for opening it:
                        <pre class="examplecode">@<a href="http://bits.netbeans.org/dev/javadoc/org-openide-windows/org/openide/windows/TopComponent.Description.html">TopComponent.Description</a>(
        preferredID = "MyEditorTopComponent",
        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 = "org.myorg.myeditor.MyEditorTopComponent")
@<a href="http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/openide/awt/ActionReference.html">ActionReference</a>(
        path = "Menu/Window")
@<a href="http://bits.netbeans.org/dev/javadoc/org-openide-windows/org/openide/windows/TopComponent.OpenActionRegistration.html">TopComponent.OpenActionRegistration</a>(
        displayName = "#CTL_MyEditorAction")
@<a href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/NbBundle.Messages.html">NbBundle.Messages</a>({
    "CTL_MyEditorAction=MyEditor"
})

public class MyEditor extends TopComponent {</pre>
                    </li>

                    <li>Add the following code to the constructor of <code>MyEditor</code>, after
                        the <tt>initComponents()</tt> statement:
                        <pre class="examplecode">Event obj = new Event();
associateLookup(Lookups.singleton(obj));
jTextField1.setText ("Event #" + obj.getIndex());
jTextField2.setText ("Created: " + obj.getDate());
setDisplayName ("MyEditor " + obj.getIndex());</pre></li>
                    <li><p>Right-click in the editor
                            and choose Fix Imports, which should result in the following
                            import section at the top of your class:
                            <pre class="examplecode">import org.myorg.myapi.Event;
import org.openide.awt.ActionID;
import org.openide.awt.ActionReference;
import org.openide.util.lookup.Lookups;
import org.openide.windows.TopComponent;</pre>   </p>             
                    </li>

                </ol>
            </div>
        </div>

        <p>The line
            <code>associateLookup(Lookups.singleton(obj));</code>
            will create a <code>Lookup</code> that contains only one object&#8212;the new
            instance of <code>Event</code>&#8212;and assign that <code>Lookup</code>
            to be what is returned by <code>MyEditor.getLookup()</code>.  
            While this is an artificial example,
            you can imagine how <code>Event</code> might represent a file, an entity in a 
            database, or anything else you might want to edit or view.  Probably you
            can also imagine one component that allows you to select or edit multiple
            unique instances of <code>Event</code>&#8212;that will be the subject of the
            next tutorial.</p>

        <p>To make your editor component at least somewhat interesting (though it
            doesn't actually edit anything), you set the text
            fields' values to values from the <code>Event</code>, so you have
            something to display.</p>

        <h2><a name="running"></a>Running the Code</h2>

        <p>Now you're ready to run the tutorial.  Simply right click <code>EventManager</code>,
            the application which contains your three modules, and choose Run from the popup
            menu.  When the IDE opens, simply choose Window &gt; Open Editor&#8212;invoke your
            action.  Do this a couple of times, so that there are several of your editor
            components open.  Your singleton <code>MyViewer</code> window should also be open.  Notice how
            the <code>MyViewer</code> window's contents change as you click different tabs,
            as shown here:</p>

        <p>
            <img alt="selection" src="../images/tutorials/selection-1/73/result-3.png"/>
        </p>

        <p>If you click in the Viewer window, notice
            that the text changes to &quot;[No Selection]&quot;, as shown below:</p>

        <p>
            <img alt="no selection" src="../images/tutorials/selection-1/73/result-4.png"/>
        </p>
        <p class="notes">
            <b>Note:</b> If you do not see the <code>MyViewer</code> window, you probably did not check
            the checkbox in the wizard to open it on system start&#8212;simply go to the 
            Window menu and choose MyViewer to display it.</p>

        <h2><a name="the-point"></a>So, What's the Point?</h2>

        <p>You might be wondering what the point of this exercise is&#8212;you've just shown that
            you can handle selection&#8212;big deal!  The key to the importance of this is the
            way the code is split into three modules&#8212;the My Viewer module knows nothing
            about the My Editor module&#8212;either one can run by itself.  They only share a 
            common dependency on My API.  That's important&#8212;it means two things:  1.  My Viewer
            and My Editor can be developed and shipped independently, and 2.  Any module that
            wants to provide a different sort of editor than My Editor can do so, and the viewer
            component will work perfectly with it, as long as the replacement editor offers an instance of 
            <code>Event</code> from its Lookup.</p>

        <p>To really picture the value of this, imagine <code>Event</code> were something
            much more complex;  imagine that <code>MyEditor</code> is an image editor, and <code>
                Event</code> represents an image being edited.  The thing that's powerful here is
            that you could replace <code>MyEditor</code> with, say, an SVG vector-based editor,
            and the viewer component (presumably showing attributes of the currently edited image)
            will work transparently with that new editor.  It is this model of doing things
            that is the reason you can add new tools into the NetBeans IDE that work against Java
            files, and they will work in different versions of NetBeans, and that you can have
            an alternate editor (such as the form editor) for Java files and all the components
            and actions that work against Java files still work when the form editor is used.</p>

        <p>This is very much the way NetBeans works with Java and other source files&mdash;in
            their case, the thing that is available from the editor's Lookup is a
            <code><a href="http://wiki.netbeans.org/wiki/view/DevFaqDataObject">DataObject</a></code>,
            and components like Navigator and the Property Sheet are simply watching what object is
            being made available by the focused <code>TopComponent</code>.</p>

        <p>Another valuable thing about this approach is that often people are migrating
            existing applications to the NetBeans Platform.  The object that is part of the
            data model, in that case, is probably existing, working code that should not
            be changed in order to integrate it into NetBeans.  By keeping the data model's
            API in a separate module, the NetBeans integration can be kept separate from
            the core business logic.</p>

        <h2><a name="change-on-the-fly"></a>Changing Selected Objects on the Fly</h2>

        <p>To make it really evident how powerful this approach can be, you'll take one more step,
            and add a button to your editor component that lets it replace the <code>Event</code>
            it has with a new one on the fly.</p>

        <div class="indent">

            <ol>
                <li>Open <code>MyEditor</code> in the form editor (click the Design toolbar
                    button in the editor toolbar), and drag a <code>JButton</code> to it.</li>

                <li>Set the <code>text</code> property of the JButton to &quot;Replace&quot;.</li>

                <li>Right click the <code>JButton</code> and choose Events &gt; Action &gt; actionPerformed.
                    This will cause the code editor to open with the caret in an event handler method.
                </li>

                <li>At the head of the class definition, you will add one final field:
                    <pre class="examplecode">
public class MyEditor extends TopComponent {

    private final InstanceContent content = new InstanceContent();</pre>
                    <a href="http://bits.netbeans.org/dev/javadoc/org-openide-util-lookup/org/openide/util/lookup/InstanceContent.html">InstanceContent</a>
                    is a class which allows us to modify the content of a Lookup
                    (specifically an instance of <code>AbstractLookup</code>) on the fly.
                </li>
                <li>Copy all of the lines you added earlier to the constructor to the clipboard,
                    and delete them from the constructor, except for the line beginning
                    &quot;associateLookup...&quot;.  That line of the constructor should be changed as follows:
                    <pre class="examplecode">
associateLookup (new AbstractLookup (content)); </pre>
                </li>
                <li>You will be using the lines that you put on the clipboard in the action
                    handler for the JButton&#8212;so you should run this code once when you first
                    initialize the component.  Add the following line to the constructor, after
                    the line above:
                    <pre class="examplecode">
jButton1ActionPerformed (null);</pre>
                </li>
                <li>Modify the event handler method so it appears as follows, pasting
                    from the clipboard and adding the line at the end:
                    <pre class="examplecode">
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    Event obj = new Event();
    jTextField1.setText ("Event #" + obj.getIndex());
    jTextField2.setText ("Created: " + obj.getDate());
    setDisplayName ("MyEditor " + obj.getIndex());
    content.set(Collections.singleton (obj), null);
}</pre>
                </li>
                <li>Right-click in the editor
                    and choose Fix Imports.</li>
            </ol>

        </div>

        <p>You're now ready to run the Event Manager again.  Right click EventManager again and
            choose Run.  Notice how, now, when you click the Replace button, all of the
            components update, including the instance of <code>MyViewer</code>&#8212;everything.</p>

        <p>
            <img alt="controlling selection" src="../images/tutorials/selection-1/73/result-5.png"/>
        </p>

        <h2><a name="multiple-objects"></a>Providing More Than One Object</h2>

        <p>This is all well and good for decoupling, but isn't providing this one object
            from your component a bit like having a <code>Map</code> that only contains
            one key and one value?  The answer is, yes, it is like that.  Where this technique becomes
            even more powerful is when you provide multiple objects from multiple APIs.</p>

        <p>As an example, it is very common in NetBeans to provide context sensitive
            actions.  A case in point is the built-in <code>SaveAction</code> that is part
            of NetBeans' Actions API.  What this action actually does is, it simply listens
            for the presence of something called <code>SaveCookie</code> on the global context&#8212;the
            same way your viewer window listens for <code>Event</code>.  If a <code>SaveCookie</code>
            appears (editors typically add one to their Lookup when the content of the file
            is modified but not yet saved), the action becomes enabled, so the Save toolbar
            button and menu items become enabled.  When the Save action is invoked, it calls
            <code>SaveCookie.save()</code>, which in turn causes the <code>SaveCookie</code> to
            disappear, so the Save action then becomes disabled until a new one appears.</p>

        <p>So the pattern in practice is to provide more than just a single object from
            your component's <code>Lookup</code>&#8212;different auxilliary components and different
            actions will be interested in different aspects of the object being edited.  These
            aspects can be cleanly separated into interfaces which those auxilliary components
            and actions can depend on and listen for.</p>

        <div class="feedback-box"><a href="https://netbeans.org/about/contact_form.html?to=3&amp;subject=Feedback:%20Selection%207.3%20Tutorial%20Part%201%20">Send Us Your Feedback</a></div>

        <h2><a name="next-steps"></a>Next Steps</h2>

        <p>By now you may have noticed that some components have more granular selection logic,
            and even involve multiple selection.  In the <a href="nbm-selection-2.html">
                next tutorial</a> you will cover how to use
            the <a href="https://netbeans.org/download/dev/javadoc/org-openide-nodes/overview-summary.html">Nodes API</a> to handle that.</p>

    </body>

</html>
