<!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>
        <title>Platform Tutorial for Geospatial Systems</title>
        <meta name="AUDIENCE" content="NBUSER"/>
        <meta name="TYPE" content="ARTICLE"/>
        <link rel="stylesheet" type="text/css" href="https://netbeans.org/netbeans.css"/>
        <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 setting up an geospatial environment
              with the NetBeans Platform."/>
        <!--      Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. -->
        <!--     Use is subject to license terms.-->
    </head>
    <body>

        <h1>NetBeans Platform Tutorial for Geospatial Systems</h1>

        <p>The NetBeans Platform is a solid infrastructure for
            geospatial systems. It provides
            a docking framework with full screen mode, an application frame
            within which a map can be placed, and a loosely coupled module system for
            the organization of code into feature-oriented interdependent plugins.</p>

        <p>In this tutorial, you are shown how to set up a typical
            geospatial application structure, leveraging the central features
            of the NetBeans Platform. You start by creating a new application,
            you add several modules, each representing a feature in
            your geospatial system, you configure the application to start
            up in full screen mode and hide tabs, while you integrate various
            mapping solutions.</p>

        <p>By the end of this tutorial, you will have learned how to
            set up a powerful geospatial application infrastructure and
            configure the NetBeans Platform to optimize it for typical
            geospatial scenarios, while also learning how to integrate a variety
            of map technologies into your NetBeans Platform application,
            such as OpenMap, shown below:</p>

        <p><img alt="openmap" src="../images/tutorials/air/72/openmap-nb-small.png"/></p>

        <p><b>Contents</b></p>

        <p><img src="../images/articles/73/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="#application">Creating the Application</a></li>
            <li><a href="#feature">Creating Features</a></li>
            <li><a href="#map">Integrating Map Technologies</a>
                <ul>
                    <li><a href="#openmap">Scenario 1: OpenMap</a></li>
                    <li><a href="#geotk">Scenario 2: Geotoolkit</a></li>
                </ul>
            </li>
            <li><a href="#publish">Publishing and Subscribing to Objects of Interest</a></li>
            <li><a href="#configure">Configuring the Geospatial System</a>
                <ul>
                    <li><a href="#fullscreen">Starting Up in Full Screen Mode</a></li>
                    <li><a href="#undocked">Starting Up in Undocked Mode</a></li>
                    <li><a href="#tabs">Removing Tabs</a></li>
                </ul>
            </li>
        </ul>

        <p><b>To follow this tutorial, you need the software and resources listed in the following
                table.</b></p>

        <table>
            <tbody>
                <tr>
                    <th class="tblheader" scope="col">Software or Resource</th>
                    <th class="tblheader" scope="col">Version Required</th>
                </tr>
                <tr>
                    <td class="tbltd1"><a href="https://netbeans.org/downloads/index.html">NetBeans IDE</a></td>
                    <td class="tbltd1">version 7.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 6 or above</td>
                </tr>
            </tbody>
        </table>
        <p></p>

        <!-- ===================================================================================== -->

        <h2 class="tutorial"><a name="application"></a>Creating the Application</h2>
        <p>We start by creating a new NetBeans Platform application as a starting
            point for our geospatial system.</p>
        <div class="indent">
            <ol>
                <li><p>Choose File | New Project and then choose NetBeans Modules.
                        Select "NetBeans Platform Application", as shown below:</p>
                    <br/>
                    <p><img src="../images/tutorials/air/73/new-app-1.png" alt="Fig 2"/></p>
                    <br/>
                    <p>Click Next. Name your new application "MyGeospatialSystem" and specify a folder on disk
                        for storing it:</p>
                    <br/>
                    <p><img src="../images/tutorials/air/73/new-app-2.png" alt="Fig 2"/></p>
                    <br/>
                    <p>Click Finish. The new project appears as follows in the Projects window:</p>
                    <br/>
                    <p><img src="../images/tutorials/air/73/new-app-3.png" alt="Fig 2-1"/></p>
                </li>
                <li><p>Right-click the application and choose Run. The application
                        deploys and you should see this:</p>
                    <br/>
                    <p><img alt="create new module" src="../images/tutorials/air/73/new-app-4.png"/></p>
                    <br/>
                    <p>Explore the menus and toolbars to see the available features
                        that are part of your geospatial system out of the box.</p>
                </li>
            </ol>
        </div>
        <p>You have learned how to create a new NetBeans Platform application,
            which is the starting point for your geospatial system.</p>
        <!-- ===================================================================================== -->

        <h2 class="tutorial"><a name="feature"></a>Creating Features</h2>
        <p>Each feature in your application, such as a map feature or a country browser feature,
            will be contained within a NetBeans module. Modulerizing your features in this way
            lets you create multiple different distributions of your software, each consisting
            of a variety of different features provided by different modules. We start by creating
            a new NetBeans module to contain a map feature.</p>
        <div class="indent">
            <ol>
                <li><p>Right-click the Modules node and choose Add New, as shown below:</p>
                    <br/>
                    <p><img src="../images/tutorials/air/73/new-mod-1.png" alt="mod 1"/></p>
                </li>
                <li>
                    <p>Type Map and specify that the module should be stored within the application:</p>
                    <br/>
                    <p><img src="../images/tutorials/air/73/new-mod-2.png" alt="mod 2"/></p>
                    <br/>
                    <p>Click Next.</p>
                </li>
                <li>
                    <p>Type <tt>org.geospatial.map</tt> as the unique identifier for the module:</p>
                    <br/>
                    <p><img src="../images/tutorials/air/73/new-mod-3.png" alt="mod 3"/></p>
                    <br/>
                    <p>Click Finish. You should see that your application has a new module:</p>
                    <br/>
                    <p><img src="../images/tutorials/air/73/new-mod-4.png" alt="mod 4"/></p>
                    <p>You now have the container for a new feature. Next, we're going to
                        add some JARs providing NetBeans APIs to the classpath of the module
                        so that we can begin creating the starting point of our features.</p>
                </li>
                <li>
                    <p>Right-click the Libraries node and choose Add Module Dependency, as shown
                        below:</p>
                    <br/>
                    <p><img src="../images/tutorials/air/73/add-lib-1.png" alt="mod 3"/></p>
                    <br/>
                    <p>Choose the following modules:</p>
                    <br/>
                    <ul>
                        <li>Lookup API</li>
                        <li>UI Utilities API</li>
                        <li>Utilities API</li>
                        <li>Window System API</li>
                    </ul>
                    <br/>
                    <p>Click OK and notice that the Libraries node now lists the
                        new module dependencies you selected:</p>
                    <br/>
                    <p><img src="../images/tutorials/air/73/add-lib-3.png" alt="mod 4"/></p>
                </li>
                <li>
                    <p>Right-click the <tt>org.geospatial.map</tt> and create a new Java class. Name
                        it <tt>MyMapTopComponent.java</tt>. Define it as follows:</p>
                    <pre class="examplecode">package org.geospatial.map;

import org.openide.awt.ActionID;
import org.openide.awt.ActionReference;
import org.openide.awt.ActionReferences;
import org.openide.util.NbBundle.Messages;
import org.openide.windows.TopComponent;

@TopComponent.Description(
        preferredID = "MyMapTopComponent",
        persistenceType = TopComponent.PERSISTENCE_ALWAYS)
@TopComponent.Registration(
        mode = "editor", 
        openAtStartup = true)
@ActionID(
        category = "Window", 
        id = "org.geospatial.map.MyMapTopComponent")
@ActionReferences({
    @ActionReference(
        path = "Menu/Window", 
        position = 0)
})
@TopComponent.OpenActionRegistration(
        displayName = "#CTL_MyMapAction")
@Messages(
        "CTL_MyMapAction=Open Map")
public class MyMapTopComponent extends TopComponent {

    @Messages("CTL_MyMapName=Map")
    public MyMapTopComponent() {
        setDisplayName(Bundle.CTL_MyMapName());
    }
    
}</pre>
                </li>
                <li>
                    <p>Run the application again and notice that you now have a new window:</p>
                    <br/>
                    <p><img src="../images/tutorials/air/73/new-map-1.png" alt="mod 3"/></p>
                    <p class="tips">In the same way as you have now done, you can very easily
                        create more new windows throughout your application.</p>
                </li>
            </ol>
        </div>
        <p>You have the basis of your first feature. In the next section, you will
            integrate one or more map technologies into your feature.</p>

        <!-- ===================================================================================== -->

        <h2 class="tutorial"><a name="map"></a>Integrating Map Technologies</h2>

        <p>A variety of map technologies exist. In the subsections that follow,
            you will learn how to integrate a range of different map technologies
            into your NetBeans Platform application. Each of the scenarios below
            are alternatives, each building on top of the previous sections of this tutorial.</p>
        <div class="indent">
            <h3 class="tutorial"><a name="openmap"></a>Scenario 1: OpenMap</h3>
            <p><a href="http://openmap.bbn.com/">OpenMap</a> is
                an open-source map technology.</p>
            <p><img alt="openmap" src="../images/tutorials/air/72/openmap-nb-small.png"/></p>
            <div class="indent">
                <ol>
                    <li>Download OpenMap: <a href="http://openmap.bbn.com/cgi-bin/license.cgi">http://openmap.bbn.com/cgi-bin/license.cgi</a></li>
                    <li><p>Right-click the application's Modules node,
                            choose Add New Library:</p>
                        <br/>
                        <p><img src="../images/tutorials/air/73/openmap-1.png" alt="mod 3"/></p>
                        <p>Then create a library
                            wrapper module that wraps the OpenMap JAR files. Name
                            the module OpenMapLib and use <tt>org.openmap</tt> as the code name base.
                            When you complete the wizard, you should see your new module, with the Libraries
                            node listing the OpenMap JARs:</p>
                        <br/>
                        <p><img src="../images/tutorials/air/73/openmap-2.png" alt="mod 3"/></p>
                        <p>Next, set a dependency on the OpenMapLib module after right-clicking
                            the Map module's Libraries node and choosing Add Module Dependency,
                            as shown below:</p>
                        <br/>
                        <p><img src="../images/tutorials/air/73/add-dep-1.png" alt="mod 3"/></p>
                        <br/>
                        <p>You should notice that the OpenMapLib module is now a dependency
                            in your Map module, so that you can use the OpenMap JARs in
                            your Map module:</p>
                        <br/>
                        <p><img src="../images/tutorials/air/73/add-dep-2.png" alt="mod 3"/></p>
                    </li>
                    <li><p>In the MapTopComponent, use OpenMap as follows, as a first
                            example to get started with your OpenMap/NetBeans Platform
                            integration:</p>

                        <pre class="examplecode">public class MyMapTopComponent extends TopComponent {

    private final InstanceContent ic = new InstanceContent();

    @Messages("CTL_MyMapName=Map")
    public MyMapTopComponent() {

        setDisplayName(Bundle.CTL_MyMapName());

        setLayout(new BorderLayout());

        try {

            //MapPanel:
            MapPanel mapPanel = new BasicMapPanel();

            //MapHandler:
            MapHandler mapHandler = mapPanel.getMapHandler();
            mapHandler.add(new LayerHandler());
            mapHandler.add(this);

            //MapBean:
            MapBean mapBean = mapPanel.getMapBean();
            mapBean.setScale(120000000f);

            //Selection:
            MouseDelegator mouseDelegator = new MouseDelegator();
            mapHandler.add(mouseDelegator);
            SelectMouseMode selectMouseMode = new SelectMouseMode();
            mapHandler.add(selectMouseMode);
            mouseDelegator.setActive(selectMouseMode);

            //MapMouseListener:
            final MyMapMouseListener myMapMouseListener = new MyMapMouseListener();

            //ShapeLayer:
            ShapeLayer shapeLayer = new ShapeLayer() {
                @Override
                public synchronized MapMouseListener getMapMouseListener() {
                    return myMapMouseListener;
                }
            };

            //Properties:
            Properties shapeLayerProps = new Properties();
            shapeLayerProps.put("lineColor", "000000");
            shapeLayerProps.put("fillColor", "BDDE83");
            shapeLayerProps.put("shapeFile", "org/geospatial/map/dcwpo-browse.shp");
            shapeLayerProps.put("spatialIndex", "org/geospatial/map/dcwpo-browse.ssx");

            //Assign properties to ShapeLayer:
            shapeLayer.setProperties(shapeLayerProps);
            shapeLayer.setVisible(true);

            //Assign ShapeLayer to MapHandler:
            mapHandler.add(shapeLayer);

            add(mapPanel.getMapBean(), BorderLayout.CENTER);

        } catch (MultipleSoloMapComponentException msmce) {
        }

        associateLookup(new AbstractLookup(ic));

    }

    public class MyMapMouseListener implements MapMouseListener {
        @Override
        public String[] getMouseModeServiceList() {
            return new String[]{SelectMouseMode.modeID};
        }
        @Override
        public boolean mouseClicked(MouseEvent e) {
            MapMouseEvent mme = (MapMouseEvent) e;
            //Optionally:
            //LatLonPoint latLonPoint = LatLonPoint.getFloat(mme.getLatLon());
            //UTMPoint utmPoint = UTMPoint.LLtoUTM(latLonPoint);
            //Publish something into Lookup:
            ic.set(Collections.singleton(mme.getLatLon()), null);
            StatusDisplayer.getDefault().setStatusText(mme.getLatLon().toString());
            return true;
        }
        @Override
        public boolean mousePressed(MouseEvent e) {return true;}
        @Override
        public boolean mouseReleased(MouseEvent e) {return true;}
        @Override
        public void mouseEntered(MouseEvent e) {}
        @Override
        public void mouseExited(MouseEvent e) {}
        @Override
        public boolean mouseDragged(MouseEvent e) {return true;}
        @Override
        public boolean mouseMoved(MouseEvent e) {return true;}
        @Override
        public void mouseMoved() {}
    }

}</pre>

                        <p>You should notice that you have the following import statements:</p>
                        <pre class="examplecode">import com.bbn.openmap.LayerHandler;
import com.bbn.openmap.MapBean;
import com.bbn.openmap.MapHandler;
import com.bbn.openmap.MouseDelegator;
import com.bbn.openmap.MultipleSoloMapComponentException;
import com.bbn.openmap.event.MapMouseEvent;
import com.bbn.openmap.event.MapMouseListener;
import com.bbn.openmap.event.SelectMouseMode;
import com.bbn.openmap.gui.BasicMapPanel;
import com.bbn.openmap.gui.MapPanel;
import com.bbn.openmap.layer.shape.ShapeLayer;
import java.awt.BorderLayout;
import java.awt.event.MouseEvent;
import java.util.Collections;
import java.util.Properties;
import org.openide.awt.ActionID;
import org.openide.awt.ActionReference;
import org.openide.awt.ActionReferences;
import org.openide.util.NbBundle.Messages;
import org.openide.util.lookup.AbstractLookup;
import org.openide.util.lookup.InstanceContent;
import org.openide.windows.TopComponent;</pre>
                        <p class="tips">From "share/data/shape/cntry02" in the OpenMap distribution, copy
                            <tt>dcwpo-browse.shp</tt> and <tt>dcwpo-browse.ssx</tt>
                            into your module. In the source code above, make sure
                            the references to the files point to the correct location
                            in your module.</p>
                    </li>

                    <li><p>Run the application, click on the map, and you will
                            be publishing new <tt>Point2D</tt> objects into the <tt>Lookup</tt>
                            of the <tt>TopComponent</tt>, while the status bar will also
                            show new information whenever you click on the map:</p>
                        <br/>
                        <p><img src="../images/tutorials/air/73/openmap-3.png" alt="mod 3"/></p>
                    </li>
                </ol>
            </div>
        </div>

        <div class="indent">
            <h3 class="tutorial"><a name="geotk"></a>Scenario 2: Geotoolkit</h3>
            <p><a href="http://www.geotoolkit.org/">Geotoolkit</a> is
                an open-source map technology.</p>
            <div class="indent">
                <ol>
                    <li>Download Geotoolkit: <a href="http://www.geotoolkit.org/download.html">http://www.geotoolkit.org/download.html</a></li>
                          <li><p>Right-click the application's Modules node,
                            choose Add New Library:</p>
                        <br/>
                        <p><img src="../images/tutorials/air/73/openmap-1.png" alt="mod 3"/></p>
                        <p>Then create a library
                            wrapper module that wraps the GeoToolkit JAR file. Name
                            the module GeoToolkiy and use <tt>org.geotoolkit</tt> as the code name base.
                            When you complete the wizard, you should see your new module, with the Libraries
                            node listing the GeoToolkit JAR:</p>
                        <br/>
                        <p><img src="../images/tutorials/air/73/geotoolkit-1.png" alt="mod 3"/></p>
                        <p>Next, set a dependency on the OpenMapLib module after right-clicking
                            the Map module's Libraries node and choosing Add Module Dependency,
                            as shown below:</p>
                        <br/>
                        <p><img src="../images/tutorials/air/73/add-dep-1.png" alt="mod 3"/></p>
                        <br/>
                        <p>You should notice that the OpenMapLib module is now a dependency
                            in your Map module, so that you can use the OpenMap JARs in
                            your Map module:</p>
                        <br/>
                        <p><img src="../images/tutorials/air/73/geotoolkit-2.png" alt="mod 3"/></p>
                    </li>
                    <li>From the Geotoolkit distribution, copy
                        <tt>Countries.shp</tt> file, as well as the DBF, PRJ, and SHX file
                        into your module. In the source code below, make sure
                        the references to the files point to the correct location
                        in your module.</li>

                    <li><p>In the MapTopComponent, use Geotoolkit as follows, as a first
                            example to get started with your Geotoolkit/NetBeans Platform
                            integration:</p>

                        <pre class="examplecode">public class MyMapTopComponent extends TopComponent {

    @Messages("CTL_MyMapName=Map")
    public MyMapTopComponent() {

        setDisplayName(Bundle.CTL_MyMapName());

        setLayout(new BorderLayout());

        MapContext mapContext = MapBuilder.createContext(DefaultGeographicCRS.SPHERE);
        addShpData(mapContext);
        JMap2D map = new JMap2D();
        map.getContainer().setContext(mapContext);
        map.setBackground(new Color(0, 150, 150));
        JNavigationBar navBar = new JNavigationBar(map);
        add(navBar, BorderLayout.NORTH);
        add(map, BorderLayout.CENTER);

    }

    public void addShpData(MapContext context) {

        try {

            DataStore store = DataStoreFinder.get("url",
                    MapTopComponent.class.getResource("Countries.shp"));

            Name name = store.getNames().iterator().next();

            Session session = store.createSession(true);

            FeatureCollection fs = session.getFeatureCollection(QueryBuilder.all(name));

            MapLayer layer = MapBuilder.createFeatureLayer(fs,
                    RandomStyleFactory.createDefaultVectorStyle(fs));

            layer.setVisible(true);

            context.layers().add(layer);

        } catch (DataStoreException e) {
        }

    }

gsfutilities
createdocument

}</pre>

                        <p class="notes"><b>Note:</b> The import statements are as follows:</p>

                        <pre class="examplecode">import java.awt.BorderLayout;
import java.awt.Color;
import org.geotoolkit.data.DataStore;
import org.geotoolkit.data.DataStoreFinder;
import org.geotoolkit.data.FeatureCollection;
import org.geotoolkit.data.query.QueryBuilder;
import org.geotoolkit.data.session.Session;
import org.geotoolkit.gui.swing.go2.JMap2D;
import org.geotoolkit.gui.swing.go2.control.JNavigationBar;
import org.geotoolkit.map.MapBuilder;
import org.geotoolkit.map.MapContext;
import org.geotoolkit.map.MapLayer;
import org.geotoolkit.referencing.crs.DefaultGeographicCRS;
import org.geotoolkit.storage.DataStoreException;
import org.geotoolkit.util.RandomStyleFactory;
import org.netbeans.api.settings.ConvertAsProperties;
import org.opengis.feature.type.Name;
import org.openide.awt.ActionID;
import org.openide.awt.ActionReference;
import org.openide.util.NbBundle.Messages;
import org.openide.windows.TopComponent;</pre>                    

                    </li>


                    <li>Run the application and you will see your Geotoolkit map component
                        displayed in a window in your NetBeans Platform application.</li>
                </ol>
            </div>
        </div>

        <!-- ===================================================================================== -->

        <h2 class="tutorial"><a name="publish"></a>Publishing and Subscribing to Objects of Interest</h2>

        <p>When a mouse click is performed in your map,
            you need to publish an object into the Lookup of the TopComponent. For example,
            you could publish the current Point on the map.</p>
        <p>In the supporting windows, you need to implement a LookupListener. When the
            window opens, subscribe to the Lookup of the map window, while indicating that
            you want to be notified when a Point is published there. Whenever a new Point
            is made available, you can do something with it, for example, display it in
            the supporting window.</p>
        <p>Conversely, you might need the map to be updated when one or more
            of the supporting windows change. In that case, the map window must
            be subscribed to the Lookup of the currently selected window or to
            the specific supporting window that it is interested in. The supporting
            window needs to published objects of interest to the map window.</p>
        <p class="tips">The <a href="https://platform.netbeans.org/tutorials/nbm-quick-start.html">NetBeans Platform Quick Start</a> describes this mechanism in detail.</p>


        <!-- ===================================================================================== -->

        <h2 class="tutorial"><a name="configure"></a>Configuring the Geospatial System</h2>

        <p>In this section, you learn how to change a variety of default
            features of the NetBeans Platform to optimize them for usage
            in a geospatial environment.</p>

        <p>All the configuration settings that follow are optional. Depending
            on your business needs, follow the instructions below to
            adapt your system to your needs.</p>

        <div class="indent">

            <h3 class="tutorial"><a name="fullscreen"></a>Starting Up in Full Screen Mode</h3>

            <p>In this section, we start the application in full screen mode. Full
                screen mode is supported by default by the NetBeans Platform. It can be
                invoked by the user via View | Full Screen or by pressing Alt-Shift-Enter.
                However, in geospatial systems, you typically need to start the application in full screen
                mode automatically, so that the user will not need to take this step
                over and over again manually.</p>
            <div class="indent">
                <ol>
                    <li><p>Create a new module in the application and name it "Initializer",
                            with code name base "org.myatc.initializer". In this module, you will
                            provide code for initializing the application as a whole.</p>
                    </li>
                    <li><p>Right-click the Initializer module and choose New | Other | Module Development | Installer. Click
                            Next and Finish.</p>
                    </li>
                    <li><p>Right-click the Initializer module's Libraries node, choose
                            Add Module Dependency, then set a dependency on the
                            File System API, the UI Utilities API, and the Window System API.</p>
                    </li>
                    <li><p>Define the Installer class as follows:</p>
                        <pre class="examplecode">import javax.swing.Action;
import org.openide.filesystems.FileUtil;
import org.openide.modules.ModuleInstall;
import org.openide.windows.WindowManager;

public class Installer extends ModuleInstall {

    @Override
    public void restored() {
        WindowManager.getDefault().invokeWhenUIReady(new Runnable() {
            @Override
            public void run() {
                FileUtil.getConfigObject("Actions/Window/org-netbeans-core-windows-actions-ToggleFullScreenAction.instance", Action.class).actionPerformed(null);
            }
        });
    }

}</pre>

                    </li>
                </ol>
                <p>Run the application and notice that it starts in full screen mode.</p>
            </div>
        </div>

        <div class="indent">
            <h3 class="tutorial"><a name="undocked"></a>Starting Up in Undocked Mode</h3>
            <p>In this section, we reconfigure the modes in the NetBeans Platform
                so that the windows, except the map window, open in undocked mode.</p>
            <div class="indent">

                <ol>
                    <li><p>Create a layer file.</p></li>
                    <li><p>Expand the layer file and look for the mode file.</p></li>
                    <li><p>Change "joined" to "separated".</p></li>
                    <li><p>Look in the layer file and see that your overrides are registered.</p></li>
                </ol>
                <p>Run the application and notice that the windows open undocked.</p>
            </div>
        </div>

        <div class="indent">
            <h3 class="tutorial"><a name="tabs"></a>Removing Tabs</h3>
            <p>In this section, we remove the tabs from all the
                windows in the application.</p>
            <div class="indent">
                <ol>
                    <li><p>Set dependencies on the "Look & Feel Customization Library"
                            and "Tab Control".</p></li>
                    <li><p>Create a class named <code>NoTabsTabDisplayerUI</code>, with this content</p>

                        <pre class="�xamplecode">import java.awt.Dimension;
import java.awt.Point;
import java.awt.Polygon;
import java.awt.Rectangle;
import javax.swing.DefaultSingleSelectionModel;
import javax.swing.JComponent;
import javax.swing.SingleSelectionModel;
import javax.swing.plaf.ComponentUI;
import org.netbeans.swing.tabcontrol.TabDisplayer;
import org.netbeans.swing.tabcontrol.TabDisplayerUI;

public class NoTabsTabDisplayerUI extends TabDisplayerUI {

    public NoTabsTabDisplayerUI(TabDisplayer displayer) {
        super(displayer);
    }

    public static ComponentUI createUI(JComponent jc) {
        assert jc instanceof TabDisplayer;
        return new NoTabsTabDisplayerUI((TabDisplayer) jc);
    }

    private static final int[] PTS = new int[] { 0, 0, 0 };

    @Override
    public Polygon getExactTabIndication(int i) {
        //Should never be called
        return new Polygon(PTS, PTS, PTS.length);
    }

    @Override
    public Polygon getInsertTabIndication(int i) {
        return new Polygon(PTS, PTS, PTS.length);
    }

    @Override
    public int tabForCoordinate(Point point) {
        return -1;
    }

    @Override
    public Rectangle getTabRect(int i, Rectangle rectangle) {
        return new Rectangle(0,0,0,0);
    }

    @Override
    protected SingleSelectionModel createSelectionModel() {
        return new DefaultSingleSelectionModel();
    }

    public java.lang.String getCommandAtPoint(Point point) {
        return null;
    }

    @Override
    public int dropIndexOfPoint(Point point) {
        return -1;
    }

    @Override
    public void registerShortcuts(javax.swing.JComponent jComponent) {
        //do nothing
    }

    @Override
    public void unregisterShortcuts(javax.swing.JComponent jComponent) {
        //do nothing
    }

    @Override
    protected void requestAttention(int i) {
        //do nothing
    }

    @Override
    protected void cancelRequestAttention(int i) {
        //do nothing
    }

    @Override
    public Dimension getPreferredSize(javax.swing.JComponent c) {
        return new Dimension(0, 0);
    }

    @Override
    public Dimension getMinimumSize(javax.swing.JComponent c) {
        return new Dimension(0, 0);
    }

    @Override
    public Dimension getMaximumSize(javax.swing.JComponent c) {
        return new Dimension(0, 0);
    }

}</pre>

                    </li>
                    <li><p>Add to the restored method in the installer:</p>

                        <pre class="examplecode">UIManager.put("ViewTabDisplayerUI", "org.myatc.initializer.NoTabsTabDisplayerUI");
UIManager.put("EditorTabDisplayerUI", "org.myatc.initializer.NoTabsTabDisplayerUI");</pre>

                    </li>
                </ol>
                <p>Run the application and notice that the tabs are removed.</p>
            </div>
        </div>

        <p>Congratulations! At this stage, with very little coding,
            you have created the starting point of an air-traffic control system.</p>

        <p class="tips"> To continue learning about the NetBeans Platform, head on to
            the four-part "NetBeans Platform Selection
            Management" series, <a href="https://platform.netbeans.org/tutorials/nbm-selection-1.html">which starts here</a>.
            After that, get started with the <a href="https://netbeans.org/kb/trails/platform.html">NetBeans Platform Learning Trail</a>, choosing
            the tutorials that are most relevant to your particular business scenario. Also,
            whenever you have questions about the NetBeans Platform, of any kind, feel free
            to write to the mailing list, dev@platform.netbeans.org; its related
            archive <a href="https://netbeans.org/projects/platform/lists/dev/archive">is here</a>.</p>

        <p>Have fun with the NetBeans Platform and see you on the mailing list!</p>



    </body>

</html>
