<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <!-- -*- xhtml -*- -->
        <title>NetBeans Selection Management Tutorial for NetBeans Platform 7.1</title>
        <link rel="stylesheet" type="text/css" href="https://netbeans.org/netbeans.css"/>
        <meta name="AUDIENCE" content="NBUSER"/>
        <meta name="TYPE" content="ARTICLE"/>
        <meta name="EXPIRES" content="N"/>
        <meta name="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.1 and
            NetBeans IDE 7.1. If you
            are using an earlier version, see <a href="../70/nbm-selection-1.html">the previous version
                of this document</a>.</p>

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

        <p><img src="../../images/articles/71/netbeans-stamp.png" class="stamp" width="114" height="114" alt="Content on this page applies to NetBeans IDE 7.1" title="Content on this page applies to NetBeans IDE 7.1"/></p>
        <ul class="toc">
            <li><a href="#intro">Introduction to 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.1 or above</td>
                </tr>
                <tr>
                    <td class="tbltd1"><a href="http://java.sun.com/javase/downloads/index.jsp">Java Developer Kit (JDK)</a></td>
                    <td class="tbltd1">version 6 or above</td>
                </tr>
            </tbody>
        </table>

        <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/71/project-setup-71.png" alt="projects window showing setup" />
        </p>

        <p>Start by
            creating the NetBeans Platform application that
            will contain all three modules:</p>

        <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/71/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/71/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/71/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/71/new-module-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/71/new-module-1a.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/71/new-module-2.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/71/project-setup-71.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>

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

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

            <li><p>In the API Versioning page
                    in the Project Properties dialog box, check the
                    checkbox for <code>org.myorg.api</code> in the
                    Public Packages list, shown below:</p>
                <p>
                    <img alt="api versioning tab"  src="../../images/tutorials/selection-1/71/export-package-71.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.
            </li>

            <li>
                <p>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/71/add-deps-71.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.</p>
            </li>

        </ol>

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

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

        <ol>
            <li>Right click the <code>org.myorg.myviewer</code> package and choose
                New &gt; Other.</li>
            <li>In the resulting dialog, select Module Development &gt;
                Window and 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/71/new-window-71.png" alt="new window wizard" />
                </p>
            </li>
            <li>Click Next to continue to the &quot;Name, Icon and Location&quot;
                page of the wizard.</li>
            <li>On the following page, name the class <code>MyViewer</code> and
                click Finish (or press Enter).</li>
        </ol>

        <p>You now have a skeleton <code>TopComponent</code>&#8212;a singleton component called
            <code>MyViewerTopComponent</code>. 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">@TopComponent.Description(preferredID = "MyViewerTopComponent",
//iconBase="SET/PATH/TO/ICON/HERE", 
persistenceType = TopComponent.PERSISTENCE_ALWAYS)
@TopComponent.Registration(mode = "explorer", openAtStartup = true)
@ActionID(category = "Window", id = "org.myorg.myviewer.MyViewerTopComponent")
@ActionReference(path = "Menu/Window" /*
 * , position = 333
 */)
@TopComponent.OpenActionRegistration(displayName = "#CTL_MyViewerAction",
preferredID = "MyViewerTopComponent")</pre>
        
        <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>

        <ol>
            <li><p>Drag two JLabels to the form from the Palette (Ctrl-Shift-8), one 
                    below the other.</p>
                <p>
                    <img alt="" src="../../images/tutorials/selection-1/viewer-form-editor.png"/>
                </p>
                <p>Change the text of the first 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</li>
            <li>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>        
            </li>
            <li>Right-click in the editor and choose Fix Imports, so that
                <code>LookupListener</code> is imported.</li>

            <li><p>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 LookupListener method to your class:</p>
                <p>
                    <img alt="implement methods" src="../../images/tutorials/selection-1/implement-methods.png"/>
                </p>
            </li>

            <li>
                <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 Lookup
                    object, which simply 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 simply
                    listen to this one global selection lookup, which will fire appropriate
                    changes whenever focus changes. </p>

                <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);
        result = null;
    }
    
    @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>

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

        <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">
@TopComponent.Description(preferredID = "MyEditorTopComponent", 
persistenceType = TopComponent.PERSISTENCE_NEVER)
@TopComponent.Registration(mode = "explorer", openAtStartup = false)
@TopComponent.OpenActionRegistration(displayName = "#CTL_MyEditorAction")
@ActionID(category = "Window", id = "org.myorg.myviewer.MyEditorTopComponent")
@ActionReference(path = "Menu/Window")

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

             <li>As indicated by the "displayName" attribute above,
                 in the <code>Bundle.properties</code> file you need to define this key/value pair:

<pre class="examplecode">
CTL_MyEditorAction=Open Editor
</pre></li>
            <li>Add the following code to the constructor of <code>MyEditor</code>:
                <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>
                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>                
            </li>
        </ol>

        <p>The line
            <code>associateLookup (Lookups.singleton (obj));</code>
            will create a Lookup 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 allowed 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/71/result-1-71.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/71/result-2-71.png"/>
        </p>
        <p>
            <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>

        <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>
        <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/71/result-3-71.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.1%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>
