All Downloads are FREE. Search and download functionalities are using the official Maven repository.

it.tidalwave.geo.viewer.impl.role.DefaultGeoViewerUI Maven / Gradle / Ivy

/***********************************************************************************************************************
 *
 * forceTen - open source geography
 * Copyright (C) 2007-2012 by Tidalwave s.a.s. (http://www.tidalwave.it)
 *
 ***********************************************************************************************************************
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations under the License.
 *
 ***********************************************************************************************************************
 *
 * WWW: http://forceten.tidalwave.it
 * SCM: https://bitbucket.org/tidalwave/forceten-src
 *
 **********************************************************************************************************************/
package it.tidalwave.geo.viewer.impl.role;

import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import java.util.List;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JPopupMenu;
import org.jdesktop.observablecollections.ObservableList;
import org.jdesktop.observablecollections.ObservableListListener;
import org.openide.util.Lookup;
import it.tidalwave.util.logging.Logger;
import it.tidalwave.swing.FadingPanel;
import it.tidalwave.netbeans.swing.ToolBarFactory;
import it.tidalwave.geo.Coordinate;
import it.tidalwave.geo.CoordinateFormat;
import it.tidalwave.geo.viewer.GeoViewerPresentation;
import it.tidalwave.geo.viewer.spi.GeoViewProvider;
import it.tidalwave.geo.viewer.role.GeoViewerUI;
import it.tidalwave.geo.viewer.impl.GeoViewProviderListCellRenderer;

/***********************************************************************************************************************
 *
 * The default implementation of {@link GeoViewerUI}.
 * 
 * @stereotype Role
 *
 * @author  Fabrizio Giudici
 * @version $Id$
 *
 **********************************************************************************************************************/
public final class DefaultGeoViewerUI extends GeoViewerUI
  {
    private static final String CLASS = DefaultGeoViewerUI.class.getName();
    private static final Logger logger = Logger.getLogger(CLASS);

    @Nonnull
    private FadingPanel fadingPanel;

    @CheckForNull
    private JPopupMenu currentOptionsMenu;

    @Inject
    private Lookup lookup;

    /*******************************************************************************************************************
     *
     *
     *
     ******************************************************************************************************************/
    public DefaultGeoViewerUI()
      {
        initComponents();
        lbCoordinates.setText("");
        pnMapRenderer.setLayout(new BorderLayout());
        cbGeoViewProvider.setRenderer(new GeoViewProviderListCellRenderer());

        pnToolBar.setLayout(new FlowLayout(FlowLayout.RIGHT));
        pnToolBar.add(ToolBarFactory.createToolBar(GeoViewerPresentation.ID, lookup), BorderLayout.CENTER);

        // TODO: use Bindings, if possible
        getGeoViewProviders().addObservableListListener(new ObservableListListener()
          {
            @Override
            public void listElementsAdded(ObservableList ol, int i, int i1)
              {
                cbGeoViewProvider.setEnabled(ol.size() > 1);
              }

            @Override
            public void listElementsRemoved(ObservableList ol, int i, List list)
              {
                cbGeoViewProvider.setEnabled(ol.size() > 1);
              }

            @Override
            public void listElementReplaced(ObservableList ol, int i, Object o)
              {
              }

            @Override
            public void listElementPropertyChanged(ObservableList ol, int i)
              {
              }
          });
      }

    /*******************************************************************************************************************
     *
     *
     *
     ******************************************************************************************************************/
    @Override
    public void setSelectedGeoViewProvider (final @Nullable GeoViewProvider selectedGeoViewProvider)
      {
        if (selectedGeoViewProvider != null)
          {
            selectedGeoViewProvider.setCoordinatesTracker(this);
            currentOptionsMenu = selectedGeoViewProvider.getOptionsMenu();
            btOptions.setEnabled(currentOptionsMenu != null);
          }
        else
          {
            btOptions.setEnabled(false);
          }

        super.setSelectedGeoViewProvider(selectedGeoViewProvider);
      }

    /*******************************************************************************************************************
     *
     * {@inheritDoc}
     *
     ******************************************************************************************************************/
    @Override
    public void lock (final @Nonnull String message)
      {
        logger.info("lock(%s)",  message);

//        if ((currentGeoProvider == null) || (currentGeoProvider.getClass().getName().indexOf("NASA") < 0))
//          {
//            fadingPanel.lock(message);
//          }
      }

    /*******************************************************************************************************************
     *
     * {@inheritDoc}
     *
     ******************************************************************************************************************/
    @Override
    public void unlock()
      {
        logger.info("unlock()");
        
        final GeoViewProvider selectedGeoViewProvider = getSelectedGeoViewProvider();

        if ((selectedGeoViewProvider != null) && (selectedGeoViewProvider.getClass().getName().indexOf("NASA") >= 0))
          {
            logger.info(">>>> extra repaint");
            selectedGeoViewProvider.getRendererComponent().repaint();
          }

//        if ((currentGeoProvider == null) || (currentGeoProvider.getClass().getName().indexOf("NASA") < 0))
//          {
//            fadingPanel.unlock();
//          }
      }

    /*******************************************************************************************************************
     *
     * {@inheritDoc}
     *
     ******************************************************************************************************************/
    @Override
    public void coordinatesChanged (final @CheckForNull Coordinate coordinates)
      {
        lbCoordinates.setText((coordinates == null) ? " " : CoordinateFormat.formatLatitude(coordinates.getLatitude()) +
                                                      " " + CoordinateFormat.formatLongitude(coordinates.getLongitude()));
      }

    /*******************************************************************************************************************
     *
     *
     *
     ******************************************************************************************************************/
    @PostConstruct
    @SuppressWarnings("PMD.UnusedPrivateMethod") @edu.umd.cs.findbugs.annotations.SuppressWarnings("UPM_UNCALLED_PRIVATE_METHOD")
    private void initialize()
      {
        fadingPanel = new FadingPanel(getRendererComponent());
        pnMapRenderer.add(fadingPanel, BorderLayout.CENTER);

        btOptions.addActionListener(new ActionListener()
          {
            @Override
            public void actionPerformed (final @Nonnull ActionEvent event)
              {
                if (currentOptionsMenu != null)
                  {
                    currentOptionsMenu.show(btOptions, 0, -currentOptionsMenu.getHeight());
                  }
              }
          });
      }

    /*******************************************************************************************************************
     *
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always regenerated by the Form Editor.
     *
     ******************************************************************************************************************/
    @SuppressWarnings("unchecked")
    // //GEN-BEGIN:initComponents
    private void initComponents() {
        bindingGroup = new org.jdesktop.beansbinding.BindingGroup();

        pnMapRenderer = new javax.swing.JPanel();
        pnHeader = new javax.swing.JPanel();
        cbGeoViewProvider = new javax.swing.JComboBox();
        lbCoordinates = new javax.swing.JLabel();
        btOptions = new javax.swing.JButton();
        pnToolBar = new javax.swing.JPanel();

        javax.swing.GroupLayout pnMapRendererLayout = new javax.swing.GroupLayout(pnMapRenderer);
        pnMapRenderer.setLayout(pnMapRendererLayout);
        pnMapRendererLayout.setHorizontalGroup(
            pnMapRendererLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 697, Short.MAX_VALUE)
        );
        pnMapRendererLayout.setVerticalGroup(
            pnMapRendererLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 335, Short.MAX_VALUE)
        );

        pnHeader.setPreferredSize(new java.awt.Dimension(697, 32));
        pnHeader.setSize(new java.awt.Dimension(100, 32));

        cbGeoViewProvider.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));

        org.jdesktop.beansbinding.ELProperty eLProperty = org.jdesktop.beansbinding.ELProperty.create("${geoViewProviders}");
        org.jdesktop.swingbinding.JComboBoxBinding jComboBoxBinding = org.jdesktop.swingbinding.SwingBindings.createJComboBoxBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, this, eLProperty, cbGeoViewProvider);
        bindingGroup.addBinding(jComboBoxBinding);
        org.jdesktop.beansbinding.Binding binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, this, org.jdesktop.beansbinding.ELProperty.create("${selectedGeoViewProvider}"), cbGeoViewProvider, org.jdesktop.beansbinding.BeanProperty.create("selectedItem"));
        binding.setSourceNullValue(null);
        binding.setSourceUnreadableValue(null);
        bindingGroup.addBinding(binding);

        lbCoordinates.setText(org.openide.util.NbBundle.getMessage(DefaultGeoViewerUI.class, "DefaultGeoViewerUI.lbCoordinates.text")); // NOI18N

        btOptions.setText(org.openide.util.NbBundle.getMessage(DefaultGeoViewerUI.class, "DefaultGeoViewerUI.btOptions.text")); // NOI18N
        btOptions.setIconTextGap(0);
        btOptions.setMargin(new java.awt.Insets(0, 0, 0, 0));
        btOptions.setMaximumSize(new java.awt.Dimension(24, 24));
        btOptions.setMinimumSize(new java.awt.Dimension(24, 24));
        btOptions.setPreferredSize(new java.awt.Dimension(24, 24));

        javax.swing.GroupLayout pnToolBarLayout = new javax.swing.GroupLayout(pnToolBar);
        pnToolBar.setLayout(pnToolBarLayout);
        pnToolBarLayout.setHorizontalGroup(
            pnToolBarLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 346, Short.MAX_VALUE)
        );
        pnToolBarLayout.setVerticalGroup(
            pnToolBarLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 32, Short.MAX_VALUE)
        );

        javax.swing.GroupLayout pnHeaderLayout = new javax.swing.GroupLayout(pnHeader);
        pnHeader.setLayout(pnHeaderLayout);
        pnHeaderLayout.setHorizontalGroup(
            pnHeaderLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pnHeaderLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(lbCoordinates, javax.swing.GroupLayout.DEFAULT_SIZE, 175, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(pnToolBar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(cbGeoViewProvider, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(btOptions, javax.swing.GroupLayout.PREFERRED_SIZE, 24, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );
        pnHeaderLayout.setVerticalGroup(
            pnHeaderLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(pnToolBar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pnHeaderLayout.createSequentialGroup()
                .addGap(0, 0, 0)
                .addGroup(pnHeaderLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lbCoordinates, javax.swing.GroupLayout.DEFAULT_SIZE, 32, Short.MAX_VALUE)
                    .addComponent(btOptions, javax.swing.GroupLayout.PREFERRED_SIZE, 24, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(cbGeoViewProvider, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(pnMapRenderer, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addComponent(pnHeader, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addComponent(pnMapRenderer, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(pnHeader, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
        );

        bindingGroup.bind();
    }// //GEN-END:initComponents

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btOptions;
    private javax.swing.JComboBox cbGeoViewProvider;
    private javax.swing.JLabel lbCoordinates;
    private javax.swing.JPanel pnHeader;
    private javax.swing.JPanel pnMapRenderer;
    private javax.swing.JPanel pnToolBar;
    private org.jdesktop.beansbinding.BindingGroup bindingGroup;
    // End of variables declaration//GEN-END:variables
  }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy