/*
 * Licensed Materials - Property of Rogue Wave Software, Inc. 
 * © Copyright Rogue Wave Software, Inc. 2014, 2015 
 * © Copyright IBM Corp. 2009, 2014
 * © Copyright ILOG 1996, 2009
 * All Rights Reserved.
 *
 * Note to U.S. Government Users Restricted Rights:
 * The Software and Documentation were developed at private expense and
 * are "Commercial Items" as that term is defined at 48 CFR 2.101,
 * consisting of "Commercial Computer Software" and
 * "Commercial Computer Software Documentation", as such terms are
 * used in 48 CFR 12.212 or 48 CFR 227.7202-1 through 227.7202-4,
 * as applicable.
 */

import ilog.views.IlvManager;
import ilog.views.IlvManagerView;
import ilog.views.maps.IlvCoordinateSystemProperty;
import ilog.views.maps.IlvMapLayerTreeProperty;
import ilog.views.maps.IlvMapScaleLimiter;
import ilog.views.maps.beans.IlvExceptionMessage;
import ilog.views.maps.beans.IlvJMapsManagerViewControlBar;
import ilog.views.maps.beans.IlvLayerTreePanel;
import ilog.views.maps.beans.IlvMapLayer;
import ilog.views.maps.beans.IlvMapLayerTreeModel;
import ilog.views.maps.datasource.IlvMIDMIFDataSource;
import ilog.views.maps.graphic.IlvMapSelectionFactory;
import ilog.views.maps.graphic.style.IlvMapStyle;
import ilog.views.maps.graphic.style.IlvPointStyle;
import ilog.views.maps.graphic.style.IlvPolylineStyle;
import ilog.views.maps.srs.coordsys.IlvGeographicCoordinateSystem;
import ilog.views.util.IlvProductUtil;
import ilog.views.util.IlvResourceUtil;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.net.URL;

import javax.swing.JApplet;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;

/**
 * The MID/MIF demo. This demo show how to load a MD/MIF file
 * using the API. The API to load MID/MIF files mailnly consist on 
 * simply instanciating a IlvMIDMIFDataSource class.
 */
public class MidMifDemo extends JApplet {

  static {
    // This applet is designed to run only with default resource bundle
    // and various selected other resource bundles.
    // Setting the available resource suffixes avoids that the applet
    // tries to load resource bundles for other locales over the net,
    // even if the current locale of the browser is different.
    if (IlvResourceUtil.isInApplet())
      IlvResourceUtil.setAvailableResourceSuffixes("", "_ja");  //$NON-NLS-1$//$NON-NLS-2$
  }

  {
    // This sample uses JViews Maps features. When deploying an
    // application that includes this code, you need to be in possession
    // of a Rogue Wave JViews Maps Deployment license.
    IlvProductUtil.DeploymentLicenseRequired(
        IlvProductUtil.JViews_Maps_Deployment);
  }

  IlvManagerView view;
  IlvManager manager;
  
  /**
   * Construct a new MidMifDemo.
   * @throws Exception 
   */
  public MidMifDemo() throws Exception {
    // Make sure the swing construction is called in Swing event thread.
    ilog.views.util.swing.IlvSwingUtil.invokeAndWait(new Runnable() { public void run() {
    setupUI();
    try {
      loadData();
    } catch (Exception e) {
      new IlvExceptionMessage(e,null);
    }
    }});
  }
  
  /**
   * Load data using an <code>IlvMIDMIFDataSource</code>.
   * @throws Exception
   */
  void loadData() throws Exception {
    // find the URL of the data in the jar. 
    URL url = getClass().getResource("EgeanSea.mif"); //$NON-NLS-1$
    // instanciate a IlvMIDMIFDataSource.
    IlvMIDMIFDataSource source = new IlvMIDMIFDataSource(url);
    source.setManager(manager);
    // rename top layer.
    IlvMapLayer layer = source.getInsertionLayer();
    layer.setName("Egean Sea");//$NON-NLS-1$
    // add it in the map layer tree 
    IlvMapLayerTreeModel ltm = IlvMapLayerTreeProperty.GetMapLayerTreeModel(manager);
    ltm.addChild(null, layer);
    // start the data source: file is read and layers are created.
    source.start();
    // configure resulting layers (example).
    IlvMapLayer[] layers = ltm.getChildren(layer);
 
    for(int i = 0; i < layers.length; i++) {
      IlvMapLayer l = layers[i];
      IlvMapStyle s = l.getStyle();
      
      if(s instanceof IlvPointStyle) {
        IlvPointStyle ps = (IlvPointStyle)s;
        ps.setSize(2);
        ps.setForeground(Color.red);
      } else if(s instanceof IlvPolylineStyle) {
          ((IlvPolylineStyle)s).setDecoration(null);
      }
    }
    // fit the map.
    view.fitTransformerToContent();
  }
  
  /**
   * Construct the user interface.
   */
  void setupUI() {
    view  = new IlvManagerView();
    view.setKeepingAspectRatio(true);
    view.setSize(600, 300);
    manager = view.getManager();
        manager.setSelectionFactory(new IlvMapSelectionFactory());
    // JV-2819: geo reference the view
    view.getManager().setNamedProperty(new IlvCoordinateSystemProperty(IlvGeographicCoordinateSystem.WGS84));
    // limit the zoom to correct scales.
    IlvMapScaleLimiter limiter = new IlvMapScaleLimiter((float) (1 / 1E4), (float) (1 / 1E9));
    limiter.setView(view);
    IlvLayerTreePanel layerPanel = new IlvLayerTreePanel();
    layerPanel.setView(view);
    Component left = layerPanel;
    Component right = new JScrollPane(view);
    JSplitPane pane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, left, right);
    pane.setDividerLocation(200);
    getContentPane().add(pane, BorderLayout.CENTER);
    
    IlvJMapsManagerViewControlBar bar = new IlvJMapsManagerViewControlBar();
     bar.setView(view);
    getContentPane().add(bar, BorderLayout.NORTH);
  }
  

  /**
   * @param args : not used
   */
  public static void main(String[] args)  {
    // Sun recommends that to put the entire GUI initialization into the
    // AWT thread
    javax.swing.SwingUtilities.invokeLater(
      new Runnable() {
        public void run() {
          JFrame frame = new JFrame();
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          MidMifDemo demo;
          try {
            demo = new MidMifDemo();
          } catch (Exception e) {
            e.printStackTrace();
            return;
          }
          frame.getContentPane().add(demo);
          frame.pack();
          frame.setVisible(true);
        }
      }
      );
  }
  //JV-3814
  Override
  public void destroy() { 
    super.destroy(); 
    // This method is intended to workaround memory management issues 
    // in the Sun JRE. Please refer to the method documentation for more 
    // details and a description of the known issues. 
    ilog.views.util.swing.IlvSwingUtil.cleanupApplet(); 
  } 
}